From a4f10dc0b190482b3c66c2c342aec8107d78d40c Mon Sep 17 00:00:00 2001 From: elenatorro Date: Wed, 9 Nov 2016 20:16:40 +0100 Subject: [PATCH 01/12] First refactor approach --- .babelrc | 3 + .gitignore | 2 + .jshintrc | 36 + README.md | 6 +- constants/errors.js | 89 + gulpfile.js | 78 + lib/maps/xapiValidator.min.js.map | 1 + lib/xapiValidator.js | 1653 ++++++++++++++++++ lib/xapiValidator.min.js | 3 + spec/mocha_runner.html | 6 +- spec/xapiValidator_spec.js | 191 +- src/constants/errors.js | 89 + src/constants/general.js | 13 + src/constants/interaction-types.js | 27 + src/constants/properties.js | 104 ++ src/constants/regex.js | 30 + src/constants/whitelists.js | 111 ++ src/utils/utils.js | 66 + src/xAPI-validator.js | 1318 ++++++++++++++ xapiValidator.js => src/xapiValidator-old.js | 11 +- 20 files changed, 3730 insertions(+), 107 deletions(-) create mode 100644 .babelrc create mode 100644 .gitignore create mode 100644 .jshintrc create mode 100644 constants/errors.js create mode 100644 gulpfile.js create mode 100644 lib/maps/xapiValidator.min.js.map create mode 100644 lib/xapiValidator.js create mode 100644 lib/xapiValidator.min.js create mode 100644 src/constants/errors.js create mode 100644 src/constants/general.js create mode 100644 src/constants/interaction-types.js create mode 100644 src/constants/properties.js create mode 100644 src/constants/regex.js create mode 100644 src/constants/whitelists.js create mode 100644 src/utils/utils.js create mode 100644 src/xAPI-validator.js rename xapiValidator.js => src/xapiValidator-old.js (99%) diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c13c5f6 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd4f2b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.DS_Store diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..51209b8 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,36 @@ +{ + "bitwise": true, + "camelcase": true, + "curly": true, + "esnext": true, + "immed": true, + "newcap": true, + "noarg": true, + "node": true, + "strict": false, + "undef": true, + "unused": "vars", + "boss": true, + "browser": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "eqnull": true, + "evil": true, + "expr": true, + "forin": false, + "laxbreak": false, + "noempty": false, + "nomen": false, + "nonew": false, + "onevar": false, + "plusplus": false, + "predef": [ + "describe", + "it", + "define" + ], + "regexp": false, + "sub": true, + "white": false +} diff --git a/README.md b/README.md index 7cf31ac..47024d6 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The input `statement` may either be JSON string of an xAPI statement or a Javasc "actor": { "mbox": "mailto:bob@example.com" }, - "verb": { + "verb": { "id": "http://adlnet.gov/expapi/verbs/created", "display" :{"en-US": "created"} }, @@ -59,7 +59,7 @@ The produced report object contains three key properties: a collection of any `e "actor": { "mbox": "mailto:charles@example.com" }, - "verb": { + "verb": { "id": "http://adlnet.gov/expapi/verbs/created", "display" :{"en-US": "created"} }, @@ -92,4 +92,4 @@ Community feedback, criticism, and collaboration are most welcome. On the less-technical side, if an error message appears cryptic or unhelpful, please report it as an Issue and it should be addressed. ## License -MIT License (C) 2013 Zachary Pierce, Measured Progress \ No newline at end of file +MIT License (C) 2013 Zachary Pierce, Measured Progress diff --git a/constants/errors.js b/constants/errors.js new file mode 100644 index 0000000..6b847ed --- /dev/null +++ b/constants/errors.js @@ -0,0 +1,89 @@ +'use strict'; + +const xapiErrorLevels = Object.freeze({ + MAY_VIOLATION: 'MAY_VIOLATION', + MUST_VIOLATION: 'MUST_VIOLATION', + SHOULD_VIOLATION: 'SHOULD_VIOLATION' +}); + +const xapiValidationErrors = Object.freeze({ + UNEXPECTED: 'Unexpected property not permitted', + MUST_BE_STRING: 'property, if present, must be a string.', + MUST_BE_PRESENT: 'property was required to be a string but was absent.', + MUST_BE_URI_STRING: 'property, if present, must be a URI string.', + MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', + MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', + MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', + MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', + MUST_BE_NUMBER: 'property, if present, must be a Number.', + MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', + MUST_BE_MBOX_URI: 'mbox property was required to be a mailto URI string but was not a string at all.', + MUST_BE_VALID_MBOX_FORMAT: 'mbox property was required to be a mailto URI string but did not match the mailto format.', + EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', + LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', + LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', + LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', + VERB_MUST_BE_PROVIDED: 'Verb must be provided', + VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', + DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', + INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', + INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', + INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', + INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', + ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', + ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', + INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', + DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', + CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', + CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', + ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS: 'Activities must be non-null map objects', + STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', + OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', + ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', + SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', + RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', + MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', + RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', + RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', + DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', + DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', + DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', + VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0', + ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', + LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', + SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', + SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', + ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', + AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', + AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for an "agent".', + AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS: 'Invalid object with characteristics of a Group when an Agent was expected.', + GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', + MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', + GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', + GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', + ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', + AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT: 'If present, the "authority" property must be a non-null map object.', + GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', + CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', + CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', + CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ: 'Context Activities property values must be an array of Activity Objects or a single Activity Object.', + CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT: 'The Context Activities instances must be a non-null map object.', + CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT: 'If present, the "context" property must be a non-null map object.', + REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', + REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', + LANGUAGE_MUST_BE_STRING: 'The language property must be encoded as an RFC 5646 compliant string, but was not.', + OBJECT_MUST_BE_DEFINED: '"object" property must be provided.', + OBJECT_MUST_BE_NON_NULL_MAP_OBJECT: '"object" property must be a non-null map object.', + SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', + OBJECT_TYPE_MUST_BE_VALID_OPTION: 'object\'s "objectType" did not match a valid option', + IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', + ID_MUST_BE_VALID: 'Id was not a valid UUID', + STATEMENT_ARGUMENT_MUST_BE_PROVIDED: 'No statement argument provided.', + STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', + STATEMENT_MUST_BE_PARSED_CORRECTLY: 'Null or non-object statement value parsed from provided statment JSON.', + INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', + STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.' +}); + +export {xapiErrorLevels}; +export {xapiValidationErrors}; diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..0ab2eb3 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,78 @@ +'use strict'; + +/* Libraries */ +let + browserify = require('browserify'), + buffer = require('vinyl-buffer'), + connect = require('gulp-connect'), + gulp = require('gulp'), + livereload = require('gulp-livereload'), + source = require('vinyl-source-stream'), + sourcemaps = require('gulp-sourcemaps'), + uglify = require('gulp-uglify') +; + +/* Config */ +const + BABEL_CONFIG = Object.freeze({ + presets: ['es2015'] + }), + BROWSERIFY_TRANSFORM = 'babelify', + BROWSERIFY_CONFIG = Object.freeze({ + debug: true, + json: true, + standalone: 'beep-boop' + }), + DIST_FILENAME = 'xapiValidator.js', + DIST_FILENAME_MIN = 'xapiValidator.min.js', + DIST_PATH = 'lib', + MAPS_PATH = './maps', + SRC_FILE = 'src/xAPI-validator.js', + WATCH_FILES = ['src/*.js', 'constants/*.js', 'spec/*.js', 'spec/lib/*.js'] +; + +/* Task Config */ + +const + BUILD_TASK = 'build', + BUILD_PROD_TASK = 'build-prod-task', + CONNECT_TASK = 'connect', + DEFAULT_TASK = 'default', + DEFAULT_TASKS = [BUILD_TASK, BUILD_PROD_TASK], + WATCH_TASK = 'watch', + WATCH_TASKS = [BUILD_TASK] +; + +gulp.task(BUILD_TASK, () => { + return browserify(SRC_FILE, BROWSERIFY_CONFIG) + .transform(BROWSERIFY_TRANSFORM, BABEL_CONFIG) + .bundle() + .pipe(source(DIST_FILENAME)) + .pipe(gulp.dest(DIST_PATH)) + .pipe(livereload()); +}); + +gulp.task(BUILD_PROD_TASK, () => { + return browserify(SRC_FILE, BROWSERIFY_CONFIG) + .transform(BROWSERIFY_TRANSFORM, BABEL_CONFIG) + .bundle() + .pipe(source(DIST_FILENAME_MIN)) + .pipe(buffer()) + .pipe(sourcemaps.init()) + .pipe(uglify()) + .pipe(sourcemaps.write(MAPS_PATH)) + .pipe(gulp.dest(DIST_PATH)) + .pipe(livereload()); +}); + +gulp.task(WATCH_TASK, WATCH_TASKS, () => { + livereload.listen(); + connect.server(); + gulp.watch(WATCH_FILES, WATCH_TASKS); +}); + +gulp.task(CONNECT_TASK, () => { + connect.server(); +}); + +gulp.task(DEFAULT_TASK, DEFAULT_TASKS); diff --git a/lib/maps/xapiValidator.min.js.map b/lib/maps/xapiValidator.min.js.map new file mode 100644 index 0000000..7f50b22 --- /dev/null +++ b/lib/maps/xapiValidator.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["xapiValidator.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","beepBoop","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","Object","defineProperty","value","xapiErrorLevels","freeze","MAY_VIOLATION","MUST_VIOLATION","SHOULD_VIOLATION","xapiValidationErrors","UNEXPECTED","MUST_BE_STRING","MUST_BE_PRESENT","MUST_BE_URI_STRING","MUST_BE_URI_PRESENT","MUST_BE_IRI_STRING","MUST_BE_BOOLEAN","MUST_BE_BOOLEAN_PRESENT","MUST_BE_NUMBER","MUST_BE_NUMBER_PRESENT","MUST_BE_MBOX_URI","MUST_BE_VALID_MBOX_FORMAT","EXTENSIONS_MUST_NOT_BE_NULL","LANGUAGE_MAPS_MUST_NOT_BE_NULL","LANGUAGE_MAP_KEY_INVALID","LANGUAGE_MAP_KEY_MUST_BE_STRING","VERB_MUST_BE_PROVIDED","VERB_MUST_NOT_BE_NULL","DISPLAY_SHOULD_BE_PROVIDED","INTERACTION_ACTIVITY_SHOULD_HAVE","INTERACTION_COMPONENT_SHOULD_BE_ARRAY","INTERACTION_COMPONENT_MUST_NOT_BE_NULL","INTERACTION_TYPE_MUST_BE_CMI","ID_MUST_BE_UNIQUE","ID_SHOULD_NOT_CONTAIN_WHITESPACES","INTERACTION_TYPE_MUST_BE_VALID","DEFINITIONS_MUST_BE_OBJECTS","CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY","CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS","ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS","STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS","OBJECT_TYPE_MUST_BE_STATEMENT_REF","ID_MUST_BE_VALID_UUID_REF","SCALED_MUST_BE_BETWEEN_0_1","RAW_MUST_BE_GREATER_THAN_MIN","MAX_MUST_BE_GREATER_THAN_MIN","RAW_MUST_BE_LESS_THAN_MAX","RESULT_MUST_BE_MAP_OBJECT","DURATION_MUST_BE_VALID","DATE_SHOULD_INCLUDE_ZONE_INFORMATION","DATE_MUST_BE_VALID","VERSION_MUST_COMPLY_SEMANTIC_VERSIONING","ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS","LENGTH_MUST_BE_INTEGER","SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS","SHA2_MUST_CONTAIN_BASE_64_STRING","ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY","AGENT_MUST_BE_NON_NULL_MAP_OBJECT","AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED","AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS","GROUP_MUST_BE_NON_NULL_MAP_OBJECT","MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS","GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED","GROUP_MEMBER_MUST_BE_ARRAY","ACTOR_MUST_BE_PROVIDED","AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT","GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO","CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL","CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY","CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ","CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT","REGISTRATION_MUST_BE_UUID_STRING","REVISION_MUST_BE_AGENT_OR_GROUP","LANGUAGE_MUST_BE_STRING","OBJECT_MUST_BE_DEFINED","OBJECT_MUST_BE_NON_NULL_MAP_OBJECT","SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT","OBJECT_TYPE_MUST_BE_VALID_OPTION","IDS_SHOULD_BE_GENERATED_BY_LRS","ID_MUST_BE_VALID","STATEMENT_ARGUMENT_MUST_BE_PROVIDED","STATEMENT_MUST_NOT_BE_NULL","STATEMENT_MUST_BE_PARSED_CORRECTLY","INVALID_JSON","STATEMENT_ARGUMENT_IS_NOT_VALID","2","xapiGeneral","FIRST_REPORT_VERSTION","GROUP_AUTHORITY_AGENT_MEMBERS","INTERACTION_DEFINITION_TYPE","MAX_SCALED_VALUE","MIN_SCALED_VALUE","NO_INDEX_FOUND","NUMER_OF_SPECIFIED_IFI_PROPERTIES","3","interactionTypes","CHOICE","FILL_IN","LIKERT","LONG_FILL_IN","MATCHING","NUMERIC","OTHER","PERFORMANCE","SEQUENCING","TRUE_FALSE","xapiValidationInteractionTypes","4","properties","ACCOUNT","ACTIVITY","ACTOR","AGENT","ATTACHMENT","ATTACHMENTS","AUTHORITY","CATEGORY","CHOICES","COMPLETION","CONTENT_TYPE","CONTEXT_ACTIVITIES","CONTEXT","CORRECT_RESPONSES_PATTERN","DATE_TIME","DEFINITION","DESCRIPTION","DISPLAY","DURATION","EXTENSIONS","FILE_URL","GROUP","GROUPING","HOME_PAGE","ID","INSTRUCTOR","INTERACTION_COMPONENTS","INTERACTION_TYPE","LANGUAGE_MAP","LANGUAGE","LENGTH","MAX","MBOX_SHA_1_SUM","MBOX","MEMBER","MIN","MORE_INFO","NAME","OBJECT_TYPE","OBJECT","OPEN_ID","PARENT","PLATFORM","RAW","REGISTRATION","RESPONSE","RESULT","REVISION","SCALE","SCALED","SCORE","SHA2","SOURCE","STATEMENT_REF","STATEMENT","STEPS","STORED","SUB_CONTEXT","SUCCESS","TARGET","TEAM","TIMESTAMP","TYPE","USAGE_TYPE","VERB","VERSION","objectTypes","SUB_STATEMENT","xapiValidationIfiPropertyNames","xApiValidObjectTypes","5","xapiValidationRegex","UUID","ISO_8601_DURATION","ISO_8601_DATE_TIME","MAILTO_URI","CONTAINS_WHITESPACE","SEMVER_1_P_0_P_0","BASE_64","IRI","BCP_47","dateFormatRegexPositions","YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MSECOND","ZONE","RELATIVE_TIME","TIME_ZONE_HOUR","TIME_ZONE_MINUTE","6","xapiWhiteListProperties","undefined","_properties","IFI","URI","COMPONENT_ARRAY","ACTIVITY_DEFINITION","../constants/properties","7","makeV1Report","instance","errors","version","_general","makeV1SingleErrorReport","error","validateAbsenceOfNonWhitelistedProperties","target","allowedProperties","trace","localErrors","localTrace","propertyName","hasOwnProperty","indexOf","push","_utils","xapiValidationUtils","addPropToTrace","message","_errors","level","validatePropertyIsString","parent","isRequired","violationType","propValue","localViolationType","isString","localTraceToString","validatePropertyIsUri","_regex","test","validatePropertyIsUrl","validatePropertyIsBoolean","isBoolean","validatePropertyIsNumber","isNumber","validateIFIProperties","accountTrace","mbox","account","_whitelists","getIFIs","ifis","propertiesLength","propName","key","getIFICount","validateExtensions","extensions","isNonNullMapObject","validateLanguageMap","languageMap","mappedValue","isValidLanguageTag","addLookupToTrace","validateVerb","verb","display","validateInteractionComponentArray","components","interactionType","allowedInteractionTypes","isAllowedComponentType","ids","interactionComponent","componentsLength","perComponentTrace","isArray","id","description","validateActivityDefintion","definition","correctResponsesPatternTrace","correctResponsesPatternLength","crpItem","name","type","_interactionTypes","correctResponsesPattern","choices","scale","source","steps","validateActivity","activity","ACTIVITIES_MUST_NOT_BE_NULL","validateStatementRef","statementRef","objectType","validateScore","score","scaled","min","raw","max","validateResult","result","duration","validatePropertyIsISO8601String","matched","datetime","exec","dateIncludesZoneInformation","validateVersion","validateAttachmentObject","attachment","sha2","validateAttachments","attachments","attachmentsLength","validateAgent","agent","ifiCount","validateGroup","group","memberTrace","numMembers","member","validateActor","actor","isGroup","validateAuthority","authority","validateContextActivitySubContext","subContext","numActivities","isObject","validateContextActivities","contextActivities","grouping","category","other","validateContext","context","statementObjectObjectType","registration","revision","platform","PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP","team","language","statement","instructor","validateObject","object","isWithinSubStatement","validateStatement","toString","isSubStatement","whitelistedProperties","makeStatementReport","validateAmbiguousTypeStatement","statementObject","JSON","parse","xapiValidator","default","../constants/errors","../constants/general","../constants/interaction-types","../constants/regex","../constants/whitelists","../utils/utils","8","IS_STRING","IS_ARRAY","IS_BOOLEAN","IS_NUMBER","prototype","obj","Array","isDefined","addendum","actorOrGroup"],"mappings":"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","file":"../xapiValidator.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.beepBoop = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o _general.xapiGeneral.MAX_SCALED_VALUE) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCALED),\n message: _errors.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.min !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MIN, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (score.max !== undefined && score.max < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MAX),\n message: _errors.xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.max !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MAX, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw > score.max) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsNumber(score, _properties.properties.RAW, localTrace, localErrors, /*isRequired*/false);\n validateAbsenceOfNonWhitelistedProperties(score, _whitelists.xapiWhiteListProperties.SCORE, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateResult(result, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.RESULT;\n\n if (result === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(result)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace),\n message: _errors.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validateScore(result.score, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCORE), localErrors);\n validatePropertyIsBoolean(result, _properties.properties.SUCCESS, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsBoolean(result, _properties.properties.COMPLETION, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsString(result, _properties.properties.RESPONSE, localTrace, localErrors, /*isRequired*/false);\n validateExtensions(result.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n\n if (result.duration !== undefined && (result.duration === null || !_utils.xapiValidationUtils.isString(result.duration) || !_regex.xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DURATION),\n message: _errors.xapiValidationErrors.DURATION_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(result, _whitelists.xapiWhiteListProperties.RESULT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validatePropertyIsISO8601String(parent, propertyName, trace, errors) {\n var localErrors, localTrace, matched, datetime;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.DATE_TIME;\n datetime = parent[propertyName];\n\n if (datetime === undefined) {\n return localErrors;\n }\n\n if (datetime === null || !_utils.xapiValidationUtils.isString(datetime)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: propertyName + ' ' + _errors.xapiValidationErrors.MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n matched = _regex.xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime);\n\n if (matched) {\n if (!dateIncludesZoneInformation(matched)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n }\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateVersion(version, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.VERSION;\n\n if (version === undefined) {\n return localErrors;\n }\n\n if (version === null || !_utils.xapiValidationUtils.isString(version) || !_regex.xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateAttachmentObject(attachment, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(attachment)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (attachment.display === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.DISPLAY),\n message: _errors.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n validateLanguageMap(attachment.display, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DISPLAY), localErrors);\n }\n\n validateLanguageMap(attachment.description, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DESCRIPTION), localErrors);\n validatePropertyIsUri(attachment, _properties.properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsUri(attachment, _properties.properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n // TODO - more complete validation for Internet Media Type via RFC 2046\n validatePropertyIsString(attachment, _properties.properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (attachment.length === undefined || attachment.length === null || !_utils.xapiValidationUtils.isNumber(attachment.length) || attachment.length % 1 !== 0) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LENGTH),\n message: _errors.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (attachment.sha2 === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (attachment.sha2 === null || !_utils.xapiValidationUtils.isString(attachment.sha2) || !_regex.xapiValidationRegex.BASE_64.test(attachment.sha2)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(attachment, _whitelists.xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors);\n return localErrors;\n}\n\nfunction validateAttachments(attachments, trace, errors) {\n var localErrors, localTrace, attachmentsLength, i;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENTS;\n\n if (attachments === undefined) {\n return localErrors;\n }\n\n if (attachments === null || !_utils.xapiValidationUtils.isArray(attachments)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n attachmentsLength = attachments.length;\n for (i = 0; i < attachmentsLength; i += 1) {\n validateAttachmentObject(attachments[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAgent(agent, trace, errors) {\n var localErrors, localTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AGENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(agent)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n ifiCount = getIFICount(agent);\n\n if (ifiCount !== _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (agent.objectType === _properties.objectTypes.GROUP) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(agent, localTrace, localErrors);\n validatePropertyIsString(agent, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n validateAbsenceOfNonWhitelistedProperties(agent, _whitelists.xapiWhiteListProperties.AGENT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateGroup(group, trace, errors) {\n var localErrors, localTrace, memberTrace, ifiCount, numMembers, i;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.GROUP;\n memberTrace = _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MEMBER);\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(group)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n ifiCount = getIFICount(group);\n\n if (ifiCount === 0) {\n if (group.member === null || group.member === undefined) {\n localErrors.push({\n trace: memberTrace,\n message: _errors.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else if (ifiCount > _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(group, localTrace, localErrors);\n\n validatePropertyIsString(group, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n if (group.member !== undefined) {\n if (group.member === null || !_utils.xapiValidationUtils.isArray(group.member)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n numMembers = group.member.length;\n\n for (i = 0; i < numMembers; i += 1) {\n validateAgent(group.member[i], _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors);\n }\n }\n }\n\n validateAbsenceOfNonWhitelistedProperties(group, _whitelists.xapiWhiteListProperties.GROUP, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateActor(actor, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ACTOR;\n\n if (actor === null || actor === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (_utils.xapiValidationUtils.isGroup(actor)) {\n validateGroup(actor, localTrace, localErrors);\n } else {\n validateAgent(actor, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAuthority(authority, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AUTHORITY;\n\n if (authority === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(authority)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n if (_utils.xapiValidationUtils.isGroup(authority)) {\n validateGroup(authority, localTrace, localErrors);\n if (!authority.member || !authority.member.length || authority.member.length !== _general.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n validateAgent(authority, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateContextActivitySubContext(subContext, trace, errors) {\n var localErrors, localTrace, numActivities, i;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.SUB_CONTEXT;\n\n if (subContext === undefined) {\n return localErrors;\n }\n\n if (subContext === null) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (_utils.xapiValidationUtils.isArray(subContext)) {\n numActivities = subContext.length;\n for (i = 0; i < numActivities; i += 1) {\n validateActivity(subContext[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n }\n } else if (_utils.xapiValidationUtils.isObject(subContext)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n\n validateActivity(subContext, localTrace, localErrors);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,\n level: _errors.xapiErrorLevels.MUST_VIOLATION });\n }\n return localErrors;\n}\n\nfunction validateContextActivities(contextActivities, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT_ACTIVITIES;\n\n if (contextActivities === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(contextActivities)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n validateContextActivitySubContext(contextActivities.parent, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.PARENT), localErrors);\n validateContextActivitySubContext(contextActivities.grouping, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.GROUPING), localErrors);\n validateContextActivitySubContext(contextActivities.category, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CATEGORY), localErrors);\n validateContextActivitySubContext(contextActivities.other, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OTHER), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(contextActivities, _whitelists.xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateContext(context, trace, errors, statementObjectObjectType) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT;\n\n if (context === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(context)) {\n localErrors.push({\n trace: localTrace,\n message: _errors.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (context.registration !== undefined && (context.registration === null || !_utils.xapiValidationUtils.isString(context.registration) || !_regex.xapiValidationRegex.UUID.test(context.registration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REGISTRATION),\n message: _errors.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if ([_properties.objectTypes.GROUP, _properties.objectTypes.AGENT].indexOf(statementObjectObjectType) !== _general.xapiGeneral.NO_INDEX_FOUND) {\n if (context.revision !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REVISION),\n message: _errors.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.platform !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.PLATFORM),\n message: _errors.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsString(context, _properties.properties.REVISION, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsString(context, _properties.properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (context.team !== undefined) {\n validateGroup(context.team, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.TEAM), localErrors);\n }\n\n if (context.contextActivities !== undefined) {\n validateContextActivities(context.contextActivities, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT_ACTIVITIES), localErrors);\n }\n\n if (context.language !== undefined && !_utils.xapiValidationUtils.isValidLanguageTag(context.language)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LANGUAGE),\n message: _errors.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.statement !== undefined) {\n validateStatementRef(context.statement, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.STATEMENT), localErrors);\n }\n\n if (context.instructor !== undefined) {\n if (_utils.xapiValidationUtils.isGroup(context.instructor)) {\n validateGroup(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n } else {\n validateAgent(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n }\n }\n\n validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n validateAbsenceOfNonWhitelistedProperties(context, [_properties.properties.REGISTRATION, _properties.properties.INSTRUCTOR, _properties.properties.TEAM, _properties.properties.CONTEXT_ACTIVITIES, _properties.properties.REVISION, _properties.properties.PLATFORM, _properties.properties.LANGUAGE, _properties.properties.STATEMENT, _properties.properties.EXTENSIONS], localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateObject(object, trace, errors, isWithinSubStatement) {\n var localErrors, localTrace, objectType;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.OBJECT;\n\n if (object === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(object)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION);\n objectType = object.objectType || _properties.objectTypes.ACTIVITY;\n\n // TODO: Switch\n if (objectType === _properties.objectTypes.ACTIVITY) {\n validateActivity(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.AGENT) {\n validateAgent(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.GROUP) {\n validateGroup(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.STATEMENT_REF) {\n validateStatementRef(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.SUB_STATEMENT) {\n if (isWithinSubStatement) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateStatement(object, localTrace, localErrors, /*isSubStatement*/true);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(),\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n return localErrors;\n}\n\nfunction validateStatement(statement, trace, errors, isSubStatement) {\n var localErrors, localTrace, statementObjectObjectType, whitelistedProperties;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.STATEMENT;\n\n whitelistedProperties = _whitelists.xapiWhiteListProperties.STATEMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(statement)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!isSubStatement) {\n if (statement.id === null || statement.id === undefined || !_utils.xapiValidationUtils.isString(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n } else if (!_regex.xapiValidationRegex.UUID.test(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.ID_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n whitelistedProperties = _whitelists.xapiWhiteListProperties.SUB_STATEMENT;\n }\n\n validateActor(statement.actor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ACTOR), localErrors);\n validateVerb(statement.verb, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERB), localErrors);\n validateObject(statement.object, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OBJECT), localErrors, isSubStatement);\n validateResult(statement.result, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RESULT), localErrors);\n\n statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : _properties.objectTypes.ACTIVITY;\n\n validateContext(statement.context, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT), localErrors, statementObjectObjectType);\n validatePropertyIsISO8601String(statement, _properties.properties.TIMESTAMP, localTrace, localErrors);\n validatePropertyIsISO8601String(statement, _properties.properties.STORED, localTrace, localErrors);\n\n validateAuthority(statement.authority, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.AUTHORITY), localErrors);\n validateVersion(statement.version, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERSION), localErrors);\n validateAttachments(statement.attachments, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ATTACHMENTS), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction makeStatementReport(statement) {\n var localErrors;\n\n localErrors = [];\n validateStatement(statement, _properties.properties.STATEMENT, localErrors, /*isRequired*/false);\n\n return makeV1Report(statement, localErrors);\n}\n\nfunction validateAmbiguousTypeStatement(statement) {\n var statementObject;\n\n if (statement === undefined) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (statement === null) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (_utils.xapiValidationUtils.isString(statement)) {\n try {\n statementObject = JSON.parse(statement);\n if (statementObject === null || !_utils.xapiValidationUtils.isObject(statementObject) || _utils.xapiValidationUtils.isArray(statementObject)) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } catch (e) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.INVALID_JSON + ': ' + e.message,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return makeStatementReport(statementObject);\n }\n\n if (_utils.xapiValidationUtils.isObject(statement) && !_utils.xapiValidationUtils.isArray(statement)) {\n return makeStatementReport(statement);\n }\n\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n}\n\nfunction dateIncludesZoneInformation(matched) {\n return matched[_regex.dateFormatRegexPositions.ZONE] || matched[_regex.dateFormatRegexPositions.RELATIVE_TIME] && matched[_regex.dateFormatRegexPositions.TIME_ZONE_HOUR];\n}\n\nxapiValidator = {\n validateStatement: validateAmbiguousTypeStatement\n};\n\nexports.default = xapiValidator;\n\nwindow.xapiValidator = xapiValidator;\n\n},{\"../constants/errors\":1,\"../constants/general\":2,\"../constants/interaction-types\":3,\"../constants/properties\":4,\"../constants/regex\":5,\"../constants/whitelists\":6,\"../utils/utils\":8}],8:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.xapiValidationUtils = undefined;\n\nvar _regex = require('../constants/regex');\n\nvar _properties = require('../constants/properties');\n\nvar IS_STRING = '[object String]',\n IS_ARRAY = '[object Array]',\n IS_BOOLEAN = '[object Boolean]',\n IS_NUMBER = '[object Number]';\n\nvar toString = Object.prototype.toString;\nvar xapiValidationUtils;\n\nexports.xapiValidationUtils = xapiValidationUtils = {\n isString: function isString(obj) {\n return toString.call(obj) === IS_STRING;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n\n\n isArray: Array.isArray || function (obj) {\n return toString.call(obj) === IS_ARRAY;\n },\n\n isBoolean: function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === IS_BOOLEAN;\n },\n isNumber: function isNumber(obj) {\n return toString.call(obj) === IS_NUMBER;\n },\n isDefined: function isDefined(obj) {\n return obj !== null || obj !== undefined;\n },\n isNonNullMapObject: function isNonNullMapObject(target) {\n return this.isDefined(target) && this.isObject(target) && !this.isArray(target);\n },\n isValidLanguageTag: function isValidLanguageTag(target) {\n // TODO - use more precise 5646 handling, rather than this simplified BCP 47 regex, which combines RFC 5646 and RFC 4647.\n return this.isDefined(target) && this.isString(target) && _regex.xapiValidationRegex.BCP_47.test(target);\n },\n addPropToTrace: function addPropToTrace(trace, addendum) {\n return this.isDefined(addendum) ? trace + '.' + addendum : trace;\n },\n addLookupToTrace: function addLookupToTrace(trace, key) {\n return !this.isDefined(key) ? trace : this.isNumber(key) ? trace + '[' + key + ']' : trace + '[\"' + key + '\"]';\n },\n localTraceToString: function localTraceToString(trace, addendum) {\n return this.addPropToTrace(trace, addendum);\n },\n isGroup: function isGroup(actorOrGroup) {\n return actorOrGroup.member !== null && actorOrGroup.member !== undefined || actorOrGroup.objectType === _properties.objectTypes.GROUP;\n }\n};\n\nexports.xapiValidationUtils = xapiValidationUtils;\n\n},{\"../constants/properties\":4,\"../constants/regex\":5}]},{},[7])(7)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjb25zdGFudHMvZXJyb3JzLmpzIiwiY29uc3RhbnRzL2dlbmVyYWwuanMiLCJjb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJjb25zdGFudHMvcHJvcGVydGllcy5qcyIsImNvbnN0YW50cy9yZWdleC5qcyIsImNvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIiwidXRpbHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7QUFFQSxJQUFNLGtCQUFrQixPQUFPLE1BQVAsQ0FBYztBQUNwQyxpQkFBa0IsZUFEa0I7QUFFcEMsa0JBQWtCLGdCQUZrQjtBQUdwQyxvQkFBa0I7QUFIa0IsQ0FBZCxDQUF4Qjs7QUFNQSxJQUFNLHVCQUF1QixPQUFPLE1BQVAsQ0FBYztBQUN6QyxjQUFrRCxtQ0FEVDtBQUV6QyxrQkFBa0QseUNBRlQ7QUFHekMsbUJBQWtELHNEQUhUO0FBSXpDLHNCQUFrRCw2Q0FKVDtBQUt6Qyx1QkFBa0QsMERBTFQ7QUFNekMsc0JBQWtELHVFQU5UO0FBT3pDLG1CQUFrRCwwQ0FQVDtBQVF6QywyQkFBa0QsdURBUlQ7QUFTekMsa0JBQWtELHlDQVRUO0FBVXpDLDBCQUFrRCxzREFWVDtBQVd6QyxvQkFBa0QsbUZBWFQ7QUFZekMsNkJBQWtELDJGQVpUO0FBYXpDLCtCQUFrRCxvRUFiVDtBQWN6QyxrQ0FBa0QsMkRBZFQ7QUFlekMsNEJBQWtELDRDQWZUO0FBZ0J6QyxtQ0FBa0QseURBaEJUO0FBaUJ6Qyx5QkFBa0QsdUJBakJUO0FBa0J6Qyx5QkFBa0QsaURBbEJUO0FBbUJ6Qyw4QkFBa0Qsd0NBbkJUO0FBb0J6QyxvQ0FBa0QsaUVBcEJUO0FBcUJ6Qyx5Q0FBa0Qsb0VBckJUO0FBc0J6QywwQ0FBa0QsNEVBdEJUO0FBdUJ6QyxnQ0FBa0QsZ0ZBdkJUO0FBd0J6QyxxQkFBa0Qsd0VBeEJUO0FBeUJ6QyxxQ0FBa0QseUVBekJUO0FBMEJ6QyxrQ0FBa0Qsd0dBMUJUO0FBMkJ6QywrQkFBa0Qsa0RBM0JUO0FBNEJ6QywyQ0FBa0QsOEVBNUJUO0FBNkJ6Qyw2Q0FBa0Qsa0RBN0JUO0FBOEJ6QywyQ0FBa0QseUNBOUJUO0FBK0J6Qyw4Q0FBa0QscURBL0JUO0FBZ0N6QyxxQ0FBa0QscUZBaENUO0FBaUN6Qyw2QkFBa0Qsa0ZBakNUO0FBa0N6Qyw4QkFBa0QsK0RBbENUO0FBbUN6QyxnQ0FBa0Qsd0ZBbkNUO0FBb0N6QyxnQ0FBa0Qsd0ZBcENUO0FBcUN6Qyw2QkFBa0QscUZBckNUO0FBc0N6Qyw2QkFBa0QsNkNBdENUO0FBdUN6QywwQkFBa0Qsd0VBdkNUO0FBd0N6Qyx3Q0FBa0QsbUZBeENUO0FBeUN6QyxzQkFBa0QsNEVBekNUO0FBMEN6QywyQ0FBa0Qsa0ZBMUNUO0FBMkN6Qyw0Q0FBa0Qsc0RBM0NUO0FBNEN6QywwQkFBa0QsMERBNUNUO0FBNkN6QywrQ0FBa0Qsd0RBN0NUO0FBOEN6QyxvQ0FBa0QsNERBOUNUO0FBK0N6QyxzQ0FBa0QseUNBL0NUO0FBZ0R6QyxxQ0FBa0QsdUNBaERUO0FBaUR6QywwQ0FBa0Qsc0ZBakRUO0FBa0R6Qyw2Q0FBa0QsNEVBbERUO0FBbUR6QyxxQ0FBa0QsdUNBbkRUO0FBb0R6QyxnREFBa0QsMERBcERUO0FBcUR6QywwQ0FBa0QscUZBckRUO0FBc0R6Qyw4QkFBa0QsNkRBdERUO0FBdUR6QywwQkFBa0QseUJBdkRUO0FBd0R6Qyx5Q0FBa0QscUVBeERUO0FBeUR6Qyw2Q0FBa0Qsc0lBekRUO0FBMER6Qyx1Q0FBa0Qsd0RBMURUO0FBMkR6Qyx5Q0FBa0QscUhBM0RUO0FBNER6QyxvREFBa0Qsc0dBNURUO0FBNkR6QyxrREFBa0QsaUVBN0RUO0FBOER6QyxzQ0FBa0QsbUVBOURUO0FBK0R6QyxvQ0FBa0QsOERBL0RUO0FBZ0V6QyxtQ0FBa0QseUZBaEVUO0FBaUV6QywyQkFBa0QscUZBakVUO0FBa0V6QywwQkFBa0QscUNBbEVUO0FBbUV6QyxzQ0FB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NkJELE1BN0JDLEVBNkJPO0FBQ3pCO0FBQ0EsV0FBTyxLQUFLLFNBQUwsQ0FBZSxNQUFmLEtBQTBCLEtBQUssUUFBTCxDQUFjLE1BQWQsQ0FBMUIsSUFBbUQsMkJBQW9CLE1BQXBCLENBQTJCLElBQTNCLENBQWdDLE1BQWhDLENBQTFEO0FBQ0QsR0FoQ21CO0FBa0NwQixnQkFsQ29CLDBCQWtDTCxLQWxDSyxFQWtDRSxRQWxDRixFQWtDWTtBQUM5QixXQUFPLEtBQUssU0FBTCxDQUFlLFFBQWYsSUFBOEIsS0FBOUIsU0FBdUMsUUFBdkMsR0FBb0QsS0FBM0Q7QUFDRCxHQXBDbUI7QUFzQ3BCLGtCQXRDb0IsNEJBc0NILEtBdENHLEVBc0NJLEdBdENKLEVBc0NTO0FBQzNCLFdBQVEsQ0FBQyxLQUFLLFNBQUwsQ0FBZSxHQUFmLENBQUYsR0FBeUIsS0FBekIsR0FBa0MsS0FBSyxRQUFMLENBQWMsR0FBZCxJQUF3QixLQUF4QixTQUFpQyxHQUFqQyxTQUE2QyxLQUE3QyxVQUF1RCxHQUF2RCxPQUF6QztBQUNELEdBeENtQjtBQTBDcEIsb0JBMUNvQiw4QkEwQ0QsS0ExQ0MsRUEwQ00sUUExQ04sRUEwQ2dCO0FBQ2xDLFdBQU8sS0FBSyxjQUFMLENBQW9CLEtBQXBCLEVBQTJCLFFBQTNCLENBQVA7QUFDRCxHQTVDbUI7QUE4Q3BCLFNBOUNvQixtQkE4Q1osWUE5Q1ksRUE4Q0U7QUFDcEIsV0FBUSxhQUFhLE1BQWIsS0FBd0IsSUFBeEIsSUFBZ0MsYUFBYSxNQUFiLEtBQXdCLFNBQXpELElBQXVFLGFBQWEsVUFBYixLQUE0Qix3QkFBWSxLQUF0SDtBQUNEO0FBaERtQixDQUF0Qjs7UUFtRFEsbUIsR0FBQSxtQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlFcnJvckxldmVscyA9IE9iamVjdC5mcmVlemUoe1xuICBNQVlfVklPTEFUSU9OOiAgICAnTUFZX1ZJT0xBVElPTicsXG4gIE1VU1RfVklPTEFUSU9OOiAgICdNVVNUX1ZJT0xBVElPTicsXG4gIFNIT1VMRF9WSU9MQVRJT046ICdTSE9VTERfVklPTEFUSU9OJ1xufSk7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVORVhQRUNURUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgcHJvcGVydHkgbm90IHBlcm1pdHRlZCcsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX1VSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIFVSSSBzdHJpbmcuJyxcbiAgTVVTVF9CRV9VUklfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgVVJJIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX0JPT0xFQU46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIEJvb2xlYW4uJyxcbiAgTVVTVF9CRV9CT09MRUFOX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgQm9vbGVhbiBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX05VTUJFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIE51bWJlci4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9NQk9YX1VSSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgd2FzIG5vdCBhIHN0cmluZyBhdCBhbGwuJyxcbiAgTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBFWFRFTlNJT05TX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgZXh0ZW5zaW9ucyBwcm9wZXJ0eSBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBMQU5HVUFHRV9NQVBTX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICdMYW5ndWFnZSBNYXBzLCB3aGVuIHByZXNlbnQsIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBMQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdrZXksIExhbmd1YWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gUkZDIDU2NDYnLFxuICBMQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICdrZXk6IExhbmd1YWdlIE1hcCB2YWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcsIGJ1dCB3YXMgbm90JyxcbiAgVkVSQl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBtdXN0IGJlIHByb3ZpZGVkJyxcbiAgVkVSQl9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBESVNQTEFZX1NIT1VMRF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICAgICAgICAgICdcImRpc3BsYXlcIiBwcm9wZXJ0eSBzaG91bGQgYmUgcHJvdmlkZWQuJyxcbiAgSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkU6ICAgICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gQWN0aXZpdHkgRGVmaW5pdGlvbnMgc2hvdWxkIGhhdmUgYSB0eXBlIHByb3BlcnR5IG9mJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX1NIT1VMRF9CRV9BUlJBWTogICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkuJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBtZW1iZXIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfQ01JOiAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJpbnRlcmFjdGlvblR5cGVcIiB2YWx1ZSBtdXN0IGJlIGEgQ01JIGludGVyYWN0aW9uIHR5cGUgb3B0aW9uLicsXG4gIElEX01VU1RfQkVfVU5JUVVFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBlYWNoIGludGVyYWN0aW9uIGNvbXBvbmVudCBhcnJheScsXG4gIElEX1NIT1VMRF9OT1RfQ09OVEFJTl9XSElURVNQQUNFUzogICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG9uIGludGVyYWN0aW9uIGNvbXBvbmVudHMgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlc3BhY2UnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIHByb3BlcnR5IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXNlbnQgaW50ZXJhY3Rpb25UeXBlIG9mOiAnLFxuICBERUZJTklUSU9OU19NVVNUX0JFX09CSkVDVFM6ICAgICAgICAgICAgICAgICAgICAgICdcImRlZmluaXRpb25zXCIsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBtYXAgb2JqZWN0cycsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9BUlJBWTogICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuXCIgdmFsdWUgbXVzdCBiZSBhbiBBcnJheSBvZiBzdHJpbmdzLicsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9TVFJJTkdTOiAgICAgICAgJ1wiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiBpdGVtcyBtdXN0IGJlIHN0cmluZ3MuJyxcbiAgQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAgICAnQWN0aXZpdGllcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAnU3RhdGVtZW50UmVmIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgT0JKRUNUX1RZUEVfTVVTVF9CRV9TVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAgICAnXCJvYmplY3RUeXBlXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBcIlN0YXRlbWVudFJlZlwiIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRF9VVUlEX1JFRjogICAgICAgICAgICAgICAgICAgICAgICAnXCJpZFwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgYSB2YWxpZCBVVUlEIHN0cmluZyBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIFNDQUxFRF9NVVNUX0JFX0JFVFdFRU5fMF8xOiAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBzY2FsZWQgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnLFxuICBSQVdfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBNQVhfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwibWF4XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSBtYXggcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBSQVdfTVVTVF9CRV9MRVNTX1RIQU5fTUFYOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWF4XCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiBtYXgnLFxuICBSRVNVTFRfTVVTVF9CRV9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgcmVzdWx0IG11c3QgYmUgYSBtYXAgb2JqZWN0JyxcbiAgRFVSQVRJT05fTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiZHVyYXRpb25cIiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGFuIElTTyA4NjAxIGR1cmF0aW9uJyxcbiAgREFURV9TSE9VTERfSU5DTFVERV9aT05FX0lORk9STUFUSU9OOiAgICAgICAgICAgICAnSVNPIDg2MDEgZGF0ZSB0aW1lIHN0cmluZ3MgdXNlZCBpbiB0aGUgeEFQSSBzaG91bGQgaW5jbHVkZSB0aW1lIHpvbmUgaW5mb3JtYXRpb24uJyxcbiAgREFURV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eXMgc3RyaW5nIHZhbHVlIG11c3QgYmUgY29uZm9ybWFudCB0byBJU08gODYwMSBmb3IgRGF0ZSBUaW1lcy4nLFxuICBWRVJTSU9OX01VU1RfQ09NUExZX1NFTUFOVElDX1ZFUlNJT05JTkc6ICAgICAgICAgICdcInZlcnNpb25cIiBtdXN0IGJlIGEgbm9uLW51bGwgc3RyaW5nIHRoYXQgY29tcGxpZXMgd2l0aCBTZW1hbnRpYyBWZXJzaW9uaW5nIDEuMC4wJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgICAnXCJhdHRhY2htZW50XCIgaW5zdGFuY2VzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWTogICAgICAgICAgICAgICAnXCJhdHRhY2htZW50c1wiIG11c3QgYmUgYSBub24tbnVsbCBBcnJheS4nLFxuICBBR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImFnZW50XCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBBR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gXCJhZ2VudFwiLicsXG4gIEFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTOiAgICAgICAgJ0ludmFsaWQgb2JqZWN0IHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEgR3JvdXAgd2hlbiBhbiBBZ2VudCB3YXMgZXhwZWN0ZWQuJyxcbiAgR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJncm91cFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgTUVNQkVSX01VU1RfQkVfUFJPVklERURfRk9SX0FOT05ZTU9VU19HUk9VUFM6ICAgICAnXCJtZW1iZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIGZvciBBbm9ueW1vdXMgR3JvdXBzLicsXG4gIEdST1VQX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIFwiZ3JvdXBcIi4nLFxuICBHUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWTogICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgbWVtYmVyIHByb3BlcnR5IG9mIGEgR3JvdXAgbXVzdCBiZSBhbiBBcnJheScsXG4gIEFDVE9SX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdG9yIG11c3QgYmUgcHJvdmlkZWQuJyxcbiAgQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVDogICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV086ICAgICAgICAnSWYgdXNlZCBhcyBhIEdyb3VwLCB0aGUgXCJhdXRob3JpdHlcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBcIm1lbWJlclwiIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBleGFjdGx5IHR3byBBZ2VudCBvYmplY3RzLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgJ1wiQ29udGV4dCBBY3Rpdml0aWVzXCIgcHJvcGVydHkgdmFsdWVzIG11c3Qgbm90IGJlIG51bGwuJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWTogICAgICAgICAgICAnQ29udGV4dCBBY3Rpdml0aWVzIHByb3BlcnR5IHZhbHVlcyBzaG91bGQgcHJlZmVyIHRvIGJlIGFuIGFycmF5IG9mIEFjdGl2aXRpZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQWN0aXZpdHkgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgUkVHSVNUUkFUSU9OX01VU1RfQkVfVVVJRF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBtdXN0IGJlIGEgVVVJRCBzdHJpbmcuJyxcbiAgUkVWSVNJT05fTVVTVF9CRV9BR0VOVF9PUl9HUk9VUDogICAgICAgICAgICAgICAgICAnVGhlIHJldmlzaW9uIHByb3BlcnR5IG11c3Qgbm90IGJlIHVzZWQgaWYgdGhlIFN0YXRlbWVudFxcJ3MgT2JqZWN0IGlzIGFuIEFnZW50IG9yIEdyb3VwLicsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgT0JKRUNUX01VU1RfQkVfREVGSU5FRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJvYmplY3RcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIE9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQ6ICAgICAnQSBTdWJTdGF0ZW1lbnQgbXVzdCBub3QgY29udGFpbiBhIFN1YlN0YXRlbWVudCcsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIElEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUzogICAgICAgICAgICAgICAgICAgJ0lkcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBBY3Rpdml0eSBQcm92aWRlciwgYW5kIG11c3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBMUlMnLFxuICBJRF9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJZCB3YXMgbm90IGEgdmFsaWQgVVVJRCcsXG4gIFNUQVRFTUVOVF9BUkdVTUVOVF9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgJ05vIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgICdOdWxsIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9CRV9QQVJTRURfQ09SUkVDVExZOiAgICAgICAgICAgICAgICdOdWxsIG9yIG5vbi1vYmplY3Qgc3RhdGVtZW50IHZhbHVlIHBhcnNlZCBmcm9tIHByb3ZpZGVkIHN0YXRtZW50IEpTT04uJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXVxufSk7XG5cbiBleHBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi4vY29uc3RhbnRzL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc30gZnJvbSAnLi4vY29uc3RhbnRzL3doaXRlbGlzdHMnO1xuaW1wb3J0IHt4YXBpRXJyb3JMZXZlbHMsIHhhcGlWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHt4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9pbnRlcmFjdGlvbi10eXBlcyc7XG5pbXBvcnQge3hhcGlHZW5lcmFsfSBmcm9tICcuLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxudmFyIHhhcGlWYWxpZGF0b3I7XG5cbmZ1bmN0aW9uIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3JzKSB7XG4gIHZhciB2ZXJzaW9uO1xuXG4gIGluc3RhbmNlID0gaW5zdGFuY2UgfHwgbnVsbDtcbiAgZXJyb3JzICAgPSBlcnJvcnMgfHwgbnVsbDtcbiAgdmVyc2lvbiAgPSB4YXBpR2VuZXJhbC5GSVJTVF9SRVBPUlRfVkVSU1RJT047XG4gIHJldHVybiB7aW5zdGFuY2UsIGVycm9ycywgdmVyc2lvbn07XG59XG5cbmZ1bmN0aW9uIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KGluc3RhbmNlLCBlcnJvcikge1xuICByZXR1cm4gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkID8gW10gOiBbZXJyb3JdKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXModGFyZ2V0LCBhbGxvd2VkUHJvcGVydGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG5cbiAgZm9yIChwcm9wZXJ0eU5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmIGFsbG93ZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlVORVhQRUNURUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQsIHZpb2xhdGlvblR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWUsIGxvY2FsVmlvbGF0aW9uVHlwZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgICAgICAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV0sXG4gIGxvY2FsVmlvbGF0aW9uVHlwZSA9IHZpb2xhdGlvblR5cGUgfHwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICBsb2NhbFZpb2xhdGlvblR5cGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gdGFyZ2V0W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguSVJJLnRlc3QocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfSVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9VUklfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmwodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgLy8gVE9ETyAtIGNoZWNrIHdoZXRoZXIgYSBmb3JtYWwgVVJMIGZvcm1hdCBkZWZpbml0aW9uIGlzIHJlY29tbWVuZGVkL2VuZm9yY2VkIGZvciB4QVBJXG4gIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNCb29sZWFuKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQm9vbGVhbihwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTn1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTl9QUkVTRU5UfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOdW1iZXIocHJvcFZhbHVlKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX05VTUJFUn1gLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJfUFJFU0VOVH1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSUZJUHJvcGVydGllcyh0YXJnZXQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBhY2NvdW50VHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGlmICh0YXJnZXQubWJveCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5tYm94ICE9PSBudWxsKSB7XG4gICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX01CT1hfVVJJLFxuICAgICAgICBsZXZlbDogeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4Lk1BSUxUT19VUkkudGVzdCh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXMsIHByb3BlcnRpZXNMZW5ndGgsIGksIHByb3BOYW1lLCBwcm9wVmFsdWU7XG5cbiAgaWZpcyA9IFtdO1xuICBwcm9wZXJ0aWVzTGVuZ3RoID0geGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLmxlbmd0aDtcblxuICBpZiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdW5kZWZpbmVkKSAge1xuICAgIHJldHVybiBpZmlzO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXNMZW5ndGg7IGkgKz0gMSkge1xuICAgIHByb3BOYW1lICA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lc1tpXTtcbiAgICBwcm9wVmFsdWUgPSB0YXJnZXRbcHJvcE5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWZpcy5wdXNoKHtrZXk6IHByb3BOYW1lLCB2YWx1ZTogcHJvcFZhbHVlfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlmaXM7XG59XG5cbmZ1bmN0aW9uIGdldElGSUNvdW50KHRhcmdldCkge1xuICByZXR1cm4gZ2V0SUZJcyh0YXJnZXQpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdLFxuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlM7XG5cbiAgaWYgKGV4dGVuc2lvbnMgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChleHRlbnNpb25zKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIC8vIFRPRE8gLSBkb3VibGUtY2hlY2sgd2hhdCBmdXJ0aGVyIGVuZm9yY2VhYmxlIGNvbnN0cmFpbnRzIGV4aXN0IG9uIGV4dGVuc2lvbiBvYmplY3QgcHJvcGVydGllc1xuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcE5hbWUsIG1hcHBlZFZhbHVlO1xuXG4gICAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gICAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGxhbmd1YWdlTWFwKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gbGFuZ3VhZ2VNYXApIHtcbiAgICAgIGlmIChsYW5ndWFnZU1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzVmFsaWRMYW5ndWFnZVRhZyhwcm9wTmFtZSkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcE5hbWUpLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7cHJvcE5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEfWAsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICAgIGlmIChtYXBwZWRWYWx1ZSA9PT0gbnVsbCB8fCBtYXBwZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKG1hcHBlZFZhbHVlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUF9LRVlfTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgICBpZiAodmVyYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUkJfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKHZlcmIsIHByb3BlcnRpZXMuSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi90cnVlKTtcblxuICAgIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVMYW5ndWFnZU1hcCh2ZXJiLmRpc3BsYXksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlzQWxsb3dlZENvbXBvbmVudFR5cGUsIGlkcywgaW50ZXJhY3Rpb25Db21wb25lbnQsIGNvbXBvbmVudHNMZW5ndGgsIHBlckNvbXBvbmVudFRyYWNlLCBpO1xuXG4gICAgbG9jYWxFcnJvcnMgICAgICAgICAgICA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuSU5URVJBQ1RJT05fQ09NUE9ORU5UUztcbiAgICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgICBpZHMgICAgICAgICAgICAgICAgICAgID0gW107XG5cblxuICAgIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBvbmVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25Db21wb25lbnQgPSBjb21wb25lbnRzW2ldO1xuICAgICAgICAgIHBlckNvbXBvbmVudFRyYWNlICAgID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIGkpO1xuXG4gICAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICB0cmFjZTogICBwZXJDb21wb25lbnRUcmFjZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgcHJvcGVydGllcy5JRCwgcGVyQ29tcG9uZW50VHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlkcy5wdXNoKGludGVyYWN0aW9uQ29tcG9uZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoaW50ZXJhY3Rpb25Db21wb25lbnQuZGVzY3JpcHRpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuREVTQ1JJUFRJT04pLCBsb2NhbEVycm9ycyk7XG4gICAgICAgICAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09NUE9ORU5UX0FSUkFZLCBwZXJDb21wb25lbnRUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpbnRlcmFjdGlvblR5cGUgJiYgY29tcG9uZW50cykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9WQUxJRH0gJHtpbnRlcmFjdGlvblR5cGV9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlEZWZpbnRpb24oZGVmaW5pdGlvbiwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5MZW5ndGgsIGNycEl0ZW0sIGk7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5ERUZJTklUSU9OO1xuICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTik7XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVMYW5ndWFnZU1hcChkZWZpbml0aW9uLm5hbWUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5OQU1FKSwgbG9jYWxFcnJvcnMpO1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKGRlZmluaXRpb24sIHByb3BlcnRpZXMuVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNVcmwoZGVmaW5pdGlvbiwgcHJvcGVydGllcy5NT1JFX0lORk8sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gICAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgICBpZiAoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0geGFwaUdlbmVyYWwuSU5URVJBQ1RJT05fREVGSU5JVElPTl9UWVBFKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVFlQRSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkV9IFwiJHt4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEV9XCJgLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybi5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjcnBJdGVtID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybltpXTtcblxuICAgICAgICAgIGlmIChjcnBJdGVtID09PSBudWxsIHx8IGNycEl0ZW0gPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjcnBJdGVtKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblRyYWNlLCBpKSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgICAgZGVmaW5pdGlvbi5jaG9pY2VzLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ0hPSUNFUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgICBkZWZpbml0aW9uLnNjYWxlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5MSUtFUlRdLFxuICAgICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNDQUxFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24udGFyZ2V0LFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVEFSR0VUKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc3RlcHMsXG4gICAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICAgIFtwcm9wZXJ0aWVzLlBFUkZPUk1BTkNFXSxcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEVQUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhkZWZpbml0aW9uLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWV9ERUZJTklUSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGF0dGFjaG1lbnRzTGVuZ3RoLCBpO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTO1xuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoYXR0YWNobWVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShhdHRhY2htZW50cykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgYXR0YWNobWVudHNMZW5ndGggPSBhdHRhY2htZW50cy5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBhdHRhY2htZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnRzW2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBZ2VudChhZ2VudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFHRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYWdlbnQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmaUNvdW50ID0gZ2V0SUZJQ291bnQoYWdlbnQpO1xuXG4gIGlmIChpZmlDb3VudCAhPT0geGFwaUdlbmVyYWwuTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWdlbnQub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVApIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1MsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhhZ2VudCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoYWdlbnQsIHByb3BlcnRpZXMuTkFNRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhZ2VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQUdFTlQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlR3JvdXAoZ3JvdXAsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBtZW1iZXJUcmFjZSwgaWZpQ291bnQsIG51bU1lbWJlcnMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuR1JPVVA7XG4gIG1lbWJlclRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUik7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChncm91cCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGdyb3VwKTtcblxuICBpZiAoaWZpQ291bnQgPT09IDApIHtcbiAgICBpZiAoZ3JvdXAubWVtYmVyID09PSBudWxsIHx8IGdyb3VwLm1lbWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgbWVtYmVyVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpZmlDb3VudCA+IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVJRklQcm9wZXJ0aWVzKGdyb3VwLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGdyb3VwLCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKGdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGdyb3VwLm1lbWJlcikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01FTUJFUl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1NZW1iZXJzID0gZ3JvdXAubWVtYmVyLmxlbmd0aDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1lbWJlcnM7IGkgKz0gMSkge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KGdyb3VwLm1lbWJlcltpXSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGdyb3VwLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5HUk9VUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3RvcihhY3RvciwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUNUT1I7XG5cbiAgaWYgKGFjdG9yID09PSBudWxsIHx8IGFjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUNUT1JfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhY3RvcikpIHtcbiAgICB2YWxpZGF0ZUdyb3VwKGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVBZ2VudChhY3RvciwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml0eShhdXRob3JpdHksIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFVVEhPUklUWTtcblxuICBpZiAoYXV0aG9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGF1dGhvcml0eSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzR3JvdXAoYXV0aG9yaXR5KSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgaWYgKCFhdXRob3JpdHkubWVtYmVyIHx8ICFhdXRob3JpdHkubWVtYmVyLmxlbmd0aCB8fCBhdXRob3JpdHkubWVtYmVyLmxlbmd0aCAhPT0geGFwaUdlbmVyYWwuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlMpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGF1dGhvcml0eSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoc3ViQ29udGV4dCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG51bUFjdGl2aXRpZXMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1VCX0NPTlRFWFQ7XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IG51bGwpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3ViQ29udGV4dCkpIHtcbiAgICAgIG51bUFjdGl2aXRpZXMgPSBzdWJDb250ZXh0Lmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1BY3Rpdml0aWVzOyBpICs9IDEpIHtcbiAgICAgICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0W2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgICAgIH1cbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN1YkNvbnRleHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVksXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTn0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0QWN0aXZpdGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTO1xuXG4gIGlmIChjb250ZXh0QWN0aXZpdGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0QWN0aXZpdGllcykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5wYXJlbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5QQVJFTlQpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5ncm91cGluZywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkdST1VQSU5HKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMuY2F0ZWdvcnksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DQVRFR09SWSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLm90aGVyLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT1RIRVIpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoY29udGV4dEFjdGl2aXRpZXMsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIHRyYWNlLCBlcnJvcnMsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5DT05URVhUO1xuXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoY29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoY29udGV4dC5yZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCAmJiAoY29udGV4dC5yZWdpc3RyYXRpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoY29udGV4dC5yZWdpc3RyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChjb250ZXh0LnJlZ2lzdHJhdGlvbikpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRUdJU1RSQVRJT05fTVVTVF9CRV9VVUlEX1NUUklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFtvYmplY3RUeXBlcy5HUk9VUCwgb2JqZWN0VHlwZXMuQUdFTlRdLmluZGV4T2Yoc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgaWYgKGNvbnRleHQucmV2aXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVWSVNJT04pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnBsYXRmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBMQVRGT1JNKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUExBVEZPUk1fTVVTVF9OT1RfQkVfVVNFRF9XSVRIX1JFVklTSU9OX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhjb250ZXh0LCBwcm9wZXJ0aWVzLlJFVklTSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi9mYWxzZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUExBVEZPUk0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIGlmIChjb250ZXh0LnRlYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdGVHcm91cChjb250ZXh0LnRlYW0sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5URUFNKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY29udGV4dEFjdGl2aXRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlQ29udGV4dEFjdGl2aXRpZXMoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUyksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIGlmIChjb250ZXh0Lmxhbmd1YWdlICE9PSB1bmRlZmluZWQgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKGNvbnRleHQubGFuZ3VhZ2UpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkxBTkdVQUdFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01VU1RfQkVfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5zdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKGNvbnRleHQuc3RhdGVtZW50LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU1RBVEVNRU5UKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuaW5zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChjb250ZXh0Lmluc3RydWN0b3IpKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOU1RSVUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlQWdlbnQoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUV4dGVuc2lvbnMoY29udGV4dC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoXG4gICAgY29udGV4dCxcbiAgICBbXG4gICAgICBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTixcbiAgICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICAgIHByb3BlcnRpZXMuVEVBTSxcbiAgICAgIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLFxuICAgICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICAgIHByb3BlcnRpZXMuUExBVEZPUk0sXG4gICAgICBwcm9wZXJ0aWVzLkxBTkdVQUdFLFxuICAgICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlNcbiAgICBdLFxuICAgIGxvY2FsVHJhY2UsXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9iamVjdCwgdHJhY2UsIGVycm9ycywgaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBvYmplY3RUeXBlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLk9CSkVDVDtcblxuICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfREVGSU5FRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChvYmplY3QpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhvYmplY3QsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OKTtcbiAgb2JqZWN0VHlwZSA9IG9iamVjdC5vYmplY3RUeXBlIHx8IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIC8vIFRPRE86IFN3aXRjaFxuICBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuQUNUSVZJVFkpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkFHRU5UKSB7XG4gICAgdmFsaWRhdGVBZ2VudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIGlmIChvYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUCkge1xuICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLlNVQl9TVEFURU1FTlQpIHtcbiAgICBpZiAoaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTdGF0ZW1lbnQob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNTdWJTdGF0ZW1lbnQqL3RydWUpO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSksXG4gICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50KHN0YXRlbWVudCwgdHJhY2UsIGVycm9ycywgaXNTdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlLCB3aGl0ZWxpc3RlZFByb3BlcnRpZXM7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIHdoaXRlbGlzdGVkUHJvcGVydGllcyA9IHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNUQVRFTUVOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KHN0YXRlbWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIWlzU3ViU3RhdGVtZW50KSB7XG4gICAgaWYgKHN0YXRlbWVudC5pZCA9PT0gbnVsbCB8fCBzdGF0ZW1lbnQuaWQgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQuaWQpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURfTVVTVF9CRV9WQUxJRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1VCX1NUQVRFTUVOVDtcbiAgfVxuXG4gIHZhbGlkYXRlQWN0b3Ioc3RhdGVtZW50LmFjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyYihzdGF0ZW1lbnQudmVyYiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUkIpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlT2JqZWN0KHN0YXRlbWVudC5vYmplY3QsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1QpLCBsb2NhbEVycm9ycywgaXNTdWJTdGF0ZW1lbnQpO1xuICB2YWxpZGF0ZVJlc3VsdChzdGF0ZW1lbnQucmVzdWx0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVTVUxUKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUgPSBzdGF0ZW1lbnQub2JqZWN0ICYmIHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA/IHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA6IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIHZhbGlkYXRlQ29udGV4dChzdGF0ZW1lbnQuY29udGV4dCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFQpLCBsb2NhbEVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlRJTUVTVEFNUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNJU084NjAxU3RyaW5nKHN0YXRlbWVudCwgcHJvcGVydGllcy5TVE9SRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUF1dGhvcml0eShzdGF0ZW1lbnQuYXV0aG9yaXR5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVVUSE9SSVRZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVZlcnNpb24oc3RhdGVtZW50LnZlcnNpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5WRVJTSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUF0dGFjaG1lbnRzKHN0YXRlbWVudC5hdHRhY2htZW50cywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudCwgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiBtYWtlU3RhdGVtZW50UmVwb3J0KHN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnM7XG5cbiAgbG9jYWxFcnJvcnMgPSBbXTtcbiAgdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUQVRFTUVOVCwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICByZXR1cm4gbWFrZVYxUmVwb3J0KHN0YXRlbWVudCwgbG9jYWxFcnJvcnMpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gIHZhciBzdGF0ZW1lbnRPYmplY3Q7XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoc3RhdGVtZW50KSkge1xuICAgIHRyeSB7XG4gICAgICBzdGF0ZW1lbnRPYmplY3QgPSBKU09OLnBhcnNlKHN0YXRlbWVudCk7XG4gICAgICBpZiAoc3RhdGVtZW50T2JqZWN0ID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudE9iamVjdCkgfHwgeGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudE9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX0JFX1BBUlNFRF9DT1JSRUNUTFksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChzdGF0ZW1lbnRPYmplY3QsIHtcbiAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVkFMSURfSlNPTn06ICR7ZS5tZXNzYWdlfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50T2JqZWN0KTtcbiAgfVxuXG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudCkgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdGF0ZW1lbnQpKSB7XG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRCxcbiAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSB7XG4gIHJldHVybiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5aT05FXSB8fFxuICAgICAgICAgIChtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5SRUxBVElWRV9USU1FXSAmJiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5USU1FX1pPTkVfSE9VUl0pO1xufVxuXG54YXBpVmFsaWRhdG9yID0ge1xuICB2YWxpZGF0ZVN0YXRlbWVudDogdmFsaWRhdGVBbWJpZ3VvdXNUeXBlU3RhdGVtZW50XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4YXBpVmFsaWRhdG9yO1xud2luZG93LnhhcGlWYWxpZGF0b3IgPSB4YXBpVmFsaWRhdG9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uUmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge29iamVjdFR5cGVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbmNvbnN0XG4gIElTX1NUUklORyAgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgSVNfQVJSQVkgICA9ICdbb2JqZWN0IEFycmF5XScsXG4gIElTX0JPT0xFQU4gPSAnW29iamVjdCBCb29sZWFuXScsXG4gIElTX05VTUJFUiAgPSAnW29iamVjdCBOdW1iZXJdJztcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciB4YXBpVmFsaWRhdGlvblV0aWxzO1xuXG54YXBpVmFsaWRhdGlvblV0aWxzID0ge1xuICBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19TVFJJTkc7XG4gIH0sXG5cbiAgaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7XG4gIH0sXG5cbiAgaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19BUlJBWTtcbiAgfSxcblxuICBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdHJ1ZSB8fCBvYmogPT09IGZhbHNlIHx8IHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfQk9PTEVBTjtcbiAgfSxcblxuICBpc051bWJlcihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19OVU1CRVI7XG4gIH0sXG5cbiAgaXNEZWZpbmVkKG9iaikge1xuICAgIHJldHVybiAob2JqICE9PSBudWxsIHx8IG9iaiAhPT0gdW5kZWZpbmVkKTtcbiAgfSxcblxuICBpc05vbk51bGxNYXBPYmplY3QodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzT2JqZWN0KHRhcmdldCkgJiYgIXRoaXMuaXNBcnJheSh0YXJnZXQpO1xuICB9LFxuXG4gIGlzVmFsaWRMYW5ndWFnZVRhZyh0YXJnZXQpIHtcbiAgICAvLyBUT0RPIC0gdXNlIG1vcmUgcHJlY2lzZSA1NjQ2IGhhbmRsaW5nLCByYXRoZXIgdGhhbiB0aGlzIHNpbXBsaWZpZWQgQkNQIDQ3IHJlZ2V4LCB3aGljaCBjb21iaW5lcyBSRkMgNTY0NiBhbmQgUkZDIDQ2NDcuXG4gICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKHRhcmdldCkgJiYgdGhpcy5pc1N0cmluZyh0YXJnZXQpICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQkNQXzQ3LnRlc3QodGFyZ2V0KTtcbiAgfSxcblxuICBhZGRQcm9wVG9UcmFjZSh0cmFjZSwgYWRkZW5kdW0pIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQoYWRkZW5kdW0pID8gYCR7dHJhY2V9LiR7YWRkZW5kdW19YCA6IHRyYWNlO1xuICB9LFxuXG4gIGFkZExvb2t1cFRvVHJhY2UodHJhY2UsIGtleSkge1xuICAgIHJldHVybiAoIXRoaXMuaXNEZWZpbmVkKGtleSkpID8gdHJhY2UgOiAodGhpcy5pc051bWJlcihrZXkpID8gYCR7dHJhY2V9WyR7a2V5fV1gIDogYCR7dHJhY2V9W1wiJHtrZXl9XCJdYCk7XG4gIH0sXG5cbiAgbG9jYWxUcmFjZVRvU3RyaW5nKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSk7XG4gIH0sXG5cbiAgaXNHcm91cChhY3Rvck9yR3JvdXApIHtcbiAgICByZXR1cm4gKGFjdG9yT3JHcm91cC5tZW1iZXIgIT09IG51bGwgJiYgYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB8fCBhY3Rvck9yR3JvdXAub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVA7XG4gIH1cbn07XG5cbmV4cG9ydCB7eGFwaVZhbGlkYXRpb25VdGlsc307XG4iXX0=\n"]} \ No newline at end of file diff --git a/lib/xapiValidator.js b/lib/xapiValidator.js new file mode 100644 index 0000000..d241fb2 --- /dev/null +++ b/lib/xapiValidator.js @@ -0,0 +1,1653 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.beepBoop = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o _general.xapiGeneral.MAX_SCALED_VALUE) { + localErrors.push({ + trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCALED), + message: _errors.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } + + if (score.min !== undefined) { + validatePropertyIsNumber(score, _properties.properties.MIN, localTrace, localErrors, /*isRequired*/false); + + if (score.raw !== undefined && score.raw < score.min) { + localErrors.push({ + trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW), + message: _errors.xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (score.max !== undefined && score.max < score.min) { + localErrors.push({ + trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MAX), + message: _errors.xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } + + if (score.max !== undefined) { + validatePropertyIsNumber(score, _properties.properties.MAX, localTrace, localErrors, /*isRequired*/false); + + if (score.raw !== undefined && score.raw > score.max) { + localErrors.push({ + trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW), + message: _errors.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } + + validatePropertyIsNumber(score, _properties.properties.RAW, localTrace, localErrors, /*isRequired*/false); + validateAbsenceOfNonWhitelistedProperties(score, _whitelists.xapiWhiteListProperties.SCORE, localTrace, localErrors); + + return localErrors; +} + +function validateResult(result, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.RESULT; + + if (result === undefined) { + return localErrors; + } + + if (!_utils.xapiValidationUtils.isNonNullMapObject(result)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.addPropToTrace(localTrace), + message: _errors.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validateScore(result.score, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCORE), localErrors); + validatePropertyIsBoolean(result, _properties.properties.SUCCESS, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsBoolean(result, _properties.properties.COMPLETION, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsString(result, _properties.properties.RESPONSE, localTrace, localErrors, /*isRequired*/false); + validateExtensions(result.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors); + + if (result.duration !== undefined && (result.duration === null || !_utils.xapiValidationUtils.isString(result.duration) || !_regex.xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) { + localErrors.push({ + trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DURATION), + message: _errors.xapiValidationErrors.DURATION_MUST_BE_VALID, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + validateAbsenceOfNonWhitelistedProperties(result, _whitelists.xapiWhiteListProperties.RESULT, localTrace, localErrors); + + return localErrors; +} + +function validatePropertyIsISO8601String(parent, propertyName, trace, errors) { + var localErrors, localTrace, matched, datetime; + + localErrors = errors || []; + localTrace = trace || _properties.properties.DATE_TIME; + datetime = parent[propertyName]; + + if (datetime === undefined) { + return localErrors; + } + + if (datetime === null || !_utils.xapiValidationUtils.isString(datetime)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: propertyName + ' ' + _errors.xapiValidationErrors.MUST_BE_STRING, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + matched = _regex.xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime); + + if (matched) { + if (!dateIncludesZoneInformation(matched)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: _errors.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION, + level: _errors.xapiErrorLevels.SHOULD_VIOLATION + }); + } + } else { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: _errors.xapiValidationErrors.DATE_MUST_BE_VALID, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + return localErrors; +} + +function validateVersion(version, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.VERSION; + + if (version === undefined) { + return localErrors; + } + + if (version === null || !_utils.xapiValidationUtils.isString(version) || !_regex.xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + return localErrors; +} + +function validateAttachmentObject(attachment, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.ATTACHMENT; + + if (!_utils.xapiValidationUtils.isNonNullMapObject(attachment)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (attachment.display === undefined) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.DISPLAY), + message: _errors.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } else { + validateLanguageMap(attachment.display, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DISPLAY), localErrors); + } + + validateLanguageMap(attachment.description, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DESCRIPTION), localErrors); + validatePropertyIsUri(attachment, _properties.properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION); + validatePropertyIsUri(attachment, _properties.properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION); + + // TODO - more complete validation for Internet Media Type via RFC 2046 + validatePropertyIsString(attachment, _properties.properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION); + + if (attachment.length === undefined || attachment.length === null || !_utils.xapiValidationUtils.isNumber(attachment.length) || attachment.length % 1 !== 0) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LENGTH), + message: _errors.xapiValidationErrors.LENGTH_MUST_BE_INTEGER, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (attachment.sha2 === undefined) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2), + message: _errors.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } else if (attachment.sha2 === null || !_utils.xapiValidationUtils.isString(attachment.sha2) || !_regex.xapiValidationRegex.BASE_64.test(attachment.sha2)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2), + message: _errors.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + validateAbsenceOfNonWhitelistedProperties(attachment, _whitelists.xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors); + return localErrors; +} + +function validateAttachments(attachments, trace, errors) { + var localErrors, localTrace, attachmentsLength, i; + + localErrors = errors || []; + localTrace = trace || _properties.properties.ATTACHMENTS; + + if (attachments === undefined) { + return localErrors; + } + + if (attachments === null || !_utils.xapiValidationUtils.isArray(attachments)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + attachmentsLength = attachments.length; + for (i = 0; i < attachmentsLength; i += 1) { + validateAttachmentObject(attachments[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + } + + return localErrors; +} + +function validateAgent(agent, trace, errors) { + var localErrors, localTrace, ifiCount; + + localErrors = errors || []; + localTrace = trace || _properties.properties.AGENT; + + if (!_utils.xapiValidationUtils.isNonNullMapObject(agent)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + return localErrors; + } + + ifiCount = getIFICount(agent); + + if (ifiCount !== _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (agent.objectType === _properties.objectTypes.GROUP) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + validateIFIProperties(agent, localTrace, localErrors); + validatePropertyIsString(agent, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false); + + validateAbsenceOfNonWhitelistedProperties(agent, _whitelists.xapiWhiteListProperties.AGENT, localTrace, localErrors); + + return localErrors; +} + +function validateGroup(group, trace, errors) { + var localErrors, localTrace, memberTrace, ifiCount, numMembers, i; + + localErrors = errors || []; + localTrace = trace || _properties.properties.GROUP; + memberTrace = _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MEMBER); + + if (!_utils.xapiValidationUtils.isNonNullMapObject(group)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + ifiCount = getIFICount(group); + + if (ifiCount === 0) { + if (group.member === null || group.member === undefined) { + localErrors.push({ + trace: memberTrace, + message: _errors.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } else if (ifiCount > _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + validateIFIProperties(group, localTrace, localErrors); + + validatePropertyIsString(group, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false); + + if (group.member !== undefined) { + if (group.member === null || !_utils.xapiValidationUtils.isArray(group.member)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER), + message: _errors.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } else { + numMembers = group.member.length; + + for (i = 0; i < numMembers; i += 1) { + validateAgent(group.member[i], _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors); + } + } + } + + validateAbsenceOfNonWhitelistedProperties(group, _whitelists.xapiWhiteListProperties.GROUP, localTrace, localErrors); + + return localErrors; +} + +function validateActor(actor, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.ACTOR; + + if (actor === null || actor === undefined) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (_utils.xapiValidationUtils.isGroup(actor)) { + validateGroup(actor, localTrace, localErrors); + } else { + validateAgent(actor, localTrace, localErrors); + } + + return localErrors; +} + +function validateAuthority(authority, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.AUTHORITY; + + if (authority === undefined) { + return localErrors; + } + + if (!_utils.xapiValidationUtils.isNonNullMapObject(authority)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + if (_utils.xapiValidationUtils.isGroup(authority)) { + validateGroup(authority, localTrace, localErrors); + if (!authority.member || !authority.member.length || authority.member.length !== _general.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER), + message: _errors.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } else { + validateAgent(authority, localTrace, localErrors); + } + + return localErrors; +} + +function validateContextActivitySubContext(subContext, trace, errors) { + var localErrors, localTrace, numActivities, i; + + localErrors = errors || []; + localTrace = trace || _properties.properties.SUB_CONTEXT; + + if (subContext === undefined) { + return localErrors; + } + + if (subContext === null) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } else if (_utils.xapiValidationUtils.isArray(subContext)) { + numActivities = subContext.length; + for (i = 0; i < numActivities; i += 1) { + validateActivity(subContext[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + } + } else if (_utils.xapiValidationUtils.isObject(subContext)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY, + level: _errors.xapiErrorLevels.SHOULD_VIOLATION + }); + + validateActivity(subContext, localTrace, localErrors); + } else { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ, + level: _errors.xapiErrorLevels.MUST_VIOLATION }); + } + return localErrors; +} + +function validateContextActivities(contextActivities, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.CONTEXT_ACTIVITIES; + + if (contextActivities === undefined) { + return localErrors; + } + + if (!_utils.xapiValidationUtils.isNonNullMapObject(contextActivities)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + return localErrors; + } + + validateContextActivitySubContext(contextActivities.parent, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.PARENT), localErrors); + validateContextActivitySubContext(contextActivities.grouping, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.GROUPING), localErrors); + validateContextActivitySubContext(contextActivities.category, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CATEGORY), localErrors); + validateContextActivitySubContext(contextActivities.other, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OTHER), localErrors); + + validateAbsenceOfNonWhitelistedProperties(contextActivities, _whitelists.xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors); + + return localErrors; +} + +function validateContext(context, trace, errors, statementObjectObjectType) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || _properties.properties.CONTEXT; + + if (context === undefined) { + return localErrors; + } + + if (!_utils.xapiValidationUtils.isNonNullMapObject(context)) { + localErrors.push({ + trace: localTrace, + message: _errors.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (context.registration !== undefined && (context.registration === null || !_utils.xapiValidationUtils.isString(context.registration) || !_regex.xapiValidationRegex.UUID.test(context.registration))) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REGISTRATION), + message: _errors.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if ([_properties.objectTypes.GROUP, _properties.objectTypes.AGENT].indexOf(statementObjectObjectType) !== _general.xapiGeneral.NO_INDEX_FOUND) { + if (context.revision !== undefined) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REVISION), + message: _errors.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (context.platform !== undefined) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.PLATFORM), + message: _errors.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } + + validatePropertyIsString(context, _properties.properties.REVISION, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION); + validatePropertyIsString(context, _properties.properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION); + + if (context.team !== undefined) { + validateGroup(context.team, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.TEAM), localErrors); + } + + if (context.contextActivities !== undefined) { + validateContextActivities(context.contextActivities, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT_ACTIVITIES), localErrors); + } + + if (context.language !== undefined && !_utils.xapiValidationUtils.isValidLanguageTag(context.language)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LANGUAGE), + message: _errors.xapiValidationErrors.LANGUAGE_MUST_BE_STRING, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (context.statement !== undefined) { + validateStatementRef(context.statement, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.STATEMENT), localErrors); + } + + if (context.instructor !== undefined) { + if (_utils.xapiValidationUtils.isGroup(context.instructor)) { + validateGroup(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors); + } else { + validateAgent(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors); + } + } + + validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors); + validateAbsenceOfNonWhitelistedProperties(context, [_properties.properties.REGISTRATION, _properties.properties.INSTRUCTOR, _properties.properties.TEAM, _properties.properties.CONTEXT_ACTIVITIES, _properties.properties.REVISION, _properties.properties.PLATFORM, _properties.properties.LANGUAGE, _properties.properties.STATEMENT, _properties.properties.EXTENSIONS], localTrace, localErrors); + + return localErrors; +} + +function validateObject(object, trace, errors, isWithinSubStatement) { + var localErrors, localTrace, objectType; + + localErrors = errors || []; + localTrace = trace || _properties.properties.OBJECT; + + if (object === undefined) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.OBJECT_MUST_BE_DEFINED, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (!_utils.xapiValidationUtils.isNonNullMapObject(object)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION); + objectType = object.objectType || _properties.objectTypes.ACTIVITY; + + // TODO: Switch + if (objectType === _properties.objectTypes.ACTIVITY) { + validateActivity(object, localTrace, localErrors); + } else if (objectType === _properties.objectTypes.AGENT) { + validateAgent(object, localTrace, localErrors); + } else if (objectType === _properties.objectTypes.GROUP) { + validateGroup(object, localTrace, localErrors); + } else if (objectType === _properties.objectTypes.STATEMENT_REF) { + validateStatementRef(object, localTrace, localErrors); + } else if (objectType === _properties.objectTypes.SUB_STATEMENT) { + if (isWithinSubStatement) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE), + message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + validateStatement(object, localTrace, localErrors, /*isSubStatement*/true); + } else { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE), + message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(), + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + return localErrors; +} + +function validateStatement(statement, trace, errors, isSubStatement) { + var localErrors, localTrace, statementObjectObjectType, whitelistedProperties; + + localErrors = errors || []; + localTrace = trace || _properties.properties.STATEMENT; + + whitelistedProperties = _whitelists.xapiWhiteListProperties.STATEMENT; + + if (!_utils.xapiValidationUtils.isNonNullMapObject(statement)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace), + message: _errors.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (!isSubStatement) { + if (statement.id === null || statement.id === undefined || !_utils.xapiValidationUtils.isString(statement.id)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID), + message: _errors.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS, + level: _errors.xapiErrorLevels.SHOULD_VIOLATION + }); + } else if (!_regex.xapiValidationRegex.UUID.test(statement.id)) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID), + message: _errors.xapiValidationErrors.ID_MUST_BE_VALID, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } else { + whitelistedProperties = _whitelists.xapiWhiteListProperties.SUB_STATEMENT; + } + + validateActor(statement.actor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ACTOR), localErrors); + validateVerb(statement.verb, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERB), localErrors); + validateObject(statement.object, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OBJECT), localErrors, isSubStatement); + validateResult(statement.result, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RESULT), localErrors); + + statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : _properties.objectTypes.ACTIVITY; + + validateContext(statement.context, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT), localErrors, statementObjectObjectType); + validatePropertyIsISO8601String(statement, _properties.properties.TIMESTAMP, localTrace, localErrors); + validatePropertyIsISO8601String(statement, _properties.properties.STORED, localTrace, localErrors); + + validateAuthority(statement.authority, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.AUTHORITY), localErrors); + validateVersion(statement.version, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERSION), localErrors); + validateAttachments(statement.attachments, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ATTACHMENTS), localErrors); + + validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors); + + return localErrors; +} + +function makeStatementReport(statement) { + var localErrors; + + localErrors = []; + validateStatement(statement, _properties.properties.STATEMENT, localErrors, /*isRequired*/false); + + return makeV1Report(statement, localErrors); +} + +function validateAmbiguousTypeStatement(statement) { + var statementObject; + + if (statement === undefined) { + return makeV1SingleErrorReport( /*instance*/null, { + trace: _properties.properties.STATEMENT, + message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (statement === null) { + return makeV1SingleErrorReport( /*instance*/null, { + trace: _properties.properties.STATEMENT, + message: _errors.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + if (_utils.xapiValidationUtils.isString(statement)) { + try { + statementObject = JSON.parse(statement); + if (statementObject === null || !_utils.xapiValidationUtils.isObject(statementObject) || _utils.xapiValidationUtils.isArray(statementObject)) { + return makeV1SingleErrorReport(statementObject, { + trace: _properties.properties.STATEMENT, + message: _errors.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + } catch (e) { + return makeV1SingleErrorReport(statementObject, { + trace: _properties.properties.STATEMENT, + message: _errors.xapiValidationErrors.INVALID_JSON + ': ' + e.message, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + + return makeStatementReport(statementObject); + } + + if (_utils.xapiValidationUtils.isObject(statement) && !_utils.xapiValidationUtils.isArray(statement)) { + return makeStatementReport(statement); + } + + return makeV1SingleErrorReport( /*instance*/null, { + trace: _properties.properties.STATEMENT, + message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); +} + +function dateIncludesZoneInformation(matched) { + return matched[_regex.dateFormatRegexPositions.ZONE] || matched[_regex.dateFormatRegexPositions.RELATIVE_TIME] && matched[_regex.dateFormatRegexPositions.TIME_ZONE_HOUR]; +} + +xapiValidator = { + validateStatement: validateAmbiguousTypeStatement +}; + +exports.default = xapiValidator; + +window.xapiValidator = xapiValidator; + +},{"../constants/errors":1,"../constants/general":2,"../constants/interaction-types":3,"../constants/properties":4,"../constants/regex":5,"../constants/whitelists":6,"../utils/utils":8}],8:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.xapiValidationUtils = undefined; + +var _regex = require('../constants/regex'); + +var _properties = require('../constants/properties'); + +var IS_STRING = '[object String]', + IS_ARRAY = '[object Array]', + IS_BOOLEAN = '[object Boolean]', + IS_NUMBER = '[object Number]'; + +var toString = Object.prototype.toString; +var xapiValidationUtils; + +exports.xapiValidationUtils = xapiValidationUtils = { + isString: function isString(obj) { + return toString.call(obj) === IS_STRING; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + + + isArray: Array.isArray || function (obj) { + return toString.call(obj) === IS_ARRAY; + }, + + isBoolean: function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === IS_BOOLEAN; + }, + isNumber: function isNumber(obj) { + return toString.call(obj) === IS_NUMBER; + }, + isDefined: function isDefined(obj) { + return obj !== null || obj !== undefined; + }, + isNonNullMapObject: function isNonNullMapObject(target) { + return this.isDefined(target) && this.isObject(target) && !this.isArray(target); + }, + isValidLanguageTag: function isValidLanguageTag(target) { + // TODO - use more precise 5646 handling, rather than this simplified BCP 47 regex, which combines RFC 5646 and RFC 4647. + return this.isDefined(target) && this.isString(target) && _regex.xapiValidationRegex.BCP_47.test(target); + }, + addPropToTrace: function addPropToTrace(trace, addendum) { + return this.isDefined(addendum) ? trace + '.' + addendum : trace; + }, + addLookupToTrace: function addLookupToTrace(trace, key) { + return !this.isDefined(key) ? trace : this.isNumber(key) ? trace + '[' + key + ']' : trace + '["' + key + '"]'; + }, + localTraceToString: function localTraceToString(trace, addendum) { + return this.addPropToTrace(trace, addendum); + }, + isGroup: function isGroup(actorOrGroup) { + return actorOrGroup.member !== null && actorOrGroup.member !== undefined || actorOrGroup.objectType === _properties.objectTypes.GROUP; + } +}; + +exports.xapiValidationUtils = xapiValidationUtils; + +},{"../constants/properties":4,"../constants/regex":5}]},{},[7])(7) +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjb25zdGFudHMvZXJyb3JzLmpzIiwiY29uc3RhbnRzL2dlbmVyYWwuanMiLCJjb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJjb25zdGFudHMvcHJvcGVydGllcy5qcyIsImNvbnN0YW50cy9yZWdleC5qcyIsImNvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIiwidXRpbHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7QUFFQSxJQUFNLGtCQUFrQixPQUFPLE1BQVAsQ0FBYztBQUNwQyxpQkFBa0IsZUFEa0I7QUFFcEMsa0JBQWtCLGdCQUZrQjtBQUdwQyxvQkFBa0I7QUFIa0IsQ0FBZCxDQUF4Qjs7QUFNQSxJQUFNLHVCQUF1QixPQUFPLE1BQVAsQ0FBYztBQUN6QyxjQUFrRCxtQ0FEVDtBQUV6QyxrQkFBa0QseUNBRlQ7QUFHekMsbUJBQWtELHNEQUhUO0FBSXpDLHNCQUFrRCw2Q0FKVDtBQUt6Qyx1QkFBa0QsMERBTFQ7QUFNekMsc0JBQWtELHVFQU5UO0FBT3pDLG1CQUFrRCwwQ0FQVDtBQVF6QywyQkFBa0QsdURBUlQ7QUFTekMsa0JBQWtELHlDQVRUO0FBVXpDLDBCQUFrRCxzREFWVDtBQVd6QyxvQkFBa0QsbUZBWFQ7QUFZekMsNkJBQWtELDJGQVpUO0FBYXpDLCtCQUFrRCxvRUFiVDtBQWN6QyxrQ0FBa0QsMkRBZFQ7QUFlekMsNEJBQWtELDRDQWZUO0FBZ0J6QyxtQ0FBa0QseURBaEJUO0FBaUJ6Qyx5QkFBa0QsdUJBakJUO0FBa0J6Qyx5QkFBa0QsaURBbEJUO0FBbUJ6Qyw4QkFBa0Qsd0NBbkJUO0FBb0J6QyxvQ0FBa0QsaUVBcEJUO0FBcUJ6Qyx5Q0FBa0Qsb0VBckJUO0FBc0J6QywwQ0FBa0QsNEVBdEJUO0FBdUJ6QyxnQ0FBa0QsZ0ZBdkJUO0FBd0J6QyxxQkFBa0Qsd0VBeEJUO0FBeUJ6QyxxQ0FBa0QseUVBekJUO0FBMEJ6QyxrQ0FBa0Qsd0dBMUJUO0FBMkJ6QywrQkFBa0Qsa0RBM0JUO0FBNEJ6QywyQ0FBa0QsOEVBNUJUO0FBNkJ6Qyw2Q0FBa0Qsa0RBN0JUO0FBOEJ6QywyQ0FBa0QseUNBOUJUO0FBK0J6Qyw4Q0FBa0QscURBL0JUO0FBZ0N6QyxxQ0FBa0QscUZBaENUO0FBaUN6Qyw2QkFBa0Qsa0ZBakNUO0FBa0N6Qyw4QkFBa0QsK0RBbENUO0FBbUN6QyxnQ0FBa0Qsd0ZBbkNUO0FBb0N6QyxnQ0FBa0Qsd0ZBcENUO0FBcUN6Qyw2QkFBa0QscUZBckNUO0FBc0N6Qyw2QkFBa0QsNkNBdENUO0FBdUN6QywwQkFBa0Qsd0VBdkNUO0FBd0N6Qyx3Q0FBa0QsbUZBeENUO0FBeUN6QyxzQkFBa0QsNEVBekNUO0FBMEN6QywyQ0FBa0Qsa0ZBMUNUO0FBMkN6Qyw0Q0FBa0Qsc0RBM0NUO0FBNEN6QywwQkFBa0QsMERBNUNUO0FBNkN6QywrQ0FBa0Qsd0RBN0NUO0FBOEN6QyxvQ0FBa0QsNERBOUNUO0FBK0N6QyxzQ0FBa0QseUNBL0NUO0FBZ0R6QyxxQ0FBa0QsdUNBaERUO0FBaUR6QywwQ0FBa0Qsc0ZBakRUO0FBa0R6Qyw2Q0FBa0QsNEVBbERUO0FBbUR6QyxxQ0FBa0QsdUNBbkRUO0FBb0R6QyxnREFBa0QsMERBcERUO0FBcUR6QywwQ0FBa0QscUZBckRUO0FBc0R6Qyw4QkFBa0QsNkRBdERUO0FBdUR6QywwQkFBa0QseUJBdkRUO0FBd0R6Qyx5Q0FBa0QscUVBeERUO0FBeUR6Qyw2Q0FBa0Qsc0lBekRUO0FBMER6Qyx1Q0FBa0Qsd0RBMURUO0FBMkR6Qyx5Q0FBa0QscUhBM0RUO0FBNER6QyxvREFBa0Qsc0dBNURUO0FBNkR6QyxrREFBa0QsaUVBN0RUO0FBOER6QyxzQ0FBa0QsbUVBOURUO0FBK0R6QyxvQ0FBa0QsOERBL0RUO0FBZ0V6QyxtQ0FBa0QseUZBaEVUO0FBaUV6QywyQkFBa0QscUZBakVUO0FBa0V6QywwQkFBa0QscUNBbEVUO0FBbUV6QyxzQ0FBa0Qsa0RBbkVUO0FBb0V6QyxnREFBa0QsZ0RBcEVUO0FBcUV6QyxvQ0FBa0QscURBckVUO0FBc0V6QyxrQ0FBa0Qsb0ZBdEVUO0FBdUV6QyxvQkFBa0QseUJBdkVUO0FBd0V6Qyx1Q0FBa0QsaUNBeEVUO0FBeUV6Qyw4QkFBa0QsbUNBekVUO0FBMEV6QyxzQ0FBa0Qsd0VBMUVUO0FBMkV6QyxnQkFBa0Qsa0RBM0VUO0FBNEV6QyxtQ0FBa0Q7QUE1RVQsQ0FBZCxDQUE3Qjs7UUErRVEsZSxHQUFBLGU7UUFDQSxvQixHQUFBLG9COzs7QUN4RlI7Ozs7O0FBRUEsSUFBTSxjQUFjLE9BQU8sTUFBUCxDQUFjO0FBQ2hDLHlCQUFvQyxPQURKO0FBRWhDLGlDQUFvQyxDQUZKO0FBR2hDLCtCQUFvQyxxREFISjtBQUloQyxvQkFBb0MsQ0FKSjtBQUtoQyxvQkFBb0MsQ0FMSjtBQU1oQyxrQkFBb0MsQ0FBQyxDQU5MO0FBT2hDLHFDQUFvQztBQVBKLENBQWQsQ0FBcEI7O1FBVVEsVyxHQUFBLFc7OztBQ1pSOzs7OztBQUVPLElBQU0sOENBQW1CLE9BQU8sTUFBUCxDQUFjO0FBQzVDLFVBQWMsUUFEOEI7QUFFNUMsV0FBYyxTQUY4QjtBQUc1QyxVQUFjLFFBSDhCO0FBSTVDLGdCQUFjLGNBSjhCO0FBSzVDLFlBQWMsVUFMOEI7QUFNNUMsV0FBYyxTQU44QjtBQU81QyxTQUFjLE9BUDhCO0FBUTVDLGVBQWMsYUFSOEI7QUFTNUMsY0FBYyxZQVQ4QjtBQVU1QyxjQUFjO0FBVjhCLENBQWQsQ0FBekI7O0FBYUEsSUFBTSwwRUFBaUMsT0FBTyxNQUFQLENBQWMsQ0FDMUQsaUJBQWlCLE1BRHlDLEVBRTFELGlCQUFpQixPQUZ5QyxFQUcxRCxpQkFBaUIsTUFIeUMsRUFJMUQsaUJBQWlCLFlBSnlDLEVBSzFELGlCQUFpQixRQUx5QyxFQU0xRCxpQkFBaUIsT0FOeUMsRUFPMUQsaUJBQWlCLEtBUHlDLEVBUTFELGlCQUFpQixXQVJ5QyxFQVMxRCxpQkFBaUIsVUFUeUMsRUFVMUQsaUJBQWlCLFVBVnlDLENBQWQsQ0FBdkM7OztBQ2ZQOzs7OztBQUVBLElBQU0sYUFBYSxPQUFPLE1BQVAsQ0FBYztBQUMvQixXQUEyQixTQURJO0FBRS9CLFlBQTJCLFVBRkk7QUFHL0IsU0FBMkIsT0FISTtBQUkvQixTQUEyQixPQUpJO0FBSy9CLGNBQTJCLFlBTEk7QUFNL0IsZUFBMkIsYUFOSTtBQU8vQixhQUEyQixXQVBJO0FBUS9CLFlBQTJCLFVBUkk7QUFTL0IsVUFBMkIsUUFUSTtBQVUvQixXQUEyQixTQVZJO0FBVy9CLGNBQTJCLFlBWEk7QUFZL0IsZ0JBQTJCLGFBWkk7QUFhL0Isc0JBQTJCLG1CQWJJO0FBYy9CLFdBQTJCLFNBZEk7QUFlL0IsNkJBQTJCLHlCQWZJO0FBZ0IvQixhQUEyQixVQWhCSTtBQWlCL0IsY0FBMkIsWUFqQkk7QUFrQi9CLGVBQTJCLGFBbEJJO0FBbUIvQixXQUEyQixTQW5CSTtBQW9CL0IsWUFBMkIsVUFwQkk7QUFxQi9CLGNBQTJCLFlBckJJO0FBc0IvQixZQUEyQixTQXRCSTtBQXVCL0IsU0FBMkIsT0F2Qkk7QUF3Qi9CLFlBQTJCLFVBeEJJO0FBeUIvQixhQUEyQixVQXpCSTtBQTBCL0IsTUFBMkIsSUExQkk7QUEyQi9CLGNBQTJCLFlBM0JJO0FBNEIvQiwwQkFBMkIsdUJBNUJJO0FBNkIvQixvQkFBMkIsaUJBN0JJO0FBOEIvQixnQkFBMkIsYUE5Qkk7QUErQi9CLFlBQTJCLFVBL0JJO0FBZ0MvQixVQUEyQixRQWhDSTtBQWlDL0IsVUFBMkIsUUFqQ0k7QUFrQy9CLFlBQTJCLFVBbENJO0FBbUMvQixPQUEyQixLQW5DSTtBQW9DL0Isa0JBQTJCLGNBcENJO0FBcUMvQixRQUEyQixNQXJDSTtBQXNDL0IsVUFBMkIsUUF0Q0k7QUF1Qy9CLE9BQTJCLEtBdkNJO0FBd0MvQixhQUEyQixVQXhDSTtBQXlDL0IsUUFBMkIsTUF6Q0k7QUEwQy9CLGVBQTJCLFlBMUNJO0FBMkMvQixVQUEyQixRQTNDSTtBQTRDL0IsV0FBMkIsUUE1Q0k7QUE2Qy9CLFNBQTJCLE9BN0NJO0FBOEMvQixVQUEyQixRQTlDSTtBQStDL0IsZUFBMkIsYUEvQ0k7QUFnRC9CLFlBQTJCLFVBaERJO0FBaUQvQixPQUEyQixLQWpESTtBQWtEL0IsZ0JBQTJCLGNBbERJO0FBbUQvQixZQUEyQixVQW5ESTtBQW9EL0IsVUFBMkIsUUFwREk7QUFxRC9CLFlBQTJCLFVBckRJO0FBc0QvQixTQUEyQixPQXRESTtBQXVEL0IsVUFBMkIsUUF2REk7QUF3RC9CLFNBQTJCLE9BeERJO0FBeUQvQixjQUEyQixZQXpESTtBQTBEL0IsUUFBMkIsTUExREk7QUEyRC9CLFVBQTJCLFFBM0RJO0FBNEQvQixpQkFBMkIsY0E1REk7QUE2RC9CLGFBQTJCLFdBN0RJO0FBOEQvQixTQUEyQixPQTlESTtBQStEL0IsVUFBMkIsUUEvREk7QUFnRS9CLGVBQTJCLFlBaEVJO0FBaUUvQixXQUEyQixTQWpFSTtBQWtFL0IsVUFBMkIsUUFsRUk7QUFtRS9CLFFBQTJCLE1BbkVJO0FBb0UvQixhQUEyQixXQXBFSTtBQXFFL0IsUUFBMkIsTUFyRUk7QUFzRS9CLGNBQTJCLFdBdEVJO0FBdUUvQixRQUEyQixNQXZFSTtBQXdFL0IsV0FBMkI7QUF4RUksQ0FBZCxDQUFuQjs7QUEyRUEsSUFBTSxjQUFjLE9BQU8sTUFBUCxDQUFjO0FBQ2hDLFNBQWUsT0FEaUI7QUFFaEMsU0FBZSxPQUZpQjtBQUdoQyxZQUFlLFVBSGlCO0FBSWhDLGlCQUFlLGNBSmlCO0FBS2hDLGlCQUFlO0FBTGlCLENBQWQsQ0FBcEI7O0FBUUEsSUFBTSxpQ0FBaUMsT0FBTyxNQUFQLENBQWMsQ0FDbkQsV0FBVyxPQUR3QyxFQUVuRCxXQUFXLGNBRndDLEVBR25ELFdBQVcsSUFId0MsRUFJbkQsV0FBVyxPQUp3QyxDQUFkLENBQXZDOztBQU9BLElBQU0sdUJBQXVCLE9BQU8sTUFBUCxDQUFjLENBQ3pDLFlBQVksS0FENkIsRUFFekMsWUFBWSxLQUY2QixFQUd6QyxZQUFZLFFBSDZCLEVBSXpDLFlBQVksYUFKNkIsRUFLekMsWUFBWSxhQUw2QixDQUFkLENBQTdCOztRQVFRLFUsR0FBQSxVO1FBQ0EsVyxHQUFBLFc7UUFDQSw4QixHQUFBLDhCO1FBQ0Esb0IsR0FBQSxvQjs7O0FDdkdSOzs7OztBQUVBLElBQU0sc0JBQXNCLE9BQU8sTUFBUCxDQUFjO0FBQ3hDLFFBQXFCLGlFQURtQjtBQUV4QyxxQkFBcUIsMElBRm1CO0FBR3hDLHNCQUFxQixvSUFIbUI7QUFJeEMsY0FBcUIsVUFKbUI7QUFLeEMsdUJBQXFCLEtBTG1CO0FBTXhDLG9CQUFxQiw4Q0FObUI7QUFPeEMsV0FBcUIsMEZBUG1CO0FBUXhDLE9BQXFCLHN1SkFSbUI7QUFTeEMsVUFBcUI7QUFUbUIsQ0FBZCxDQUE1Qjs7QUFZQSxJQUFNLDJCQUEyQixPQUFPLE1BQVAsQ0FBYztBQUM3QyxRQUFrQixDQUQyQjtBQUU3QyxTQUFrQixDQUYyQjtBQUc3QyxPQUFrQixDQUgyQjtBQUk3QyxRQUFrQixDQUoyQjtBQUs3QyxVQUFrQixDQUwyQjtBQU03QyxVQUFrQixDQU4yQjtBQU83QyxXQUFrQixDQVAyQjtBQVE3QyxRQUFrQixDQVIyQjtBQVM3QyxpQkFBa0IsQ0FUMkI7QUFVN0Msa0JBQWtCLEVBVjJCO0FBVzdDLG9CQUFrQjtBQVgyQixDQUFkLENBQWpDOztRQWNRLG1CLEdBQUEsbUI7UUFDQSx3QixHQUFBLHdCOzs7QUM3QlA7Ozs7Ozs7QUFDQTs7QUFFQSxJQUFNLDBCQUEwQixPQUFPLE1BQVAsQ0FBYztBQUM1QyxPQUFLLENBQ0gsdUJBQVcsU0FEUixFQUVILHVCQUFXLElBRlIsQ0FEdUM7QUFLNUMsT0FBSyxDQUNILHVCQUFXLEVBRFIsRUFFSCx1QkFBVyxPQUZSLENBTHVDO0FBUzVDLG1CQUFpQixDQUNmLHVCQUFXLEVBREksRUFFZix1QkFBVyxXQUZJLENBVDJCO0FBYTVDLHVCQUFxQixDQUNuQix1QkFBVyxJQURRLEVBRW5CLHVCQUFXLFdBRlEsRUFHbkIsdUJBQVcsSUFIUSxFQUluQix1QkFBVyxTQUpRLEVBS25CLHVCQUFXLFVBTFEsRUFNbkIsdUJBQVcsZ0JBTlEsRUFPbkIsdUJBQVcseUJBUFEsRUFRbkIsdUJBQVcsT0FSUSxFQVNuQix1QkFBVyxLQVRRLEVBVW5CLHVCQUFXLE1BVlEsRUFXbkIsdUJBQVcsTUFYUSxFQVluQix1QkFBVyxLQVpRLENBYnVCO0FBMkI1QyxZQUFVLENBQ1IsdUJBQVcsV0FESCxFQUVSLHVCQUFXLEVBRkgsRUFHUix1QkFBVyxVQUhILENBM0JrQztBQWdDNUMsaUJBQWUsQ0FDYix1QkFBVyxFQURFLEVBRWIsdUJBQVcsV0FGRSxDQWhDNkI7QUFvQzVDLFNBQU8sQ0FDTCx1QkFBVyxNQUROLEVBRUwsdUJBQVcsR0FGTixFQUdMLHVCQUFXLEdBSE4sRUFJTCx1QkFBVyxHQUpOLENBcENxQztBQTBDNUMsVUFBUSxDQUNOLHVCQUFXLEtBREwsRUFFTix1QkFBVyxPQUZMLEVBR04sdUJBQVcsVUFITCxFQUlOLHVCQUFXLFFBSkwsRUFLTix1QkFBVyxRQUxMLEVBTU4sdUJBQVcsVUFOTCxDQTFDb0M7QUFrRDVDLGNBQVksQ0FDVix1QkFBVyxVQURELEVBRVYsdUJBQVcsT0FGRCxFQUdWLHVCQUFXLFdBSEQsRUFJVix1QkFBVyxZQUpELEVBS1YsdUJBQVcsTUFMRCxFQU1WLHVCQUFXLElBTkQsRUFPVix1QkFBVyxRQVBELENBbERnQztBQTJEN0MsU0FBTyxDQUNMLHVCQUFXLFdBRE4sRUFFTCx1QkFBVyxJQUZOLEVBR0wsdUJBQVcsT0FITixFQUlMLHVCQUFXLGNBSk4sRUFLTCx1QkFBVyxJQUxOLEVBTUwsdUJBQVcsT0FOTixDQTNEc0M7QUFtRTdDLFNBQU8sQ0FDTCx1QkFBVyxXQUROLEVBRUwsdUJBQVcsSUFGTixFQUdMLHVCQUFXLE1BSE4sRUFJTCx1QkFBVyxPQUpOLEVBS0wsdUJBQVcsY0FMTixFQU1MLHVCQUFXLElBTk4sRUFPTCx1QkFBVyxPQVBOLENBbkVzQztBQTRFN0Msc0JBQW9CLENBQ2xCLHVCQUFXLE1BRE8sRUFFbEIsdUJBQVcsUUFGTyxFQUdsQix1QkFBVyxRQUhPLEVBSWxCLHVCQUFXLEtBSk8sQ0E1RXlCO0FBa0Y3QyxhQUFXLENBQ1QsdUJBQVcsRUFERixFQUVULHVCQUFXLEtBRkYsRUFHVCx1QkFBVyxJQUhGLEVBSVQsdUJBQVcsTUFKRixFQUtULHVCQUFXLE1BTEYsRUFNVCx1QkFBVyxPQU5GLEVBT1QsdUJBQVcsU0FQRixFQVFULHVCQUFXLE1BUkYsRUFTVCx1QkFBVyxTQVRGLEVBVVQsdUJBQVcsT0FWRixFQVdULHVCQUFXLFdBWEYsQ0FsRmtDO0FBK0Y3QyxpQkFBZSxDQUNiLHVCQUFXLEtBREUsRUFFYix1QkFBVyxJQUZFLEVBR2IsdUJBQVcsTUFIRSxFQUliLHVCQUFXLE1BSkUsRUFLYix1QkFBVyxPQUxFLEVBTWIsdUJBQVcsU0FORSxFQU9iLHVCQUFXLFdBUEUsRUFRYix1QkFBVyxXQVJFO0FBL0Y4QixDQUFkLENBQWhDOztRQTJHUSx1QixHQUFBLHVCOzs7QUM5R1Q7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUksYUFBSjs7QUFFQSxTQUFTLFlBQVQsQ0FBc0IsUUFBdEIsRUFBZ0MsTUFBaEMsRUFBd0M7QUFDdEMsTUFBSSxPQUFKOztBQUVBLGFBQVcsWUFBWSxJQUF2QjtBQUNBLFdBQVcsVUFBVSxJQUFyQjtBQUNBLFlBQVcscUJBQVkscUJBQXZCO0FBQ0EsU0FBTyxFQUFDLGtCQUFELEVBQVcsY0FBWCxFQUFtQixnQkFBbkIsRUFBUDtBQUNEOztBQUVELFNBQVMsdUJBQVQsQ0FBaUMsUUFBakMsRUFBMkMsS0FBM0MsRUFBa0Q7QUFDaEQsU0FBTyxhQUFhLFFBQWIsRUFBdUIsVUFBVSxJQUFWLElBQWtCLFVBQVUsU0FBNUIsR0FBd0MsRUFBeEMsR0FBNkMsQ0FBQyxLQUFELENBQXBFLENBQVA7QUFDRDs7QUFFRCxTQUFTLHlDQUFULENBQW1ELE1BQW5ELEVBQTJELGlCQUEzRCxFQUE4RSxLQUE5RSxFQUFxRixNQUFyRixFQUE2RjtBQUMzRixNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsWUFBN0I7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSxFQUF4Qjs7QUFFQSxPQUFLLFlBQUwsSUFBcUIsTUFBckIsRUFBNkI7QUFDM0IsUUFBSSxPQUFPLGNBQVAsQ0FBc0IsWUFBdEIsS0FBdUMsa0JBQWtCLE9BQWxCLENBQTBCLFlBQTFCLE1BQTRDLHFCQUFZLGNBQW5HLEVBQW1IO0FBQ2pILGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyxZQUEvQyxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLFVBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRjs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHdCQUFULENBQWtDLE1BQWxDLEVBQTBDLFlBQTFDLEVBQXdELEtBQXhELEVBQStELE1BQS9ELEVBQXVFLFVBQXZFLEVBQW1GLGFBQW5GLEVBQWtHO0FBQ2hHLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixTQUE3QixFQUF3QyxrQkFBeEM7O0FBRUEsZ0JBQXFCLFVBQVUsRUFBL0I7QUFDQSxlQUFxQixTQUFVLEVBQS9CO0FBQ0EsY0FBcUIsT0FBTyxZQUFQLENBQXJCLEVBQ0EscUJBQXFCLGlCQUFpQix3QkFBZ0IsY0FEdEQ7O0FBR0EsTUFBSSxjQUFjLFNBQWxCLEVBQTZCO0FBQzNCLFFBQUksY0FBYyxJQUFkLElBQXNCLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFNBQTdCLENBQTNCLEVBQW9FO0FBQ2xFLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsWUFBbkQsQ0FETTtBQUVmLGlCQUFZLFlBQVosU0FBNEIsNkJBQXFCLGNBRmxDO0FBR2YsZUFBUztBQUhNLE9BQWpCO0FBS0Q7QUFDRixHQVJELE1BUU8sSUFBSSxVQUFKLEVBQWdCO0FBQ3JCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsWUFBbkQsQ0FETTtBQUVmLGVBQVksWUFBWixTQUE0Qiw2QkFBcUIsZUFGbEM7QUFHZixhQUFTO0FBSE0sS0FBakI7QUFLRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHFCQUFULENBQStCLE1BQS9CLEVBQXVDLFlBQXZDLEVBQXFELEtBQXJELEVBQTRELE1BQTVELEVBQW9FLFVBQXBFLEVBQWdGO0FBQzlFLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixTQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLEVBQXhCO0FBQ0EsY0FBYyxPQUFPLFlBQVAsQ0FBZDs7QUFFQSxNQUFJLGNBQWMsU0FBbEIsRUFBNkI7QUFDM0IsUUFBSSxjQUFjLElBQWQsSUFBc0IsQ0FBQywyQkFBb0IsUUFBcEIsQ0FBNkIsU0FBN0IsQ0FBM0IsRUFBb0U7QUFDbEUsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCxZQUFuRCxDQURNO0FBRWYsaUJBQVksWUFBWixTQUE0Qiw2QkFBcUIsa0JBRmxDO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtELEtBTkQsTUFNTyxJQUFJLENBQUMsMkJBQW9CLEdBQXBCLENBQXdCLElBQXhCLENBQTZCLFNBQTdCLENBQUwsRUFBOEM7QUFDbkQsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVEsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCxZQUFuRCxDQURPO0FBRWYsaUJBQVksWUFBWixTQUE0Qiw2QkFBcUIsa0JBRmxDO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0YsR0FkRCxNQWNPLElBQUksVUFBSixFQUFnQjtBQUNyQixnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFZLFlBQVosU0FBNEIsNkJBQXFCLG1CQUZsQztBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDtBQUNELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMscUJBQVQsQ0FBK0IsTUFBL0IsRUFBdUMsWUFBdkMsRUFBcUQsS0FBckQsRUFBNEQsTUFBNUQsRUFBb0UsVUFBcEUsRUFBZ0Y7QUFDOUU7QUFDQSxTQUFPLHlCQUF5QixNQUF6QixFQUFpQyxZQUFqQyxFQUErQyxLQUEvQyxFQUFzRCxNQUF0RCxFQUE4RCxVQUE5RCxDQUFQO0FBQ0Q7O0FBRUQsU0FBUyx5QkFBVCxDQUFtQyxNQUFuQyxFQUEyQyxZQUEzQyxFQUF5RCxLQUF6RCxFQUFnRSxNQUFoRSxFQUF3RSxVQUF4RSxFQUFvRjtBQUNsRixNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsU0FBN0I7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSxFQUF4QjtBQUNBLGNBQWMsT0FBTyxZQUFQLENBQWQ7O0FBRUEsTUFBSSxjQUFjLFNBQWxCLEVBQTZCO0FBQzNCLFFBQUksY0FBYyxJQUFkLElBQXNCLENBQUMsMkJBQW9CLFNBQXBCLENBQThCLFNBQTlCLENBQTNCLEVBQXFFO0FBQ25FLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsWUFBbkQsQ0FETTtBQUVmLGlCQUFZLFlBQVosU0FBNEIsNkJBQXFCLGVBRmxDO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0YsR0FSRCxNQVFPLElBQUksVUFBSixFQUFnQjtBQUNyQixnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFZLFlBQVosU0FBNEIsNkJBQXFCLHVCQUZsQztBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDtBQUNELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsd0JBQVQsQ0FBa0MsTUFBbEMsRUFBMEMsWUFBMUMsRUFBd0QsS0FBeEQsRUFBK0QsTUFBL0QsRUFBdUUsVUFBdkUsRUFBbUY7QUFDakYsTUFBSSxXQUFKLEVBQWlCLFVBQWpCLEVBQTZCLFNBQTdCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsRUFBeEI7QUFDQSxjQUFjLE9BQU8sWUFBUCxDQUFkOztBQUVFLE1BQUksY0FBYyxTQUFsQixFQUE2QjtBQUMzQixRQUFJLGNBQWMsSUFBZCxJQUFzQixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixTQUE3QixDQUEzQixFQUFvRTtBQUNsRSxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixpQkFBWSxZQUFaLFNBQTRCLDZCQUFxQixjQUZsQztBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGLEdBUkQsTUFRTyxJQUFJLFVBQUosRUFBZ0I7QUFDckIsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCxZQUFuRCxDQURNO0FBRWYsZUFBWSxZQUFaLFNBQTRCLDZCQUFxQixzQkFGbEM7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7QUFDRCxTQUFPLFdBQVA7QUFDSDs7QUFFRCxTQUFTLHFCQUFULENBQStCLE1BQS9CLEVBQXVDLEtBQXZDLEVBQThDLE1BQTlDLEVBQXNEO0FBQ3BELE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixZQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLEVBQXhCOztBQUVBLE1BQUksT0FBTyxJQUFQLEtBQWdCLFNBQWhCLElBQTZCLE9BQU8sSUFBUCxLQUFnQixJQUFqRCxFQUF1RDtBQUNyRCxRQUFJLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLE9BQU8sSUFBcEMsQ0FBTCxFQUFnRDtBQUM5QyxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBTywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLElBQTlELENBRFE7QUFFZixpQkFBUyw2QkFBcUIsZ0JBRmY7QUFHZixlQUFPLHdCQUFnQjtBQUhSLE9BQWpCO0FBS0QsS0FORCxNQU1PLElBQUksQ0FBQywyQkFBb0IsVUFBcEIsQ0FBK0IsSUFBL0IsQ0FBb0MsT0FBTyxJQUEzQyxDQUFMLEVBQXVEO0FBQzVELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsSUFBOUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQix5QkFGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGOztBQUVELDJCQUF5QixNQUF6QixFQUFpQyx1QkFBVyxjQUE1QyxFQUE0RCxVQUE1RCxFQUF3RSxXQUF4RSxFQUFzRixjQUFjLEtBQXBHO0FBQ0Esd0JBQXNCLE1BQXRCLEVBQThCLHVCQUFXLE9BQXpDLEVBQWtELFVBQWxELEVBQThELFdBQTlELEVBQTJFLGNBQWMsS0FBekY7O0FBRUEsTUFBSSxPQUFPLE9BQVAsS0FBbUIsU0FBbkIsSUFBZ0MsT0FBTyxPQUFQLEtBQW1CLElBQXZELEVBQTZEO0FBQzNELG1CQUFlLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxPQUExRCxDQUFmO0FBQ0EsMEJBQXNCLE9BQU8sT0FBN0IsRUFBc0MsdUJBQVcsU0FBakQsRUFBMkQsWUFBM0QsRUFBeUUsV0FBekUsRUFBc0YsY0FBYyxJQUFwRztBQUNBLDZCQUF5QixPQUFPLE9BQWhDLEVBQXlDLHVCQUFXLElBQXBELEVBQTBELFlBQTFELEVBQXdFLFdBQXhFLEVBQXFGLGNBQWMsSUFBbkc7QUFDQSw4Q0FBMEMsT0FBTyxPQUFqRCxFQUEwRCxvQ0FBd0IsR0FBbEYsRUFBdUYsWUFBdkYsRUFBcUcsV0FBckc7QUFDRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLE9BQVQsQ0FBaUIsTUFBakIsRUFBeUI7QUFDdkIsTUFBSSxJQUFKLEVBQVUsZ0JBQVYsRUFBNEIsQ0FBNUIsRUFBK0IsUUFBL0IsRUFBeUMsU0FBekM7O0FBRUEsU0FBTyxFQUFQO0FBQ0EscUJBQW1CLDJDQUErQixNQUFsRDs7QUFFQSxNQUFJLFdBQVcsSUFBWCxJQUFtQixXQUFXLFNBQWxDLEVBQThDO0FBQzVDLFdBQU8sSUFBUDtBQUNEOztBQUVELE9BQUssSUFBSSxDQUFULEVBQVksSUFBSSxnQkFBaEIsRUFBa0MsS0FBSyxDQUF2QyxFQUEwQztBQUN4QyxlQUFZLDJDQUErQixDQUEvQixDQUFaO0FBQ0EsZ0JBQVksT0FBTyxRQUFQLENBQVo7O0FBRUEsUUFBSSxjQUFjLFNBQWQsSUFBMkIsY0FBYyxJQUE3QyxFQUFtRDtBQUNqRCxXQUFLLElBQUwsQ0FBVSxFQUFDLEtBQUssUUFBTixFQUFnQixPQUFPLFNBQXZCLEVBQVY7QUFDRDtBQUNGOztBQUVELFNBQU8sSUFBUDtBQUNEOztBQUVELFNBQVMsV0FBVCxDQUFxQixNQUFyQixFQUE2QjtBQUMzQixTQUFPLFFBQVEsTUFBUixFQUFnQixNQUF2QjtBQUNEOztBQUVELFNBQVMsa0JBQVQsQ0FBNEIsVUFBNUIsRUFBd0MsS0FBeEMsRUFBK0MsTUFBL0MsRUFBdUQ7QUFDckQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEIsRUFDQSxhQUFjLFNBQVUsdUJBQVcsVUFEbkM7O0FBR0EsTUFBSSxlQUFlLFNBQW5CLEVBQThCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVuRCxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQUFMLEVBQXlEO0FBQ3ZELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLFVBRE07QUFFZixlQUFTLDZCQUFxQiwyQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDtBQUNEO0FBQ0EsU0FBTyxXQUFQO0FBQ0Q7O0FBRUMsU0FBUyxtQkFBVCxDQUE2QixXQUE3QixFQUEwQyxLQUExQyxFQUFpRCxNQUFqRCxFQUF5RDtBQUN2RCxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsUUFBN0IsRUFBdUMsV0FBdkM7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSx1QkFBVyxZQUFuQzs7QUFFQSxNQUFJLGdCQUFnQixTQUFwQixFQUErQjtBQUFDLFdBQU8sV0FBUDtBQUFvQjs7QUFFcEQsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsV0FBdkMsQ0FBTCxFQUEwRDtBQUN4RCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLDhCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxPQUFLLFFBQUwsSUFBaUIsV0FBakIsRUFBOEI7QUFDNUIsUUFBSSxZQUFZLGNBQVosQ0FBMkIsUUFBM0IsQ0FBSixFQUEwQztBQUN4QyxVQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxRQUF2QyxDQUFMLEVBQXVEO0FBQ3JELG9CQUFZLElBQVosQ0FBaUI7QUFDZixpQkFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsUUFBL0MsQ0FETTtBQUVmLG1CQUFZLFFBQVosU0FBd0IsNkJBQXFCLHdCQUY5QjtBQUdmLGlCQUFTLHdCQUFnQjtBQUhWLFNBQWpCO0FBS0Q7O0FBRUQsb0JBQWMsWUFBWSxRQUFaLENBQWQ7O0FBRUEsVUFBSSxnQkFBZ0IsSUFBaEIsSUFBd0IsZ0JBQWdCLFNBQXhDLElBQXFELENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFdBQTdCLENBQTFELEVBQXFHO0FBQ25HLG9CQUFZLElBQVosQ0FBaUI7QUFDZixpQkFBUywyQkFBb0IsZ0JBQXBCLENBQXFDLFVBQXJDLEVBQWlELFFBQWpELENBRE07QUFFZixtQkFBWSxRQUFaLFNBQXdCLDZCQUFxQiwrQkFGOUI7QUFHZixpQkFBUyx3QkFBZ0I7QUFIVixTQUFqQjtBQUtEO0FBQ0Y7QUFDRjs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLFlBQVQsQ0FBc0IsSUFBdEIsRUFBNEIsS0FBNUIsRUFBbUMsTUFBbkMsRUFBMkM7QUFDekMsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsSUFBbkM7O0FBRUEsTUFBSSxTQUFTLFNBQWIsRUFBd0I7QUFDdEIsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIscUJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEOztBQUVELE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLElBQXZDLENBQUwsRUFBbUQ7QUFDakQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIscUJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEOztBQUVELHdCQUFzQixJQUF0QixFQUE0Qix1QkFBVyxFQUF2QyxFQUEyQyxVQUEzQyxFQUF1RCxXQUF2RCxFQUFxRSxjQUFjLElBQW5GOztBQUVBLE1BQUksS0FBSyxPQUFMLEtBQWlCLFNBQXJCLEVBQWdDO0FBQzlCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxPQUExRCxDQURNO0FBRWYsZUFBUyw2QkFBcUIsMEJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0QsR0FORCxNQU1PO0FBQ0wsd0JBQW9CLEtBQUssT0FBekIsRUFBa0MsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE9BQTFELENBQWxDLEVBQXNHLFdBQXRHO0FBQ0Q7O0FBRUQsNENBQTBDLElBQTFDLEVBQWdELG9DQUF3QixHQUF4RSxFQUE2RSxVQUE3RSxFQUF5RixXQUF6Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGlDQUFULENBQTJDLFVBQTNDLEVBQXVELGVBQXZELEVBQXdFLHVCQUF4RSxFQUFpRyxLQUFqRyxFQUF3RyxNQUF4RyxFQUFnSDtBQUM5RyxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsc0JBQTdCLEVBQXFELEdBQXJELEVBQTBELG9CQUExRCxFQUFnRixnQkFBaEYsRUFBa0csaUJBQWxHLEVBQXFILENBQXJIOztBQUVBLGdCQUF5QixVQUFVLEVBQW5DO0FBQ0EsZUFBeUIsU0FBVSx1QkFBVyxzQkFBOUM7QUFDQSwyQkFBeUIsd0JBQXdCLE9BQXhCLENBQWdDLGVBQWhDLE1BQXFELHFCQUFZLGNBQTFGO0FBQ0EsUUFBeUIsRUFBekI7O0FBR0EsTUFBSSwwQkFBMEIsZUFBZSxTQUE3QyxFQUF3RDtBQUN0RCxRQUFJLGVBQWUsSUFBZixJQUF1QixDQUFDLDJCQUFvQixPQUFwQixDQUE0QixVQUE1QixDQUE1QixFQUFxRTtBQUNuRSxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUyxVQURNO0FBRWYsaUJBQVMsNkJBQXFCLHFDQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQU1ELEtBUEQsTUFPTztBQUNMLHlCQUFtQixXQUFXLE1BQTlCOztBQUVBLFdBQUssSUFBSSxDQUFULEVBQVksSUFBSSxnQkFBaEIsRUFBa0MsS0FBSyxDQUF2QyxFQUEwQztBQUN4QywrQkFBdUIsV0FBVyxDQUFYLENBQXZCO0FBQ0EsNEJBQXVCLDJCQUFvQixnQkFBcEIsQ0FBcUMsVUFBckMsRUFBaUQsQ0FBakQsQ0FBdkI7O0FBRUEsWUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsb0JBQXZDLENBQUwsRUFBbUU7QUFDakUsc0JBQVksSUFBWixDQUFpQjtBQUNmLG1CQUFTLGlCQURNO0FBRWYscUJBQVMsNkJBQXFCLHNDQUZmO0FBR2YsbUJBQVMsd0JBQWdCO0FBSFYsV0FBakI7QUFLRCxTQU5ELE1BTU87QUFDTCxtQ0FBeUIsb0JBQXpCLEVBQStDLHVCQUFXLEVBQTFELEVBQThELGlCQUE5RCxFQUFpRixXQUFqRixFQUE4RixjQUFjLElBQTVHLEVBQWtILHdCQUFnQixjQUFsSTs7QUFFQSxjQUFJLElBQUksT0FBSixDQUFZLHFCQUFxQixFQUFqQyxNQUF5QyxxQkFBWSxjQUF6RCxFQUF5RTtBQUN2RSx3QkFBWSxJQUFaLENBQWlCO0FBQ2YscUJBQVMsMkJBQW9CLGNBQXBCLENBQW1DLGlCQUFuQyxFQUFzRCx1QkFBVyxFQUFqRSxDQURNO0FBRWYsdUJBQVMsNkJBQXFCLGlCQUZmO0FBR2YscUJBQVMsd0JBQWdCO0FBSFYsYUFBakI7QUFLRCxXQU5ELE1BTU87QUFDTCxnQkFBSSxJQUFKLENBQVMscUJBQXFCLEVBQTlCO0FBQ0Q7O0FBRUQsY0FBSSxxQkFBcUIsRUFBckIsSUFBMkIsMkJBQW9CLG1CQUFwQixDQUF3QyxJQUF4QyxDQUE2QyxxQkFBcUIsRUFBbEUsQ0FBL0IsRUFBc0c7QUFDcEcsd0JBQVksSUFBWixDQUFpQjtBQUNmLHFCQUFTLDJCQUFvQixjQUFwQixDQUFtQyxpQkFBbkMsRUFBc0QsdUJBQVcsRUFBakUsQ0FETTtBQUVmLHVCQUFTLDZCQUFxQixpQ0FGZjtBQUdmLHFCQUFTLHdCQUFnQjtBQUhWLGFBQWpCO0FBS0Q7O0FBRUQsOEJBQW9CLHFCQUFxQixXQUF6QyxFQUFzRCwyQkFBb0IsY0FBcEIsQ0FBbUMsaUJBQW5DLEVBQXNELHVCQUFXLFdBQWpFLENBQXRELEVBQXFJLFdBQXJJO0FBQ0Esb0RBQTBDLG9CQUExQyxFQUFnRSxvQ0FBd0IsZUFBeEYsRUFBeUcsaUJBQXpHLEVBQTRILFdBQTVIO0FBQ0Q7QUFDRjtBQUNGO0FBRUYsR0FoREQsTUFnRE8sSUFBSSxtQkFBbUIsVUFBdkIsRUFBbUM7QUFDeEMsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsVUFETTtBQUVmLGVBQVksNkJBQXFCLDhCQUFqQyxTQUFtRSxlQUZwRDtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHlCQUFULENBQW1DLFVBQW5DLEVBQStDLEtBQS9DLEVBQXNELE1BQXRELEVBQThEO0FBQzVELE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2Qiw0QkFBN0IsRUFBMkQsNkJBQTNELEVBQTBGLE9BQTFGLEVBQW1HLENBQW5HOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFhLFNBQVMsdUJBQVcsVUFBakM7QUFDQSxpQ0FBK0IsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLHlCQUExRCxDQUEvQjs7QUFFQSxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQUFMLEVBQXlEO0FBQ3ZELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsMkJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEOztBQUVELHNCQUFvQixXQUFXLElBQS9CLEVBQXFDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxJQUExRCxDQUFyQyxFQUFzRyxXQUF0RztBQUNBLHNCQUFvQixXQUFXLFdBQS9CLEVBQTRDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxXQUExRCxDQUE1QyxFQUFvSCxXQUFwSDs7QUFFQSx3QkFBc0IsVUFBdEIsRUFBa0MsdUJBQVcsSUFBN0MsRUFBbUQsVUFBbkQsRUFBK0QsV0FBL0QsRUFBNkUsY0FBYyxLQUEzRjtBQUNBLHdCQUFzQixVQUF0QixFQUFrQyx1QkFBVyxTQUE3QyxFQUF3RCxVQUF4RCxFQUFvRSxXQUFwRSxFQUFrRixjQUFjLEtBQWhHO0FBQ0EscUJBQW1CLFdBQVcsVUFBOUIsRUFBMEMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFVBQTFELENBQTFDLEVBQWlILFdBQWpIOztBQUVBLE1BQUksV0FBVyxlQUFYLEtBQStCLFNBQW5DLEVBQThDO0FBQzVDLFFBQUksV0FBVyxJQUFYLEtBQW9CLHFCQUFZLDJCQUFwQyxFQUFpRTtBQUMvRCxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLElBQTlELENBRE07QUFFZixpQkFBWSw2QkFBcUIsZ0NBQWpDLFVBQXNFLHFCQUFZLDJCQUFsRixNQUZlO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEOztBQUVELFFBQUksaURBQStCLE9BQS9CLENBQXVDLFdBQVcsZUFBbEQsTUFBdUUscUJBQVksY0FBdkYsRUFBdUc7QUFDckcsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxnQkFBOUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQiw0QkFGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGOztBQUVELE1BQUksV0FBVyx1QkFBWCxLQUF1QyxTQUEzQyxFQUFzRDtBQUNwRCxRQUFJLENBQUMsMkJBQW9CLE9BQXBCLENBQTRCLFdBQVcsdUJBQXZDLENBQUwsRUFBc0U7QUFDcEUsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsNEJBRE07QUFFZixpQkFBUyw2QkFBcUIsdUNBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0QsS0FORCxNQU1PO0FBQ0wsc0NBQWdDLFdBQVcsdUJBQVgsQ0FBbUMsTUFBbkU7O0FBRUEsV0FBSyxJQUFJLENBQVQsRUFBWSxJQUFJLDZCQUFoQixFQUErQyxLQUFLLENBQXBELEVBQXVEO0FBQ3JELGtCQUFVLFdBQVcsdUJBQVgsQ0FBbUMsQ0FBbkMsQ0FBVjs7QUFFQSxZQUFJLFlBQVksSUFBWixJQUFvQixZQUFZLFNBQWhDLElBQTZDLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLE9BQTdCLENBQWxELEVBQXlGO0FBQ3ZGLHNCQUFZLElBQVosQ0FBaUI7QUFDZixtQkFBUywyQkFBb0IsZ0JBQXBCLENBQXFDLDRCQUFyQyxFQUFtRSxDQUFuRSxDQURNO0FBRWYscUJBQVMsNkJBQXFCLHlDQUZmO0FBR2YsbUJBQVMsd0JBQWdCO0FBSFYsV0FBakI7QUFLRDtBQUNGO0FBQ0Y7QUFDRjs7QUFFRCxvQ0FDRSxXQUFXLE9BRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLE1BQVosRUFBb0IsdUJBQVcsVUFBL0IsQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxPQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLEtBRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLE1BQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxLQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLE1BRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLFFBQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLE1BRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLFFBQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLEtBRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLFdBQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxLQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSw0Q0FBMEMsVUFBMUMsRUFBc0Qsb0NBQXdCLG1CQUE5RSxFQUFtRyxVQUFuRyxFQUErRyxXQUEvRztBQUNBLFNBQU8sV0FBUDtBQUNIOztBQUVELFNBQVMsZ0JBQVQsQ0FBMEIsUUFBMUIsRUFBb0MsS0FBcEMsRUFBMkMsTUFBM0MsRUFBbUQ7QUFDakQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsUUFBbkM7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsUUFBdkMsQ0FBTCxFQUF1RDtBQUNyRCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQiwyQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsd0JBQXNCLFFBQXRCLEVBQWdDLHVCQUFXLEVBQTNDLEVBQStDLFVBQS9DLEVBQTJELFdBQTNELEVBQXlFLGNBQWMsSUFBdkY7O0FBRUEsTUFBSSxTQUFTLFVBQVQsS0FBd0IsU0FBNUIsRUFBdUM7QUFDckMsOEJBQ0UsU0FBUyxVQURYLEVBRUUsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFVBQTFELENBRkYsRUFHRSxXQUhGO0FBS0Q7O0FBRUQsNENBQTBDLFFBQTFDLEVBQW9ELG9DQUF3QixRQUE1RSxFQUFzRixVQUF0RixFQUFrRyxXQUFsRzs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLG9CQUFULENBQThCLFlBQTlCLEVBQTRDLEtBQTVDLEVBQW1ELE1BQW5ELEVBQTJEO0FBQ3pELE1BQUksV0FBSixFQUFpQixVQUFqQjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLGFBQW5DOztBQUVBLE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLFlBQXZDLENBQUwsRUFBMkQ7QUFDekQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsMENBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0EsV0FBTyxXQUFQO0FBQ0Q7O0FBR0QsTUFBSSxhQUFhLFVBQWIsS0FBNEIsd0JBQVksYUFBNUMsRUFBMkQ7QUFDekQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFdBQTFELENBRE07QUFFZixlQUFTLDZCQUFxQixpQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxNQUFJLENBQUMsYUFBYSxFQUFkLElBQW9CLENBQUMsMkJBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQThCLGFBQWEsRUFBM0MsQ0FBekIsRUFBeUU7QUFDdkUsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLEVBQTFELENBRE07QUFFZixlQUFTLDZCQUFxQix5QkFGZjtBQUdmLGFBQVEsd0JBQWdCO0FBSFQsS0FBakI7QUFLRDs7QUFFRCw0Q0FBMEMsWUFBMUMsRUFBd0Qsb0NBQXdCLGFBQWhGLEVBQStGLFVBQS9GLEVBQTJHLFdBQTNHOztBQUVBLFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsYUFBVCxDQUF1QixLQUF2QixFQUE4QixLQUE5QixFQUFxQyxNQUFyQyxFQUE2QztBQUMzQyxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSx1QkFBVyxLQUFuQzs7QUFFQSxNQUFJLFVBQVUsU0FBZCxFQUF5QjtBQUNyQixXQUFPLFdBQVA7QUFDSDs7QUFFRCwyQkFBeUIsS0FBekIsRUFBZ0MsdUJBQVcsTUFBM0MsRUFBbUQsVUFBbkQsRUFBK0QsV0FBL0QsRUFBNkUsY0FBYyxLQUEzRjs7QUFFQSxNQUFJLE1BQU0sTUFBTixLQUFpQixTQUFyQixFQUFnQztBQUM5QixRQUFJLE1BQU0sTUFBTixHQUFlLHFCQUFZLGdCQUEzQixJQUErQyxNQUFNLE1BQU4sR0FBZSxxQkFBWSxnQkFBOUUsRUFBZ0c7QUFDOUYsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE1BQTFELENBRE07QUFFZixpQkFBUyw2QkFBcUIsMEJBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRjs7QUFFRCxNQUFJLE1BQU0sR0FBTixLQUFjLFNBQWxCLEVBQTZCO0FBQzNCLDZCQUF5QixLQUF6QixFQUFnQyx1QkFBVyxHQUEzQyxFQUFnRCxVQUFoRCxFQUE0RCxXQUE1RCxFQUEwRSxjQUFjLEtBQXhGOztBQUVFLFFBQUksTUFBTSxHQUFOLEtBQWMsU0FBZCxJQUEyQixNQUFNLEdBQU4sR0FBWSxNQUFNLEdBQWpELEVBQXNEO0FBQ3BELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxHQUExRCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDRCQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEOztBQUVELFFBQUksTUFBTSxHQUFOLEtBQWMsU0FBZCxJQUEyQixNQUFNLEdBQU4sR0FBWSxNQUFNLEdBQWpELEVBQXNEO0FBQ3BELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxHQUExRCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDRCQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0o7O0FBRUQsTUFBSSxNQUFNLEdBQU4sS0FBYyxTQUFsQixFQUE2QjtBQUMzQiw2QkFBeUIsS0FBekIsRUFBZ0MsdUJBQVcsR0FBM0MsRUFBZ0QsVUFBaEQsRUFBNEQsV0FBNUQsRUFBMEUsY0FBYyxLQUF4Rjs7QUFFQSxRQUFJLE1BQU0sR0FBTixLQUFjLFNBQWQsSUFBMkIsTUFBTSxHQUFOLEdBQVksTUFBTSxHQUFqRCxFQUFzRDtBQUNwRCxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsR0FBMUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQix5QkFGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGOztBQUVELDJCQUF5QixLQUF6QixFQUFnQyx1QkFBVyxHQUEzQyxFQUFnRCxVQUFoRCxFQUE0RCxXQUE1RCxFQUEwRSxjQUFjLEtBQXhGO0FBQ0EsNENBQTBDLEtBQTFDLEVBQWlELG9DQUF3QixLQUF6RSxFQUFnRixVQUFoRixFQUE0RixXQUE1Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsTUFBeEIsRUFBZ0MsS0FBaEMsRUFBdUMsTUFBdkMsRUFBK0M7QUFDN0MsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsTUFBbkM7O0FBRUEsTUFBSSxXQUFXLFNBQWYsRUFBMEI7QUFBQyxXQUFPLFdBQVA7QUFBb0I7O0FBRS9DLE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLE1BQXZDLENBQUwsRUFBcUQ7QUFDbkQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLENBRE07QUFFZixlQUFTLDZCQUFxQix5QkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsZ0JBQWMsT0FBTyxLQUFyQixFQUE0QiwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsS0FBMUQsQ0FBNUIsRUFBOEYsV0FBOUY7QUFDQSw0QkFBMEIsTUFBMUIsRUFBa0MsdUJBQVcsT0FBN0MsRUFBc0QsVUFBdEQsRUFBa0UsV0FBbEUsRUFBZ0YsY0FBYyxLQUE5RjtBQUNBLDRCQUEwQixNQUExQixFQUFrQyx1QkFBVyxVQUE3QyxFQUF5RCxVQUF6RCxFQUFxRSxXQUFyRSxFQUFtRixjQUFjLEtBQWpHO0FBQ0EsMkJBQXlCLE1BQXpCLEVBQWlDLHVCQUFXLFFBQTVDLEVBQXNELFVBQXRELEVBQWtFLFdBQWxFLEVBQWdGLGNBQWMsS0FBOUY7QUFDQSxxQkFBbUIsT0FBTyxVQUExQixFQUFzQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsVUFBMUQsQ0FBdEMsRUFBNkcsV0FBN0c7O0FBRUEsTUFBSSxPQUFPLFFBQVAsS0FBb0IsU0FBcEIsS0FBa0MsT0FBTyxRQUFQLEtBQW9CLElBQXBCLElBQTRCLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLE9BQU8sUUFBcEMsQ0FBN0IsSUFBOEUsQ0FBQywyQkFBb0IsaUJBQXBCLENBQXNDLElBQXRDLENBQTJDLE9BQU8sUUFBbEQsQ0FBakgsQ0FBSixFQUFtTDtBQUNqTCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsUUFBMUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELDRDQUEwQyxNQUExQyxFQUFrRCxvQ0FBd0IsTUFBMUUsRUFBa0YsVUFBbEYsRUFBOEYsV0FBOUY7O0FBRUEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUywrQkFBVCxDQUF5QyxNQUF6QyxFQUFpRCxZQUFqRCxFQUErRCxLQUEvRCxFQUFzRSxNQUF0RSxFQUE4RTtBQUM1RSxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsT0FBN0IsRUFBc0MsUUFBdEM7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSx1QkFBVyxTQUFuQztBQUNBLGFBQWMsT0FBTyxZQUFQLENBQWQ7O0FBRUEsTUFBSSxhQUFhLFNBQWpCLEVBQTRCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVqRCxNQUFJLGFBQWEsSUFBYixJQUFxQixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixRQUE3QixDQUExQixFQUFrRTtBQUNoRSxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFZLFlBQVosU0FBNEIsNkJBQXFCLGNBRmxDO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxZQUFVLDJCQUFvQixrQkFBcEIsQ0FBdUMsSUFBdkMsQ0FBNEMsUUFBNUMsQ0FBVjs7QUFFQSxNQUFJLE9BQUosRUFBYTtBQUNYLFFBQUksQ0FBQyw0QkFBNEIsT0FBNUIsQ0FBTCxFQUEyQztBQUN6QyxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixpQkFBUyw2QkFBcUIsb0NBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRixHQVJELE1BUU87QUFDTCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFTLDZCQUFxQixrQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGVBQVQsQ0FBeUIsT0FBekIsRUFBa0MsS0FBbEMsRUFBeUMsTUFBekMsRUFBaUQ7QUFDL0MsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsT0FBbkM7O0FBRUEsTUFBSSxZQUFZLFNBQWhCLEVBQTJCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVoRCxNQUFJLFlBQVksSUFBWixJQUFvQixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixPQUE3QixDQUFyQixJQUE4RCxDQUFDLDJCQUFvQixnQkFBcEIsQ0FBcUMsSUFBckMsQ0FBMEMsT0FBMUMsQ0FBbkUsRUFBdUg7QUFDckgsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsdUNBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7O0FBRUQsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyx3QkFBVCxDQUFrQyxVQUFsQyxFQUE4QyxLQUE5QyxFQUFxRCxNQUFyRCxFQUE2RDtBQUMzRCxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBUyx1QkFBVyxVQUFsQzs7QUFFQSxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQUFMLEVBQXlEO0FBQ3ZELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHdDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxNQUFJLFdBQVcsT0FBWCxLQUF1QixTQUEzQixFQUFzQztBQUNwQyxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLE9BQTlELENBRE07QUFFZixlQUFTLDZCQUFxQiwwQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFNRCxHQVBELE1BT087QUFDTCx3QkFBb0IsV0FBVyxPQUEvQixFQUF3QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsT0FBMUQsQ0FBeEMsRUFBNEcsV0FBNUc7QUFDRDs7QUFFRCxzQkFBb0IsV0FBVyxXQUEvQixFQUE0QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsV0FBMUQsQ0FBNUMsRUFBb0gsV0FBcEg7QUFDQSx3QkFBc0IsVUFBdEIsRUFBa0MsdUJBQVcsVUFBN0MsRUFBeUQsVUFBekQsRUFBcUUsV0FBckUsRUFBa0YsY0FBYyxJQUFoRyxFQUFzRyx3QkFBZ0IsY0FBdEg7QUFDQSx3QkFBc0IsVUFBdEIsRUFBa0MsdUJBQVcsUUFBN0MsRUFBdUQsVUFBdkQsRUFBbUUsV0FBbkUsRUFBaUYsY0FBYyxLQUEvRixFQUFzRyx3QkFBZ0IsY0FBdEg7O0FBRUE7QUFDQSwyQkFBeUIsVUFBekIsRUFBcUMsdUJBQVcsWUFBaEQsRUFBOEQsVUFBOUQsRUFBMEUsV0FBMUUsRUFBdUYsY0FBYyxJQUFyRyxFQUEyRyx3QkFBZ0IsY0FBM0g7O0FBRUEsTUFBSSxXQUFXLE1BQVgsS0FBc0IsU0FBdEIsSUFBbUMsV0FBVyxNQUFYLEtBQXNCLElBQXpELElBQWlFLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFdBQVcsTUFBeEMsQ0FBbEUsSUFBc0gsV0FBVyxNQUFYLEdBQW9CLENBQXBCLEtBQTBCLENBQXBKLEVBQXdKO0FBQ3RKLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsTUFBOUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELE1BQUksV0FBVyxJQUFYLEtBQW9CLFNBQXhCLEVBQW1DO0FBQ2pDLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsSUFBOUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLDJDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtELEdBTkQsTUFNTyxJQUFJLFdBQVcsSUFBWCxLQUFvQixJQUFwQixJQUE0QixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixXQUFXLElBQXhDLENBQTdCLElBQThFLENBQUMsMkJBQW9CLE9BQXBCLENBQTRCLElBQTVCLENBQWlDLFdBQVcsSUFBNUMsQ0FBbkYsRUFBc0k7QUFDM0ksZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxJQUE5RCxDQURNO0FBRWYsZUFBUyw2QkFBcUIsZ0NBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7O0FBRUQsNENBQTBDLFVBQTFDLEVBQXNELG9DQUF3QixVQUE5RSxFQUEwRixVQUExRixFQUFzRyxXQUF0RztBQUNBLFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsbUJBQVQsQ0FBNkIsV0FBN0IsRUFBMEMsS0FBMUMsRUFBaUQsTUFBakQsRUFBeUQ7QUFDdkQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCLEVBQTZCLGlCQUE3QixFQUFnRCxDQUFoRDs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLFdBQW5DOztBQUVBLE1BQUksZ0JBQWdCLFNBQXBCLEVBQStCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVwRCxNQUFJLGdCQUFnQixJQUFoQixJQUF3QixDQUFDLDJCQUFvQixPQUFwQixDQUE0QixXQUE1QixDQUE3QixFQUF1RTtBQUNyRSxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixrQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsc0JBQW9CLFlBQVksTUFBaEM7QUFDQSxPQUFLLElBQUksQ0FBVCxFQUFZLElBQUksaUJBQWhCLEVBQW1DLEtBQUssQ0FBeEMsRUFBMkM7QUFDekMsNkJBQXlCLFlBQVksQ0FBWixDQUF6QixFQUF5QywyQkFBb0IsZ0JBQXBCLENBQXFDLFVBQXJDLEVBQWlELENBQWpELENBQXpDLEVBQThGLFdBQTlGO0FBQ0Q7O0FBRUQsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCLEtBQTlCLEVBQXFDLE1BQXJDLEVBQTZDO0FBQzNDLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixRQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLEtBQW5DOztBQUVBLE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLEtBQXZDLENBQUwsRUFBb0Q7QUFDbEQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsaUNBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0EsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsYUFBVyxZQUFZLEtBQVosQ0FBWDs7QUFFQSxNQUFJLGFBQWEscUJBQVksaUNBQTdCLEVBQWdFO0FBQzlELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELE1BQUksTUFBTSxVQUFOLEtBQXFCLHdCQUFZLEtBQXJDLEVBQTRDO0FBQzFDLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHlDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELHdCQUFzQixLQUF0QixFQUE2QixVQUE3QixFQUF5QyxXQUF6QztBQUNBLDJCQUF5QixLQUF6QixFQUFnQyx1QkFBVyxJQUEzQyxFQUFpRCxVQUFqRCxFQUE2RCxXQUE3RCxFQUEyRSxjQUFjLEtBQXpGOztBQUVBLDRDQUEwQyxLQUExQyxFQUFpRCxvQ0FBd0IsS0FBekUsRUFBZ0YsVUFBaEYsRUFBNEYsV0FBNUY7O0FBRUEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCLEtBQTlCLEVBQXFDLE1BQXJDLEVBQTZDO0FBQzNDLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixXQUE3QixFQUEwQyxRQUExQyxFQUFvRCxVQUFwRCxFQUFnRSxDQUFoRTs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLEtBQW5DO0FBQ0EsZ0JBQWMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE1BQTFELENBQWQ7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsS0FBdkMsQ0FBTCxFQUFvRDtBQUNsRCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixpQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsYUFBVyxZQUFZLEtBQVosQ0FBWDs7QUFFQSxNQUFJLGFBQWEsQ0FBakIsRUFBb0I7QUFDbEIsUUFBSSxNQUFNLE1BQU4sS0FBaUIsSUFBakIsSUFBeUIsTUFBTSxNQUFOLEtBQWlCLFNBQTlDLEVBQXlEO0FBQ3ZELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLFdBRE07QUFFZixpQkFBUyw2QkFBcUIsNENBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRixHQVJELE1BUU8sSUFBSSxXQUFXLHFCQUFZLGlDQUEzQixFQUE4RDtBQUNuRSxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixzQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCx3QkFBc0IsS0FBdEIsRUFBNkIsVUFBN0IsRUFBeUMsV0FBekM7O0FBRUEsMkJBQXlCLEtBQXpCLEVBQWdDLHVCQUFXLElBQTNDLEVBQWlELFVBQWpELEVBQTZELFdBQTdELEVBQTJFLGNBQWMsS0FBekY7O0FBRUEsTUFBSSxNQUFNLE1BQU4sS0FBaUIsU0FBckIsRUFBZ0M7QUFDOUIsUUFBSSxNQUFNLE1BQU4sS0FBaUIsSUFBakIsSUFBeUIsQ0FBQywyQkFBb0IsT0FBcEIsQ0FBNEIsTUFBTSxNQUFsQyxDQUE5QixFQUF5RTtBQUN2RSxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLE1BQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsMEJBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0QsS0FORCxNQU1PO0FBQ0wsbUJBQWEsTUFBTSxNQUFOLENBQWEsTUFBMUI7O0FBRUEsV0FBSyxJQUFJLENBQVQsRUFBWSxJQUFJLFVBQWhCLEVBQTRCLEtBQUssQ0FBakMsRUFBb0M7QUFDbEMsc0JBQWMsTUFBTSxNQUFOLENBQWEsQ0FBYixDQUFkLEVBQStCLDJCQUFvQixnQkFBcEIsQ0FBcUMsV0FBckMsRUFBa0QsQ0FBbEQsQ0FBL0IsRUFBcUYsV0FBckY7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsNENBQTBDLEtBQTFDLEVBQWlELG9DQUF3QixLQUF6RSxFQUFnRixVQUFoRixFQUE0RixXQUE1Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGFBQVQsQ0FBdUIsS0FBdkIsRUFBOEIsS0FBOUIsRUFBcUMsTUFBckMsRUFBNkM7QUFDM0MsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsS0FBbkM7O0FBRUEsTUFBSSxVQUFVLElBQVYsSUFBa0IsVUFBVSxTQUFoQyxFQUEyQztBQUN6QyxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixzQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsTUFBSSwyQkFBb0IsT0FBcEIsQ0FBNEIsS0FBNUIsQ0FBSixFQUF3QztBQUN0QyxrQkFBYyxLQUFkLEVBQXFCLFVBQXJCLEVBQWlDLFdBQWpDO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsa0JBQWMsS0FBZCxFQUFxQixVQUFyQixFQUFpQyxXQUFqQztBQUNEOztBQUVELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsaUJBQVQsQ0FBMkIsU0FBM0IsRUFBc0MsS0FBdEMsRUFBNkMsTUFBN0MsRUFBcUQ7QUFDbkQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsU0FBbkM7O0FBRUEsTUFBSSxjQUFjLFNBQWxCLEVBQTZCO0FBQzNCLFdBQU8sV0FBUDtBQUNEOztBQUVELE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLFNBQXZDLENBQUwsRUFBd0Q7QUFDdEQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIscUNBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEO0FBQ0QsTUFBSSwyQkFBb0IsT0FBcEIsQ0FBNEIsU0FBNUIsQ0FBSixFQUE0QztBQUMxQyxrQkFBYyxTQUFkLEVBQXlCLFVBQXpCLEVBQXFDLFdBQXJDO0FBQ0EsUUFBSSxDQUFDLFVBQVUsTUFBWCxJQUFxQixDQUFDLFVBQVUsTUFBVixDQUFpQixNQUF2QyxJQUFpRCxVQUFVLE1BQVYsQ0FBaUIsTUFBakIsS0FBNEIscUJBQVksNkJBQTdGLEVBQTRIO0FBQzFILGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsTUFBOUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQix5Q0FGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGLEdBVEQsTUFTTztBQUNMLGtCQUFjLFNBQWQsRUFBeUIsVUFBekIsRUFBcUMsV0FBckM7QUFDRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGlDQUFULENBQTJDLFVBQTNDLEVBQXVELEtBQXZELEVBQThELE1BQTlELEVBQXNFO0FBQ3BFLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixhQUE3QixFQUE0QyxDQUE1Qzs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLFdBQW5DOztBQUVBLE1BQUksZUFBZSxTQUFuQixFQUE4QjtBQUFDLFdBQU8sV0FBUDtBQUFvQjs7QUFFbkQsTUFBSSxlQUFlLElBQW5CLEVBQXlCO0FBQ3ZCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLG1DQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtELEdBTkQsTUFNTyxJQUFJLDJCQUFvQixPQUFwQixDQUE0QixVQUE1QixDQUFKLEVBQTZDO0FBQ2hELG9CQUFnQixXQUFXLE1BQTNCO0FBQ0EsU0FBSyxJQUFJLENBQVQsRUFBWSxJQUFJLGFBQWhCLEVBQStCLEtBQUssQ0FBcEMsRUFBdUM7QUFDckMsdUJBQWlCLFdBQVcsQ0FBWCxDQUFqQixFQUFnQywyQkFBb0IsZ0JBQXBCLENBQXFDLFVBQXJDLEVBQWlELENBQWpELENBQWhDLEVBQXFGLFdBQXJGO0FBQ0Q7QUFDSixHQUxNLE1BS0EsSUFBSSwyQkFBb0IsUUFBcEIsQ0FBNkIsVUFBN0IsQ0FBSixFQUE4QztBQUNuRCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixxQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEscUJBQWlCLFVBQWpCLEVBQTZCLFVBQTdCLEVBQXlDLFdBQXpDO0FBQ0QsR0FSTSxNQVFBO0FBQ0wsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsZ0RBRmY7QUFHZixhQUFTLHdCQUFnQixjQUhWLEVBQWpCO0FBSUQ7QUFDRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHlCQUFULENBQW1DLGlCQUFuQyxFQUFzRCxLQUF0RCxFQUE2RCxNQUE3RCxFQUFxRTtBQUNuRSxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSx1QkFBVyxrQkFBbkM7O0FBRUEsTUFBSSxzQkFBc0IsU0FBMUIsRUFBcUM7QUFDbkMsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsaUJBQXZDLENBQUwsRUFBZ0U7QUFDOUQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsOENBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0EsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsb0NBQWtDLGtCQUFrQixNQUFwRCxFQUE0RCwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsTUFBMUQsQ0FBNUQsRUFBK0gsV0FBL0g7QUFDQSxvQ0FBa0Msa0JBQWtCLFFBQXBELEVBQThELDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxRQUExRCxDQUE5RCxFQUFtSSxXQUFuSTtBQUNBLG9DQUFrQyxrQkFBa0IsUUFBcEQsRUFBOEQsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFFBQTFELENBQTlELEVBQW1JLFdBQW5JO0FBQ0Esb0NBQWtDLGtCQUFrQixLQUFwRCxFQUEyRCwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsS0FBMUQsQ0FBM0QsRUFBNkgsV0FBN0g7O0FBRUEsNENBQTBDLGlCQUExQyxFQUE2RCxvQ0FBd0Isa0JBQXJGLEVBQXlHLFVBQXpHLEVBQXFILFdBQXJIOztBQUVBLFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsZUFBVCxDQUF5QixPQUF6QixFQUFrQyxLQUFsQyxFQUF5QyxNQUF6QyxFQUFpRCx5QkFBakQsRUFBNEU7QUFDMUUsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFhLFNBQVMsdUJBQVcsT0FBakM7O0FBRUEsTUFBSSxZQUFZLFNBQWhCLEVBQTJCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVoRCxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxPQUF2QyxDQUFMLEVBQXNEO0FBQ3BELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLFVBRE07QUFFZixlQUFTLDZCQUFxQixrQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsTUFBSSxRQUFRLFlBQVIsS0FBeUIsU0FBekIsS0FBdUMsUUFBUSxZQUFSLEtBQXlCLElBQXpCLElBQWlDLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFFBQVEsWUFBckMsQ0FBbEMsSUFBd0YsQ0FBQywyQkFBb0IsSUFBcEIsQ0FBeUIsSUFBekIsQ0FBOEIsUUFBUSxZQUF0QyxDQUFoSSxDQUFKLEVBQTBMO0FBQ3hMLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsWUFBOUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLGdDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELE1BQUksQ0FBQyx3QkFBWSxLQUFiLEVBQW9CLHdCQUFZLEtBQWhDLEVBQXVDLE9BQXZDLENBQStDLHlCQUEvQyxNQUE4RSxxQkFBWSxjQUE5RixFQUE4RztBQUM1RyxRQUFJLFFBQVEsUUFBUixLQUFxQixTQUF6QixFQUFvQztBQUNsQyxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLFFBQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsK0JBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7O0FBRUQsUUFBSSxRQUFRLFFBQVIsS0FBcUIsU0FBekIsRUFBb0M7QUFDbEMsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxRQUE5RCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLHNEQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0Y7O0FBRUQsMkJBQXlCLE9BQXpCLEVBQWtDLHVCQUFXLFFBQTdDLEVBQXVELFVBQXZELEVBQW1FLFdBQW5FLEVBQWdGLGNBQWMsS0FBOUYsRUFBcUcsd0JBQWdCLGNBQXJIO0FBQ0EsMkJBQXlCLE9BQXpCLEVBQWtDLHVCQUFXLFFBQTdDLEVBQXVELFVBQXZELEVBQW1FLFdBQW5FLEVBQWdGLGNBQWMsS0FBOUYsRUFBcUcsd0JBQWdCLGNBQXJIOztBQUVBLE1BQUksUUFBUSxJQUFSLEtBQWlCLFNBQXJCLEVBQWdDO0FBQzVCLGtCQUFjLFFBQVEsSUFBdEIsRUFBNEIsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLElBQTFELENBQTVCLEVBQTZGLFdBQTdGO0FBQ0g7O0FBRUQsTUFBSSxRQUFRLGlCQUFSLEtBQThCLFNBQWxDLEVBQTZDO0FBQzNDLDhCQUEwQixRQUFRLGlCQUFsQyxFQUFxRCwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsa0JBQTFELENBQXJELEVBQW9JLFdBQXBJO0FBQ0Q7O0FBRUQsTUFBSSxRQUFRLFFBQVIsS0FBcUIsU0FBckIsSUFBa0MsQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLFFBQVEsUUFBL0MsQ0FBdkMsRUFBaUc7QUFDL0YsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxRQUE5RCxDQURNO0FBRWYsZUFBUyw2QkFBcUIsdUJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7O0FBRUQsTUFBSSxRQUFRLFNBQVIsS0FBc0IsU0FBMUIsRUFBcUM7QUFDbkMseUJBQXFCLFFBQVEsU0FBN0IsRUFBd0MsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFNBQTFELENBQXhDLEVBQThHLFdBQTlHO0FBQ0Q7O0FBRUQsTUFBSSxRQUFRLFVBQVIsS0FBdUIsU0FBM0IsRUFBc0M7QUFDcEMsUUFBSSwyQkFBb0IsT0FBcEIsQ0FBNEIsUUFBUSxVQUFwQyxDQUFKLEVBQXFEO0FBQ25ELG9CQUFjLFFBQVEsVUFBdEIsRUFBa0MsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFVBQTFELENBQWxDLEVBQXlHLFdBQXpHO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsb0JBQWMsUUFBUSxVQUF0QixFQUFrQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsVUFBMUQsQ0FBbEMsRUFBeUcsV0FBekc7QUFDRDtBQUNGOztBQUVELHFCQUFtQixRQUFRLFVBQTNCLEVBQXVDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxVQUExRCxDQUF2QyxFQUE4RyxXQUE5RztBQUNBLDRDQUNFLE9BREYsRUFFRSxDQUNFLHVCQUFXLFlBRGIsRUFFRSx1QkFBVyxVQUZiLEVBR0UsdUJBQVcsSUFIYixFQUlFLHVCQUFXLGtCQUpiLEVBS0UsdUJBQVcsUUFMYixFQU1FLHVCQUFXLFFBTmIsRUFPRSx1QkFBVyxRQVBiLEVBUUUsdUJBQVcsU0FSYixFQVNFLHVCQUFXLFVBVGIsQ0FGRixFQWFFLFVBYkYsRUFjRSxXQWRGOztBQWlCQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsTUFBeEIsRUFBZ0MsS0FBaEMsRUFBdUMsTUFBdkMsRUFBK0Msb0JBQS9DLEVBQXFFO0FBQ25FLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixVQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLE1BQW5DOztBQUVBLE1BQUksV0FBVyxTQUFmLEVBQTBCO0FBQ3hCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxNQUF2QyxDQUFMLEVBQXFEO0FBQ25ELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLGtDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCwyQkFBeUIsTUFBekIsRUFBaUMsdUJBQVcsV0FBNUMsRUFBeUQsVUFBekQsRUFBcUUsV0FBckUsRUFBa0YsY0FBYyxJQUFoRyxFQUFzRyx3QkFBZ0IsZ0JBQXRIO0FBQ0EsZUFBYSxPQUFPLFVBQVAsSUFBcUIsd0JBQVksUUFBOUM7O0FBRUE7QUFDQSxNQUFJLGVBQWUsd0JBQVksUUFBL0IsRUFBeUM7QUFDdkMscUJBQWlCLE1BQWpCLEVBQXlCLFVBQXpCLEVBQXFDLFdBQXJDO0FBQ0QsR0FGRCxNQUVPLElBQUksZUFBZSx3QkFBWSxLQUEvQixFQUFzQztBQUMzQyxrQkFBYyxNQUFkLEVBQXNCLFVBQXRCLEVBQWtDLFdBQWxDO0FBQ0QsR0FGTSxNQUVBLElBQUksZUFBZSx3QkFBWSxLQUEvQixFQUFzQztBQUMzQyxrQkFBYyxNQUFkLEVBQXNCLFVBQXRCLEVBQWtDLFdBQWxDO0FBQ0QsR0FGTSxNQUVBLElBQUksZUFBZSx3QkFBWSxhQUEvQixFQUE4QztBQUNuRCx5QkFBcUIsTUFBckIsRUFBNkIsVUFBN0IsRUFBeUMsV0FBekM7QUFDRCxHQUZNLE1BRUEsSUFBSSxlQUFlLHdCQUFZLGFBQS9CLEVBQThDO0FBQ25ELFFBQUksb0JBQUosRUFBMEI7QUFDeEIsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxXQUE5RCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDRDQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEOztBQUVELHNCQUFrQixNQUFsQixFQUEwQixVQUExQixFQUFzQyxXQUF0QyxFQUFvRCxrQkFBa0IsSUFBdEU7QUFDRCxHQVZNLE1BVUE7QUFDTCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLFdBQTlELENBRE07QUFFZixlQUFZLDZCQUFxQixnQ0FBakMsU0FBcUUsaUNBQXFCLFFBQXJCLEVBRnREO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEO0FBQ0QsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxpQkFBVCxDQUEyQixTQUEzQixFQUFzQyxLQUF0QyxFQUE2QyxNQUE3QyxFQUFxRCxjQUFyRCxFQUFxRTtBQUNuRSxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIseUJBQTdCLEVBQXdELHFCQUF4RDs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLFNBQW5DOztBQUVBLDBCQUF3QixvQ0FBd0IsU0FBaEQ7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsU0FBdkMsQ0FBTCxFQUF3RDtBQUN0RCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQiwwQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDLGNBQUwsRUFBcUI7QUFDbkIsUUFBSSxVQUFVLEVBQVYsS0FBaUIsSUFBakIsSUFBeUIsVUFBVSxFQUFWLEtBQWlCLFNBQTFDLElBQXVELENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFVBQVUsRUFBdkMsQ0FBNUQsRUFBd0c7QUFDdEcsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxFQUE5RCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDhCQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtELEtBTkQsTUFNTyxJQUFJLENBQUMsMkJBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQThCLFVBQVUsRUFBeEMsQ0FBTCxFQUFrRDtBQUN2RCxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLEVBQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsZ0JBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRixHQWRELE1BY087QUFDTCw0QkFBd0Isb0NBQXdCLGFBQWhEO0FBQ0Q7O0FBRUQsZ0JBQWMsVUFBVSxLQUF4QixFQUErQiwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsS0FBMUQsQ0FBL0IsRUFBaUcsV0FBakc7QUFDQSxlQUFhLFVBQVUsSUFBdkIsRUFBNkIsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLElBQTFELENBQTdCLEVBQThGLFdBQTlGO0FBQ0EsaUJBQWUsVUFBVSxNQUF6QixFQUFpQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsTUFBMUQsQ0FBakMsRUFBb0csV0FBcEcsRUFBaUgsY0FBakg7QUFDQSxpQkFBZSxVQUFVLE1BQXpCLEVBQWlDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUFqQyxFQUFvRyxXQUFwRzs7QUFFQSw4QkFBNEIsVUFBVSxNQUFWLElBQW9CLFVBQVUsTUFBVixDQUFpQixVQUFyQyxHQUFrRCxVQUFVLE1BQVYsQ0FBaUIsVUFBbkUsR0FBZ0Ysd0JBQVksUUFBeEg7O0FBRUEsa0JBQWdCLFVBQVUsT0FBMUIsRUFBbUMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE9BQTFELENBQW5DLEVBQXVHLFdBQXZHLEVBQW9ILHlCQUFwSDtBQUNBLGtDQUFnQyxTQUFoQyxFQUEyQyx1QkFBVyxTQUF0RCxFQUFpRSxVQUFqRSxFQUE2RSxXQUE3RTtBQUNBLGtDQUFnQyxTQUFoQyxFQUEyQyx1QkFBVyxNQUF0RCxFQUE4RCxVQUE5RCxFQUEwRSxXQUExRTs7QUFFQSxvQkFBa0IsVUFBVSxTQUE1QixFQUF1QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsU0FBMUQsQ0FBdkMsRUFBNkcsV0FBN0c7QUFDQSxrQkFBZ0IsVUFBVSxPQUExQixFQUFtQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsT0FBMUQsQ0FBbkMsRUFBdUcsV0FBdkc7QUFDQSxzQkFBb0IsVUFBVSxXQUE5QixFQUEyQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsV0FBMUQsQ0FBM0MsRUFBbUgsV0FBbkg7O0FBRUEsNENBQTBDLFNBQTFDLEVBQXFELHFCQUFyRCxFQUE0RSxVQUE1RSxFQUF3RixXQUF4Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLG1CQUFULENBQTZCLFNBQTdCLEVBQXdDO0FBQ3RDLE1BQUksV0FBSjs7QUFFQSxnQkFBYyxFQUFkO0FBQ0Esb0JBQWtCLFNBQWxCLEVBQTZCLHVCQUFXLFNBQXhDLEVBQW1ELFdBQW5ELEVBQWlFLGNBQWMsS0FBL0U7O0FBRUEsU0FBTyxhQUFhLFNBQWIsRUFBd0IsV0FBeEIsQ0FBUDtBQUNEOztBQUVELFNBQVMsOEJBQVQsQ0FBd0MsU0FBeEMsRUFBbUQ7QUFDakQsTUFBSSxlQUFKOztBQUVBLE1BQUksY0FBYyxTQUFsQixFQUE2QjtBQUMzQixXQUFPLHlCQUF3QixZQUFZLElBQXBDLEVBQTBDO0FBQy9DLGFBQVMsdUJBQVcsU0FEMkI7QUFFL0MsZUFBUyw2QkFBcUIsbUNBRmlCO0FBRy9DLGFBQVMsd0JBQWdCO0FBSHNCLEtBQTFDLENBQVA7QUFLRDs7QUFFRCxNQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDdEIsV0FBTyx5QkFBd0IsWUFBWSxJQUFwQyxFQUEwQztBQUMvQyxhQUFTLHVCQUFXLFNBRDJCO0FBRS9DLGVBQVMsNkJBQXFCLDBCQUZpQjtBQUcvQyxhQUFTLHdCQUFnQjtBQUhzQixLQUExQyxDQUFQO0FBS0Q7O0FBRUQsTUFBSSwyQkFBb0IsUUFBcEIsQ0FBNkIsU0FBN0IsQ0FBSixFQUE2QztBQUMzQyxRQUFJO0FBQ0Ysd0JBQWtCLEtBQUssS0FBTCxDQUFXLFNBQVgsQ0FBbEI7QUFDQSxVQUFJLG9CQUFvQixJQUFwQixJQUE0QixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixlQUE3QixDQUE3QixJQUE4RSwyQkFBb0IsT0FBcEIsQ0FBNEIsZUFBNUIsQ0FBbEYsRUFBZ0k7QUFDOUgsZUFBTyx3QkFBd0IsZUFBeEIsRUFBeUM7QUFDOUMsaUJBQVMsdUJBQVcsU0FEMEI7QUFFOUMsbUJBQVMsNkJBQXFCLGtDQUZnQjtBQUc5QyxpQkFBUyx3QkFBZ0I7QUFIcUIsU0FBekMsQ0FBUDtBQUtEO0FBQ0YsS0FURCxDQVNFLE9BQU8sQ0FBUCxFQUFVO0FBQ1YsYUFBTyx3QkFBd0IsZUFBeEIsRUFBeUM7QUFDOUMsZUFBUyx1QkFBVyxTQUQwQjtBQUU5QyxpQkFBWSw2QkFBcUIsWUFBakMsVUFBa0QsRUFBRSxPQUZOO0FBRzlDLGVBQVMsd0JBQWdCO0FBSHFCLE9BQXpDLENBQVA7QUFLRDs7QUFFRCxXQUFPLG9CQUFvQixlQUFwQixDQUFQO0FBQ0Q7O0FBRUQsTUFBSSwyQkFBb0IsUUFBcEIsQ0FBNkIsU0FBN0IsS0FBMkMsQ0FBQywyQkFBb0IsT0FBcEIsQ0FBNEIsU0FBNUIsQ0FBaEQsRUFBd0Y7QUFDdEYsV0FBTyxvQkFBb0IsU0FBcEIsQ0FBUDtBQUNEOztBQUVELFNBQU8seUJBQXdCLFlBQVksSUFBcEMsRUFBMEM7QUFDL0MsV0FBUyx1QkFBVyxTQUQyQjtBQUUvQyxhQUFTLDZCQUFxQiwrQkFGaUI7QUFHL0MsV0FBUyx3QkFBZ0I7QUFIc0IsR0FBMUMsQ0FBUDtBQUtEOztBQUVELFNBQVMsMkJBQVQsQ0FBcUMsT0FBckMsRUFBOEM7QUFDNUMsU0FBTyxRQUFRLGdDQUF5QixJQUFqQyxLQUNFLFFBQVEsZ0NBQXlCLGFBQWpDLEtBQW1ELFFBQVEsZ0NBQXlCLGNBQWpDLENBRDVEO0FBRUQ7O0FBRUQsZ0JBQWdCO0FBQ2QscUJBQW1CO0FBREwsQ0FBaEI7O2tCQUllLGE7O0FBQ2YsT0FBTyxhQUFQLEdBQXVCLGFBQXZCOzs7QUNyeUNBOzs7Ozs7O0FBRUE7O0FBQ0E7O0FBRUEsSUFDRSxZQUFhLGlCQURmO0FBQUEsSUFFRSxXQUFhLGdCQUZmO0FBQUEsSUFHRSxhQUFhLGtCQUhmO0FBQUEsSUFJRSxZQUFhLGlCQUpmOztBQU1BLElBQUksV0FBVyxPQUFPLFNBQVAsQ0FBaUIsUUFBaEM7QUFDQSxJQUFJLG1CQUFKOztBQUVBLFFBbURRLG1CQW5EUix5QkFBc0I7QUFDcEIsVUFEb0Isb0JBQ1gsR0FEVyxFQUNOO0FBQ1osV0FBTyxTQUFTLElBQVQsQ0FBYyxHQUFkLE1BQXVCLFNBQTlCO0FBQ0QsR0FIbUI7QUFLcEIsVUFMb0Isb0JBS1gsR0FMVyxFQUtOO0FBQ1osV0FBTyxRQUFRLE9BQU8sR0FBUCxDQUFmO0FBQ0QsR0FQbUI7OztBQVNwQixXQUFTLE1BQU0sT0FBTixJQUFpQixVQUFTLEdBQVQsRUFBYztBQUN0QyxXQUFPLFNBQVMsSUFBVCxDQUFjLEdBQWQsTUFBdUIsUUFBOUI7QUFDRCxHQVhtQjs7QUFhcEIsV0Fib0IscUJBYVYsR0FiVSxFQWFMO0FBQ2IsV0FBTyxRQUFRLElBQVIsSUFBZ0IsUUFBUSxLQUF4QixJQUFpQyxTQUFTLElBQVQsQ0FBYyxHQUFkLE1BQXVCLFVBQS9EO0FBQ0QsR0FmbUI7QUFpQnBCLFVBakJvQixvQkFpQlgsR0FqQlcsRUFpQk47QUFDWixXQUFPLFNBQVMsSUFBVCxDQUFjLEdBQWQsTUFBdUIsU0FBOUI7QUFDRCxHQW5CbUI7QUFxQnBCLFdBckJvQixxQkFxQlYsR0FyQlUsRUFxQkw7QUFDYixXQUFRLFFBQVEsSUFBUixJQUFnQixRQUFRLFNBQWhDO0FBQ0QsR0F2Qm1CO0FBeUJwQixvQkF6Qm9CLDhCQXlCRCxNQXpCQyxFQXlCTztBQUN2QixXQUFPLEtBQUssU0FBTCxDQUFlLE1BQWYsS0FBMEIsS0FBSyxRQUFMLENBQWMsTUFBZCxDQUExQixJQUFtRCxDQUFDLEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBM0Q7QUFDSCxHQTNCbUI7QUE2QnBCLG9CQTdCb0IsOEJBNkJELE1BN0JDLEVBNkJPO0FBQ3pCO0FBQ0EsV0FBTyxLQUFLLFNBQUwsQ0FBZSxNQUFmLEtBQTBCLEtBQUssUUFBTCxDQUFjLE1BQWQsQ0FBMUIsSUFBbUQsMkJBQW9CLE1BQXBCLENBQTJCLElBQTNCLENBQWdDLE1BQWhDLENBQTFEO0FBQ0QsR0FoQ21CO0FBa0NwQixnQkFsQ29CLDBCQWtDTCxLQWxDSyxFQWtDRSxRQWxDRixFQWtDWTtBQUM5QixXQUFPLEtBQUssU0FBTCxDQUFlLFFBQWYsSUFBOEIsS0FBOUIsU0FBdUMsUUFBdkMsR0FBb0QsS0FBM0Q7QUFDRCxHQXBDbUI7QUFzQ3BCLGtCQXRDb0IsNEJBc0NILEtBdENHLEVBc0NJLEdBdENKLEVBc0NTO0FBQzNCLFdBQVEsQ0FBQyxLQUFLLFNBQUwsQ0FBZSxHQUFmLENBQUYsR0FBeUIsS0FBekIsR0FBa0MsS0FBSyxRQUFMLENBQWMsR0FBZCxJQUF3QixLQUF4QixTQUFpQyxHQUFqQyxTQUE2QyxLQUE3QyxVQUF1RCxHQUF2RCxPQUF6QztBQUNELEdBeENtQjtBQTBDcEIsb0JBMUNvQiw4QkEwQ0QsS0ExQ0MsRUEwQ00sUUExQ04sRUEwQ2dCO0FBQ2xDLFdBQU8sS0FBSyxjQUFMLENBQW9CLEtBQXBCLEVBQTJCLFFBQTNCLENBQVA7QUFDRCxHQTVDbUI7QUE4Q3BCLFNBOUNvQixtQkE4Q1osWUE5Q1ksRUE4Q0U7QUFDcEIsV0FBUSxhQUFhLE1BQWIsS0FBd0IsSUFBeEIsSUFBZ0MsYUFBYSxNQUFiLEtBQXdCLFNBQXpELElBQXVFLGFBQWEsVUFBYixLQUE0Qix3QkFBWSxLQUF0SDtBQUNEO0FBaERtQixDQUF0Qjs7UUFtRFEsbUIsR0FBQSxtQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlFcnJvckxldmVscyA9IE9iamVjdC5mcmVlemUoe1xuICBNQVlfVklPTEFUSU9OOiAgICAnTUFZX1ZJT0xBVElPTicsXG4gIE1VU1RfVklPTEFUSU9OOiAgICdNVVNUX1ZJT0xBVElPTicsXG4gIFNIT1VMRF9WSU9MQVRJT046ICdTSE9VTERfVklPTEFUSU9OJ1xufSk7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVORVhQRUNURUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgcHJvcGVydHkgbm90IHBlcm1pdHRlZCcsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX1VSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIFVSSSBzdHJpbmcuJyxcbiAgTVVTVF9CRV9VUklfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgVVJJIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX0JPT0xFQU46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIEJvb2xlYW4uJyxcbiAgTVVTVF9CRV9CT09MRUFOX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgQm9vbGVhbiBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX05VTUJFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIE51bWJlci4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9NQk9YX1VSSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgd2FzIG5vdCBhIHN0cmluZyBhdCBhbGwuJyxcbiAgTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBFWFRFTlNJT05TX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgZXh0ZW5zaW9ucyBwcm9wZXJ0eSBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBMQU5HVUFHRV9NQVBTX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICdMYW5ndWFnZSBNYXBzLCB3aGVuIHByZXNlbnQsIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBMQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdrZXksIExhbmd1YWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gUkZDIDU2NDYnLFxuICBMQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICdrZXk6IExhbmd1YWdlIE1hcCB2YWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcsIGJ1dCB3YXMgbm90JyxcbiAgVkVSQl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBtdXN0IGJlIHByb3ZpZGVkJyxcbiAgVkVSQl9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBESVNQTEFZX1NIT1VMRF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICAgICAgICAgICdcImRpc3BsYXlcIiBwcm9wZXJ0eSBzaG91bGQgYmUgcHJvdmlkZWQuJyxcbiAgSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkU6ICAgICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gQWN0aXZpdHkgRGVmaW5pdGlvbnMgc2hvdWxkIGhhdmUgYSB0eXBlIHByb3BlcnR5IG9mJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX1NIT1VMRF9CRV9BUlJBWTogICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkuJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBtZW1iZXIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfQ01JOiAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJpbnRlcmFjdGlvblR5cGVcIiB2YWx1ZSBtdXN0IGJlIGEgQ01JIGludGVyYWN0aW9uIHR5cGUgb3B0aW9uLicsXG4gIElEX01VU1RfQkVfVU5JUVVFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBlYWNoIGludGVyYWN0aW9uIGNvbXBvbmVudCBhcnJheScsXG4gIElEX1NIT1VMRF9OT1RfQ09OVEFJTl9XSElURVNQQUNFUzogICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG9uIGludGVyYWN0aW9uIGNvbXBvbmVudHMgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlc3BhY2UnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIHByb3BlcnR5IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXNlbnQgaW50ZXJhY3Rpb25UeXBlIG9mOiAnLFxuICBERUZJTklUSU9OU19NVVNUX0JFX09CSkVDVFM6ICAgICAgICAgICAgICAgICAgICAgICdcImRlZmluaXRpb25zXCIsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBtYXAgb2JqZWN0cycsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9BUlJBWTogICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuXCIgdmFsdWUgbXVzdCBiZSBhbiBBcnJheSBvZiBzdHJpbmdzLicsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9TVFJJTkdTOiAgICAgICAgJ1wiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiBpdGVtcyBtdXN0IGJlIHN0cmluZ3MuJyxcbiAgQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAgICAnQWN0aXZpdGllcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAnU3RhdGVtZW50UmVmIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgT0JKRUNUX1RZUEVfTVVTVF9CRV9TVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAgICAnXCJvYmplY3RUeXBlXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBcIlN0YXRlbWVudFJlZlwiIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRF9VVUlEX1JFRjogICAgICAgICAgICAgICAgICAgICAgICAnXCJpZFwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgYSB2YWxpZCBVVUlEIHN0cmluZyBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIFNDQUxFRF9NVVNUX0JFX0JFVFdFRU5fMF8xOiAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBzY2FsZWQgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnLFxuICBSQVdfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBNQVhfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwibWF4XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSBtYXggcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBSQVdfTVVTVF9CRV9MRVNTX1RIQU5fTUFYOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWF4XCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiBtYXgnLFxuICBSRVNVTFRfTVVTVF9CRV9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgcmVzdWx0IG11c3QgYmUgYSBtYXAgb2JqZWN0JyxcbiAgRFVSQVRJT05fTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiZHVyYXRpb25cIiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGFuIElTTyA4NjAxIGR1cmF0aW9uJyxcbiAgREFURV9TSE9VTERfSU5DTFVERV9aT05FX0lORk9STUFUSU9OOiAgICAgICAgICAgICAnSVNPIDg2MDEgZGF0ZSB0aW1lIHN0cmluZ3MgdXNlZCBpbiB0aGUgeEFQSSBzaG91bGQgaW5jbHVkZSB0aW1lIHpvbmUgaW5mb3JtYXRpb24uJyxcbiAgREFURV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eXMgc3RyaW5nIHZhbHVlIG11c3QgYmUgY29uZm9ybWFudCB0byBJU08gODYwMSBmb3IgRGF0ZSBUaW1lcy4nLFxuICBWRVJTSU9OX01VU1RfQ09NUExZX1NFTUFOVElDX1ZFUlNJT05JTkc6ICAgICAgICAgICdcInZlcnNpb25cIiBtdXN0IGJlIGEgbm9uLW51bGwgc3RyaW5nIHRoYXQgY29tcGxpZXMgd2l0aCBTZW1hbnRpYyBWZXJzaW9uaW5nIDEuMC4wJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgICAnXCJhdHRhY2htZW50XCIgaW5zdGFuY2VzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWTogICAgICAgICAgICAgICAnXCJhdHRhY2htZW50c1wiIG11c3QgYmUgYSBub24tbnVsbCBBcnJheS4nLFxuICBBR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImFnZW50XCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBBR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gXCJhZ2VudFwiLicsXG4gIEFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTOiAgICAgICAgJ0ludmFsaWQgb2JqZWN0IHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEgR3JvdXAgd2hlbiBhbiBBZ2VudCB3YXMgZXhwZWN0ZWQuJyxcbiAgR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJncm91cFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgTUVNQkVSX01VU1RfQkVfUFJPVklERURfRk9SX0FOT05ZTU9VU19HUk9VUFM6ICAgICAnXCJtZW1iZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIGZvciBBbm9ueW1vdXMgR3JvdXBzLicsXG4gIEdST1VQX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIFwiZ3JvdXBcIi4nLFxuICBHUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWTogICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgbWVtYmVyIHByb3BlcnR5IG9mIGEgR3JvdXAgbXVzdCBiZSBhbiBBcnJheScsXG4gIEFDVE9SX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdG9yIG11c3QgYmUgcHJvdmlkZWQuJyxcbiAgQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVDogICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV086ICAgICAgICAnSWYgdXNlZCBhcyBhIEdyb3VwLCB0aGUgXCJhdXRob3JpdHlcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBcIm1lbWJlclwiIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBleGFjdGx5IHR3byBBZ2VudCBvYmplY3RzLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgJ1wiQ29udGV4dCBBY3Rpdml0aWVzXCIgcHJvcGVydHkgdmFsdWVzIG11c3Qgbm90IGJlIG51bGwuJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWTogICAgICAgICAgICAnQ29udGV4dCBBY3Rpdml0aWVzIHByb3BlcnR5IHZhbHVlcyBzaG91bGQgcHJlZmVyIHRvIGJlIGFuIGFycmF5IG9mIEFjdGl2aXRpZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQWN0aXZpdHkgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgUkVHSVNUUkFUSU9OX01VU1RfQkVfVVVJRF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBtdXN0IGJlIGEgVVVJRCBzdHJpbmcuJyxcbiAgUkVWSVNJT05fTVVTVF9CRV9BR0VOVF9PUl9HUk9VUDogICAgICAgICAgICAgICAgICAnVGhlIHJldmlzaW9uIHByb3BlcnR5IG11c3Qgbm90IGJlIHVzZWQgaWYgdGhlIFN0YXRlbWVudFxcJ3MgT2JqZWN0IGlzIGFuIEFnZW50IG9yIEdyb3VwLicsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgT0JKRUNUX01VU1RfQkVfREVGSU5FRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJvYmplY3RcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIE9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQ6ICAgICAnQSBTdWJTdGF0ZW1lbnQgbXVzdCBub3QgY29udGFpbiBhIFN1YlN0YXRlbWVudCcsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIElEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUzogICAgICAgICAgICAgICAgICAgJ0lkcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBBY3Rpdml0eSBQcm92aWRlciwgYW5kIG11c3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBMUlMnLFxuICBJRF9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJZCB3YXMgbm90IGEgdmFsaWQgVVVJRCcsXG4gIFNUQVRFTUVOVF9BUkdVTUVOVF9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgJ05vIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgICdOdWxsIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9CRV9QQVJTRURfQ09SUkVDVExZOiAgICAgICAgICAgICAgICdOdWxsIG9yIG5vbi1vYmplY3Qgc3RhdGVtZW50IHZhbHVlIHBhcnNlZCBmcm9tIHByb3ZpZGVkIHN0YXRtZW50IEpTT04uJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXVxufSk7XG5cbiBleHBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi4vY29uc3RhbnRzL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc30gZnJvbSAnLi4vY29uc3RhbnRzL3doaXRlbGlzdHMnO1xuaW1wb3J0IHt4YXBpRXJyb3JMZXZlbHMsIHhhcGlWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHt4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9pbnRlcmFjdGlvbi10eXBlcyc7XG5pbXBvcnQge3hhcGlHZW5lcmFsfSBmcm9tICcuLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxudmFyIHhhcGlWYWxpZGF0b3I7XG5cbmZ1bmN0aW9uIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3JzKSB7XG4gIHZhciB2ZXJzaW9uO1xuXG4gIGluc3RhbmNlID0gaW5zdGFuY2UgfHwgbnVsbDtcbiAgZXJyb3JzICAgPSBlcnJvcnMgfHwgbnVsbDtcbiAgdmVyc2lvbiAgPSB4YXBpR2VuZXJhbC5GSVJTVF9SRVBPUlRfVkVSU1RJT047XG4gIHJldHVybiB7aW5zdGFuY2UsIGVycm9ycywgdmVyc2lvbn07XG59XG5cbmZ1bmN0aW9uIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KGluc3RhbmNlLCBlcnJvcikge1xuICByZXR1cm4gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkID8gW10gOiBbZXJyb3JdKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXModGFyZ2V0LCBhbGxvd2VkUHJvcGVydGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG5cbiAgZm9yIChwcm9wZXJ0eU5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmIGFsbG93ZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlVORVhQRUNURUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQsIHZpb2xhdGlvblR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWUsIGxvY2FsVmlvbGF0aW9uVHlwZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgICAgICAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV0sXG4gIGxvY2FsVmlvbGF0aW9uVHlwZSA9IHZpb2xhdGlvblR5cGUgfHwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICBsb2NhbFZpb2xhdGlvblR5cGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gdGFyZ2V0W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguSVJJLnRlc3QocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfSVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9VUklfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmwodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgLy8gVE9ETyAtIGNoZWNrIHdoZXRoZXIgYSBmb3JtYWwgVVJMIGZvcm1hdCBkZWZpbml0aW9uIGlzIHJlY29tbWVuZGVkL2VuZm9yY2VkIGZvciB4QVBJXG4gIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNCb29sZWFuKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQm9vbGVhbihwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTn1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTl9QUkVTRU5UfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOdW1iZXIocHJvcFZhbHVlKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX05VTUJFUn1gLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJfUFJFU0VOVH1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSUZJUHJvcGVydGllcyh0YXJnZXQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBhY2NvdW50VHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGlmICh0YXJnZXQubWJveCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5tYm94ICE9PSBudWxsKSB7XG4gICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX01CT1hfVVJJLFxuICAgICAgICBsZXZlbDogeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4Lk1BSUxUT19VUkkudGVzdCh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXMsIHByb3BlcnRpZXNMZW5ndGgsIGksIHByb3BOYW1lLCBwcm9wVmFsdWU7XG5cbiAgaWZpcyA9IFtdO1xuICBwcm9wZXJ0aWVzTGVuZ3RoID0geGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLmxlbmd0aDtcblxuICBpZiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdW5kZWZpbmVkKSAge1xuICAgIHJldHVybiBpZmlzO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXNMZW5ndGg7IGkgKz0gMSkge1xuICAgIHByb3BOYW1lICA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lc1tpXTtcbiAgICBwcm9wVmFsdWUgPSB0YXJnZXRbcHJvcE5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWZpcy5wdXNoKHtrZXk6IHByb3BOYW1lLCB2YWx1ZTogcHJvcFZhbHVlfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlmaXM7XG59XG5cbmZ1bmN0aW9uIGdldElGSUNvdW50KHRhcmdldCkge1xuICByZXR1cm4gZ2V0SUZJcyh0YXJnZXQpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdLFxuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlM7XG5cbiAgaWYgKGV4dGVuc2lvbnMgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChleHRlbnNpb25zKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIC8vIFRPRE8gLSBkb3VibGUtY2hlY2sgd2hhdCBmdXJ0aGVyIGVuZm9yY2VhYmxlIGNvbnN0cmFpbnRzIGV4aXN0IG9uIGV4dGVuc2lvbiBvYmplY3QgcHJvcGVydGllc1xuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcE5hbWUsIG1hcHBlZFZhbHVlO1xuXG4gICAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gICAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGxhbmd1YWdlTWFwKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gbGFuZ3VhZ2VNYXApIHtcbiAgICAgIGlmIChsYW5ndWFnZU1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzVmFsaWRMYW5ndWFnZVRhZyhwcm9wTmFtZSkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcE5hbWUpLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7cHJvcE5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEfWAsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICAgIGlmIChtYXBwZWRWYWx1ZSA9PT0gbnVsbCB8fCBtYXBwZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKG1hcHBlZFZhbHVlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUF9LRVlfTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgICBpZiAodmVyYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUkJfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKHZlcmIsIHByb3BlcnRpZXMuSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi90cnVlKTtcblxuICAgIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVMYW5ndWFnZU1hcCh2ZXJiLmRpc3BsYXksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlzQWxsb3dlZENvbXBvbmVudFR5cGUsIGlkcywgaW50ZXJhY3Rpb25Db21wb25lbnQsIGNvbXBvbmVudHNMZW5ndGgsIHBlckNvbXBvbmVudFRyYWNlLCBpO1xuXG4gICAgbG9jYWxFcnJvcnMgICAgICAgICAgICA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuSU5URVJBQ1RJT05fQ09NUE9ORU5UUztcbiAgICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgICBpZHMgICAgICAgICAgICAgICAgICAgID0gW107XG5cblxuICAgIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBvbmVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25Db21wb25lbnQgPSBjb21wb25lbnRzW2ldO1xuICAgICAgICAgIHBlckNvbXBvbmVudFRyYWNlICAgID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIGkpO1xuXG4gICAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICB0cmFjZTogICBwZXJDb21wb25lbnRUcmFjZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgcHJvcGVydGllcy5JRCwgcGVyQ29tcG9uZW50VHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlkcy5wdXNoKGludGVyYWN0aW9uQ29tcG9uZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoaW50ZXJhY3Rpb25Db21wb25lbnQuZGVzY3JpcHRpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuREVTQ1JJUFRJT04pLCBsb2NhbEVycm9ycyk7XG4gICAgICAgICAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09NUE9ORU5UX0FSUkFZLCBwZXJDb21wb25lbnRUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpbnRlcmFjdGlvblR5cGUgJiYgY29tcG9uZW50cykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9WQUxJRH0gJHtpbnRlcmFjdGlvblR5cGV9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlEZWZpbnRpb24oZGVmaW5pdGlvbiwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5MZW5ndGgsIGNycEl0ZW0sIGk7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5ERUZJTklUSU9OO1xuICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTik7XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVMYW5ndWFnZU1hcChkZWZpbml0aW9uLm5hbWUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5OQU1FKSwgbG9jYWxFcnJvcnMpO1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKGRlZmluaXRpb24sIHByb3BlcnRpZXMuVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNVcmwoZGVmaW5pdGlvbiwgcHJvcGVydGllcy5NT1JFX0lORk8sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gICAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgICBpZiAoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0geGFwaUdlbmVyYWwuSU5URVJBQ1RJT05fREVGSU5JVElPTl9UWVBFKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVFlQRSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkV9IFwiJHt4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEV9XCJgLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybi5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjcnBJdGVtID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybltpXTtcblxuICAgICAgICAgIGlmIChjcnBJdGVtID09PSBudWxsIHx8IGNycEl0ZW0gPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjcnBJdGVtKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblRyYWNlLCBpKSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgICAgZGVmaW5pdGlvbi5jaG9pY2VzLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ0hPSUNFUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgICBkZWZpbml0aW9uLnNjYWxlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5MSUtFUlRdLFxuICAgICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNDQUxFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24udGFyZ2V0LFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVEFSR0VUKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc3RlcHMsXG4gICAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICAgIFtwcm9wZXJ0aWVzLlBFUkZPUk1BTkNFXSxcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEVQUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhkZWZpbml0aW9uLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWV9ERUZJTklUSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGF0dGFjaG1lbnRzTGVuZ3RoLCBpO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTO1xuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoYXR0YWNobWVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShhdHRhY2htZW50cykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgYXR0YWNobWVudHNMZW5ndGggPSBhdHRhY2htZW50cy5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBhdHRhY2htZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnRzW2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBZ2VudChhZ2VudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFHRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYWdlbnQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmaUNvdW50ID0gZ2V0SUZJQ291bnQoYWdlbnQpO1xuXG4gIGlmIChpZmlDb3VudCAhPT0geGFwaUdlbmVyYWwuTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWdlbnQub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVApIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1MsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhhZ2VudCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoYWdlbnQsIHByb3BlcnRpZXMuTkFNRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhZ2VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQUdFTlQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlR3JvdXAoZ3JvdXAsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBtZW1iZXJUcmFjZSwgaWZpQ291bnQsIG51bU1lbWJlcnMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuR1JPVVA7XG4gIG1lbWJlclRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUik7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChncm91cCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGdyb3VwKTtcblxuICBpZiAoaWZpQ291bnQgPT09IDApIHtcbiAgICBpZiAoZ3JvdXAubWVtYmVyID09PSBudWxsIHx8IGdyb3VwLm1lbWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgbWVtYmVyVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpZmlDb3VudCA+IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVJRklQcm9wZXJ0aWVzKGdyb3VwLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGdyb3VwLCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKGdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGdyb3VwLm1lbWJlcikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01FTUJFUl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1NZW1iZXJzID0gZ3JvdXAubWVtYmVyLmxlbmd0aDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1lbWJlcnM7IGkgKz0gMSkge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KGdyb3VwLm1lbWJlcltpXSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGdyb3VwLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5HUk9VUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3RvcihhY3RvciwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUNUT1I7XG5cbiAgaWYgKGFjdG9yID09PSBudWxsIHx8IGFjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUNUT1JfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhY3RvcikpIHtcbiAgICB2YWxpZGF0ZUdyb3VwKGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVBZ2VudChhY3RvciwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml0eShhdXRob3JpdHksIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFVVEhPUklUWTtcblxuICBpZiAoYXV0aG9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGF1dGhvcml0eSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzR3JvdXAoYXV0aG9yaXR5KSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgaWYgKCFhdXRob3JpdHkubWVtYmVyIHx8ICFhdXRob3JpdHkubWVtYmVyLmxlbmd0aCB8fCBhdXRob3JpdHkubWVtYmVyLmxlbmd0aCAhPT0geGFwaUdlbmVyYWwuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlMpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGF1dGhvcml0eSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoc3ViQ29udGV4dCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG51bUFjdGl2aXRpZXMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1VCX0NPTlRFWFQ7XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IG51bGwpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3ViQ29udGV4dCkpIHtcbiAgICAgIG51bUFjdGl2aXRpZXMgPSBzdWJDb250ZXh0Lmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1BY3Rpdml0aWVzOyBpICs9IDEpIHtcbiAgICAgICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0W2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgICAgIH1cbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN1YkNvbnRleHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVksXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTn0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0QWN0aXZpdGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTO1xuXG4gIGlmIChjb250ZXh0QWN0aXZpdGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0QWN0aXZpdGllcykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5wYXJlbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5QQVJFTlQpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5ncm91cGluZywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkdST1VQSU5HKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMuY2F0ZWdvcnksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DQVRFR09SWSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLm90aGVyLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT1RIRVIpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoY29udGV4dEFjdGl2aXRpZXMsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIHRyYWNlLCBlcnJvcnMsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5DT05URVhUO1xuXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoY29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoY29udGV4dC5yZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCAmJiAoY29udGV4dC5yZWdpc3RyYXRpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoY29udGV4dC5yZWdpc3RyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChjb250ZXh0LnJlZ2lzdHJhdGlvbikpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRUdJU1RSQVRJT05fTVVTVF9CRV9VVUlEX1NUUklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFtvYmplY3RUeXBlcy5HUk9VUCwgb2JqZWN0VHlwZXMuQUdFTlRdLmluZGV4T2Yoc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgaWYgKGNvbnRleHQucmV2aXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVWSVNJT04pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnBsYXRmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBMQVRGT1JNKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUExBVEZPUk1fTVVTVF9OT1RfQkVfVVNFRF9XSVRIX1JFVklTSU9OX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhjb250ZXh0LCBwcm9wZXJ0aWVzLlJFVklTSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi9mYWxzZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUExBVEZPUk0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIGlmIChjb250ZXh0LnRlYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdGVHcm91cChjb250ZXh0LnRlYW0sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5URUFNKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY29udGV4dEFjdGl2aXRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlQ29udGV4dEFjdGl2aXRpZXMoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUyksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIGlmIChjb250ZXh0Lmxhbmd1YWdlICE9PSB1bmRlZmluZWQgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKGNvbnRleHQubGFuZ3VhZ2UpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkxBTkdVQUdFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01VU1RfQkVfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5zdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKGNvbnRleHQuc3RhdGVtZW50LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU1RBVEVNRU5UKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuaW5zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChjb250ZXh0Lmluc3RydWN0b3IpKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOU1RSVUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlQWdlbnQoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUV4dGVuc2lvbnMoY29udGV4dC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoXG4gICAgY29udGV4dCxcbiAgICBbXG4gICAgICBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTixcbiAgICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICAgIHByb3BlcnRpZXMuVEVBTSxcbiAgICAgIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLFxuICAgICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICAgIHByb3BlcnRpZXMuUExBVEZPUk0sXG4gICAgICBwcm9wZXJ0aWVzLkxBTkdVQUdFLFxuICAgICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlNcbiAgICBdLFxuICAgIGxvY2FsVHJhY2UsXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9iamVjdCwgdHJhY2UsIGVycm9ycywgaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBvYmplY3RUeXBlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLk9CSkVDVDtcblxuICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfREVGSU5FRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChvYmplY3QpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhvYmplY3QsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OKTtcbiAgb2JqZWN0VHlwZSA9IG9iamVjdC5vYmplY3RUeXBlIHx8IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIC8vIFRPRE86IFN3aXRjaFxuICBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuQUNUSVZJVFkpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkFHRU5UKSB7XG4gICAgdmFsaWRhdGVBZ2VudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIGlmIChvYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUCkge1xuICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLlNVQl9TVEFURU1FTlQpIHtcbiAgICBpZiAoaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTdGF0ZW1lbnQob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNTdWJTdGF0ZW1lbnQqL3RydWUpO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSksXG4gICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50KHN0YXRlbWVudCwgdHJhY2UsIGVycm9ycywgaXNTdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlLCB3aGl0ZWxpc3RlZFByb3BlcnRpZXM7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIHdoaXRlbGlzdGVkUHJvcGVydGllcyA9IHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNUQVRFTUVOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KHN0YXRlbWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIWlzU3ViU3RhdGVtZW50KSB7XG4gICAgaWYgKHN0YXRlbWVudC5pZCA9PT0gbnVsbCB8fCBzdGF0ZW1lbnQuaWQgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQuaWQpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURfTVVTVF9CRV9WQUxJRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1VCX1NUQVRFTUVOVDtcbiAgfVxuXG4gIHZhbGlkYXRlQWN0b3Ioc3RhdGVtZW50LmFjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyYihzdGF0ZW1lbnQudmVyYiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUkIpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlT2JqZWN0KHN0YXRlbWVudC5vYmplY3QsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1QpLCBsb2NhbEVycm9ycywgaXNTdWJTdGF0ZW1lbnQpO1xuICB2YWxpZGF0ZVJlc3VsdChzdGF0ZW1lbnQucmVzdWx0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVTVUxUKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUgPSBzdGF0ZW1lbnQub2JqZWN0ICYmIHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA/IHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA6IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIHZhbGlkYXRlQ29udGV4dChzdGF0ZW1lbnQuY29udGV4dCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFQpLCBsb2NhbEVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlRJTUVTVEFNUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNJU084NjAxU3RyaW5nKHN0YXRlbWVudCwgcHJvcGVydGllcy5TVE9SRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUF1dGhvcml0eShzdGF0ZW1lbnQuYXV0aG9yaXR5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVVUSE9SSVRZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVZlcnNpb24oc3RhdGVtZW50LnZlcnNpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5WRVJTSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUF0dGFjaG1lbnRzKHN0YXRlbWVudC5hdHRhY2htZW50cywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudCwgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiBtYWtlU3RhdGVtZW50UmVwb3J0KHN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnM7XG5cbiAgbG9jYWxFcnJvcnMgPSBbXTtcbiAgdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUQVRFTUVOVCwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICByZXR1cm4gbWFrZVYxUmVwb3J0KHN0YXRlbWVudCwgbG9jYWxFcnJvcnMpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gIHZhciBzdGF0ZW1lbnRPYmplY3Q7XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoc3RhdGVtZW50KSkge1xuICAgIHRyeSB7XG4gICAgICBzdGF0ZW1lbnRPYmplY3QgPSBKU09OLnBhcnNlKHN0YXRlbWVudCk7XG4gICAgICBpZiAoc3RhdGVtZW50T2JqZWN0ID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudE9iamVjdCkgfHwgeGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudE9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX0JFX1BBUlNFRF9DT1JSRUNUTFksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChzdGF0ZW1lbnRPYmplY3QsIHtcbiAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVkFMSURfSlNPTn06ICR7ZS5tZXNzYWdlfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50T2JqZWN0KTtcbiAgfVxuXG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudCkgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdGF0ZW1lbnQpKSB7XG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRCxcbiAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSB7XG4gIHJldHVybiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5aT05FXSB8fFxuICAgICAgICAgIChtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5SRUxBVElWRV9USU1FXSAmJiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5USU1FX1pPTkVfSE9VUl0pO1xufVxuXG54YXBpVmFsaWRhdG9yID0ge1xuICB2YWxpZGF0ZVN0YXRlbWVudDogdmFsaWRhdGVBbWJpZ3VvdXNUeXBlU3RhdGVtZW50XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4YXBpVmFsaWRhdG9yO1xud2luZG93LnhhcGlWYWxpZGF0b3IgPSB4YXBpVmFsaWRhdG9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uUmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge29iamVjdFR5cGVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbmNvbnN0XG4gIElTX1NUUklORyAgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgSVNfQVJSQVkgICA9ICdbb2JqZWN0IEFycmF5XScsXG4gIElTX0JPT0xFQU4gPSAnW29iamVjdCBCb29sZWFuXScsXG4gIElTX05VTUJFUiAgPSAnW29iamVjdCBOdW1iZXJdJztcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciB4YXBpVmFsaWRhdGlvblV0aWxzO1xuXG54YXBpVmFsaWRhdGlvblV0aWxzID0ge1xuICBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19TVFJJTkc7XG4gIH0sXG5cbiAgaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7XG4gIH0sXG5cbiAgaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19BUlJBWTtcbiAgfSxcblxuICBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdHJ1ZSB8fCBvYmogPT09IGZhbHNlIHx8IHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfQk9PTEVBTjtcbiAgfSxcblxuICBpc051bWJlcihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19OVU1CRVI7XG4gIH0sXG5cbiAgaXNEZWZpbmVkKG9iaikge1xuICAgIHJldHVybiAob2JqICE9PSBudWxsIHx8IG9iaiAhPT0gdW5kZWZpbmVkKTtcbiAgfSxcblxuICBpc05vbk51bGxNYXBPYmplY3QodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzT2JqZWN0KHRhcmdldCkgJiYgIXRoaXMuaXNBcnJheSh0YXJnZXQpO1xuICB9LFxuXG4gIGlzVmFsaWRMYW5ndWFnZVRhZyh0YXJnZXQpIHtcbiAgICAvLyBUT0RPIC0gdXNlIG1vcmUgcHJlY2lzZSA1NjQ2IGhhbmRsaW5nLCByYXRoZXIgdGhhbiB0aGlzIHNpbXBsaWZpZWQgQkNQIDQ3IHJlZ2V4LCB3aGljaCBjb21iaW5lcyBSRkMgNTY0NiBhbmQgUkZDIDQ2NDcuXG4gICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKHRhcmdldCkgJiYgdGhpcy5pc1N0cmluZyh0YXJnZXQpICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQkNQXzQ3LnRlc3QodGFyZ2V0KTtcbiAgfSxcblxuICBhZGRQcm9wVG9UcmFjZSh0cmFjZSwgYWRkZW5kdW0pIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQoYWRkZW5kdW0pID8gYCR7dHJhY2V9LiR7YWRkZW5kdW19YCA6IHRyYWNlO1xuICB9LFxuXG4gIGFkZExvb2t1cFRvVHJhY2UodHJhY2UsIGtleSkge1xuICAgIHJldHVybiAoIXRoaXMuaXNEZWZpbmVkKGtleSkpID8gdHJhY2UgOiAodGhpcy5pc051bWJlcihrZXkpID8gYCR7dHJhY2V9WyR7a2V5fV1gIDogYCR7dHJhY2V9W1wiJHtrZXl9XCJdYCk7XG4gIH0sXG5cbiAgbG9jYWxUcmFjZVRvU3RyaW5nKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSk7XG4gIH0sXG5cbiAgaXNHcm91cChhY3Rvck9yR3JvdXApIHtcbiAgICByZXR1cm4gKGFjdG9yT3JHcm91cC5tZW1iZXIgIT09IG51bGwgJiYgYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB8fCBhY3Rvck9yR3JvdXAub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVA7XG4gIH1cbn07XG5cbmV4cG9ydCB7eGFwaVZhbGlkYXRpb25VdGlsc307XG4iXX0= diff --git a/lib/xapiValidator.min.js b/lib/xapiValidator.min.js new file mode 100644 index 0000000..d372177 --- /dev/null +++ b/lib/xapiValidator.min.js @@ -0,0 +1,3 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i;i="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,i.beepBoop=e()}}(function(){return function e(i,r,a){function t(s,T){if(!r[s]){if(!i[s]){var p="function"==typeof require&&require;if(!T&&p)return p(s,!0);if(o)return o(s,!0);var n=new Error("Cannot find module '"+s+"'");throw n.code="MODULE_NOT_FOUND",n}var l=r[s]={exports:{}};i[s][0].call(l.exports,function(e){var r=i[s][1][e];return t(r?r:e)},l,l.exports,e,i,r,a)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;sw.xapiGeneral.MAX_SCALED_VALUE)&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.SCALED),message:Y.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.min&&(l(e,H.properties.MIN,t,a,!1),void 0!==e.raw&&e.rawe.max&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.RAW),message:Y.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,level:Y.xapiErrorLevels.MUST_VIOLATION})),l(e,H.properties.RAW,t,a,!1),o(e,j.xapiWhiteListProperties.SCORE,t,a),a)}function U(e,i,r){var a,t;return a=r||[],t=i||H.properties.RESULT,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(F(e.score,z.xapiValidationUtils.addPropToTrace(t,H.properties.SCORE),a),n(e,H.properties.SUCCESS,t,a,!1),n(e,H.properties.COMPLETION,t,a,!1),s(e,H.properties.RESPONSE,t,a,!1),I(e.extensions,z.xapiValidationUtils.addPropToTrace(t,H.properties.EXTENSIONS),a),void 0===e.duration||null!==e.duration&&z.xapiValidationUtils.isString(e.duration)&&X.xapiValidationRegex.ISO_8601_DURATION.test(e.duration)||a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.DURATION),message:Y.xapiValidationErrors.DURATION_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.RESULT,t,a),a):(a.push({trace:z.xapiValidationUtils.addPropToTrace(t),message:Y.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function M(e,i,r,a){var t,o,s,T;return t=a||[],o=r||H.properties.DATE_TIME,T=e[i],void 0===T?t:null!==T&&z.xapiValidationUtils.isString(T)?(s=X.xapiValidationRegex.ISO_8601_DATE_TIME.exec(T),s?G(s)||t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,level:Y.xapiErrorLevels.SHOULD_VIOLATION +}):t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),t):(t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:i+" "+Y.xapiValidationErrors.MUST_BE_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function V(e,i,r){var a,t;return a=r||[],t=i||H.properties.VERSION,void 0===e?a:(null!==e&&z.xapiValidationUtils.isString(e)&&X.xapiValidationRegex.SEMVER_1_P_0_P_0.test(e)||a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function x(e,i,r){var a,t;return a=r||[],t=i||H.properties.ATTACHMENT,z.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.display?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.DISPLAY),message:Y.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION}):O(e.display,z.xapiValidationUtils.addPropToTrace(t,H.properties.DISPLAY),a),O(e.description,z.xapiValidationUtils.addPropToTrace(t,H.properties.DESCRIPTION),a),T(e,H.properties.USAGE_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),T(e,H.properties.FILE_URL,t,a,!1,Y.xapiErrorLevels.MUST_VIOLATION),s(e,H.properties.CONTENT_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),void 0!==e.length&&null!==e.length&&z.xapiValidationUtils.isNumber(e.length)&&e.length%1===0||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.LENGTH),message:Y.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0===e.sha2?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}):null!==e.sha2&&z.xapiValidationUtils.isString(e.sha2)&&X.xapiValidationRegex.BASE_64.test(e.sha2)||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.ATTACHMENT,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function R(e,i,r){var a,t,o,s;if(a=r||[],t=i||H.properties.ATTACHMENTS,void 0===e)return a;if(null===e||!z.xapiValidationUtils.isArray(e))return a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,level:Y.xapiErrorLevels.MUST_VIOLATION}),a;for(o=e.length,s=0;sw.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:Y.xapiErrorLevels.MUST_VIOLATION}),E(e,t,a),s(e,H.properties.NAME,t,a,!1),void 0!==e.member)if(null!==e.member&&z.xapiValidationUtils.isArray(e.member))for(n=e.member.length,l=0;l - + - \ No newline at end of file + diff --git a/spec/xapiValidator_spec.js b/spec/xapiValidator_spec.js index 265532e..459d5ea 100644 --- a/spec/xapiValidator_spec.js +++ b/spec/xapiValidator_spec.js @@ -1,6 +1,6 @@ describe("xapiValidator", function() { describe("#validateStatement", function() { - + function reportHasErrorWithTracePrefix(report, prefix, targetLevel) { if (report == null || report == undefined || report.errors == null || report.errors == undefined) { return false; @@ -11,14 +11,14 @@ describe("xapiValidator", function() { return hasTargetLevel ? targetLevel == err.level && foundPrefix : foundPrefix; }); } - + describe("when passed no arguments", function() { it("returns non-null report", function() { var result = xapiValidator.validateStatement(); expect(result).to.be.not.null; expect(result).to.be.a("Object"); }); - + it("includes one error", function() { var result = xapiValidator.validateStatement(); var errors = result.errors; @@ -30,14 +30,14 @@ describe("xapiValidator", function() { expect(errors[0]).to.have.property("level") .that.equals("MUST_VIOLATION"); }); - + it("has a null instance property in the report", function() { expect(xapiValidator.validateStatement()) .to.have.property("instance") .that.is.null; }); }); - + describe("when passed a null argument", function() { it("returns non-null report", function() { var result = xapiValidator.validateStatement(null); @@ -47,7 +47,7 @@ describe("xapiValidator", function() { .that.is.a("Array"); expect(result).to.have.property("instance"); }); - + it("includes one error", function() { var result = xapiValidator.validateStatement(null); var errors = result.errors; @@ -59,14 +59,14 @@ describe("xapiValidator", function() { expect(errors[0]).to.have.property("level") .that.equals("MUST_VIOLATION"); }); - + it("has a null instance property in the report", function() { expect(xapiValidator.validateStatement(null)) .to.have.property("instance") .that.is.null; }); }); - + describe("when passed a json string argument", function() { var minimalJsonString = "{\"id\":\"whatever\"}"; it("returns non-null report", function() { @@ -77,7 +77,7 @@ describe("xapiValidator", function() { .that.is.a("Array"); expect(result).to.have.property("instance"); }); - + it("has an instance property with the deserialized JSON in the report", function() { var result = xapiValidator.validateStatement(minimalJsonString); expect(result).to.have.property("instance") @@ -85,7 +85,7 @@ describe("xapiValidator", function() { .that.deep.equals({"id":"whatever"}); }); }); - + describe("when passed a json string argument encoding null", function() { var minimalJsonString = "null"; it("returns non-null report", function() { @@ -96,7 +96,7 @@ describe("xapiValidator", function() { .that.is.a("Array"); expect(result).to.have.property("instance"); }); - + it("includes one error", function() { var result = xapiValidator.validateStatement(minimalJsonString); var errors = result.errors; @@ -106,14 +106,14 @@ describe("xapiValidator", function() { expect(errors[0]).to.have.property("level") .that.equals("MUST_VIOLATION"); }); - + it("has an instance property with null value", function() { var result = xapiValidator.validateStatement(minimalJsonString); expect(result).to.have.property("instance") .that.is.null; }); }); - + describe("when passed an invalid json string argument", function() { var minimalJsonString = "derp"; it("returns non-null report", function() { @@ -124,25 +124,24 @@ describe("xapiValidator", function() { .that.is.a("Array"); expect(result).to.have.property("instance"); }); - + it("includes one error", function() { var result = xapiValidator.validateStatement(minimalJsonString); var errors = result.errors; expect(errors).to.be.instanceOf(Array); expect(errors).to.have.length(1); - expect(errors[0]).to.have.property("message") - .that.equals("Invalid JSON. The statement could not be parsed: Unexpected token d"); + expect(errors[0]).to.have.property("message"); expect(errors[0]).to.have.property("level") .that.equals("MUST_VIOLATION"); }); - + it("has an instance property with null value", function() { var result = xapiValidator.validateStatement(minimalJsonString); expect(result).to.have.property("instance") .that.is.null; }); }); - + describe("when passed a statement object", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {mbox:"mailto:agent@example.com"}, @@ -156,14 +155,14 @@ describe("xapiValidator", function() { .that.is.a("Array"); expect(result).to.have.property("instance"); }); - + it("has an instance property that matches the input object", function() { var result = xapiValidator.validateStatement(inputStatement); expect(result).to.have.property("instance") .that.deep.equals(inputStatement); }); }); - + describe("when given a null id property", function() { var inputStatement = {id : null , actor : {mbox:"mailto:agent@example.com"}, @@ -174,7 +173,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(result, "statement.id")).to.be.true; }); }); - + describe("when given an invalid UUID id property", function() { var inputStatement = {id : "abc123", actor : {mbox:"mailto:agent@example.com"}, @@ -185,7 +184,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(result, "statement.id")).to.be.true; }); }); - + describe("when given a valid UUID id property", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", actor : {mbox:"mailto:agent@example.com"}, @@ -196,7 +195,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(result, "statement.id")).to.be.false; }); }); - + describe("when given a null actor property", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : null, @@ -207,7 +206,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(result, "statement.actor")).to.be.true; }); }); - + describe("when given an empty non-null actor property", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {}, @@ -218,7 +217,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(result, "statement.actor")).to.be.true; }); }); - + describe("when given an otherwise valid actor", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {mbox:"mailto:group@example.com"}, @@ -228,13 +227,13 @@ describe("xapiValidator", function() { var result = xapiValidator.validateStatement(inputStatement); expect(result.errors).to.have.property("length", 0); }); - + it("the name property produces no errors when a simple string", function() { inputStatement.actor.name = "hello"; var result = xapiValidator.validateStatement(inputStatement); expect(result.errors).to.have.property("length", 0); }); - + it("the name property produces no errors when a simple string", function() { inputStatement.actor.name = 1.23; var result = xapiValidator.validateStatement(inputStatement); @@ -242,7 +241,7 @@ describe("xapiValidator", function() { expect(result.errors).to.have.property("length", 1); }); }); - + describe("when given an actor with an objectType of 'Group'", function() { var moreValidStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {objectType:"Group", member:[]}, @@ -252,7 +251,7 @@ describe("xapiValidator", function() { var result = xapiValidator.validateStatement(moreValidStatement); expect(reportHasErrorWithTracePrefix(result, "statement.actor.member")).to.be.false; }); - + it("the member property is required to be present if the actor is unidentified, and produces an error when absent", function() { var inputInvalidStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {objectType:"Group"}, @@ -261,15 +260,15 @@ describe("xapiValidator", function() { var result = xapiValidator.validateStatement(inputInvalidStatement); expect(reportHasErrorWithTracePrefix(result, "statement.actor.member")).to.be.true; }); - + it("the member property is not required to be present if the actor is identified", function() { - var result = xapiValidator.validateStatement({id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , + var result = xapiValidator.validateStatement({id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {objectType:"Group", mbox:"mailto:group@example.com"}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", "display":{"en-US":"created"}}, object : {id : "http://example.com/myUniqueId", objectType:"Activity"}}); expect(reportHasErrorWithTracePrefix(result, "statement.actor.member")).to.be.false; }); - + it("the member property is allowed to be present if the actor is identified", function() { var result = xapiValidator.validateStatement({id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", actor : {objectType:"Group", mbox:"mailto:group@example.com", member:[]}, @@ -278,7 +277,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(result, "statement.actor.member")).to.be.false; }); }); - + describe("when given an actor with a members property", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, @@ -287,28 +286,28 @@ describe("xapiValidator", function() { it("the member property has no errors about it when present but empty", function() { expect(xapiValidator.validateStatement(inputStatement).errors).to.be.empty; }); - + it("the member property has no errors when populated with a simple agent", function() { inputStatement.actor.member = [{mbox:"mailto:group@example.com"}]; expect(xapiValidator.validateStatement(inputStatement).errors).to.be.empty; }); - + it("the member property reports an error when populated with a Group object via objectType", function() { inputStatement.actor.member = [{mbox:"mailto:group@example.com", objectType:"Group"}]; expect(xapiValidator.validateStatement(inputStatement).errors) .to.have.property("length", 1); }); - + it("the member property's agent reports an error when given an account missing its homePage", function() { inputStatement.actor.member = [{account:{name:"bob"}}]; expect(reportHasErrorWithTracePrefix(xapiValidator.validateStatement(inputStatement), "statement.actor.member[0].account.homePage")).to.be.true; }); - + it("the member property's agent reports an error when given an account missing its name", function() { inputStatement.actor.member = [{account:{homePage:"http://example.com"}}]; expect(reportHasErrorWithTracePrefix(xapiValidator.validateStatement(inputStatement), "statement.actor.member[0].account.name")).to.be.true; }); - + it("the member property's agent reports an error when given an account with an all-lowercase homepage", function() { inputStatement.actor.member = [{account:{homepage:"http://example.com", name:"bob"}}]; var report = xapiValidator.validateStatement(inputStatement); @@ -322,28 +321,28 @@ describe("xapiValidator", function() { expect(xapiValidator.validateStatement(inputStatement).errors) .to.have.property("length", 0); }); - + it("the member property's agent reports no error when given a valid mbox", function() { inputStatement.actor.member = [{mbox:"mailto:bob@example.com"}]; expect(xapiValidator.validateStatement(inputStatement).errors) .to.have.property("length", 0); }); - + it("the member property's agent reports an error when given an invalid mbox", function() { inputStatement.actor.member = [{mbox:"SOMETHINGWRONG:bob@example.com"}]; var results = xapiValidator.validateStatement(inputStatement); expect(reportHasErrorWithTracePrefix(results, "statement.actor.member[0].mbox")).to.be.true; expect(results.errors).to.have.property("length", 1); }); - + it("the member property reports an error when populated with a Group object via member", function() { inputStatement.actor.member = [{mbox:"mailto:group@example.com", member:[]}]; expect(xapiValidator.validateStatement(inputStatement).errors) .to.have.property("length", 1); }); - + }); - + describe("when given a statement without a verb property", function() { it("reports an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -354,7 +353,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb")).to.be.true; }); }); - + describe("when given a verb without an id property", function() { it("reports an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -366,7 +365,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb.id", "MUST_VIOLATION")).to.be.true; }); }); - + describe("when given a verb with a non-string id property", function() { it("reports an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -378,7 +377,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb.id", "MUST_VIOLATION")).to.be.true; }); }); - + describe("when given a verb with a relative URI id property", function() { it("reports an SHOULD_VIOLATION error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -390,7 +389,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb.id", "SHOULD_VIOLATION")).to.be.true; }); }); - + describe("when given a verb without a display property", function() { it("reports an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -402,7 +401,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb.display", "SHOULD_VIOLATION")).to.be.true; }); }); - + describe("when given a verb with an empty display property", function() { it("reports no errors", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -412,7 +411,7 @@ describe("xapiValidator", function() { expect(xapiValidator.validateStatement(inputStatement).errors).to.have.property("length", 0); }); }); - + describe("when given a verb.display with RFC 5646 key and string value", function() { it("reports no errors", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -422,7 +421,7 @@ describe("xapiValidator", function() { expect(xapiValidator.validateStatement(inputStatement).errors).to.have.property("length", 0); }); }); - + describe("when given a verb.display with RFC 5646 key and non-string value", function() { it("reports an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -434,7 +433,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb.display[\"en-US\"]", "MUST_VIOLATION")).to.be.true; }); }); - + describe("when given a verb.display with invalid key and string value", function() { it("reports an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -446,7 +445,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.verb.display.123totallyWrong", "MUST_VIOLATION")).to.be.true; }); }); - + describe("when the object property is absent", function() { it("reports a MUST_VIOLATION error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -457,7 +456,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.object", "MUST_VIOLATION")).to.be.true; }); }); - + describe("when the object property is null", function() { it("reports a MUST_VIOLATION error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -469,7 +468,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.object", "MUST_VIOLATION")).to.be.true; }); }); - + describe("when the object lacks an objectType property", function() { it("reports a SHOULD_VIOLATION error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , @@ -487,7 +486,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition: null}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -500,7 +499,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition: []}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -524,7 +523,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{name:1.23}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -535,7 +534,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{name:{"123 totally not a language code" : "created"}}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -546,20 +545,20 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"true-false"}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 0); expect(reportHasErrorWithTracePrefix(results, "statement.object.definition.name", "MUST_VIOLATION")).to.be.false; }); - + it("a non-CMI interactionType value produces an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"graphicGapMatchInteraction"}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -570,7 +569,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{correctResponsesPattern: 1.23}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -581,7 +580,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{correctResponsesPattern: "1.23"}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -592,7 +591,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{correctResponsesPattern: [1.23]}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -603,7 +602,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{correctResponsesPattern: ["1.23"]}}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 0); @@ -614,7 +613,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{type:"http://example.com/somethingElse", interactionType:"choice", choices:[]}} }; var results = xapiValidator.validateStatement(inputStatement); @@ -626,7 +625,7 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"choice", steps:[]}} }; var results = xapiValidator.validateStatement(inputStatement); @@ -638,8 +637,8 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", - definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"choice", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", + definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"choice", choices:[{id:"hello invalid id", description:{}}]}} }; var results = xapiValidator.validateStatement(inputStatement); @@ -651,8 +650,8 @@ describe("xapiValidator", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {member:[]}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", display : {"en-US":"created"}}, - object : {id : "http://example.com/myUniqueId", objectType:"Activity", - definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"choice", + object : {id : "http://example.com/myUniqueId", objectType:"Activity", + definition:{type:"http://adlnet.gov/expapi/activities/cmi.interaction", interactionType:"choice", choices:[{id:"idA", description:{}}, {id:"idA", description:{}}]}} }; var results = xapiValidator.validateStatement(inputStatement); @@ -681,7 +680,7 @@ describe("xapiValidator", function() { expect(reportHasErrorWithTracePrefix(results, "statement.object.id", "MUST_VIOLATION")).to.be.true; }); }); - + describe("given a substatement type object", function() { it("should not report an error when valid", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", @@ -695,7 +694,7 @@ describe("xapiValidator", function() { expect(results.errors).to.have.property("length", 0); }); - + it("reports a MUST error when the id property is present", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", actor : {mbox:"mailto:agent@example.com"}, @@ -706,11 +705,11 @@ describe("xapiValidator", function() { verb: { "id":"http://adlnet.gov/expapi/verbs/created", "display":{"en-US":"created"}}, object: { id : "http://example.com/myUniqueId", objectType:"Activity"}}}; var results = xapiValidator.validateStatement(inputStatement); - + expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.object.id", "MUST_VIOLATION")).to.be.true; }); - + it("reports a MUST error when the version property is present", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", actor : {mbox:"mailto:agent@example.com"}, @@ -725,7 +724,7 @@ describe("xapiValidator", function() { expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.object.version", "MUST_VIOLATION")).to.be.true; }); - + it("reports a MUST error when the stored property is present", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", actor : {mbox:"mailto:agent@example.com"}, @@ -736,11 +735,11 @@ describe("xapiValidator", function() { verb: { "id":"http://adlnet.gov/expapi/verbs/created", "display":{"en-US":"created"}}, object: { id : "http://example.com/myUniqueId", objectType:"Activity"}}}; var results = xapiValidator.validateStatement(inputStatement); - + expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.object.stored", "MUST_VIOLATION")).to.be.true; }); - + it("reports a MUST error when the authority property is present", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0", actor : {mbox:"mailto:agent@example.com"}, @@ -843,7 +842,7 @@ describe("xapiValidator", function() { result : {completion:false}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 0); - + }); it("a non-String response property produces an error", function() { @@ -864,7 +863,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, result : {response:"idA"}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("a non-String duration property produces an error", function() { @@ -929,7 +928,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, result : {score:{raw:123}}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("a Number raw property below min produces an error", function() { @@ -961,7 +960,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, result : {score:{raw:123, min:120, max:125}}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("a non-Number scaled property produces an error", function() { @@ -982,7 +981,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, result : {score:{scaled:0.5}}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("a Number scaled property below 0 produces an error", function() { @@ -1025,7 +1024,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, result : {score:{max:123}}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("a Number max property below min produces an error", function() { @@ -1057,7 +1056,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, result : {score:{min:123}}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("a Number min property above max produces an error", function() { @@ -1080,7 +1079,7 @@ describe("xapiValidator", function() { object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, context: {}}; var results = xapiValidator.validateStatement(inputStatement); - expect(results.errors).to.have.property("length", 0); + expect(results.errors).to.have.property("length", 0); }); it("an non-object context value produces an error", function() { @@ -1791,7 +1790,7 @@ describe("xapiValidator", function() { actor : {mbox:"mailto:agent@example.com"}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", "display":{"en-US":"created"}}, object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, - authority: {objectType:"Group", member:[{objectType:"Agent", mbox:"mailto:bob@example.com"}, + authority: {objectType:"Group", member:[{objectType:"Agent", mbox:"mailto:bob@example.com"}, {objectType:"Agent", mbox:"mailto:tom@example.com"}]}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 0); @@ -1813,7 +1812,7 @@ describe("xapiValidator", function() { actor : {mbox:"mailto:agent@example.com"}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", "display":{"en-US":"created"}}, object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, - authority: {objectType:"Group", member:[{objectType:"Agent", mbox:"mailto:bob@example.com"}, + authority: {objectType:"Group", member:[{objectType:"Agent", mbox:"mailto:bob@example.com"}, {objectType:"Agent", mbox:"mailto:tom@example.com"}, {objectType:"Agent", mbox:"mailto:frank@example.com"}]}}; var results = xapiValidator.validateStatement(inputStatement); @@ -1826,7 +1825,7 @@ describe("xapiValidator", function() { actor : {mbox:"mailto:agent@example.com"}, verb: { "id":"http://adlnet.gov/expapi/verbs/created", "display":{"en-US":"created"}}, object : {id : "http://example.com/myUniqueId", objectType:"Activity"}, - authority: {objectType:"Group", member:[{objectType:"Agent", mbox:"mailto:bob@example.com"}, + authority: {objectType:"Group", member:[{objectType:"Agent", mbox:"mailto:bob@example.com"}, {objectType:"Agent"}]}}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); @@ -1855,7 +1854,7 @@ describe("xapiValidator", function() { var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.version", "MUST_VIOLATION")).to.be.true; - }); + }); }); describe("for an version property with a string value", function() { @@ -1911,7 +1910,7 @@ describe("xapiValidator", function() { expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.version", "MUST_VIOLATION")).to.be.true; }); - + it("a semantic version with SemVer 2.0.0 build release metadata not in SemVer 1.0.0 produces an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {mbox:"mailto:agent@example.com"}, @@ -1921,7 +1920,7 @@ describe("xapiValidator", function() { var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.version", "MUST_VIOLATION")).to.be.true; - }); + }); }); describe("for an attachments property on the statement with a non-Array value", function() { @@ -1946,7 +1945,7 @@ describe("xapiValidator", function() { expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.attachments", "MUST_VIOLATION")).to.be.true; }); - + it("an object map value produces an error", function() { var inputStatement = {id : "fd41c918-b88b-4b20-a0a5-a4c32391aaa0" , actor : {mbox:"mailto:agent@example.com"}, @@ -1956,7 +1955,7 @@ describe("xapiValidator", function() { var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 1); expect(reportHasErrorWithTracePrefix(results, "statement.attachments", "MUST_VIOLATION")).to.be.true; - }); + }); }); describe("for an attachments property on the statement with an Array value", function() { @@ -1968,7 +1967,7 @@ describe("xapiValidator", function() { attachments: []}; var results = xapiValidator.validateStatement(inputStatement); expect(results.errors).to.have.property("length", 0); - }); + }); }); describe("for an attachment object within the attachments property's Array on the statement", function() { @@ -2160,4 +2159,4 @@ describe("xapiValidator", function() { }); }); }); -}); \ No newline at end of file +}); diff --git a/src/constants/errors.js b/src/constants/errors.js new file mode 100644 index 0000000..6b847ed --- /dev/null +++ b/src/constants/errors.js @@ -0,0 +1,89 @@ +'use strict'; + +const xapiErrorLevels = Object.freeze({ + MAY_VIOLATION: 'MAY_VIOLATION', + MUST_VIOLATION: 'MUST_VIOLATION', + SHOULD_VIOLATION: 'SHOULD_VIOLATION' +}); + +const xapiValidationErrors = Object.freeze({ + UNEXPECTED: 'Unexpected property not permitted', + MUST_BE_STRING: 'property, if present, must be a string.', + MUST_BE_PRESENT: 'property was required to be a string but was absent.', + MUST_BE_URI_STRING: 'property, if present, must be a URI string.', + MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', + MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', + MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', + MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', + MUST_BE_NUMBER: 'property, if present, must be a Number.', + MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', + MUST_BE_MBOX_URI: 'mbox property was required to be a mailto URI string but was not a string at all.', + MUST_BE_VALID_MBOX_FORMAT: 'mbox property was required to be a mailto URI string but did not match the mailto format.', + EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', + LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', + LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', + LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', + VERB_MUST_BE_PROVIDED: 'Verb must be provided', + VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', + DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', + INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', + INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', + INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', + INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', + ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', + ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', + INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', + DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', + CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', + CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', + ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS: 'Activities must be non-null map objects', + STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', + OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', + ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', + SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', + RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', + MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', + RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', + RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', + DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', + DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', + DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', + VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0', + ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', + LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', + SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', + SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', + ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', + AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', + AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for an "agent".', + AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS: 'Invalid object with characteristics of a Group when an Agent was expected.', + GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', + MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', + GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', + GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', + ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', + AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT: 'If present, the "authority" property must be a non-null map object.', + GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', + CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', + CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', + CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ: 'Context Activities property values must be an array of Activity Objects or a single Activity Object.', + CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT: 'The Context Activities instances must be a non-null map object.', + CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT: 'If present, the "context" property must be a non-null map object.', + REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', + REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', + LANGUAGE_MUST_BE_STRING: 'The language property must be encoded as an RFC 5646 compliant string, but was not.', + OBJECT_MUST_BE_DEFINED: '"object" property must be provided.', + OBJECT_MUST_BE_NON_NULL_MAP_OBJECT: '"object" property must be a non-null map object.', + SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', + OBJECT_TYPE_MUST_BE_VALID_OPTION: 'object\'s "objectType" did not match a valid option', + IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', + ID_MUST_BE_VALID: 'Id was not a valid UUID', + STATEMENT_ARGUMENT_MUST_BE_PROVIDED: 'No statement argument provided.', + STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', + STATEMENT_MUST_BE_PARSED_CORRECTLY: 'Null or non-object statement value parsed from provided statment JSON.', + INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', + STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.' +}); + +export {xapiErrorLevels}; +export {xapiValidationErrors}; diff --git a/src/constants/general.js b/src/constants/general.js new file mode 100644 index 0000000..0a0fd99 --- /dev/null +++ b/src/constants/general.js @@ -0,0 +1,13 @@ +'use strict'; + +const xapiGeneral = Object.freeze({ + FIRST_REPORT_VERSTION : '1.0.0', + GROUP_AUTHORITY_AGENT_MEMBERS : 2, + INTERACTION_DEFINITION_TYPE : 'http://adlnet.gov/expapi/activities/cmi.interaction', + MAX_SCALED_VALUE : 1, + MIN_SCALED_VALUE : 0, + NO_INDEX_FOUND : -1, + NUMER_OF_SPECIFIED_IFI_PROPERTIES : 1 +}); + +export {xapiGeneral}; diff --git a/src/constants/interaction-types.js b/src/constants/interaction-types.js new file mode 100644 index 0000000..af3eced --- /dev/null +++ b/src/constants/interaction-types.js @@ -0,0 +1,27 @@ +'use strict'; + +export const interactionTypes = Object.freeze({ + CHOICE: 'choice', + FILL_IN: 'fill-in', + LIKERT: 'likert', + LONG_FILL_IN: 'long-fill-in', + MATCHING: 'matching', + NUMERIC: 'numeric', + OTHER: 'other', + PERFORMANCE: 'performance', + SEQUENCING: 'sequencing', + TRUE_FALSE: 'true-false' +}); + +export const xapiValidationInteractionTypes = Object.freeze([ + interactionTypes.CHOICE, + interactionTypes.FILL_IN, + interactionTypes.LIKERT, + interactionTypes.LONG_FILL_IN, + interactionTypes.MATCHING, + interactionTypes.NUMERIC, + interactionTypes.OTHER, + interactionTypes.PERFORMANCE, + interactionTypes.SEQUENCING, + interactionTypes.TRUE_FALSE +]); diff --git a/src/constants/properties.js b/src/constants/properties.js new file mode 100644 index 0000000..b8c2314 --- /dev/null +++ b/src/constants/properties.js @@ -0,0 +1,104 @@ +'use strict'; + +const properties = Object.freeze({ + ACCOUNT: 'account', + ACTIVITY: 'activity', + ACTOR: 'actor', + AGENT: 'agent', + ATTACHMENT: 'attachment', + ATTACHMENTS: 'attachments', + AUTHORITY: 'authority', + CATEGORY: 'category', + CHOICE: 'choice', + CHOICES: 'choices', + COMPLETION: 'completion', + CONTENT_TYPE: 'contentType', + CONTEXT_ACTIVITIES: 'contextActivities', + CONTEXT: 'context', + CORRECT_RESPONSES_PATTERN: 'correctResponsesPattern', + DATE_TIME: 'dateTime', + DEFINITION: 'definition', + DESCRIPTION: 'description', + DISPLAY: 'display', + DURATION: 'duration', + EXTENSIONS: 'extensions', + FILE_URL: 'fileUrl', + GROUP: 'group', + GROUPING: 'grouping', + HOME_PAGE: 'homePage', + ID: 'id', + INSTRUCTOR: 'instructor', + INTERACTION_COMPONENTS: 'interactionComponents', + INTERACTION_TYPE: 'interactionType', + LANGUAGE_MAP: 'languageMap', + LANGUAGE: 'language', + LENGTH: 'length', + LIKERT: 'likert', + MATCHING: 'matching', + MAX: 'max', + MBOX_SHA_1_SUM: 'mbox_sha1sum', + MBOX: 'mbox', + MEMBER: 'member', + MIN: 'min', + MORE_INFO: 'moreInfo', + NAME: 'name', + OBJECT_TYPE: 'objectType', + OBJECT: 'object', + OPEN_ID: 'openID', + OTHER: 'other', + PARENT: 'parent', + PERFORMANCE: 'performance', + PLATFORM: 'platform', + RAW: 'raw', + REGISTRATION: 'registration', + RESPONSE: 'response', + RESULT: 'result', + REVISION: 'revision', + SCALE: 'scale', + SCALED: 'scaled', + SCORE: 'score', + SEQUENCING: 'sequencing', + SHA2: 'sha2', + SOURCE: 'source', + STATEMENT_REF: 'statementRef', + STATEMENT: 'statement', + STEPS: 'steps', + STORED: 'stored', + SUB_CONTEXT: 'subContext', + SUCCESS: 'success', + TARGET: 'target', + TEAM: 'team', + TIMESTAMP: 'timestamp', + TYPE: 'type', + USAGE_TYPE: 'usageType', + VERB: 'verb', + VERSION: 'version' +}); + +const objectTypes = Object.freeze({ + GROUP: 'Group', + AGENT: 'Agent', + ACTIVITY: 'Activity', + STATEMENT_REF: 'StatementRef', + SUB_STATEMENT: 'SubStatement' +}); + +const xapiValidationIfiPropertyNames = Object.freeze([ + properties.ACCOUNT, + properties.MBOX_SHA_1_SUM, + properties.MBOX, + properties.OPEN_ID +]); + +const xApiValidObjectTypes = Object.freeze([ + objectTypes.GROUP, + objectTypes.AGENT, + objectTypes.ACTIVITY, + objectTypes.STATEMENT_REF, + objectTypes.SUB_STATEMENT +]); + +export {properties}; +export {objectTypes}; +export {xapiValidationIfiPropertyNames}; +export {xApiValidObjectTypes}; diff --git a/src/constants/regex.js b/src/constants/regex.js new file mode 100644 index 0000000..d2edb1d --- /dev/null +++ b/src/constants/regex.js @@ -0,0 +1,30 @@ +'use strict'; + +const xapiValidationRegex = Object.freeze({ + UUID: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, + ISO_8601_DURATION: /^P((\d+([\.,]\d+)?Y)?(\d+([\.,]\d+)?M)?(\d+([\.,]\d+)?W)?(\d+([\.,]\d+)?D)?)?(T(\d+([\.,]\d+)?H)?(\d+([\.,]\d+)?M)?(\d+([\.,]\d+)?S)?)?$/, + ISO_8601_DATE_TIME: /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/, + MAILTO_URI: /^mailto:/, + CONTAINS_WHITESPACE: /\s/g, + SEMVER_1_P_0_P_0: /^((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+))?$/, + BASE_64: /^(?:[A-Za-z0-9\+\/]{4})*(?:[A-Za-z0-9\+\/]{2}==|[A-Za-z0-9\+\/]{3}=|[A-Za-z0-9\+\/]{4})$/, + IRI: /^[a-z](?:[\-a-z0-9\+\.])*:(?:\/\/(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:])*@)?(?:\[(?:(?:(?:[0-9a-f]{1,4}:){6}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|::(?:[0-9a-f]{1,4}:){5}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:[0-9a-f]{1,4}:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3})|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|v[0-9a-f]+[\-a-z0-9\._~!\$&'\(\)\*\+,;=:]+)\]|(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}|(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=@])*)(?::[0-9]*)?(?:\/(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@]))*)*|\/(?:(?:(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@]))*)*)?|(?:(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@]))+)(?:\/(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@]))*)*|(?!(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@])))(?:\?(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@])|[\uE000-\uF8FF\uF0000-\uFFFFD|\u100000-\u10FFFD\/\?])*)?(?:\#(?:(?:%[0-9a-f][0-9a-f]|[\-a-z0-9\._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF\u10000-\u1FFFD\u20000-\u2FFFD\u30000-\u3FFFD\u40000-\u4FFFD\u50000-\u5FFFD\u60000-\u6FFFD\u70000-\u7FFFD\u80000-\u8FFFD\u90000-\u9FFFD\uA0000-\uAFFFD\uB0000-\uBFFFD\uC0000-\uCFFFD\uD0000-\uDFFFD\uE1000-\uEFFFD!\$&'\(\)\*\+,;=:@])|[\/\?])*)?$/i, + BCP_47: /^(?:(en-GB-oed|i-(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|tao|tay|tsu)|sgn-(?:BE-FR|BE-NL|CH-DE))|(art-lojban|cel-gaulish|no-(?:bok|nyn)|zh-(?:guoyu|hakka|min|min-nan|xiang)))$|^(x(?:-[0-9a-z]{1,8})+)$|^(?:((?:[a-z]{2,3}(?:(?:-[a-z]{3}){1,3})?)|[a-z]{4}|[a-z]{5,8})(?:-([a-z]{4}))?(?:-([a-z]{2}|[0-9]{3}))?((?:-(?:[a-z0-9]{5,8}|[0-9][a-z0-9]{3}))*)?((?:-[0-9a-wy-z](?:-[a-z0-9]{2,8}){1,})*)?(-x(?:-[0-9a-z]{1,8})+)?)$/i +}); + +const dateFormatRegexPositions = Object.freeze({ + YEAR: 1, + MONTH: 2, + DAY: 3, + HOUR: 4, + MINUTE: 5, + SECOND: 6, + MSECOND: 7, + ZONE: 8, + RELATIVE_TIME: 9, + TIME_ZONE_HOUR: 10, + TIME_ZONE_MINUTE: 11 +}); + +export {xapiValidationRegex}; +export {dateFormatRegexPositions}; diff --git a/src/constants/whitelists.js b/src/constants/whitelists.js new file mode 100644 index 0000000..9fdff6a --- /dev/null +++ b/src/constants/whitelists.js @@ -0,0 +1,111 @@ + 'use strict'; + import {properties} from '../constants/properties'; + + const xapiWhiteListProperties = Object.freeze({ + IFI: [ + properties.HOME_PAGE, + properties.NAME + ], + URI: [ + properties.ID, + properties.DISPLAY + ], + COMPONENT_ARRAY: [ + properties.ID, + properties.DESCRIPTION + ], + ACTIVITY_DEFINITION: [ + properties.NAME, + properties.DESCRIPTION, + properties.TYPE, + properties.MORE_INFO, + properties.EXTENSIONS, + properties.INTERACTION_TYPE, + properties.CORRECT_RESPONSES_PATTERN, + properties.CHOICES, + properties.SCALE, + properties.SOURCE, + properties.TARGET, + properties.STEPS + ], + ACTIVITY: [ + properties.OBJECT_TYPE, + properties.ID, + properties.DEFINITION + ], + STATEMENT_REF: [ + properties.ID, + properties.OBJECT_TYPE + ], + SCORE: [ + properties.SCALED, + properties.RAW, + properties.MIN, + properties.MAX + ], + RESULT: [ + properties.SCORE, + properties.SUCCESS, + properties.COMPLETION, + properties.RESPONSE, + properties.DURATION, + properties.EXTENSIONS + ], + ATTACHMENT: [ + properties.USAGE_TYPE, + properties.DISPLAY, + properties.DESCRIPTION, + properties.CONTENT_TYPE, + properties.LENGTH, + properties.SHA2, + properties.FILE_URL + ], + AGENT: [ + properties.OBJECT_TYPE, + properties.NAME, + properties.ACCOUNT, + properties.MBOX_SHA_1_SUM, + properties.MBOX, + properties.OPEN_ID + ], + GROUP: [ + properties.OBJECT_TYPE, + properties.NAME, + properties.MEMBER, + properties.ACCOUNT, + properties.MBOX_SHA_1_SUM, + properties.MBOX, + properties.OPEN_ID + ], + CONTEXT_ACTIVITIES: [ + properties.PARENT, + properties.GROUPING, + properties.CATEGORY, + properties.OTHER + ], + STATEMENT: [ + properties.ID, + properties.ACTOR, + properties.VERB, + properties.OBJECT, + properties.RESULT, + properties.CONTEXT, + properties.TIMESTAMP, + properties.STORED, + properties.AUTHORITY, + properties.VERSION, + properties.ATTACHMENTS + ], + SUB_STATEMENT: [ + properties.ACTOR, + properties.VERB, + properties.OBJECT, + properties.RESULT, + properties.CONTEXT, + properties.TIMESTAMP, + properties.ATTACHMENTS, + properties.OBJECT_TYPE + ] +}); + + export {xapiWhiteListProperties}; diff --git a/src/utils/utils.js b/src/utils/utils.js new file mode 100644 index 0000000..0894783 --- /dev/null +++ b/src/utils/utils.js @@ -0,0 +1,66 @@ +'use strict'; + +import {xapiValidationRegex} from '../constants/regex'; +import {objectTypes} from '../constants/properties'; + +const + IS_STRING = '[object String]', + IS_ARRAY = '[object Array]', + IS_BOOLEAN = '[object Boolean]', + IS_NUMBER = '[object Number]'; + +var toString = Object.prototype.toString; +var xapiValidationUtils; + +xapiValidationUtils = { + isString(obj) { + return toString.call(obj) === IS_STRING; + }, + + isObject(obj) { + return obj === Object(obj); + }, + + isArray: Array.isArray || function(obj) { + return toString.call(obj) === IS_ARRAY; + }, + + isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === IS_BOOLEAN; + }, + + isNumber(obj) { + return toString.call(obj) === IS_NUMBER; + }, + + isDefined(obj) { + return (obj !== null || obj !== undefined); + }, + + isNonNullMapObject(target) { + return this.isDefined(target) && this.isObject(target) && !this.isArray(target); + }, + + isValidLanguageTag(target) { + // TODO - use more precise 5646 handling, rather than this simplified BCP 47 regex, which combines RFC 5646 and RFC 4647. + return this.isDefined(target) && this.isString(target) && xapiValidationRegex.BCP_47.test(target); + }, + + addPropToTrace(trace, addendum) { + return this.isDefined(addendum) ? `${trace}.${addendum}` : trace; + }, + + addLookupToTrace(trace, key) { + return (!this.isDefined(key)) ? trace : (this.isNumber(key) ? `${trace}[${key}]` : `${trace}["${key}"]`); + }, + + localTraceToString(trace, addendum) { + return this.addPropToTrace(trace, addendum); + }, + + isGroup(actorOrGroup) { + return (actorOrGroup.member !== null && actorOrGroup.member !== undefined) || actorOrGroup.objectType === objectTypes.GROUP; + } +}; + +export {xapiValidationUtils}; diff --git a/src/xAPI-validator.js b/src/xAPI-validator.js new file mode 100644 index 0000000..827ccee --- /dev/null +++ b/src/xAPI-validator.js @@ -0,0 +1,1318 @@ +'use strict'; + +import {properties, objectTypes, xapiValidationIfiPropertyNames, xApiValidObjectTypes} from '/constants/properties'; +import {xapiWhiteListProperties} from '/constants/whitelists'; +import {xapiErrorLevels, xapiValidationErrors} from '/constants/errors'; +import {xapiValidationRegex, dateFormatRegexPositions} from '/constants/regex'; +import {xapiValidationInteractionTypes} from '/constants/interaction-types'; +import {xapiGeneral} from '/constants/general'; +import {xapiValidationUtils} from '/utils/utils'; + +var xapiValidator; + +function makeV1Report(instance, errors) { + var version; + + instance = instance || null; + errors = errors || null; + version = xapiGeneral.FIRST_REPORT_VERSTION; + return {instance, errors, version}; +} + +function makeV1SingleErrorReport(instance, error) { + return makeV1Report(instance, error === null || error === undefined ? [] : [error]); +} + +function validateAbsenceOfNonWhitelistedProperties(target, allowedProperties, trace, errors) { + var localErrors, localTrace, propertyName; + + localErrors = errors || []; + localTrace = trace || ''; + + for (propertyName in target) { + if (target.hasOwnProperty(propertyName) && allowedProperties.indexOf(propertyName) === xapiGeneral.NO_INDEX_FOUND) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, propertyName), + message: xapiValidationErrors.UNEXPECTED, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + return localErrors; +} + +function validatePropertyIsString(parent, propertyName, trace, errors, isRequired, violationType) { + var localErrors, localTrace, propValue, localViolationType; + + localErrors = errors || []; + localTrace = trace || ''; + propValue = parent[propertyName], + localViolationType = violationType || xapiErrorLevels.MUST_VIOLATION; + + if (propValue !== undefined) { + if (propValue === null || !xapiValidationUtils.isString(propValue)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_STRING}`, + level: localViolationType + }); + } + } else if (isRequired) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_PRESENT}`, + level: localViolationType + }); + } + + return localErrors; +} + +function validatePropertyIsUri(target, propertyName, trace, errors, isRequired) { + var localErrors, localTrace, propValue; + + localErrors = errors || []; + localTrace = trace || ''; + propValue = target[propertyName]; + + if (propValue !== undefined) { + if (propValue === null || !xapiValidationUtils.isString(propValue)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_URI_STRING}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else if (!xapiValidationRegex.IRI.test(propValue)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_IRI_STRING}`, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } + } else if (isRequired) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_URI_PRESENT}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + return localErrors; +} + +function validatePropertyIsUrl(target, propertyName, trace, errors, isRequired) { + // TODO - check whether a formal URL format definition is recommended/enforced for xAPI + return validatePropertyIsString(target, propertyName, trace, errors, isRequired); +} + +function validatePropertyIsBoolean(parent, propertyName, trace, errors, isRequired) { + var localErrors, localTrace, propValue; + + localErrors = errors || []; + localTrace = trace || ''; + propValue = parent[propertyName]; + + if (propValue !== undefined) { + if (propValue === null || !xapiValidationUtils.isBoolean(propValue)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_BOOLEAN}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } else if (isRequired) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_BOOLEAN_PRESENT}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + return localErrors; +} + +function validatePropertyIsNumber(parent, propertyName, trace, errors, isRequired) { + var localErrors, localTrace, propValue; + + localErrors = errors || []; + localTrace = trace || ''; + propValue = parent[propertyName]; + + if (propValue !== undefined) { + if (propValue === null || !xapiValidationUtils.isNumber(propValue)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_NUMBER}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } else if (isRequired) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_NUMBER_PRESENT}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + return localErrors; +} + +function validateIFIProperties(target, trace, errors) { + var localErrors, localTrace, accountTrace; + + localErrors = errors || []; + localTrace = trace || ''; + + if (target.mbox !== undefined && target.mbox !== null) { + if (!xapiValidationUtils.isString(target.mbox)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.MBOX), + message: xapiValidationErrors.MUST_BE_MBOX_URI, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else if (!xapiValidationRegex.MAILTO_URI.test(target.mbox)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.MBOX), + message: xapiValidationErrors.MUST_BE_VALID_MBOX_FORMAT, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + validatePropertyIsString(target, properties.MBOX_SHA_1_SUM, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsUri(target, properties.OPEN_ID, localTrace, localErrors, /*isRequired*/false); + + if (target.account !== undefined && target.account !== null) { + accountTrace = xapiValidationUtils.addPropToTrace(localTrace, properties.ACCOUNT); + validatePropertyIsUri(target.account, properties.HOME_PAGE,accountTrace, localErrors, /*isRequired*/true); + validatePropertyIsString(target.account, properties.NAME, accountTrace, localErrors, /*isRequired*/true); + validateAbsenceOfNonWhitelistedProperties(target.account, xapiWhiteListProperties.IFI, accountTrace, localErrors); + } + + return localErrors; +} + +function getIFIs(target) { + var ifis, propertiesLength, i, propName, propValue; + + ifis = []; + propertiesLength = xapiValidationIfiPropertyNames.length; + + if (target === null || target === undefined) { + return ifis; + } + + for (i = 0; i < propertiesLength; i += 1) { + propName = xapiValidationIfiPropertyNames[i]; + propValue = target[propName]; + + if (propValue !== undefined && propValue !== null) { + ifis.push({key: propName, value: propValue}); + } + } + + return ifis; +} + +function getIFICount(target) { + return getIFIs(target).length; +} + +function validateExtensions(extensions, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || [], + localTrace = trace || properties.EXTENSIONS; + + if (extensions === undefined) {return localErrors;} + + if (!xapiValidationUtils.isNonNullMapObject(extensions)) { + localErrors.push({ + trace: localTrace, + message: xapiValidationErrors.EXTENSIONS_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + // TODO - double-check what further enforceable constraints exist on extension object properties + return localErrors; +} + + function validateLanguageMap(languageMap, trace, errors) { + var localErrors, localTrace, propName, mappedValue; + + localErrors = errors || []; + localTrace = trace || properties.LANGUAGE_MAP; + + if (languageMap === undefined) {return localErrors;} + + if (!xapiValidationUtils.isNonNullMapObject(languageMap)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace), + message: xapiValidationErrors.LANGUAGE_MAPS_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + for (propName in languageMap) { + if (languageMap.hasOwnProperty(propName)) { + if (!xapiValidationUtils.isValidLanguageTag(propName)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, propName), + message: `${propName} ${xapiValidationErrors.LANGUAGE_MAP_KEY_INVALID}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + mappedValue = languageMap[propName]; + + if (mappedValue === null || mappedValue === undefined || !xapiValidationUtils.isString(mappedValue)) { + localErrors.push({ + trace: xapiValidationUtils.addLookupToTrace(localTrace, propName), + message: `${propName} ${xapiValidationErrors.LANGUAGE_MAP_KEY_MUST_BE_STRING}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + } + + return localErrors; + } + + function validateVerb(verb, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.VERB; + + if (verb === undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.VERB_MUST_BE_PROVIDED, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (!xapiValidationUtils.isNonNullMapObject(verb)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.VERB_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validatePropertyIsUri(verb, properties.ID, localTrace, localErrors, /*isRequired*/true); + + if (verb.display === undefined) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), + message: xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } else { + validateLanguageMap(verb.display, xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), localErrors); + } + + validateAbsenceOfNonWhitelistedProperties(verb, xapiWhiteListProperties.URI, localTrace, localErrors); + + return localErrors; + } + + function validateInteractionComponentArray(components, interactionType, allowedInteractionTypes, trace, errors) { + var localErrors, localTrace, isAllowedComponentType, ids, interactionComponent, componentsLength, perComponentTrace, i; + + localErrors = errors || []; + localTrace = trace || properties.INTERACTION_COMPONENTS; + isAllowedComponentType = allowedInteractionTypes.indexOf(interactionType) !== xapiGeneral.NO_INDEX_FOUND; + ids = []; + + + if (isAllowedComponentType && components !== undefined) { + if (components === null || !xapiValidationUtils.isArray(components)) { + localErrors.push({ + trace: localTrace, + message: xapiValidationErrors.INTERACTION_COMPONENT_SHOULD_BE_ARRAY, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + + } else { + componentsLength = components.length; + + for (i = 0; i < componentsLength; i += 1) { + interactionComponent = components[i]; + perComponentTrace = xapiValidationUtils.addLookupToTrace(localTrace, i); + + if (!xapiValidationUtils.isNonNullMapObject(interactionComponent)) { + localErrors.push({ + trace: perComponentTrace, + message: xapiValidationErrors.INTERACTION_COMPONENT_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else { + validatePropertyIsString(interactionComponent, properties.ID, perComponentTrace, localErrors, /*isRequired*/true, xapiErrorLevels.MUST_VIOLATION); + + if (ids.indexOf(interactionComponent.id) !== xapiGeneral.NO_INDEX_FOUND) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(perComponentTrace, properties.ID), + message: xapiValidationErrors.ID_MUST_BE_UNIQUE, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else { + ids.push(interactionComponent.id); + } + + if (interactionComponent.id && xapiValidationRegex.CONTAINS_WHITESPACE.test(interactionComponent.id)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(perComponentTrace, properties.ID), + message: xapiValidationErrors.ID_SHOULD_NOT_CONTAIN_WHITESPACES, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } + + validateLanguageMap(interactionComponent.description, xapiValidationUtils.addPropToTrace(perComponentTrace, properties.DESCRIPTION), localErrors); + validateAbsenceOfNonWhitelistedProperties(interactionComponent, xapiWhiteListProperties.COMPONENT_ARRAY, perComponentTrace, localErrors); + } + } + } + + } else if (interactionType && components) { + localErrors.push({ + trace: localTrace, + message: `${xapiValidationErrors.INTERACTION_TYPE_MUST_BE_VALID} ${interactionType}`, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } + + return localErrors; + } + + function validateActivityDefintion(definition, trace, errors) { + var localErrors, localTrace, correctResponsesPatternTrace, correctResponsesPatternLength, crpItem, i; + + localErrors = errors || []; + localTrace = trace || properties.DEFINITION; + correctResponsesPatternTrace = xapiValidationUtils.addPropToTrace(localTrace, properties.CORRECT_RESPONSES_PATTERN); + + if (!xapiValidationUtils.isNonNullMapObject(definition)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace), + message: xapiValidationErrors.DEFINITIONS_MUST_BE_OBJECTS, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validateLanguageMap(definition.name, xapiValidationUtils.addPropToTrace(localTrace, properties.NAME), localErrors); + validateLanguageMap(definition.description, xapiValidationUtils.addPropToTrace(localTrace, properties.DESCRIPTION), localErrors); + + validatePropertyIsUri(definition, properties.TYPE, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsUrl(definition, properties.MORE_INFO, localTrace, localErrors, /*isRequired*/false); + validateExtensions(definition.extensions, xapiValidationUtils.addPropToTrace(localTrace, properties.EXTENSIONS), localErrors); + + if (definition.interactionType !== undefined) { + if (definition.type !== xapiGeneral.INTERACTION_DEFINITION_TYPE) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.TYPE), + message: `${xapiValidationErrors.INTERACTION_ACTIVITY_SHOULD_HAVE} "${xapiGeneral.INTERACTION_DEFINITION_TYPE}"`, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } + + if (xapiValidationInteractionTypes.indexOf(definition.interactionType) === xapiGeneral.NO_INDEX_FOUND) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.INTERACTION_TYPE), + message: xapiValidationErrors.INTERACTION_TYPE_MUST_BE_CMI, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + if (definition.correctResponsesPattern !== undefined) { + if (!xapiValidationUtils.isArray(definition.correctResponsesPattern)) { + localErrors.push({ + trace: correctResponsesPatternTrace, + message: xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else { + correctResponsesPatternLength = definition.correctResponsesPattern.length; + + for (i = 0; i < correctResponsesPatternLength; i += 1) { + crpItem = definition.correctResponsesPattern[i]; + + if (crpItem === null || crpItem === undefined || !xapiValidationUtils.isString(crpItem)) { + localErrors.push({ + trace: xapiValidationUtils.addLookupToTrace(correctResponsesPatternTrace, i), + message: xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + } + } + + validateInteractionComponentArray( + definition.choices, + definition.interactionType, + [properties.CHOICE, properties.SEQUENCING], + xapiValidationUtils.addPropToTrace(localTrace, properties.CHOICES), + localErrors + ); + + validateInteractionComponentArray( + definition.scale, + definition.interactionType, + [properties.LIKERT], + xapiValidationUtils.addPropToTrace(localTrace, properties.SCALE), + localErrors + ); + + validateInteractionComponentArray( + definition.source, + definition.interactionType, + [properties.MATCHING], + xapiValidationUtils.addPropToTrace(localTrace, properties.SOURCE), + localErrors + ); + + validateInteractionComponentArray( + definition.target, + definition.interactionType, + [properties.MATCHING], + xapiValidationUtils.addPropToTrace(localTrace, properties.TARGET), + localErrors + ); + + validateInteractionComponentArray( + definition.steps, + definition.interactionType, + [properties.PERFORMANCE], + xapiValidationUtils.addPropToTrace(localTrace, properties.STEPS), + localErrors + ); + + validateAbsenceOfNonWhitelistedProperties(definition, xapiWhiteListProperties.ACTIVITY_DEFINITION, localTrace, localErrors); + return localErrors; +} + +function validateActivity(activity, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.ACTIVITY; + + if (!xapiValidationUtils.isNonNullMapObject(activity)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.ACTIVITIES_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validatePropertyIsUri(activity, properties.ID, localTrace, localErrors, /*isRequired*/true); + + if (activity.definition !== undefined) { + validateActivityDefintion( + activity.definition, + xapiValidationUtils.addPropToTrace(localTrace, properties.DEFINITION), + localErrors + ); + } + + validateAbsenceOfNonWhitelistedProperties(activity, xapiWhiteListProperties.ACTIVITY, localTrace, localErrors); + + return localErrors; +} + +function validateStatementRef(statementRef, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.STATEMENT_REF; + + if (!xapiValidationUtils.isNonNullMapObject(statementRef)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS, + level: xapiErrorLevels.MUST_VIOLATION + }); + return localErrors; + } + + + if (statementRef.objectType !== objectTypes.STATEMENT_REF) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.OBJECT_TYPE), + message: xapiValidationErrors.OBJECT_TYPE_MUST_BE_STATEMENT_REF, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (!statementRef.id || !xapiValidationRegex.UUID.test(statementRef.id)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.ID), + message: xapiValidationErrors.ID_MUST_BE_VALID_UUID_REF, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + validateAbsenceOfNonWhitelistedProperties(statementRef, xapiWhiteListProperties.STATEMENT_REF, localTrace, localErrors); + + return localErrors; +} + +function validateScore(score, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.SCORE; + + if (score === undefined) { + return localErrors; + } + + validatePropertyIsNumber(score, properties.SCALED, localTrace, localErrors, /*isRequired*/false); + + if (score.scaled !== undefined) { + if (score.scaled < xapiGeneral.MIN_SCALED_VALUE || score.scaled > xapiGeneral.MAX_SCALED_VALUE) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.SCALED), + message: xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + if (score.min !== undefined) { + validatePropertyIsNumber(score, properties.MIN, localTrace, localErrors, /*isRequired*/false); + + if (score.raw !== undefined && score.raw < score.min) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.RAW), + message: xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (score.max !== undefined && score.max < score.min) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.MAX), + message: xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + if (score.max !== undefined) { + validatePropertyIsNumber(score, properties.MAX, localTrace, localErrors, /*isRequired*/false); + + if (score.raw !== undefined && score.raw > score.max) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.RAW), + message: xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + validatePropertyIsNumber(score, properties.RAW, localTrace, localErrors, /*isRequired*/false); + validateAbsenceOfNonWhitelistedProperties(score, xapiWhiteListProperties.SCORE, localTrace, localErrors); + + return localErrors; +} + +function validateResult(result, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.RESULT; + + if (result === undefined) {return localErrors;} + + if (!xapiValidationUtils.isNonNullMapObject(result)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace), + message: xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validateScore(result.score, xapiValidationUtils.addPropToTrace(localTrace, properties.SCORE), localErrors); + validatePropertyIsBoolean(result, properties.SUCCESS, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsBoolean(result, properties.COMPLETION, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsString(result, properties.RESPONSE, localTrace, localErrors, /*isRequired*/false); + validateExtensions(result.extensions, xapiValidationUtils.addPropToTrace(localTrace, properties.EXTENSIONS), localErrors); + + if (result.duration !== undefined && (result.duration === null || !xapiValidationUtils.isString(result.duration) || !xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.DURATION), + message: xapiValidationErrors.DURATION_MUST_BE_VALID, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + validateAbsenceOfNonWhitelistedProperties(result, xapiWhiteListProperties.RESULT, localTrace, localErrors); + + return localErrors; +} + +function validatePropertyIsISO8601String(parent, propertyName, trace, errors) { + var localErrors, localTrace, matched, datetime; + + localErrors = errors || []; + localTrace = trace || properties.DATE_TIME; + datetime = parent[propertyName]; + + if (datetime === undefined) {return localErrors;} + + if (datetime === null || !xapiValidationUtils.isString(datetime)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: `${propertyName} ${xapiValidationErrors.MUST_BE_STRING}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + matched = xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime); + + if (matched) { + if (!dateIncludesZoneInformation(matched)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } + } else { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, propertyName), + message: xapiValidationErrors.DATE_MUST_BE_VALID, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + return localErrors; +} + +function validateVersion(version, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.VERSION; + + if (version === undefined) {return localErrors;} + + if (version === null || !xapiValidationUtils.isString(version) || !xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + return localErrors; +} + +function validateAttachmentObject(attachment, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.ATTACHMENT; + + if (!xapiValidationUtils.isNonNullMapObject(attachment)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (attachment.display === undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.DISPLAY), + message: xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED, + level: xapiErrorLevels.MUST_VIOLATION + }); + + } else { + validateLanguageMap(attachment.display, xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), localErrors); + } + + validateLanguageMap(attachment.description, xapiValidationUtils.addPropToTrace(localTrace, properties.DESCRIPTION), localErrors); + validatePropertyIsUri(attachment, properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, xapiErrorLevels.MUST_VIOLATION); + validatePropertyIsUri(attachment, properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, xapiErrorLevels.MUST_VIOLATION); + + // TODO - more complete validation for Internet Media Type via RFC 2046 + validatePropertyIsString(attachment, properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, xapiErrorLevels.MUST_VIOLATION); + + if (attachment.length === undefined || attachment.length === null || !xapiValidationUtils.isNumber(attachment.length) || (attachment.length % 1 !== 0)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.LENGTH), + message: xapiValidationErrors.LENGTH_MUST_BE_INTEGER, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (attachment.sha2 === undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.SHA2), + message: xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else if (attachment.sha2 === null || !xapiValidationUtils.isString(attachment.sha2) || !xapiValidationRegex.BASE_64.test(attachment.sha2)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.SHA2), + message: xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + validateAbsenceOfNonWhitelistedProperties(attachment, xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors); + return localErrors; +} + +function validateAttachments(attachments, trace, errors) { + var localErrors, localTrace, attachmentsLength, i; + + localErrors = errors || []; + localTrace = trace || properties.ATTACHMENTS; + + if (attachments === undefined) {return localErrors;} + + if (attachments === null || !xapiValidationUtils.isArray(attachments)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + attachmentsLength = attachments.length; + for (i = 0; i < attachmentsLength; i += 1) { + validateAttachmentObject(attachments[i], xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + } + + return localErrors; +} + +function validateAgent(agent, trace, errors) { + var localErrors, localTrace, ifiCount; + + localErrors = errors || []; + localTrace = trace || properties.AGENT; + + if (!xapiValidationUtils.isNonNullMapObject(agent)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + return localErrors; + } + + ifiCount = getIFICount(agent); + + if (ifiCount !== xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (agent.objectType === objectTypes.GROUP) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + validateIFIProperties(agent, localTrace, localErrors); + validatePropertyIsString(agent, properties.NAME, localTrace, localErrors, /*isRequired*/false); + + validateAbsenceOfNonWhitelistedProperties(agent, xapiWhiteListProperties.AGENT, localTrace, localErrors); + + return localErrors; +} + +function validateGroup(group, trace, errors) { + var localErrors, localTrace, memberTrace, ifiCount, numMembers, i; + + localErrors = errors || []; + localTrace = trace || properties.GROUP; + memberTrace = xapiValidationUtils.addPropToTrace(localTrace, properties.MEMBER); + + if (!xapiValidationUtils.isNonNullMapObject(group)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + ifiCount = getIFICount(group); + + if (ifiCount === 0) { + if (group.member === null || group.member === undefined) { + localErrors.push({ + trace: memberTrace, + message: xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } else if (ifiCount > xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + validateIFIProperties(group, localTrace, localErrors); + + validatePropertyIsString(group, properties.NAME, localTrace, localErrors, /*isRequired*/false); + + if (group.member !== undefined) { + if (group.member === null || !xapiValidationUtils.isArray(group.member)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.MEMBER), + message: xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else { + numMembers = group.member.length; + + for (i = 0; i < numMembers; i += 1) { + validateAgent(group.member[i], xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors); + } + } + } + + validateAbsenceOfNonWhitelistedProperties(group, xapiWhiteListProperties.GROUP, localTrace, localErrors); + + return localErrors; +} + +function validateActor(actor, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.ACTOR; + + if (actor === null || actor === undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.ACTOR_MUST_BE_PROVIDED, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (xapiValidationUtils.isGroup(actor)) { + validateGroup(actor, localTrace, localErrors); + } else { + validateAgent(actor, localTrace, localErrors); + } + + return localErrors; +} + +function validateAuthority(authority, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.AUTHORITY; + + if (authority === undefined) { + return localErrors; + } + + if (!xapiValidationUtils.isNonNullMapObject(authority)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + if (xapiValidationUtils.isGroup(authority)) { + validateGroup(authority, localTrace, localErrors); + if (!authority.member || !authority.member.length || authority.member.length !== xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.MEMBER), + message: xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } else { + validateAgent(authority, localTrace, localErrors); + } + + return localErrors; +} + +function validateContextActivitySubContext(subContext, trace, errors) { + var localErrors, localTrace, numActivities, i; + + localErrors = errors || []; + localTrace = trace || properties.SUB_CONTEXT; + + if (subContext === undefined) {return localErrors;} + + if (subContext === null) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else if (xapiValidationUtils.isArray(subContext)) { + numActivities = subContext.length; + for (i = 0; i < numActivities; i += 1) { + validateActivity(subContext[i], xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + } + } else if (xapiValidationUtils.isObject(subContext)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + + validateActivity(subContext, localTrace, localErrors); + } else { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ, + level: xapiErrorLevels.MUST_VIOLATION}); + } + return localErrors; +} + +function validateContextActivities(contextActivities, trace, errors) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.CONTEXT_ACTIVITIES; + + if (contextActivities === undefined) { + return localErrors; + } + + if (!xapiValidationUtils.isNonNullMapObject(contextActivities)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + return localErrors; + } + + validateContextActivitySubContext(contextActivities.parent, xapiValidationUtils.addPropToTrace(localTrace, properties.PARENT), localErrors); + validateContextActivitySubContext(contextActivities.grouping, xapiValidationUtils.addPropToTrace(localTrace, properties.GROUPING), localErrors); + validateContextActivitySubContext(contextActivities.category, xapiValidationUtils.addPropToTrace(localTrace, properties.CATEGORY), localErrors); + validateContextActivitySubContext(contextActivities.other, xapiValidationUtils.addPropToTrace(localTrace, properties.OTHER), localErrors); + + validateAbsenceOfNonWhitelistedProperties(contextActivities, xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors); + + return localErrors; +} + +function validateContext(context, trace, errors, statementObjectObjectType) { + var localErrors, localTrace; + + localErrors = errors || []; + localTrace = trace || properties.CONTEXT; + + if (context === undefined) {return localErrors;} + + if (!xapiValidationUtils.isNonNullMapObject(context)) { + localErrors.push({ + trace: localTrace, + message: xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (context.registration !== undefined && (context.registration === null || !xapiValidationUtils.isString(context.registration) || !xapiValidationRegex.UUID.test(context.registration))) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.REGISTRATION), + message: xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if ([objectTypes.GROUP, objectTypes.AGENT].indexOf(statementObjectObjectType) !== xapiGeneral.NO_INDEX_FOUND) { + if (context.revision !== undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.REVISION), + message: xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (context.platform !== undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.PLATFORM), + message: xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } + + validatePropertyIsString(context, properties.REVISION, localTrace, localErrors, /*isRequired*/false, xapiErrorLevels.MUST_VIOLATION); + validatePropertyIsString(context, properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, xapiErrorLevels.MUST_VIOLATION); + + if (context.team !== undefined) { + validateGroup(context.team, xapiValidationUtils.addPropToTrace(localTrace, properties.TEAM), localErrors); + } + + if (context.contextActivities !== undefined) { + validateContextActivities(context.contextActivities, xapiValidationUtils.addPropToTrace(localTrace, properties.CONTEXT_ACTIVITIES), localErrors); + } + + if (context.language !== undefined && !xapiValidationUtils.isValidLanguageTag(context.language)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.LANGUAGE), + message: xapiValidationErrors.LANGUAGE_MUST_BE_STRING, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (context.statement !== undefined) { + validateStatementRef(context.statement, xapiValidationUtils.addPropToTrace(localTrace, properties.STATEMENT), localErrors); + } + + if (context.instructor !== undefined) { + if (xapiValidationUtils.isGroup(context.instructor)) { + validateGroup(context.instructor, xapiValidationUtils.addPropToTrace(localTrace, properties.INSTRUCTOR), localErrors); + } else { + validateAgent(context.instructor, xapiValidationUtils.addPropToTrace(localTrace, properties.INSTRUCTOR), localErrors); + } + } + + validateExtensions(context.extensions, xapiValidationUtils.addPropToTrace(localTrace, properties.EXTENSIONS), localErrors); + validateAbsenceOfNonWhitelistedProperties( + context, + [ + properties.REGISTRATION, + properties.INSTRUCTOR, + properties.TEAM, + properties.CONTEXT_ACTIVITIES, + properties.REVISION, + properties.PLATFORM, + properties.LANGUAGE, + properties.STATEMENT, + properties.EXTENSIONS + ], + localTrace, + localErrors + ); + + return localErrors; +} + +function validateObject(object, trace, errors, isWithinSubStatement) { + var localErrors, localTrace, objectType; + + localErrors = errors || []; + localTrace = trace || properties.OBJECT; + + if (object === undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.OBJECT_MUST_BE_DEFINED, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (!xapiValidationUtils.isNonNullMapObject(object)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + validatePropertyIsString(object, properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, xapiErrorLevels.SHOULD_VIOLATION); + objectType = object.objectType || objectTypes.ACTIVITY; + + // TODO: Switch + if (objectType === objectTypes.ACTIVITY) { + validateActivity(object, localTrace, localErrors); + } else if (objectType === objectTypes.AGENT) { + validateAgent(object, localTrace, localErrors); + } else if (objectType === objectTypes.GROUP) { + validateGroup(object, localTrace, localErrors); + } else if (objectType === objectTypes.STATEMENT_REF) { + validateStatementRef(object, localTrace, localErrors); + } else if (objectType === objectTypes.SUB_STATEMENT) { + if (isWithinSubStatement) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.OBJECT_TYPE), + message: xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + validateStatement(object, localTrace, localErrors, /*isSubStatement*/true); + } else { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.OBJECT_TYPE), + message: `${xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION} ${xApiValidObjectTypes.toString()}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + return localErrors; +} + +function validateStatement(statement, trace, errors, isSubStatement) { + var localErrors, localTrace, statementObjectObjectType, whitelistedProperties; + + localErrors = errors || []; + localTrace = trace || properties.STATEMENT; + + whitelistedProperties = xapiWhiteListProperties.STATEMENT; + + if (!xapiValidationUtils.isNonNullMapObject(statement)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } + + if (!isSubStatement) { + if (statement.id === null || statement.id === undefined || !xapiValidationUtils.isString(statement.id)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.ID), + message: xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } else if (!xapiValidationRegex.UUID.test(statement.id)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.ID), + message: xapiValidationErrors.ID_MUST_BE_VALID, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } else { + whitelistedProperties = xapiWhiteListProperties.SUB_STATEMENT; + } + + validateActor(statement.actor, xapiValidationUtils.addPropToTrace(localTrace, properties.ACTOR), localErrors); + validateVerb(statement.verb, xapiValidationUtils.addPropToTrace(localTrace, properties.VERB), localErrors); + validateObject(statement.object, xapiValidationUtils.addPropToTrace(localTrace, properties.OBJECT), localErrors, isSubStatement); + validateResult(statement.result, xapiValidationUtils.addPropToTrace(localTrace, properties.RESULT), localErrors); + + statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : objectTypes.ACTIVITY; + + validateContext(statement.context, xapiValidationUtils.addPropToTrace(localTrace, properties.CONTEXT), localErrors, statementObjectObjectType); + validatePropertyIsISO8601String(statement, properties.TIMESTAMP, localTrace, localErrors); + validatePropertyIsISO8601String(statement, properties.STORED, localTrace, localErrors); + + validateAuthority(statement.authority, xapiValidationUtils.addPropToTrace(localTrace, properties.AUTHORITY), localErrors); + validateVersion(statement.version, xapiValidationUtils.addPropToTrace(localTrace, properties.VERSION), localErrors); + validateAttachments(statement.attachments, xapiValidationUtils.addPropToTrace(localTrace, properties.ATTACHMENTS), localErrors); + + validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors); + + return localErrors; +} + +function makeStatementReport(statement) { + var localErrors; + + localErrors = []; + validateStatement(statement, properties.STATEMENT, localErrors, /*isRequired*/false); + + return makeV1Report(statement, localErrors); +} + +function validateAmbiguousTypeStatement(statement) { + var statementObject; + + if (statement === undefined) { + return makeV1SingleErrorReport(/*instance*/null, { + trace: properties.STATEMENT, + message: xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (statement === null) { + return makeV1SingleErrorReport(/*instance*/null, { + trace: properties.STATEMENT, + message: xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + if (xapiValidationUtils.isString(statement)) { + try { + statementObject = JSON.parse(statement); + if (statementObject === null || !xapiValidationUtils.isObject(statementObject) || xapiValidationUtils.isArray(statementObject)) { + return makeV1SingleErrorReport(statementObject, { + trace: properties.STATEMENT, + message: xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } catch (e) { + return makeV1SingleErrorReport(statementObject, { + trace: properties.STATEMENT, + message: `${xapiValidationErrors.INVALID_JSON}: ${e.message}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + + return makeStatementReport(statementObject); + } + + if (xapiValidationUtils.isObject(statement) && !xapiValidationUtils.isArray(statement)) { + return makeStatementReport(statement); + } + + return makeV1SingleErrorReport(/*instance*/null, { + trace: properties.STATEMENT, + message: xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID, + level: xapiErrorLevels.MUST_VIOLATION + }); +} + +function dateIncludesZoneInformation(matched) { + return matched[dateFormatRegexPositions.ZONE] || + (matched[dateFormatRegexPositions.RELATIVE_TIME] && matched[dateFormatRegexPositions.TIME_ZONE_HOUR]); +} + +xapiValidator = { + validateStatement: validateAmbiguousTypeStatement +}; + +export default xapiValidator; +window.xapiValidator = xapiValidator; //FIXME diff --git a/xapiValidator.js b/src/xapiValidator-old.js similarity index 99% rename from xapiValidator.js rename to src/xapiValidator-old.js index b25fe8e..37ec62c 100644 --- a/xapiValidator.js +++ b/src/xapiValidator-old.js @@ -478,7 +478,7 @@ return localErrors; } - + function validatePropertyIsISO8601String(parent, propertyName, trace, errors) { var localErrors = errors || [], localTrace = trace || "datetime", @@ -503,7 +503,7 @@ return localErrors; } - + function validateVersion(version, trace, errors) { var localErrors = errors || [], @@ -583,6 +583,7 @@ } ifiCount = getIFICount(agent); + if (ifiCount !== 1) { localErrors.push(new ValidationError(localTraceToString(localTrace), "Exactly one Inverse Functional Identifier property must be specified.", MUST_VIOLATION)); } @@ -804,12 +805,12 @@ localTrace = trace || "statement", statementObjectObjectType, whitelistedProperties = ["id", "actor", "verb", "object", "result", "context", "timestamp", "stored", "authority", "version", "attachments"]; - + if (!isNonNullMapObject(statement)) { localErrors.push(new ValidationError(localTraceToString(localTrace), "Statements must be non-null map objects", MUST_VIOLATION)); return localErrors; } - + if (!isSubStatement) { if (statement.id === null || statement.id === undefined || !isString(statement.id)) { localErrors.push(new ValidationError(localTraceToString(localTrace, "id"), "Ids should be generated by the Activity Provider, and must be generated by the LRS", SHOULD_VIOLATION)); @@ -871,4 +872,4 @@ } exports.validateStatement = validateAmbiguousTypeStatement; -})); \ No newline at end of file +})); From cdf4a08e2c1016a90e50e1ea3a596bf0b1838311 Mon Sep 17 00:00:00 2001 From: elenatorro Date: Wed, 9 Nov 2016 20:20:16 +0100 Subject: [PATCH 02/12] gulp needed packages added --- package.json | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 0c3da03..fdb8367 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,28 @@ "main": "./xapiValidator", "author": "Zachary Pierce", "description": "A validator for Experience API (xAPI) statements", - "keywords":["xAPI", "validator", "lrs", "json", "TinCan"], + "keywords": [ + "xAPI", + "validator", + "lrs", + "json", + "TinCan" + ], "license": "MIT", "engines": { "node": ">=0.6.6" }, - "devDependencies":{ + "devDependencies": { + "browserify": "^13.1.1", "chai": "*", + "gulp": "^3.9.1", + "gulp-connect": "^5.0.0", + "gulp-livereload": "^3.8.1", + "gulp-sourcemaps": "^2.2.0", + "gulp-uglify": "^2.0.0", "mocha": "*", - "underscore": "*" + "underscore": "*", + "vinyl-buffer": "^1.0.0", + "vinyl-source-stream": "^1.1.0" } -} \ No newline at end of file +} From 04b7867a4672fa70c5f46f221af8c54dee4aa0ee Mon Sep 17 00:00:00 2001 From: elenatorro Date: Thu, 10 Nov 2016 10:21:38 +0100 Subject: [PATCH 03/12] FIXED: missing extensions whitelist, CHANGED: for loops to forEach and map loops, objectTypes switch instead of if-else --- constants/errors.js | 89 ----- lib/maps/xapiValidator.min.js.map | 2 +- lib/xapiValidator.js | 400 +++++++++++----------- lib/xapiValidator.min.js | 4 +- src/constants/errors.js | 126 +++---- src/constants/whitelists.js | 11 + src/xAPI-validator.js | 540 ++++++++++++++---------------- 7 files changed, 527 insertions(+), 645 deletions(-) delete mode 100644 constants/errors.js diff --git a/constants/errors.js b/constants/errors.js deleted file mode 100644 index 6b847ed..0000000 --- a/constants/errors.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; - -const xapiErrorLevels = Object.freeze({ - MAY_VIOLATION: 'MAY_VIOLATION', - MUST_VIOLATION: 'MUST_VIOLATION', - SHOULD_VIOLATION: 'SHOULD_VIOLATION' -}); - -const xapiValidationErrors = Object.freeze({ - UNEXPECTED: 'Unexpected property not permitted', - MUST_BE_STRING: 'property, if present, must be a string.', - MUST_BE_PRESENT: 'property was required to be a string but was absent.', - MUST_BE_URI_STRING: 'property, if present, must be a URI string.', - MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', - MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', - MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', - MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', - MUST_BE_NUMBER: 'property, if present, must be a Number.', - MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', - MUST_BE_MBOX_URI: 'mbox property was required to be a mailto URI string but was not a string at all.', - MUST_BE_VALID_MBOX_FORMAT: 'mbox property was required to be a mailto URI string but did not match the mailto format.', - EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', - LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', - LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', - LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', - VERB_MUST_BE_PROVIDED: 'Verb must be provided', - VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', - DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', - INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', - INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', - INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', - INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', - ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', - ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', - INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', - DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', - CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', - CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', - ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS: 'Activities must be non-null map objects', - STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', - OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', - ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', - SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', - RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', - MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', - RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', - RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', - DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', - DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', - DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', - VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0', - ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', - LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', - SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', - SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', - ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', - AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', - AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for an "agent".', - AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS: 'Invalid object with characteristics of a Group when an Agent was expected.', - GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', - MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', - GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', - GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', - ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', - AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT: 'If present, the "authority" property must be a non-null map object.', - GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', - CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', - CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', - CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ: 'Context Activities property values must be an array of Activity Objects or a single Activity Object.', - CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT: 'The Context Activities instances must be a non-null map object.', - CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT: 'If present, the "context" property must be a non-null map object.', - REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', - REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', - LANGUAGE_MUST_BE_STRING: 'The language property must be encoded as an RFC 5646 compliant string, but was not.', - OBJECT_MUST_BE_DEFINED: '"object" property must be provided.', - OBJECT_MUST_BE_NON_NULL_MAP_OBJECT: '"object" property must be a non-null map object.', - SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', - OBJECT_TYPE_MUST_BE_VALID_OPTION: 'object\'s "objectType" did not match a valid option', - IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', - ID_MUST_BE_VALID: 'Id was not a valid UUID', - STATEMENT_ARGUMENT_MUST_BE_PROVIDED: 'No statement argument provided.', - STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', - STATEMENT_MUST_BE_PARSED_CORRECTLY: 'Null or non-object statement value parsed from provided statment JSON.', - INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', - STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.' -}); - -export {xapiErrorLevels}; -export {xapiValidationErrors}; diff --git a/lib/maps/xapiValidator.min.js.map b/lib/maps/xapiValidator.min.js.map index 7f50b22..45bab25 100644 --- a/lib/maps/xapiValidator.min.js.map +++ b/lib/maps/xapiValidator.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["xapiValidator.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","beepBoop","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","Object","defineProperty","value","xapiErrorLevels","freeze","MAY_VIOLATION","MUST_VIOLATION","SHOULD_VIOLATION","xapiValidationErrors","UNEXPECTED","MUST_BE_STRING","MUST_BE_PRESENT","MUST_BE_URI_STRING","MUST_BE_URI_PRESENT","MUST_BE_IRI_STRING","MUST_BE_BOOLEAN","MUST_BE_BOOLEAN_PRESENT","MUST_BE_NUMBER","MUST_BE_NUMBER_PRESENT","MUST_BE_MBOX_URI","MUST_BE_VALID_MBOX_FORMAT","EXTENSIONS_MUST_NOT_BE_NULL","LANGUAGE_MAPS_MUST_NOT_BE_NULL","LANGUAGE_MAP_KEY_INVALID","LANGUAGE_MAP_KEY_MUST_BE_STRING","VERB_MUST_BE_PROVIDED","VERB_MUST_NOT_BE_NULL","DISPLAY_SHOULD_BE_PROVIDED","INTERACTION_ACTIVITY_SHOULD_HAVE","INTERACTION_COMPONENT_SHOULD_BE_ARRAY","INTERACTION_COMPONENT_MUST_NOT_BE_NULL","INTERACTION_TYPE_MUST_BE_CMI","ID_MUST_BE_UNIQUE","ID_SHOULD_NOT_CONTAIN_WHITESPACES","INTERACTION_TYPE_MUST_BE_VALID","DEFINITIONS_MUST_BE_OBJECTS","CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY","CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS","ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS","STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS","OBJECT_TYPE_MUST_BE_STATEMENT_REF","ID_MUST_BE_VALID_UUID_REF","SCALED_MUST_BE_BETWEEN_0_1","RAW_MUST_BE_GREATER_THAN_MIN","MAX_MUST_BE_GREATER_THAN_MIN","RAW_MUST_BE_LESS_THAN_MAX","RESULT_MUST_BE_MAP_OBJECT","DURATION_MUST_BE_VALID","DATE_SHOULD_INCLUDE_ZONE_INFORMATION","DATE_MUST_BE_VALID","VERSION_MUST_COMPLY_SEMANTIC_VERSIONING","ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS","LENGTH_MUST_BE_INTEGER","SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS","SHA2_MUST_CONTAIN_BASE_64_STRING","ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY","AGENT_MUST_BE_NON_NULL_MAP_OBJECT","AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED","AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS","GROUP_MUST_BE_NON_NULL_MAP_OBJECT","MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS","GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED","GROUP_MEMBER_MUST_BE_ARRAY","ACTOR_MUST_BE_PROVIDED","AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT","GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO","CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL","CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY","CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ","CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT","REGISTRATION_MUST_BE_UUID_STRING","REVISION_MUST_BE_AGENT_OR_GROUP","LANGUAGE_MUST_BE_STRING","OBJECT_MUST_BE_DEFINED","OBJECT_MUST_BE_NON_NULL_MAP_OBJECT","SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT","OBJECT_TYPE_MUST_BE_VALID_OPTION","IDS_SHOULD_BE_GENERATED_BY_LRS","ID_MUST_BE_VALID","STATEMENT_ARGUMENT_MUST_BE_PROVIDED","STATEMENT_MUST_NOT_BE_NULL","STATEMENT_MUST_BE_PARSED_CORRECTLY","INVALID_JSON","STATEMENT_ARGUMENT_IS_NOT_VALID","2","xapiGeneral","FIRST_REPORT_VERSTION","GROUP_AUTHORITY_AGENT_MEMBERS","INTERACTION_DEFINITION_TYPE","MAX_SCALED_VALUE","MIN_SCALED_VALUE","NO_INDEX_FOUND","NUMER_OF_SPECIFIED_IFI_PROPERTIES","3","interactionTypes","CHOICE","FILL_IN","LIKERT","LONG_FILL_IN","MATCHING","NUMERIC","OTHER","PERFORMANCE","SEQUENCING","TRUE_FALSE","xapiValidationInteractionTypes","4","properties","ACCOUNT","ACTIVITY","ACTOR","AGENT","ATTACHMENT","ATTACHMENTS","AUTHORITY","CATEGORY","CHOICES","COMPLETION","CONTENT_TYPE","CONTEXT_ACTIVITIES","CONTEXT","CORRECT_RESPONSES_PATTERN","DATE_TIME","DEFINITION","DESCRIPTION","DISPLAY","DURATION","EXTENSIONS","FILE_URL","GROUP","GROUPING","HOME_PAGE","ID","INSTRUCTOR","INTERACTION_COMPONENTS","INTERACTION_TYPE","LANGUAGE_MAP","LANGUAGE","LENGTH","MAX","MBOX_SHA_1_SUM","MBOX","MEMBER","MIN","MORE_INFO","NAME","OBJECT_TYPE","OBJECT","OPEN_ID","PARENT","PLATFORM","RAW","REGISTRATION","RESPONSE","RESULT","REVISION","SCALE","SCALED","SCORE","SHA2","SOURCE","STATEMENT_REF","STATEMENT","STEPS","STORED","SUB_CONTEXT","SUCCESS","TARGET","TEAM","TIMESTAMP","TYPE","USAGE_TYPE","VERB","VERSION","objectTypes","SUB_STATEMENT","xapiValidationIfiPropertyNames","xApiValidObjectTypes","5","xapiValidationRegex","UUID","ISO_8601_DURATION","ISO_8601_DATE_TIME","MAILTO_URI","CONTAINS_WHITESPACE","SEMVER_1_P_0_P_0","BASE_64","IRI","BCP_47","dateFormatRegexPositions","YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MSECOND","ZONE","RELATIVE_TIME","TIME_ZONE_HOUR","TIME_ZONE_MINUTE","6","xapiWhiteListProperties","undefined","_properties","IFI","URI","COMPONENT_ARRAY","ACTIVITY_DEFINITION","../constants/properties","7","makeV1Report","instance","errors","version","_general","makeV1SingleErrorReport","error","validateAbsenceOfNonWhitelistedProperties","target","allowedProperties","trace","localErrors","localTrace","propertyName","hasOwnProperty","indexOf","push","_utils","xapiValidationUtils","addPropToTrace","message","_errors","level","validatePropertyIsString","parent","isRequired","violationType","propValue","localViolationType","isString","localTraceToString","validatePropertyIsUri","_regex","test","validatePropertyIsUrl","validatePropertyIsBoolean","isBoolean","validatePropertyIsNumber","isNumber","validateIFIProperties","accountTrace","mbox","account","_whitelists","getIFIs","ifis","propertiesLength","propName","key","getIFICount","validateExtensions","extensions","isNonNullMapObject","validateLanguageMap","languageMap","mappedValue","isValidLanguageTag","addLookupToTrace","validateVerb","verb","display","validateInteractionComponentArray","components","interactionType","allowedInteractionTypes","isAllowedComponentType","ids","interactionComponent","componentsLength","perComponentTrace","isArray","id","description","validateActivityDefintion","definition","correctResponsesPatternTrace","correctResponsesPatternLength","crpItem","name","type","_interactionTypes","correctResponsesPattern","choices","scale","source","steps","validateActivity","activity","ACTIVITIES_MUST_NOT_BE_NULL","validateStatementRef","statementRef","objectType","validateScore","score","scaled","min","raw","max","validateResult","result","duration","validatePropertyIsISO8601String","matched","datetime","exec","dateIncludesZoneInformation","validateVersion","validateAttachmentObject","attachment","sha2","validateAttachments","attachments","attachmentsLength","validateAgent","agent","ifiCount","validateGroup","group","memberTrace","numMembers","member","validateActor","actor","isGroup","validateAuthority","authority","validateContextActivitySubContext","subContext","numActivities","isObject","validateContextActivities","contextActivities","grouping","category","other","validateContext","context","statementObjectObjectType","registration","revision","platform","PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP","team","language","statement","instructor","validateObject","object","isWithinSubStatement","validateStatement","toString","isSubStatement","whitelistedProperties","makeStatementReport","validateAmbiguousTypeStatement","statementObject","JSON","parse","xapiValidator","default","../constants/errors","../constants/general","../constants/interaction-types","../constants/regex","../constants/whitelists","../utils/utils","8","IS_STRING","IS_ARRAY","IS_BOOLEAN","IS_NUMBER","prototype","obj","Array","isDefined","addendum","actorOrGroup"],"mappings":"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","file":"../xapiValidator.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.beepBoop = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o _general.xapiGeneral.MAX_SCALED_VALUE) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCALED),\n message: _errors.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.min !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MIN, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (score.max !== undefined && score.max < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MAX),\n message: _errors.xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.max !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MAX, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw > score.max) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsNumber(score, _properties.properties.RAW, localTrace, localErrors, /*isRequired*/false);\n validateAbsenceOfNonWhitelistedProperties(score, _whitelists.xapiWhiteListProperties.SCORE, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateResult(result, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.RESULT;\n\n if (result === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(result)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace),\n message: _errors.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validateScore(result.score, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCORE), localErrors);\n validatePropertyIsBoolean(result, _properties.properties.SUCCESS, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsBoolean(result, _properties.properties.COMPLETION, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsString(result, _properties.properties.RESPONSE, localTrace, localErrors, /*isRequired*/false);\n validateExtensions(result.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n\n if (result.duration !== undefined && (result.duration === null || !_utils.xapiValidationUtils.isString(result.duration) || !_regex.xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DURATION),\n message: _errors.xapiValidationErrors.DURATION_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(result, _whitelists.xapiWhiteListProperties.RESULT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validatePropertyIsISO8601String(parent, propertyName, trace, errors) {\n var localErrors, localTrace, matched, datetime;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.DATE_TIME;\n datetime = parent[propertyName];\n\n if (datetime === undefined) {\n return localErrors;\n }\n\n if (datetime === null || !_utils.xapiValidationUtils.isString(datetime)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: propertyName + ' ' + _errors.xapiValidationErrors.MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n matched = _regex.xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime);\n\n if (matched) {\n if (!dateIncludesZoneInformation(matched)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n }\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateVersion(version, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.VERSION;\n\n if (version === undefined) {\n return localErrors;\n }\n\n if (version === null || !_utils.xapiValidationUtils.isString(version) || !_regex.xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateAttachmentObject(attachment, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(attachment)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (attachment.display === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.DISPLAY),\n message: _errors.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n validateLanguageMap(attachment.display, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DISPLAY), localErrors);\n }\n\n validateLanguageMap(attachment.description, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DESCRIPTION), localErrors);\n validatePropertyIsUri(attachment, _properties.properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsUri(attachment, _properties.properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n // TODO - more complete validation for Internet Media Type via RFC 2046\n validatePropertyIsString(attachment, _properties.properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (attachment.length === undefined || attachment.length === null || !_utils.xapiValidationUtils.isNumber(attachment.length) || attachment.length % 1 !== 0) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LENGTH),\n message: _errors.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (attachment.sha2 === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (attachment.sha2 === null || !_utils.xapiValidationUtils.isString(attachment.sha2) || !_regex.xapiValidationRegex.BASE_64.test(attachment.sha2)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(attachment, _whitelists.xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors);\n return localErrors;\n}\n\nfunction validateAttachments(attachments, trace, errors) {\n var localErrors, localTrace, attachmentsLength, i;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENTS;\n\n if (attachments === undefined) {\n return localErrors;\n }\n\n if (attachments === null || !_utils.xapiValidationUtils.isArray(attachments)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n attachmentsLength = attachments.length;\n for (i = 0; i < attachmentsLength; i += 1) {\n validateAttachmentObject(attachments[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAgent(agent, trace, errors) {\n var localErrors, localTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AGENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(agent)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n ifiCount = getIFICount(agent);\n\n if (ifiCount !== _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (agent.objectType === _properties.objectTypes.GROUP) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(agent, localTrace, localErrors);\n validatePropertyIsString(agent, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n validateAbsenceOfNonWhitelistedProperties(agent, _whitelists.xapiWhiteListProperties.AGENT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateGroup(group, trace, errors) {\n var localErrors, localTrace, memberTrace, ifiCount, numMembers, i;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.GROUP;\n memberTrace = _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MEMBER);\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(group)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n ifiCount = getIFICount(group);\n\n if (ifiCount === 0) {\n if (group.member === null || group.member === undefined) {\n localErrors.push({\n trace: memberTrace,\n message: _errors.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else if (ifiCount > _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(group, localTrace, localErrors);\n\n validatePropertyIsString(group, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n if (group.member !== undefined) {\n if (group.member === null || !_utils.xapiValidationUtils.isArray(group.member)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n numMembers = group.member.length;\n\n for (i = 0; i < numMembers; i += 1) {\n validateAgent(group.member[i], _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors);\n }\n }\n }\n\n validateAbsenceOfNonWhitelistedProperties(group, _whitelists.xapiWhiteListProperties.GROUP, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateActor(actor, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ACTOR;\n\n if (actor === null || actor === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (_utils.xapiValidationUtils.isGroup(actor)) {\n validateGroup(actor, localTrace, localErrors);\n } else {\n validateAgent(actor, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAuthority(authority, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AUTHORITY;\n\n if (authority === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(authority)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n if (_utils.xapiValidationUtils.isGroup(authority)) {\n validateGroup(authority, localTrace, localErrors);\n if (!authority.member || !authority.member.length || authority.member.length !== _general.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n validateAgent(authority, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateContextActivitySubContext(subContext, trace, errors) {\n var localErrors, localTrace, numActivities, i;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.SUB_CONTEXT;\n\n if (subContext === undefined) {\n return localErrors;\n }\n\n if (subContext === null) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (_utils.xapiValidationUtils.isArray(subContext)) {\n numActivities = subContext.length;\n for (i = 0; i < numActivities; i += 1) {\n validateActivity(subContext[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n }\n } else if (_utils.xapiValidationUtils.isObject(subContext)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n\n validateActivity(subContext, localTrace, localErrors);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,\n level: _errors.xapiErrorLevels.MUST_VIOLATION });\n }\n return localErrors;\n}\n\nfunction validateContextActivities(contextActivities, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT_ACTIVITIES;\n\n if (contextActivities === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(contextActivities)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n validateContextActivitySubContext(contextActivities.parent, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.PARENT), localErrors);\n validateContextActivitySubContext(contextActivities.grouping, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.GROUPING), localErrors);\n validateContextActivitySubContext(contextActivities.category, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CATEGORY), localErrors);\n validateContextActivitySubContext(contextActivities.other, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OTHER), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(contextActivities, _whitelists.xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateContext(context, trace, errors, statementObjectObjectType) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT;\n\n if (context === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(context)) {\n localErrors.push({\n trace: localTrace,\n message: _errors.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (context.registration !== undefined && (context.registration === null || !_utils.xapiValidationUtils.isString(context.registration) || !_regex.xapiValidationRegex.UUID.test(context.registration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REGISTRATION),\n message: _errors.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if ([_properties.objectTypes.GROUP, _properties.objectTypes.AGENT].indexOf(statementObjectObjectType) !== _general.xapiGeneral.NO_INDEX_FOUND) {\n if (context.revision !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REVISION),\n message: _errors.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.platform !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.PLATFORM),\n message: _errors.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsString(context, _properties.properties.REVISION, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsString(context, _properties.properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (context.team !== undefined) {\n validateGroup(context.team, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.TEAM), localErrors);\n }\n\n if (context.contextActivities !== undefined) {\n validateContextActivities(context.contextActivities, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT_ACTIVITIES), localErrors);\n }\n\n if (context.language !== undefined && !_utils.xapiValidationUtils.isValidLanguageTag(context.language)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LANGUAGE),\n message: _errors.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.statement !== undefined) {\n validateStatementRef(context.statement, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.STATEMENT), localErrors);\n }\n\n if (context.instructor !== undefined) {\n if (_utils.xapiValidationUtils.isGroup(context.instructor)) {\n validateGroup(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n } else {\n validateAgent(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n }\n }\n\n validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n validateAbsenceOfNonWhitelistedProperties(context, [_properties.properties.REGISTRATION, _properties.properties.INSTRUCTOR, _properties.properties.TEAM, _properties.properties.CONTEXT_ACTIVITIES, _properties.properties.REVISION, _properties.properties.PLATFORM, _properties.properties.LANGUAGE, _properties.properties.STATEMENT, _properties.properties.EXTENSIONS], localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateObject(object, trace, errors, isWithinSubStatement) {\n var localErrors, localTrace, objectType;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.OBJECT;\n\n if (object === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(object)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION);\n objectType = object.objectType || _properties.objectTypes.ACTIVITY;\n\n // TODO: Switch\n if (objectType === _properties.objectTypes.ACTIVITY) {\n validateActivity(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.AGENT) {\n validateAgent(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.GROUP) {\n validateGroup(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.STATEMENT_REF) {\n validateStatementRef(object, localTrace, localErrors);\n } else if (objectType === _properties.objectTypes.SUB_STATEMENT) {\n if (isWithinSubStatement) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateStatement(object, localTrace, localErrors, /*isSubStatement*/true);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(),\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n return localErrors;\n}\n\nfunction validateStatement(statement, trace, errors, isSubStatement) {\n var localErrors, localTrace, statementObjectObjectType, whitelistedProperties;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.STATEMENT;\n\n whitelistedProperties = _whitelists.xapiWhiteListProperties.STATEMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(statement)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!isSubStatement) {\n if (statement.id === null || statement.id === undefined || !_utils.xapiValidationUtils.isString(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n } else if (!_regex.xapiValidationRegex.UUID.test(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.ID_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n whitelistedProperties = _whitelists.xapiWhiteListProperties.SUB_STATEMENT;\n }\n\n validateActor(statement.actor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ACTOR), localErrors);\n validateVerb(statement.verb, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERB), localErrors);\n validateObject(statement.object, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OBJECT), localErrors, isSubStatement);\n validateResult(statement.result, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RESULT), localErrors);\n\n statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : _properties.objectTypes.ACTIVITY;\n\n validateContext(statement.context, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT), localErrors, statementObjectObjectType);\n validatePropertyIsISO8601String(statement, _properties.properties.TIMESTAMP, localTrace, localErrors);\n validatePropertyIsISO8601String(statement, _properties.properties.STORED, localTrace, localErrors);\n\n validateAuthority(statement.authority, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.AUTHORITY), localErrors);\n validateVersion(statement.version, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERSION), localErrors);\n validateAttachments(statement.attachments, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ATTACHMENTS), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction makeStatementReport(statement) {\n var localErrors;\n\n localErrors = [];\n validateStatement(statement, _properties.properties.STATEMENT, localErrors, /*isRequired*/false);\n\n return makeV1Report(statement, localErrors);\n}\n\nfunction validateAmbiguousTypeStatement(statement) {\n var statementObject;\n\n if (statement === undefined) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (statement === null) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (_utils.xapiValidationUtils.isString(statement)) {\n try {\n statementObject = JSON.parse(statement);\n if (statementObject === null || !_utils.xapiValidationUtils.isObject(statementObject) || _utils.xapiValidationUtils.isArray(statementObject)) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } catch (e) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.INVALID_JSON + ': ' + e.message,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return makeStatementReport(statementObject);\n }\n\n if (_utils.xapiValidationUtils.isObject(statement) && !_utils.xapiValidationUtils.isArray(statement)) {\n return makeStatementReport(statement);\n }\n\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n}\n\nfunction dateIncludesZoneInformation(matched) {\n return matched[_regex.dateFormatRegexPositions.ZONE] || matched[_regex.dateFormatRegexPositions.RELATIVE_TIME] && matched[_regex.dateFormatRegexPositions.TIME_ZONE_HOUR];\n}\n\nxapiValidator = {\n validateStatement: validateAmbiguousTypeStatement\n};\n\nexports.default = xapiValidator;\n\nwindow.xapiValidator = xapiValidator;\n\n},{\"../constants/errors\":1,\"../constants/general\":2,\"../constants/interaction-types\":3,\"../constants/properties\":4,\"../constants/regex\":5,\"../constants/whitelists\":6,\"../utils/utils\":8}],8:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.xapiValidationUtils = undefined;\n\nvar _regex = require('../constants/regex');\n\nvar _properties = require('../constants/properties');\n\nvar IS_STRING = '[object String]',\n IS_ARRAY = '[object Array]',\n IS_BOOLEAN = '[object Boolean]',\n IS_NUMBER = '[object Number]';\n\nvar toString = Object.prototype.toString;\nvar xapiValidationUtils;\n\nexports.xapiValidationUtils = xapiValidationUtils = {\n isString: function isString(obj) {\n return toString.call(obj) === IS_STRING;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n\n\n isArray: Array.isArray || function (obj) {\n return toString.call(obj) === IS_ARRAY;\n },\n\n isBoolean: function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === IS_BOOLEAN;\n },\n isNumber: function isNumber(obj) {\n return toString.call(obj) === IS_NUMBER;\n },\n isDefined: function isDefined(obj) {\n return obj !== null || obj !== undefined;\n },\n isNonNullMapObject: function isNonNullMapObject(target) {\n return this.isDefined(target) && this.isObject(target) && !this.isArray(target);\n },\n isValidLanguageTag: function isValidLanguageTag(target) {\n // TODO - use more precise 5646 handling, rather than this simplified BCP 47 regex, which combines RFC 5646 and RFC 4647.\n return this.isDefined(target) && this.isString(target) && _regex.xapiValidationRegex.BCP_47.test(target);\n },\n addPropToTrace: function addPropToTrace(trace, addendum) {\n return this.isDefined(addendum) ? trace + '.' + addendum : trace;\n },\n addLookupToTrace: function addLookupToTrace(trace, key) {\n return !this.isDefined(key) ? trace : this.isNumber(key) ? trace + '[' + key + ']' : trace + '[\"' + key + '\"]';\n },\n localTraceToString: function localTraceToString(trace, addendum) {\n return this.addPropToTrace(trace, addendum);\n },\n isGroup: function isGroup(actorOrGroup) {\n return actorOrGroup.member !== null && actorOrGroup.member !== undefined || actorOrGroup.objectType === _properties.objectTypes.GROUP;\n }\n};\n\nexports.xapiValidationUtils = xapiValidationUtils;\n\n},{\"../constants/properties\":4,\"../constants/regex\":5}]},{},[7])(7)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjb25zdGFudHMvZXJyb3JzLmpzIiwiY29uc3RhbnRzL2dlbmVyYWwuanMiLCJjb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJjb25zdGFudHMvcHJvcGVydGllcy5qcyIsImNvbnN0YW50cy9yZWdleC5qcyIsImNvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIiwidXRpbHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7QUFFQSxJQUFNLGtCQUFrQixPQUFPLE1BQVAsQ0FBYztBQUNwQyxpQkFBa0IsZUFEa0I7QUFFcEMsa0JBQWtCLGdCQUZrQjtBQUdwQyxvQkFBa0I7QUFIa0IsQ0FBZCxDQUF4Qjs7QUFNQSxJQUFNLHVCQUF1QixPQUFPLE1BQVAsQ0FBYztBQUN6QyxjQUFrRCxtQ0FEVDtBQUV6QyxrQkFBa0QseUNBRlQ7QUFHekMsbUJBQWtELHNEQUhUO0FBSXpDLHNCQUFrRCw2Q0FKVDtBQUt6Qyx1QkFBa0QsMERBTFQ7QUFNekMsc0JBQWtELHVFQU5UO0FBT3pDLG1CQUFrRCwwQ0FQVDtBQVF6QywyQkFBa0QsdURBUlQ7QUFTekMsa0JBQWtELHlDQVRUO0FBVXpDLDBCQUFrRCxzREFWVDtBQVd6QyxvQkFBa0QsbUZBWFQ7QUFZekMsNkJBQWtELDJGQVpUO0FBYXpDLCtCQUFrRCxvRUFiVDtBQWN6QyxrQ0FBa0QsMkRBZFQ7QUFlekMsNEJBQWtELDRDQWZUO0FBZ0J6QyxtQ0FBa0QseURBaEJUO0FBaUJ6Qyx5QkFBa0QsdUJBakJUO0FBa0J6Qyx5QkFBa0QsaURBbEJUO0FBbUJ6Qyw4QkFBa0Qsd0NBbkJUO0FBb0J6QyxvQ0FBa0QsaUVBcEJUO0FBcUJ6Qyx5Q0FBa0Qsb0VBckJUO0FBc0J6QywwQ0FBa0QsNEVBdEJUO0FBdUJ6QyxnQ0FBa0QsZ0ZBdkJUO0FBd0J6QyxxQkFBa0Qsd0VBeEJUO0FBeUJ6QyxxQ0FBa0QseUVBekJUO0FBMEJ6QyxrQ0FBa0Qsd0dBMUJUO0FBMkJ6QywrQkFBa0Qsa0RBM0JUO0FBNEJ6QywyQ0FBa0QsOEVBNUJUO0FBNkJ6Qyw2Q0FBa0Qsa0RBN0JUO0FBOEJ6QywyQ0FBa0QseUNBOUJUO0FBK0J6Qyw4Q0FBa0QscURBL0JUO0FBZ0N6QyxxQ0FBa0QscUZBaENUO0FBaUN6Qyw2QkFBa0Qsa0ZBakNUO0FBa0N6Qyw4QkFBa0QsK0RBbENUO0FBbUN6QyxnQ0FBa0Qsd0ZBbkNUO0FBb0N6QyxnQ0FBa0Qsd0ZBcENUO0FBcUN6Qyw2QkFBa0QscUZBckNUO0FBc0N6Qyw2QkFBa0QsNkNBdENUO0FBdUN6QywwQkFBa0Qsd0VBdkNUO0FBd0N6Qyx3Q0FBa0QsbUZBeENUO0FBeUN6QyxzQkFBa0QsNEVBekNUO0FBMEN6QywyQ0FBa0Qsa0ZBMUNUO0FBMkN6Qyw0Q0FBa0Qsc0RBM0NUO0FBNEN6QywwQkFBa0QsMERBNUNUO0FBNkN6QywrQ0FBa0Qsd0RBN0NUO0FBOEN6QyxvQ0FBa0QsNERBOUNUO0FBK0N6QyxzQ0FBa0QseUNBL0NUO0FBZ0R6QyxxQ0FBa0QsdUNBaERUO0FBaUR6QywwQ0FBa0Qsc0ZBakRUO0FBa0R6Qyw2Q0FBa0QsNEVBbERUO0FBbUR6QyxxQ0FBa0QsdUNBbkRUO0FBb0R6QyxnREFBa0QsMERBcERUO0FBcUR6QywwQ0FBa0QscUZBckRUO0FBc0R6Qyw4QkFBa0QsNkRBdERUO0FBdUR6QywwQkFBa0QseUJBdkRUO0FBd0R6Qyx5Q0FBa0QscUVBeERUO0FBeUR6Qyw2Q0FBa0Qsc0lBekRUO0FBMER6Qyx1Q0FBa0Qsd0RBMURUO0FBMkR6Qyx5Q0FBa0QscUhBM0RUO0FBNER6QyxvREFBa0Qsc0dBNURUO0FBNkR6QyxrREFBa0QsaUVBN0RUO0FBOER6QyxzQ0FBa0QsbUVBOURUO0FBK0R6QyxvQ0FBa0QsOERBL0RUO0FBZ0V6QyxtQ0FBa0QseUZBaEVUO0FBaUV6QywyQkFBa0QscUZBakVUO0FBa0V6QywwQkFBa0QscUNBbEVUO0FBbUV6QyxzQ0FB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NkJELE1BN0JDLEVBNkJPO0FBQ3pCO0FBQ0EsV0FBTyxLQUFLLFNBQUwsQ0FBZSxNQUFmLEtBQTBCLEtBQUssUUFBTCxDQUFjLE1BQWQsQ0FBMUIsSUFBbUQsMkJBQW9CLE1BQXBCLENBQTJCLElBQTNCLENBQWdDLE1BQWhDLENBQTFEO0FBQ0QsR0FoQ21CO0FBa0NwQixnQkFsQ29CLDBCQWtDTCxLQWxDSyxFQWtDRSxRQWxDRixFQWtDWTtBQUM5QixXQUFPLEtBQUssU0FBTCxDQUFlLFFBQWYsSUFBOEIsS0FBOUIsU0FBdUMsUUFBdkMsR0FBb0QsS0FBM0Q7QUFDRCxHQXBDbUI7QUFzQ3BCLGtCQXRDb0IsNEJBc0NILEtBdENHLEVBc0NJLEdBdENKLEVBc0NTO0FBQzNCLFdBQVEsQ0FBQyxLQUFLLFNBQUwsQ0FBZSxHQUFmLENBQUYsR0FBeUIsS0FBekIsR0FBa0MsS0FBSyxRQUFMLENBQWMsR0FBZCxJQUF3QixLQUF4QixTQUFpQyxHQUFqQyxTQUE2QyxLQUE3QyxVQUF1RCxHQUF2RCxPQUF6QztBQUNELEdBeENtQjtBQTBDcEIsb0JBMUNvQiw4QkEwQ0QsS0ExQ0MsRUEwQ00sUUExQ04sRUEwQ2dCO0FBQ2xDLFdBQU8sS0FBSyxjQUFMLENBQW9CLEtBQXBCLEVBQTJCLFFBQTNCLENBQVA7QUFDRCxHQTVDbUI7QUE4Q3BCLFNBOUNvQixtQkE4Q1osWUE5Q1ksRUE4Q0U7QUFDcEIsV0FBUSxhQUFhLE1BQWIsS0FBd0IsSUFBeEIsSUFBZ0MsYUFBYSxNQUFiLEtBQXdCLFNBQXpELElBQXVFLGFBQWEsVUFBYixLQUE0Qix3QkFBWSxLQUF0SDtBQUNEO0FBaERtQixDQUF0Qjs7UUFtRFEsbUIsR0FBQSxtQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlFcnJvckxldmVscyA9IE9iamVjdC5mcmVlemUoe1xuICBNQVlfVklPTEFUSU9OOiAgICAnTUFZX1ZJT0xBVElPTicsXG4gIE1VU1RfVklPTEFUSU9OOiAgICdNVVNUX1ZJT0xBVElPTicsXG4gIFNIT1VMRF9WSU9MQVRJT046ICdTSE9VTERfVklPTEFUSU9OJ1xufSk7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVORVhQRUNURUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgcHJvcGVydHkgbm90IHBlcm1pdHRlZCcsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX1VSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIFVSSSBzdHJpbmcuJyxcbiAgTVVTVF9CRV9VUklfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgVVJJIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX0JPT0xFQU46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIEJvb2xlYW4uJyxcbiAgTVVTVF9CRV9CT09MRUFOX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgQm9vbGVhbiBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX05VTUJFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIE51bWJlci4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9NQk9YX1VSSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgd2FzIG5vdCBhIHN0cmluZyBhdCBhbGwuJyxcbiAgTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBFWFRFTlNJT05TX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgZXh0ZW5zaW9ucyBwcm9wZXJ0eSBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBMQU5HVUFHRV9NQVBTX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICdMYW5ndWFnZSBNYXBzLCB3aGVuIHByZXNlbnQsIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBMQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdrZXksIExhbmd1YWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gUkZDIDU2NDYnLFxuICBMQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICdrZXk6IExhbmd1YWdlIE1hcCB2YWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcsIGJ1dCB3YXMgbm90JyxcbiAgVkVSQl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBtdXN0IGJlIHByb3ZpZGVkJyxcbiAgVkVSQl9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBESVNQTEFZX1NIT1VMRF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICAgICAgICAgICdcImRpc3BsYXlcIiBwcm9wZXJ0eSBzaG91bGQgYmUgcHJvdmlkZWQuJyxcbiAgSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkU6ICAgICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gQWN0aXZpdHkgRGVmaW5pdGlvbnMgc2hvdWxkIGhhdmUgYSB0eXBlIHByb3BlcnR5IG9mJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX1NIT1VMRF9CRV9BUlJBWTogICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkuJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBtZW1iZXIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfQ01JOiAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJpbnRlcmFjdGlvblR5cGVcIiB2YWx1ZSBtdXN0IGJlIGEgQ01JIGludGVyYWN0aW9uIHR5cGUgb3B0aW9uLicsXG4gIElEX01VU1RfQkVfVU5JUVVFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBlYWNoIGludGVyYWN0aW9uIGNvbXBvbmVudCBhcnJheScsXG4gIElEX1NIT1VMRF9OT1RfQ09OVEFJTl9XSElURVNQQUNFUzogICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG9uIGludGVyYWN0aW9uIGNvbXBvbmVudHMgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlc3BhY2UnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIHByb3BlcnR5IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXNlbnQgaW50ZXJhY3Rpb25UeXBlIG9mOiAnLFxuICBERUZJTklUSU9OU19NVVNUX0JFX09CSkVDVFM6ICAgICAgICAgICAgICAgICAgICAgICdcImRlZmluaXRpb25zXCIsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBtYXAgb2JqZWN0cycsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9BUlJBWTogICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuXCIgdmFsdWUgbXVzdCBiZSBhbiBBcnJheSBvZiBzdHJpbmdzLicsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9TVFJJTkdTOiAgICAgICAgJ1wiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiBpdGVtcyBtdXN0IGJlIHN0cmluZ3MuJyxcbiAgQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAgICAnQWN0aXZpdGllcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAnU3RhdGVtZW50UmVmIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgT0JKRUNUX1RZUEVfTVVTVF9CRV9TVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAgICAnXCJvYmplY3RUeXBlXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBcIlN0YXRlbWVudFJlZlwiIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRF9VVUlEX1JFRjogICAgICAgICAgICAgICAgICAgICAgICAnXCJpZFwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgYSB2YWxpZCBVVUlEIHN0cmluZyBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIFNDQUxFRF9NVVNUX0JFX0JFVFdFRU5fMF8xOiAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBzY2FsZWQgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnLFxuICBSQVdfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBNQVhfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwibWF4XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSBtYXggcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBSQVdfTVVTVF9CRV9MRVNTX1RIQU5fTUFYOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWF4XCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiBtYXgnLFxuICBSRVNVTFRfTVVTVF9CRV9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgcmVzdWx0IG11c3QgYmUgYSBtYXAgb2JqZWN0JyxcbiAgRFVSQVRJT05fTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiZHVyYXRpb25cIiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGFuIElTTyA4NjAxIGR1cmF0aW9uJyxcbiAgREFURV9TSE9VTERfSU5DTFVERV9aT05FX0lORk9STUFUSU9OOiAgICAgICAgICAgICAnSVNPIDg2MDEgZGF0ZSB0aW1lIHN0cmluZ3MgdXNlZCBpbiB0aGUgeEFQSSBzaG91bGQgaW5jbHVkZSB0aW1lIHpvbmUgaW5mb3JtYXRpb24uJyxcbiAgREFURV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eXMgc3RyaW5nIHZhbHVlIG11c3QgYmUgY29uZm9ybWFudCB0byBJU08gODYwMSBmb3IgRGF0ZSBUaW1lcy4nLFxuICBWRVJTSU9OX01VU1RfQ09NUExZX1NFTUFOVElDX1ZFUlNJT05JTkc6ICAgICAgICAgICdcInZlcnNpb25cIiBtdXN0IGJlIGEgbm9uLW51bGwgc3RyaW5nIHRoYXQgY29tcGxpZXMgd2l0aCBTZW1hbnRpYyBWZXJzaW9uaW5nIDEuMC4wJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgICAnXCJhdHRhY2htZW50XCIgaW5zdGFuY2VzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWTogICAgICAgICAgICAgICAnXCJhdHRhY2htZW50c1wiIG11c3QgYmUgYSBub24tbnVsbCBBcnJheS4nLFxuICBBR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImFnZW50XCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBBR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gXCJhZ2VudFwiLicsXG4gIEFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTOiAgICAgICAgJ0ludmFsaWQgb2JqZWN0IHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEgR3JvdXAgd2hlbiBhbiBBZ2VudCB3YXMgZXhwZWN0ZWQuJyxcbiAgR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJncm91cFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgTUVNQkVSX01VU1RfQkVfUFJPVklERURfRk9SX0FOT05ZTU9VU19HUk9VUFM6ICAgICAnXCJtZW1iZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIGZvciBBbm9ueW1vdXMgR3JvdXBzLicsXG4gIEdST1VQX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIFwiZ3JvdXBcIi4nLFxuICBHUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWTogICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgbWVtYmVyIHByb3BlcnR5IG9mIGEgR3JvdXAgbXVzdCBiZSBhbiBBcnJheScsXG4gIEFDVE9SX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdG9yIG11c3QgYmUgcHJvdmlkZWQuJyxcbiAgQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVDogICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV086ICAgICAgICAnSWYgdXNlZCBhcyBhIEdyb3VwLCB0aGUgXCJhdXRob3JpdHlcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBcIm1lbWJlclwiIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBleGFjdGx5IHR3byBBZ2VudCBvYmplY3RzLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgJ1wiQ29udGV4dCBBY3Rpdml0aWVzXCIgcHJvcGVydHkgdmFsdWVzIG11c3Qgbm90IGJlIG51bGwuJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWTogICAgICAgICAgICAnQ29udGV4dCBBY3Rpdml0aWVzIHByb3BlcnR5IHZhbHVlcyBzaG91bGQgcHJlZmVyIHRvIGJlIGFuIGFycmF5IG9mIEFjdGl2aXRpZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQWN0aXZpdHkgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgUkVHSVNUUkFUSU9OX01VU1RfQkVfVVVJRF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBtdXN0IGJlIGEgVVVJRCBzdHJpbmcuJyxcbiAgUkVWSVNJT05fTVVTVF9CRV9BR0VOVF9PUl9HUk9VUDogICAgICAgICAgICAgICAgICAnVGhlIHJldmlzaW9uIHByb3BlcnR5IG11c3Qgbm90IGJlIHVzZWQgaWYgdGhlIFN0YXRlbWVudFxcJ3MgT2JqZWN0IGlzIGFuIEFnZW50IG9yIEdyb3VwLicsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgT0JKRUNUX01VU1RfQkVfREVGSU5FRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJvYmplY3RcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIE9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQ6ICAgICAnQSBTdWJTdGF0ZW1lbnQgbXVzdCBub3QgY29udGFpbiBhIFN1YlN0YXRlbWVudCcsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIElEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUzogICAgICAgICAgICAgICAgICAgJ0lkcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBBY3Rpdml0eSBQcm92aWRlciwgYW5kIG11c3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBMUlMnLFxuICBJRF9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJZCB3YXMgbm90IGEgdmFsaWQgVVVJRCcsXG4gIFNUQVRFTUVOVF9BUkdVTUVOVF9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgJ05vIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgICdOdWxsIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9CRV9QQVJTRURfQ09SUkVDVExZOiAgICAgICAgICAgICAgICdOdWxsIG9yIG5vbi1vYmplY3Qgc3RhdGVtZW50IHZhbHVlIHBhcnNlZCBmcm9tIHByb3ZpZGVkIHN0YXRtZW50IEpTT04uJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXVxufSk7XG5cbiBleHBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi4vY29uc3RhbnRzL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc30gZnJvbSAnLi4vY29uc3RhbnRzL3doaXRlbGlzdHMnO1xuaW1wb3J0IHt4YXBpRXJyb3JMZXZlbHMsIHhhcGlWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHt4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9pbnRlcmFjdGlvbi10eXBlcyc7XG5pbXBvcnQge3hhcGlHZW5lcmFsfSBmcm9tICcuLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxudmFyIHhhcGlWYWxpZGF0b3I7XG5cbmZ1bmN0aW9uIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3JzKSB7XG4gIHZhciB2ZXJzaW9uO1xuXG4gIGluc3RhbmNlID0gaW5zdGFuY2UgfHwgbnVsbDtcbiAgZXJyb3JzICAgPSBlcnJvcnMgfHwgbnVsbDtcbiAgdmVyc2lvbiAgPSB4YXBpR2VuZXJhbC5GSVJTVF9SRVBPUlRfVkVSU1RJT047XG4gIHJldHVybiB7aW5zdGFuY2UsIGVycm9ycywgdmVyc2lvbn07XG59XG5cbmZ1bmN0aW9uIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KGluc3RhbmNlLCBlcnJvcikge1xuICByZXR1cm4gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkID8gW10gOiBbZXJyb3JdKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXModGFyZ2V0LCBhbGxvd2VkUHJvcGVydGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG5cbiAgZm9yIChwcm9wZXJ0eU5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmIGFsbG93ZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlVORVhQRUNURUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQsIHZpb2xhdGlvblR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWUsIGxvY2FsVmlvbGF0aW9uVHlwZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgICAgICAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV0sXG4gIGxvY2FsVmlvbGF0aW9uVHlwZSA9IHZpb2xhdGlvblR5cGUgfHwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICBsb2NhbFZpb2xhdGlvblR5cGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gdGFyZ2V0W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguSVJJLnRlc3QocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfSVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9VUklfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmwodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgLy8gVE9ETyAtIGNoZWNrIHdoZXRoZXIgYSBmb3JtYWwgVVJMIGZvcm1hdCBkZWZpbml0aW9uIGlzIHJlY29tbWVuZGVkL2VuZm9yY2VkIGZvciB4QVBJXG4gIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNCb29sZWFuKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQm9vbGVhbihwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTn1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTl9QUkVTRU5UfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOdW1iZXIocHJvcFZhbHVlKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX05VTUJFUn1gLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJfUFJFU0VOVH1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSUZJUHJvcGVydGllcyh0YXJnZXQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBhY2NvdW50VHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGlmICh0YXJnZXQubWJveCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5tYm94ICE9PSBudWxsKSB7XG4gICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX01CT1hfVVJJLFxuICAgICAgICBsZXZlbDogeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4Lk1BSUxUT19VUkkudGVzdCh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXMsIHByb3BlcnRpZXNMZW5ndGgsIGksIHByb3BOYW1lLCBwcm9wVmFsdWU7XG5cbiAgaWZpcyA9IFtdO1xuICBwcm9wZXJ0aWVzTGVuZ3RoID0geGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLmxlbmd0aDtcblxuICBpZiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdW5kZWZpbmVkKSAge1xuICAgIHJldHVybiBpZmlzO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXNMZW5ndGg7IGkgKz0gMSkge1xuICAgIHByb3BOYW1lICA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lc1tpXTtcbiAgICBwcm9wVmFsdWUgPSB0YXJnZXRbcHJvcE5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWZpcy5wdXNoKHtrZXk6IHByb3BOYW1lLCB2YWx1ZTogcHJvcFZhbHVlfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlmaXM7XG59XG5cbmZ1bmN0aW9uIGdldElGSUNvdW50KHRhcmdldCkge1xuICByZXR1cm4gZ2V0SUZJcyh0YXJnZXQpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdLFxuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlM7XG5cbiAgaWYgKGV4dGVuc2lvbnMgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChleHRlbnNpb25zKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIC8vIFRPRE8gLSBkb3VibGUtY2hlY2sgd2hhdCBmdXJ0aGVyIGVuZm9yY2VhYmxlIGNvbnN0cmFpbnRzIGV4aXN0IG9uIGV4dGVuc2lvbiBvYmplY3QgcHJvcGVydGllc1xuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcE5hbWUsIG1hcHBlZFZhbHVlO1xuXG4gICAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gICAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGxhbmd1YWdlTWFwKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gbGFuZ3VhZ2VNYXApIHtcbiAgICAgIGlmIChsYW5ndWFnZU1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzVmFsaWRMYW5ndWFnZVRhZyhwcm9wTmFtZSkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcE5hbWUpLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7cHJvcE5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEfWAsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICAgIGlmIChtYXBwZWRWYWx1ZSA9PT0gbnVsbCB8fCBtYXBwZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKG1hcHBlZFZhbHVlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUF9LRVlfTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgICBpZiAodmVyYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUkJfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKHZlcmIsIHByb3BlcnRpZXMuSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi90cnVlKTtcblxuICAgIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVMYW5ndWFnZU1hcCh2ZXJiLmRpc3BsYXksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlzQWxsb3dlZENvbXBvbmVudFR5cGUsIGlkcywgaW50ZXJhY3Rpb25Db21wb25lbnQsIGNvbXBvbmVudHNMZW5ndGgsIHBlckNvbXBvbmVudFRyYWNlLCBpO1xuXG4gICAgbG9jYWxFcnJvcnMgICAgICAgICAgICA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuSU5URVJBQ1RJT05fQ09NUE9ORU5UUztcbiAgICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgICBpZHMgICAgICAgICAgICAgICAgICAgID0gW107XG5cblxuICAgIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBvbmVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25Db21wb25lbnQgPSBjb21wb25lbnRzW2ldO1xuICAgICAgICAgIHBlckNvbXBvbmVudFRyYWNlICAgID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIGkpO1xuXG4gICAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICB0cmFjZTogICBwZXJDb21wb25lbnRUcmFjZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgcHJvcGVydGllcy5JRCwgcGVyQ29tcG9uZW50VHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlkcy5wdXNoKGludGVyYWN0aW9uQ29tcG9uZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoaW50ZXJhY3Rpb25Db21wb25lbnQuZGVzY3JpcHRpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuREVTQ1JJUFRJT04pLCBsb2NhbEVycm9ycyk7XG4gICAgICAgICAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09NUE9ORU5UX0FSUkFZLCBwZXJDb21wb25lbnRUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpbnRlcmFjdGlvblR5cGUgJiYgY29tcG9uZW50cykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9WQUxJRH0gJHtpbnRlcmFjdGlvblR5cGV9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlEZWZpbnRpb24oZGVmaW5pdGlvbiwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5MZW5ndGgsIGNycEl0ZW0sIGk7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5ERUZJTklUSU9OO1xuICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTik7XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVMYW5ndWFnZU1hcChkZWZpbml0aW9uLm5hbWUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5OQU1FKSwgbG9jYWxFcnJvcnMpO1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKGRlZmluaXRpb24sIHByb3BlcnRpZXMuVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNVcmwoZGVmaW5pdGlvbiwgcHJvcGVydGllcy5NT1JFX0lORk8sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gICAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgICBpZiAoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0geGFwaUdlbmVyYWwuSU5URVJBQ1RJT05fREVGSU5JVElPTl9UWVBFKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVFlQRSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkV9IFwiJHt4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEV9XCJgLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybi5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjcnBJdGVtID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybltpXTtcblxuICAgICAgICAgIGlmIChjcnBJdGVtID09PSBudWxsIHx8IGNycEl0ZW0gPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjcnBJdGVtKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblRyYWNlLCBpKSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgICAgZGVmaW5pdGlvbi5jaG9pY2VzLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ0hPSUNFUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgICBkZWZpbml0aW9uLnNjYWxlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5MSUtFUlRdLFxuICAgICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNDQUxFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24udGFyZ2V0LFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVEFSR0VUKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc3RlcHMsXG4gICAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICAgIFtwcm9wZXJ0aWVzLlBFUkZPUk1BTkNFXSxcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEVQUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhkZWZpbml0aW9uLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWV9ERUZJTklUSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGF0dGFjaG1lbnRzTGVuZ3RoLCBpO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTO1xuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoYXR0YWNobWVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShhdHRhY2htZW50cykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgYXR0YWNobWVudHNMZW5ndGggPSBhdHRhY2htZW50cy5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBhdHRhY2htZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnRzW2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBZ2VudChhZ2VudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFHRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYWdlbnQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmaUNvdW50ID0gZ2V0SUZJQ291bnQoYWdlbnQpO1xuXG4gIGlmIChpZmlDb3VudCAhPT0geGFwaUdlbmVyYWwuTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWdlbnQub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVApIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1MsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhhZ2VudCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoYWdlbnQsIHByb3BlcnRpZXMuTkFNRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhZ2VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQUdFTlQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlR3JvdXAoZ3JvdXAsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBtZW1iZXJUcmFjZSwgaWZpQ291bnQsIG51bU1lbWJlcnMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuR1JPVVA7XG4gIG1lbWJlclRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUik7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChncm91cCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGdyb3VwKTtcblxuICBpZiAoaWZpQ291bnQgPT09IDApIHtcbiAgICBpZiAoZ3JvdXAubWVtYmVyID09PSBudWxsIHx8IGdyb3VwLm1lbWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgbWVtYmVyVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpZmlDb3VudCA+IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVJRklQcm9wZXJ0aWVzKGdyb3VwLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGdyb3VwLCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKGdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGdyb3VwLm1lbWJlcikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01FTUJFUl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1NZW1iZXJzID0gZ3JvdXAubWVtYmVyLmxlbmd0aDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1lbWJlcnM7IGkgKz0gMSkge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KGdyb3VwLm1lbWJlcltpXSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGdyb3VwLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5HUk9VUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3RvcihhY3RvciwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUNUT1I7XG5cbiAgaWYgKGFjdG9yID09PSBudWxsIHx8IGFjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUNUT1JfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhY3RvcikpIHtcbiAgICB2YWxpZGF0ZUdyb3VwKGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVBZ2VudChhY3RvciwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml0eShhdXRob3JpdHksIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFVVEhPUklUWTtcblxuICBpZiAoYXV0aG9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGF1dGhvcml0eSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzR3JvdXAoYXV0aG9yaXR5KSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgaWYgKCFhdXRob3JpdHkubWVtYmVyIHx8ICFhdXRob3JpdHkubWVtYmVyLmxlbmd0aCB8fCBhdXRob3JpdHkubWVtYmVyLmxlbmd0aCAhPT0geGFwaUdlbmVyYWwuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlMpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGF1dGhvcml0eSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoc3ViQ29udGV4dCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG51bUFjdGl2aXRpZXMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1VCX0NPTlRFWFQ7XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IG51bGwpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3ViQ29udGV4dCkpIHtcbiAgICAgIG51bUFjdGl2aXRpZXMgPSBzdWJDb250ZXh0Lmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1BY3Rpdml0aWVzOyBpICs9IDEpIHtcbiAgICAgICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0W2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgICAgIH1cbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN1YkNvbnRleHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVksXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTn0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0QWN0aXZpdGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTO1xuXG4gIGlmIChjb250ZXh0QWN0aXZpdGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0QWN0aXZpdGllcykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5wYXJlbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5QQVJFTlQpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5ncm91cGluZywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkdST1VQSU5HKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMuY2F0ZWdvcnksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DQVRFR09SWSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLm90aGVyLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT1RIRVIpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoY29udGV4dEFjdGl2aXRpZXMsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIHRyYWNlLCBlcnJvcnMsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5DT05URVhUO1xuXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoY29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoY29udGV4dC5yZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCAmJiAoY29udGV4dC5yZWdpc3RyYXRpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoY29udGV4dC5yZWdpc3RyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChjb250ZXh0LnJlZ2lzdHJhdGlvbikpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRUdJU1RSQVRJT05fTVVTVF9CRV9VVUlEX1NUUklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFtvYmplY3RUeXBlcy5HUk9VUCwgb2JqZWN0VHlwZXMuQUdFTlRdLmluZGV4T2Yoc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgaWYgKGNvbnRleHQucmV2aXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVWSVNJT04pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnBsYXRmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBMQVRGT1JNKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUExBVEZPUk1fTVVTVF9OT1RfQkVfVVNFRF9XSVRIX1JFVklTSU9OX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhjb250ZXh0LCBwcm9wZXJ0aWVzLlJFVklTSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi9mYWxzZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUExBVEZPUk0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIGlmIChjb250ZXh0LnRlYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdGVHcm91cChjb250ZXh0LnRlYW0sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5URUFNKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY29udGV4dEFjdGl2aXRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlQ29udGV4dEFjdGl2aXRpZXMoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUyksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIGlmIChjb250ZXh0Lmxhbmd1YWdlICE9PSB1bmRlZmluZWQgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKGNvbnRleHQubGFuZ3VhZ2UpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkxBTkdVQUdFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01VU1RfQkVfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5zdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKGNvbnRleHQuc3RhdGVtZW50LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU1RBVEVNRU5UKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuaW5zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChjb250ZXh0Lmluc3RydWN0b3IpKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOU1RSVUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlQWdlbnQoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUV4dGVuc2lvbnMoY29udGV4dC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoXG4gICAgY29udGV4dCxcbiAgICBbXG4gICAgICBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTixcbiAgICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICAgIHByb3BlcnRpZXMuVEVBTSxcbiAgICAgIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLFxuICAgICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICAgIHByb3BlcnRpZXMuUExBVEZPUk0sXG4gICAgICBwcm9wZXJ0aWVzLkxBTkdVQUdFLFxuICAgICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlNcbiAgICBdLFxuICAgIGxvY2FsVHJhY2UsXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9iamVjdCwgdHJhY2UsIGVycm9ycywgaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBvYmplY3RUeXBlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLk9CSkVDVDtcblxuICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfREVGSU5FRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChvYmplY3QpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhvYmplY3QsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OKTtcbiAgb2JqZWN0VHlwZSA9IG9iamVjdC5vYmplY3RUeXBlIHx8IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIC8vIFRPRE86IFN3aXRjaFxuICBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuQUNUSVZJVFkpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkFHRU5UKSB7XG4gICAgdmFsaWRhdGVBZ2VudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIGlmIChvYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUCkge1xuICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLlNVQl9TVEFURU1FTlQpIHtcbiAgICBpZiAoaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTdGF0ZW1lbnQob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNTdWJTdGF0ZW1lbnQqL3RydWUpO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSksXG4gICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50KHN0YXRlbWVudCwgdHJhY2UsIGVycm9ycywgaXNTdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlLCB3aGl0ZWxpc3RlZFByb3BlcnRpZXM7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIHdoaXRlbGlzdGVkUHJvcGVydGllcyA9IHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNUQVRFTUVOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KHN0YXRlbWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIWlzU3ViU3RhdGVtZW50KSB7XG4gICAgaWYgKHN0YXRlbWVudC5pZCA9PT0gbnVsbCB8fCBzdGF0ZW1lbnQuaWQgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQuaWQpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURfTVVTVF9CRV9WQUxJRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1VCX1NUQVRFTUVOVDtcbiAgfVxuXG4gIHZhbGlkYXRlQWN0b3Ioc3RhdGVtZW50LmFjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyYihzdGF0ZW1lbnQudmVyYiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUkIpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlT2JqZWN0KHN0YXRlbWVudC5vYmplY3QsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1QpLCBsb2NhbEVycm9ycywgaXNTdWJTdGF0ZW1lbnQpO1xuICB2YWxpZGF0ZVJlc3VsdChzdGF0ZW1lbnQucmVzdWx0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVTVUxUKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUgPSBzdGF0ZW1lbnQub2JqZWN0ICYmIHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA/IHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA6IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIHZhbGlkYXRlQ29udGV4dChzdGF0ZW1lbnQuY29udGV4dCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFQpLCBsb2NhbEVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlRJTUVTVEFNUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNJU084NjAxU3RyaW5nKHN0YXRlbWVudCwgcHJvcGVydGllcy5TVE9SRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUF1dGhvcml0eShzdGF0ZW1lbnQuYXV0aG9yaXR5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVVUSE9SSVRZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVZlcnNpb24oc3RhdGVtZW50LnZlcnNpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5WRVJTSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUF0dGFjaG1lbnRzKHN0YXRlbWVudC5hdHRhY2htZW50cywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudCwgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiBtYWtlU3RhdGVtZW50UmVwb3J0KHN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnM7XG5cbiAgbG9jYWxFcnJvcnMgPSBbXTtcbiAgdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUQVRFTUVOVCwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICByZXR1cm4gbWFrZVYxUmVwb3J0KHN0YXRlbWVudCwgbG9jYWxFcnJvcnMpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gIHZhciBzdGF0ZW1lbnRPYmplY3Q7XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoc3RhdGVtZW50KSkge1xuICAgIHRyeSB7XG4gICAgICBzdGF0ZW1lbnRPYmplY3QgPSBKU09OLnBhcnNlKHN0YXRlbWVudCk7XG4gICAgICBpZiAoc3RhdGVtZW50T2JqZWN0ID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudE9iamVjdCkgfHwgeGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudE9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX0JFX1BBUlNFRF9DT1JSRUNUTFksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChzdGF0ZW1lbnRPYmplY3QsIHtcbiAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVkFMSURfSlNPTn06ICR7ZS5tZXNzYWdlfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50T2JqZWN0KTtcbiAgfVxuXG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudCkgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdGF0ZW1lbnQpKSB7XG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRCxcbiAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSB7XG4gIHJldHVybiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5aT05FXSB8fFxuICAgICAgICAgIChtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5SRUxBVElWRV9USU1FXSAmJiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5USU1FX1pPTkVfSE9VUl0pO1xufVxuXG54YXBpVmFsaWRhdG9yID0ge1xuICB2YWxpZGF0ZVN0YXRlbWVudDogdmFsaWRhdGVBbWJpZ3VvdXNUeXBlU3RhdGVtZW50XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4YXBpVmFsaWRhdG9yO1xud2luZG93LnhhcGlWYWxpZGF0b3IgPSB4YXBpVmFsaWRhdG9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uUmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge29iamVjdFR5cGVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbmNvbnN0XG4gIElTX1NUUklORyAgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgSVNfQVJSQVkgICA9ICdbb2JqZWN0IEFycmF5XScsXG4gIElTX0JPT0xFQU4gPSAnW29iamVjdCBCb29sZWFuXScsXG4gIElTX05VTUJFUiAgPSAnW29iamVjdCBOdW1iZXJdJztcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciB4YXBpVmFsaWRhdGlvblV0aWxzO1xuXG54YXBpVmFsaWRhdGlvblV0aWxzID0ge1xuICBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19TVFJJTkc7XG4gIH0sXG5cbiAgaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7XG4gIH0sXG5cbiAgaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19BUlJBWTtcbiAgfSxcblxuICBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdHJ1ZSB8fCBvYmogPT09IGZhbHNlIHx8IHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfQk9PTEVBTjtcbiAgfSxcblxuICBpc051bWJlcihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19OVU1CRVI7XG4gIH0sXG5cbiAgaXNEZWZpbmVkKG9iaikge1xuICAgIHJldHVybiAob2JqICE9PSBudWxsIHx8IG9iaiAhPT0gdW5kZWZpbmVkKTtcbiAgfSxcblxuICBpc05vbk51bGxNYXBPYmplY3QodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzT2JqZWN0KHRhcmdldCkgJiYgIXRoaXMuaXNBcnJheSh0YXJnZXQpO1xuICB9LFxuXG4gIGlzVmFsaWRMYW5ndWFnZVRhZyh0YXJnZXQpIHtcbiAgICAvLyBUT0RPIC0gdXNlIG1vcmUgcHJlY2lzZSA1NjQ2IGhhbmRsaW5nLCByYXRoZXIgdGhhbiB0aGlzIHNpbXBsaWZpZWQgQkNQIDQ3IHJlZ2V4LCB3aGljaCBjb21iaW5lcyBSRkMgNTY0NiBhbmQgUkZDIDQ2NDcuXG4gICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKHRhcmdldCkgJiYgdGhpcy5pc1N0cmluZyh0YXJnZXQpICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQkNQXzQ3LnRlc3QodGFyZ2V0KTtcbiAgfSxcblxuICBhZGRQcm9wVG9UcmFjZSh0cmFjZSwgYWRkZW5kdW0pIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQoYWRkZW5kdW0pID8gYCR7dHJhY2V9LiR7YWRkZW5kdW19YCA6IHRyYWNlO1xuICB9LFxuXG4gIGFkZExvb2t1cFRvVHJhY2UodHJhY2UsIGtleSkge1xuICAgIHJldHVybiAoIXRoaXMuaXNEZWZpbmVkKGtleSkpID8gdHJhY2UgOiAodGhpcy5pc051bWJlcihrZXkpID8gYCR7dHJhY2V9WyR7a2V5fV1gIDogYCR7dHJhY2V9W1wiJHtrZXl9XCJdYCk7XG4gIH0sXG5cbiAgbG9jYWxUcmFjZVRvU3RyaW5nKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSk7XG4gIH0sXG5cbiAgaXNHcm91cChhY3Rvck9yR3JvdXApIHtcbiAgICByZXR1cm4gKGFjdG9yT3JHcm91cC5tZW1iZXIgIT09IG51bGwgJiYgYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB8fCBhY3Rvck9yR3JvdXAub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVA7XG4gIH1cbn07XG5cbmV4cG9ydCB7eGFwaVZhbGlkYXRpb25VdGlsc307XG4iXX0=\n"]} \ No newline at end of file +{"version":3,"sources":["xapiValidator.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","beepBoop","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","Object","defineProperty","value","xapiErrorLevels","freeze","MAY_VIOLATION","MUST_VIOLATION","SHOULD_VIOLATION","xapiValidationErrors","ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS","ACTOR_MUST_BE_PROVIDED","AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED","AGENT_MUST_BE_NON_NULL_MAP_OBJECT","AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS","ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY","ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS","AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ","CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL","CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY","CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT","CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY","CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS","DATE_MUST_BE_VALID","DATE_SHOULD_INCLUDE_ZONE_INFORMATION","DEFINITIONS_MUST_BE_OBJECTS","DISPLAY_SHOULD_BE_PROVIDED","DURATION_MUST_BE_VALID","EXTENSIONS_MUST_NOT_BE_NULL","GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO","GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED","GROUP_MEMBER_MUST_BE_ARRAY","GROUP_MUST_BE_NON_NULL_MAP_OBJECT","ID_MUST_BE_UNIQUE","ID_MUST_BE_VALID_UUID_REF","ID_MUST_BE_VALID","ID_SHOULD_NOT_CONTAIN_WHITESPACES","IDS_SHOULD_BE_GENERATED_BY_LRS","IFI_MUST_BE_MBOX_URI","IFI_MUST_BE_VALID_MBOX_FORMAT","INTERACTION_ACTIVITY_SHOULD_HAVE","INTERACTION_COMPONENT_MUST_NOT_BE_NULL","INTERACTION_COMPONENT_SHOULD_BE_ARRAY","INTERACTION_TYPE_MUST_BE_CMI","INTERACTION_TYPE_MUST_BE_VALID","INVALID_JSON","LANGUAGE_MAP_KEY_INVALID","LANGUAGE_MAP_KEY_MUST_BE_STRING","LANGUAGE_MAPS_MUST_NOT_BE_NULL","LANGUAGE_MUST_BE_STRING","LENGTH_MUST_BE_INTEGER","MAX_MUST_BE_GREATER_THAN_MIN","MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS","MUST_BE_BOOLEAN_PRESENT","MUST_BE_BOOLEAN","MUST_BE_IRI_STRING","MUST_BE_NUMBER_PRESENT","MUST_BE_NUMBER","MUST_BE_PRESENT","MUST_BE_STRING","MUST_BE_URI_PRESENT","MUST_BE_URI_STRING","OBJECT_MUST_BE_DEFINED","OBJECT_MUST_BE_NON_NULL_MAP_OBJECT","OBJECT_TYPE_MUST_BE_STATEMENT_REF","OBJECT_TYPE_MUST_BE_VALID_OPTION","RAW_MUST_BE_GREATER_THAN_MIN","RAW_MUST_BE_LESS_THAN_MAX","REGISTRATION_MUST_BE_UUID_STRING","RESULT_MUST_BE_MAP_OBJECT","REVISION_MUST_BE_AGENT_OR_GROUP","SCALED_MUST_BE_BETWEEN_0_1","SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS","SHA2_MUST_CONTAIN_BASE_64_STRING","STATEMENT_ARGUMENT_IS_NOT_VALID","STATEMENT_ARGUMENT_MUST_BE_PROVIDED","STATEMENT_MUST_BE_PARSED_CORRECTLY","STATEMENT_MUST_NOT_BE_NULL","STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS","SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT","UNEXPECTED","VERB_MUST_BE_PROVIDED","VERB_MUST_NOT_BE_NULL","VERSION_MUST_COMPLY_SEMANTIC_VERSIONING","2","xapiGeneral","FIRST_REPORT_VERSTION","GROUP_AUTHORITY_AGENT_MEMBERS","INTERACTION_DEFINITION_TYPE","MAX_SCALED_VALUE","MIN_SCALED_VALUE","NO_INDEX_FOUND","NUMER_OF_SPECIFIED_IFI_PROPERTIES","3","interactionTypes","CHOICE","FILL_IN","LIKERT","LONG_FILL_IN","MATCHING","NUMERIC","OTHER","PERFORMANCE","SEQUENCING","TRUE_FALSE","xapiValidationInteractionTypes","4","properties","ACCOUNT","ACTIVITY","ACTOR","AGENT","ATTACHMENT","ATTACHMENTS","AUTHORITY","CATEGORY","CHOICES","COMPLETION","CONTENT_TYPE","CONTEXT_ACTIVITIES","CONTEXT","CORRECT_RESPONSES_PATTERN","DATE_TIME","DEFINITION","DESCRIPTION","DISPLAY","DURATION","EXTENSIONS","FILE_URL","GROUP","GROUPING","HOME_PAGE","ID","INSTRUCTOR","INTERACTION_COMPONENTS","INTERACTION_TYPE","LANGUAGE_MAP","LANGUAGE","LENGTH","MAX","MBOX_SHA_1_SUM","MBOX","MEMBER","MIN","MORE_INFO","NAME","OBJECT_TYPE","OBJECT","OPEN_ID","PARENT","PLATFORM","RAW","REGISTRATION","RESPONSE","RESULT","REVISION","SCALE","SCALED","SCORE","SHA2","SOURCE","STATEMENT_REF","STATEMENT","STEPS","STORED","SUB_CONTEXT","SUCCESS","TARGET","TEAM","TIMESTAMP","TYPE","USAGE_TYPE","VERB","VERSION","objectTypes","SUB_STATEMENT","xapiValidationIfiPropertyNames","xApiValidObjectTypes","5","xapiValidationRegex","UUID","ISO_8601_DURATION","ISO_8601_DATE_TIME","MAILTO_URI","CONTAINS_WHITESPACE","SEMVER_1_P_0_P_0","BASE_64","IRI","BCP_47","dateFormatRegexPositions","YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MSECOND","ZONE","RELATIVE_TIME","TIME_ZONE_HOUR","TIME_ZONE_MINUTE","6","xapiWhiteListProperties","undefined","_properties","IFI","URI","COMPONENT_ARRAY","ACTIVITY_DEFINITION","../constants/properties","7","xapiValidationUtils","_regex","IS_STRING","IS_ARRAY","IS_BOOLEAN","IS_NUMBER","toString","prototype","isString","obj","isObject","isArray","Array","isBoolean","isNumber","isDefined","isNonNullMapObject","target","isValidLanguageTag","test","addPropToTrace","trace","addendum","addLookupToTrace","key","localTraceToString","isGroup","actorOrGroup","member","objectType","../constants/regex","8","makeV1Report","instance","errors","version","_general","makeV1SingleErrorReport","error","validateAbsenceOfNonWhitelistedProperties","allowedProperties","localErrors","localTrace","propertyName","hasOwnProperty","indexOf","push","_utils","message","_errors","level","validatePropertyIsString","parent","isRequired","violationType","propValue","localViolationType","validatePropertyIsUri","validatePropertyIsUrl","validatePropertyIsBoolean","validatePropertyIsNumber","validateIFIProperties","accountTrace","mbox","account","_whitelists","getIFIs","ifis","filter","name","getIFICount","validateExtensions","extensions","validateLanguageMap","languageMap","propName","mappedValue","validateVerb","verb","display","validateInteractionComponentArray","components","interactionType","allowedInteractionTypes","isAllowedComponentType","ids","perComponentTrace","forEach","interactionComponent","id","description","validateActivityDefintion","definition","correctResponsesPatternTrace","type","_interactionTypes","correctResponsesPattern","response","choices","scale","source","steps","validateActivity","activity","ACTIVITIES_MUST_NOT_BE_NULL","validateStatementRef","statementRef","validateScore","score","scaled","min","raw","max","validateResult","result","duration","validatePropertyIsISO8601String","matched","datetime","exec","dateIncludesZoneInformation","validateVersion","validateAttachmentObject","attachment","sha2","validateAttachments","attachments","validateAgent","agent","ifiCount","validateGroup","group","memberTrace","validateActor","actor","validateAuthority","authority","validateContextActivitySubContext","subContext","validateContextActivities","contextActivities","grouping","category","other","validateContext","context","statementObjectObjectType","registration","revision","platform","PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP","team","language","statement","instructor","validateObject","object","isWithinSubStatement","validateStatement","isSubStatement","whitelistedProperties","makeStatementReport","validateAmbiguousTypeStatement","statementObject","JSON","parse","xapiValidator","default","./constants/errors","./constants/general","./constants/interaction-types","./constants/properties","./constants/regex","./constants/whitelists","./utils/utils"],"mappings":"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","file":"../xapiValidator.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.beepBoop = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o _general.xapiGeneral.MAX_SCALED_VALUE) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCALED),\n message: _errors.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.min !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MIN, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (score.max !== undefined && score.max < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MAX),\n message: _errors.xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.max !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MAX, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw > score.max) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsNumber(score, _properties.properties.RAW, localTrace, localErrors, /*isRequired*/false);\n validateAbsenceOfNonWhitelistedProperties(score, _whitelists.xapiWhiteListProperties.SCORE, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateResult(result, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.RESULT;\n\n if (result === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(result)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace),\n message: _errors.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validateScore(result.score, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCORE), localErrors);\n validatePropertyIsBoolean(result, _properties.properties.SUCCESS, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsBoolean(result, _properties.properties.COMPLETION, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsString(result, _properties.properties.RESPONSE, localTrace, localErrors, /*isRequired*/false);\n validateExtensions(result.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n\n if (result.duration !== undefined && (result.duration === null || !_utils.xapiValidationUtils.isString(result.duration) || !_regex.xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DURATION),\n message: _errors.xapiValidationErrors.DURATION_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(result, _whitelists.xapiWhiteListProperties.RESULT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validatePropertyIsISO8601String(parent, propertyName, trace, errors) {\n var localErrors, localTrace, matched, datetime;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.DATE_TIME;\n datetime = parent[propertyName];\n\n if (datetime === undefined) {\n return localErrors;\n }\n\n if (datetime === null || !_utils.xapiValidationUtils.isString(datetime)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: propertyName + ' ' + _errors.xapiValidationErrors.MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n matched = _regex.xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime);\n\n if (matched) {\n if (!dateIncludesZoneInformation(matched)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n }\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateVersion(version, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.VERSION;\n\n if (version === undefined) {\n return localErrors;\n }\n\n if (version === null || !_utils.xapiValidationUtils.isString(version) || !_regex.xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateAttachmentObject(attachment, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(attachment)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (attachment.display === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.DISPLAY),\n message: _errors.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n validateLanguageMap(attachment.display, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DISPLAY), localErrors);\n }\n\n validateLanguageMap(attachment.description, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DESCRIPTION), localErrors);\n validatePropertyIsUri(attachment, _properties.properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsUri(attachment, _properties.properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n // TODO - more complete validation for Internet Media Type via RFC 2046\n validatePropertyIsString(attachment, _properties.properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (attachment.length === undefined || attachment.length === null || !_utils.xapiValidationUtils.isNumber(attachment.length) || attachment.length % 1 !== 0) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LENGTH),\n message: _errors.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (attachment.sha2 === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (attachment.sha2 === null || !_utils.xapiValidationUtils.isString(attachment.sha2) || !_regex.xapiValidationRegex.BASE_64.test(attachment.sha2)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(attachment, _whitelists.xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors);\n return localErrors;\n}\n\nfunction validateAttachments(attachments, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENTS;\n\n if (attachments === undefined) {\n return localErrors;\n }\n\n if (attachments === null || !_utils.xapiValidationUtils.isArray(attachments)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n attachments.forEach(function (attachment, i) {\n validateAttachmentObject(attachment, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n });\n\n return localErrors;\n}\n\nfunction validateAgent(agent, trace, errors) {\n var localErrors, localTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AGENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(agent)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n ifiCount = getIFICount(agent);\n\n if (ifiCount !== _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (agent.objectType === _properties.objectTypes.GROUP) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(agent, localTrace, localErrors);\n validatePropertyIsString(agent, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n validateAbsenceOfNonWhitelistedProperties(agent, _whitelists.xapiWhiteListProperties.AGENT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateGroup(group, trace, errors) {\n var localErrors, localTrace, memberTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.GROUP;\n memberTrace = _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MEMBER);\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(group)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n ifiCount = getIFICount(group);\n\n if (ifiCount === 0) {\n if (group.member === null || group.member === undefined) {\n localErrors.push({\n trace: memberTrace,\n message: _errors.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else if (ifiCount > _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(group, localTrace, localErrors);\n\n validatePropertyIsString(group, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n if (group.member !== undefined) {\n if (group.member === null || !_utils.xapiValidationUtils.isArray(group.member)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n group.member.forEach(function (member, i) {\n validateAgent(member, _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors);\n });\n }\n }\n\n validateAbsenceOfNonWhitelistedProperties(group, _whitelists.xapiWhiteListProperties.GROUP, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateActor(actor, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ACTOR;\n\n if (actor === null || actor === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (_utils.xapiValidationUtils.isGroup(actor)) {\n validateGroup(actor, localTrace, localErrors);\n } else {\n validateAgent(actor, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAuthority(authority, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AUTHORITY;\n\n if (authority === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(authority)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n if (_utils.xapiValidationUtils.isGroup(authority)) {\n validateGroup(authority, localTrace, localErrors);\n if (!authority.member || !authority.member.length || authority.member.length !== _general.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n validateAgent(authority, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateContextActivitySubContext(subContext, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.SUB_CONTEXT;\n\n if (subContext === undefined) {\n return localErrors;\n }\n\n if (subContext === null) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (_utils.xapiValidationUtils.isArray(subContext)) {\n subContext.forEach(function (activity, i) {\n validateActivity(activity, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n });\n } else if (_utils.xapiValidationUtils.isObject(subContext)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n\n validateActivity(subContext, localTrace, localErrors);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,\n level: _errors.xapiErrorLevels.MUST_VIOLATION });\n }\n return localErrors;\n}\n\nfunction validateContextActivities(contextActivities, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT_ACTIVITIES;\n\n if (contextActivities === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(contextActivities)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n validateContextActivitySubContext(contextActivities.parent, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.PARENT), localErrors);\n validateContextActivitySubContext(contextActivities.grouping, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.GROUPING), localErrors);\n validateContextActivitySubContext(contextActivities.category, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CATEGORY), localErrors);\n validateContextActivitySubContext(contextActivities.other, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OTHER), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(contextActivities, _whitelists.xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateContext(context, trace, errors, statementObjectObjectType) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT;\n\n if (context === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(context)) {\n localErrors.push({\n trace: localTrace,\n message: _errors.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (context.registration !== undefined && (context.registration === null || !_utils.xapiValidationUtils.isString(context.registration) || !_regex.xapiValidationRegex.UUID.test(context.registration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REGISTRATION),\n message: _errors.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if ([_properties.objectTypes.GROUP, _properties.objectTypes.AGENT].indexOf(statementObjectObjectType) !== _general.xapiGeneral.NO_INDEX_FOUND) {\n if (context.revision !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REVISION),\n message: _errors.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.platform !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.PLATFORM),\n message: _errors.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsString(context, _properties.properties.REVISION, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsString(context, _properties.properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (context.team !== undefined) {\n validateGroup(context.team, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.TEAM), localErrors);\n }\n\n if (context.contextActivities !== undefined) {\n validateContextActivities(context.contextActivities, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT_ACTIVITIES), localErrors);\n }\n\n if (context.language !== undefined && !_utils.xapiValidationUtils.isValidLanguageTag(context.language)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LANGUAGE),\n message: _errors.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.statement !== undefined) {\n validateStatementRef(context.statement, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.STATEMENT), localErrors);\n }\n\n if (context.instructor !== undefined) {\n if (_utils.xapiValidationUtils.isGroup(context.instructor)) {\n validateGroup(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n } else {\n validateAgent(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n }\n }\n\n validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n validateAbsenceOfNonWhitelistedProperties(context, _whitelists.xapiWhiteListProperties.EXTENSIONS, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateObject(object, trace, errors, isWithinSubStatement) {\n var localErrors, localTrace, objectType;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.OBJECT;\n\n if (object === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(object)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION);\n\n objectType = object.objectType || _properties.objectTypes.ACTIVITY;\n\n switch (objectType) {\n case _properties.objectTypes.ACTIVITY:\n validateActivity(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.AGENT:\n validateAgent(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.GROUP:\n validateGroup(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.STATEMENT_REF:\n validateStatementRef(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.SUB_STATEMENT:\n if (isWithinSubStatement) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n validateStatement(object, localTrace, localErrors, /*isSubStatement*/true);\n break;\n default:\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(),\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateStatement(statement, trace, errors, isSubStatement) {\n var localErrors, localTrace, statementObjectObjectType, whitelistedProperties;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.STATEMENT;\n\n whitelistedProperties = _whitelists.xapiWhiteListProperties.STATEMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(statement)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!isSubStatement) {\n if (statement.id === null || statement.id === undefined || !_utils.xapiValidationUtils.isString(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n } else if (!_regex.xapiValidationRegex.UUID.test(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.ID_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n whitelistedProperties = _whitelists.xapiWhiteListProperties.SUB_STATEMENT;\n }\n\n validateActor(statement.actor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ACTOR), localErrors);\n validateVerb(statement.verb, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERB), localErrors);\n validateObject(statement.object, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OBJECT), localErrors, isSubStatement);\n validateResult(statement.result, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RESULT), localErrors);\n\n statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : _properties.objectTypes.ACTIVITY;\n\n validateContext(statement.context, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT), localErrors, statementObjectObjectType);\n validatePropertyIsISO8601String(statement, _properties.properties.TIMESTAMP, localTrace, localErrors);\n validatePropertyIsISO8601String(statement, _properties.properties.STORED, localTrace, localErrors);\n\n validateAuthority(statement.authority, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.AUTHORITY), localErrors);\n validateVersion(statement.version, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERSION), localErrors);\n validateAttachments(statement.attachments, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ATTACHMENTS), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction makeStatementReport(statement) {\n var localErrors;\n\n localErrors = [];\n validateStatement(statement, _properties.properties.STATEMENT, localErrors, /*isRequired*/false);\n\n return makeV1Report(statement, localErrors);\n}\n\nfunction validateAmbiguousTypeStatement(statement) {\n var statementObject;\n\n if (statement === undefined) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (statement === null) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (_utils.xapiValidationUtils.isString(statement)) {\n try {\n statementObject = JSON.parse(statement);\n if (statementObject === null || !_utils.xapiValidationUtils.isObject(statementObject) || _utils.xapiValidationUtils.isArray(statementObject)) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } catch (e) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.INVALID_JSON + ': ' + e.message,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return makeStatementReport(statementObject);\n }\n\n if (_utils.xapiValidationUtils.isObject(statement) && !_utils.xapiValidationUtils.isArray(statement)) {\n return makeStatementReport(statement);\n }\n\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n}\n\nfunction dateIncludesZoneInformation(matched) {\n return matched[_regex.dateFormatRegexPositions.ZONE] || matched[_regex.dateFormatRegexPositions.RELATIVE_TIME] && matched[_regex.dateFormatRegexPositions.TIME_ZONE_HOUR];\n}\n\nxapiValidator = {\n validateStatement: validateAmbiguousTypeStatement\n};\n\nexports.default = xapiValidator;\n\nwindow.xapiValidator = xapiValidator; //FIXME\n\n},{\"./constants/errors\":1,\"./constants/general\":2,\"./constants/interaction-types\":3,\"./constants/properties\":4,\"./constants/regex\":5,\"./constants/whitelists\":6,\"./utils/utils\":7}]},{},[8])(8)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY29uc3RhbnRzL2Vycm9ycy5qcyIsInNyYy9jb25zdGFudHMvZ2VuZXJhbC5qcyIsInNyYy9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJzcmMvY29uc3RhbnRzL3Byb3BlcnRpZXMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2NvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7Ozs7O0FBRUEsSUFBTSxrQkFBa0IsT0FBTyxNQUFQLENBQWM7QUFDcEMsaUJBQWtCLGVBRGtCO0FBRXBDLGtCQUFrQixnQkFGa0I7QUFHcEMsb0JBQWtCO0FBSGtCLENBQWQsQ0FBeEI7O0FBTUEsSUFBTSx1QkFBdUIsT0FBTyxNQUFQLENBQWM7QUFDekMsMkNBQWtELHlDQURUO0FBRXpDLDBCQUFrRCx5QkFGVDtBQUd6QywwQ0FBa0Qsc0ZBSFQ7QUFJekMscUNBQWtELHVDQUpUO0FBS3pDLDZDQUFrRCw0RUFMVDtBQU16QyxzQ0FBa0QseUNBTlQ7QUFPekMsNENBQWtELHNEQVBUO0FBUXpDLHlDQUFrRCxxRUFSVDtBQVN6QyxvREFBa0Qsc0dBVFQ7QUFVekMsa0RBQWtELGlFQVZUO0FBV3pDLHVDQUFrRCx3REFYVDtBQVl6Qyx5Q0FBa0QscUhBWlQ7QUFhekMsc0NBQWtELG1FQWJUO0FBY3pDLDJDQUFrRCw4RUFkVDtBQWV6Qyw2Q0FBa0Qsa0RBZlQ7QUFnQnpDLHNCQUFrRCw0RUFoQlQ7QUFpQnpDLHdDQUFrRCxtRkFqQlQ7QUFrQnpDLCtCQUFrRCxrREFsQlQ7QUFtQnpDLDhCQUFrRCx3Q0FuQlQ7QUFvQnpDLDBCQUFrRCx3RUFwQlQ7QUFxQnpDLCtCQUFrRCxvRUFyQlQ7QUFzQnpDLDZDQUFrRCxzSUF0QlQ7QUF1QnpDLDBDQUFr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LFNBQVMsMkJBQVQsQ0FBcUMsT0FBckMsRUFBOEM7QUFDNUMsU0FBTyxRQUFRLGdDQUF5QixJQUFqQyxLQUNFLFFBQVEsZ0NBQXlCLGFBQWpDLEtBQW1ELFFBQVEsZ0NBQXlCLGNBQWpDLENBRDVEO0FBRUQ7O0FBRUQsZ0JBQWdCO0FBQ2QscUJBQW1CO0FBREwsQ0FBaEI7O2tCQUllLGE7O0FBQ2YsT0FBTyxhQUFQLEdBQXVCLGFBQXZCLEMsQ0FBc0MiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB4YXBpRXJyb3JMZXZlbHMgPSBPYmplY3QuZnJlZXplKHtcbiAgTUFZX1ZJT0xBVElPTjogICAgJ01BWV9WSU9MQVRJT04nLFxuICBNVVNUX1ZJT0xBVElPTjogICAnTVVTVF9WSU9MQVRJT04nLFxuICBTSE9VTERfVklPTEFUSU9OOiAnU0hPVUxEX1ZJT0xBVElPTidcbn0pO1xuXG5jb25zdCB4YXBpVmFsaWRhdGlvbkVycm9ycyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFM6ICAgICAgICAgICdBY3Rpdml0aWVzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBBQ1RPUl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY3RvciBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIEFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbiBcImFnZW50XCIuJyxcbiAgQUdFTlRfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJhZ2VudFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1M6ICAgICAgICAnSW52YWxpZCBvYmplY3Qgd2l0aCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBHcm91cCB3aGVuIGFuIEFnZW50IHdhcyBleHBlY3RlZC4nLFxuICBBVFRBQ0hNRU5UU19NVVNUX0JFX05PVF9OVUxMX0FSUkFZOiAgICAgICAgICAgICAgICdcImF0dGFjaG1lbnRzXCIgbXVzdCBiZSBhIG5vbi1udWxsIEFycmF5LicsXG4gIEFUVEFDSE1FTlRTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFM6ICAgICAgICAgJ1wiYXR0YWNobWVudFwiIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzLicsXG4gIEFVVEhPUklUWV9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImF1dGhvcml0eVwiIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICdcIkNvbnRleHQgQWN0aXZpdGllc1wiIHByb3BlcnR5IHZhbHVlcyBtdXN0IG5vdCBiZSBudWxsLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVk6ICAgICAgICAgICAgJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkIHByZWZlciB0byBiZSBhbiBhcnJheSBvZiBBY3Rpdml0aWVzIHJhdGhlciB0aGFuIGEgc2luZ2xlIEFjdGl2aXR5IG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZOiAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiB2YWx1ZSBtdXN0IGJlIGFuIEFycmF5IG9mIHN0cmluZ3MuJyxcbiAgQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1M6ICAgICAgICAnXCJjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblwiIGl0ZW1zIG11c3QgYmUgc3RyaW5ncy4nLFxuICBEQVRFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIHByb3BlcnR5cyBzdHJpbmcgdmFsdWUgbXVzdCBiZSBjb25mb3JtYW50IHRvIElTTyA4NjAxIGZvciBEYXRlIFRpbWVzLicsXG4gIERBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTjogICAgICAgICAgICAgJ0lTTyA4NjAxIGRhdGUgdGltZSBzdHJpbmdzIHVzZWQgaW4gdGhlIHhBUEkgc2hvdWxkIGluY2x1ZGUgdGltZSB6b25lIGluZm9ybWF0aW9uLicsXG4gIERFRklOSVRJT05TX01VU1RfQkVfT0JKRUNUUzogICAgICAgICAgICAgICAgICAgICAgJ1wiZGVmaW5pdGlvbnNcIiwgd2hlbiBwcmVzZW50LCBtdXN0IGJlIG1hcCBvYmplY3RzJyxcbiAgRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAnXCJkaXNwbGF5XCIgcHJvcGVydHkgc2hvdWxkIGJlIHByb3ZpZGVkLicsXG4gIERVUkFUSU9OX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImR1cmF0aW9uXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhbiBJU08gODYwMSBkdXJhdGlvbicsXG4gIEVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBleHRlbnNpb25zIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPOiAgICAgICAgJ0lmIHVzZWQgYXMgYSBHcm91cCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgXCJtZW1iZXJcIiBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgZXhhY3RseSB0d28gQWdlbnQgb2JqZWN0cy4nLFxuICBHUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBcImdyb3VwXCIuJyxcbiAgR1JPVVBfTUVNQkVSX01VU1RfQkVfQVJSQVk6ICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIG1lbWJlciBwcm9wZXJ0eSBvZiBhIEdyb3VwIG11c3QgYmUgYW4gQXJyYXknLFxuICBHUk9VUF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImdyb3VwXCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJRF9NVVNUX0JFX1VOSVFVRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydGllcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gZWFjaCBpbnRlcmFjdGlvbiBjb21wb25lbnQgYXJyYXknLFxuICBJRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGOiAgICAgICAgICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQgc3RyaW5nIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSWQgd2FzIG5vdCBhIHZhbGlkIFVVSUQnLFxuICBJRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVM6ICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydGllcyBvbiBpbnRlcmFjdGlvbiBjb21wb25lbnRzIHNob3VsZCBub3QgY29udGFpbiB3aGl0ZXNwYWNlJyxcbiAgSURTX1NIT1VMRF9CRV9HRU5FUkFURURfQllfTFJTOiAgICAgICAgICAgICAgICAgICAnSWRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIEFjdGl2aXR5IFByb3ZpZGVyLCBhbmQgbXVzdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIExSUycsXG4gIElGSV9NVVNUX0JFX01CT1hfVVJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wibWJveFwiIHByb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIG1haWx0byBVUkkgc3RyaW5nIGJ1dCB3YXMgbm90IGEgc3RyaW5nIGF0IGFsbC4nLFxuICBJRklfTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICdcIm1ib3hcIiBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBJTlRFUkFDVElPTl9BQ1RJVklUWV9TSE9VTERfSEFWRTogICAgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiBBY3Rpdml0eSBEZWZpbml0aW9ucyBzaG91bGQgaGF2ZSBhIHR5cGUgcHJvcGVydHkgb2YnLFxuICBJTlRFUkFDVElPTl9DT01QT05FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIG1lbWJlciBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdCcsXG4gIElOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVk6ICAgICAgICAgICAgJ1RoaXMgaW50ZXJhY3Rpb24gY29tcG9uZW50IGNvbGxlY3Rpb24gcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5LicsXG4gIElOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUk6ICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImludGVyYWN0aW9uVHlwZVwiIHZhbHVlIG11c3QgYmUgYSBDTUkgaW50ZXJhY3Rpb24gdHlwZSBvcHRpb24uJyxcbiAgSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVzZW50IGludGVyYWN0aW9uVHlwZSBvZjogJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAna2V5LCBMYW5ndWFnZSBkb2VzIG5vdCBjb25mb3JtIHRvIFJGQyA1NjQ2JyxcbiAgTEFOR1VBR0VfTUFQX0tFWV9NVVNUX0JFX1NUUklORzogICAgICAgICAgICAgICAgICAna2V5OiBMYW5ndWFnZSBNYXAgdmFsdWUgc2hvdWxkIGJlIGEgU3RyaW5nLCBidXQgd2FzIG5vdCcsXG4gIExBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgJ0xhbmd1YWdlIE1hcHMsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIE1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU46ICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJtYXhcIiBhbmQgXCJtaW5cIiBhcmUgcHJlc2VudCwgdGhlIG1heCBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1pbicsXG4gIE1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTOiAgICAgJ1wibWVtYmVyXCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCBmb3IgQW5vbnltb3VzIEdyb3Vwcy4nLFxuICBNVVNUX0JFX0JPT0xFQU5fUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBCb29sZWFuIGJ1dCB3YXMgYWJzZW50LicsXG4gIE1VU1RfQkVfQk9PTEVBTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgQm9vbGVhbi4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9OVU1CRVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBOdW1iZXIuJyxcbiAgTVVTVF9CRV9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIGJ1dCB3YXMgYWJzZW50LicsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfVVJJX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIFVSSSBzdHJpbmcgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9VUklfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBVUkkgc3RyaW5nLicsXG4gIE9CSkVDVF9NVVNUX0JFX0RFRklORUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZC4nLFxuICBPQkpFQ1RfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdcIm9iamVjdFwiIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRjogICAgICAgICAgICAgICAgJ1wib2JqZWN0VHlwZVwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgXCJTdGF0ZW1lbnRSZWZcIiBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIFJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU46ICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJyYXdcIiBhbmQgXCJtaW5cIiBhcmUgcHJlc2VudCwgdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1pbicsXG4gIFJBV19NVVNUX0JFX0xFU1NfVEhBTl9NQVg6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJyYXdcIiBhbmQgXCJtYXhcIiBhcmUgcHJlc2VudCwgdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG1heCcsXG4gIFJFR0lTVFJBVElPTl9NVVNUX0JFX1VVSURfU1RSSU5HOiAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSByZWdpc3RyYXRpb24gcHJvcGVydHkgbXVzdCBiZSBhIFVVSUQgc3RyaW5nLicsXG4gIFJFU1VMVF9NVVNUX0JFX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSByZXN1bHQgbXVzdCBiZSBhIG1hcCBvYmplY3QnLFxuICBSRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQOiAgICAgICAgICAgICAgICAgICdUaGUgcmV2aXNpb24gcHJvcGVydHkgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgU3RhdGVtZW50XFwncyBPYmplY3QgaXMgYW4gQWdlbnQgb3IgR3JvdXAuJyxcbiAgU0NBTEVEX01VU1RfQkVfQkVUV0VFTl8wXzE6ICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHNjYWxlZCBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nLFxuICBTVEFURU1FTlRfQVJHVU1FTlRfTVVTVF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICdObyBzdGF0ZW1lbnQgYXJndW1lbnQgcHJvdmlkZWQuJyxcbiAgU1RBVEVNRU5UX01VU1RfQkVfUEFSU0VEX0NPUlJFQ1RMWTogICAgICAgICAgICAgICAnTnVsbCBvciBub24tb2JqZWN0IHN0YXRlbWVudCB2YWx1ZSBwYXJzZWQgZnJvbSBwcm92aWRlZCBzdGF0bWVudCBKU09OLicsXG4gIFNUQVRFTUVOVF9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgJ051bGwgc3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkLicsXG4gIFNUQVRFTUVOVF9SRUZfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgJ1N0YXRlbWVudFJlZiBpbnN0YW5jZXMgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIFNVQl9TVEFURU1FTlRfTVVTVF9OT1RfQ09OVEFJTl9TVUJfU1RBVEVNRU5UOiAgICAgJ0EgU3ViU3RhdGVtZW50IG11c3Qgbm90IGNvbnRhaW4gYSBTdWJTdGF0ZW1lbnQnLFxuICBVTkVYUEVDVEVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIHByb3BlcnR5IG5vdCBwZXJtaXR0ZWQnLFxuICBWRVJCX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJiIG11c3QgYmUgcHJvdmlkZWQnLFxuICBWRVJCX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJiIHByb3BlcnR5IHZhbHVlIG11c3QgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIFZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORzogICAgICAgICAgJ1widmVyc2lvblwiIG11c3QgYmUgYSBub24tbnVsbCBzdHJpbmcgdGhhdCBjb21wbGllcyB3aXRoIFNlbWFudGljIFZlcnNpb25pbmcgMS4wLjAnXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXSxcbiAgRVhURU5TSU9OUzogW1xuICAgIHByb3BlcnRpZXMuUkVHSVNUUkFUSU9OLFxuICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICBwcm9wZXJ0aWVzLlRFQU0sXG4gICAgcHJvcGVydGllcy5DT05URVhUX0FDVElWSVRJRVMsXG4gICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICBwcm9wZXJ0aWVzLlBMQVRGT1JNLFxuICAgIHByb3BlcnRpZXMuTEFOR1VBR0UsXG4gICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gIF1cbn0pO1xuXG4gZXhwb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleH0gZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7b2JqZWN0VHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9wcm9wZXJ0aWVzJztcblxuY29uc3RcbiAgSVNfU1RSSU5HICA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICBJU19BUlJBWSAgID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgSVNfQk9PTEVBTiA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgSVNfTlVNQkVSICA9ICdbb2JqZWN0IE51bWJlcl0nO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHhhcGlWYWxpZGF0aW9uVXRpbHM7XG5cbnhhcGlWYWxpZGF0aW9uVXRpbHMgPSB7XG4gIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX1NUUklORztcbiAgfSxcblxuICBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKTtcbiAgfSxcblxuICBpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX0FSUkFZO1xuICB9LFxuXG4gIGlzQm9vbGVhbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19CT09MRUFOO1xuICB9LFxuXG4gIGlzTnVtYmVyKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX05VTUJFUjtcbiAgfSxcblxuICBpc0RlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuIChvYmogIT09IG51bGwgfHwgb2JqICE9PSB1bmRlZmluZWQpO1xuICB9LFxuXG4gIGlzTm9uTnVsbE1hcE9iamVjdCh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCh0YXJnZXQpICYmIHRoaXMuaXNPYmplY3QodGFyZ2V0KSAmJiAhdGhpcy5pc0FycmF5KHRhcmdldCk7XG4gIH0sXG5cbiAgaXNWYWxpZExhbmd1YWdlVGFnKHRhcmdldCkge1xuICAgIC8vIFRPRE8gLSB1c2UgbW9yZSBwcmVjaXNlIDU2NDYgaGFuZGxpbmcsIHJhdGhlciB0aGFuIHRoaXMgc2ltcGxpZmllZCBCQ1AgNDcgcmVnZXgsIHdoaWNoIGNvbWJpbmVzIFJGQyA1NjQ2IGFuZCBSRkMgNDY0Ny5cbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzU3RyaW5nKHRhcmdldCkgJiYgeGFwaVZhbGlkYXRpb25SZWdleC5CQ1BfNDcudGVzdCh0YXJnZXQpO1xuICB9LFxuXG4gIGFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZChhZGRlbmR1bSkgPyBgJHt0cmFjZX0uJHthZGRlbmR1bX1gIDogdHJhY2U7XG4gIH0sXG5cbiAgYWRkTG9va3VwVG9UcmFjZSh0cmFjZSwga2V5KSB7XG4gICAgcmV0dXJuICghdGhpcy5pc0RlZmluZWQoa2V5KSkgPyB0cmFjZSA6ICh0aGlzLmlzTnVtYmVyKGtleSkgPyBgJHt0cmFjZX1bJHtrZXl9XWAgOiBgJHt0cmFjZX1bXCIke2tleX1cIl1gKTtcbiAgfSxcblxuICBsb2NhbFRyYWNlVG9TdHJpbmcodHJhY2UsIGFkZGVuZHVtKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkUHJvcFRvVHJhY2UodHJhY2UsIGFkZGVuZHVtKTtcbiAgfSxcblxuICBpc0dyb3VwKGFjdG9yT3JHcm91cCkge1xuICAgIHJldHVybiAoYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gbnVsbCAmJiBhY3Rvck9yR3JvdXAubWVtYmVyICE9PSB1bmRlZmluZWQpIHx8IGFjdG9yT3JHcm91cC5vYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUDtcbiAgfVxufTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblV0aWxzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5pbXBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfSBmcm9tICcuL2NvbnN0YW50cy93aGl0ZWxpc3RzJztcbmltcG9ydCB7eGFwaUVycm9yTGV2ZWxzLCB4YXBpVmFsaWRhdGlvbkVycm9yc30gZnJvbSAnLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uSW50ZXJhY3Rpb25UeXBlc30gZnJvbSAnLi9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMnO1xuaW1wb3J0IHt4YXBpR2VuZXJhbH0gZnJvbSAnLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG52YXIgeGFwaVZhbGlkYXRvcjtcblxuZnVuY3Rpb24gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvcnMpIHtcbiAgdmFyIHZlcnNpb247XG5cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZSB8fCBudWxsO1xuICBlcnJvcnMgICA9IGVycm9ycyAgIHx8IG51bGw7XG4gIHZlcnNpb24gID0geGFwaUdlbmVyYWwuRklSU1RfUkVQT1JUX1ZFUlNUSU9OO1xuICByZXR1cm4ge2luc3RhbmNlLCBlcnJvcnMsIHZlcnNpb259O1xufVxuXG5mdW5jdGlvbiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChpbnN0YW5jZSwgZXJyb3IpIHtcbiAgcmV0dXJuIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCA/IFtdIDogW2Vycm9yXSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHRhcmdldCwgYWxsb3dlZFByb3BlcnRpZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGZvciAocHJvcGVydHlOYW1lIGluIHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBhbGxvd2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5VTkVYUEVDVEVELFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkLCB2aW9sYXRpb25UeXBlKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlLCBsb2NhbFZpb2xhdGlvblR5cGU7XG5cbiAgbG9jYWxFcnJvcnMgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgICAgICAgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdLFxuICBsb2NhbFZpb2xhdGlvblR5cGUgPSB2aW9sYXRpb25UeXBlIHx8IHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTjtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIGxvY2FsVmlvbGF0aW9uVHlwZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHRhcmdldFtwcm9wZXJ0eU5hbWVdO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1VSSV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4LklSSS50ZXN0KHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0lSSV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzVXJsKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIC8vIFRPRE8gLSBjaGVjayB3aGV0aGVyIGEgZm9ybWFsIFVSTCBmb3JtYXQgZGVmaW5pdGlvbiBpcyByZWNvbW1lbmRlZC9lbmZvcmNlZCBmb3IgeEFQSVxuICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0Jvb2xlYW4ocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0JPT0xFQU59YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0JPT0xFQU5fUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTnVtYmVyKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJ9YCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfTlVNQkVSX1BSRVNFTlR9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUlGSVByb3BlcnRpZXModGFyZ2V0LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgYWNjb3VudFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcblxuICBpZiAodGFyZ2V0Lm1ib3ggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQubWJveCAhPT0gbnVsbCkge1xuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQk9YKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSUZJX01VU1RfQkVfTUJPWF9VUkksXG4gICAgICAgIGxldmVsOiB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguTUFJTFRPX1VSSS50ZXN0KHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUJPWCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklGSV9NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXM7XG5cbiAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHVuZGVmaW5lZCkge3JldHVybiBbXTt9XG5cbiAgaWZpcyA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+IHtcbiAgICBpZiAodGFyZ2V0W25hbWVdICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0W25hbWVdICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge2tleTogbmFtZSwgdmFsdWU6IHRhcmdldFtuYW1lXX07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaWZpcztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJQ291bnQodGFyZ2V0KSB7XG4gIHJldHVybiBnZXRJRklzKHRhcmdldCkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW10sXG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuRVhURU5TSU9OUztcblxuICBpZiAoZXh0ZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGV4dGVuc2lvbnMpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRVhURU5TSU9OU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgLy8gVE9ETyAtIGRvdWJsZS1jaGVjayB3aGF0IGZ1cnRoZXIgZW5mb3JjZWFibGUgY29uc3RyYWludHMgZXhpc3Qgb24gZXh0ZW5zaW9uIG9iamVjdCBwcm9wZXJ0aWVzXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BOYW1lLCBtYXBwZWRWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgaWYgKGxhbmd1YWdlTWFwID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QobGFuZ3VhZ2VNYXApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBmb3IgKHByb3BOYW1lIGluIGxhbmd1YWdlTWFwKSB7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKHByb3BOYW1lKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wTmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5MQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUR9YCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobWFwcGVkVmFsdWUgPT09IG51bGwgfHwgbWFwcGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhtYXBwZWRWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wTmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5MQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HfWAsXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgaWYgKHZlcmIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5WRVJCX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodmVyYiwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAodmVyYi5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBpc0FsbG93ZWRDb21wb25lbnRUeXBlLCBpZHMsIHBlckNvbXBvbmVudFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzICAgICAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICAgICAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5JTlRFUkFDVElPTl9DT01QT05FTlRTO1xuICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgaWRzICAgICAgICAgICAgICAgICAgICA9IFtdO1xuXG4gIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChjb21wb25lbnRzID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoY29tcG9uZW50cykpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9DT01QT05FTlRfU0hPVUxEX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoaW50ZXJhY3Rpb25Db21wb25lbnQsIGkpID0+IHtcbiAgICAgICAgcGVyQ29tcG9uZW50VHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSk7XG5cbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHBlckNvbXBvbmVudFRyYWNlLFxuICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoaW50ZXJhY3Rpb25Db21wb25lbnQsIHByb3BlcnRpZXMuSUQsIHBlckNvbXBvbmVudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShwZXJDb21wb25lbnRUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZHMucHVzaChpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGludGVyYWN0aW9uQ29tcG9uZW50LmRlc2NyaXB0aW9uLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGludGVyYWN0aW9uQ29tcG9uZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5DT01QT05FTlRfQVJSQVksIHBlckNvbXBvbmVudFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfVxuICB9IGVsc2UgaWYgKGludGVyYWN0aW9uVHlwZSAmJiBjb21wb25lbnRzKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX1ZBTElEfSAke2ludGVyYWN0aW9uVHlwZX1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eURlZmludGlvbihkZWZpbml0aW9uLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgICAgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuREVGSU5JVElPTjtcbiAgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOKTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGRlZmluaXRpb24ubmFtZSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk5BTUUpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLlRZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VybChkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLk1PUkVfSU5GTywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgaWYgKGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50eXBlICE9PSB4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEUpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRZUEUpLFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9BQ1RJVklUWV9TSE9VTERfSEFWRX0gXCIke3hhcGlHZW5lcmFsLklOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRX1cImAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5URVJBQ1RJT05fVFlQRSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuLmZvckVhY2goKHJlc3BvbnNlLCBpKSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHJlc3BvbnNlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsIGkpLFxuICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uY2hvaWNlcyxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNIT0lDRVMpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc2NhbGUsXG4gICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgW3Byb3BlcnRpZXMuTElLRVJUXSxcbiAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0NBTEUpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgIGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlLFxuICAgIFtwcm9wZXJ0aWVzLk1BVENISU5HXSxcbiAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICBkZWZpbml0aW9uLnRhcmdldCxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRBUkdFVCksXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgZGVmaW5pdGlvbi5zdGVwcyxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5QRVJGT1JNQU5DRV0sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNURVBTKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGRlZmluaXRpb24sIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkFDVElWSVRZX0RFRklOSVRJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQVRUQUNITUVOVFM7XG5cbiAgaWYgKGF0dGFjaG1lbnRzID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGF0dGFjaG1lbnRzKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BVFRBQ0hNRU5UU19NVVNUX0JFX05PVF9OVUxMX0FSUkFZLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBhdHRhY2htZW50cy5mb3JFYWNoKChhdHRhY2htZW50LCBpKSA9PiB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICB9KTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWdlbnQoYWdlbnQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBpZmlDb3VudDtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BR0VOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFnZW50KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGFnZW50KTtcblxuICBpZiAoaWZpQ291bnQgIT09IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFnZW50Lm9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkdST1VQKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUlGSVByb3BlcnRpZXMoYWdlbnQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGFnZW50LCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoYWdlbnQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkFHRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdyb3VwKGdyb3VwLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgbWVtYmVyVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkdST1VQO1xuICBtZW1iZXJUcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NRU1CRVIpO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoZ3JvdXApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWZpQ291bnQgPSBnZXRJRklDb3VudChncm91cCk7XG5cbiAgaWYgKGlmaUNvdW50ID09PSAwKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCBncm91cC5tZW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIG1lbWJlclRyYWNlLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NRU1CRVJfTVVTVF9CRV9QUk9WSURFRF9GT1JfQU5PTllNT1VTX0dST1VQUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaWZpQ291bnQgPiB4YXBpR2VuZXJhbC5OVU1FUl9PRl9TUEVDSUZJRURfSUZJX1BST1BFUlRJRVMpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfSUZJX1BST1BFUlRJRVNfTVVTVF9CRV9TUEVDSUZJRUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhncm91cCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhncm91cCwgcHJvcGVydGllcy5OQU1FLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmIChncm91cC5tZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChncm91cC5tZW1iZXIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShncm91cC5tZW1iZXIpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NRU1CRVIpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goKG1lbWJlciwgaSkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KG1lbWJlciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoZ3JvdXAsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkdST1VQLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdG9yKGFjdG9yLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RPUjtcblxuICBpZiAoYWN0b3IgPT09IG51bGwgfHwgYWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RPUl9NVVNUX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc0dyb3VwKGFjdG9yKSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYWN0b3IsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXR5KGF1dGhvcml0eSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQVVUSE9SSVRZO1xuXG4gIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXV0aG9yaXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BVVRIT1JJVFlfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhdXRob3JpdHkpKSB7XG4gICAgdmFsaWRhdGVHcm91cChhdXRob3JpdHksIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICBpZiAoIWF1dGhvcml0eS5tZW1iZXIgfHwgIWF1dGhvcml0eS5tZW1iZXIubGVuZ3RoIHx8IGF1dGhvcml0eS5tZW1iZXIubGVuZ3RoICE9PSB4YXBpR2VuZXJhbC5HUk9VUF9BVVRIT1JJVFlfQUdFTlRfTUVNQkVSUykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUVNQkVSKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV08sXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlQWdlbnQoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChzdWJDb250ZXh0LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVUJfQ09OVEVYVDtcblxuICBpZiAoc3ViQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoc3ViQ29udGV4dCA9PT0gbnVsbCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX0FDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdWJDb250ZXh0KSkge1xuICAgIHN1YkNvbnRleHQuZm9yRWFjaCgoYWN0aXZpdHksIGkpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZpdHkoYWN0aXZpdHksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3ViQ29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICB2YWxpZGF0ZUFjdGl2aXR5KHN1YkNvbnRleHQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfQVJSQVlfT1JfQUNUSVZJVFlfT0JKLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0aWVzKGNvbnRleHRBY3Rpdml0aWVzLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5DT05URVhUX0FDVElWSVRJRVM7XG5cbiAgaWYgKGNvbnRleHRBY3Rpdml0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGNvbnRleHRBY3Rpdml0aWVzKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLnBhcmVudCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBBUkVOVCksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLmdyb3VwaW5nLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuR1JPVVBJTkcpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5jYXRlZ29yeSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNBVEVHT1JZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMub3RoZXIsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PVEhFUiksIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhjb250ZXh0QWN0aXZpdGllcywgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHQoY29udGV4dCwgdHJhY2UsIGVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgPSB0cmFjZSB8fCBwcm9wZXJ0aWVzLkNPTlRFWFQ7XG5cbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfTVVTVF9CRV9OT05fTlVMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmIChjb250ZXh0LnJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIChjb250ZXh0LnJlZ2lzdHJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjb250ZXh0LnJlZ2lzdHJhdGlvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KGNvbnRleHQucmVnaXN0cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVHSVNUUkFUSU9OKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFR0lTVFJBVElPTl9NVVNUX0JFX1VVSURfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoW29iamVjdFR5cGVzLkdST1VQLCBvYmplY3RUeXBlcy5BR0VOVF0uaW5kZXhPZihzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlKSAhPT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICBpZiAoY29udGV4dC5yZXZpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SRVZJU0lPTiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFVklTSU9OX01VU1RfQkVfQUdFTlRfT1JfR1JPVVAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQucGxhdGZvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUExBVEZPUk0pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5QTEFURk9STV9NVVNUX05PVF9CRV9VU0VEX1dJVEhfUkVWSVNJT05fQUdFTlRfT1JfR1JPVVAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUkVWSVNJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoY29udGV4dCwgcHJvcGVydGllcy5QTEFURk9STSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgaWYgKGNvbnRleHQudGVhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQudGVhbSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRFQU0pLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0LmNvbnRleHRBY3Rpdml0aWVzLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQubGFuZ3VhZ2UgIT09IHVuZGVmaW5lZCAmJiAheGFwaVZhbGlkYXRpb25VdGlscy5pc1ZhbGlkTGFuZ3VhZ2VUYWcoY29udGV4dC5sYW5ndWFnZSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEFOR1VBR0UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTVVTVF9CRV9TVFJJTkcsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LnN0YXRlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVTdGF0ZW1lbnRSZWYoY29udGV4dC5zdGF0ZW1lbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEFURU1FTlQpLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5pbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc0dyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvcikpIHtcbiAgICAgIHZhbGlkYXRlR3JvdXAoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVBZ2VudChjb250ZXh0Lmluc3RydWN0b3IsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JTlNUUlVDVE9SKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRXh0ZW5zaW9ucyhjb250ZXh0LmV4dGVuc2lvbnMsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5FWFRFTlNJT05TKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhjb250ZXh0LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5FWFRFTlNJT05TLGxvY2FsVHJhY2UsbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qob2JqZWN0LCB0cmFjZSwgZXJyb3JzLCBpc1dpdGhpblN1YlN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG9iamVjdFR5cGU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuT0JKRUNUO1xuXG4gIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfTVVTVF9CRV9ERUZJTkVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KG9iamVjdCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKG9iamVjdCwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT04pO1xuXG4gIG9iamVjdFR5cGUgPSBvYmplY3Qub2JqZWN0VHlwZSB8fCBvYmplY3RUeXBlcy5BQ1RJVklUWTtcblxuICBzd2l0Y2ggKG9iamVjdFR5cGUpIHtcbiAgICBjYXNlIG9iamVjdFR5cGVzLkFDVElWSVRZOlxuICAgICAgdmFsaWRhdGVBY3Rpdml0eShvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuQUdFTlQ6XG4gICAgICB2YWxpZGF0ZUFnZW50KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBvYmplY3RUeXBlcy5HUk9VUDpcbiAgICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG9iamVjdFR5cGVzLlNUQVRFTUVOVF9SRUY6XG4gICAgICB2YWxpZGF0ZVN0YXRlbWVudFJlZihvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuU1VCX1NUQVRFTUVOVDpcbiAgICAgIGlmIChpc1dpdGhpblN1YlN0YXRlbWVudCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVUJfU1RBVEVNRU5UX01VU1RfTk9UX0NPTlRBSU5fU1VCX1NUQVRFTUVOVCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YWxpZGF0ZVN0YXRlbWVudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1N1YlN0YXRlbWVudCovdHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUpLFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gIH1cbiAgXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCB0cmFjZSwgZXJyb3JzLCBpc1N1YlN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUsIHdoaXRlbGlzdGVkUHJvcGVydGllcztcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlQ7XG5cbiAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICghaXNTdWJTdGF0ZW1lbnQpIHtcbiAgICBpZiAoc3RhdGVtZW50LmlkID09PSBudWxsIHx8IHN0YXRlbWVudC5pZCA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURTX1NIT1VMRF9CRV9HRU5FUkFURURfQllfTFJTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICgheGFwaVZhbGlkYXRpb25SZWdleC5VVUlELnRlc3Qoc3RhdGVtZW50LmlkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElELFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGl0ZWxpc3RlZFByb3BlcnRpZXMgPSB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5TVUJfU1RBVEVNRU5UO1xuICB9XG5cbiAgdmFsaWRhdGVBY3RvcihzdGF0ZW1lbnQuYWN0b3IsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVWZXJiKHN0YXRlbWVudC52ZXJiLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVkVSQiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVPYmplY3Qoc3RhdGVtZW50Lm9iamVjdCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVCksIGxvY2FsRXJyb3JzLCBpc1N1YlN0YXRlbWVudCk7XG4gIHZhbGlkYXRlUmVzdWx0KHN0YXRlbWVudC5yZXN1bHQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SRVNVTFQpLCBsb2NhbEVycm9ycyk7XG5cbiAgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSA9IHN0YXRlbWVudC5vYmplY3QgJiYgc3RhdGVtZW50Lm9iamVjdC5vYmplY3RUeXBlID8gc3RhdGVtZW50Lm9iamVjdC5vYmplY3RUeXBlIDogb2JqZWN0VHlwZXMuQUNUSVZJVFk7XG5cbiAgdmFsaWRhdGVDb250ZXh0KHN0YXRlbWVudC5jb250ZXh0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09OVEVYVCksIGxvY2FsRXJyb3JzLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhzdGF0ZW1lbnQsIHByb3BlcnRpZXMuVElNRVNUQU1QLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUT1JFRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQXV0aG9yaXR5KHN0YXRlbWVudC5hdXRob3JpdHksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BVVRIT1JJVFkpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyc2lvbihzdGF0ZW1lbnQudmVyc2lvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUlNJT04pLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQXR0YWNobWVudHMoc3RhdGVtZW50LmF0dGFjaG1lbnRzLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVRUQUNITUVOVFMpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoc3RhdGVtZW50LCB3aGl0ZWxpc3RlZFByb3BlcnRpZXMsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KSB7XG4gIHZhciBsb2NhbEVycm9ycztcblxuICBsb2NhbEVycm9ycyA9IFtdO1xuICB2YWxpZGF0ZVN0YXRlbWVudChzdGF0ZW1lbnQsIHByb3BlcnRpZXMuU1RBVEVNRU5ULCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIHJldHVybiBtYWtlVjFSZXBvcnQoc3RhdGVtZW50LCBsb2NhbEVycm9ycyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQW1iaWd1b3VzVHlwZVN0YXRlbWVudChzdGF0ZW1lbnQpIHtcbiAgdmFyIHN0YXRlbWVudE9iamVjdDtcblxuICBpZiAoc3RhdGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfQVJHVU1FTlRfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXRlbWVudE9iamVjdCA9IEpTT04ucGFyc2Uoc3RhdGVtZW50KTtcbiAgICAgIGlmIChzdGF0ZW1lbnRPYmplY3QgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3RhdGVtZW50T2JqZWN0KSB8fCB4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3RhdGVtZW50T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoc3RhdGVtZW50T2JqZWN0LCB7XG4gICAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX01VU1RfQkVfUEFSU0VEX0NPUlJFQ1RMWSxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5WQUxJRF9KU09OfTogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnRPYmplY3QpO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3RhdGVtZW50KSAmJiAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudCkpIHtcbiAgICByZXR1cm4gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfQVJHVU1FTlRfSVNfTk9UX1ZBTElELFxuICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGF0ZUluY2x1ZGVzWm9uZUluZm9ybWF0aW9uKG1hdGNoZWQpIHtcbiAgcmV0dXJuIG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlpPTkVdIHx8XG4gICAgICAgICAgKG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlJFTEFUSVZFX1RJTUVdICYmIG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlRJTUVfWk9ORV9IT1VSXSk7XG59XG5cbnhhcGlWYWxpZGF0b3IgPSB7XG4gIHZhbGlkYXRlU3RhdGVtZW50OiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHhhcGlWYWxpZGF0b3I7XG53aW5kb3cueGFwaVZhbGlkYXRvciA9IHhhcGlWYWxpZGF0b3I7IC8vRklYTUVcbiJdfQ==\n"]} \ No newline at end of file diff --git a/lib/xapiValidator.js b/lib/xapiValidator.js index d241fb2..400f97f 100644 --- a/lib/xapiValidator.js +++ b/lib/xapiValidator.js @@ -11,82 +11,82 @@ var xapiErrorLevels = Object.freeze({ }); var xapiValidationErrors = Object.freeze({ - UNEXPECTED: 'Unexpected property not permitted', - MUST_BE_STRING: 'property, if present, must be a string.', - MUST_BE_PRESENT: 'property was required to be a string but was absent.', - MUST_BE_URI_STRING: 'property, if present, must be a URI string.', - MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', - MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', - MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', - MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', - MUST_BE_NUMBER: 'property, if present, must be a Number.', - MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', - MUST_BE_MBOX_URI: 'mbox property was required to be a mailto URI string but was not a string at all.', - MUST_BE_VALID_MBOX_FORMAT: 'mbox property was required to be a mailto URI string but did not match the mailto format.', - EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', - LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', - LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', - LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', - VERB_MUST_BE_PROVIDED: 'Verb must be provided', - VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', - DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', - INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', - INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', - INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', - INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', - ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', - ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', - INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', - DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', - CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', - CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS: 'Activities must be non-null map objects', - STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', - OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', - ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', - SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', - RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', - MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', - RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', - RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', - DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', - DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', - DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', - VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0', - ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', - LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', - SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', - SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', - ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', - AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', + ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for an "agent".', + AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS: 'Invalid object with characteristics of a Group when an Agent was expected.', - GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', - MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', - GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', - GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', - ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', + ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', + ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT: 'If present, the "authority" property must be a non-null map object.', - GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', - CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', - CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ: 'Context Activities property values must be an array of Activity Objects or a single Activity Object.', CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT: 'The Context Activities instances must be a non-null map object.', + CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', + CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT: 'If present, the "context" property must be a non-null map object.', - REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', - REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', + CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', + CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', + DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', + DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', + DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', + DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', + DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', + EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', + GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', + GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', + GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', + GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', + ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', + ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', + ID_MUST_BE_VALID: 'Id was not a valid UUID', + ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', + IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', + IFI_MUST_BE_MBOX_URI: '"mbox" property was required to be a mailto URI string but was not a string at all.', + IFI_MUST_BE_VALID_MBOX_FORMAT: '"mbox" property was required to be a mailto URI string but did not match the mailto format.', + INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', + INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', + INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', + INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', + INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', + INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', + LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', + LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', + LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', LANGUAGE_MUST_BE_STRING: 'The language property must be encoded as an RFC 5646 compliant string, but was not.', + LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', + MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', + MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', + MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', + MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', + MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', + MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', + MUST_BE_NUMBER: 'property, if present, must be a Number.', + MUST_BE_PRESENT: 'property was required to be a string but was absent.', + MUST_BE_STRING: 'property, if present, must be a string.', + MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', + MUST_BE_URI_STRING: 'property, if present, must be a URI string.', OBJECT_MUST_BE_DEFINED: '"object" property must be provided.', OBJECT_MUST_BE_NON_NULL_MAP_OBJECT: '"object" property must be a non-null map object.', - SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', + OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', OBJECT_TYPE_MUST_BE_VALID_OPTION: 'object\'s "objectType" did not match a valid option', - IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', - ID_MUST_BE_VALID: 'Id was not a valid UUID', + RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', + RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', + REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', + RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', + REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', + SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', + SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', + SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', + STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.', STATEMENT_ARGUMENT_MUST_BE_PROVIDED: 'No statement argument provided.', - STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', STATEMENT_MUST_BE_PARSED_CORRECTLY: 'Null or non-object statement value parsed from provided statment JSON.', - INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', - STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.' + STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', + STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', + SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', + UNEXPECTED: 'Unexpected property not permitted', + VERB_MUST_BE_PROVIDED: 'Verb must be provided', + VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', + VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0' }); exports.xapiErrorLevels = xapiErrorLevels; @@ -288,7 +288,8 @@ var xapiWhiteListProperties = Object.freeze({ GROUP: [_properties.properties.OBJECT_TYPE, _properties.properties.NAME, _properties.properties.MEMBER, _properties.properties.ACCOUNT, _properties.properties.MBOX_SHA_1_SUM, _properties.properties.MBOX, _properties.properties.OPEN_ID], CONTEXT_ACTIVITIES: [_properties.properties.PARENT, _properties.properties.GROUPING, _properties.properties.CATEGORY, _properties.properties.OTHER], STATEMENT: [_properties.properties.ID, _properties.properties.ACTOR, _properties.properties.VERB, _properties.properties.OBJECT, _properties.properties.RESULT, _properties.properties.CONTEXT, _properties.properties.TIMESTAMP, _properties.properties.STORED, _properties.properties.AUTHORITY, _properties.properties.VERSION, _properties.properties.ATTACHMENTS], - SUB_STATEMENT: [_properties.properties.ACTOR, _properties.properties.VERB, _properties.properties.OBJECT, _properties.properties.RESULT, _properties.properties.CONTEXT, _properties.properties.TIMESTAMP, _properties.properties.ATTACHMENTS, _properties.properties.OBJECT_TYPE] + SUB_STATEMENT: [_properties.properties.ACTOR, _properties.properties.VERB, _properties.properties.OBJECT, _properties.properties.RESULT, _properties.properties.CONTEXT, _properties.properties.TIMESTAMP, _properties.properties.ATTACHMENTS, _properties.properties.OBJECT_TYPE], + EXTENSIONS: [_properties.properties.REGISTRATION, _properties.properties.INSTRUCTOR, _properties.properties.TEAM, _properties.properties.CONTEXT_ACTIVITIES, _properties.properties.REVISION, _properties.properties.PLATFORM, _properties.properties.LANGUAGE, _properties.properties.STATEMENT, _properties.properties.EXTENSIONS] }); exports.xapiWhiteListProperties = xapiWhiteListProperties; @@ -299,20 +300,85 @@ exports.xapiWhiteListProperties = xapiWhiteListProperties; Object.defineProperty(exports, "__esModule", { value: true }); +exports.xapiValidationUtils = undefined; + +var _regex = require('../constants/regex'); var _properties = require('../constants/properties'); -var _whitelists = require('../constants/whitelists'); +var IS_STRING = '[object String]', + IS_ARRAY = '[object Array]', + IS_BOOLEAN = '[object Boolean]', + IS_NUMBER = '[object Number]'; -var _errors = require('../constants/errors'); +var toString = Object.prototype.toString; +var xapiValidationUtils; -var _regex = require('../constants/regex'); +exports.xapiValidationUtils = xapiValidationUtils = { + isString: function isString(obj) { + return toString.call(obj) === IS_STRING; + }, + isObject: function isObject(obj) { + return obj === Object(obj); + }, + + + isArray: Array.isArray || function (obj) { + return toString.call(obj) === IS_ARRAY; + }, -var _interactionTypes = require('../constants/interaction-types'); + isBoolean: function isBoolean(obj) { + return obj === true || obj === false || toString.call(obj) === IS_BOOLEAN; + }, + isNumber: function isNumber(obj) { + return toString.call(obj) === IS_NUMBER; + }, + isDefined: function isDefined(obj) { + return obj !== null || obj !== undefined; + }, + isNonNullMapObject: function isNonNullMapObject(target) { + return this.isDefined(target) && this.isObject(target) && !this.isArray(target); + }, + isValidLanguageTag: function isValidLanguageTag(target) { + // TODO - use more precise 5646 handling, rather than this simplified BCP 47 regex, which combines RFC 5646 and RFC 4647. + return this.isDefined(target) && this.isString(target) && _regex.xapiValidationRegex.BCP_47.test(target); + }, + addPropToTrace: function addPropToTrace(trace, addendum) { + return this.isDefined(addendum) ? trace + '.' + addendum : trace; + }, + addLookupToTrace: function addLookupToTrace(trace, key) { + return !this.isDefined(key) ? trace : this.isNumber(key) ? trace + '[' + key + ']' : trace + '["' + key + '"]'; + }, + localTraceToString: function localTraceToString(trace, addendum) { + return this.addPropToTrace(trace, addendum); + }, + isGroup: function isGroup(actorOrGroup) { + return actorOrGroup.member !== null && actorOrGroup.member !== undefined || actorOrGroup.objectType === _properties.objectTypes.GROUP; + } +}; + +exports.xapiValidationUtils = xapiValidationUtils; + +},{"../constants/properties":4,"../constants/regex":5}],8:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _properties = require('./constants/properties'); + +var _whitelists = require('./constants/whitelists'); + +var _errors = require('./constants/errors'); -var _general = require('../constants/general'); +var _regex = require('./constants/regex'); -var _utils = require('../utils/utils'); +var _interactionTypes = require('./constants/interaction-types'); + +var _general = require('./constants/general'); + +var _utils = require('./utils/utils'); var xapiValidator; @@ -470,13 +536,13 @@ function validateIFIProperties(target, trace, errors) { if (!_utils.xapiValidationUtils.isString(target.mbox)) { localErrors.push({ trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MBOX), - message: _errors.xapiValidationErrors.MUST_BE_MBOX_URI, + message: _errors.xapiValidationErrors.IFI_MUST_BE_MBOX_URI, level: _errors.xapiErrorLevels.MUST_VIOLATION }); } else if (!_regex.xapiValidationRegex.MAILTO_URI.test(target.mbox)) { localErrors.push({ trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MBOX), - message: _errors.xapiValidationErrors.MUST_BE_VALID_MBOX_FORMAT, + message: _errors.xapiValidationErrors.IFI_MUST_BE_VALID_MBOX_FORMAT, level: _errors.xapiErrorLevels.MUST_VIOLATION }); } @@ -496,23 +562,17 @@ function validateIFIProperties(target, trace, errors) { } function getIFIs(target) { - var ifis, propertiesLength, i, propName, propValue; - - ifis = []; - propertiesLength = _properties.xapiValidationIfiPropertyNames.length; + var ifis; if (target === null || target === undefined) { - return ifis; + return []; } - for (i = 0; i < propertiesLength; i += 1) { - propName = _properties.xapiValidationIfiPropertyNames[i]; - propValue = target[propName]; - - if (propValue !== undefined && propValue !== null) { - ifis.push({ key: propName, value: propValue }); + ifis = _properties.xapiValidationIfiPropertyNames.filter(function (name) { + if (target[name] !== undefined && target[name] !== null) { + return { key: name, value: target[name] }; } - } + }); return ifis; } @@ -562,6 +622,7 @@ function validateLanguageMap(languageMap, trace, errors) { } for (propName in languageMap) { + if (languageMap.hasOwnProperty(propName)) { if (!_utils.xapiValidationUtils.isValidLanguageTag(propName)) { localErrors.push({ @@ -630,7 +691,7 @@ function validateVerb(verb, trace, errors) { } function validateInteractionComponentArray(components, interactionType, allowedInteractionTypes, trace, errors) { - var localErrors, localTrace, isAllowedComponentType, ids, interactionComponent, componentsLength, perComponentTrace, i; + var localErrors, localTrace, isAllowedComponentType, ids, perComponentTrace; localErrors = errors || []; localTrace = trace || _properties.properties.INTERACTION_COMPONENTS; @@ -645,10 +706,7 @@ function validateInteractionComponentArray(components, interactionType, allowedI level: _errors.xapiErrorLevels.SHOULD_VIOLATION }); } else { - componentsLength = components.length; - - for (i = 0; i < componentsLength; i += 1) { - interactionComponent = components[i]; + components.forEach(function (interactionComponent, i) { perComponentTrace = _utils.xapiValidationUtils.addLookupToTrace(localTrace, i); if (!_utils.xapiValidationUtils.isNonNullMapObject(interactionComponent)) { @@ -659,7 +717,6 @@ function validateInteractionComponentArray(components, interactionType, allowedI }); } else { validatePropertyIsString(interactionComponent, _properties.properties.ID, perComponentTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION); - if (ids.indexOf(interactionComponent.id) !== _general.xapiGeneral.NO_INDEX_FOUND) { localErrors.push({ trace: _utils.xapiValidationUtils.addPropToTrace(perComponentTrace, _properties.properties.ID), @@ -681,7 +738,7 @@ function validateInteractionComponentArray(components, interactionType, allowedI validateLanguageMap(interactionComponent.description, _utils.xapiValidationUtils.addPropToTrace(perComponentTrace, _properties.properties.DESCRIPTION), localErrors); validateAbsenceOfNonWhitelistedProperties(interactionComponent, _whitelists.xapiWhiteListProperties.COMPONENT_ARRAY, perComponentTrace, localErrors); } - } + }); } } else if (interactionType && components) { localErrors.push({ @@ -695,7 +752,7 @@ function validateInteractionComponentArray(components, interactionType, allowedI } function validateActivityDefintion(definition, trace, errors) { - var localErrors, localTrace, correctResponsesPatternTrace, correctResponsesPatternLength, crpItem, i; + var localErrors, localTrace, correctResponsesPatternTrace; localErrors = errors || []; localTrace = trace || _properties.properties.DEFINITION; @@ -744,19 +801,15 @@ function validateActivityDefintion(definition, trace, errors) { level: _errors.xapiErrorLevels.MUST_VIOLATION }); } else { - correctResponsesPatternLength = definition.correctResponsesPattern.length; - - for (i = 0; i < correctResponsesPatternLength; i += 1) { - crpItem = definition.correctResponsesPattern[i]; - - if (crpItem === null || crpItem === undefined || !_utils.xapiValidationUtils.isString(crpItem)) { + definition.correctResponsesPattern.forEach(function (response, i) { + if (response === null || response === undefined || !_utils.xapiValidationUtils.isString(response)) { localErrors.push({ trace: _utils.xapiValidationUtils.addLookupToTrace(correctResponsesPatternTrace, i), message: _errors.xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS, level: _errors.xapiErrorLevels.MUST_VIOLATION }); } - } + }); } } @@ -1059,7 +1112,7 @@ function validateAttachmentObject(attachment, trace, errors) { } function validateAttachments(attachments, trace, errors) { - var localErrors, localTrace, attachmentsLength, i; + var localErrors, localTrace; localErrors = errors || []; localTrace = trace || _properties.properties.ATTACHMENTS; @@ -1078,10 +1131,9 @@ function validateAttachments(attachments, trace, errors) { return localErrors; } - attachmentsLength = attachments.length; - for (i = 0; i < attachmentsLength; i += 1) { - validateAttachmentObject(attachments[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); - } + attachments.forEach(function (attachment, i) { + validateAttachmentObject(attachment, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + }); return localErrors; } @@ -1128,7 +1180,7 @@ function validateAgent(agent, trace, errors) { } function validateGroup(group, trace, errors) { - var localErrors, localTrace, memberTrace, ifiCount, numMembers, i; + var localErrors, localTrace, memberTrace, ifiCount; localErrors = errors || []; localTrace = trace || _properties.properties.GROUP; @@ -1174,11 +1226,9 @@ function validateGroup(group, trace, errors) { level: _errors.xapiErrorLevels.MUST_VIOLATION }); } else { - numMembers = group.member.length; - - for (i = 0; i < numMembers; i += 1) { - validateAgent(group.member[i], _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors); - } + group.member.forEach(function (member, i) { + validateAgent(member, _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors); + }); } } @@ -1248,7 +1298,7 @@ function validateAuthority(authority, trace, errors) { } function validateContextActivitySubContext(subContext, trace, errors) { - var localErrors, localTrace, numActivities, i; + var localErrors, localTrace; localErrors = errors || []; localTrace = trace || _properties.properties.SUB_CONTEXT; @@ -1264,10 +1314,9 @@ function validateContextActivitySubContext(subContext, trace, errors) { level: _errors.xapiErrorLevels.MUST_VIOLATION }); } else if (_utils.xapiValidationUtils.isArray(subContext)) { - numActivities = subContext.length; - for (i = 0; i < numActivities; i += 1) { - validateActivity(subContext[i], _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); - } + subContext.forEach(function (activity, i) { + validateActivity(activity, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + }); } else if (_utils.xapiValidationUtils.isObject(subContext)) { localErrors.push({ trace: _utils.xapiValidationUtils.localTraceToString(localTrace), @@ -1392,7 +1441,7 @@ function validateContext(context, trace, errors, statementObjectObjectType) { } validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors); - validateAbsenceOfNonWhitelistedProperties(context, [_properties.properties.REGISTRATION, _properties.properties.INSTRUCTOR, _properties.properties.TEAM, _properties.properties.CONTEXT_ACTIVITIES, _properties.properties.REVISION, _properties.properties.PLATFORM, _properties.properties.LANGUAGE, _properties.properties.STATEMENT, _properties.properties.EXTENSIONS], localTrace, localErrors); + validateAbsenceOfNonWhitelistedProperties(context, _whitelists.xapiWhiteListProperties.EXTENSIONS, localTrace, localErrors); return localErrors; } @@ -1424,34 +1473,40 @@ function validateObject(object, trace, errors, isWithinSubStatement) { } validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION); + objectType = object.objectType || _properties.objectTypes.ACTIVITY; - // TODO: Switch - if (objectType === _properties.objectTypes.ACTIVITY) { - validateActivity(object, localTrace, localErrors); - } else if (objectType === _properties.objectTypes.AGENT) { - validateAgent(object, localTrace, localErrors); - } else if (objectType === _properties.objectTypes.GROUP) { - validateGroup(object, localTrace, localErrors); - } else if (objectType === _properties.objectTypes.STATEMENT_REF) { - validateStatementRef(object, localTrace, localErrors); - } else if (objectType === _properties.objectTypes.SUB_STATEMENT) { - if (isWithinSubStatement) { + switch (objectType) { + case _properties.objectTypes.ACTIVITY: + validateActivity(object, localTrace, localErrors); + break; + case _properties.objectTypes.AGENT: + validateAgent(object, localTrace, localErrors); + break; + case _properties.objectTypes.GROUP: + validateGroup(object, localTrace, localErrors); + break; + case _properties.objectTypes.STATEMENT_REF: + validateStatementRef(object, localTrace, localErrors); + break; + case _properties.objectTypes.SUB_STATEMENT: + if (isWithinSubStatement) { + localErrors.push({ + trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE), + message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT, + level: _errors.xapiErrorLevels.MUST_VIOLATION + }); + } + validateStatement(object, localTrace, localErrors, /*isSubStatement*/true); + break; + default: localErrors.push({ trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE), - message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT, + message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(), level: _errors.xapiErrorLevels.MUST_VIOLATION }); - } - - validateStatement(object, localTrace, localErrors, /*isSubStatement*/true); - } else { - localErrors.push({ - trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE), - message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(), - level: _errors.xapiErrorLevels.MUST_VIOLATION - }); } + return localErrors; } @@ -1581,73 +1636,8 @@ xapiValidator = { exports.default = xapiValidator; -window.xapiValidator = xapiValidator; - -},{"../constants/errors":1,"../constants/general":2,"../constants/interaction-types":3,"../constants/properties":4,"../constants/regex":5,"../constants/whitelists":6,"../utils/utils":8}],8:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.xapiValidationUtils = undefined; - -var _regex = require('../constants/regex'); - -var _properties = require('../constants/properties'); - -var IS_STRING = '[object String]', - IS_ARRAY = '[object Array]', - IS_BOOLEAN = '[object Boolean]', - IS_NUMBER = '[object Number]'; - -var toString = Object.prototype.toString; -var xapiValidationUtils; - -exports.xapiValidationUtils = xapiValidationUtils = { - isString: function isString(obj) { - return toString.call(obj) === IS_STRING; - }, - isObject: function isObject(obj) { - return obj === Object(obj); - }, - - - isArray: Array.isArray || function (obj) { - return toString.call(obj) === IS_ARRAY; - }, - - isBoolean: function isBoolean(obj) { - return obj === true || obj === false || toString.call(obj) === IS_BOOLEAN; - }, - isNumber: function isNumber(obj) { - return toString.call(obj) === IS_NUMBER; - }, - isDefined: function isDefined(obj) { - return obj !== null || obj !== undefined; - }, - isNonNullMapObject: function isNonNullMapObject(target) { - return this.isDefined(target) && this.isObject(target) && !this.isArray(target); - }, - isValidLanguageTag: function isValidLanguageTag(target) { - // TODO - use more precise 5646 handling, rather than this simplified BCP 47 regex, which combines RFC 5646 and RFC 4647. - return this.isDefined(target) && this.isString(target) && _regex.xapiValidationRegex.BCP_47.test(target); - }, - addPropToTrace: function addPropToTrace(trace, addendum) { - return this.isDefined(addendum) ? trace + '.' + addendum : trace; - }, - addLookupToTrace: function addLookupToTrace(trace, key) { - return !this.isDefined(key) ? trace : this.isNumber(key) ? trace + '[' + key + ']' : trace + '["' + key + '"]'; - }, - localTraceToString: function localTraceToString(trace, addendum) { - return this.addPropToTrace(trace, addendum); - }, - isGroup: function isGroup(actorOrGroup) { - return actorOrGroup.member !== null && actorOrGroup.member !== undefined || actorOrGroup.objectType === _properties.objectTypes.GROUP; - } -}; - -exports.xapiValidationUtils = xapiValidationUtils; +window.xapiValidator = xapiValidator; //FIXME -},{"../constants/properties":4,"../constants/regex":5}]},{},[7])(7) +},{"./constants/errors":1,"./constants/general":2,"./constants/interaction-types":3,"./constants/properties":4,"./constants/regex":5,"./constants/whitelists":6,"./utils/utils":7}]},{},[8])(8) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjb25zdGFudHMvZXJyb3JzLmpzIiwiY29uc3RhbnRzL2dlbmVyYWwuanMiLCJjb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJjb25zdGFudHMvcHJvcGVydGllcy5qcyIsImNvbnN0YW50cy9yZWdleC5qcyIsImNvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIiwidXRpbHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7QUFFQSxJQUFNLGtCQUFrQixPQUFPLE1BQVAsQ0FBYztBQUNwQyxpQkFBa0IsZUFEa0I7QUFFcEMsa0JBQWtCLGdCQUZrQjtBQUdwQyxvQkFBa0I7QUFIa0IsQ0FBZCxDQUF4Qjs7QUFNQSxJQUFNLHVCQUF1QixPQUFPLE1BQVAsQ0FBYztBQUN6QyxjQUFrRCxtQ0FEVDtBQUV6QyxrQkFBa0QseUNBRlQ7QUFHekMsbUJBQWtELHNEQUhUO0FBSXpDLHNCQUFrRCw2Q0FKVDtBQUt6Qyx1QkFBa0QsMERBTFQ7QUFNekMsc0JBQWtELHVFQU5UO0FBT3pDLG1CQUFrRCwwQ0FQVDtBQVF6QywyQkFBa0QsdURBUlQ7QUFTekMsa0JBQWtELHlDQVRUO0FBVXpDLDBCQUFrRCxzREFWVDtBQVd6QyxvQkFBa0QsbUZBWFQ7QUFZekMsNkJBQWtELDJGQVpUO0FBYXpDLCtCQUFrRCxvRUFiVDtBQWN6QyxrQ0FBa0QsMkRBZFQ7QUFlekMsNEJBQWtELDRDQWZUO0FBZ0J6QyxtQ0FBa0QseURBaEJUO0FBaUJ6Qyx5QkFBa0QsdUJBakJUO0FBa0J6Qyx5QkFBa0QsaURBbEJUO0FBbUJ6Qyw4QkFBa0Qsd0NBbkJUO0FBb0J6QyxvQ0FBa0QsaUVBcEJUO0FBcUJ6Qyx5Q0FBa0Qsb0VBckJUO0FBc0J6QywwQ0FBa0QsNEVBdEJUO0FBdUJ6QyxnQ0FBa0QsZ0ZBdkJUO0FBd0J6QyxxQkFBa0Qsd0VBeEJUO0FBeUJ6QyxxQ0FBa0QseUVBekJUO0FBMEJ6QyxrQ0FBa0Qsd0dBMUJUO0FBMkJ6QywrQkFBa0Qsa0RBM0JUO0FBNEJ6QywyQ0FBa0QsOEVBNUJUO0FBNkJ6Qyw2Q0FBa0Qsa0RBN0JUO0FBOEJ6QywyQ0FBa0QseUNBOUJUO0FBK0J6Qyw4Q0FBa0QscURBL0JUO0FBZ0N6QyxxQ0FBa0QscUZBaENUO0FBaUN6Qyw2QkFBa0Qsa0ZBakNUO0FBa0N6Qyw4QkFBa0QsK0RBbENUO0FBbUN6QyxnQ0FBa0Qsd0ZBbkNUO0FBb0N6QyxnQ0FBa0Qsd0ZBcENUO0FBcUN6Qyw2QkFBa0QscUZBckNUO0FBc0N6Qyw2QkFBa0QsNkNBdENUO0FBdUN6QywwQkFBa0Qsd0VBdkNUO0FBd0N6Qyx3Q0FBa0QsbUZBeENUO0FBeUN6QyxzQkFBa0QsNEVBekNUO0FBMEN6QywyQ0FBa0Qsa0ZBMUNUO0FBMkN6Qyw0Q0FBa0Qsc0RBM0NUO0FBNEN6QywwQkFBa0QsMERBNUNUO0FBNkN6QywrQ0FBa0Qsd0RBN0NUO0FBOEN6QyxvQ0FBa0QsNERBOUNUO0FBK0N6QyxzQ0FBa0QseUNBL0NUO0FBZ0R6QyxxQ0FBa0QsdUNBaERUO0FBaUR6QywwQ0FBa0Qsc0ZBakRUO0FBa0R6Qyw2Q0FBa0QsNEVBbERUO0FBbUR6QyxxQ0FBa0QsdUNBbkRUO0FBb0R6QyxnREFBa0QsMERBcERUO0FBcUR6QywwQ0FBa0QscUZBckRUO0FBc0R6Qyw4QkFBa0QsNkRBdERUO0FBdUR6QywwQkFBa0QseUJBdkRUO0FBd0R6Qyx5Q0FBa0QscUVBeERUO0FBeUR6Qyw2Q0FBa0Qsc0lBekRUO0FBMER6Qyx1Q0FBa0Qsd0RBMURUO0FBMkR6Qyx5Q0FBa0QscUhBM0RUO0FBNER6QyxvREFBa0Qsc0dBNURUO0FBNkR6QyxrREFBa0QsaUVBN0RUO0FBOER6QyxzQ0FBa0QsbUVBOURUO0FBK0R6QyxvQ0FBa0QsOERBL0RUO0FBZ0V6QyxtQ0FBa0QseUZBaEVUO0FBaUV6QywyQkFBa0QscUZBakVUO0FBa0V6QywwQkFBa0QscUNBbEVUO0FBbUV6QyxzQ0FB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NkJELE1BN0JDLEVBNkJPO0FBQ3pCO0FBQ0EsV0FBTyxLQUFLLFNBQUwsQ0FBZSxNQUFmLEtBQTBCLEtBQUssUUFBTCxDQUFjLE1BQWQsQ0FBMUIsSUFBbUQsMkJBQW9CLE1BQXBCLENBQTJCLElBQTNCLENBQWdDLE1BQWhDLENBQTFEO0FBQ0QsR0FoQ21CO0FBa0NwQixnQkFsQ29CLDBCQWtDTCxLQWxDSyxFQWtDRSxRQWxDRixFQWtDWTtBQUM5QixXQUFPLEtBQUssU0FBTCxDQUFlLFFBQWYsSUFBOEIsS0FBOUIsU0FBdUMsUUFBdkMsR0FBb0QsS0FBM0Q7QUFDRCxHQXBDbUI7QUFzQ3BCLGtCQXRDb0IsNEJBc0NILEtBdENHLEVBc0NJLEdBdENKLEVBc0NTO0FBQzNCLFdBQVEsQ0FBQyxLQUFLLFNBQUwsQ0FBZSxHQUFmLENBQUYsR0FBeUIsS0FBekIsR0FBa0MsS0FBSyxRQUFMLENBQWMsR0FBZCxJQUF3QixLQUF4QixTQUFpQyxHQUFqQyxTQUE2QyxLQUE3QyxVQUF1RCxHQUF2RCxPQUF6QztBQUNELEdBeENtQjtBQTBDcEIsb0JBMUNvQiw4QkEwQ0QsS0ExQ0MsRUEwQ00sUUExQ04sRUEwQ2dCO0FBQ2xDLFdBQU8sS0FBSyxjQUFMLENBQW9CLEtBQXBCLEVBQTJCLFFBQTNCLENBQVA7QUFDRCxHQTVDbUI7QUE4Q3BCLFNBOUNvQixtQkE4Q1osWUE5Q1ksRUE4Q0U7QUFDcEIsV0FBUSxhQUFhLE1BQWIsS0FBd0IsSUFBeEIsSUFBZ0MsYUFBYSxNQUFiLEtBQXdCLFNBQXpELElBQXVFLGFBQWEsVUFBYixLQUE0Qix3QkFBWSxLQUF0SDtBQUNEO0FBaERtQixDQUF0Qjs7UUFtRFEsbUIsR0FBQSxtQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlFcnJvckxldmVscyA9IE9iamVjdC5mcmVlemUoe1xuICBNQVlfVklPTEFUSU9OOiAgICAnTUFZX1ZJT0xBVElPTicsXG4gIE1VU1RfVklPTEFUSU9OOiAgICdNVVNUX1ZJT0xBVElPTicsXG4gIFNIT1VMRF9WSU9MQVRJT046ICdTSE9VTERfVklPTEFUSU9OJ1xufSk7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFVORVhQRUNURUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgcHJvcGVydHkgbm90IHBlcm1pdHRlZCcsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX1VSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIFVSSSBzdHJpbmcuJyxcbiAgTVVTVF9CRV9VUklfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgVVJJIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX0JPT0xFQU46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIEJvb2xlYW4uJyxcbiAgTVVTVF9CRV9CT09MRUFOX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgQm9vbGVhbiBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX05VTUJFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIE51bWJlci4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9NQk9YX1VSSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgd2FzIG5vdCBhIHN0cmluZyBhdCBhbGwuJyxcbiAgTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICAgICAnbWJveCBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBFWFRFTlNJT05TX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgZXh0ZW5zaW9ucyBwcm9wZXJ0eSBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBMQU5HVUFHRV9NQVBTX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICdMYW5ndWFnZSBNYXBzLCB3aGVuIHByZXNlbnQsIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBMQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdrZXksIExhbmd1YWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gUkZDIDU2NDYnLFxuICBMQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICdrZXk6IExhbmd1YWdlIE1hcCB2YWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcsIGJ1dCB3YXMgbm90JyxcbiAgVkVSQl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBtdXN0IGJlIHByb3ZpZGVkJyxcbiAgVkVSQl9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyYiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBESVNQTEFZX1NIT1VMRF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICAgICAgICAgICdcImRpc3BsYXlcIiBwcm9wZXJ0eSBzaG91bGQgYmUgcHJvdmlkZWQuJyxcbiAgSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkU6ICAgICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gQWN0aXZpdHkgRGVmaW5pdGlvbnMgc2hvdWxkIGhhdmUgYSB0eXBlIHByb3BlcnR5IG9mJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX1NIT1VMRF9CRV9BUlJBWTogICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkuJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBtZW1iZXIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfQ01JOiAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJpbnRlcmFjdGlvblR5cGVcIiB2YWx1ZSBtdXN0IGJlIGEgQ01JIGludGVyYWN0aW9uIHR5cGUgb3B0aW9uLicsXG4gIElEX01VU1RfQkVfVU5JUVVFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBlYWNoIGludGVyYWN0aW9uIGNvbXBvbmVudCBhcnJheScsXG4gIElEX1NIT1VMRF9OT1RfQ09OVEFJTl9XSElURVNQQUNFUzogICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG9uIGludGVyYWN0aW9uIGNvbXBvbmVudHMgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlc3BhY2UnLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIHByb3BlcnR5IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXNlbnQgaW50ZXJhY3Rpb25UeXBlIG9mOiAnLFxuICBERUZJTklUSU9OU19NVVNUX0JFX09CSkVDVFM6ICAgICAgICAgICAgICAgICAgICAgICdcImRlZmluaXRpb25zXCIsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBtYXAgb2JqZWN0cycsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9BUlJBWTogICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuXCIgdmFsdWUgbXVzdCBiZSBhbiBBcnJheSBvZiBzdHJpbmdzLicsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9TVFJJTkdTOiAgICAgICAgJ1wiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiBpdGVtcyBtdXN0IGJlIHN0cmluZ3MuJyxcbiAgQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAgICAnQWN0aXZpdGllcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAnU3RhdGVtZW50UmVmIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgT0JKRUNUX1RZUEVfTVVTVF9CRV9TVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAgICAnXCJvYmplY3RUeXBlXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBcIlN0YXRlbWVudFJlZlwiIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRF9VVUlEX1JFRjogICAgICAgICAgICAgICAgICAgICAgICAnXCJpZFwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgYSB2YWxpZCBVVUlEIHN0cmluZyBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIFNDQUxFRF9NVVNUX0JFX0JFVFdFRU5fMF8xOiAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBzY2FsZWQgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEnLFxuICBSQVdfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBNQVhfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOOiAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwibWF4XCIgYW5kIFwibWluXCIgYXJlIHByZXNlbnQsIHRoZSBtYXggcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtaW4nLFxuICBSQVdfTVVTVF9CRV9MRVNTX1RIQU5fTUFYOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBib3RoIFwicmF3XCIgYW5kIFwibWF4XCIgYXJlIHByZXNlbnQsIHRoZSByYXcgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiBtYXgnLFxuICBSRVNVTFRfTVVTVF9CRV9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgcmVzdWx0IG11c3QgYmUgYSBtYXAgb2JqZWN0JyxcbiAgRFVSQVRJT05fTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiZHVyYXRpb25cIiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGFuIElTTyA4NjAxIGR1cmF0aW9uJyxcbiAgREFURV9TSE9VTERfSU5DTFVERV9aT05FX0lORk9STUFUSU9OOiAgICAgICAgICAgICAnSVNPIDg2MDEgZGF0ZSB0aW1lIHN0cmluZ3MgdXNlZCBpbiB0aGUgeEFQSSBzaG91bGQgaW5jbHVkZSB0aW1lIHpvbmUgaW5mb3JtYXRpb24uJyxcbiAgREFURV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eXMgc3RyaW5nIHZhbHVlIG11c3QgYmUgY29uZm9ybWFudCB0byBJU08gODYwMSBmb3IgRGF0ZSBUaW1lcy4nLFxuICBWRVJTSU9OX01VU1RfQ09NUExZX1NFTUFOVElDX1ZFUlNJT05JTkc6ICAgICAgICAgICdcInZlcnNpb25cIiBtdXN0IGJlIGEgbm9uLW51bGwgc3RyaW5nIHRoYXQgY29tcGxpZXMgd2l0aCBTZW1hbnRpYyBWZXJzaW9uaW5nIDEuMC4wJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgICAnXCJhdHRhY2htZW50XCIgaW5zdGFuY2VzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWTogICAgICAgICAgICAgICAnXCJhdHRhY2htZW50c1wiIG11c3QgYmUgYSBub24tbnVsbCBBcnJheS4nLFxuICBBR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImFnZW50XCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBBR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gXCJhZ2VudFwiLicsXG4gIEFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTOiAgICAgICAgJ0ludmFsaWQgb2JqZWN0IHdpdGggY2hhcmFjdGVyaXN0aWNzIG9mIGEgR3JvdXAgd2hlbiBhbiBBZ2VudCB3YXMgZXhwZWN0ZWQuJyxcbiAgR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJncm91cFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgTUVNQkVSX01VU1RfQkVfUFJPVklERURfRk9SX0FOT05ZTU9VU19HUk9VUFM6ICAgICAnXCJtZW1iZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIGZvciBBbm9ueW1vdXMgR3JvdXBzLicsXG4gIEdST1VQX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIFwiZ3JvdXBcIi4nLFxuICBHUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWTogICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgbWVtYmVyIHByb3BlcnR5IG9mIGEgR3JvdXAgbXVzdCBiZSBhbiBBcnJheScsXG4gIEFDVE9SX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdG9yIG11c3QgYmUgcHJvdmlkZWQuJyxcbiAgQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVDogICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV086ICAgICAgICAnSWYgdXNlZCBhcyBhIEdyb3VwLCB0aGUgXCJhdXRob3JpdHlcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBcIm1lbWJlclwiIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBleGFjdGx5IHR3byBBZ2VudCBvYmplY3RzLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgJ1wiQ29udGV4dCBBY3Rpdml0aWVzXCIgcHJvcGVydHkgdmFsdWVzIG11c3Qgbm90IGJlIG51bGwuJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWTogICAgICAgICAgICAnQ29udGV4dCBBY3Rpdml0aWVzIHByb3BlcnR5IHZhbHVlcyBzaG91bGQgcHJlZmVyIHRvIGJlIGFuIGFycmF5IG9mIEFjdGl2aXRpZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQWN0aXZpdHkgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgUkVHSVNUUkFUSU9OX01VU1RfQkVfVVVJRF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBtdXN0IGJlIGEgVVVJRCBzdHJpbmcuJyxcbiAgUkVWSVNJT05fTVVTVF9CRV9BR0VOVF9PUl9HUk9VUDogICAgICAgICAgICAgICAgICAnVGhlIHJldmlzaW9uIHByb3BlcnR5IG11c3Qgbm90IGJlIHVzZWQgaWYgdGhlIFN0YXRlbWVudFxcJ3MgT2JqZWN0IGlzIGFuIEFnZW50IG9yIEdyb3VwLicsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgT0JKRUNUX01VU1RfQkVfREVGSU5FRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJvYmplY3RcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIE9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQ6ICAgICAnQSBTdWJTdGF0ZW1lbnQgbXVzdCBub3QgY29udGFpbiBhIFN1YlN0YXRlbWVudCcsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIElEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUzogICAgICAgICAgICAgICAgICAgJ0lkcyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBBY3Rpdml0eSBQcm92aWRlciwgYW5kIG11c3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBMUlMnLFxuICBJRF9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJZCB3YXMgbm90IGEgdmFsaWQgVVVJRCcsXG4gIFNUQVRFTUVOVF9BUkdVTUVOVF9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgJ05vIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgICdOdWxsIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9CRV9QQVJTRURfQ09SUkVDVExZOiAgICAgICAgICAgICAgICdOdWxsIG9yIG5vbi1vYmplY3Qgc3RhdGVtZW50IHZhbHVlIHBhcnNlZCBmcm9tIHByb3ZpZGVkIHN0YXRtZW50IEpTT04uJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXVxufSk7XG5cbiBleHBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi4vY29uc3RhbnRzL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc30gZnJvbSAnLi4vY29uc3RhbnRzL3doaXRlbGlzdHMnO1xuaW1wb3J0IHt4YXBpRXJyb3JMZXZlbHMsIHhhcGlWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHt4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9pbnRlcmFjdGlvbi10eXBlcyc7XG5pbXBvcnQge3hhcGlHZW5lcmFsfSBmcm9tICcuLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxudmFyIHhhcGlWYWxpZGF0b3I7XG5cbmZ1bmN0aW9uIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3JzKSB7XG4gIHZhciB2ZXJzaW9uO1xuXG4gIGluc3RhbmNlID0gaW5zdGFuY2UgfHwgbnVsbDtcbiAgZXJyb3JzICAgPSBlcnJvcnMgfHwgbnVsbDtcbiAgdmVyc2lvbiAgPSB4YXBpR2VuZXJhbC5GSVJTVF9SRVBPUlRfVkVSU1RJT047XG4gIHJldHVybiB7aW5zdGFuY2UsIGVycm9ycywgdmVyc2lvbn07XG59XG5cbmZ1bmN0aW9uIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KGluc3RhbmNlLCBlcnJvcikge1xuICByZXR1cm4gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkID8gW10gOiBbZXJyb3JdKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXModGFyZ2V0LCBhbGxvd2VkUHJvcGVydGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG5cbiAgZm9yIChwcm9wZXJ0eU5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpICYmIGFsbG93ZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHlOYW1lKSA9PT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlVORVhQRUNURUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQsIHZpb2xhdGlvblR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWUsIGxvY2FsVmlvbGF0aW9uVHlwZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgICAgICAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV0sXG4gIGxvY2FsVmlvbGF0aW9uVHlwZSA9IHZpb2xhdGlvblR5cGUgfHwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICBsb2NhbFZpb2xhdGlvblR5cGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gdGFyZ2V0W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguSVJJLnRlc3QocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfSVJJX1NUUklOR31gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9VUklfUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmwodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgLy8gVE9ETyAtIGNoZWNrIHdoZXRoZXIgYSBmb3JtYWwgVVJMIGZvcm1hdCBkZWZpbml0aW9uIGlzIHJlY29tbWVuZGVkL2VuZm9yY2VkIGZvciB4QVBJXG4gIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNCb29sZWFuKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQm9vbGVhbihwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTn1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfQk9PTEVBTl9QUkVTRU5UfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOdW1iZXIocHJvcFZhbHVlKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX05VTUJFUn1gLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJfUFJFU0VOVH1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSUZJUHJvcGVydGllcyh0YXJnZXQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBhY2NvdW50VHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGlmICh0YXJnZXQubWJveCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5tYm94ICE9PSBudWxsKSB7XG4gICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX01CT1hfVVJJLFxuICAgICAgICBsZXZlbDogeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4Lk1BSUxUT19VUkkudGVzdCh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXMsIHByb3BlcnRpZXNMZW5ndGgsIGksIHByb3BOYW1lLCBwcm9wVmFsdWU7XG5cbiAgaWZpcyA9IFtdO1xuICBwcm9wZXJ0aWVzTGVuZ3RoID0geGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLmxlbmd0aDtcblxuICBpZiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdW5kZWZpbmVkKSAge1xuICAgIHJldHVybiBpZmlzO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXNMZW5ndGg7IGkgKz0gMSkge1xuICAgIHByb3BOYW1lICA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lc1tpXTtcbiAgICBwcm9wVmFsdWUgPSB0YXJnZXRbcHJvcE5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWZpcy5wdXNoKHtrZXk6IHByb3BOYW1lLCB2YWx1ZTogcHJvcFZhbHVlfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlmaXM7XG59XG5cbmZ1bmN0aW9uIGdldElGSUNvdW50KHRhcmdldCkge1xuICByZXR1cm4gZ2V0SUZJcyh0YXJnZXQpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdLFxuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlM7XG5cbiAgaWYgKGV4dGVuc2lvbnMgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChleHRlbnNpb25zKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIC8vIFRPRE8gLSBkb3VibGUtY2hlY2sgd2hhdCBmdXJ0aGVyIGVuZm9yY2VhYmxlIGNvbnN0cmFpbnRzIGV4aXN0IG9uIGV4dGVuc2lvbiBvYmplY3QgcHJvcGVydGllc1xuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcE5hbWUsIG1hcHBlZFZhbHVlO1xuXG4gICAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gICAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGxhbmd1YWdlTWFwKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gbGFuZ3VhZ2VNYXApIHtcbiAgICAgIGlmIChsYW5ndWFnZU1hcC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzVmFsaWRMYW5ndWFnZVRhZyhwcm9wTmFtZSkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcE5hbWUpLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7cHJvcE5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEfWAsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICAgIGlmIChtYXBwZWRWYWx1ZSA9PT0gbnVsbCB8fCBtYXBwZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKG1hcHBlZFZhbHVlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3Byb3BOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUF9LRVlfTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgICBpZiAodmVyYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUkJfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICAgIH1cblxuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKHZlcmIsIHByb3BlcnRpZXMuSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi90cnVlKTtcblxuICAgIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVMYW5ndWFnZU1hcCh2ZXJiLmRpc3BsYXksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlzQWxsb3dlZENvbXBvbmVudFR5cGUsIGlkcywgaW50ZXJhY3Rpb25Db21wb25lbnQsIGNvbXBvbmVudHNMZW5ndGgsIHBlckNvbXBvbmVudFRyYWNlLCBpO1xuXG4gICAgbG9jYWxFcnJvcnMgICAgICAgICAgICA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuSU5URVJBQ1RJT05fQ09NUE9ORU5UUztcbiAgICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgICBpZHMgICAgICAgICAgICAgICAgICAgID0gW107XG5cblxuICAgIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBvbmVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25Db21wb25lbnQgPSBjb21wb25lbnRzW2ldO1xuICAgICAgICAgIHBlckNvbXBvbmVudFRyYWNlICAgID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIGkpO1xuXG4gICAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICB0cmFjZTogICBwZXJDb21wb25lbnRUcmFjZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgcHJvcGVydGllcy5JRCwgcGVyQ29tcG9uZW50VHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlkcy5wdXNoKGludGVyYWN0aW9uQ29tcG9uZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoaW50ZXJhY3Rpb25Db21wb25lbnQuZGVzY3JpcHRpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuREVTQ1JJUFRJT04pLCBsb2NhbEVycm9ycyk7XG4gICAgICAgICAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09NUE9ORU5UX0FSUkFZLCBwZXJDb21wb25lbnRUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpbnRlcmFjdGlvblR5cGUgJiYgY29tcG9uZW50cykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9WQUxJRH0gJHtpbnRlcmFjdGlvblR5cGV9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlEZWZpbnRpb24oZGVmaW5pdGlvbiwgdHJhY2UsIGVycm9ycykge1xuICAgIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5MZW5ndGgsIGNycEl0ZW0sIGk7XG5cbiAgICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5ERUZJTklUSU9OO1xuICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTik7XG5cbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVMYW5ndWFnZU1hcChkZWZpbml0aW9uLm5hbWUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5OQU1FKSwgbG9jYWxFcnJvcnMpO1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKGRlZmluaXRpb24sIHByb3BlcnRpZXMuVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNVcmwoZGVmaW5pdGlvbiwgcHJvcGVydGllcy5NT1JFX0lORk8sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gICAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgICBpZiAoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0geGFwaUdlbmVyYWwuSU5URVJBQ1RJT05fREVGSU5JVElPTl9UWVBFKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVFlQRSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkV9IFwiJHt4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEV9XCJgLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybi5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuTGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBjcnBJdGVtID0gZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybltpXTtcblxuICAgICAgICAgIGlmIChjcnBJdGVtID09PSBudWxsIHx8IGNycEl0ZW0gPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjcnBJdGVtKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblRyYWNlLCBpKSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgICAgZGVmaW5pdGlvbi5jaG9pY2VzLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ0hPSUNFUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgICBkZWZpbml0aW9uLnNjYWxlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5MSUtFUlRdLFxuICAgICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNDQUxFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24udGFyZ2V0LFxuICAgICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVEFSR0VUKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcblxuICAgIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICAgIGRlZmluaXRpb24uc3RlcHMsXG4gICAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICAgIFtwcm9wZXJ0aWVzLlBFUkZPUk1BTkNFXSxcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEVQUyksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG5cbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhkZWZpbml0aW9uLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWV9ERUZJTklUSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGF0dGFjaG1lbnRzTGVuZ3RoLCBpO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTO1xuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoYXR0YWNobWVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShhdHRhY2htZW50cykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgYXR0YWNobWVudHNMZW5ndGggPSBhdHRhY2htZW50cy5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBhdHRhY2htZW50c0xlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnRzW2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBZ2VudChhZ2VudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFHRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYWdlbnQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmaUNvdW50ID0gZ2V0SUZJQ291bnQoYWdlbnQpO1xuXG4gIGlmIChpZmlDb3VudCAhPT0geGFwaUdlbmVyYWwuTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWdlbnQub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVApIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1MsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhhZ2VudCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoYWdlbnQsIHByb3BlcnRpZXMuTkFNRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhZ2VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQUdFTlQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlR3JvdXAoZ3JvdXAsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBtZW1iZXJUcmFjZSwgaWZpQ291bnQsIG51bU1lbWJlcnMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuR1JPVVA7XG4gIG1lbWJlclRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUik7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChncm91cCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGdyb3VwKTtcblxuICBpZiAoaWZpQ291bnQgPT09IDApIHtcbiAgICBpZiAoZ3JvdXAubWVtYmVyID09PSBudWxsIHx8IGdyb3VwLm1lbWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgbWVtYmVyVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpZmlDb3VudCA+IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVJRklQcm9wZXJ0aWVzKGdyb3VwLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGdyb3VwLCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKGdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGdyb3VwLm1lbWJlcikpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01FTUJFUl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1NZW1iZXJzID0gZ3JvdXAubWVtYmVyLmxlbmd0aDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG51bU1lbWJlcnM7IGkgKz0gMSkge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KGdyb3VwLm1lbWJlcltpXSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGdyb3VwLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5HUk9VUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3RvcihhY3RvciwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUNUT1I7XG5cbiAgaWYgKGFjdG9yID09PSBudWxsIHx8IGFjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUNUT1JfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhY3RvcikpIHtcbiAgICB2YWxpZGF0ZUdyb3VwKGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVBZ2VudChhY3RvciwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml0eShhdXRob3JpdHksIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFVVEhPUklUWTtcblxuICBpZiAoYXV0aG9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGF1dGhvcml0eSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzR3JvdXAoYXV0aG9yaXR5KSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgaWYgKCFhdXRob3JpdHkubWVtYmVyIHx8ICFhdXRob3JpdHkubWVtYmVyLmxlbmd0aCB8fCBhdXRob3JpdHkubWVtYmVyLmxlbmd0aCAhPT0geGFwaUdlbmVyYWwuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlMpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGF1dGhvcml0eSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoc3ViQ29udGV4dCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG51bUFjdGl2aXRpZXMsIGk7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1VCX0NPTlRFWFQ7XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IG51bGwpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3ViQ29udGV4dCkpIHtcbiAgICAgIG51bUFjdGl2aXRpZXMgPSBzdWJDb250ZXh0Lmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1BY3Rpdml0aWVzOyBpICs9IDEpIHtcbiAgICAgICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0W2ldLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgICAgIH1cbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN1YkNvbnRleHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVksXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTn0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0QWN0aXZpdGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTO1xuXG4gIGlmIChjb250ZXh0QWN0aXZpdGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0QWN0aXZpdGllcykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5wYXJlbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5QQVJFTlQpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5ncm91cGluZywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkdST1VQSU5HKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMuY2F0ZWdvcnksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DQVRFR09SWSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLm90aGVyLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT1RIRVIpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoY29udGV4dEFjdGl2aXRpZXMsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIHRyYWNlLCBlcnJvcnMsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5DT05URVhUO1xuXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoY29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoY29udGV4dC5yZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCAmJiAoY29udGV4dC5yZWdpc3RyYXRpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoY29udGV4dC5yZWdpc3RyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChjb250ZXh0LnJlZ2lzdHJhdGlvbikpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRUdJU1RSQVRJT05fTVVTVF9CRV9VVUlEX1NUUklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFtvYmplY3RUeXBlcy5HUk9VUCwgb2JqZWN0VHlwZXMuQUdFTlRdLmluZGV4T2Yoc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgaWYgKGNvbnRleHQucmV2aXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVWSVNJT04pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnBsYXRmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBMQVRGT1JNKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUExBVEZPUk1fTVVTVF9OT1RfQkVfVVNFRF9XSVRIX1JFVklTSU9OX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhjb250ZXh0LCBwcm9wZXJ0aWVzLlJFVklTSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi9mYWxzZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUExBVEZPUk0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIGlmIChjb250ZXh0LnRlYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdGVHcm91cChjb250ZXh0LnRlYW0sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5URUFNKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY29udGV4dEFjdGl2aXRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlQ29udGV4dEFjdGl2aXRpZXMoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUyksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIGlmIChjb250ZXh0Lmxhbmd1YWdlICE9PSB1bmRlZmluZWQgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKGNvbnRleHQubGFuZ3VhZ2UpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkxBTkdVQUdFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01VU1RfQkVfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5zdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKGNvbnRleHQuc3RhdGVtZW50LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU1RBVEVNRU5UKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuaW5zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChjb250ZXh0Lmluc3RydWN0b3IpKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOU1RSVUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlQWdlbnQoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUV4dGVuc2lvbnMoY29udGV4dC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoXG4gICAgY29udGV4dCxcbiAgICBbXG4gICAgICBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTixcbiAgICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICAgIHByb3BlcnRpZXMuVEVBTSxcbiAgICAgIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLFxuICAgICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICAgIHByb3BlcnRpZXMuUExBVEZPUk0sXG4gICAgICBwcm9wZXJ0aWVzLkxBTkdVQUdFLFxuICAgICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlNcbiAgICBdLFxuICAgIGxvY2FsVHJhY2UsXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9iamVjdCwgdHJhY2UsIGVycm9ycywgaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBvYmplY3RUeXBlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLk9CSkVDVDtcblxuICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfREVGSU5FRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChvYmplY3QpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhvYmplY3QsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OKTtcbiAgb2JqZWN0VHlwZSA9IG9iamVjdC5vYmplY3RUeXBlIHx8IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIC8vIFRPRE86IFN3aXRjaFxuICBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuQUNUSVZJVFkpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkFHRU5UKSB7XG4gICAgdmFsaWRhdGVBZ2VudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIGlmIChvYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUCkge1xuICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSBpZiAob2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLlNVQl9TVEFURU1FTlQpIHtcbiAgICBpZiAoaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVTdGF0ZW1lbnQob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNTdWJTdGF0ZW1lbnQqL3RydWUpO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSksXG4gICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50KHN0YXRlbWVudCwgdHJhY2UsIGVycm9ycywgaXNTdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlLCB3aGl0ZWxpc3RlZFByb3BlcnRpZXM7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIHdoaXRlbGlzdGVkUHJvcGVydGllcyA9IHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNUQVRFTUVOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KHN0YXRlbWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIWlzU3ViU3RhdGVtZW50KSB7XG4gICAgaWYgKHN0YXRlbWVudC5pZCA9PT0gbnVsbCB8fCBzdGF0ZW1lbnQuaWQgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQuaWQpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEU19TSE9VTERfQkVfR0VORVJBVEVEX0JZX0xSUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURfTVVTVF9CRV9WQUxJRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1VCX1NUQVRFTUVOVDtcbiAgfVxuXG4gIHZhbGlkYXRlQWN0b3Ioc3RhdGVtZW50LmFjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyYihzdGF0ZW1lbnQudmVyYiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUkIpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlT2JqZWN0KHN0YXRlbWVudC5vYmplY3QsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1QpLCBsb2NhbEVycm9ycywgaXNTdWJTdGF0ZW1lbnQpO1xuICB2YWxpZGF0ZVJlc3VsdChzdGF0ZW1lbnQucmVzdWx0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVTVUxUKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUgPSBzdGF0ZW1lbnQub2JqZWN0ICYmIHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA/IHN0YXRlbWVudC5vYmplY3Qub2JqZWN0VHlwZSA6IG9iamVjdFR5cGVzLkFDVElWSVRZO1xuXG4gIHZhbGlkYXRlQ29udGV4dChzdGF0ZW1lbnQuY29udGV4dCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFQpLCBsb2NhbEVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlRJTUVTVEFNUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNJU084NjAxU3RyaW5nKHN0YXRlbWVudCwgcHJvcGVydGllcy5TVE9SRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUF1dGhvcml0eShzdGF0ZW1lbnQuYXV0aG9yaXR5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVVUSE9SSVRZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVZlcnNpb24oc3RhdGVtZW50LnZlcnNpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5WRVJTSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUF0dGFjaG1lbnRzKHN0YXRlbWVudC5hdHRhY2htZW50cywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudCwgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiBtYWtlU3RhdGVtZW50UmVwb3J0KHN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnM7XG5cbiAgbG9jYWxFcnJvcnMgPSBbXTtcbiAgdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUQVRFTUVOVCwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICByZXR1cm4gbWFrZVYxUmVwb3J0KHN0YXRlbWVudCwgbG9jYWxFcnJvcnMpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnQoc3RhdGVtZW50KSB7XG4gIHZhciBzdGF0ZW1lbnRPYmplY3Q7XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChzdGF0ZW1lbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoc3RhdGVtZW50KSkge1xuICAgIHRyeSB7XG4gICAgICBzdGF0ZW1lbnRPYmplY3QgPSBKU09OLnBhcnNlKHN0YXRlbWVudCk7XG4gICAgICBpZiAoc3RhdGVtZW50T2JqZWN0ID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudE9iamVjdCkgfHwgeGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudE9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX0JFX1BBUlNFRF9DT1JSRUNUTFksXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChzdGF0ZW1lbnRPYmplY3QsIHtcbiAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVkFMSURfSlNPTn06ICR7ZS5tZXNzYWdlfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50T2JqZWN0KTtcbiAgfVxuXG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN0YXRlbWVudCkgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdGF0ZW1lbnQpKSB7XG4gICAgcmV0dXJuIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRCxcbiAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSB7XG4gIHJldHVybiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5aT05FXSB8fFxuICAgICAgICAgIChtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5SRUxBVElWRV9USU1FXSAmJiBtYXRjaGVkW2RhdGVGb3JtYXRSZWdleFBvc2l0aW9ucy5USU1FX1pPTkVfSE9VUl0pO1xufVxuXG54YXBpVmFsaWRhdG9yID0ge1xuICB2YWxpZGF0ZVN0YXRlbWVudDogdmFsaWRhdGVBbWJpZ3VvdXNUeXBlU3RhdGVtZW50XG59O1xuXG5leHBvcnQgZGVmYXVsdCB4YXBpVmFsaWRhdG9yO1xud2luZG93LnhhcGlWYWxpZGF0b3IgPSB4YXBpVmFsaWRhdG9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uUmVnZXh9IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge29iamVjdFR5cGVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbmNvbnN0XG4gIElTX1NUUklORyAgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgSVNfQVJSQVkgICA9ICdbb2JqZWN0IEFycmF5XScsXG4gIElTX0JPT0xFQU4gPSAnW29iamVjdCBCb29sZWFuXScsXG4gIElTX05VTUJFUiAgPSAnW29iamVjdCBOdW1iZXJdJztcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciB4YXBpVmFsaWRhdGlvblV0aWxzO1xuXG54YXBpVmFsaWRhdGlvblV0aWxzID0ge1xuICBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19TVFJJTkc7XG4gIH0sXG5cbiAgaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaik7XG4gIH0sXG5cbiAgaXNBcnJheTogQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19BUlJBWTtcbiAgfSxcblxuICBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdHJ1ZSB8fCBvYmogPT09IGZhbHNlIHx8IHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfQk9PTEVBTjtcbiAgfSxcblxuICBpc051bWJlcihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19OVU1CRVI7XG4gIH0sXG5cbiAgaXNEZWZpbmVkKG9iaikge1xuICAgIHJldHVybiAob2JqICE9PSBudWxsIHx8IG9iaiAhPT0gdW5kZWZpbmVkKTtcbiAgfSxcblxuICBpc05vbk51bGxNYXBPYmplY3QodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzT2JqZWN0KHRhcmdldCkgJiYgIXRoaXMuaXNBcnJheSh0YXJnZXQpO1xuICB9LFxuXG4gIGlzVmFsaWRMYW5ndWFnZVRhZyh0YXJnZXQpIHtcbiAgICAvLyBUT0RPIC0gdXNlIG1vcmUgcHJlY2lzZSA1NjQ2IGhhbmRsaW5nLCByYXRoZXIgdGhhbiB0aGlzIHNpbXBsaWZpZWQgQkNQIDQ3IHJlZ2V4LCB3aGljaCBjb21iaW5lcyBSRkMgNTY0NiBhbmQgUkZDIDQ2NDcuXG4gICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKHRhcmdldCkgJiYgdGhpcy5pc1N0cmluZyh0YXJnZXQpICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQkNQXzQ3LnRlc3QodGFyZ2V0KTtcbiAgfSxcblxuICBhZGRQcm9wVG9UcmFjZSh0cmFjZSwgYWRkZW5kdW0pIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQoYWRkZW5kdW0pID8gYCR7dHJhY2V9LiR7YWRkZW5kdW19YCA6IHRyYWNlO1xuICB9LFxuXG4gIGFkZExvb2t1cFRvVHJhY2UodHJhY2UsIGtleSkge1xuICAgIHJldHVybiAoIXRoaXMuaXNEZWZpbmVkKGtleSkpID8gdHJhY2UgOiAodGhpcy5pc051bWJlcihrZXkpID8gYCR7dHJhY2V9WyR7a2V5fV1gIDogYCR7dHJhY2V9W1wiJHtrZXl9XCJdYCk7XG4gIH0sXG5cbiAgbG9jYWxUcmFjZVRvU3RyaW5nKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSk7XG4gIH0sXG5cbiAgaXNHcm91cChhY3Rvck9yR3JvdXApIHtcbiAgICByZXR1cm4gKGFjdG9yT3JHcm91cC5tZW1iZXIgIT09IG51bGwgJiYgYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gdW5kZWZpbmVkKSB8fCBhY3Rvck9yR3JvdXAub2JqZWN0VHlwZSA9PT0gb2JqZWN0VHlwZXMuR1JPVVA7XG4gIH1cbn07XG5cbmV4cG9ydCB7eGFwaVZhbGlkYXRpb25VdGlsc307XG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY29uc3RhbnRzL2Vycm9ycy5qcyIsInNyYy9jb25zdGFudHMvZ2VuZXJhbC5qcyIsInNyYy9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJzcmMvY29uc3RhbnRzL3Byb3BlcnRpZXMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2NvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7Ozs7O0FBRUEsSUFBTSxrQkFBa0IsT0FBTyxNQUFQLENBQWM7QUFDcEMsaUJBQWtCLGVBRGtCO0FBRXBDLGtCQUFrQixnQkFGa0I7QUFHcEMsb0JBQWtCO0FBSGtCLENBQWQsQ0FBeEI7O0FBTUEsSUFBTSx1QkFBdUIsT0FBTyxNQUFQLENBQWM7QUFDekMsMkNBQWtELHlDQURUO0FBRXpDLDBCQUFrRCx5QkFGVDtBQUd6QywwQ0FBa0Qsc0ZBSFQ7QUFJekMscUNBQWtELHVDQUpUO0FBS3pDLDZDQUFrRCw0RUFMVDtBQU16QyxzQ0FBa0QseUNBTlQ7QUFPekMsNENBQWtELHNEQVBUO0FBUXpDLHlDQUFrRCxxRUFSVDtBQVN6QyxvREFBa0Qsc0dBVFQ7QUFVekMsa0RBQWtELGlFQVZUO0FBV3pDLHVDQUFrRCx3REFYVDtBQVl6Qyx5Q0FBa0QscUhBWlQ7QUFhekMsc0NBQWtELG1FQWJUO0FBY3pDLDJDQUFrRCw4RUFkVDtBQWV6Qyw2Q0FBa0Qsa0RBZlQ7QUFnQnpDLHNCQUFrRCw0RUFoQlQ7QUFpQnpDLHdDQUFrRCxtRkFqQlQ7QUFrQnpDLCtCQUFrRCxrREFsQlQ7QUFtQnpDLDhCQUFrRCx3Q0FuQlQ7QUFvQnpDLDBCQUFrRCx3RUFwQlQ7QUFxQnpDLCtCQUFrRCxvRUFyQlQ7QUFzQnpDLDZDQUFrRCxzSUF0QlQ7QUF1QnpDLDBDQUFr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LFNBQVMsMkJBQVQsQ0FBcUMsT0FBckMsRUFBOEM7QUFDNUMsU0FBTyxRQUFRLGdDQUF5QixJQUFqQyxLQUNFLFFBQVEsZ0NBQXlCLGFBQWpDLEtBQW1ELFFBQVEsZ0NBQXlCLGNBQWpDLENBRDVEO0FBRUQ7O0FBRUQsZ0JBQWdCO0FBQ2QscUJBQW1CO0FBREwsQ0FBaEI7O2tCQUllLGE7O0FBQ2YsT0FBTyxhQUFQLEdBQXVCLGFBQXZCLEMsQ0FBc0MiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB4YXBpRXJyb3JMZXZlbHMgPSBPYmplY3QuZnJlZXplKHtcbiAgTUFZX1ZJT0xBVElPTjogICAgJ01BWV9WSU9MQVRJT04nLFxuICBNVVNUX1ZJT0xBVElPTjogICAnTVVTVF9WSU9MQVRJT04nLFxuICBTSE9VTERfVklPTEFUSU9OOiAnU0hPVUxEX1ZJT0xBVElPTidcbn0pO1xuXG5jb25zdCB4YXBpVmFsaWRhdGlvbkVycm9ycyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFM6ICAgICAgICAgICdBY3Rpdml0aWVzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBBQ1RPUl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY3RvciBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIEFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbiBcImFnZW50XCIuJyxcbiAgQUdFTlRfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJhZ2VudFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1M6ICAgICAgICAnSW52YWxpZCBvYmplY3Qgd2l0aCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBHcm91cCB3aGVuIGFuIEFnZW50IHdhcyBleHBlY3RlZC4nLFxuICBBVFRBQ0hNRU5UU19NVVNUX0JFX05PVF9OVUxMX0FSUkFZOiAgICAgICAgICAgICAgICdcImF0dGFjaG1lbnRzXCIgbXVzdCBiZSBhIG5vbi1udWxsIEFycmF5LicsXG4gIEFUVEFDSE1FTlRTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFM6ICAgICAgICAgJ1wiYXR0YWNobWVudFwiIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzLicsXG4gIEFVVEhPUklUWV9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImF1dGhvcml0eVwiIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICdcIkNvbnRleHQgQWN0aXZpdGllc1wiIHByb3BlcnR5IHZhbHVlcyBtdXN0IG5vdCBiZSBudWxsLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVk6ICAgICAgICAgICAgJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkIHByZWZlciB0byBiZSBhbiBhcnJheSBvZiBBY3Rpdml0aWVzIHJhdGhlciB0aGFuIGEgc2luZ2xlIEFjdGl2aXR5IG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZOiAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiB2YWx1ZSBtdXN0IGJlIGFuIEFycmF5IG9mIHN0cmluZ3MuJyxcbiAgQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1M6ICAgICAgICAnXCJjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblwiIGl0ZW1zIG11c3QgYmUgc3RyaW5ncy4nLFxuICBEQVRFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIHByb3BlcnR5cyBzdHJpbmcgdmFsdWUgbXVzdCBiZSBjb25mb3JtYW50IHRvIElTTyA4NjAxIGZvciBEYXRlIFRpbWVzLicsXG4gIERBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTjogICAgICAgICAgICAgJ0lTTyA4NjAxIGRhdGUgdGltZSBzdHJpbmdzIHVzZWQgaW4gdGhlIHhBUEkgc2hvdWxkIGluY2x1ZGUgdGltZSB6b25lIGluZm9ybWF0aW9uLicsXG4gIERFRklOSVRJT05TX01VU1RfQkVfT0JKRUNUUzogICAgICAgICAgICAgICAgICAgICAgJ1wiZGVmaW5pdGlvbnNcIiwgd2hlbiBwcmVzZW50LCBtdXN0IGJlIG1hcCBvYmplY3RzJyxcbiAgRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAnXCJkaXNwbGF5XCIgcHJvcGVydHkgc2hvdWxkIGJlIHByb3ZpZGVkLicsXG4gIERVUkFUSU9OX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImR1cmF0aW9uXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhbiBJU08gODYwMSBkdXJhdGlvbicsXG4gIEVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBleHRlbnNpb25zIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPOiAgICAgICAgJ0lmIHVzZWQgYXMgYSBHcm91cCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgXCJtZW1iZXJcIiBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgZXhhY3RseSB0d28gQWdlbnQgb2JqZWN0cy4nLFxuICBHUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBcImdyb3VwXCIuJyxcbiAgR1JPVVBfTUVNQkVSX01VU1RfQkVfQVJSQVk6ICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIG1lbWJlciBwcm9wZXJ0eSBvZiBhIEdyb3VwIG11c3QgYmUgYW4gQXJyYXknLFxuICBHUk9VUF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImdyb3VwXCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJRF9NVVNUX0JFX1VOSVFVRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydGllcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gZWFjaCBpbnRlcmFjdGlvbiBjb21wb25lbnQgYXJyYXknLFxuICBJRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGOiAgICAgICAgICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQgc3RyaW5nIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSWQgd2FzIG5vdCBhIHZhbGlkIFVVSUQnLFxuICBJRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVM6ICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydGllcyBvbiBpbnRlcmFjdGlvbiBjb21wb25lbnRzIHNob3VsZCBub3QgY29udGFpbiB3aGl0ZXNwYWNlJyxcbiAgSURTX1NIT1VMRF9CRV9HRU5FUkFURURfQllfTFJTOiAgICAgICAgICAgICAgICAgICAnSWRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIEFjdGl2aXR5IFByb3ZpZGVyLCBhbmQgbXVzdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIExSUycsXG4gIElGSV9NVVNUX0JFX01CT1hfVVJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wibWJveFwiIHByb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIG1haWx0byBVUkkgc3RyaW5nIGJ1dCB3YXMgbm90IGEgc3RyaW5nIGF0IGFsbC4nLFxuICBJRklfTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICdcIm1ib3hcIiBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBJTlRFUkFDVElPTl9BQ1RJVklUWV9TSE9VTERfSEFWRTogICAgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiBBY3Rpdml0eSBEZWZpbml0aW9ucyBzaG91bGQgaGF2ZSBhIHR5cGUgcHJvcGVydHkgb2YnLFxuICBJTlRFUkFDVElPTl9DT01QT05FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIG1lbWJlciBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdCcsXG4gIElOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVk6ICAgICAgICAgICAgJ1RoaXMgaW50ZXJhY3Rpb24gY29tcG9uZW50IGNvbGxlY3Rpb24gcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5LicsXG4gIElOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUk6ICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImludGVyYWN0aW9uVHlwZVwiIHZhbHVlIG11c3QgYmUgYSBDTUkgaW50ZXJhY3Rpb24gdHlwZSBvcHRpb24uJyxcbiAgSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVzZW50IGludGVyYWN0aW9uVHlwZSBvZjogJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAna2V5LCBMYW5ndWFnZSBkb2VzIG5vdCBjb25mb3JtIHRvIFJGQyA1NjQ2JyxcbiAgTEFOR1VBR0VfTUFQX0tFWV9NVVNUX0JFX1NUUklORzogICAgICAgICAgICAgICAgICAna2V5OiBMYW5ndWFnZSBNYXAgdmFsdWUgc2hvdWxkIGJlIGEgU3RyaW5nLCBidXQgd2FzIG5vdCcsXG4gIExBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgJ0xhbmd1YWdlIE1hcHMsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIE1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU46ICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJtYXhcIiBhbmQgXCJtaW5cIiBhcmUgcHJlc2VudCwgdGhlIG1heCBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1pbicsXG4gIE1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTOiAgICAgJ1wibWVtYmVyXCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCBmb3IgQW5vbnltb3VzIEdyb3Vwcy4nLFxuICBNVVNUX0JFX0JPT0xFQU5fUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBCb29sZWFuIGJ1dCB3YXMgYWJzZW50LicsXG4gIE1VU1RfQkVfQk9PTEVBTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgQm9vbGVhbi4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9OVU1CRVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBOdW1iZXIuJyxcbiAgTVVTVF9CRV9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIGJ1dCB3YXMgYWJzZW50LicsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfVVJJX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIFVSSSBzdHJpbmcgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9VUklfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBVUkkgc3RyaW5nLicsXG4gIE9CSkVDVF9NVVNUX0JFX0RFRklORUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZC4nLFxuICBPQkpFQ1RfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdcIm9iamVjdFwiIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRjogICAgICAgICAgICAgICAgJ1wib2JqZWN0VHlwZVwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgXCJTdGF0ZW1lbnRSZWZcIiBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIFJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU46ICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJyYXdcIiBhbmQgXCJtaW5cIiBhcmUgcHJlc2VudCwgdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1pbicsXG4gIFJBV19NVVNUX0JFX0xFU1NfVEhBTl9NQVg6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJyYXdcIiBhbmQgXCJtYXhcIiBhcmUgcHJlc2VudCwgdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG1heCcsXG4gIFJFR0lTVFJBVElPTl9NVVNUX0JFX1VVSURfU1RSSU5HOiAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSByZWdpc3RyYXRpb24gcHJvcGVydHkgbXVzdCBiZSBhIFVVSUQgc3RyaW5nLicsXG4gIFJFU1VMVF9NVVNUX0JFX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSByZXN1bHQgbXVzdCBiZSBhIG1hcCBvYmplY3QnLFxuICBSRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQOiAgICAgICAgICAgICAgICAgICdUaGUgcmV2aXNpb24gcHJvcGVydHkgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgU3RhdGVtZW50XFwncyBPYmplY3QgaXMgYW4gQWdlbnQgb3IgR3JvdXAuJyxcbiAgU0NBTEVEX01VU1RfQkVfQkVUV0VFTl8wXzE6ICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHNjYWxlZCBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nLFxuICBTVEFURU1FTlRfQVJHVU1FTlRfTVVTVF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICdObyBzdGF0ZW1lbnQgYXJndW1lbnQgcHJvdmlkZWQuJyxcbiAgU1RBVEVNRU5UX01VU1RfQkVfUEFSU0VEX0NPUlJFQ1RMWTogICAgICAgICAgICAgICAnTnVsbCBvciBub24tb2JqZWN0IHN0YXRlbWVudCB2YWx1ZSBwYXJzZWQgZnJvbSBwcm92aWRlZCBzdGF0bWVudCBKU09OLicsXG4gIFNUQVRFTUVOVF9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgJ051bGwgc3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkLicsXG4gIFNUQVRFTUVOVF9SRUZfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgJ1N0YXRlbWVudFJlZiBpbnN0YW5jZXMgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIFNVQl9TVEFURU1FTlRfTVVTVF9OT1RfQ09OVEFJTl9TVUJfU1RBVEVNRU5UOiAgICAgJ0EgU3ViU3RhdGVtZW50IG11c3Qgbm90IGNvbnRhaW4gYSBTdWJTdGF0ZW1lbnQnLFxuICBVTkVYUEVDVEVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIHByb3BlcnR5IG5vdCBwZXJtaXR0ZWQnLFxuICBWRVJCX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJiIG11c3QgYmUgcHJvdmlkZWQnLFxuICBWRVJCX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJiIHByb3BlcnR5IHZhbHVlIG11c3QgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIFZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORzogICAgICAgICAgJ1widmVyc2lvblwiIG11c3QgYmUgYSBub24tbnVsbCBzdHJpbmcgdGhhdCBjb21wbGllcyB3aXRoIFNlbWFudGljIFZlcnNpb25pbmcgMS4wLjAnXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXSxcbiAgRVhURU5TSU9OUzogW1xuICAgIHByb3BlcnRpZXMuUkVHSVNUUkFUSU9OLFxuICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICBwcm9wZXJ0aWVzLlRFQU0sXG4gICAgcHJvcGVydGllcy5DT05URVhUX0FDVElWSVRJRVMsXG4gICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICBwcm9wZXJ0aWVzLlBMQVRGT1JNLFxuICAgIHByb3BlcnRpZXMuTEFOR1VBR0UsXG4gICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gIF1cbn0pO1xuXG4gZXhwb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleH0gZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7b2JqZWN0VHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9wcm9wZXJ0aWVzJztcblxuY29uc3RcbiAgSVNfU1RSSU5HICA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICBJU19BUlJBWSAgID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgSVNfQk9PTEVBTiA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgSVNfTlVNQkVSICA9ICdbb2JqZWN0IE51bWJlcl0nO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHhhcGlWYWxpZGF0aW9uVXRpbHM7XG5cbnhhcGlWYWxpZGF0aW9uVXRpbHMgPSB7XG4gIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX1NUUklORztcbiAgfSxcblxuICBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKTtcbiAgfSxcblxuICBpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX0FSUkFZO1xuICB9LFxuXG4gIGlzQm9vbGVhbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19CT09MRUFOO1xuICB9LFxuXG4gIGlzTnVtYmVyKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX05VTUJFUjtcbiAgfSxcblxuICBpc0RlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuIChvYmogIT09IG51bGwgfHwgb2JqICE9PSB1bmRlZmluZWQpO1xuICB9LFxuXG4gIGlzTm9uTnVsbE1hcE9iamVjdCh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCh0YXJnZXQpICYmIHRoaXMuaXNPYmplY3QodGFyZ2V0KSAmJiAhdGhpcy5pc0FycmF5KHRhcmdldCk7XG4gIH0sXG5cbiAgaXNWYWxpZExhbmd1YWdlVGFnKHRhcmdldCkge1xuICAgIC8vIFRPRE8gLSB1c2UgbW9yZSBwcmVjaXNlIDU2NDYgaGFuZGxpbmcsIHJhdGhlciB0aGFuIHRoaXMgc2ltcGxpZmllZCBCQ1AgNDcgcmVnZXgsIHdoaWNoIGNvbWJpbmVzIFJGQyA1NjQ2IGFuZCBSRkMgNDY0Ny5cbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzU3RyaW5nKHRhcmdldCkgJiYgeGFwaVZhbGlkYXRpb25SZWdleC5CQ1BfNDcudGVzdCh0YXJnZXQpO1xuICB9LFxuXG4gIGFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZChhZGRlbmR1bSkgPyBgJHt0cmFjZX0uJHthZGRlbmR1bX1gIDogdHJhY2U7XG4gIH0sXG5cbiAgYWRkTG9va3VwVG9UcmFjZSh0cmFjZSwga2V5KSB7XG4gICAgcmV0dXJuICghdGhpcy5pc0RlZmluZWQoa2V5KSkgPyB0cmFjZSA6ICh0aGlzLmlzTnVtYmVyKGtleSkgPyBgJHt0cmFjZX1bJHtrZXl9XWAgOiBgJHt0cmFjZX1bXCIke2tleX1cIl1gKTtcbiAgfSxcblxuICBsb2NhbFRyYWNlVG9TdHJpbmcodHJhY2UsIGFkZGVuZHVtKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkUHJvcFRvVHJhY2UodHJhY2UsIGFkZGVuZHVtKTtcbiAgfSxcblxuICBpc0dyb3VwKGFjdG9yT3JHcm91cCkge1xuICAgIHJldHVybiAoYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gbnVsbCAmJiBhY3Rvck9yR3JvdXAubWVtYmVyICE9PSB1bmRlZmluZWQpIHx8IGFjdG9yT3JHcm91cC5vYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUDtcbiAgfVxufTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblV0aWxzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5pbXBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfSBmcm9tICcuL2NvbnN0YW50cy93aGl0ZWxpc3RzJztcbmltcG9ydCB7eGFwaUVycm9yTGV2ZWxzLCB4YXBpVmFsaWRhdGlvbkVycm9yc30gZnJvbSAnLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uSW50ZXJhY3Rpb25UeXBlc30gZnJvbSAnLi9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMnO1xuaW1wb3J0IHt4YXBpR2VuZXJhbH0gZnJvbSAnLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG52YXIgeGFwaVZhbGlkYXRvcjtcblxuZnVuY3Rpb24gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvcnMpIHtcbiAgdmFyIHZlcnNpb247XG5cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZSB8fCBudWxsO1xuICBlcnJvcnMgICA9IGVycm9ycyAgIHx8IG51bGw7XG4gIHZlcnNpb24gID0geGFwaUdlbmVyYWwuRklSU1RfUkVQT1JUX1ZFUlNUSU9OO1xuICByZXR1cm4ge2luc3RhbmNlLCBlcnJvcnMsIHZlcnNpb259O1xufVxuXG5mdW5jdGlvbiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChpbnN0YW5jZSwgZXJyb3IpIHtcbiAgcmV0dXJuIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCA/IFtdIDogW2Vycm9yXSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHRhcmdldCwgYWxsb3dlZFByb3BlcnRpZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGZvciAocHJvcGVydHlOYW1lIGluIHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBhbGxvd2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5VTkVYUEVDVEVELFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkLCB2aW9sYXRpb25UeXBlKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlLCBsb2NhbFZpb2xhdGlvblR5cGU7XG5cbiAgbG9jYWxFcnJvcnMgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgICAgICAgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdLFxuICBsb2NhbFZpb2xhdGlvblR5cGUgPSB2aW9sYXRpb25UeXBlIHx8IHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTjtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIGxvY2FsVmlvbGF0aW9uVHlwZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHRhcmdldFtwcm9wZXJ0eU5hbWVdO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1VSSV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4LklSSS50ZXN0KHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0lSSV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzVXJsKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIC8vIFRPRE8gLSBjaGVjayB3aGV0aGVyIGEgZm9ybWFsIFVSTCBmb3JtYXQgZGVmaW5pdGlvbiBpcyByZWNvbW1lbmRlZC9lbmZvcmNlZCBmb3IgeEFQSVxuICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0Jvb2xlYW4ocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0JPT0xFQU59YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0JPT0xFQU5fUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTnVtYmVyKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJ9YCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfTlVNQkVSX1BSRVNFTlR9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUlGSVByb3BlcnRpZXModGFyZ2V0LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgYWNjb3VudFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcblxuICBpZiAodGFyZ2V0Lm1ib3ggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQubWJveCAhPT0gbnVsbCkge1xuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQk9YKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSUZJX01VU1RfQkVfTUJPWF9VUkksXG4gICAgICAgIGxldmVsOiB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguTUFJTFRPX1VSSS50ZXN0KHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUJPWCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklGSV9NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXM7XG5cbiAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHVuZGVmaW5lZCkge3JldHVybiBbXTt9XG5cbiAgaWZpcyA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+IHtcbiAgICBpZiAodGFyZ2V0W25hbWVdICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0W25hbWVdICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge2tleTogbmFtZSwgdmFsdWU6IHRhcmdldFtuYW1lXX07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaWZpcztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJQ291bnQodGFyZ2V0KSB7XG4gIHJldHVybiBnZXRJRklzKHRhcmdldCkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW10sXG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuRVhURU5TSU9OUztcblxuICBpZiAoZXh0ZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGV4dGVuc2lvbnMpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRVhURU5TSU9OU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgLy8gVE9ETyAtIGRvdWJsZS1jaGVjayB3aGF0IGZ1cnRoZXIgZW5mb3JjZWFibGUgY29uc3RyYWludHMgZXhpc3Qgb24gZXh0ZW5zaW9uIG9iamVjdCBwcm9wZXJ0aWVzXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BOYW1lLCBtYXBwZWRWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgaWYgKGxhbmd1YWdlTWFwID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QobGFuZ3VhZ2VNYXApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBmb3IgKHByb3BOYW1lIGluIGxhbmd1YWdlTWFwKSB7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKHByb3BOYW1lKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wTmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5MQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUR9YCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobWFwcGVkVmFsdWUgPT09IG51bGwgfHwgbWFwcGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhtYXBwZWRWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wTmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5MQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HfWAsXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgaWYgKHZlcmIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5WRVJCX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodmVyYiwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAodmVyYi5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBpc0FsbG93ZWRDb21wb25lbnRUeXBlLCBpZHMsIHBlckNvbXBvbmVudFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzICAgICAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICAgICAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5JTlRFUkFDVElPTl9DT01QT05FTlRTO1xuICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgaWRzICAgICAgICAgICAgICAgICAgICA9IFtdO1xuXG4gIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChjb21wb25lbnRzID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoY29tcG9uZW50cykpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9DT01QT05FTlRfU0hPVUxEX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoaW50ZXJhY3Rpb25Db21wb25lbnQsIGkpID0+IHtcbiAgICAgICAgcGVyQ29tcG9uZW50VHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSk7XG5cbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHBlckNvbXBvbmVudFRyYWNlLFxuICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoaW50ZXJhY3Rpb25Db21wb25lbnQsIHByb3BlcnRpZXMuSUQsIHBlckNvbXBvbmVudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShwZXJDb21wb25lbnRUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZHMucHVzaChpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGludGVyYWN0aW9uQ29tcG9uZW50LmRlc2NyaXB0aW9uLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGludGVyYWN0aW9uQ29tcG9uZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5DT01QT05FTlRfQVJSQVksIHBlckNvbXBvbmVudFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfVxuICB9IGVsc2UgaWYgKGludGVyYWN0aW9uVHlwZSAmJiBjb21wb25lbnRzKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX1ZBTElEfSAke2ludGVyYWN0aW9uVHlwZX1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eURlZmludGlvbihkZWZpbml0aW9uLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgICAgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuREVGSU5JVElPTjtcbiAgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOKTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGRlZmluaXRpb24ubmFtZSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk5BTUUpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLlRZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VybChkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLk1PUkVfSU5GTywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgaWYgKGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50eXBlICE9PSB4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEUpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRZUEUpLFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9BQ1RJVklUWV9TSE9VTERfSEFWRX0gXCIke3hhcGlHZW5lcmFsLklOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRX1cImAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5URVJBQ1RJT05fVFlQRSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuLmZvckVhY2goKHJlc3BvbnNlLCBpKSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHJlc3BvbnNlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsIGkpLFxuICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uY2hvaWNlcyxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNIT0lDRVMpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc2NhbGUsXG4gICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgW3Byb3BlcnRpZXMuTElLRVJUXSxcbiAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0NBTEUpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgIGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlLFxuICAgIFtwcm9wZXJ0aWVzLk1BVENISU5HXSxcbiAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICBkZWZpbml0aW9uLnRhcmdldCxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRBUkdFVCksXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgZGVmaW5pdGlvbi5zdGVwcyxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5QRVJGT1JNQU5DRV0sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNURVBTKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGRlZmluaXRpb24sIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkFDVElWSVRZX0RFRklOSVRJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQVRUQUNITUVOVFM7XG5cbiAgaWYgKGF0dGFjaG1lbnRzID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGF0dGFjaG1lbnRzKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BVFRBQ0hNRU5UU19NVVNUX0JFX05PVF9OVUxMX0FSUkFZLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBhdHRhY2htZW50cy5mb3JFYWNoKChhdHRhY2htZW50LCBpKSA9PiB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICB9KTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWdlbnQoYWdlbnQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBpZmlDb3VudDtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BR0VOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFnZW50KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGFnZW50KTtcblxuICBpZiAoaWZpQ291bnQgIT09IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFnZW50Lm9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkdST1VQKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUlGSVByb3BlcnRpZXMoYWdlbnQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGFnZW50LCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoYWdlbnQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkFHRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdyb3VwKGdyb3VwLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgbWVtYmVyVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkdST1VQO1xuICBtZW1iZXJUcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NRU1CRVIpO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoZ3JvdXApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWZpQ291bnQgPSBnZXRJRklDb3VudChncm91cCk7XG5cbiAgaWYgKGlmaUNvdW50ID09PSAwKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCBncm91cC5tZW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIG1lbWJlclRyYWNlLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NRU1CRVJfTVVTVF9CRV9QUk9WSURFRF9GT1JfQU5PTllNT1VTX0dST1VQUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaWZpQ291bnQgPiB4YXBpR2VuZXJhbC5OVU1FUl9PRl9TUEVDSUZJRURfSUZJX1BST1BFUlRJRVMpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfSUZJX1BST1BFUlRJRVNfTVVTVF9CRV9TUEVDSUZJRUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhncm91cCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhncm91cCwgcHJvcGVydGllcy5OQU1FLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmIChncm91cC5tZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChncm91cC5tZW1iZXIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShncm91cC5tZW1iZXIpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NRU1CRVIpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goKG1lbWJlciwgaSkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KG1lbWJlciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoZ3JvdXAsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkdST1VQLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdG9yKGFjdG9yLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RPUjtcblxuICBpZiAoYWN0b3IgPT09IG51bGwgfHwgYWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RPUl9NVVNUX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc0dyb3VwKGFjdG9yKSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYWN0b3IsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXR5KGF1dGhvcml0eSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQVVUSE9SSVRZO1xuXG4gIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXV0aG9yaXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BVVRIT1JJVFlfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhdXRob3JpdHkpKSB7XG4gICAgdmFsaWRhdGVHcm91cChhdXRob3JpdHksIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICBpZiAoIWF1dGhvcml0eS5tZW1iZXIgfHwgIWF1dGhvcml0eS5tZW1iZXIubGVuZ3RoIHx8IGF1dGhvcml0eS5tZW1iZXIubGVuZ3RoICE9PSB4YXBpR2VuZXJhbC5HUk9VUF9BVVRIT1JJVFlfQUdFTlRfTUVNQkVSUykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUVNQkVSKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV08sXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlQWdlbnQoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChzdWJDb250ZXh0LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVUJfQ09OVEVYVDtcblxuICBpZiAoc3ViQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoc3ViQ29udGV4dCA9PT0gbnVsbCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX0FDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdWJDb250ZXh0KSkge1xuICAgIHN1YkNvbnRleHQuZm9yRWFjaCgoYWN0aXZpdHksIGkpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZpdHkoYWN0aXZpdHksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3ViQ29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICB2YWxpZGF0ZUFjdGl2aXR5KHN1YkNvbnRleHQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfQVJSQVlfT1JfQUNUSVZJVFlfT0JKLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0aWVzKGNvbnRleHRBY3Rpdml0aWVzLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5DT05URVhUX0FDVElWSVRJRVM7XG5cbiAgaWYgKGNvbnRleHRBY3Rpdml0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGNvbnRleHRBY3Rpdml0aWVzKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLnBhcmVudCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBBUkVOVCksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLmdyb3VwaW5nLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuR1JPVVBJTkcpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5jYXRlZ29yeSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNBVEVHT1JZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMub3RoZXIsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PVEhFUiksIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhjb250ZXh0QWN0aXZpdGllcywgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHQoY29udGV4dCwgdHJhY2UsIGVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgPSB0cmFjZSB8fCBwcm9wZXJ0aWVzLkNPTlRFWFQ7XG5cbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfTVVTVF9CRV9OT05fTlVMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmIChjb250ZXh0LnJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIChjb250ZXh0LnJlZ2lzdHJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjb250ZXh0LnJlZ2lzdHJhdGlvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KGNvbnRleHQucmVnaXN0cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVHSVNUUkFUSU9OKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFR0lTVFJBVElPTl9NVVNUX0JFX1VVSURfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoW29iamVjdFR5cGVzLkdST1VQLCBvYmplY3RUeXBlcy5BR0VOVF0uaW5kZXhPZihzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlKSAhPT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICBpZiAoY29udGV4dC5yZXZpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SRVZJU0lPTiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFVklTSU9OX01VU1RfQkVfQUdFTlRfT1JfR1JPVVAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQucGxhdGZvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUExBVEZPUk0pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5QTEFURk9STV9NVVNUX05PVF9CRV9VU0VEX1dJVEhfUkVWSVNJT05fQUdFTlRfT1JfR1JPVVAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUkVWSVNJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoY29udGV4dCwgcHJvcGVydGllcy5QTEFURk9STSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgaWYgKGNvbnRleHQudGVhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQudGVhbSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRFQU0pLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0LmNvbnRleHRBY3Rpdml0aWVzLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQubGFuZ3VhZ2UgIT09IHVuZGVmaW5lZCAmJiAheGFwaVZhbGlkYXRpb25VdGlscy5pc1ZhbGlkTGFuZ3VhZ2VUYWcoY29udGV4dC5sYW5ndWFnZSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEFOR1VBR0UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTVVTVF9CRV9TVFJJTkcsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LnN0YXRlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVTdGF0ZW1lbnRSZWYoY29udGV4dC5zdGF0ZW1lbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEFURU1FTlQpLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5pbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc0dyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvcikpIHtcbiAgICAgIHZhbGlkYXRlR3JvdXAoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVBZ2VudChjb250ZXh0Lmluc3RydWN0b3IsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JTlNUUlVDVE9SKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRXh0ZW5zaW9ucyhjb250ZXh0LmV4dGVuc2lvbnMsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5FWFRFTlNJT05TKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhjb250ZXh0LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5FWFRFTlNJT05TLGxvY2FsVHJhY2UsbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qob2JqZWN0LCB0cmFjZSwgZXJyb3JzLCBpc1dpdGhpblN1YlN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG9iamVjdFR5cGU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuT0JKRUNUO1xuXG4gIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfTVVTVF9CRV9ERUZJTkVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KG9iamVjdCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKG9iamVjdCwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT04pO1xuXG4gIG9iamVjdFR5cGUgPSBvYmplY3Qub2JqZWN0VHlwZSB8fCBvYmplY3RUeXBlcy5BQ1RJVklUWTtcblxuICBzd2l0Y2ggKG9iamVjdFR5cGUpIHtcbiAgICBjYXNlIG9iamVjdFR5cGVzLkFDVElWSVRZOlxuICAgICAgdmFsaWRhdGVBY3Rpdml0eShvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuQUdFTlQ6XG4gICAgICB2YWxpZGF0ZUFnZW50KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBvYmplY3RUeXBlcy5HUk9VUDpcbiAgICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG9iamVjdFR5cGVzLlNUQVRFTUVOVF9SRUY6XG4gICAgICB2YWxpZGF0ZVN0YXRlbWVudFJlZihvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuU1VCX1NUQVRFTUVOVDpcbiAgICAgIGlmIChpc1dpdGhpblN1YlN0YXRlbWVudCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVUJfU1RBVEVNRU5UX01VU1RfTk9UX0NPTlRBSU5fU1VCX1NUQVRFTUVOVCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YWxpZGF0ZVN0YXRlbWVudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1N1YlN0YXRlbWVudCovdHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUpLFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gIH1cbiAgXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCB0cmFjZSwgZXJyb3JzLCBpc1N1YlN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUsIHdoaXRlbGlzdGVkUHJvcGVydGllcztcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlQ7XG5cbiAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICghaXNTdWJTdGF0ZW1lbnQpIHtcbiAgICBpZiAoc3RhdGVtZW50LmlkID09PSBudWxsIHx8IHN0YXRlbWVudC5pZCA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURTX1NIT1VMRF9CRV9HRU5FUkFURURfQllfTFJTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICgheGFwaVZhbGlkYXRpb25SZWdleC5VVUlELnRlc3Qoc3RhdGVtZW50LmlkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElELFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGl0ZWxpc3RlZFByb3BlcnRpZXMgPSB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5TVUJfU1RBVEVNRU5UO1xuICB9XG5cbiAgdmFsaWRhdGVBY3RvcihzdGF0ZW1lbnQuYWN0b3IsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVWZXJiKHN0YXRlbWVudC52ZXJiLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVkVSQiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVPYmplY3Qoc3RhdGVtZW50Lm9iamVjdCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVCksIGxvY2FsRXJyb3JzLCBpc1N1YlN0YXRlbWVudCk7XG4gIHZhbGlkYXRlUmVzdWx0KHN0YXRlbWVudC5yZXN1bHQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SRVNVTFQpLCBsb2NhbEVycm9ycyk7XG5cbiAgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSA9IHN0YXRlbWVudC5vYmplY3QgJiYgc3RhdGVtZW50Lm9iamVjdC5vYmplY3RUeXBlID8gc3RhdGVtZW50Lm9iamVjdC5vYmplY3RUeXBlIDogb2JqZWN0VHlwZXMuQUNUSVZJVFk7XG5cbiAgdmFsaWRhdGVDb250ZXh0KHN0YXRlbWVudC5jb250ZXh0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09OVEVYVCksIGxvY2FsRXJyb3JzLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhzdGF0ZW1lbnQsIHByb3BlcnRpZXMuVElNRVNUQU1QLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUT1JFRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQXV0aG9yaXR5KHN0YXRlbWVudC5hdXRob3JpdHksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BVVRIT1JJVFkpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyc2lvbihzdGF0ZW1lbnQudmVyc2lvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUlNJT04pLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQXR0YWNobWVudHMoc3RhdGVtZW50LmF0dGFjaG1lbnRzLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVRUQUNITUVOVFMpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoc3RhdGVtZW50LCB3aGl0ZWxpc3RlZFByb3BlcnRpZXMsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KSB7XG4gIHZhciBsb2NhbEVycm9ycztcblxuICBsb2NhbEVycm9ycyA9IFtdO1xuICB2YWxpZGF0ZVN0YXRlbWVudChzdGF0ZW1lbnQsIHByb3BlcnRpZXMuU1RBVEVNRU5ULCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIHJldHVybiBtYWtlVjFSZXBvcnQoc3RhdGVtZW50LCBsb2NhbEVycm9ycyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQW1iaWd1b3VzVHlwZVN0YXRlbWVudChzdGF0ZW1lbnQpIHtcbiAgdmFyIHN0YXRlbWVudE9iamVjdDtcblxuICBpZiAoc3RhdGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfQVJHVU1FTlRfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXRlbWVudE9iamVjdCA9IEpTT04ucGFyc2Uoc3RhdGVtZW50KTtcbiAgICAgIGlmIChzdGF0ZW1lbnRPYmplY3QgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3RhdGVtZW50T2JqZWN0KSB8fCB4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3RhdGVtZW50T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoc3RhdGVtZW50T2JqZWN0LCB7XG4gICAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX01VU1RfQkVfUEFSU0VEX0NPUlJFQ1RMWSxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5WQUxJRF9KU09OfTogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnRPYmplY3QpO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3RhdGVtZW50KSAmJiAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudCkpIHtcbiAgICByZXR1cm4gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfQVJHVU1FTlRfSVNfTk9UX1ZBTElELFxuICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGF0ZUluY2x1ZGVzWm9uZUluZm9ybWF0aW9uKG1hdGNoZWQpIHtcbiAgcmV0dXJuIG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlpPTkVdIHx8XG4gICAgICAgICAgKG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlJFTEFUSVZFX1RJTUVdICYmIG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlRJTUVfWk9ORV9IT1VSXSk7XG59XG5cbnhhcGlWYWxpZGF0b3IgPSB7XG4gIHZhbGlkYXRlU3RhdGVtZW50OiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHhhcGlWYWxpZGF0b3I7XG53aW5kb3cueGFwaVZhbGlkYXRvciA9IHhhcGlWYWxpZGF0b3I7IC8vRklYTUVcbiJdfQ== diff --git a/lib/xapiValidator.min.js b/lib/xapiValidator.min.js index d372177..2bc399d 100644 --- a/lib/xapiValidator.min.js +++ b/lib/xapiValidator.min.js @@ -1,3 +1,3 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i;i="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,i.beepBoop=e()}}(function(){return function e(i,r,a){function t(s,T){if(!r[s]){if(!i[s]){var p="function"==typeof require&&require;if(!T&&p)return p(s,!0);if(o)return o(s,!0);var n=new Error("Cannot find module '"+s+"'");throw n.code="MODULE_NOT_FOUND",n}var l=r[s]={exports:{}};i[s][0].call(l.exports,function(e){var r=i[s][1][e];return t(r?r:e)},l,l.exports,e,i,r,a)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;sw.xapiGeneral.MAX_SCALED_VALUE)&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.SCALED),message:Y.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.min&&(l(e,H.properties.MIN,t,a,!1),void 0!==e.raw&&e.rawe.max&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.RAW),message:Y.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,level:Y.xapiErrorLevels.MUST_VIOLATION})),l(e,H.properties.RAW,t,a,!1),o(e,j.xapiWhiteListProperties.SCORE,t,a),a)}function U(e,i,r){var a,t;return a=r||[],t=i||H.properties.RESULT,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(F(e.score,z.xapiValidationUtils.addPropToTrace(t,H.properties.SCORE),a),n(e,H.properties.SUCCESS,t,a,!1),n(e,H.properties.COMPLETION,t,a,!1),s(e,H.properties.RESPONSE,t,a,!1),I(e.extensions,z.xapiValidationUtils.addPropToTrace(t,H.properties.EXTENSIONS),a),void 0===e.duration||null!==e.duration&&z.xapiValidationUtils.isString(e.duration)&&X.xapiValidationRegex.ISO_8601_DURATION.test(e.duration)||a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.DURATION),message:Y.xapiValidationErrors.DURATION_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.RESULT,t,a),a):(a.push({trace:z.xapiValidationUtils.addPropToTrace(t),message:Y.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function M(e,i,r,a){var t,o,s,T;return t=a||[],o=r||H.properties.DATE_TIME,T=e[i],void 0===T?t:null!==T&&z.xapiValidationUtils.isString(T)?(s=X.xapiValidationRegex.ISO_8601_DATE_TIME.exec(T),s?G(s)||t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,level:Y.xapiErrorLevels.SHOULD_VIOLATION -}):t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),t):(t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:i+" "+Y.xapiValidationErrors.MUST_BE_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function V(e,i,r){var a,t;return a=r||[],t=i||H.properties.VERSION,void 0===e?a:(null!==e&&z.xapiValidationUtils.isString(e)&&X.xapiValidationRegex.SEMVER_1_P_0_P_0.test(e)||a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function x(e,i,r){var a,t;return a=r||[],t=i||H.properties.ATTACHMENT,z.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.display?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.DISPLAY),message:Y.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION}):O(e.display,z.xapiValidationUtils.addPropToTrace(t,H.properties.DISPLAY),a),O(e.description,z.xapiValidationUtils.addPropToTrace(t,H.properties.DESCRIPTION),a),T(e,H.properties.USAGE_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),T(e,H.properties.FILE_URL,t,a,!1,Y.xapiErrorLevels.MUST_VIOLATION),s(e,H.properties.CONTENT_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),void 0!==e.length&&null!==e.length&&z.xapiValidationUtils.isNumber(e.length)&&e.length%1===0||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.LENGTH),message:Y.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0===e.sha2?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}):null!==e.sha2&&z.xapiValidationUtils.isString(e.sha2)&&X.xapiValidationRegex.BASE_64.test(e.sha2)||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.ATTACHMENT,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function R(e,i,r){var a,t,o,s;if(a=r||[],t=i||H.properties.ATTACHMENTS,void 0===e)return a;if(null===e||!z.xapiValidationUtils.isArray(e))return a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,level:Y.xapiErrorLevels.MUST_VIOLATION}),a;for(o=e.length,s=0;sw.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:Y.xapiErrorLevels.MUST_VIOLATION}),E(e,t,a),s(e,H.properties.NAME,t,a,!1),void 0!==e.member)if(null!==e.member&&z.xapiValidationUtils.isArray(e.member))for(n=e.member.length,l=0;lw.xapiGeneral.MAX_SCALED_VALUE)&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.SCALED),message:Y.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.min&&(E(e,H.properties.MIN,t,a,!1),void 0!==e.raw&&e.rawe.max&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.RAW),message:Y.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,level:Y.xapiErrorLevels.MUST_VIOLATION})),E(e,H.properties.RAW,t,a,!1), +o(e,j.xapiWhiteListProperties.SCORE,t,a),a)}function U(e,i,r){var a,t;return a=r||[],t=i||H.properties.RESULT,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(F(e.score,z.xapiValidationUtils.addPropToTrace(t,H.properties.SCORE),a),n(e,H.properties.SUCCESS,t,a,!1),n(e,H.properties.COMPLETION,t,a,!1),s(e,H.properties.RESPONSE,t,a,!1),I(e.extensions,z.xapiValidationUtils.addPropToTrace(t,H.properties.EXTENSIONS),a),void 0===e.duration||null!==e.duration&&z.xapiValidationUtils.isString(e.duration)&&X.xapiValidationRegex.ISO_8601_DURATION.test(e.duration)||a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.DURATION),message:Y.xapiValidationErrors.DURATION_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.RESULT,t,a),a):(a.push({trace:z.xapiValidationUtils.addPropToTrace(t),message:Y.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function M(e,i,r,a){var t,o,s,T;return t=a||[],o=r||H.properties.DATE_TIME,T=e[i],void 0===T?t:null!==T&&z.xapiValidationUtils.isString(T)?(s=X.xapiValidationRegex.ISO_8601_DATE_TIME.exec(T),s?G(s)||t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,level:Y.xapiErrorLevels.SHOULD_VIOLATION}):t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),t):(t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:i+" "+Y.xapiValidationErrors.MUST_BE_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function V(e,i,r){var a,t;return a=r||[],t=i||H.properties.VERSION,void 0===e?a:(null!==e&&z.xapiValidationUtils.isString(e)&&X.xapiValidationRegex.SEMVER_1_P_0_P_0.test(e)||a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function x(e,i,r){var a,t;return a=r||[],t=i||H.properties.ATTACHMENT,z.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.display?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.DISPLAY),message:Y.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION}):O(e.display,z.xapiValidationUtils.addPropToTrace(t,H.properties.DISPLAY),a),O(e.description,z.xapiValidationUtils.addPropToTrace(t,H.properties.DESCRIPTION),a),T(e,H.properties.USAGE_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),T(e,H.properties.FILE_URL,t,a,!1,Y.xapiErrorLevels.MUST_VIOLATION),s(e,H.properties.CONTENT_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),void 0!==e.length&&null!==e.length&&z.xapiValidationUtils.isNumber(e.length)&&e.length%1===0||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.LENGTH),message:Y.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0===e.sha2?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}):null!==e.sha2&&z.xapiValidationUtils.isString(e.sha2)&&X.xapiValidationRegex.BASE_64.test(e.sha2)||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.ATTACHMENT,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function R(e,i,r){var a,t;return a=r||[],t=i||H.properties.ATTACHMENTS,void 0===e?a:null!==e&&z.xapiValidationUtils.isArray(e)?(e.forEach(function(e,i){x(e,z.xapiValidationUtils.addLookupToTrace(t,i),a)}),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function L(e,i,r){var a,t,T;return a=r||[],t=i||H.properties.AGENT,z.xapiValidationUtils.isNonNullMapObject(e)?(T=u(e),T!==w.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:Y.xapiErrorLevels.MUST_VIOLATION}),e.objectType===H.objectTypes.GROUP&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,level:Y.xapiErrorLevels.MUST_VIOLATION}),l(e,t,a),s(e,H.properties.NAME,t,a,!1),o(e,j.xapiWhiteListProperties.AGENT,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function D(e,i,r){var a,t,T,p;return a=r||[],t=i||H.properties.GROUP,T=z.xapiValidationUtils.addPropToTrace(t,H.properties.MEMBER),z.xapiValidationUtils.isNonNullMapObject(e)?(p=u(e),0===p?null!==e.member&&void 0!==e.member||a.push({trace:T,message:Y.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,level:Y.xapiErrorLevels.MUST_VIOLATION}):p>w.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:Y.xapiErrorLevels.MUST_VIOLATION}),l(e,t,a),s(e,H.properties.NAME,t,a,!1),void 0!==e.member&&(null!==e.member&&z.xapiValidationUtils.isArray(e.member)?e.member.forEach(function(e,i){L(e,z.xapiValidationUtils.addLookupToTrace(T,i),a)}):a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.MEMBER),message:Y.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,level:Y.xapiErrorLevels.MUST_VIOLATION})),o(e,j.xapiWhiteListProperties.GROUP,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function v(e,i,r){var a,t;return a=r||[],t=i||H.properties.ACTOR,null===e||void 0===e?(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION}),a):(z.xapiValidationUtils.isGroup(e)?D(e,t,a):L(e,t,a),a)}function C(e,i,r){var a,t;return a=r||[],t=i||H.properties.AUTHORITY,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(z.xapiValidationUtils.isGroup(e)?(D(e,t,a),e.member&&e.member.length&&e.member.length===w.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.MEMBER),message:Y.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,level:Y.xapiErrorLevels.MUST_VIOLATION})):L(e,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function P(e,i,r){var a,t;return a=r||[],t=i||H.properties.SUB_CONTEXT,void 0===e?a:(null===e?a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,level:Y.xapiErrorLevels.MUST_VIOLATION}):z.xapiValidationUtils.isArray(e)?e.forEach(function(e,i){c(e,z.xapiValidationUtils.addLookupToTrace(t,i),a)}):z.xapiValidationUtils.isObject(e)?(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,level:Y.xapiErrorLevels.SHOULD_VIOLATION}),c(e,t,a)):a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function m(e,i,r){var a,t;return a=r||[],t=i||H.properties.CONTEXT_ACTIVITIES,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(P(e.parent,z.xapiValidationUtils.addPropToTrace(t,H.properties.PARENT),a),P(e.grouping,z.xapiValidationUtils.addPropToTrace(t,H.properties.GROUPING),a),P(e.category,z.xapiValidationUtils.addPropToTrace(t,H.properties.CATEGORY),a),P(e.other,z.xapiValidationUtils.addPropToTrace(t,H.properties.OTHER),a),o(e,j.xapiWhiteListProperties.CONTEXT_ACTIVITIES,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function g(e,i,r,a){var t,T;return t=r||[],T=i||H.properties.CONTEXT,void 0===e?t:z.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.registration||null!==e.registration&&z.xapiValidationUtils.isString(e.registration)&&X.xapiValidationRegex.UUID.test(e.registration)||t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.REGISTRATION),message:Y.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),[H.objectTypes.GROUP,H.objectTypes.AGENT].indexOf(a)!==w.xapiGeneral.NO_INDEX_FOUND&&(void 0!==e.revision&&t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.REVISION),message:Y.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.platform&&t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.PLATFORM),message:Y.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,level:Y.xapiErrorLevels.MUST_VIOLATION})),s(e,H.properties.REVISION,T,t,!1,Y.xapiErrorLevels.MUST_VIOLATION),s(e,H.properties.PLATFORM,T,t,!1,Y.xapiErrorLevels.MUST_VIOLATION),void 0!==e.team&&D(e.team,z.xapiValidationUtils.addPropToTrace(T,H.properties.TEAM),t),void 0!==e.contextActivities&&m(e.contextActivities,z.xapiValidationUtils.addPropToTrace(T,H.properties.CONTEXT_ACTIVITIES),t),void 0===e.language||z.xapiValidationUtils.isValidLanguageTag(e.language)||t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.LANGUAGE),message:Y.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.statement&&A(e.statement,z.xapiValidationUtils.addPropToTrace(T,H.properties.STATEMENT),t),void 0!==e.instructor&&(z.xapiValidationUtils.isGroup(e.instructor)?D(e.instructor,z.xapiValidationUtils.addPropToTrace(T,H.properties.INSTRUCTOR),t):L(e.instructor,z.xapiValidationUtils.addPropToTrace(T,H.properties.INSTRUCTOR),t)),I(e.extensions,z.xapiValidationUtils.addPropToTrace(T,H.properties.EXTENSIONS),t),o(e,j.xapiWhiteListProperties.EXTENSIONS,T,t),t):(t.push({trace:T,message:Y.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function B(e,i,r,a){var t,o,T;if(t=r||[],o=i||H.properties.OBJECT,void 0===e)return t.push({trace:z.xapiValidationUtils.localTraceToString(o),message:Y.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,level:Y.xapiErrorLevels.MUST_VIOLATION}),t;if(!z.xapiValidationUtils.isNonNullMapObject(e))return t.push({trace:z.xapiValidationUtils.localTraceToString(o),message:Y.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),t;switch(s(e,H.properties.OBJECT_TYPE,o,t,!0,Y.xapiErrorLevels.SHOULD_VIOLATION),T=e.objectType||H.objectTypes.ACTIVITY){case H.objectTypes.ACTIVITY:c(e,o,t);break;case H.objectTypes.AGENT:L(e,o,t);break;case H.objectTypes.GROUP:D(e,o,t);break;case H.objectTypes.STATEMENT_REF:A(e,o,t);break;case H.objectTypes.SUB_STATEMENT:a&&t.push({trace:z.xapiValidationUtils.localTraceToString(o,H.properties.OBJECT_TYPE),message:Y.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,level:Y.xapiErrorLevels.MUST_VIOLATION}),f(e,o,t,!0);break;default:t.push({trace:z.xapiValidationUtils.localTraceToString(o,H.properties.OBJECT_TYPE),message:Y.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION+" "+H.xApiValidObjectTypes.toString(),level:Y.xapiErrorLevels.MUST_VIOLATION})}return t}function f(e,i,r,a){var t,s,T,p;return t=r||[],s=i||H.properties.STATEMENT,p=j.xapiWhiteListProperties.STATEMENT,z.xapiValidationUtils.isNonNullMapObject(e)?(a?p=j.xapiWhiteListProperties.SUB_STATEMENT:null!==e.id&&void 0!==e.id&&z.xapiValidationUtils.isString(e.id)?X.xapiValidationRegex.UUID.test(e.id)||t.push({trace:z.xapiValidationUtils.localTraceToString(s,H.properties.ID),message:Y.xapiValidationErrors.ID_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}):t.push({trace:z.xapiValidationUtils.localTraceToString(s,H.properties.ID),message:Y.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,level:Y.xapiErrorLevels.SHOULD_VIOLATION}),v(e.actor,z.xapiValidationUtils.addPropToTrace(s,H.properties.ACTOR),t),N(e.verb,z.xapiValidationUtils.addPropToTrace(s,H.properties.VERB),t),B(e.object,z.xapiValidationUtils.addPropToTrace(s,H.properties.OBJECT),t,a),U(e.result,z.xapiValidationUtils.addPropToTrace(s,H.properties.RESULT),t),T=e.object&&e.object.objectType?e.object.objectType:H.objectTypes.ACTIVITY,g(e.context,z.xapiValidationUtils.addPropToTrace(s,H.properties.CONTEXT),t,T),M(e,H.properties.TIMESTAMP,s,t),M(e,H.properties.STORED,s,t),C(e.authority,z.xapiValidationUtils.addPropToTrace(s,H.properties.AUTHORITY),t),V(e.version,z.xapiValidationUtils.addPropToTrace(s,H.properties.VERSION),t),R(e.attachments,z.xapiValidationUtils.addPropToTrace(s,H.properties.ATTACHMENTS),t),o(e,p,s,t),t):(t.push({trace:z.xapiValidationUtils.localTraceToString(s),message:Y.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function b(e){var i;return i=[],f(e,H.properties.STATEMENT,i,!1),a(e,i)}function h(e){var i;if(void 0===e)return t(null,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION});if(null===e)return t(null,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,level:Y.xapiErrorLevels.MUST_VIOLATION});if(z.xapiValidationUtils.isString(e)){try{if(i=JSON.parse(e),null===i||!z.xapiValidationUtils.isObject(i)||z.xapiValidationUtils.isArray(i))return t(i,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,level:Y.xapiErrorLevels.MUST_VIOLATION})}catch(e){return t(i,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.INVALID_JSON+": "+e.message,level:Y.xapiErrorLevels.MUST_VIOLATION})}return b(i)}return z.xapiValidationUtils.isObject(e)&&!z.xapiValidationUtils.isArray(e)?b(e):t(null,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION})}function G(e){return e[X.dateFormatRegexPositions.ZONE]||e[X.dateFormatRegexPositions.RELATIVE_TIME]&&e[X.dateFormatRegexPositions.TIME_ZONE_HOUR]}Object.defineProperty(r,"__esModule",{value:!0});var y,H=e("./constants/properties"),j=e("./constants/whitelists"),Y=e("./constants/errors"),X=e("./constants/regex"),J=e("./constants/interaction-types"),w=e("./constants/general"),z=e("./utils/utils");y={validateStatement:h},r.default=y,window.xapiValidator=y},{"./constants/errors":1,"./constants/general":2,"./constants/interaction-types":3,"./constants/properties":4,"./constants/regex":5,"./constants/whitelists":6,"./utils/utils":7}]},{},[8])(8)}); //# sourceMappingURL=maps/xapiValidator.min.js.map diff --git a/src/constants/errors.js b/src/constants/errors.js index 6b847ed..d6ed3ce 100644 --- a/src/constants/errors.js +++ b/src/constants/errors.js @@ -7,82 +7,82 @@ const xapiErrorLevels = Object.freeze({ }); const xapiValidationErrors = Object.freeze({ - UNEXPECTED: 'Unexpected property not permitted', - MUST_BE_STRING: 'property, if present, must be a string.', - MUST_BE_PRESENT: 'property was required to be a string but was absent.', - MUST_BE_URI_STRING: 'property, if present, must be a URI string.', - MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', - MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', - MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', - MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', - MUST_BE_NUMBER: 'property, if present, must be a Number.', - MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', - MUST_BE_MBOX_URI: 'mbox property was required to be a mailto URI string but was not a string at all.', - MUST_BE_VALID_MBOX_FORMAT: 'mbox property was required to be a mailto URI string but did not match the mailto format.', - EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', - LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', - LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', - LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', - VERB_MUST_BE_PROVIDED: 'Verb must be provided', - VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', - DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', - INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', - INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', - INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', - INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', - ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', - ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', - INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', - DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', - CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', - CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS: 'Activities must be non-null map objects', - STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', - OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', - ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', - SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', - RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', - MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', - RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', - RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', - DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', - DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', - DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', - VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0', - ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', - LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', - SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', - SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', - ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', - AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', + ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for an "agent".', + AGENT_MUST_BE_NON_NULL_MAP_OBJECT: '"agent" must be a non-null map object', AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS: 'Invalid object with characteristics of a Group when an Agent was expected.', - GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', - MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', - GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', - GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', - ACTOR_MUST_BE_PROVIDED: 'Actor must be provided.', + ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY: '"attachments" must be a non-null Array.', + ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS: '"attachment" instances must be non-null map objects.', AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT: 'If present, the "authority" property must be a non-null map object.', - GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', - CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', - CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ: 'Context Activities property values must be an array of Activity Objects or a single Activity Object.', CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT: 'The Context Activities instances must be a non-null map object.', + CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL: '"Context Activities" property values must not be null.', + CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY: 'Context Activities property values should prefer to be an array of Activities rather than a single Activity object.', CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT: 'If present, the "context" property must be a non-null map object.', - REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', - REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', + CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY: 'If present, the "correctResponsesPattern" value must be an Array of strings.', + CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS: '"correctResponsesPattern" items must be strings.', + DATE_MUST_BE_VALID: 'This propertys string value must be conformant to ISO 8601 for Date Times.', + DATE_SHOULD_INCLUDE_ZONE_INFORMATION: 'ISO 8601 date time strings used in the xAPI should include time zone information.', + DEFINITIONS_MUST_BE_OBJECTS: '"definitions", when present, must be map objects', + DISPLAY_SHOULD_BE_PROVIDED: '"display" property should be provided.', + DURATION_MUST_BE_VALID: 'If present, the "duration" property value must be an ISO 8601 duration', + EXTENSIONS_MUST_NOT_BE_NULL: 'If present, the extensions property must be a non-null map object.', + GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO: 'If used as a Group, the "authority" property must contain a "member" property that is an array containing exactly two Agent objects.', + GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED: 'Exactly one Inverse Functional Identifier property must be specified for a "group".', + GROUP_MEMBER_MUST_BE_ARRAY: 'If present, the member property of a Group must be an Array', + GROUP_MUST_BE_NON_NULL_MAP_OBJECT: '"group" must be a non-null map object', + ID_MUST_BE_UNIQUE: '"id" properties must be unique within each interaction component array', + ID_MUST_BE_VALID_UUID_REF: '"id" property value must be a valid UUID string for statement reference objects.', + ID_MUST_BE_VALID: 'Id was not a valid UUID', + ID_SHOULD_NOT_CONTAIN_WHITESPACES: '"id" properties on interaction components should not contain whitespace', + IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', + IFI_MUST_BE_MBOX_URI: '"mbox" property was required to be a mailto URI string but was not a string at all.', + IFI_MUST_BE_VALID_MBOX_FORMAT: '"mbox" property was required to be a mailto URI string but did not match the mailto format.', + INTERACTION_ACTIVITY_SHOULD_HAVE: 'Interaction Activity Definitions should have a type property of', + INTERACTION_COMPONENT_MUST_NOT_BE_NULL: 'This interaction component collection member must be a non-null map object', + INTERACTION_COMPONENT_SHOULD_BE_ARRAY: 'This interaction component collection property should be an array.', + INTERACTION_TYPE_MUST_BE_CMI: 'If present, the "interactionType" value must be a CMI interaction type option.', + INTERACTION_TYPE_MUST_BE_VALID: 'This interaction component collection property is not associated with the present interactionType of: ', + INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', + LANGUAGE_MAP_KEY_INVALID: 'key, Language does not conform to RFC 5646', + LANGUAGE_MAP_KEY_MUST_BE_STRING: 'key: Language Map value should be a String, but was not', + LANGUAGE_MAPS_MUST_NOT_BE_NULL: 'Language Maps, when present, must be non-null map objects', LANGUAGE_MUST_BE_STRING: 'The language property must be encoded as an RFC 5646 compliant string, but was not.', + LENGTH_MUST_BE_INTEGER: '"length" property must be provided with an integer value', + MAX_MUST_BE_GREATER_THAN_MIN: 'If both "max" and "min" are present, the max property value should be greater than min', + MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS: '"member" property must be provided for Anonymous Groups.', + MUST_BE_BOOLEAN_PRESENT: 'property was required to be a Boolean but was absent.', + MUST_BE_BOOLEAN: 'property, if present, must be a Boolean.', + MUST_BE_IRI_STRING: 'property, if present, should be a IRI-like absolute URI per RFC 3987.', + MUST_BE_NUMBER_PRESENT: 'property was required to be a Number but was absent.', + MUST_BE_NUMBER: 'property, if present, must be a Number.', + MUST_BE_PRESENT: 'property was required to be a string but was absent.', + MUST_BE_STRING: 'property, if present, must be a string.', + MUST_BE_URI_PRESENT: 'property was required to be a URI string but was absent.', + MUST_BE_URI_STRING: 'property, if present, must be a URI string.', OBJECT_MUST_BE_DEFINED: '"object" property must be provided.', OBJECT_MUST_BE_NON_NULL_MAP_OBJECT: '"object" property must be a non-null map object.', - SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', + OBJECT_TYPE_MUST_BE_STATEMENT_REF: '"objectType" property value must be "StatementRef" for statement reference objects.', OBJECT_TYPE_MUST_BE_VALID_OPTION: 'object\'s "objectType" did not match a valid option', - IDS_SHOULD_BE_GENERATED_BY_LRS: 'Ids should be generated by the Activity Provider, and must be generated by the LRS', - ID_MUST_BE_VALID: 'Id was not a valid UUID', + RAW_MUST_BE_GREATER_THAN_MIN: 'If both "raw" and "min" are present, the raw property value should be greater than min', + RAW_MUST_BE_LESS_THAN_MAX: 'If both "raw" and "max" are present, the raw property value should be less than max', + REGISTRATION_MUST_BE_UUID_STRING: 'If present, the registration property must be a UUID string.', + RESULT_MUST_BE_MAP_OBJECT: 'If present, the result must be a map object', + REVISION_MUST_BE_AGENT_OR_GROUP: 'The revision property must not be used if the Statement\'s Object is an Agent or Group.', + SCALED_MUST_BE_BETWEEN_0_1: 'If present, the scaled property value must be between 0 and 1', + SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS: '"sha2" property must be provided on attachment objects', + SHA2_MUST_CONTAIN_BASE_64_STRING: '"sha2" property must contain a string with base64 contents', + STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.', STATEMENT_ARGUMENT_MUST_BE_PROVIDED: 'No statement argument provided.', - STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', STATEMENT_MUST_BE_PARSED_CORRECTLY: 'Null or non-object statement value parsed from provided statment JSON.', - INVALID_JSON: 'Invalid JSON. The statement could not be parsed.', - STATEMENT_ARGUMENT_IS_NOT_VALID: 'Statement argument provided was not a valid object or a valid JSON string.' + STATEMENT_MUST_NOT_BE_NULL: 'Null statement argument provided.', + STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS: 'StatementRef instances must be non-null map objects', + SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT: 'A SubStatement must not contain a SubStatement', + UNEXPECTED: 'Unexpected property not permitted', + VERB_MUST_BE_PROVIDED: 'Verb must be provided', + VERB_MUST_NOT_BE_NULL: 'Verb property value must a non-null map object.', + VERSION_MUST_COMPLY_SEMANTIC_VERSIONING: '"version" must be a non-null string that complies with Semantic Versioning 1.0.0' }); export {xapiErrorLevels}; diff --git a/src/constants/whitelists.js b/src/constants/whitelists.js index 9fdff6a..72514cb 100644 --- a/src/constants/whitelists.js +++ b/src/constants/whitelists.js @@ -105,6 +105,17 @@ properties.TIMESTAMP, properties.ATTACHMENTS, properties.OBJECT_TYPE + ], + EXTENSIONS: [ + properties.REGISTRATION, + properties.INSTRUCTOR, + properties.TEAM, + properties.CONTEXT_ACTIVITIES, + properties.REVISION, + properties.PLATFORM, + properties.LANGUAGE, + properties.STATEMENT, + properties.EXTENSIONS ] }); diff --git a/src/xAPI-validator.js b/src/xAPI-validator.js index 827ccee..b819e2b 100644 --- a/src/xAPI-validator.js +++ b/src/xAPI-validator.js @@ -1,12 +1,12 @@ 'use strict'; -import {properties, objectTypes, xapiValidationIfiPropertyNames, xApiValidObjectTypes} from '/constants/properties'; -import {xapiWhiteListProperties} from '/constants/whitelists'; -import {xapiErrorLevels, xapiValidationErrors} from '/constants/errors'; -import {xapiValidationRegex, dateFormatRegexPositions} from '/constants/regex'; -import {xapiValidationInteractionTypes} from '/constants/interaction-types'; -import {xapiGeneral} from '/constants/general'; -import {xapiValidationUtils} from '/utils/utils'; +import {properties, objectTypes, xapiValidationIfiPropertyNames, xApiValidObjectTypes} from './constants/properties'; +import {xapiWhiteListProperties} from './constants/whitelists'; +import {xapiErrorLevels, xapiValidationErrors} from './constants/errors'; +import {xapiValidationRegex, dateFormatRegexPositions} from './constants/regex'; +import {xapiValidationInteractionTypes} from './constants/interaction-types'; +import {xapiGeneral} from './constants/general'; +import {xapiValidationUtils} from './utils/utils'; var xapiValidator; @@ -14,7 +14,7 @@ function makeV1Report(instance, errors) { var version; instance = instance || null; - errors = errors || null; + errors = errors || null; version = xapiGeneral.FIRST_REPORT_VERSTION; return {instance, errors, version}; } @@ -165,13 +165,13 @@ function validateIFIProperties(target, trace, errors) { if (!xapiValidationUtils.isString(target.mbox)) { localErrors.push({ trace: xapiValidationUtils.localTraceToString(localTrace, properties.MBOX), - message: xapiValidationErrors.MUST_BE_MBOX_URI, + message: xapiValidationErrors.IFI_MUST_BE_MBOX_URI, level: xapiErrorLevels.MUST_VIOLATION }); } else if (!xapiValidationRegex.MAILTO_URI.test(target.mbox)) { localErrors.push({ trace: xapiValidationUtils.localTraceToString(localTrace, properties.MBOX), - message: xapiValidationErrors.MUST_BE_VALID_MBOX_FORMAT, + message: xapiValidationErrors.IFI_MUST_BE_VALID_MBOX_FORMAT, level: xapiErrorLevels.MUST_VIOLATION }); } @@ -191,23 +191,15 @@ function validateIFIProperties(target, trace, errors) { } function getIFIs(target) { - var ifis, propertiesLength, i, propName, propValue; + var ifis; - ifis = []; - propertiesLength = xapiValidationIfiPropertyNames.length; + if (target === null || target === undefined) {return [];} - if (target === null || target === undefined) { - return ifis; - } - - for (i = 0; i < propertiesLength; i += 1) { - propName = xapiValidationIfiPropertyNames[i]; - propValue = target[propName]; - - if (propValue !== undefined && propValue !== null) { - ifis.push({key: propName, value: propValue}); + ifis = xapiValidationIfiPropertyNames.filter((name) => { + if (target[name] !== undefined && target[name] !== null) { + return {key: name, value: target[name]}; } - } + }); return ifis; } @@ -235,268 +227,259 @@ function validateExtensions(extensions, trace, errors) { return localErrors; } - function validateLanguageMap(languageMap, trace, errors) { - var localErrors, localTrace, propName, mappedValue; - - localErrors = errors || []; - localTrace = trace || properties.LANGUAGE_MAP; - - if (languageMap === undefined) {return localErrors;} +function validateLanguageMap(languageMap, trace, errors) { + var localErrors, localTrace, propName, mappedValue; - if (!xapiValidationUtils.isNonNullMapObject(languageMap)) { - localErrors.push({ - trace: xapiValidationUtils.addPropToTrace(localTrace), - message: xapiValidationErrors.LANGUAGE_MAPS_MUST_NOT_BE_NULL, - level: xapiErrorLevels.MUST_VIOLATION - }); - - return localErrors; - } - - for (propName in languageMap) { - if (languageMap.hasOwnProperty(propName)) { - if (!xapiValidationUtils.isValidLanguageTag(propName)) { - localErrors.push({ - trace: xapiValidationUtils.addPropToTrace(localTrace, propName), - message: `${propName} ${xapiValidationErrors.LANGUAGE_MAP_KEY_INVALID}`, - level: xapiErrorLevels.MUST_VIOLATION - }); - } + localErrors = errors || []; + localTrace = trace || properties.LANGUAGE_MAP; - mappedValue = languageMap[propName]; + if (languageMap === undefined) {return localErrors;} - if (mappedValue === null || mappedValue === undefined || !xapiValidationUtils.isString(mappedValue)) { - localErrors.push({ - trace: xapiValidationUtils.addLookupToTrace(localTrace, propName), - message: `${propName} ${xapiValidationErrors.LANGUAGE_MAP_KEY_MUST_BE_STRING}`, - level: xapiErrorLevels.MUST_VIOLATION - }); - } - } - } + if (!xapiValidationUtils.isNonNullMapObject(languageMap)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace), + message: xapiValidationErrors.LANGUAGE_MAPS_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); return localErrors; } - function validateVerb(verb, trace, errors) { - var localErrors, localTrace; + for (propName in languageMap) { - localErrors = errors || []; - localTrace = trace || properties.VERB; + if (languageMap.hasOwnProperty(propName)) { + if (!xapiValidationUtils.isValidLanguageTag(propName)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, propName), + message: `${propName} ${xapiValidationErrors.LANGUAGE_MAP_KEY_INVALID}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } - if (verb === undefined) { - localErrors.push({ - trace: xapiValidationUtils.localTraceToString(localTrace), - message: xapiValidationErrors.VERB_MUST_BE_PROVIDED, - level: xapiErrorLevels.MUST_VIOLATION - }); + mappedValue = languageMap[propName]; - return localErrors; + if (mappedValue === null || mappedValue === undefined || !xapiValidationUtils.isString(mappedValue)) { + localErrors.push({ + trace: xapiValidationUtils.addLookupToTrace(localTrace, propName), + message: `${propName} ${xapiValidationErrors.LANGUAGE_MAP_KEY_MUST_BE_STRING}`, + level: xapiErrorLevels.MUST_VIOLATION + }); + } } + } - if (!xapiValidationUtils.isNonNullMapObject(verb)) { - localErrors.push({ - trace: xapiValidationUtils.localTraceToString(localTrace), - message: xapiValidationErrors.VERB_MUST_NOT_BE_NULL, - level: xapiErrorLevels.MUST_VIOLATION - }); + return localErrors; +} - return localErrors; - } +function validateVerb(verb, trace, errors) { + var localErrors, localTrace; - validatePropertyIsUri(verb, properties.ID, localTrace, localErrors, /*isRequired*/true); + localErrors = errors || []; + localTrace = trace || properties.VERB; - if (verb.display === undefined) { - localErrors.push({ - trace: xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), - message: xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED, - level: xapiErrorLevels.SHOULD_VIOLATION - }); - } else { - validateLanguageMap(verb.display, xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), localErrors); - } + if (verb === undefined) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.VERB_MUST_BE_PROVIDED, + level: xapiErrorLevels.MUST_VIOLATION + }); + + return localErrors; + } - validateAbsenceOfNonWhitelistedProperties(verb, xapiWhiteListProperties.URI, localTrace, localErrors); + if (!xapiValidationUtils.isNonNullMapObject(verb)) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace), + message: xapiValidationErrors.VERB_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); return localErrors; } - function validateInteractionComponentArray(components, interactionType, allowedInteractionTypes, trace, errors) { - var localErrors, localTrace, isAllowedComponentType, ids, interactionComponent, componentsLength, perComponentTrace, i; + validatePropertyIsUri(verb, properties.ID, localTrace, localErrors, /*isRequired*/true); + + if (verb.display === undefined) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), + message: xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } else { + validateLanguageMap(verb.display, xapiValidationUtils.addPropToTrace(localTrace, properties.DISPLAY), localErrors); + } - localErrors = errors || []; - localTrace = trace || properties.INTERACTION_COMPONENTS; - isAllowedComponentType = allowedInteractionTypes.indexOf(interactionType) !== xapiGeneral.NO_INDEX_FOUND; - ids = []; + validateAbsenceOfNonWhitelistedProperties(verb, xapiWhiteListProperties.URI, localTrace, localErrors); + return localErrors; +} - if (isAllowedComponentType && components !== undefined) { - if (components === null || !xapiValidationUtils.isArray(components)) { - localErrors.push({ - trace: localTrace, - message: xapiValidationErrors.INTERACTION_COMPONENT_SHOULD_BE_ARRAY, - level: xapiErrorLevels.SHOULD_VIOLATION - }); +function validateInteractionComponentArray(components, interactionType, allowedInteractionTypes, trace, errors) { + var localErrors, localTrace, isAllowedComponentType, ids, perComponentTrace; - } else { - componentsLength = components.length; + localErrors = errors || []; + localTrace = trace || properties.INTERACTION_COMPONENTS; + isAllowedComponentType = allowedInteractionTypes.indexOf(interactionType) !== xapiGeneral.NO_INDEX_FOUND; + ids = []; - for (i = 0; i < componentsLength; i += 1) { - interactionComponent = components[i]; - perComponentTrace = xapiValidationUtils.addLookupToTrace(localTrace, i); + if (isAllowedComponentType && components !== undefined) { + if (components === null || !xapiValidationUtils.isArray(components)) { + localErrors.push({ + trace: localTrace, + message: xapiValidationErrors.INTERACTION_COMPONENT_SHOULD_BE_ARRAY, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } else { + components.forEach((interactionComponent, i) => { + perComponentTrace = xapiValidationUtils.addLookupToTrace(localTrace, i); - if (!xapiValidationUtils.isNonNullMapObject(interactionComponent)) { + if (!xapiValidationUtils.isNonNullMapObject(interactionComponent)) { + localErrors.push({ + trace: perComponentTrace, + message: xapiValidationErrors.INTERACTION_COMPONENT_MUST_NOT_BE_NULL, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else { + validatePropertyIsString(interactionComponent, properties.ID, perComponentTrace, localErrors, /*isRequired*/true, xapiErrorLevels.MUST_VIOLATION); + if (ids.indexOf(interactionComponent.id) !== xapiGeneral.NO_INDEX_FOUND) { localErrors.push({ - trace: perComponentTrace, - message: xapiValidationErrors.INTERACTION_COMPONENT_MUST_NOT_BE_NULL, + trace: xapiValidationUtils.addPropToTrace(perComponentTrace, properties.ID), + message: xapiValidationErrors.ID_MUST_BE_UNIQUE, level: xapiErrorLevels.MUST_VIOLATION }); } else { - validatePropertyIsString(interactionComponent, properties.ID, perComponentTrace, localErrors, /*isRequired*/true, xapiErrorLevels.MUST_VIOLATION); - - if (ids.indexOf(interactionComponent.id) !== xapiGeneral.NO_INDEX_FOUND) { - localErrors.push({ - trace: xapiValidationUtils.addPropToTrace(perComponentTrace, properties.ID), - message: xapiValidationErrors.ID_MUST_BE_UNIQUE, - level: xapiErrorLevels.MUST_VIOLATION - }); - } else { - ids.push(interactionComponent.id); - } - - if (interactionComponent.id && xapiValidationRegex.CONTAINS_WHITESPACE.test(interactionComponent.id)) { - localErrors.push({ - trace: xapiValidationUtils.addPropToTrace(perComponentTrace, properties.ID), - message: xapiValidationErrors.ID_SHOULD_NOT_CONTAIN_WHITESPACES, - level: xapiErrorLevels.SHOULD_VIOLATION - }); - } - - validateLanguageMap(interactionComponent.description, xapiValidationUtils.addPropToTrace(perComponentTrace, properties.DESCRIPTION), localErrors); - validateAbsenceOfNonWhitelistedProperties(interactionComponent, xapiWhiteListProperties.COMPONENT_ARRAY, perComponentTrace, localErrors); + ids.push(interactionComponent.id); } - } - } - } else if (interactionType && components) { - localErrors.push({ - trace: localTrace, - message: `${xapiValidationErrors.INTERACTION_TYPE_MUST_BE_VALID} ${interactionType}`, - level: xapiErrorLevels.SHOULD_VIOLATION + if (interactionComponent.id && xapiValidationRegex.CONTAINS_WHITESPACE.test(interactionComponent.id)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(perComponentTrace, properties.ID), + message: xapiValidationErrors.ID_SHOULD_NOT_CONTAIN_WHITESPACES, + level: xapiErrorLevels.SHOULD_VIOLATION + }); + } + + validateLanguageMap(interactionComponent.description, xapiValidationUtils.addPropToTrace(perComponentTrace, properties.DESCRIPTION), localErrors); + validateAbsenceOfNonWhitelistedProperties(interactionComponent, xapiWhiteListProperties.COMPONENT_ARRAY, perComponentTrace, localErrors); + } }); - } - return localErrors; + } + } else if (interactionType && components) { + localErrors.push({ + trace: localTrace, + message: `${xapiValidationErrors.INTERACTION_TYPE_MUST_BE_VALID} ${interactionType}`, + level: xapiErrorLevels.SHOULD_VIOLATION + }); } - function validateActivityDefintion(definition, trace, errors) { - var localErrors, localTrace, correctResponsesPatternTrace, correctResponsesPatternLength, crpItem, i; + return localErrors; +} - localErrors = errors || []; - localTrace = trace || properties.DEFINITION; - correctResponsesPatternTrace = xapiValidationUtils.addPropToTrace(localTrace, properties.CORRECT_RESPONSES_PATTERN); +function validateActivityDefintion(definition, trace, errors) { + var localErrors, localTrace, correctResponsesPatternTrace; - if (!xapiValidationUtils.isNonNullMapObject(definition)) { - localErrors.push({ - trace: xapiValidationUtils.addPropToTrace(localTrace), - message: xapiValidationErrors.DEFINITIONS_MUST_BE_OBJECTS, - level: xapiErrorLevels.MUST_VIOLATION - }); + localErrors = errors || []; + localTrace = trace || properties.DEFINITION; + correctResponsesPatternTrace = xapiValidationUtils.addPropToTrace(localTrace, properties.CORRECT_RESPONSES_PATTERN); - return localErrors; - } + if (!xapiValidationUtils.isNonNullMapObject(definition)) { + localErrors.push({ + trace: xapiValidationUtils.addPropToTrace(localTrace), + message: xapiValidationErrors.DEFINITIONS_MUST_BE_OBJECTS, + level: xapiErrorLevels.MUST_VIOLATION + }); - validateLanguageMap(definition.name, xapiValidationUtils.addPropToTrace(localTrace, properties.NAME), localErrors); - validateLanguageMap(definition.description, xapiValidationUtils.addPropToTrace(localTrace, properties.DESCRIPTION), localErrors); + return localErrors; + } - validatePropertyIsUri(definition, properties.TYPE, localTrace, localErrors, /*isRequired*/false); - validatePropertyIsUrl(definition, properties.MORE_INFO, localTrace, localErrors, /*isRequired*/false); - validateExtensions(definition.extensions, xapiValidationUtils.addPropToTrace(localTrace, properties.EXTENSIONS), localErrors); + validateLanguageMap(definition.name, xapiValidationUtils.addPropToTrace(localTrace, properties.NAME), localErrors); + validateLanguageMap(definition.description, xapiValidationUtils.addPropToTrace(localTrace, properties.DESCRIPTION), localErrors); - if (definition.interactionType !== undefined) { - if (definition.type !== xapiGeneral.INTERACTION_DEFINITION_TYPE) { - localErrors.push({ - trace: xapiValidationUtils.localTraceToString(localTrace, properties.TYPE), - message: `${xapiValidationErrors.INTERACTION_ACTIVITY_SHOULD_HAVE} "${xapiGeneral.INTERACTION_DEFINITION_TYPE}"`, - level: xapiErrorLevels.SHOULD_VIOLATION - }); - } + validatePropertyIsUri(definition, properties.TYPE, localTrace, localErrors, /*isRequired*/false); + validatePropertyIsUrl(definition, properties.MORE_INFO, localTrace, localErrors, /*isRequired*/false); + validateExtensions(definition.extensions, xapiValidationUtils.addPropToTrace(localTrace, properties.EXTENSIONS), localErrors); - if (xapiValidationInteractionTypes.indexOf(definition.interactionType) === xapiGeneral.NO_INDEX_FOUND) { - localErrors.push({ - trace: xapiValidationUtils.localTraceToString(localTrace, properties.INTERACTION_TYPE), - message: xapiValidationErrors.INTERACTION_TYPE_MUST_BE_CMI, - level: xapiErrorLevels.MUST_VIOLATION - }); - } + if (definition.interactionType !== undefined) { + if (definition.type !== xapiGeneral.INTERACTION_DEFINITION_TYPE) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.TYPE), + message: `${xapiValidationErrors.INTERACTION_ACTIVITY_SHOULD_HAVE} "${xapiGeneral.INTERACTION_DEFINITION_TYPE}"`, + level: xapiErrorLevels.SHOULD_VIOLATION + }); } - if (definition.correctResponsesPattern !== undefined) { - if (!xapiValidationUtils.isArray(definition.correctResponsesPattern)) { - localErrors.push({ - trace: correctResponsesPatternTrace, - message: xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY, - level: xapiErrorLevels.MUST_VIOLATION - }); - } else { - correctResponsesPatternLength = definition.correctResponsesPattern.length; - - for (i = 0; i < correctResponsesPatternLength; i += 1) { - crpItem = definition.correctResponsesPattern[i]; + if (xapiValidationInteractionTypes.indexOf(definition.interactionType) === xapiGeneral.NO_INDEX_FOUND) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.INTERACTION_TYPE), + message: xapiValidationErrors.INTERACTION_TYPE_MUST_BE_CMI, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + } - if (crpItem === null || crpItem === undefined || !xapiValidationUtils.isString(crpItem)) { - localErrors.push({ - trace: xapiValidationUtils.addLookupToTrace(correctResponsesPatternTrace, i), - message: xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS, - level: xapiErrorLevels.MUST_VIOLATION - }); - } + if (definition.correctResponsesPattern !== undefined) { + if (!xapiValidationUtils.isArray(definition.correctResponsesPattern)) { + localErrors.push({ + trace: correctResponsesPatternTrace, + message: xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY, + level: xapiErrorLevels.MUST_VIOLATION + }); + } else { + definition.correctResponsesPattern.forEach((response, i) => { + if (response === null || response === undefined || !xapiValidationUtils.isString(response)) { + localErrors.push({ + trace: xapiValidationUtils.addLookupToTrace(correctResponsesPatternTrace, i), + message: xapiValidationErrors.CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS, + level: xapiErrorLevels.MUST_VIOLATION + }); } - } + }); } + } - validateInteractionComponentArray( - definition.choices, - definition.interactionType, - [properties.CHOICE, properties.SEQUENCING], - xapiValidationUtils.addPropToTrace(localTrace, properties.CHOICES), - localErrors - ); + validateInteractionComponentArray( + definition.choices, + definition.interactionType, + [properties.CHOICE, properties.SEQUENCING], + xapiValidationUtils.addPropToTrace(localTrace, properties.CHOICES), + localErrors + ); - validateInteractionComponentArray( - definition.scale, - definition.interactionType, - [properties.LIKERT], - xapiValidationUtils.addPropToTrace(localTrace, properties.SCALE), - localErrors - ); + validateInteractionComponentArray( + definition.scale, + definition.interactionType, + [properties.LIKERT], + xapiValidationUtils.addPropToTrace(localTrace, properties.SCALE), + localErrors + ); - validateInteractionComponentArray( - definition.source, - definition.interactionType, - [properties.MATCHING], - xapiValidationUtils.addPropToTrace(localTrace, properties.SOURCE), - localErrors - ); + validateInteractionComponentArray( + definition.source, + definition.interactionType, + [properties.MATCHING], + xapiValidationUtils.addPropToTrace(localTrace, properties.SOURCE), + localErrors + ); - validateInteractionComponentArray( - definition.target, - definition.interactionType, - [properties.MATCHING], - xapiValidationUtils.addPropToTrace(localTrace, properties.TARGET), - localErrors - ); + validateInteractionComponentArray( + definition.target, + definition.interactionType, + [properties.MATCHING], + xapiValidationUtils.addPropToTrace(localTrace, properties.TARGET), + localErrors + ); - validateInteractionComponentArray( - definition.steps, - definition.interactionType, - [properties.PERFORMANCE], - xapiValidationUtils.addPropToTrace(localTrace, properties.STEPS), - localErrors - ); + validateInteractionComponentArray( + definition.steps, + definition.interactionType, + [properties.PERFORMANCE], + xapiValidationUtils.addPropToTrace(localTrace, properties.STEPS), + localErrors + ); - validateAbsenceOfNonWhitelistedProperties(definition, xapiWhiteListProperties.ACTIVITY_DEFINITION, localTrace, localErrors); - return localErrors; + validateAbsenceOfNonWhitelistedProperties(definition, xapiWhiteListProperties.ACTIVITY_DEFINITION, localTrace, localErrors); + return localErrors; } function validateActivity(activity, trace, errors) { @@ -784,7 +767,7 @@ function validateAttachmentObject(attachment, trace, errors) { } function validateAttachments(attachments, trace, errors) { - var localErrors, localTrace, attachmentsLength, i; + var localErrors, localTrace; localErrors = errors || []; localTrace = trace || properties.ATTACHMENTS; @@ -801,10 +784,9 @@ function validateAttachments(attachments, trace, errors) { return localErrors; } - attachmentsLength = attachments.length; - for (i = 0; i < attachmentsLength; i += 1) { - validateAttachmentObject(attachments[i], xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); - } + attachments.forEach((attachment, i) => { + validateAttachmentObject(attachment, xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + }); return localErrors; } @@ -851,7 +833,7 @@ function validateAgent(agent, trace, errors) { } function validateGroup(group, trace, errors) { - var localErrors, localTrace, memberTrace, ifiCount, numMembers, i; + var localErrors, localTrace, memberTrace, ifiCount; localErrors = errors || []; localTrace = trace || properties.GROUP; @@ -897,11 +879,9 @@ function validateGroup(group, trace, errors) { level: xapiErrorLevels.MUST_VIOLATION }); } else { - numMembers = group.member.length; - - for (i = 0; i < numMembers; i += 1) { - validateAgent(group.member[i], xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors); - } + group.member.forEach((member, i) => { + validateAgent(member, xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors); + }); } } @@ -971,7 +951,7 @@ function validateAuthority(authority, trace, errors) { } function validateContextActivitySubContext(subContext, trace, errors) { - var localErrors, localTrace, numActivities, i; + var localErrors, localTrace; localErrors = errors || []; localTrace = trace || properties.SUB_CONTEXT; @@ -985,10 +965,9 @@ function validateContextActivitySubContext(subContext, trace, errors) { level: xapiErrorLevels.MUST_VIOLATION }); } else if (xapiValidationUtils.isArray(subContext)) { - numActivities = subContext.length; - for (i = 0; i < numActivities; i += 1) { - validateActivity(subContext[i], xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); - } + subContext.forEach((activity, i) => { + validateActivity(activity, xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors); + }); } else if (xapiValidationUtils.isObject(subContext)) { localErrors.push({ trace: xapiValidationUtils.localTraceToString(localTrace), @@ -1111,22 +1090,7 @@ function validateContext(context, trace, errors, statementObjectObjectType) { } validateExtensions(context.extensions, xapiValidationUtils.addPropToTrace(localTrace, properties.EXTENSIONS), localErrors); - validateAbsenceOfNonWhitelistedProperties( - context, - [ - properties.REGISTRATION, - properties.INSTRUCTOR, - properties.TEAM, - properties.CONTEXT_ACTIVITIES, - properties.REVISION, - properties.PLATFORM, - properties.LANGUAGE, - properties.STATEMENT, - properties.EXTENSIONS - ], - localTrace, - localErrors - ); + validateAbsenceOfNonWhitelistedProperties(context, xapiWhiteListProperties.EXTENSIONS,localTrace,localErrors); return localErrors; } @@ -1158,34 +1122,40 @@ function validateObject(object, trace, errors, isWithinSubStatement) { } validatePropertyIsString(object, properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, xapiErrorLevels.SHOULD_VIOLATION); + objectType = object.objectType || objectTypes.ACTIVITY; - // TODO: Switch - if (objectType === objectTypes.ACTIVITY) { - validateActivity(object, localTrace, localErrors); - } else if (objectType === objectTypes.AGENT) { - validateAgent(object, localTrace, localErrors); - } else if (objectType === objectTypes.GROUP) { - validateGroup(object, localTrace, localErrors); - } else if (objectType === objectTypes.STATEMENT_REF) { - validateStatementRef(object, localTrace, localErrors); - } else if (objectType === objectTypes.SUB_STATEMENT) { - if (isWithinSubStatement) { + switch (objectType) { + case objectTypes.ACTIVITY: + validateActivity(object, localTrace, localErrors); + break; + case objectTypes.AGENT: + validateAgent(object, localTrace, localErrors); + break; + case objectTypes.GROUP: + validateGroup(object, localTrace, localErrors); + break; + case objectTypes.STATEMENT_REF: + validateStatementRef(object, localTrace, localErrors); + break; + case objectTypes.SUB_STATEMENT: + if (isWithinSubStatement) { + localErrors.push({ + trace: xapiValidationUtils.localTraceToString(localTrace, properties.OBJECT_TYPE), + message: xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT, + level: xapiErrorLevels.MUST_VIOLATION + }); + } + validateStatement(object, localTrace, localErrors, /*isSubStatement*/true); + break; + default: localErrors.push({ trace: xapiValidationUtils.localTraceToString(localTrace, properties.OBJECT_TYPE), - message: xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT, + message: `${xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION} ${xApiValidObjectTypes.toString()}`, level: xapiErrorLevels.MUST_VIOLATION }); - } - - validateStatement(object, localTrace, localErrors, /*isSubStatement*/true); - } else { - localErrors.push({ - trace: xapiValidationUtils.localTraceToString(localTrace, properties.OBJECT_TYPE), - message: `${xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION} ${xApiValidObjectTypes.toString()}`, - level: xapiErrorLevels.MUST_VIOLATION - }); } + return localErrors; } From 18e2f4f412b040d851bd859162826b9c927bea6c Mon Sep 17 00:00:00 2001 From: elenatorro Date: Thu, 10 Nov 2016 10:22:44 +0100 Subject: [PATCH 04/12] ADDED: travis --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..24a8ab9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "5" From b85f829e4654de7180afaf26da7d3f5b96eb4a45 Mon Sep 17 00:00:00 2001 From: elenatorro Date: Thu, 10 Nov 2016 10:26:08 +0100 Subject: [PATCH 05/12] ADDED: test script --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index fdb8367..da5d833 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,10 @@ "main": "./xapiValidator", "author": "Zachary Pierce", "description": "A validator for Experience API (xAPI) statements", + "scripts": { + "lint": "eslint src/xAPI-validator.js", + "test": "mocha --compilers js:babel-core/register" + }, "keywords": [ "xAPI", "validator", From dd1e603368930236aec2a0b42e590b23ab3a24dc Mon Sep 17 00:00:00 2001 From: elenatorro Date: Thu, 10 Nov 2016 10:31:02 +0100 Subject: [PATCH 06/12] FIXED: missin packages added --- package.json | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index da5d833..481d644 100644 --- a/package.json +++ b/package.json @@ -20,14 +20,25 @@ "node": ">=0.6.6" }, "devDependencies": { + "babel-cli": "^6.18.0", + "babel-core": "^6.18.2", + "babel-eslint": "^7.1.0", + "babel-plugin-add-module-exports": "^0.2.1", + "babel-preset-es2015": "^6.18.0", + "babel": "^6.5.2", + "babelify": "^7.3.0", "browserify": "^13.1.1", - "chai": "*", - "gulp": "^3.9.1", - "gulp-connect": "^5.0.0", + "chai": "^3.5.0", + "coveralls": "^2.11.14", + "eslint": "^3.9.1", + "gulp-babel": "^6.1.2", + "gulp-browserify": "^0.5.1", "gulp-livereload": "^3.8.1", "gulp-sourcemaps": "^2.2.0", "gulp-uglify": "^2.0.0", - "mocha": "*", + "gulp": "^3.9.1", + "mocha": "^3.1.2", + "sinon": "^1.17.6", "underscore": "*", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.1.0" From 0e297fa5c3a2e09ef183764472011edb1fee5ffa Mon Sep 17 00:00:00 2001 From: elenatorro Date: Thu, 10 Nov 2016 15:20:08 +0100 Subject: [PATCH 07/12] FIXED: tests and main library working both as a module and in the browser --- gulpfile.js | 23 +- lib/maps/xapiValidator.min.js.map | 2 +- lib/xapiValidator.js | 21 +- lib/xapiValidator.min.js | 4 +- spec/mocha_runner.html | 2 +- spec/xapiValidator.test.js | 11337 ++++++++++++++++ src/{xAPI-validator.js => xapiValidator.js} | 15 +- .../xapiValidator.test.js | 14 +- 8 files changed, 11381 insertions(+), 37 deletions(-) create mode 100644 spec/xapiValidator.test.js rename src/{xAPI-validator.js => xapiValidator.js} (99%) rename spec/xapiValidator_spec.js => test/xapiValidator.test.js (99%) diff --git a/gulpfile.js b/gulpfile.js index 0ab2eb3..d2dbced 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -21,13 +21,16 @@ const BROWSERIFY_CONFIG = Object.freeze({ debug: true, json: true, - standalone: 'beep-boop' + standalone: 'xapi-validator' }), DIST_FILENAME = 'xapiValidator.js', DIST_FILENAME_MIN = 'xapiValidator.min.js', + DIST_TEST_FILENAME = 'xapiValidator.test.js', DIST_PATH = 'lib', + DIST_TEST_PATH = 'spec', MAPS_PATH = './maps', - SRC_FILE = 'src/xAPI-validator.js', + SRC_FILE = 'src/xapiValidator.js', + SRC_TEST_FILE = 'test/xapiValidator.test.js', WATCH_FILES = ['src/*.js', 'constants/*.js', 'spec/*.js', 'spec/lib/*.js'] ; @@ -35,12 +38,13 @@ const const BUILD_TASK = 'build', - BUILD_PROD_TASK = 'build-prod-task', + BUILD_PROD_TASK = 'build-prod', + BUILD_TEST_TASK = 'build-test', CONNECT_TASK = 'connect', DEFAULT_TASK = 'default', - DEFAULT_TASKS = [BUILD_TASK, BUILD_PROD_TASK], + DEFAULT_TASKS = [BUILD_TASK, BUILD_TEST_TASK], WATCH_TASK = 'watch', - WATCH_TASKS = [BUILD_TASK] + WATCH_TASKS = [BUILD_TASK, BUILD_TEST_TASK] ; gulp.task(BUILD_TASK, () => { @@ -52,6 +56,15 @@ gulp.task(BUILD_TASK, () => { .pipe(livereload()); }); +gulp.task(BUILD_TEST_TASK, () => { + return browserify(SRC_TEST_FILE, BROWSERIFY_CONFIG) + .transform(BROWSERIFY_TRANSFORM, BABEL_CONFIG) + .bundle() + .pipe(source(DIST_TEST_FILENAME)) + .pipe(gulp.dest(DIST_TEST_PATH)) + .pipe(livereload()); +}); + gulp.task(BUILD_PROD_TASK, () => { return browserify(SRC_FILE, BROWSERIFY_CONFIG) .transform(BROWSERIFY_TRANSFORM, BABEL_CONFIG) diff --git a/lib/maps/xapiValidator.min.js.map b/lib/maps/xapiValidator.min.js.map index 45bab25..ebe70e8 100644 --- a/lib/maps/xapiValidator.min.js.map +++ b/lib/maps/xapiValidator.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["xapiValidator.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","beepBoop","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","Object","defineProperty","value","xapiErrorLevels","freeze","MAY_VIOLATION","MUST_VIOLATION","SHOULD_VIOLATION","xapiValidationErrors","ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS","ACTOR_MUST_BE_PROVIDED","AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED","AGENT_MUST_BE_NON_NULL_MAP_OBJECT","AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS","ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY","ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS","AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ","CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL","CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY","CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT","CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY","CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS","DATE_MUST_BE_VALID","DATE_SHOULD_INCLUDE_ZONE_INFORMATION","DEFINITIONS_MUST_BE_OBJECTS","DISPLAY_SHOULD_BE_PROVIDED","DURATION_MUST_BE_VALID","EXTENSIONS_MUST_NOT_BE_NULL","GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO","GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED","GROUP_MEMBER_MUST_BE_ARRAY","GROUP_MUST_BE_NON_NULL_MAP_OBJECT","ID_MUST_BE_UNIQUE","ID_MUST_BE_VALID_UUID_REF","ID_MUST_BE_VALID","ID_SHOULD_NOT_CONTAIN_WHITESPACES","IDS_SHOULD_BE_GENERATED_BY_LRS","IFI_MUST_BE_MBOX_URI","IFI_MUST_BE_VALID_MBOX_FORMAT","INTERACTION_ACTIVITY_SHOULD_HAVE","INTERACTION_COMPONENT_MUST_NOT_BE_NULL","INTERACTION_COMPONENT_SHOULD_BE_ARRAY","INTERACTION_TYPE_MUST_BE_CMI","INTERACTION_TYPE_MUST_BE_VALID","INVALID_JSON","LANGUAGE_MAP_KEY_INVALID","LANGUAGE_MAP_KEY_MUST_BE_STRING","LANGUAGE_MAPS_MUST_NOT_BE_NULL","LANGUAGE_MUST_BE_STRING","LENGTH_MUST_BE_INTEGER","MAX_MUST_BE_GREATER_THAN_MIN","MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS","MUST_BE_BOOLEAN_PRESENT","MUST_BE_BOOLEAN","MUST_BE_IRI_STRING","MUST_BE_NUMBER_PRESENT","MUST_BE_NUMBER","MUST_BE_PRESENT","MUST_BE_STRING","MUST_BE_URI_PRESENT","MUST_BE_URI_STRING","OBJECT_MUST_BE_DEFINED","OBJECT_MUST_BE_NON_NULL_MAP_OBJECT","OBJECT_TYPE_MUST_BE_STATEMENT_REF","OBJECT_TYPE_MUST_BE_VALID_OPTION","RAW_MUST_BE_GREATER_THAN_MIN","RAW_MUST_BE_LESS_THAN_MAX","REGISTRATION_MUST_BE_UUID_STRING","RESULT_MUST_BE_MAP_OBJECT","REVISION_MUST_BE_AGENT_OR_GROUP","SCALED_MUST_BE_BETWEEN_0_1","SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS","SHA2_MUST_CONTAIN_BASE_64_STRING","STATEMENT_ARGUMENT_IS_NOT_VALID","STATEMENT_ARGUMENT_MUST_BE_PROVIDED","STATEMENT_MUST_BE_PARSED_CORRECTLY","STATEMENT_MUST_NOT_BE_NULL","STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS","SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT","UNEXPECTED","VERB_MUST_BE_PROVIDED","VERB_MUST_NOT_BE_NULL","VERSION_MUST_COMPLY_SEMANTIC_VERSIONING","2","xapiGeneral","FIRST_REPORT_VERSTION","GROUP_AUTHORITY_AGENT_MEMBERS","INTERACTION_DEFINITION_TYPE","MAX_SCALED_VALUE","MIN_SCALED_VALUE","NO_INDEX_FOUND","NUMER_OF_SPECIFIED_IFI_PROPERTIES","3","interactionTypes","CHOICE","FILL_IN","LIKERT","LONG_FILL_IN","MATCHING","NUMERIC","OTHER","PERFORMANCE","SEQUENCING","TRUE_FALSE","xapiValidationInteractionTypes","4","properties","ACCOUNT","ACTIVITY","ACTOR","AGENT","ATTACHMENT","ATTACHMENTS","AUTHORITY","CATEGORY","CHOICES","COMPLETION","CONTENT_TYPE","CONTEXT_ACTIVITIES","CONTEXT","CORRECT_RESPONSES_PATTERN","DATE_TIME","DEFINITION","DESCRIPTION","DISPLAY","DURATION","EXTENSIONS","FILE_URL","GROUP","GROUPING","HOME_PAGE","ID","INSTRUCTOR","INTERACTION_COMPONENTS","INTERACTION_TYPE","LANGUAGE_MAP","LANGUAGE","LENGTH","MAX","MBOX_SHA_1_SUM","MBOX","MEMBER","MIN","MORE_INFO","NAME","OBJECT_TYPE","OBJECT","OPEN_ID","PARENT","PLATFORM","RAW","REGISTRATION","RESPONSE","RESULT","REVISION","SCALE","SCALED","SCORE","SHA2","SOURCE","STATEMENT_REF","STATEMENT","STEPS","STORED","SUB_CONTEXT","SUCCESS","TARGET","TEAM","TIMESTAMP","TYPE","USAGE_TYPE","VERB","VERSION","objectTypes","SUB_STATEMENT","xapiValidationIfiPropertyNames","xApiValidObjectTypes","5","xapiValidationRegex","UUID","ISO_8601_DURATION","ISO_8601_DATE_TIME","MAILTO_URI","CONTAINS_WHITESPACE","SEMVER_1_P_0_P_0","BASE_64","IRI","BCP_47","dateFormatRegexPositions","YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MSECOND","ZONE","RELATIVE_TIME","TIME_ZONE_HOUR","TIME_ZONE_MINUTE","6","xapiWhiteListProperties","undefined","_properties","IFI","URI","COMPONENT_ARRAY","ACTIVITY_DEFINITION","../constants/properties","7","xapiValidationUtils","_regex","IS_STRING","IS_ARRAY","IS_BOOLEAN","IS_NUMBER","toString","prototype","isString","obj","isObject","isArray","Array","isBoolean","isNumber","isDefined","isNonNullMapObject","target","isValidLanguageTag","test","addPropToTrace","trace","addendum","addLookupToTrace","key","localTraceToString","isGroup","actorOrGroup","member","objectType","../constants/regex","8","makeV1Report","instance","errors","version","_general","makeV1SingleErrorReport","error","validateAbsenceOfNonWhitelistedProperties","allowedProperties","localErrors","localTrace","propertyName","hasOwnProperty","indexOf","push","_utils","message","_errors","level","validatePropertyIsString","parent","isRequired","violationType","propValue","localViolationType","validatePropertyIsUri","validatePropertyIsUrl","validatePropertyIsBoolean","validatePropertyIsNumber","validateIFIProperties","accountTrace","mbox","account","_whitelists","getIFIs","ifis","filter","name","getIFICount","validateExtensions","extensions","validateLanguageMap","languageMap","propName","mappedValue","validateVerb","verb","display","validateInteractionComponentArray","components","interactionType","allowedInteractionTypes","isAllowedComponentType","ids","perComponentTrace","forEach","interactionComponent","id","description","validateActivityDefintion","definition","correctResponsesPatternTrace","type","_interactionTypes","correctResponsesPattern","response","choices","scale","source","steps","validateActivity","activity","ACTIVITIES_MUST_NOT_BE_NULL","validateStatementRef","statementRef","validateScore","score","scaled","min","raw","max","validateResult","result","duration","validatePropertyIsISO8601String","matched","datetime","exec","dateIncludesZoneInformation","validateVersion","validateAttachmentObject","attachment","sha2","validateAttachments","attachments","validateAgent","agent","ifiCount","validateGroup","group","memberTrace","validateActor","actor","validateAuthority","authority","validateContextActivitySubContext","subContext","validateContextActivities","contextActivities","grouping","category","other","validateContext","context","statementObjectObjectType","registration","revision","platform","PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP","team","language","statement","instructor","validateObject","object","isWithinSubStatement","validateStatement","isSubStatement","whitelistedProperties","makeStatementReport","validateAmbiguousTypeStatement","statementObject","JSON","parse","xapiValidator","default","./constants/errors","./constants/general","./constants/interaction-types","./constants/properties","./constants/regex","./constants/whitelists","./utils/utils"],"mappings":"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","file":"../xapiValidator.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.beepBoop = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o _general.xapiGeneral.MAX_SCALED_VALUE) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCALED),\n message: _errors.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.min !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MIN, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (score.max !== undefined && score.max < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MAX),\n message: _errors.xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.max !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MAX, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw > score.max) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsNumber(score, _properties.properties.RAW, localTrace, localErrors, /*isRequired*/false);\n validateAbsenceOfNonWhitelistedProperties(score, _whitelists.xapiWhiteListProperties.SCORE, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateResult(result, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.RESULT;\n\n if (result === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(result)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace),\n message: _errors.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validateScore(result.score, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCORE), localErrors);\n validatePropertyIsBoolean(result, _properties.properties.SUCCESS, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsBoolean(result, _properties.properties.COMPLETION, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsString(result, _properties.properties.RESPONSE, localTrace, localErrors, /*isRequired*/false);\n validateExtensions(result.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n\n if (result.duration !== undefined && (result.duration === null || !_utils.xapiValidationUtils.isString(result.duration) || !_regex.xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DURATION),\n message: _errors.xapiValidationErrors.DURATION_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(result, _whitelists.xapiWhiteListProperties.RESULT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validatePropertyIsISO8601String(parent, propertyName, trace, errors) {\n var localErrors, localTrace, matched, datetime;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.DATE_TIME;\n datetime = parent[propertyName];\n\n if (datetime === undefined) {\n return localErrors;\n }\n\n if (datetime === null || !_utils.xapiValidationUtils.isString(datetime)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: propertyName + ' ' + _errors.xapiValidationErrors.MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n matched = _regex.xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime);\n\n if (matched) {\n if (!dateIncludesZoneInformation(matched)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n }\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateVersion(version, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.VERSION;\n\n if (version === undefined) {\n return localErrors;\n }\n\n if (version === null || !_utils.xapiValidationUtils.isString(version) || !_regex.xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateAttachmentObject(attachment, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(attachment)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (attachment.display === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.DISPLAY),\n message: _errors.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n validateLanguageMap(attachment.display, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DISPLAY), localErrors);\n }\n\n validateLanguageMap(attachment.description, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DESCRIPTION), localErrors);\n validatePropertyIsUri(attachment, _properties.properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsUri(attachment, _properties.properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n // TODO - more complete validation for Internet Media Type via RFC 2046\n validatePropertyIsString(attachment, _properties.properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (attachment.length === undefined || attachment.length === null || !_utils.xapiValidationUtils.isNumber(attachment.length) || attachment.length % 1 !== 0) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LENGTH),\n message: _errors.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (attachment.sha2 === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (attachment.sha2 === null || !_utils.xapiValidationUtils.isString(attachment.sha2) || !_regex.xapiValidationRegex.BASE_64.test(attachment.sha2)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(attachment, _whitelists.xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors);\n return localErrors;\n}\n\nfunction validateAttachments(attachments, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENTS;\n\n if (attachments === undefined) {\n return localErrors;\n }\n\n if (attachments === null || !_utils.xapiValidationUtils.isArray(attachments)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n attachments.forEach(function (attachment, i) {\n validateAttachmentObject(attachment, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n });\n\n return localErrors;\n}\n\nfunction validateAgent(agent, trace, errors) {\n var localErrors, localTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AGENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(agent)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n ifiCount = getIFICount(agent);\n\n if (ifiCount !== _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (agent.objectType === _properties.objectTypes.GROUP) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(agent, localTrace, localErrors);\n validatePropertyIsString(agent, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n validateAbsenceOfNonWhitelistedProperties(agent, _whitelists.xapiWhiteListProperties.AGENT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateGroup(group, trace, errors) {\n var localErrors, localTrace, memberTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.GROUP;\n memberTrace = _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MEMBER);\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(group)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n ifiCount = getIFICount(group);\n\n if (ifiCount === 0) {\n if (group.member === null || group.member === undefined) {\n localErrors.push({\n trace: memberTrace,\n message: _errors.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else if (ifiCount > _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(group, localTrace, localErrors);\n\n validatePropertyIsString(group, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n if (group.member !== undefined) {\n if (group.member === null || !_utils.xapiValidationUtils.isArray(group.member)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n group.member.forEach(function (member, i) {\n validateAgent(member, _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors);\n });\n }\n }\n\n validateAbsenceOfNonWhitelistedProperties(group, _whitelists.xapiWhiteListProperties.GROUP, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateActor(actor, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ACTOR;\n\n if (actor === null || actor === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (_utils.xapiValidationUtils.isGroup(actor)) {\n validateGroup(actor, localTrace, localErrors);\n } else {\n validateAgent(actor, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAuthority(authority, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AUTHORITY;\n\n if (authority === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(authority)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n if (_utils.xapiValidationUtils.isGroup(authority)) {\n validateGroup(authority, localTrace, localErrors);\n if (!authority.member || !authority.member.length || authority.member.length !== _general.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n validateAgent(authority, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateContextActivitySubContext(subContext, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.SUB_CONTEXT;\n\n if (subContext === undefined) {\n return localErrors;\n }\n\n if (subContext === null) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (_utils.xapiValidationUtils.isArray(subContext)) {\n subContext.forEach(function (activity, i) {\n validateActivity(activity, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n });\n } else if (_utils.xapiValidationUtils.isObject(subContext)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n\n validateActivity(subContext, localTrace, localErrors);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,\n level: _errors.xapiErrorLevels.MUST_VIOLATION });\n }\n return localErrors;\n}\n\nfunction validateContextActivities(contextActivities, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT_ACTIVITIES;\n\n if (contextActivities === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(contextActivities)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n validateContextActivitySubContext(contextActivities.parent, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.PARENT), localErrors);\n validateContextActivitySubContext(contextActivities.grouping, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.GROUPING), localErrors);\n validateContextActivitySubContext(contextActivities.category, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CATEGORY), localErrors);\n validateContextActivitySubContext(contextActivities.other, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OTHER), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(contextActivities, _whitelists.xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateContext(context, trace, errors, statementObjectObjectType) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT;\n\n if (context === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(context)) {\n localErrors.push({\n trace: localTrace,\n message: _errors.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (context.registration !== undefined && (context.registration === null || !_utils.xapiValidationUtils.isString(context.registration) || !_regex.xapiValidationRegex.UUID.test(context.registration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REGISTRATION),\n message: _errors.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if ([_properties.objectTypes.GROUP, _properties.objectTypes.AGENT].indexOf(statementObjectObjectType) !== _general.xapiGeneral.NO_INDEX_FOUND) {\n if (context.revision !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REVISION),\n message: _errors.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.platform !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.PLATFORM),\n message: _errors.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsString(context, _properties.properties.REVISION, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsString(context, _properties.properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (context.team !== undefined) {\n validateGroup(context.team, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.TEAM), localErrors);\n }\n\n if (context.contextActivities !== undefined) {\n validateContextActivities(context.contextActivities, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT_ACTIVITIES), localErrors);\n }\n\n if (context.language !== undefined && !_utils.xapiValidationUtils.isValidLanguageTag(context.language)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LANGUAGE),\n message: _errors.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.statement !== undefined) {\n validateStatementRef(context.statement, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.STATEMENT), localErrors);\n }\n\n if (context.instructor !== undefined) {\n if (_utils.xapiValidationUtils.isGroup(context.instructor)) {\n validateGroup(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n } else {\n validateAgent(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n }\n }\n\n validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n validateAbsenceOfNonWhitelistedProperties(context, _whitelists.xapiWhiteListProperties.EXTENSIONS, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateObject(object, trace, errors, isWithinSubStatement) {\n var localErrors, localTrace, objectType;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.OBJECT;\n\n if (object === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(object)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION);\n\n objectType = object.objectType || _properties.objectTypes.ACTIVITY;\n\n switch (objectType) {\n case _properties.objectTypes.ACTIVITY:\n validateActivity(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.AGENT:\n validateAgent(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.GROUP:\n validateGroup(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.STATEMENT_REF:\n validateStatementRef(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.SUB_STATEMENT:\n if (isWithinSubStatement) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n validateStatement(object, localTrace, localErrors, /*isSubStatement*/true);\n break;\n default:\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(),\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateStatement(statement, trace, errors, isSubStatement) {\n var localErrors, localTrace, statementObjectObjectType, whitelistedProperties;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.STATEMENT;\n\n whitelistedProperties = _whitelists.xapiWhiteListProperties.STATEMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(statement)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!isSubStatement) {\n if (statement.id === null || statement.id === undefined || !_utils.xapiValidationUtils.isString(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n } else if (!_regex.xapiValidationRegex.UUID.test(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.ID_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n whitelistedProperties = _whitelists.xapiWhiteListProperties.SUB_STATEMENT;\n }\n\n validateActor(statement.actor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ACTOR), localErrors);\n validateVerb(statement.verb, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERB), localErrors);\n validateObject(statement.object, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OBJECT), localErrors, isSubStatement);\n validateResult(statement.result, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RESULT), localErrors);\n\n statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : _properties.objectTypes.ACTIVITY;\n\n validateContext(statement.context, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT), localErrors, statementObjectObjectType);\n validatePropertyIsISO8601String(statement, _properties.properties.TIMESTAMP, localTrace, localErrors);\n validatePropertyIsISO8601String(statement, _properties.properties.STORED, localTrace, localErrors);\n\n validateAuthority(statement.authority, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.AUTHORITY), localErrors);\n validateVersion(statement.version, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERSION), localErrors);\n validateAttachments(statement.attachments, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ATTACHMENTS), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction makeStatementReport(statement) {\n var localErrors;\n\n localErrors = [];\n validateStatement(statement, _properties.properties.STATEMENT, localErrors, /*isRequired*/false);\n\n return makeV1Report(statement, localErrors);\n}\n\nfunction validateAmbiguousTypeStatement(statement) {\n var statementObject;\n\n if (statement === undefined) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (statement === null) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (_utils.xapiValidationUtils.isString(statement)) {\n try {\n statementObject = JSON.parse(statement);\n if (statementObject === null || !_utils.xapiValidationUtils.isObject(statementObject) || _utils.xapiValidationUtils.isArray(statementObject)) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } catch (e) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.INVALID_JSON + ': ' + e.message,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return makeStatementReport(statementObject);\n }\n\n if (_utils.xapiValidationUtils.isObject(statement) && !_utils.xapiValidationUtils.isArray(statement)) {\n return makeStatementReport(statement);\n }\n\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n}\n\nfunction dateIncludesZoneInformation(matched) {\n return matched[_regex.dateFormatRegexPositions.ZONE] || matched[_regex.dateFormatRegexPositions.RELATIVE_TIME] && matched[_regex.dateFormatRegexPositions.TIME_ZONE_HOUR];\n}\n\nxapiValidator = {\n validateStatement: validateAmbiguousTypeStatement\n};\n\nexports.default = xapiValidator;\n\nwindow.xapiValidator = xapiValidator; //FIXME\n\n},{\"./constants/errors\":1,\"./constants/general\":2,\"./constants/interaction-types\":3,\"./constants/properties\":4,\"./constants/regex\":5,\"./constants/whitelists\":6,\"./utils/utils\":7}]},{},[8])(8)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY29uc3RhbnRzL2Vycm9ycy5qcyIsInNyYy9jb25zdGFudHMvZ2VuZXJhbC5qcyIsInNyYy9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJzcmMvY29uc3RhbnRzL3Byb3BlcnRpZXMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2NvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3hBUEktdmFsaWRhdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7Ozs7O0FBRUEsSUFBTSxrQkFBa0IsT0FBTyxNQUFQLENBQWM7QUFDcEMsaUJBQWtCLGVBRGtCO0FBRXBDLGtCQUFrQixnQkFGa0I7QUFHcEMsb0JBQWtCO0FBSGtCLENBQWQsQ0FBeEI7O0FBTUEsSUFBTSx1QkFBdUIsT0FBTyxNQUFQLENBQWM7QUFDekMsMkNBQWtELHlDQURUO0FBRXpDLDBCQUFrRCx5QkFGVDtBQUd6QywwQ0FBa0Qsc0ZBSFQ7QUFJekMscUNBQWtELHVDQUpUO0FBS3pDLDZDQUFrRCw0RUFMVDtBQU16QyxzQ0FBa0QseUNBTlQ7QUFPekMsNENBQWtELHNEQVBUO0FBUXpDLHlDQUFrRCxxRUFSVDtBQVN6QyxvREFBa0Qsc0dBVFQ7QUFVekMsa0RBQWtELGlFQVZUO0FBV3pDLHVDQUFrRCx3REFYVDtBQVl6Qyx5Q0FBa0QscUhBWlQ7QUFhekMsc0NBQWtELG1FQWJUO0FBY3pDLDJDQUFrRCw4RUFkVDtBQWV6Qyw2Q0FBa0Qsa0RBZlQ7QUFnQnpDLHNCQUFrRCw0RUFoQlQ7QUFpQnpDLHdDQUFrRCxtRkFqQlQ7QUFrQnpDLCtCQUFrRCxrREFsQlQ7QUFtQnpDLDhCQUFrRCx3Q0FuQlQ7QUFvQnpDLDBCQUFrRCx3RUFwQlQ7QUFxQnpDLCtCQUFrRCxvRUFyQlQ7QUFzQnpDLDZDQUFrRCxzSUF0QlQ7QUF1QnpDLDBDQUFrRCxxRkF2QlQ7QUF3QnpDLDhCQUFrRCw2REF4QlQ7QUF5QnpDLHFDQUFrRCx1Q0F6QlQ7QUEwQnpDLHFCQUFrRCx3RUExQlQ7QUEyQnpDLDZCQUFrRCxrRkEzQlQ7QUE0QnpDLG9CQUFrRCx5QkE1QlQ7QUE2QnpDLHFDQUFrRCx5RUE3QlQ7QUE4QnpDLGtDQUFrRCxvRkE5QlQ7QUErQnpDLHdCQUFrRCxxRkEvQlQ7QUFnQ3pDLGlDQUFrRCw2RkFoQ1Q7QUFpQ3pDLG9DQUFrRCxpRUFqQ1Q7QUFrQ3pDLDBDQUFrRCw0RUFsQ1Q7QUFtQ3pDLHlDQUFrRCxvRUFuQ1Q7QUFvQ3pDLGdDQUFrRCxnRkFwQ1Q7QUFxQ3pDLGtDQUFrRCx3R0FyQ1Q7QUFzQ3pDLGdCQUFrRCxrREF0Q1Q7QUF1Q3pDLDRCQUFrRCw0Q0F2Q1Q7QUF3Q3pDLG1DQUFrRCx5REF4Q1Q7QUF5Q3pDLGtDQUFrRCwyREF6Q1Q7QUEwQ3pDLDJCQUFrRCxxRkExQ1Q7QUEyQ3pDLDBCQUFrRCwwREEzQ1Q7QUE0Q3pDLGdDQUFrRCx3RkE1Q1Q7QUE2Q3pDLGdEQUFrRCwwREE3Q1Q7QUE4Q3pDLDJCQUFrRCx1REE5Q1Q7QUErQ3pDLG1CQUFrRCwwQ0EvQ1Q7QUFnRHpDLHNCQUFrRCx1RUFoRFQ7QUFpRHpDLDBCQUFrRCxzREFqRFQ7QUFrRHpDLGtCQUFrRCx5Q0FsRFQ7QUFtRHpDLG1CQUFrRCxzREFuRFQ7QUFvRHpDLGtCQUFrRCx5Q0FwRFQ7QUFxRHpDLHVCQUFrRCwwREFyRFQ7QUFzRHpDLHNCQUFrRCw2Q0F0RFQ7QUF1RHpDLDBCQUFrRCxxQ0F2RFQ7QUF3RHpDLHNDQUFrRCxrREF4RFQ7QUF5RHpDLHFDQUFrRCxxRkF6RFQ7QUEwRHpDLG9DQUFrRCxxREExRFQ7QUEyRHpDLGdDQUFrRCx3RkEzRFQ7QUE0RHpDLDZCQUFrRCxxRkE1RFQ7QUE2RHpDLG9DQUFrRCw4REE3RFQ7QUE4RHpDLDZCQUFrRCw2Q0E5RFQ7QUErRHpDLG1DQUFrRCx5RkEvRFQ7QUFnRXpDLDhCQUFrRCwrREFoRVQ7QUFpRXpDLCtDQUFrRCx3REFqRVQ7QUFrRXpDLG9DQUFrRCw0REFsRVQ7QUFtRXpDLG1DQUFrRCw0RUFuRVQ7QUFvRXpDLHVDQUFrRCxpQ0FwRVQ7QUFxRXpDLHNDQUFrRCx3RUFyRVQ7QUFzRXpDLDhCQUFrRCxtQ0F0RVQ7QUF1RXpDLDhDQUFrRCxxREF2RVQ7QUF3RXpDLGdEQUFrRCxnREF4RVQ7QUF5RXpDLGNBQWtELG1DQXpFVDtBQTBFekMseUJBQWtELHVCQTFFVDtBQTJFekMseUJBQWtELGlEQTNFVDtBQTRFekMsMkNBQWtEO0FBNUVULENBQWQsQ0FBN0I7O1FBK0VRLGUsR0FBQSxlO1FBQ0Esb0IsR0FBQSxvQjs7O0FDeEZSOzs7OztBQUVBLElBQU0sY0FBYyxPQUFPLE1BQVAsQ0FBYztBQUNoQyx5QkFBb0MsT0FESjtBQUVoQyxpQ0FBb0MsQ0FGSjtBQUdoQywrQkFBb0MscURBSEo7QUFJaEMsb0JBQW9DLENBSko7QUFLaEMsb0JBQW9DLENBTEo7QUFNaEMsa0JBQW9DLENBQUMsQ0FOTDtBQU9oQyxxQ0FBb0M7QUFQSixDQUFkLENBQXBCOztRQVVRLFcsR0FBQSxXOzs7QUNaUjs7Ozs7QUFFTyxJQUFNLDhDQUFtQixPQUFPLE1BQVAsQ0FBYztBQUM1QyxVQUFjLFFBRDhCO0FBRTVDLFdBQWMsU0FGOEI7QUFHNUMsVUFBYyxRQUg4QjtBQUk1QyxnQkFBYyxjQUo4QjtBQUs1QyxZQUFjLFVBTDhCO0FBTTVDLFdBQWMsU0FOOEI7QUFPNUMsU0FBYyxPQVA4QjtBQVE1QyxlQUFjLGFBUjhCO0FBUzVDLGNBQWMsWUFUOEI7QUFVNUMsY0FBYztBQVY4QixDQUFkLENBQXpCOztBQWFBLElBQU0sMEVBQWlDLE9BQU8sTUFBUCxDQUFjLENBQzFELGlCQUFpQixNQUR5QyxFQUUxRCxpQkFBaUIsT0FGeUMsRUFHMUQsaUJBQWlCLE1BSHlDLEVBSTFELGlCQUFpQixZQUp5QyxFQUsxRCxpQkFBaUIsUUFMeUMsRUFNMUQsaUJBQWlCLE9BTnlDLEVBTzFELGlCQUFpQixLQVB5QyxFQVExRCxpQkFBaUIsV0FSeUMsRUFTMUQsaUJBQWlCLFVBVHlDLEVBVTFELGlCQUFpQixVQVZ5QyxDQUFkLENBQXZDOzs7QUNmUDs7Ozs7QUFFQSxJQUFNLGFBQWEsT0FBTyxNQUFQLENBQWM7QUFDL0IsV0FBMkIsU0FESTtBQUUvQixZQUEyQixVQUZJO0FBRy9CLFNBQTJCLE9BSEk7QUFJL0IsU0FBMkIsT0FKSTtBQUsvQixjQUEyQixZQUxJO0FBTS9CLGVBQTJCLGFBTkk7QUFPL0IsYUFBMkIsV0FQSTtBQVEvQixZQUEyQixVQVJJO0FBUy9CLFVBQTJCLFFBVEk7QUFVL0IsV0FBMkIsU0FWSTtBQVcvQixjQUEyQixZQVhJO0FBWS9CLGdCQUEyQixhQVpJO0FBYS9CLHNCQUEyQixtQkFiSTtBQWMvQixXQUEyQixTQWRJO0FBZS9CLDZCQUEyQix5QkFmSTtBQWdCL0IsYUFBMkIsVUFoQkk7QUFpQi9CLGNBQTJCLFlBakJJO0FBa0IvQixlQUEyQixhQWxCSTtBQW1CL0IsV0FBMkIsU0FuQkk7QUFvQi9CLFlBQTJCLFVBcEJJO0FBcUIvQixjQUEyQixZQXJCSTtBQXNCL0IsWUFBMkIsU0F0Qkk7QUF1Qi9CLFNBQTJCLE9BdkJJO0FBd0IvQixZQUEyQixVQXhCSTtBQXlCL0IsYUFBMkIsVUF6Qkk7QUEwQi9CLE1BQTJCLElBMUJJO0FBMkIvQixjQUEyQixZQTNCSTtBQTRCL0IsMEJBQTJCLHVCQTVCSTtBQTZCL0Isb0JBQTJCLGlCQTdCSTtBQThCL0IsZ0JBQTJCLGFBOUJJO0FBK0IvQixZQUEyQixVQS9CSTtBQWdDL0IsVUFBMkIsUUFoQ0k7QUFpQy9CLFVBQTJCLFFBakNJO0FBa0MvQixZQUEyQixVQWxDSTtBQW1DL0IsT0FBMkIsS0FuQ0k7QUFvQy9CLGtCQUEyQixjQXBDSTtBQXFDL0IsUUFBMkIsTUFyQ0k7QUFzQy9CLFVBQTJCLFFBdENJO0FBdUMvQixPQUEyQixLQXZDSTtBQXdDL0IsYUFBMkIsVUF4Q0k7QUF5Qy9CLFFBQTJCLE1BekNJO0FBMEMvQixlQUEyQixZQTFDSTtBQTJDL0IsVUFBMkIsUUEzQ0k7QUE0Qy9CLFdBQTJCLFFBNUNJO0FBNkMvQixTQUEyQixPQTdDSTtBQThDL0IsVUFBMkIsUUE5Q0k7QUErQy9CLGVBQTJCLGFBL0NJO0FBZ0QvQixZQUEyQixVQWhESTtBQWlEL0IsT0FBMkIsS0FqREk7QUFrRC9CLGdCQUEyQixjQWxESTtBQW1EL0IsWUFBMkIsVUFuREk7QUFvRC9CLFVBQTJCLFFBcERJO0FBcUQvQixZQUEyQixVQXJESTtBQXNEL0IsU0FBMkIsT0F0REk7QUF1RC9CLFVBQTJCLFFBdkRJO0FBd0QvQixTQUEyQixPQXhESTtBQXlEL0IsY0FBMkIsWUF6REk7QUEwRC9CLFFBQTJCLE1BMURJO0FBMkQvQixVQUEyQixRQTNESTtBQTREL0IsaUJBQTJCLGNBNURJO0FBNkQvQixhQUEyQixXQTdESTtBQThEL0IsU0FBMkIsT0E5REk7QUErRC9CLFVBQTJCLFFBL0RJO0FBZ0UvQixlQUEyQixZQWhFSTtBQWlFL0IsV0FBMkIsU0FqRUk7QUFrRS9CLFVBQTJCLFFBbEVJO0FBbUUvQixRQUEyQixNQW5FSTtBQW9FL0IsYUFBMkIsV0FwRUk7QUFxRS9CLFFBQTJCLE1BckVJO0FBc0UvQixjQUEyQixXQXRFSTtBQXVFL0IsUUFBMkIsTUF2RUk7QUF3RS9CLFdBQTJCO0FBeEVJLENBQWQsQ0FBbkI7O0FBMkVBLElBQU0sY0FBYyxPQUFPLE1BQVAsQ0FBYztBQUNoQyxTQUFlLE9BRGlCO0FBRWhDLFNBQWUsT0FGaUI7QUFHaEMsWUFBZSxVQUhpQjtBQUloQyxpQkFBZSxjQUppQjtBQUtoQyxpQkFBZTtBQUxpQixDQUFkLENBQXBCOztBQVFBLElBQU0saUNBQWlDLE9BQU8sTUFBUCxDQUFjLENBQ25ELFdBQVcsT0FEd0MsRUFFbkQsV0FBVyxjQUZ3QyxFQUduRCxXQUFXLElBSHdDLEVBSW5ELFdBQVcsT0FKd0MsQ0FBZCxDQUF2Qzs7QUFPQSxJQUFNLHVCQUF1QixPQUFPLE1BQVAsQ0FBYyxDQUN6QyxZQUFZLEtBRDZCLEVBRXpDLFlBQVksS0FGNkIsRUFHekMsWUFBWSxRQUg2QixFQUl6QyxZQUFZLGFBSjZCLEVBS3pDLFlBQVksYUFMNkIsQ0FBZCxDQUE3Qjs7UUFRUSxVLEdBQUEsVTtRQUNBLFcsR0FBQSxXO1FBQ0EsOEIsR0FBQSw4QjtRQUNBLG9CLEdBQUEsb0I7OztBQ3ZHUjs7Ozs7QUFFQSxJQUFNLHNCQUFzQixPQUFPLE1BQVAsQ0FBYztBQUN4QyxRQUFxQixpRUFEbUI7QUFFeEMscUJBQXFCLDBJQUZtQjtBQUd4QyxzQkFBcUIsb0lBSG1CO0FBSXhDLGNBQXFCLFVBSm1CO0FBS3hDLHVCQUFxQixLQUxtQjtBQU14QyxvQkFBcUIsOENBTm1CO0FBT3hDLFdBQXFCLDBGQVBtQjtBQVF4QyxPQUFxQixzdUpBUm1CO0FBU3hDLFVBQXFCO0FBVG1CLENBQWQsQ0FBNUI7O0FBWUEsSUFBTSwyQkFBMkIsT0FBTyxNQUFQLENBQWM7QUFDN0MsUUFBa0IsQ0FEMkI7QUFFN0MsU0FBa0IsQ0FGMkI7QUFHN0MsT0FBa0IsQ0FIMkI7QUFJN0MsUUFBa0IsQ0FKMkI7QUFLN0MsVUFBa0IsQ0FMMkI7QUFNN0MsVUFBa0IsQ0FOMkI7QUFPN0MsV0FBa0IsQ0FQMkI7QUFRN0MsUUFBa0IsQ0FSMkI7QUFTN0MsaUJBQWtCLENBVDJCO0FBVTdDLGtCQUFrQixFQVYyQjtBQVc3QyxvQkFBa0I7QUFYMkIsQ0FBZCxDQUFqQzs7UUFjUSxtQixHQUFBLG1CO1FBQ0Esd0IsR0FBQSx3Qjs7O0FDN0JQOzs7Ozs7O0FBQ0E7O0FBRUEsSUFBTSwwQkFBMEIsT0FBTyxNQUFQLENBQWM7QUFDNUMsT0FBSyxDQUNILHVCQUFXLFNBRFIsRUFFSCx1QkFBVyxJQUZSLENBRHVDO0FBSzVDLE9BQUssQ0FDSCx1QkFBVyxFQURSLEVBRUgsdUJBQVcsT0FGUixDQUx1QztBQVM1QyxtQkFBaUIsQ0FDZix1QkFBVyxFQURJLEVBRWYsdUJBQVcsV0FGSSxDQVQyQjtBQWE1Qyx1QkFBcUIsQ0FDbkIsdUJBQVcsSUFEUSxFQUVuQix1QkFBVyxXQUZRLEVBR25CLHVCQUFXLElBSFEsRUFJbkIsdUJBQVcsU0FKUSxFQUtuQix1QkFBVyxVQUxRLEVBTW5CLHVCQUFXLGdCQU5RLEVBT25CLHVCQUFXLHlCQVBRLEVBUW5CLHVCQUFXLE9BUlEsRUFTbkIsdUJBQVcsS0FUUSxFQVVuQix1QkFBVyxNQVZRLEVBV25CLHVCQUFXLE1BWFEsRUFZbkIsdUJBQVcsS0FaUSxDQWJ1QjtBQTJCNUMsWUFBVSxDQUNSLHVCQUFXLFdBREgsRUFFUix1QkFBVyxFQUZILEVBR1IsdUJBQVcsVUFISCxDQTNCa0M7QUFnQzVDLGlCQUFlLENBQ2IsdUJBQVcsRUFERSxFQUViLHVCQUFXLFdBRkUsQ0FoQzZCO0FBb0M1QyxTQUFPLENBQ0wsdUJBQVcsTUFETixFQUVMLHVCQUFXLEdBRk4sRUFHTCx1QkFBVyxHQUhOLEVBSUwsdUJBQVcsR0FKTixDQXBDcUM7QUEwQzVDLFVBQVEsQ0FDTix1QkFBVyxLQURMLEVBRU4sdUJBQVcsT0FGTCxFQUdOLHVCQUFXLFVBSEwsRUFJTix1QkFBVyxRQUpMLEVBS04sdUJBQVcsUUFMTCxFQU1OLHVCQUFXLFVBTkwsQ0ExQ29DO0FBa0Q1QyxjQUFZLENBQ1YsdUJBQVcsVUFERCxFQUVWLHVCQUFXLE9BRkQsRUFHVix1QkFBVyxXQUhELEVBSVYsdUJBQVcsWUFKRCxFQUtWLHVCQUFXLE1BTEQsRUFNVix1QkFBVyxJQU5ELEVBT1YsdUJBQVcsUUFQRCxDQWxEZ0M7QUEyRDdDLFNBQU8sQ0FDTCx1QkFBVyxXQUROLEVBRUwsdUJBQVcsSUFGTixFQUdMLHVCQUFXLE9BSE4sRUFJTCx1QkFBVyxjQUpOLEVBS0wsdUJBQVcsSUFMTixFQU1MLHVCQUFXLE9BTk4sQ0EzRHNDO0FBbUU3QyxTQUFPLENBQ0wsdUJBQVcsV0FETixFQUVMLHVCQUFXLElBRk4sRUFHTCx1QkFBVyxNQUhOLEVBSUwsdUJBQVcsT0FKTixFQUtMLHVCQUFXLGNBTE4sRUFNTCx1QkFBVyxJQU5OLEVBT0wsdUJBQVcsT0FQTixDQW5Fc0M7QUE0RTdDLHNCQUFvQixDQUNsQix1QkFBVyxNQURPLEVBRWxCLHVCQUFXLFFBRk8sRUFHbEIsdUJBQVcsUUFITyxFQUlsQix1QkFBVyxLQUpPLENBNUV5QjtBQWtGN0MsYUFBVyxDQUNULHVCQUFXLEVBREYsRUFFVCx1QkFBVyxLQUZGLEVBR1QsdUJBQVcsSUFIRixFQUlULHVCQUFXLE1BSkYsRUFLVCx1QkFBVyxNQUxGLEVBTVQsdUJBQVcsT0FORixFQU9ULHVCQUFXLFNBUEYsRUFRVCx1QkFBVyxNQVJGLEVBU1QsdUJBQVcsU0FURixFQVVULHVCQUFXLE9BVkYsRUFXVCx1QkFBVyxXQVhGLENBbEZrQztBQStGN0MsaUJBQWUsQ0FDYix1QkFBVyxLQURFLEVBRWIsdUJBQVcsSUFGRSxFQUdiLHVCQUFXLE1BSEUsRUFJYix1QkFBVyxNQUpFLEVBS2IsdUJBQVcsT0FMRSxFQU1iLHVCQUFXLFNBTkUsRUFPYix1QkFBVyxXQVBFLEVBUWIsdUJBQVcsV0FSRSxDQS9GOEI7QUF5RzdDLGNBQVksQ0FDVix1QkFBVyxZQURELEVBRVYsdUJBQVcsVUFGRCxFQUdWLHVCQUFXLElBSEQsRUFJVix1QkFBVyxrQkFKRCxFQUtWLHVCQUFXLFFBTEQsRUFNVix1QkFBVyxRQU5ELEVBT1YsdUJBQVcsUUFQRCxFQVFWLHVCQUFXLFNBUkQsRUFTVix1QkFBVyxVQVREO0FBekdpQyxDQUFkLENBQWhDOztRQXNIUSx1QixHQUFBLHVCOzs7QUN6SFQ7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFFQSxJQUNFLFlBQWEsaUJBRGY7QUFBQSxJQUVFLFdBQWEsZ0JBRmY7QUFBQSxJQUdFLGFBQWEsa0JBSGY7QUFBQSxJQUlFLFlBQWEsaUJBSmY7O0FBTUEsSUFBSSxXQUFXLE9BQU8sU0FBUCxDQUFpQixRQUFoQztBQUNBLElBQUksbUJBQUo7O0FBRUEsUUFtRFEsbUJBbkRSLHlCQUFzQjtBQUNwQixVQURvQixvQkFDWCxHQURXLEVBQ047QUFDWixXQUFPLFNBQVMsSUFBVCxDQUFjLEdBQWQsTUFBdUIsU0FBOUI7QUFDRCxHQUhtQjtBQUtwQixVQUxvQixvQkFLWCxHQUxXLEVBS047QUFDWixXQUFPLFFBQVEsT0FBTyxHQUFQLENBQWY7QUFDRCxHQVBtQjs7O0FBU3BCLFdBQVMsTUFBTSxPQUFOLElBQWlCLFVBQVMsR0FBVCxFQUFjO0FBQ3RDLFdBQU8sU0FBUyxJQUFULENBQWMsR0FBZCxNQUF1QixRQUE5QjtBQUNELEdBWG1COztBQWFwQixXQWJvQixxQkFhVixHQWJVLEVBYUw7QUFDYixXQUFPLFFBQVEsSUFBUixJQUFnQixRQUFRLEtBQXhCLElBQWlDLFNBQVMsSUFBVCxDQUFjLEdBQWQsTUFBdUIsVUFBL0Q7QUFDRCxHQWZtQjtBQWlCcEIsVUFqQm9CLG9CQWlCWCxHQWpCVyxFQWlCTjtBQUNaLFdBQU8sU0FBUyxJQUFULENBQWMsR0FBZCxNQUF1QixTQUE5QjtBQUNELEdBbkJtQjtBQXFCcEIsV0FyQm9CLHFCQXFCVixHQXJCVSxFQXFCTDtBQUNiLFdBQVEsUUFBUSxJQUFSLElBQWdCLFFBQVEsU0FBaEM7QUFDRCxHQXZCbUI7QUF5QnBCLG9CQXpCb0IsOEJBeUJELE1BekJDLEVBeUJPO0FBQ3ZCLFdBQU8sS0FBSyxTQUFMLENBQWUsTUFBZixLQUEwQixLQUFLLFFBQUwsQ0FBYyxNQUFkLENBQTFCLElBQW1ELENBQUMsS0FBSyxPQUFMLENBQWEsTUFBYixDQUEzRDtBQUNILEdBM0JtQjtBQTZCcEIsb0JBN0JvQiw4QkE2QkQsTUE3QkMsRUE2Qk87QUFDekI7QUFDQSxXQUFPLEtBQUssU0FBTCxDQUFlLE1BQWYsS0FBMEIsS0FBSyxRQUFMLENBQWMsTUFBZCxDQUExQixJQUFtRCwyQkFBb0IsTUFBcEIsQ0FBMkIsSUFBM0IsQ0FBZ0MsTUFBaEMsQ0FBMUQ7QUFDRCxHQWhDbUI7QUFrQ3BCLGdCQWxDb0IsMEJBa0NMLEtBbENLLEVBa0NFLFFBbENGLEVBa0NZO0FBQzlCLFdBQU8sS0FBSyxTQUFMLENBQWUsUUFBZixJQUE4QixLQUE5QixTQUF1QyxRQUF2QyxHQUFvRCxLQUEzRDtBQUNELEdBcENtQjtBQXNDcEIsa0JBdENvQiw0QkFzQ0gsS0F0Q0csRUFzQ0ksR0F0Q0osRUFzQ1M7QUFDM0IsV0FBUSxDQUFDLEtBQUssU0FBTCxDQUFlLEdBQWYsQ0FBRixHQUF5QixLQUF6QixHQUFrQyxLQUFLLFFBQUwsQ0FBYyxHQUFkLElBQXdCLEtBQXhCLFNBQWlDLEdBQWpDLFNBQTZDLEtBQTdDLFVBQXVELEdBQXZELE9BQXpDO0FBQ0QsR0F4Q21CO0FBMENwQixvQkExQ29CLDhCQTBDRCxLQTFDQyxFQTBDTSxRQTFDTixFQTBDZ0I7QUFDbEMsV0FBTyxLQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsUUFBM0IsQ0FBUDtBQUNELEdBNUNtQjtBQThDcEIsU0E5Q29CLG1CQThDWixZQTlDWSxFQThDRTtBQUNwQixXQUFRLGFBQWEsTUFBYixLQUF3QixJQUF4QixJQUFnQyxhQUFhLE1BQWIsS0FBd0IsU0FBekQsSUFBdUUsYUFBYSxVQUFiLEtBQTRCLHdCQUFZLEtBQXRIO0FBQ0Q7QUFoRG1CLENBQXRCOztRQW1EUSxtQixHQUFBLG1COzs7QUNqRVI7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLElBQUksYUFBSjs7QUFFQSxTQUFTLFlBQVQsQ0FBc0IsUUFBdEIsRUFBZ0MsTUFBaEMsRUFBd0M7QUFDdEMsTUFBSSxPQUFKOztBQUVBLGFBQVcsWUFBWSxJQUF2QjtBQUNBLFdBQVcsVUFBWSxJQUF2QjtBQUNBLFlBQVcscUJBQVkscUJBQXZCO0FBQ0EsU0FBTyxFQUFDLGtCQUFELEVBQVcsY0FBWCxFQUFtQixnQkFBbkIsRUFBUDtBQUNEOztBQUVELFNBQVMsdUJBQVQsQ0FBaUMsUUFBakMsRUFBMkMsS0FBM0MsRUFBa0Q7QUFDaEQsU0FBTyxhQUFhLFFBQWIsRUFBdUIsVUFBVSxJQUFWLElBQWtCLFVBQVUsU0FBNUIsR0FBd0MsRUFBeEMsR0FBNkMsQ0FBQyxLQUFELENBQXBFLENBQVA7QUFDRDs7QUFFRCxTQUFTLHlDQUFULENBQW1ELE1BQW5ELEVBQTJELGlCQUEzRCxFQUE4RSxLQUE5RSxFQUFxRixNQUFyRixFQUE2RjtBQUMzRixNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsWUFBN0I7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSxFQUF4Qjs7QUFFQSxPQUFLLFlBQUwsSUFBcUIsTUFBckIsRUFBNkI7QUFDM0IsUUFBSSxPQUFPLGNBQVAsQ0FBc0IsWUFBdEIsS0FBdUMsa0JBQWtCLE9BQWxCLENBQTBCLFlBQTFCLE1BQTRDLHFCQUFZLGNBQW5HLEVBQW1IO0FBQ2pILGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyxZQUEvQyxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLFVBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRjs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHdCQUFULENBQWtDLE1BQWxDLEVBQTBDLFlBQTFDLEVBQXdELEtBQXhELEVBQStELE1BQS9ELEVBQXVFLFVBQXZFLEVBQW1GLGFBQW5GLEVBQWtHO0FBQ2hHLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixTQUE3QixFQUF3QyxrQkFBeEM7O0FBRUEsZ0JBQXFCLFVBQVUsRUFBL0I7QUFDQSxlQUFxQixTQUFVLEVBQS9CO0FBQ0EsY0FBcUIsT0FBTyxZQUFQLENBQXJCLEVBQ0EscUJBQXFCLGlCQUFpQix3QkFBZ0IsY0FEdEQ7O0FBR0EsTUFBSSxjQUFjLFNBQWxCLEVBQTZCO0FBQzNCLFFBQUksY0FBYyxJQUFkLElBQXNCLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFNBQTdCLENBQTNCLEVBQW9FO0FBQ2xFLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsWUFBbkQsQ0FETTtBQUVmLGlCQUFZLFlBQVosU0FBNEIsNkJBQXFCLGNBRmxDO0FBR2YsZUFBUztBQUhNLE9BQWpCO0FBS0Q7QUFDRixHQVJELE1BUU8sSUFBSSxVQUFKLEVBQWdCO0FBQ3JCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsWUFBbkQsQ0FETTtBQUVmLGVBQVksWUFBWixTQUE0Qiw2QkFBcUIsZUFGbEM7QUFHZixhQUFTO0FBSE0sS0FBakI7QUFLRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHFCQUFULENBQStCLE1BQS9CLEVBQXVDLFlBQXZDLEVBQXFELEtBQXJELEVBQTRELE1BQTVELEVBQW9FLFVBQXBFLEVBQWdGO0FBQzlFLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixTQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLEVBQXhCO0FBQ0EsY0FBYyxPQUFPLFlBQVAsQ0FBZDs7QUFFQSxNQUFJLGNBQWMsU0FBbEIsRUFBNkI7QUFDM0IsUUFBSSxjQUFjLElBQWQsSUFBc0IsQ0FBQywyQkFBb0IsUUFBcEIsQ0FBNkIsU0FBN0IsQ0FBM0IsRUFBb0U7QUFDbEUsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCxZQUFuRCxDQURNO0FBRWYsaUJBQVksWUFBWixTQUE0Qiw2QkFBcUIsa0JBRmxDO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtELEtBTkQsTUFNTyxJQUFJLENBQUMsMkJBQW9CLEdBQXBCLENBQXdCLElBQXhCLENBQTZCLFNBQTdCLENBQUwsRUFBOEM7QUFDbkQsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVEsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCxZQUFuRCxDQURPO0FBRWYsaUJBQVksWUFBWixTQUE0Qiw2QkFBcUIsa0JBRmxDO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0YsR0FkRCxNQWNPLElBQUksVUFBSixFQUFnQjtBQUNyQixnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFZLFlBQVosU0FBNEIsNkJBQXFCLG1CQUZsQztBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDtBQUNELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMscUJBQVQsQ0FBK0IsTUFBL0IsRUFBdUMsWUFBdkMsRUFBcUQsS0FBckQsRUFBNEQsTUFBNUQsRUFBb0UsVUFBcEUsRUFBZ0Y7QUFDOUU7QUFDQSxTQUFPLHlCQUF5QixNQUF6QixFQUFpQyxZQUFqQyxFQUErQyxLQUEvQyxFQUFzRCxNQUF0RCxFQUE4RCxVQUE5RCxDQUFQO0FBQ0Q7O0FBRUQsU0FBUyx5QkFBVCxDQUFtQyxNQUFuQyxFQUEyQyxZQUEzQyxFQUF5RCxLQUF6RCxFQUFnRSxNQUFoRSxFQUF3RSxVQUF4RSxFQUFvRjtBQUNsRixNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsU0FBN0I7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSxFQUF4QjtBQUNBLGNBQWMsT0FBTyxZQUFQLENBQWQ7O0FBRUEsTUFBSSxjQUFjLFNBQWxCLEVBQTZCO0FBQzNCLFFBQUksY0FBYyxJQUFkLElBQXNCLENBQUMsMkJBQW9CLFNBQXBCLENBQThCLFNBQTlCLENBQTNCLEVBQXFFO0FBQ25FLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsWUFBbkQsQ0FETTtBQUVmLGlCQUFZLFlBQVosU0FBNEIsNkJBQXFCLGVBRmxDO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0YsR0FSRCxNQVFPLElBQUksVUFBSixFQUFnQjtBQUNyQixnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFZLFlBQVosU0FBNEIsNkJBQXFCLHVCQUZsQztBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDtBQUNELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsd0JBQVQsQ0FBa0MsTUFBbEMsRUFBMEMsWUFBMUMsRUFBd0QsS0FBeEQsRUFBK0QsTUFBL0QsRUFBdUUsVUFBdkUsRUFBbUY7QUFDakYsTUFBSSxXQUFKLEVBQWlCLFVBQWpCLEVBQTZCLFNBQTdCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsRUFBeEI7QUFDQSxjQUFjLE9BQU8sWUFBUCxDQUFkOztBQUVFLE1BQUksY0FBYyxTQUFsQixFQUE2QjtBQUMzQixRQUFJLGNBQWMsSUFBZCxJQUFzQixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixTQUE3QixDQUEzQixFQUFvRTtBQUNsRSxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixpQkFBWSxZQUFaLFNBQTRCLDZCQUFxQixjQUZsQztBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGLEdBUkQsTUFRTyxJQUFJLFVBQUosRUFBZ0I7QUFDckIsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCxZQUFuRCxDQURNO0FBRWYsZUFBWSxZQUFaLFNBQTRCLDZCQUFxQixzQkFGbEM7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7QUFDRCxTQUFPLFdBQVA7QUFDSDs7QUFFRCxTQUFTLHFCQUFULENBQStCLE1BQS9CLEVBQXVDLEtBQXZDLEVBQThDLE1BQTlDLEVBQXNEO0FBQ3BELE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixZQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLEVBQXhCOztBQUVBLE1BQUksT0FBTyxJQUFQLEtBQWdCLFNBQWhCLElBQTZCLE9BQU8sSUFBUCxLQUFnQixJQUFqRCxFQUF1RDtBQUNyRCxRQUFJLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLE9BQU8sSUFBcEMsQ0FBTCxFQUFnRDtBQUM5QyxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBTywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLElBQTlELENBRFE7QUFFZixpQkFBUyw2QkFBcUIsb0JBRmY7QUFHZixlQUFPLHdCQUFnQjtBQUhSLE9BQWpCO0FBS0QsS0FORCxNQU1PLElBQUksQ0FBQywyQkFBb0IsVUFBcEIsQ0FBK0IsSUFBL0IsQ0FBb0MsT0FBTyxJQUEzQyxDQUFMLEVBQXVEO0FBQzVELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsSUFBOUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQiw2QkFGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGOztBQUVELDJCQUF5QixNQUF6QixFQUFpQyx1QkFBVyxjQUE1QyxFQUE0RCxVQUE1RCxFQUF3RSxXQUF4RSxFQUFzRixjQUFjLEtBQXBHO0FBQ0Esd0JBQXNCLE1BQXRCLEVBQThCLHVCQUFXLE9BQXpDLEVBQWtELFVBQWxELEVBQThELFdBQTlELEVBQTJFLGNBQWMsS0FBekY7O0FBRUEsTUFBSSxPQUFPLE9BQVAsS0FBbUIsU0FBbkIsSUFBZ0MsT0FBTyxPQUFQLEtBQW1CLElBQXZELEVBQTZEO0FBQzNELG1CQUFlLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxPQUExRCxDQUFmO0FBQ0EsMEJBQXNCLE9BQU8sT0FBN0IsRUFBc0MsdUJBQVcsU0FBakQsRUFBMkQsWUFBM0QsRUFBeUUsV0FBekUsRUFBc0YsY0FBYyxJQUFwRztBQUNBLDZCQUF5QixPQUFPLE9BQWhDLEVBQXlDLHVCQUFXLElBQXBELEVBQTBELFlBQTFELEVBQXdFLFdBQXhFLEVBQXFGLGNBQWMsSUFBbkc7QUFDQSw4Q0FBMEMsT0FBTyxPQUFqRCxFQUEwRCxvQ0FBd0IsR0FBbEYsRUFBdUYsWUFBdkYsRUFBcUcsV0FBckc7QUFDRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLE9BQVQsQ0FBaUIsTUFBakIsRUFBeUI7QUFDdkIsTUFBSSxJQUFKOztBQUVBLE1BQUksV0FBVyxJQUFYLElBQW1CLFdBQVcsU0FBbEMsRUFBNkM7QUFBQyxXQUFPLEVBQVA7QUFBVzs7QUFFekQsU0FBTywyQ0FBK0IsTUFBL0IsQ0FBc0MsVUFBQyxJQUFELEVBQVU7QUFDckQsUUFBSSxPQUFPLElBQVAsTUFBaUIsU0FBakIsSUFBOEIsT0FBTyxJQUFQLE1BQWlCLElBQW5ELEVBQXlEO0FBQ3ZELGFBQU8sRUFBQyxLQUFLLElBQU4sRUFBWSxPQUFPLE9BQU8sSUFBUCxDQUFuQixFQUFQO0FBQ0Q7QUFDRixHQUpNLENBQVA7O0FBTUEsU0FBTyxJQUFQO0FBQ0Q7O0FBRUQsU0FBUyxXQUFULENBQXFCLE1BQXJCLEVBQTZCO0FBQzNCLFNBQU8sUUFBUSxNQUFSLEVBQWdCLE1BQXZCO0FBQ0Q7O0FBRUQsU0FBUyxrQkFBVCxDQUE0QixVQUE1QixFQUF3QyxLQUF4QyxFQUErQyxNQUEvQyxFQUF1RDtBQUNyRCxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QixFQUNBLGFBQWMsU0FBVSx1QkFBVyxVQURuQzs7QUFHQSxNQUFJLGVBQWUsU0FBbkIsRUFBOEI7QUFBQyxXQUFPLFdBQVA7QUFBb0I7O0FBRW5ELE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBQUwsRUFBeUQ7QUFDdkQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsVUFETTtBQUVmLGVBQVMsNkJBQXFCLDJCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEO0FBQ0Q7QUFDQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLG1CQUFULENBQTZCLFdBQTdCLEVBQTBDLEtBQTFDLEVBQWlELE1BQWpELEVBQXlEO0FBQ3ZELE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixRQUE3QixFQUF1QyxXQUF2Qzs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLFlBQW5DOztBQUVBLE1BQUksZ0JBQWdCLFNBQXBCLEVBQStCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVwRCxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxXQUF2QyxDQUFMLEVBQTBEO0FBQ3hELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsOEJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEOztBQUVELE9BQUssUUFBTCxJQUFpQixXQUFqQixFQUE4Qjs7QUFFNUIsUUFBSSxZQUFZLGNBQVosQ0FBMkIsUUFBM0IsQ0FBSixFQUEwQztBQUN4QyxVQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxRQUF2QyxDQUFMLEVBQXVEO0FBQ3JELG9CQUFZLElBQVosQ0FBaUI7QUFDZixpQkFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsUUFBL0MsQ0FETTtBQUVmLG1CQUFZLFFBQVosU0FBd0IsNkJBQXFCLHdCQUY5QjtBQUdmLGlCQUFTLHdCQUFnQjtBQUhWLFNBQWpCO0FBS0Q7O0FBRUQsb0JBQWMsWUFBWSxRQUFaLENBQWQ7O0FBRUEsVUFBSSxnQkFBZ0IsSUFBaEIsSUFBd0IsZ0JBQWdCLFNBQXhDLElBQXFELENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFdBQTdCLENBQTFELEVBQXFHO0FBQ25HLG9CQUFZLElBQVosQ0FBaUI7QUFDZixpQkFBUywyQkFBb0IsZ0JBQXBCLENBQXFDLFVBQXJDLEVBQWlELFFBQWpELENBRE07QUFFZixtQkFBWSxRQUFaLFNBQXdCLDZCQUFxQiwrQkFGOUI7QUFHZixpQkFBUyx3QkFBZ0I7QUFIVixTQUFqQjtBQUtEO0FBQ0Y7QUFDRjs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLFlBQVQsQ0FBc0IsSUFBdEIsRUFBNEIsS0FBNUIsRUFBbUMsTUFBbkMsRUFBMkM7QUFDekMsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsSUFBbkM7O0FBRUEsTUFBSSxTQUFTLFNBQWIsRUFBd0I7QUFDdEIsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIscUJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEOztBQUVELE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLElBQXZDLENBQUwsRUFBbUQ7QUFDakQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIscUJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEOztBQUVELHdCQUFzQixJQUF0QixFQUE0Qix1QkFBVyxFQUF2QyxFQUEyQyxVQUEzQyxFQUF1RCxXQUF2RCxFQUFxRSxjQUFjLElBQW5GOztBQUVBLE1BQUksS0FBSyxPQUFMLEtBQWlCLFNBQXJCLEVBQWdDO0FBQzlCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxPQUExRCxDQURNO0FBRWYsZUFBUyw2QkFBcUIsMEJBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0QsR0FORCxNQU1PO0FBQ0wsd0JBQW9CLEtBQUssT0FBekIsRUFBa0MsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE9BQTFELENBQWxDLEVBQXNHLFdBQXRHO0FBQ0Q7O0FBRUQsNENBQTBDLElBQTFDLEVBQWdELG9DQUF3QixHQUF4RSxFQUE2RSxVQUE3RSxFQUF5RixXQUF6Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGlDQUFULENBQTJDLFVBQTNDLEVBQXVELGVBQXZELEVBQXdFLHVCQUF4RSxFQUFpRyxLQUFqRyxFQUF3RyxNQUF4RyxFQUFnSDtBQUM5RyxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsc0JBQTdCLEVBQXFELEdBQXJELEVBQTBELGlCQUExRDs7QUFFQSxnQkFBeUIsVUFBVSxFQUFuQztBQUNBLGVBQXlCLFNBQVUsdUJBQVcsc0JBQTlDO0FBQ0EsMkJBQXlCLHdCQUF3QixPQUF4QixDQUFnQyxlQUFoQyxNQUFxRCxxQkFBWSxjQUExRjtBQUNBLFFBQXlCLEVBQXpCOztBQUVBLE1BQUksMEJBQTBCLGVBQWUsU0FBN0MsRUFBd0Q7QUFDdEQsUUFBSSxlQUFlLElBQWYsSUFBdUIsQ0FBQywyQkFBb0IsT0FBcEIsQ0FBNEIsVUFBNUIsQ0FBNUIsRUFBcUU7QUFDbkUsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsVUFETTtBQUVmLGlCQUFTLDZCQUFxQixxQ0FGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRCxLQU5ELE1BTU87QUFDTCxpQkFBVyxPQUFYLENBQW1CLFVBQUMsb0JBQUQsRUFBdUIsQ0FBdkIsRUFBNkI7QUFDOUMsNEJBQW9CLDJCQUFvQixnQkFBcEIsQ0FBcUMsVUFBckMsRUFBaUQsQ0FBakQsQ0FBcEI7O0FBRUEsWUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsb0JBQXZDLENBQUwsRUFBbUU7QUFDakUsc0JBQVksSUFBWixDQUFpQjtBQUNmLG1CQUFTLGlCQURNO0FBRWYscUJBQVMsNkJBQXFCLHNDQUZmO0FBR2YsbUJBQVMsd0JBQWdCO0FBSFYsV0FBakI7QUFLRCxTQU5ELE1BTU87QUFDTCxtQ0FBeUIsb0JBQXpCLEVBQStDLHVCQUFXLEVBQTFELEVBQThELGlCQUE5RCxFQUFpRixXQUFqRixFQUE4RixjQUFjLElBQTVHLEVBQWtILHdCQUFnQixjQUFsSTtBQUNBLGNBQUksSUFBSSxPQUFKLENBQVkscUJBQXFCLEVBQWpDLE1BQXlDLHFCQUFZLGNBQXpELEVBQXlFO0FBQ3ZFLHdCQUFZLElBQVosQ0FBaUI7QUFDZixxQkFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsaUJBQW5DLEVBQXNELHVCQUFXLEVBQWpFLENBRE07QUFFZix1QkFBUyw2QkFBcUIsaUJBRmY7QUFHZixxQkFBUyx3QkFBZ0I7QUFIVixhQUFqQjtBQUtELFdBTkQsTUFNTztBQUNMLGdCQUFJLElBQUosQ0FBUyxxQkFBcUIsRUFBOUI7QUFDRDs7QUFFRCxjQUFJLHFCQUFxQixFQUFyQixJQUEyQiwyQkFBb0IsbUJBQXBCLENBQXdDLElBQXhDLENBQTZDLHFCQUFxQixFQUFsRSxDQUEvQixFQUFzRztBQUNwRyx3QkFBWSxJQUFaLENBQWlCO0FBQ2YscUJBQVMsMkJBQW9CLGNBQXBCLENBQW1DLGlCQUFuQyxFQUFzRCx1QkFBVyxFQUFqRSxDQURNO0FBRWYsdUJBQVMsNkJBQXFCLGlDQUZmO0FBR2YscUJBQVMsd0JBQWdCO0FBSFYsYUFBakI7QUFLRDs7QUFFRCw4QkFBb0IscUJBQXFCLFdBQXpDLEVBQXNELDJCQUFvQixjQUFwQixDQUFtQyxpQkFBbkMsRUFBc0QsdUJBQVcsV0FBakUsQ0FBdEQsRUFBcUksV0FBckk7QUFDQSxvREFBMEMsb0JBQTFDLEVBQWdFLG9DQUF3QixlQUF4RixFQUF5RyxpQkFBekcsRUFBNEgsV0FBNUg7QUFDRDtBQUNGLE9BaENEO0FBa0NEO0FBQ0YsR0EzQ0QsTUEyQ08sSUFBSSxtQkFBbUIsVUFBdkIsRUFBbUM7QUFDeEMsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsVUFETTtBQUVmLGVBQVksNkJBQXFCLDhCQUFqQyxTQUFtRSxlQUZwRDtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLHlCQUFULENBQW1DLFVBQW5DLEVBQStDLEtBQS9DLEVBQXNELE1BQXRELEVBQThEO0FBQzVELE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2Qiw0QkFBN0I7O0FBRUEsZ0JBQStCLFVBQVUsRUFBekM7QUFDQSxlQUErQixTQUFVLHVCQUFXLFVBQXBEO0FBQ0EsaUNBQStCLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyx5QkFBMUQsQ0FBL0I7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FBTCxFQUF5RDtBQUN2RCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLDJCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxzQkFBb0IsV0FBVyxJQUEvQixFQUFxQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsSUFBMUQsQ0FBckMsRUFBc0csV0FBdEc7QUFDQSxzQkFBb0IsV0FBVyxXQUEvQixFQUE0QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsV0FBMUQsQ0FBNUMsRUFBb0gsV0FBcEg7O0FBRUEsd0JBQXNCLFVBQXRCLEVBQWtDLHVCQUFXLElBQTdDLEVBQW1ELFVBQW5ELEVBQStELFdBQS9ELEVBQTZFLGNBQWMsS0FBM0Y7QUFDQSx3QkFBc0IsVUFBdEIsRUFBa0MsdUJBQVcsU0FBN0MsRUFBd0QsVUFBeEQsRUFBb0UsV0FBcEUsRUFBa0YsY0FBYyxLQUFoRztBQUNBLHFCQUFtQixXQUFXLFVBQTlCLEVBQTBDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxVQUExRCxDQUExQyxFQUFpSCxXQUFqSDs7QUFFQSxNQUFJLFdBQVcsZUFBWCxLQUErQixTQUFuQyxFQUE4QztBQUM1QyxRQUFJLFdBQVcsSUFBWCxLQUFvQixxQkFBWSwyQkFBcEMsRUFBaUU7QUFDL0Qsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxJQUE5RCxDQURNO0FBRWYsaUJBQVksNkJBQXFCLGdDQUFqQyxVQUFzRSxxQkFBWSwyQkFBbEYsTUFGZTtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDs7QUFFRCxRQUFJLGlEQUErQixPQUEvQixDQUF1QyxXQUFXLGVBQWxELE1BQXVFLHFCQUFZLGNBQXZGLEVBQXVHO0FBQ3JHLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsZ0JBQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsNEJBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRjs7QUFFRCxNQUFJLFdBQVcsdUJBQVgsS0FBdUMsU0FBM0MsRUFBc0Q7QUFDcEQsUUFBSSxDQUFDLDJCQUFvQixPQUFwQixDQUE0QixXQUFXLHVCQUF2QyxDQUFMLEVBQXNFO0FBQ3BFLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDRCQURNO0FBRWYsaUJBQVMsNkJBQXFCLHVDQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtELEtBTkQsTUFNTztBQUNMLGlCQUFXLHVCQUFYLENBQW1DLE9BQW5DLENBQTJDLFVBQUMsUUFBRCxFQUFXLENBQVgsRUFBaUI7QUFDMUQsWUFBSSxhQUFhLElBQWIsSUFBcUIsYUFBYSxTQUFsQyxJQUErQyxDQUFDLDJCQUFvQixRQUFwQixDQUE2QixRQUE3QixDQUFwRCxFQUE0RjtBQUMxRixzQkFBWSxJQUFaLENBQWlCO0FBQ2YsbUJBQVMsMkJBQW9CLGdCQUFwQixDQUFxQyw0QkFBckMsRUFBbUUsQ0FBbkUsQ0FETTtBQUVmLHFCQUFTLDZCQUFxQix5Q0FGZjtBQUdmLG1CQUFTLHdCQUFnQjtBQUhWLFdBQWpCO0FBS0Q7QUFDRixPQVJEO0FBU0Q7QUFDRjs7QUFFRCxvQ0FDRSxXQUFXLE9BRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLE1BQVosRUFBb0IsdUJBQVcsVUFBL0IsQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxPQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLEtBRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLE1BQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxLQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLE1BRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLFFBQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLE1BRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLFFBQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSxvQ0FDRSxXQUFXLEtBRGIsRUFFRSxXQUFXLGVBRmIsRUFHRSxDQUFDLHVCQUFXLFdBQVosQ0FIRixFQUlFLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxLQUExRCxDQUpGLEVBS0UsV0FMRjs7QUFRQSw0Q0FBMEMsVUFBMUMsRUFBc0Qsb0NBQXdCLG1CQUE5RSxFQUFtRyxVQUFuRyxFQUErRyxXQUEvRztBQUNBLFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsZ0JBQVQsQ0FBMEIsUUFBMUIsRUFBb0MsS0FBcEMsRUFBMkMsTUFBM0MsRUFBbUQ7QUFDakQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsUUFBbkM7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsUUFBdkMsQ0FBTCxFQUF1RDtBQUNyRCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQiwyQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsd0JBQXNCLFFBQXRCLEVBQWdDLHVCQUFXLEVBQTNDLEVBQStDLFVBQS9DLEVBQTJELFdBQTNELEVBQXlFLGNBQWMsSUFBdkY7O0FBRUEsTUFBSSxTQUFTLFVBQVQsS0FBd0IsU0FBNUIsRUFBdUM7QUFDckMsOEJBQ0UsU0FBUyxVQURYLEVBRUUsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFVBQTFELENBRkYsRUFHRSxXQUhGO0FBS0Q7O0FBRUQsNENBQTBDLFFBQTFDLEVBQW9ELG9DQUF3QixRQUE1RSxFQUFzRixVQUF0RixFQUFrRyxXQUFsRzs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLG9CQUFULENBQThCLFlBQTlCLEVBQTRDLEtBQTVDLEVBQW1ELE1BQW5ELEVBQTJEO0FBQ3pELE1BQUksV0FBSixFQUFpQixVQUFqQjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLGFBQW5DOztBQUVBLE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLFlBQXZDLENBQUwsRUFBMkQ7QUFDekQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsMENBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0EsV0FBTyxXQUFQO0FBQ0Q7O0FBR0QsTUFBSSxhQUFhLFVBQWIsS0FBNEIsd0JBQVksYUFBNUMsRUFBMkQ7QUFDekQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFdBQTFELENBRE07QUFFZixlQUFTLDZCQUFxQixpQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxNQUFJLENBQUMsYUFBYSxFQUFkLElBQW9CLENBQUMsMkJBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQThCLGFBQWEsRUFBM0MsQ0FBekIsRUFBeUU7QUFDdkUsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLEVBQTFELENBRE07QUFFZixlQUFTLDZCQUFxQix5QkFGZjtBQUdmLGFBQVEsd0JBQWdCO0FBSFQsS0FBakI7QUFLRDs7QUFFRCw0Q0FBMEMsWUFBMUMsRUFBd0Qsb0NBQXdCLGFBQWhGLEVBQStGLFVBQS9GLEVBQTJHLFdBQTNHOztBQUVBLFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsYUFBVCxDQUF1QixLQUF2QixFQUE4QixLQUE5QixFQUFxQyxNQUFyQyxFQUE2QztBQUMzQyxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSx1QkFBVyxLQUFuQzs7QUFFQSxNQUFJLFVBQVUsU0FBZCxFQUF5QjtBQUNyQixXQUFPLFdBQVA7QUFDSDs7QUFFRCwyQkFBeUIsS0FBekIsRUFBZ0MsdUJBQVcsTUFBM0MsRUFBbUQsVUFBbkQsRUFBK0QsV0FBL0QsRUFBNkUsY0FBYyxLQUEzRjs7QUFFQSxNQUFJLE1BQU0sTUFBTixLQUFpQixTQUFyQixFQUFnQztBQUM5QixRQUFJLE1BQU0sTUFBTixHQUFlLHFCQUFZLGdCQUEzQixJQUErQyxNQUFNLE1BQU4sR0FBZSxxQkFBWSxnQkFBOUUsRUFBZ0c7QUFDOUYsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE1BQTFELENBRE07QUFFZixpQkFBUyw2QkFBcUIsMEJBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRjs7QUFFRCxNQUFJLE1BQU0sR0FBTixLQUFjLFNBQWxCLEVBQTZCO0FBQzNCLDZCQUF5QixLQUF6QixFQUFnQyx1QkFBVyxHQUEzQyxFQUFnRCxVQUFoRCxFQUE0RCxXQUE1RCxFQUEwRSxjQUFjLEtBQXhGOztBQUVFLFFBQUksTUFBTSxHQUFOLEtBQWMsU0FBZCxJQUEyQixNQUFNLEdBQU4sR0FBWSxNQUFNLEdBQWpELEVBQXNEO0FBQ3BELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxHQUExRCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDRCQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEOztBQUVELFFBQUksTUFBTSxHQUFOLEtBQWMsU0FBZCxJQUEyQixNQUFNLEdBQU4sR0FBWSxNQUFNLEdBQWpELEVBQXNEO0FBQ3BELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxHQUExRCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDRCQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtEO0FBQ0o7O0FBRUQsTUFBSSxNQUFNLEdBQU4sS0FBYyxTQUFsQixFQUE2QjtBQUMzQiw2QkFBeUIsS0FBekIsRUFBZ0MsdUJBQVcsR0FBM0MsRUFBZ0QsVUFBaEQsRUFBNEQsV0FBNUQsRUFBMEUsY0FBYyxLQUF4Rjs7QUFFQSxRQUFJLE1BQU0sR0FBTixLQUFjLFNBQWQsSUFBMkIsTUFBTSxHQUFOLEdBQVksTUFBTSxHQUFqRCxFQUFzRDtBQUNwRCxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsR0FBMUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQix5QkFGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGOztBQUVELDJCQUF5QixLQUF6QixFQUFnQyx1QkFBVyxHQUEzQyxFQUFnRCxVQUFoRCxFQUE0RCxXQUE1RCxFQUEwRSxjQUFjLEtBQXhGO0FBQ0EsNENBQTBDLEtBQTFDLEVBQWlELG9DQUF3QixLQUF6RSxFQUFnRixVQUFoRixFQUE0RixXQUE1Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsTUFBeEIsRUFBZ0MsS0FBaEMsRUFBdUMsTUFBdkMsRUFBK0M7QUFDN0MsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsTUFBbkM7O0FBRUEsTUFBSSxXQUFXLFNBQWYsRUFBMEI7QUFBQyxXQUFPLFdBQVA7QUFBb0I7O0FBRS9DLE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLE1BQXZDLENBQUwsRUFBcUQ7QUFDbkQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLENBRE07QUFFZixlQUFTLDZCQUFxQix5QkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsZ0JBQWMsT0FBTyxLQUFyQixFQUE0QiwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsS0FBMUQsQ0FBNUIsRUFBOEYsV0FBOUY7QUFDQSw0QkFBMEIsTUFBMUIsRUFBa0MsdUJBQVcsT0FBN0MsRUFBc0QsVUFBdEQsRUFBa0UsV0FBbEUsRUFBZ0YsY0FBYyxLQUE5RjtBQUNBLDRCQUEwQixNQUExQixFQUFrQyx1QkFBVyxVQUE3QyxFQUF5RCxVQUF6RCxFQUFxRSxXQUFyRSxFQUFtRixjQUFjLEtBQWpHO0FBQ0EsMkJBQXlCLE1BQXpCLEVBQWlDLHVCQUFXLFFBQTVDLEVBQXNELFVBQXRELEVBQWtFLFdBQWxFLEVBQWdGLGNBQWMsS0FBOUY7QUFDQSxxQkFBbUIsT0FBTyxVQUExQixFQUFzQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsVUFBMUQsQ0FBdEMsRUFBNkcsV0FBN0c7O0FBRUEsTUFBSSxPQUFPLFFBQVAsS0FBb0IsU0FBcEIsS0FBa0MsT0FBTyxRQUFQLEtBQW9CLElBQXBCLElBQTRCLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLE9BQU8sUUFBcEMsQ0FBN0IsSUFBOEUsQ0FBQywyQkFBb0IsaUJBQXBCLENBQXNDLElBQXRDLENBQTJDLE9BQU8sUUFBbEQsQ0FBakgsQ0FBSixFQUFtTDtBQUNqTCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsUUFBMUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELDRDQUEwQyxNQUExQyxFQUFrRCxvQ0FBd0IsTUFBMUUsRUFBa0YsVUFBbEYsRUFBOEYsV0FBOUY7O0FBRUEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUywrQkFBVCxDQUF5QyxNQUF6QyxFQUFpRCxZQUFqRCxFQUErRCxLQUEvRCxFQUFzRSxNQUF0RSxFQUE4RTtBQUM1RSxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIsT0FBN0IsRUFBc0MsUUFBdEM7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBVSx1QkFBVyxTQUFuQztBQUNBLGFBQWMsT0FBTyxZQUFQLENBQWQ7O0FBRUEsTUFBSSxhQUFhLFNBQWpCLEVBQTRCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVqRCxNQUFJLGFBQWEsSUFBYixJQUFxQixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixRQUE3QixDQUExQixFQUFrRTtBQUNoRSxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFZLFlBQVosU0FBNEIsNkJBQXFCLGNBRmxDO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxZQUFVLDJCQUFvQixrQkFBcEIsQ0FBdUMsSUFBdkMsQ0FBNEMsUUFBNUMsQ0FBVjs7QUFFQSxNQUFJLE9BQUosRUFBYTtBQUNYLFFBQUksQ0FBQyw0QkFBNEIsT0FBNUIsQ0FBTCxFQUEyQztBQUN6QyxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixpQkFBUyw2QkFBcUIsb0NBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRixHQVJELE1BUU87QUFDTCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELFlBQW5ELENBRE07QUFFZixlQUFTLDZCQUFxQixrQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGVBQVQsQ0FBeUIsT0FBekIsRUFBa0MsS0FBbEMsRUFBeUMsTUFBekMsRUFBaUQ7QUFDL0MsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsT0FBbkM7O0FBRUEsTUFBSSxZQUFZLFNBQWhCLEVBQTJCO0FBQUMsV0FBTyxXQUFQO0FBQW9COztBQUVoRCxNQUFJLFlBQVksSUFBWixJQUFvQixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixPQUE3QixDQUFyQixJQUE4RCxDQUFDLDJCQUFvQixnQkFBcEIsQ0FBcUMsSUFBckMsQ0FBMEMsT0FBMUMsQ0FBbkUsRUFBdUg7QUFDckgsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsdUNBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7O0FBRUQsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyx3QkFBVCxDQUFrQyxVQUFsQyxFQUE4QyxLQUE5QyxFQUFxRCxNQUFyRCxFQUE2RDtBQUMzRCxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWMsU0FBUyx1QkFBVyxVQUFsQzs7QUFFQSxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQUFMLEVBQXlEO0FBQ3ZELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHdDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxNQUFJLFdBQVcsT0FBWCxLQUF1QixTQUEzQixFQUFzQztBQUNwQyxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLE9BQTlELENBRE07QUFFZixlQUFTLDZCQUFxQiwwQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFNRCxHQVBELE1BT087QUFDTCx3QkFBb0IsV0FBVyxPQUEvQixFQUF3QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsT0FBMUQsQ0FBeEMsRUFBNEcsV0FBNUc7QUFDRDs7QUFFRCxzQkFBb0IsV0FBVyxXQUEvQixFQUE0QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsV0FBMUQsQ0FBNUMsRUFBb0gsV0FBcEg7QUFDQSx3QkFBc0IsVUFBdEIsRUFBa0MsdUJBQVcsVUFBN0MsRUFBeUQsVUFBekQsRUFBcUUsV0FBckUsRUFBa0YsY0FBYyxJQUFoRyxFQUFzRyx3QkFBZ0IsY0FBdEg7QUFDQSx3QkFBc0IsVUFBdEIsRUFBa0MsdUJBQVcsUUFBN0MsRUFBdUQsVUFBdkQsRUFBbUUsV0FBbkUsRUFBaUYsY0FBYyxLQUEvRixFQUFzRyx3QkFBZ0IsY0FBdEg7O0FBRUE7QUFDQSwyQkFBeUIsVUFBekIsRUFBcUMsdUJBQVcsWUFBaEQsRUFBOEQsVUFBOUQsRUFBMEUsV0FBMUUsRUFBdUYsY0FBYyxJQUFyRyxFQUEyRyx3QkFBZ0IsY0FBM0g7O0FBRUEsTUFBSSxXQUFXLE1BQVgsS0FBc0IsU0FBdEIsSUFBbUMsV0FBVyxNQUFYLEtBQXNCLElBQXpELElBQWlFLENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFdBQVcsTUFBeEMsQ0FBbEUsSUFBc0gsV0FBVyxNQUFYLEdBQW9CLENBQXBCLEtBQTBCLENBQXBKLEVBQXdKO0FBQ3RKLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsTUFBOUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELE1BQUksV0FBVyxJQUFYLEtBQW9CLFNBQXhCLEVBQW1DO0FBQ2pDLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsSUFBOUQsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLDJDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtELEdBTkQsTUFNTyxJQUFJLFdBQVcsSUFBWCxLQUFvQixJQUFwQixJQUE0QixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixXQUFXLElBQXhDLENBQTdCLElBQThFLENBQUMsMkJBQW9CLE9BQXBCLENBQTRCLElBQTVCLENBQWlDLFdBQVcsSUFBNUMsQ0FBbkYsRUFBc0k7QUFDM0ksZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxJQUE5RCxDQURNO0FBRWYsZUFBUyw2QkFBcUIsZ0NBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7O0FBRUQsNENBQTBDLFVBQTFDLEVBQXNELG9DQUF3QixVQUE5RSxFQUEwRixVQUExRixFQUFzRyxXQUF0RztBQUNBLFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsbUJBQVQsQ0FBNkIsV0FBN0IsRUFBMEMsS0FBMUMsRUFBaUQsTUFBakQsRUFBeUQ7QUFDdkQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsV0FBbkM7O0FBRUEsTUFBSSxnQkFBZ0IsU0FBcEIsRUFBK0I7QUFBQyxXQUFPLFdBQVA7QUFBb0I7O0FBRXBELE1BQUksZ0JBQWdCLElBQWhCLElBQXdCLENBQUMsMkJBQW9CLE9BQXBCLENBQTRCLFdBQTVCLENBQTdCLEVBQXVFO0FBQ3JFLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLGtDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxjQUFZLE9BQVosQ0FBb0IsVUFBQyxVQUFELEVBQWEsQ0FBYixFQUFtQjtBQUNyQyw2QkFBeUIsVUFBekIsRUFBcUMsMkJBQW9CLGdCQUFwQixDQUFxQyxVQUFyQyxFQUFpRCxDQUFqRCxDQUFyQyxFQUEwRixXQUExRjtBQUNELEdBRkQ7O0FBSUEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCLEtBQTlCLEVBQXFDLE1BQXJDLEVBQTZDO0FBQzNDLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixRQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLEtBQW5DOztBQUVBLE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLEtBQXZDLENBQUwsRUFBb0Q7QUFDbEQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIsaUNBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0EsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsYUFBVyxZQUFZLEtBQVosQ0FBWDs7QUFFQSxNQUFJLGFBQWEscUJBQVksaUNBQTdCLEVBQWdFO0FBQzlELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELE1BQUksTUFBTSxVQUFOLEtBQXFCLHdCQUFZLEtBQXJDLEVBQTRDO0FBQzFDLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHlDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtEOztBQUVELHdCQUFzQixLQUF0QixFQUE2QixVQUE3QixFQUF5QyxXQUF6QztBQUNBLDJCQUF5QixLQUF6QixFQUFnQyx1QkFBVyxJQUEzQyxFQUFpRCxVQUFqRCxFQUE2RCxXQUE3RCxFQUEyRSxjQUFjLEtBQXpGOztBQUVBLDRDQUEwQyxLQUExQyxFQUFpRCxvQ0FBd0IsS0FBekUsRUFBZ0YsVUFBaEYsRUFBNEYsV0FBNUY7O0FBRUEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQXVCLEtBQXZCLEVBQThCLEtBQTlCLEVBQXFDLE1BQXJDLEVBQTZDO0FBQzNDLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixXQUE3QixFQUEwQyxRQUExQzs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLEtBQW5DO0FBQ0EsZ0JBQWMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE1BQTFELENBQWQ7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsS0FBdkMsQ0FBTCxFQUFvRDtBQUNsRCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixpQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsYUFBVyxZQUFZLEtBQVosQ0FBWDs7QUFFQSxNQUFJLGFBQWEsQ0FBakIsRUFBb0I7QUFDbEIsUUFBSSxNQUFNLE1BQU4sS0FBaUIsSUFBakIsSUFBeUIsTUFBTSxNQUFOLEtBQWlCLFNBQTlDLEVBQXlEO0FBQ3ZELGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLFdBRE07QUFFZixpQkFBUyw2QkFBcUIsNENBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRixHQVJELE1BUU8sSUFBSSxXQUFXLHFCQUFZLGlDQUEzQixFQUE4RDtBQUNuRSxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixzQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCx3QkFBc0IsS0FBdEIsRUFBNkIsVUFBN0IsRUFBeUMsV0FBekM7O0FBRUEsMkJBQXlCLEtBQXpCLEVBQWdDLHVCQUFXLElBQTNDLEVBQWlELFVBQWpELEVBQTZELFdBQTdELEVBQTJFLGNBQWMsS0FBekY7O0FBRUEsTUFBSSxNQUFNLE1BQU4sS0FBaUIsU0FBckIsRUFBZ0M7QUFDOUIsUUFBSSxNQUFNLE1BQU4sS0FBaUIsSUFBakIsSUFBeUIsQ0FBQywyQkFBb0IsT0FBcEIsQ0FBNEIsTUFBTSxNQUFsQyxDQUE5QixFQUF5RTtBQUN2RSxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLE1BQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsMEJBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0QsS0FORCxNQU1PO0FBQ0wsWUFBTSxNQUFOLENBQWEsT0FBYixDQUFxQixVQUFDLE1BQUQsRUFBUyxDQUFULEVBQWU7QUFDbEMsc0JBQWMsTUFBZCxFQUFzQiwyQkFBb0IsZ0JBQXBCLENBQXFDLFdBQXJDLEVBQWtELENBQWxELENBQXRCLEVBQTRFLFdBQTVFO0FBQ0QsT0FGRDtBQUdEO0FBQ0Y7O0FBRUQsNENBQTBDLEtBQTFDLEVBQWlELG9DQUF3QixLQUF6RSxFQUFnRixVQUFoRixFQUE0RixXQUE1Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGFBQVQsQ0FBdUIsS0FBdkIsRUFBOEIsS0FBOUIsRUFBcUMsTUFBckMsRUFBNkM7QUFDM0MsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsS0FBbkM7O0FBRUEsTUFBSSxVQUFVLElBQVYsSUFBa0IsVUFBVSxTQUFoQyxFQUEyQztBQUN6QyxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixzQkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsTUFBSSwyQkFBb0IsT0FBcEIsQ0FBNEIsS0FBNUIsQ0FBSixFQUF3QztBQUN0QyxrQkFBYyxLQUFkLEVBQXFCLFVBQXJCLEVBQWlDLFdBQWpDO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsa0JBQWMsS0FBZCxFQUFxQixVQUFyQixFQUFpQyxXQUFqQztBQUNEOztBQUVELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMsaUJBQVQsQ0FBMkIsU0FBM0IsRUFBc0MsS0FBdEMsRUFBNkMsTUFBN0MsRUFBcUQ7QUFDbkQsTUFBSSxXQUFKLEVBQWlCLFVBQWpCOztBQUVBLGdCQUFjLFVBQVUsRUFBeEI7QUFDQSxlQUFjLFNBQVUsdUJBQVcsU0FBbkM7O0FBRUEsTUFBSSxjQUFjLFNBQWxCLEVBQTZCO0FBQzNCLFdBQU8sV0FBUDtBQUNEOztBQUVELE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLFNBQXZDLENBQUwsRUFBd0Q7QUFDdEQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxDQURNO0FBRWYsZUFBUyw2QkFBcUIscUNBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCOztBQU1BLFdBQU8sV0FBUDtBQUNEO0FBQ0QsTUFBSSwyQkFBb0IsT0FBcEIsQ0FBNEIsU0FBNUIsQ0FBSixFQUE0QztBQUMxQyxrQkFBYyxTQUFkLEVBQXlCLFVBQXpCLEVBQXFDLFdBQXJDO0FBQ0EsUUFBSSxDQUFDLFVBQVUsTUFBWCxJQUFxQixDQUFDLFVBQVUsTUFBVixDQUFpQixNQUF2QyxJQUFpRCxVQUFVLE1BQVYsQ0FBaUIsTUFBakIsS0FBNEIscUJBQVksNkJBQTdGLEVBQTRIO0FBQzFILGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsTUFBOUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQix5Q0FGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDtBQUNGLEdBVEQsTUFTTztBQUNMLGtCQUFjLFNBQWQsRUFBeUIsVUFBekIsRUFBcUMsV0FBckM7QUFDRDs7QUFFRCxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGlDQUFULENBQTJDLFVBQTNDLEVBQXVELEtBQXZELEVBQThELE1BQTlELEVBQXNFO0FBQ3BFLE1BQUksV0FBSixFQUFpQixVQUFqQjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLFdBQW5DOztBQUVBLE1BQUksZUFBZSxTQUFuQixFQUE4QjtBQUFDLFdBQU8sV0FBUDtBQUFvQjs7QUFFbkQsTUFBSSxlQUFlLElBQW5CLEVBQXlCO0FBQ3ZCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLG1DQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjtBQUtELEdBTkQsTUFNTyxJQUFJLDJCQUFvQixPQUFwQixDQUE0QixVQUE1QixDQUFKLEVBQTZDO0FBQ2xELGVBQVcsT0FBWCxDQUFtQixVQUFDLFFBQUQsRUFBVyxDQUFYLEVBQWlCO0FBQ2xDLHVCQUFpQixRQUFqQixFQUEyQiwyQkFBb0IsZ0JBQXBCLENBQXFDLFVBQXJDLEVBQWlELENBQWpELENBQTNCLEVBQWdGLFdBQWhGO0FBQ0QsS0FGRDtBQUdELEdBSk0sTUFJQSxJQUFJLDJCQUFvQixRQUFwQixDQUE2QixVQUE3QixDQUFKLEVBQThDO0FBQ25ELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHFDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxxQkFBaUIsVUFBakIsRUFBNkIsVUFBN0IsRUFBeUMsV0FBekM7QUFDRCxHQVJNLE1BUUE7QUFDTCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQixnREFGZjtBQUdmLGFBQVMsd0JBQWdCLGNBSFYsRUFBakI7QUFJRDtBQUNELFNBQU8sV0FBUDtBQUNEOztBQUVELFNBQVMseUJBQVQsQ0FBbUMsaUJBQW5DLEVBQXNELEtBQXRELEVBQTZELE1BQTdELEVBQXFFO0FBQ25FLE1BQUksV0FBSixFQUFpQixVQUFqQjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLGtCQUFuQzs7QUFFQSxNQUFJLHNCQUFzQixTQUExQixFQUFxQztBQUNuQyxXQUFPLFdBQVA7QUFDRDs7QUFFRCxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxpQkFBdkMsQ0FBTCxFQUFnRTtBQUM5RCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQiw4Q0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxvQ0FBa0Msa0JBQWtCLE1BQXBELEVBQTRELDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUE1RCxFQUErSCxXQUEvSDtBQUNBLG9DQUFrQyxrQkFBa0IsUUFBcEQsRUFBOEQsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFFBQTFELENBQTlELEVBQW1JLFdBQW5JO0FBQ0Esb0NBQWtDLGtCQUFrQixRQUFwRCxFQUE4RCwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsUUFBMUQsQ0FBOUQsRUFBbUksV0FBbkk7QUFDQSxvQ0FBa0Msa0JBQWtCLEtBQXBELEVBQTJELDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxLQUExRCxDQUEzRCxFQUE2SCxXQUE3SDs7QUFFQSw0Q0FBMEMsaUJBQTFDLEVBQTZELG9DQUF3QixrQkFBckYsRUFBeUcsVUFBekcsRUFBcUgsV0FBckg7O0FBRUEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxlQUFULENBQXlCLE9BQXpCLEVBQWtDLEtBQWxDLEVBQXlDLE1BQXpDLEVBQWlELHlCQUFqRCxFQUE0RTtBQUMxRSxNQUFJLFdBQUosRUFBaUIsVUFBakI7O0FBRUEsZ0JBQWMsVUFBVSxFQUF4QjtBQUNBLGVBQWEsU0FBUyx1QkFBVyxPQUFqQzs7QUFFQSxNQUFJLFlBQVksU0FBaEIsRUFBMkI7QUFBQyxXQUFPLFdBQVA7QUFBb0I7O0FBRWhELE1BQUksQ0FBQywyQkFBb0Isa0JBQXBCLENBQXVDLE9BQXZDLENBQUwsRUFBc0Q7QUFDcEQsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsVUFETTtBQUVmLGVBQVMsNkJBQXFCLGtDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxNQUFJLFFBQVEsWUFBUixLQUF5QixTQUF6QixLQUF1QyxRQUFRLFlBQVIsS0FBeUIsSUFBekIsSUFBaUMsQ0FBQywyQkFBb0IsUUFBcEIsQ0FBNkIsUUFBUSxZQUFyQyxDQUFsQyxJQUF3RixDQUFDLDJCQUFvQixJQUFwQixDQUF5QixJQUF6QixDQUE4QixRQUFRLFlBQXRDLENBQWhJLENBQUosRUFBMEw7QUFDeEwsZ0JBQVksSUFBWixDQUFpQjtBQUNmLGFBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxZQUE5RCxDQURNO0FBRWYsZUFBUyw2QkFBcUIsZ0NBRmY7QUFHZixhQUFTLHdCQUFnQjtBQUhWLEtBQWpCO0FBS0Q7O0FBRUQsTUFBSSxDQUFDLHdCQUFZLEtBQWIsRUFBb0Isd0JBQVksS0FBaEMsRUFBdUMsT0FBdkMsQ0FBK0MseUJBQS9DLE1BQThFLHFCQUFZLGNBQTlGLEVBQThHO0FBQzVHLFFBQUksUUFBUSxRQUFSLEtBQXFCLFNBQXpCLEVBQW9DO0FBQ2xDLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsUUFBOUQsQ0FETTtBQUVmLGlCQUFTLDZCQUFxQiwrQkFGZjtBQUdmLGVBQVMsd0JBQWdCO0FBSFYsT0FBakI7QUFLRDs7QUFFRCxRQUFJLFFBQVEsUUFBUixLQUFxQixTQUF6QixFQUFvQztBQUNsQyxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLFFBQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsc0RBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRjs7QUFFRCwyQkFBeUIsT0FBekIsRUFBa0MsdUJBQVcsUUFBN0MsRUFBdUQsVUFBdkQsRUFBbUUsV0FBbkUsRUFBZ0YsY0FBYyxLQUE5RixFQUFxRyx3QkFBZ0IsY0FBckg7QUFDQSwyQkFBeUIsT0FBekIsRUFBa0MsdUJBQVcsUUFBN0MsRUFBdUQsVUFBdkQsRUFBbUUsV0FBbkUsRUFBZ0YsY0FBYyxLQUE5RixFQUFxRyx3QkFBZ0IsY0FBckg7O0FBRUEsTUFBSSxRQUFRLElBQVIsS0FBaUIsU0FBckIsRUFBZ0M7QUFDNUIsa0JBQWMsUUFBUSxJQUF0QixFQUE0QiwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsSUFBMUQsQ0FBNUIsRUFBNkYsV0FBN0Y7QUFDSDs7QUFFRCxNQUFJLFFBQVEsaUJBQVIsS0FBOEIsU0FBbEMsRUFBNkM7QUFDM0MsOEJBQTBCLFFBQVEsaUJBQWxDLEVBQXFELDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxrQkFBMUQsQ0FBckQsRUFBb0ksV0FBcEk7QUFDRDs7QUFFRCxNQUFJLFFBQVEsUUFBUixLQUFxQixTQUFyQixJQUFrQyxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsUUFBUSxRQUEvQyxDQUF2QyxFQUFpRztBQUMvRixnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLFFBQTlELENBRE07QUFFZixlQUFTLDZCQUFxQix1QkFGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7QUFLRDs7QUFFRCxNQUFJLFFBQVEsU0FBUixLQUFzQixTQUExQixFQUFxQztBQUNuQyx5QkFBcUIsUUFBUSxTQUE3QixFQUF3QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsU0FBMUQsQ0FBeEMsRUFBOEcsV0FBOUc7QUFDRDs7QUFFRCxNQUFJLFFBQVEsVUFBUixLQUF1QixTQUEzQixFQUFzQztBQUNwQyxRQUFJLDJCQUFvQixPQUFwQixDQUE0QixRQUFRLFVBQXBDLENBQUosRUFBcUQ7QUFDbkQsb0JBQWMsUUFBUSxVQUF0QixFQUFrQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsVUFBMUQsQ0FBbEMsRUFBeUcsV0FBekc7QUFDRCxLQUZELE1BRU87QUFDTCxvQkFBYyxRQUFRLFVBQXRCLEVBQWtDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxVQUExRCxDQUFsQyxFQUF5RyxXQUF6RztBQUNEO0FBQ0Y7O0FBRUQscUJBQW1CLFFBQVEsVUFBM0IsRUFBdUMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLFVBQTFELENBQXZDLEVBQThHLFdBQTlHO0FBQ0EsNENBQTBDLE9BQTFDLEVBQW1ELG9DQUF3QixVQUEzRSxFQUFzRixVQUF0RixFQUFpRyxXQUFqRzs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsTUFBeEIsRUFBZ0MsS0FBaEMsRUFBdUMsTUFBdkMsRUFBK0Msb0JBQS9DLEVBQXFFO0FBQ25FLE1BQUksV0FBSixFQUFpQixVQUFqQixFQUE2QixVQUE3Qjs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLE1BQW5DOztBQUVBLE1BQUksV0FBVyxTQUFmLEVBQTBCO0FBQ3hCLGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLHNCQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCxNQUFJLENBQUMsMkJBQW9CLGtCQUFwQixDQUF1QyxNQUF2QyxDQUFMLEVBQXFEO0FBQ25ELGdCQUFZLElBQVosQ0FBaUI7QUFDZixhQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsQ0FETTtBQUVmLGVBQVMsNkJBQXFCLGtDQUZmO0FBR2YsYUFBUyx3QkFBZ0I7QUFIVixLQUFqQjs7QUFNQSxXQUFPLFdBQVA7QUFDRDs7QUFFRCwyQkFBeUIsTUFBekIsRUFBaUMsdUJBQVcsV0FBNUMsRUFBeUQsVUFBekQsRUFBcUUsV0FBckUsRUFBa0YsY0FBYyxJQUFoRyxFQUFzRyx3QkFBZ0IsZ0JBQXRIOztBQUVBLGVBQWEsT0FBTyxVQUFQLElBQXFCLHdCQUFZLFFBQTlDOztBQUVBLFVBQVEsVUFBUjtBQUNFLFNBQUssd0JBQVksUUFBakI7QUFDRSx1QkFBaUIsTUFBakIsRUFBeUIsVUFBekIsRUFBcUMsV0FBckM7QUFDQTtBQUNGLFNBQUssd0JBQVksS0FBakI7QUFDRSxvQkFBYyxNQUFkLEVBQXNCLFVBQXRCLEVBQWtDLFdBQWxDO0FBQ0E7QUFDRixTQUFLLHdCQUFZLEtBQWpCO0FBQ0Usb0JBQWMsTUFBZCxFQUFzQixVQUF0QixFQUFrQyxXQUFsQztBQUNBO0FBQ0YsU0FBSyx3QkFBWSxhQUFqQjtBQUNFLDJCQUFxQixNQUFyQixFQUE2QixVQUE3QixFQUF5QyxXQUF6QztBQUNBO0FBQ0YsU0FBSyx3QkFBWSxhQUFqQjtBQUNFLFVBQUksb0JBQUosRUFBMEI7QUFDeEIsb0JBQVksSUFBWixDQUFpQjtBQUNmLGlCQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsV0FBOUQsQ0FETTtBQUVmLG1CQUFTLDZCQUFxQiw0Q0FGZjtBQUdmLGlCQUFTLHdCQUFnQjtBQUhWLFNBQWpCO0FBS0Q7QUFDRCx3QkFBa0IsTUFBbEIsRUFBMEIsVUFBMUIsRUFBc0MsV0FBdEMsRUFBb0Qsa0JBQWtCLElBQXRFO0FBQ0E7QUFDRjtBQUNFLGtCQUFZLElBQVosQ0FBaUI7QUFDZixlQUFTLDJCQUFvQixrQkFBcEIsQ0FBdUMsVUFBdkMsRUFBbUQsdUJBQVcsV0FBOUQsQ0FETTtBQUVmLGlCQUFZLDZCQUFxQixnQ0FBakMsU0FBcUUsaUNBQXFCLFFBQXJCLEVBRnREO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQXhCSjs7QUErQkEsU0FBTyxXQUFQO0FBQ0Q7O0FBRUQsU0FBUyxpQkFBVCxDQUEyQixTQUEzQixFQUFzQyxLQUF0QyxFQUE2QyxNQUE3QyxFQUFxRCxjQUFyRCxFQUFxRTtBQUNuRSxNQUFJLFdBQUosRUFBaUIsVUFBakIsRUFBNkIseUJBQTdCLEVBQXdELHFCQUF4RDs7QUFFQSxnQkFBYyxVQUFVLEVBQXhCO0FBQ0EsZUFBYyxTQUFVLHVCQUFXLFNBQW5DOztBQUVBLDBCQUF3QixvQ0FBd0IsU0FBaEQ7O0FBRUEsTUFBSSxDQUFDLDJCQUFvQixrQkFBcEIsQ0FBdUMsU0FBdkMsQ0FBTCxFQUF3RDtBQUN0RCxnQkFBWSxJQUFaLENBQWlCO0FBQ2YsYUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLENBRE07QUFFZixlQUFTLDZCQUFxQiwwQ0FGZjtBQUdmLGFBQVMsd0JBQWdCO0FBSFYsS0FBakI7O0FBTUEsV0FBTyxXQUFQO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDLGNBQUwsRUFBcUI7QUFDbkIsUUFBSSxVQUFVLEVBQVYsS0FBaUIsSUFBakIsSUFBeUIsVUFBVSxFQUFWLEtBQWlCLFNBQTFDLElBQXVELENBQUMsMkJBQW9CLFFBQXBCLENBQTZCLFVBQVUsRUFBdkMsQ0FBNUQsRUFBd0c7QUFDdEcsa0JBQVksSUFBWixDQUFpQjtBQUNmLGVBQVMsMkJBQW9CLGtCQUFwQixDQUF1QyxVQUF2QyxFQUFtRCx1QkFBVyxFQUE5RCxDQURNO0FBRWYsaUJBQVMsNkJBQXFCLDhCQUZmO0FBR2YsZUFBUyx3QkFBZ0I7QUFIVixPQUFqQjtBQUtELEtBTkQsTUFNTyxJQUFJLENBQUMsMkJBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQThCLFVBQVUsRUFBeEMsQ0FBTCxFQUFrRDtBQUN2RCxrQkFBWSxJQUFaLENBQWlCO0FBQ2YsZUFBUywyQkFBb0Isa0JBQXBCLENBQXVDLFVBQXZDLEVBQW1ELHVCQUFXLEVBQTlELENBRE07QUFFZixpQkFBUyw2QkFBcUIsZ0JBRmY7QUFHZixlQUFTLHdCQUFnQjtBQUhWLE9BQWpCO0FBS0Q7QUFDRixHQWRELE1BY087QUFDTCw0QkFBd0Isb0NBQXdCLGFBQWhEO0FBQ0Q7O0FBRUQsZ0JBQWMsVUFBVSxLQUF4QixFQUErQiwyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsS0FBMUQsQ0FBL0IsRUFBaUcsV0FBakc7QUFDQSxlQUFhLFVBQVUsSUFBdkIsRUFBNkIsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLElBQTFELENBQTdCLEVBQThGLFdBQTlGO0FBQ0EsaUJBQWUsVUFBVSxNQUF6QixFQUFpQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsTUFBMUQsQ0FBakMsRUFBb0csV0FBcEcsRUFBaUgsY0FBakg7QUFDQSxpQkFBZSxVQUFVLE1BQXpCLEVBQWlDLDJCQUFvQixjQUFwQixDQUFtQyxVQUFuQyxFQUErQyx1QkFBVyxNQUExRCxDQUFqQyxFQUFvRyxXQUFwRzs7QUFFQSw4QkFBNEIsVUFBVSxNQUFWLElBQW9CLFVBQVUsTUFBVixDQUFpQixVQUFyQyxHQUFrRCxVQUFVLE1BQVYsQ0FBaUIsVUFBbkUsR0FBZ0Ysd0JBQVksUUFBeEg7O0FBRUEsa0JBQWdCLFVBQVUsT0FBMUIsRUFBbUMsMkJBQW9CLGNBQXBCLENBQW1DLFVBQW5DLEVBQStDLHVCQUFXLE9BQTFELENBQW5DLEVBQXVHLFdBQXZHLEVBQW9ILHlCQUFwSDtBQUNBLGtDQUFnQyxTQUFoQyxFQUEyQyx1QkFBVyxTQUF0RCxFQUFpRSxVQUFqRSxFQUE2RSxXQUE3RTtBQUNBLGtDQUFnQyxTQUFoQyxFQUEyQyx1QkFBVyxNQUF0RCxFQUE4RCxVQUE5RCxFQUEwRSxXQUExRTs7QUFFQSxvQkFBa0IsVUFBVSxTQUE1QixFQUF1QywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsU0FBMUQsQ0FBdkMsRUFBNkcsV0FBN0c7QUFDQSxrQkFBZ0IsVUFBVSxPQUExQixFQUFtQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsT0FBMUQsQ0FBbkMsRUFBdUcsV0FBdkc7QUFDQSxzQkFBb0IsVUFBVSxXQUE5QixFQUEyQywyQkFBb0IsY0FBcEIsQ0FBbUMsVUFBbkMsRUFBK0MsdUJBQVcsV0FBMUQsQ0FBM0MsRUFBbUgsV0FBbkg7O0FBRUEsNENBQTBDLFNBQTFDLEVBQXFELHFCQUFyRCxFQUE0RSxVQUE1RSxFQUF3RixXQUF4Rjs7QUFFQSxTQUFPLFdBQVA7QUFDRDs7QUFFRCxTQUFTLG1CQUFULENBQTZCLFNBQTdCLEVBQXdDO0FBQ3RDLE1BQUksV0FBSjs7QUFFQSxnQkFBYyxFQUFkO0FBQ0Esb0JBQWtCLFNBQWxCLEVBQTZCLHVCQUFXLFNBQXhDLEVBQW1ELFdBQW5ELEVBQWlFLGNBQWMsS0FBL0U7O0FBRUEsU0FBTyxhQUFhLFNBQWIsRUFBd0IsV0FBeEIsQ0FBUDtBQUNEOztBQUVELFNBQVMsOEJBQVQsQ0FBd0MsU0FBeEMsRUFBbUQ7QUFDakQsTUFBSSxlQUFKOztBQUVBLE1BQUksY0FBYyxTQUFsQixFQUE2QjtBQUMzQixXQUFPLHlCQUF3QixZQUFZLElBQXBDLEVBQTBDO0FBQy9DLGFBQVMsdUJBQVcsU0FEMkI7QUFFL0MsZUFBUyw2QkFBcUIsbUNBRmlCO0FBRy9DLGFBQVMsd0JBQWdCO0FBSHNCLEtBQTFDLENBQVA7QUFLRDs7QUFFRCxNQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDdEIsV0FBTyx5QkFBd0IsWUFBWSxJQUFwQyxFQUEwQztBQUMvQyxhQUFTLHVCQUFXLFNBRDJCO0FBRS9DLGVBQVMsNkJBQXFCLDBCQUZpQjtBQUcvQyxhQUFTLHdCQUFnQjtBQUhzQixLQUExQyxDQUFQO0FBS0Q7O0FBRUQsTUFBSSwyQkFBb0IsUUFBcEIsQ0FBNkIsU0FBN0IsQ0FBSixFQUE2QztBQUMzQyxRQUFJO0FBQ0Ysd0JBQWtCLEtBQUssS0FBTCxDQUFXLFNBQVgsQ0FBbEI7QUFDQSxVQUFJLG9CQUFvQixJQUFwQixJQUE0QixDQUFDLDJCQUFvQixRQUFwQixDQUE2QixlQUE3QixDQUE3QixJQUE4RSwyQkFBb0IsT0FBcEIsQ0FBNEIsZUFBNUIsQ0FBbEYsRUFBZ0k7QUFDOUgsZUFBTyx3QkFBd0IsZUFBeEIsRUFBeUM7QUFDOUMsaUJBQVMsdUJBQVcsU0FEMEI7QUFFOUMsbUJBQVMsNkJBQXFCLGtDQUZnQjtBQUc5QyxpQkFBUyx3QkFBZ0I7QUFIcUIsU0FBekMsQ0FBUDtBQUtEO0FBQ0YsS0FURCxDQVNFLE9BQU8sQ0FBUCxFQUFVO0FBQ1YsYUFBTyx3QkFBd0IsZUFBeEIsRUFBeUM7QUFDOUMsZUFBUyx1QkFBVyxTQUQwQjtBQUU5QyxpQkFBWSw2QkFBcUIsWUFBakMsVUFBa0QsRUFBRSxPQUZOO0FBRzlDLGVBQVMsd0JBQWdCO0FBSHFCLE9BQXpDLENBQVA7QUFLRDs7QUFFRCxXQUFPLG9CQUFvQixlQUFwQixDQUFQO0FBQ0Q7O0FBRUQsTUFBSSwyQkFBb0IsUUFBcEIsQ0FBNkIsU0FBN0IsS0FBMkMsQ0FBQywyQkFBb0IsT0FBcEIsQ0FBNEIsU0FBNUIsQ0FBaEQsRUFBd0Y7QUFDdEYsV0FBTyxvQkFBb0IsU0FBcEIsQ0FBUDtBQUNEOztBQUVELFNBQU8seUJBQXdCLFlBQVksSUFBcEMsRUFBMEM7QUFDL0MsV0FBUyx1QkFBVyxTQUQyQjtBQUUvQyxhQUFTLDZCQUFxQiwrQkFGaUI7QUFHL0MsV0FBUyx3QkFBZ0I7QUFIc0IsR0FBMUMsQ0FBUDtBQUtEOztBQUVELFNBQVMsMkJBQVQsQ0FBcUMsT0FBckMsRUFBOEM7QUFDNUMsU0FBTyxRQUFRLGdDQUF5QixJQUFqQyxLQUNFLFFBQVEsZ0NBQXlCLGFBQWpDLEtBQW1ELFFBQVEsZ0NBQXlCLGNBQWpDLENBRDVEO0FBRUQ7O0FBRUQsZ0JBQWdCO0FBQ2QscUJBQW1CO0FBREwsQ0FBaEI7O2tCQUllLGE7O0FBQ2YsT0FBTyxhQUFQLEdBQXVCLGFBQXZCLEMsQ0FBc0MiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB4YXBpRXJyb3JMZXZlbHMgPSBPYmplY3QuZnJlZXplKHtcbiAgTUFZX1ZJT0xBVElPTjogICAgJ01BWV9WSU9MQVRJT04nLFxuICBNVVNUX1ZJT0xBVElPTjogICAnTVVTVF9WSU9MQVRJT04nLFxuICBTSE9VTERfVklPTEFUSU9OOiAnU0hPVUxEX1ZJT0xBVElPTidcbn0pO1xuXG5jb25zdCB4YXBpVmFsaWRhdGlvbkVycm9ycyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFM6ICAgICAgICAgICdBY3Rpdml0aWVzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMnLFxuICBBQ1RPUl9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY3RvciBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIEFHRU5UX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbiBcImFnZW50XCIuJyxcbiAgQUdFTlRfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICAnXCJhZ2VudFwiIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgQUdFTlRfTVVTVF9OT1RfSEFWRV9HUk9VUF9DSEFSQUNURVJJU1RJQ1M6ICAgICAgICAnSW52YWxpZCBvYmplY3Qgd2l0aCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBHcm91cCB3aGVuIGFuIEFnZW50IHdhcyBleHBlY3RlZC4nLFxuICBBVFRBQ0hNRU5UU19NVVNUX0JFX05PVF9OVUxMX0FSUkFZOiAgICAgICAgICAgICAgICdcImF0dGFjaG1lbnRzXCIgbXVzdCBiZSBhIG5vbi1udWxsIEFycmF5LicsXG4gIEFUVEFDSE1FTlRTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFM6ICAgICAgICAgJ1wiYXR0YWNobWVudFwiIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzLicsXG4gIEFVVEhPUklUWV9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImF1dGhvcml0eVwiIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSjogJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBBY3Rpdml0eSBPYmplY3RzIG9yIGEgc2luZ2xlIEFjdGl2aXR5IE9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICdUaGUgQ29udGV4dCBBY3Rpdml0aWVzIGluc3RhbmNlcyBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT05URVhUX0FDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICdcIkNvbnRleHQgQWN0aXZpdGllc1wiIHByb3BlcnR5IHZhbHVlcyBtdXN0IG5vdCBiZSBudWxsLicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVk6ICAgICAgICAgICAgJ0NvbnRleHQgQWN0aXZpdGllcyBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkIHByZWZlciB0byBiZSBhbiBhcnJheSBvZiBBY3Rpdml0aWVzIHJhdGhlciB0aGFuIGEgc2luZ2xlIEFjdGl2aXR5IG9iamVjdC4nLFxuICBDT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb250ZXh0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZOiAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5cIiB2YWx1ZSBtdXN0IGJlIGFuIEFycmF5IG9mIHN0cmluZ3MuJyxcbiAgQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1M6ICAgICAgICAnXCJjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblwiIGl0ZW1zIG11c3QgYmUgc3RyaW5ncy4nLFxuICBEQVRFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIHByb3BlcnR5cyBzdHJpbmcgdmFsdWUgbXVzdCBiZSBjb25mb3JtYW50IHRvIElTTyA4NjAxIGZvciBEYXRlIFRpbWVzLicsXG4gIERBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTjogICAgICAgICAgICAgJ0lTTyA4NjAxIGRhdGUgdGltZSBzdHJpbmdzIHVzZWQgaW4gdGhlIHhBUEkgc2hvdWxkIGluY2x1ZGUgdGltZSB6b25lIGluZm9ybWF0aW9uLicsXG4gIERFRklOSVRJT05TX01VU1RfQkVfT0JKRUNUUzogICAgICAgICAgICAgICAgICAgICAgJ1wiZGVmaW5pdGlvbnNcIiwgd2hlbiBwcmVzZW50LCBtdXN0IGJlIG1hcCBvYmplY3RzJyxcbiAgRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAnXCJkaXNwbGF5XCIgcHJvcGVydHkgc2hvdWxkIGJlIHByb3ZpZGVkLicsXG4gIERVUkFUSU9OX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImR1cmF0aW9uXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhbiBJU08gODYwMSBkdXJhdGlvbicsXG4gIEVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBleHRlbnNpb25zIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPOiAgICAgICAgJ0lmIHVzZWQgYXMgYSBHcm91cCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgXCJtZW1iZXJcIiBwcm9wZXJ0eSB0aGF0IGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgZXhhY3RseSB0d28gQWdlbnQgb2JqZWN0cy4nLFxuICBHUk9VUF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRDogICAgICAgICAgICdFeGFjdGx5IG9uZSBJbnZlcnNlIEZ1bmN0aW9uYWwgSWRlbnRpZmllciBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBcImdyb3VwXCIuJyxcbiAgR1JPVVBfTUVNQkVSX01VU1RfQkVfQVJSQVk6ICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIG1lbWJlciBwcm9wZXJ0eSBvZiBhIEdyb3VwIG11c3QgYmUgYW4gQXJyYXknLFxuICBHUk9VUF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImdyb3VwXCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBJRF9NVVNUX0JFX1VOSVFVRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydGllcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gZWFjaCBpbnRlcmFjdGlvbiBjb21wb25lbnQgYXJyYXknLFxuICBJRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGOiAgICAgICAgICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQgc3RyaW5nIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgSURfTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSWQgd2FzIG5vdCBhIHZhbGlkIFVVSUQnLFxuICBJRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVM6ICAgICAgICAgICAgICAgICdcImlkXCIgcHJvcGVydGllcyBvbiBpbnRlcmFjdGlvbiBjb21wb25lbnRzIHNob3VsZCBub3QgY29udGFpbiB3aGl0ZXNwYWNlJyxcbiAgSURTX1NIT1VMRF9CRV9HRU5FUkFURURfQllfTFJTOiAgICAgICAgICAgICAgICAgICAnSWRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIEFjdGl2aXR5IFByb3ZpZGVyLCBhbmQgbXVzdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIExSUycsXG4gIElGSV9NVVNUX0JFX01CT1hfVVJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wibWJveFwiIHByb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIG1haWx0byBVUkkgc3RyaW5nIGJ1dCB3YXMgbm90IGEgc3RyaW5nIGF0IGFsbC4nLFxuICBJRklfTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVDogICAgICAgICAgICAgICAgICAgICdcIm1ib3hcIiBwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBtYWlsdG8gVVJJIHN0cmluZyBidXQgZGlkIG5vdCBtYXRjaCB0aGUgbWFpbHRvIGZvcm1hdC4nLFxuICBJTlRFUkFDVElPTl9BQ1RJVklUWV9TSE9VTERfSEFWRTogICAgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiBBY3Rpdml0eSBEZWZpbml0aW9ucyBzaG91bGQgaGF2ZSBhIHR5cGUgcHJvcGVydHkgb2YnLFxuICBJTlRFUkFDVElPTl9DT01QT05FTlRfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIG1lbWJlciBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdCcsXG4gIElOVEVSQUNUSU9OX0NPTVBPTkVOVF9TSE9VTERfQkVfQVJSQVk6ICAgICAgICAgICAgJ1RoaXMgaW50ZXJhY3Rpb24gY29tcG9uZW50IGNvbGxlY3Rpb24gcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5LicsXG4gIElOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUk6ICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImludGVyYWN0aW9uVHlwZVwiIHZhbHVlIG11c3QgYmUgYSBDTUkgaW50ZXJhY3Rpb24gdHlwZSBvcHRpb24uJyxcbiAgSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVzZW50IGludGVyYWN0aW9uVHlwZSBvZjogJyxcbiAgSU5WQUxJRF9KU09OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBKU09OLiBUaGUgc3RhdGVtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQuJyxcbiAgTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAna2V5LCBMYW5ndWFnZSBkb2VzIG5vdCBjb25mb3JtIHRvIFJGQyA1NjQ2JyxcbiAgTEFOR1VBR0VfTUFQX0tFWV9NVVNUX0JFX1NUUklORzogICAgICAgICAgICAgICAgICAna2V5OiBMYW5ndWFnZSBNYXAgdmFsdWUgc2hvdWxkIGJlIGEgU3RyaW5nLCBidXQgd2FzIG5vdCcsXG4gIExBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgJ0xhbmd1YWdlIE1hcHMsIHdoZW4gcHJlc2VudCwgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIExBTkdVQUdFX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBsYW5ndWFnZSBwcm9wZXJ0eSBtdXN0IGJlIGVuY29kZWQgYXMgYW4gUkZDIDU2NDYgY29tcGxpYW50IHN0cmluZywgYnV0IHdhcyBub3QuJyxcbiAgTEVOR1RIX01VU1RfQkVfSU5URUdFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJsZW5ndGhcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYW4gaW50ZWdlciB2YWx1ZScsXG4gIE1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU46ICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJtYXhcIiBhbmQgXCJtaW5cIiBhcmUgcHJlc2VudCwgdGhlIG1heCBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1pbicsXG4gIE1FTUJFUl9NVVNUX0JFX1BST1ZJREVEX0ZPUl9BTk9OWU1PVVNfR1JPVVBTOiAgICAgJ1wibWVtYmVyXCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCBmb3IgQW5vbnltb3VzIEdyb3Vwcy4nLFxuICBNVVNUX0JFX0JPT0xFQU5fUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBCb29sZWFuIGJ1dCB3YXMgYWJzZW50LicsXG4gIE1VU1RfQkVfQk9PTEVBTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgQm9vbGVhbi4nLFxuICBNVVNUX0JFX0lSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgc2hvdWxkIGJlIGEgSVJJLWxpa2UgYWJzb2x1dGUgVVJJIHBlciBSRkMgMzk4Ny4nLFxuICBNVVNUX0JFX05VTUJFUl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBOdW1iZXIgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9OVU1CRVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBOdW1iZXIuJyxcbiAgTVVTVF9CRV9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIGJ1dCB3YXMgYWJzZW50LicsXG4gIE1VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLicsXG4gIE1VU1RfQkVfVVJJX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIFVSSSBzdHJpbmcgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9VUklfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBVUkkgc3RyaW5nLicsXG4gIE9CSkVDVF9NVVNUX0JFX0RFRklORUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZC4nLFxuICBPQkpFQ1RfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNUOiAgICAgICAgICAgICAgICdcIm9iamVjdFwiIHByb3BlcnR5IG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRjogICAgICAgICAgICAgICAgJ1wib2JqZWN0VHlwZVwiIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgXCJTdGF0ZW1lbnRSZWZcIiBmb3Igc3RhdGVtZW50IHJlZmVyZW5jZSBvYmplY3RzLicsXG4gIE9CSkVDVF9UWVBFX01VU1RfQkVfVkFMSURfT1BUSU9OOiAgICAgICAgICAgICAgICAgJ29iamVjdFxcJ3MgXCJvYmplY3RUeXBlXCIgZGlkIG5vdCBtYXRjaCBhIHZhbGlkIG9wdGlvbicsXG4gIFJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU46ICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJyYXdcIiBhbmQgXCJtaW5cIiBhcmUgcHJlc2VudCwgdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1pbicsXG4gIFJBV19NVVNUX0JFX0xFU1NfVEhBTl9NQVg6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIGJvdGggXCJyYXdcIiBhbmQgXCJtYXhcIiBhcmUgcHJlc2VudCwgdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG1heCcsXG4gIFJFR0lTVFJBVElPTl9NVVNUX0JFX1VVSURfU1RSSU5HOiAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSByZWdpc3RyYXRpb24gcHJvcGVydHkgbXVzdCBiZSBhIFVVSUQgc3RyaW5nLicsXG4gIFJFU1VMVF9NVVNUX0JFX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSByZXN1bHQgbXVzdCBiZSBhIG1hcCBvYmplY3QnLFxuICBSRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQOiAgICAgICAgICAgICAgICAgICdUaGUgcmV2aXNpb24gcHJvcGVydHkgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgU3RhdGVtZW50XFwncyBPYmplY3QgaXMgYW4gQWdlbnQgb3IgR3JvdXAuJyxcbiAgU0NBTEVEX01VU1RfQkVfQkVUV0VFTl8wXzE6ICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHNjYWxlZCBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMScsXG4gIFNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFM6ICAgICAgJ1wic2hhMlwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgb24gYXR0YWNobWVudCBvYmplY3RzJyxcbiAgU0hBMl9NVVNUX0NPTlRBSU5fQkFTRV82NF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGEgc3RyaW5nIHdpdGggYmFzZTY0IGNvbnRlbnRzJyxcbiAgU1RBVEVNRU5UX0FSR1VNRU5UX0lTX05PVF9WQUxJRDogICAgICAgICAgICAgICAgICAnU3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkIHdhcyBub3QgYSB2YWxpZCBvYmplY3Qgb3IgYSB2YWxpZCBKU09OIHN0cmluZy4nLFxuICBTVEFURU1FTlRfQVJHVU1FTlRfTVVTVF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICdObyBzdGF0ZW1lbnQgYXJndW1lbnQgcHJvdmlkZWQuJyxcbiAgU1RBVEVNRU5UX01VU1RfQkVfUEFSU0VEX0NPUlJFQ1RMWTogICAgICAgICAgICAgICAnTnVsbCBvciBub24tb2JqZWN0IHN0YXRlbWVudCB2YWx1ZSBwYXJzZWQgZnJvbSBwcm92aWRlZCBzdGF0bWVudCBKU09OLicsXG4gIFNUQVRFTUVOVF9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAgJ051bGwgc3RhdGVtZW50IGFyZ3VtZW50IHByb3ZpZGVkLicsXG4gIFNUQVRFTUVOVF9SRUZfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgJ1N0YXRlbWVudFJlZiBpbnN0YW5jZXMgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIFNVQl9TVEFURU1FTlRfTVVTVF9OT1RfQ09OVEFJTl9TVUJfU1RBVEVNRU5UOiAgICAgJ0EgU3ViU3RhdGVtZW50IG11c3Qgbm90IGNvbnRhaW4gYSBTdWJTdGF0ZW1lbnQnLFxuICBVTkVYUEVDVEVEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIHByb3BlcnR5IG5vdCBwZXJtaXR0ZWQnLFxuICBWRVJCX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJiIG11c3QgYmUgcHJvdmlkZWQnLFxuICBWRVJCX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJiIHByb3BlcnR5IHZhbHVlIG11c3QgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIFZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORzogICAgICAgICAgJ1widmVyc2lvblwiIG11c3QgYmUgYSBub24tbnVsbCBzdHJpbmcgdGhhdCBjb21wbGllcyB3aXRoIFNlbWFudGljIFZlcnNpb25pbmcgMS4wLjAnXG59KTtcblxuZXhwb3J0IHt4YXBpRXJyb3JMZXZlbHN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbkVycm9yc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlHZW5lcmFsID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZJUlNUX1JFUE9SVF9WRVJTVElPTiAgICAgICAgICAgICA6ICcxLjAuMCcsXG4gIEdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTICAgICA6IDIsXG4gIElOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRSAgICAgICA6ICdodHRwOi8vYWRsbmV0Lmdvdi9leHBhcGkvYWN0aXZpdGllcy9jbWkuaW50ZXJhY3Rpb24nLFxuICBNQVhfU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAxLFxuICBNSU5fU0NBTEVEX1ZBTFVFICAgICAgICAgICAgICAgICAgOiAwLFxuICBOT19JTkRFWF9GT1VORCAgICAgICAgICAgICAgICAgICAgOiAtMSxcbiAgTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTIDogMVxufSk7XG5cbmV4cG9ydCB7eGFwaUdlbmVyYWx9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgaW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBDSE9JQ0U6ICAgICAgICdjaG9pY2UnLFxuICBGSUxMX0lOOiAgICAgICdmaWxsLWluJyxcbiAgTElLRVJUOiAgICAgICAnbGlrZXJ0JyxcbiAgTE9OR19GSUxMX0lOOiAnbG9uZy1maWxsLWluJyxcbiAgTUFUQ0hJTkc6ICAgICAnbWF0Y2hpbmcnLFxuICBOVU1FUklDOiAgICAgICdudW1lcmljJyxcbiAgT1RIRVI6ICAgICAgICAnb3RoZXInLFxuICBQRVJGT1JNQU5DRTogICdwZXJmb3JtYW5jZScsXG4gIFNFUVVFTkNJTkc6ICAgJ3NlcXVlbmNpbmcnLFxuICBUUlVFX0ZBTFNFOiAgICd0cnVlLWZhbHNlJ1xufSk7XG5cbmV4cG9ydCBjb25zdCB4YXBpVmFsaWRhdGlvbkludGVyYWN0aW9uVHlwZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgaW50ZXJhY3Rpb25UeXBlcy5DSE9JQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuRklMTF9JTixcbiAgaW50ZXJhY3Rpb25UeXBlcy5MSUtFUlQsXG4gIGludGVyYWN0aW9uVHlwZXMuTE9OR19GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLk1BVENISU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLk5VTUVSSUMsXG4gIGludGVyYWN0aW9uVHlwZXMuT1RIRVIsXG4gIGludGVyYWN0aW9uVHlwZXMuUEVSRk9STUFOQ0UsXG4gIGludGVyYWN0aW9uVHlwZXMuU0VRVUVOQ0lORyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5UUlVFX0ZBTFNFXG5dKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICBBQ0NPVU5UOiAgICAgICAgICAgICAgICAgICAnYWNjb3VudCcsXG4gIEFDVElWSVRZOiAgICAgICAgICAgICAgICAgICdhY3Rpdml0eScsXG4gIEFDVE9SOiAgICAgICAgICAgICAgICAgICAgICdhY3RvcicsXG4gIEFHRU5UOiAgICAgICAgICAgICAgICAgICAgICdhZ2VudCcsXG4gIEFUVEFDSE1FTlQ6ICAgICAgICAgICAgICAgICdhdHRhY2htZW50JyxcbiAgQVRUQUNITUVOVFM6ICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnRzJyxcbiAgQVVUSE9SSVRZOiAgICAgICAgICAgICAgICAgJ2F1dGhvcml0eScsXG4gIENBVEVHT1JZOiAgICAgICAgICAgICAgICAgICdjYXRlZ29yeScsXG4gIENIT0lDRTogICAgICAgICAgICAgICAgICAgICdjaG9pY2UnLFxuICBDSE9JQ0VTOiAgICAgICAgICAgICAgICAgICAnY2hvaWNlcycsXG4gIENPTVBMRVRJT046ICAgICAgICAgICAgICAgICdjb21wbGV0aW9uJyxcbiAgQ09OVEVOVF9UWVBFOiAgICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiAgICAgICAgJ2NvbnRleHRBY3Rpdml0aWVzJyxcbiAgQ09OVEVYVDogICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOOiAnY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4nLFxuICBEQVRFX1RJTUU6ICAgICAgICAgICAgICAgICAnZGF0ZVRpbWUnLFxuICBERUZJTklUSU9OOiAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbicsXG4gIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gIERJU1BMQVk6ICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgRFVSQVRJT046ICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyxcbiAgRVhURU5TSU9OUzogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbnMnLFxuICBGSUxFX1VSTDogICAgICAgICAgICAgICAgICAnZmlsZVVybCcsXG4gIEdST1VQOiAgICAgICAgICAgICAgICAgICAgICdncm91cCcsXG4gIEdST1VQSU5HOiAgICAgICAgICAgICAgICAgICdncm91cGluZycsXG4gIEhPTUVfUEFHRTogICAgICAgICAgICAgICAgICdob21lUGFnZScsXG4gIElEOiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsXG4gIElOU1RSVUNUT1I6ICAgICAgICAgICAgICAgICdpbnN0cnVjdG9yJyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UUzogICAgJ2ludGVyYWN0aW9uQ29tcG9uZW50cycsXG4gIElOVEVSQUNUSU9OX1RZUEU6ICAgICAgICAgICdpbnRlcmFjdGlvblR5cGUnLFxuICBMQU5HVUFHRV9NQVA6ICAgICAgICAgICAgICAnbGFuZ3VhZ2VNYXAnLFxuICBMQU5HVUFHRTogICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICBMRU5HVEg6ICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyxcbiAgTElLRVJUOiAgICAgICAgICAgICAgICAgICAgJ2xpa2VydCcsXG4gIE1BVENISU5HOiAgICAgICAgICAgICAgICAgICdtYXRjaGluZycsXG4gIE1BWDogICAgICAgICAgICAgICAgICAgICAgICdtYXgnLFxuICBNQk9YX1NIQV8xX1NVTTogICAgICAgICAgICAnbWJveF9zaGExc3VtJyxcbiAgTUJPWDogICAgICAgICAgICAgICAgICAgICAgJ21ib3gnLFxuICBNRU1CRVI6ICAgICAgICAgICAgICAgICAgICAnbWVtYmVyJyxcbiAgTUlOOiAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsXG4gIE1PUkVfSU5GTzogICAgICAgICAgICAgICAgICdtb3JlSW5mbycsXG4gIE5BTUU6ICAgICAgICAgICAgICAgICAgICAgICduYW1lJyxcbiAgT0JKRUNUX1RZUEU6ICAgICAgICAgICAgICAgJ29iamVjdFR5cGUnLFxuICBPQkpFQ1Q6ICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyxcbiAgT1BFTl9JRDogICAgICAgICAgICAgICAgICAgJ29wZW5JRCcsXG4gIE9USEVSOiAgICAgICAgICAgICAgICAgICAgICdvdGhlcicsXG4gIFBBUkVOVDogICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLFxuICBQRVJGT1JNQU5DRTogICAgICAgICAgICAgICAncGVyZm9ybWFuY2UnLFxuICBQTEFURk9STTogICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLFxuICBSQVc6ICAgICAgICAgICAgICAgICAgICAgICAncmF3JyxcbiAgUkVHSVNUUkFUSU9OOiAgICAgICAgICAgICAgJ3JlZ2lzdHJhdGlvbicsXG4gIFJFU1BPTlNFOiAgICAgICAgICAgICAgICAgICdyZXNwb25zZScsXG4gIFJFU1VMVDogICAgICAgICAgICAgICAgICAgICdyZXN1bHQnLFxuICBSRVZJU0lPTjogICAgICAgICAgICAgICAgICAncmV2aXNpb24nLFxuICBTQ0FMRTogICAgICAgICAgICAgICAgICAgICAnc2NhbGUnLFxuICBTQ0FMRUQ6ICAgICAgICAgICAgICAgICAgICAnc2NhbGVkJyxcbiAgU0NPUkU6ICAgICAgICAgICAgICAgICAgICAgJ3Njb3JlJyxcbiAgU0VRVUVOQ0lORzogICAgICAgICAgICAgICAgJ3NlcXVlbmNpbmcnLFxuICBTSEEyOiAgICAgICAgICAgICAgICAgICAgICAnc2hhMicsXG4gIFNPVVJDRTogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICBTVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAnc3RhdGVtZW50UmVmJyxcbiAgU1RBVEVNRU5UOiAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCcsXG4gIFNURVBTOiAgICAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gIFNUT1JFRDogICAgICAgICAgICAgICAgICAgICdzdG9yZWQnLFxuICBTVUJfQ09OVEVYVDogICAgICAgICAgICAgICAnc3ViQ29udGV4dCcsXG4gIFNVQ0NFU1M6ICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgVEFSR0VUOiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcsXG4gIFRFQU06ICAgICAgICAgICAgICAgICAgICAgICd0ZWFtJyxcbiAgVElNRVNUQU1QOiAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCcsXG4gIFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgVVNBR0VfVFlQRTogICAgICAgICAgICAgICAgJ3VzYWdlVHlwZScsXG4gIFZFUkI6ICAgICAgICAgICAgICAgICAgICAgICd2ZXJiJyxcbiAgVkVSU0lPTjogICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nXG59KTtcblxuY29uc3Qgb2JqZWN0VHlwZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgR1JPVVA6ICAgICAgICAgJ0dyb3VwJyxcbiAgQUdFTlQ6ICAgICAgICAgJ0FnZW50JyxcbiAgQUNUSVZJVFk6ICAgICAgJ0FjdGl2aXR5JyxcbiAgU1RBVEVNRU5UX1JFRjogJ1N0YXRlbWVudFJlZicsXG4gIFNVQl9TVEFURU1FTlQ6ICdTdWJTdGF0ZW1lbnQnXG59KTtcblxuY29uc3QgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgcHJvcGVydGllcy5NQk9YLFxuICBwcm9wZXJ0aWVzLk9QRU5fSURcbl0pO1xuXG5jb25zdCB4QXBpVmFsaWRPYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBvYmplY3RUeXBlcy5HUk9VUCxcbiAgb2JqZWN0VHlwZXMuQUdFTlQsXG4gIG9iamVjdFR5cGVzLkFDVElWSVRZLFxuICBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGLFxuICBvYmplY3RUeXBlcy5TVUJfU1RBVEVNRU5UXG5dKTtcblxuZXhwb3J0IHtwcm9wZXJ0aWVzfTtcbmV4cG9ydCB7b2JqZWN0VHlwZXN9O1xuZXhwb3J0IHt4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXN9O1xuZXhwb3J0IHt4QXBpVmFsaWRPYmplY3RUeXBlc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uUmVnZXggPSBPYmplY3QuZnJlZXplKHtcbiAgVVVJRDogICAgICAgICAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2ksXG4gIElTT184NjAxX0RVUkFUSU9OOiAgIC9eUCgoXFxkKyhbXFwuLF1cXGQrKT9ZKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9XKT8oXFxkKyhbXFwuLF1cXGQrKT9EKT8pPyhUKFxcZCsoW1xcLixdXFxkKyk/SCk/KFxcZCsoW1xcLixdXFxkKyk/TSk/KFxcZCsoW1xcLixdXFxkKyk/Uyk/KT8kLyxcbiAgSVNPXzg2MDFfREFURV9USU1FOiAgL14oXFxkezR9fFsrXFwtXVxcZHs2fSkoPzotKFxcZHsyfSkoPzotKFxcZHsyfSkpPyk/KD86VChcXGR7Mn0pOihcXGR7Mn0pKD86OihcXGR7Mn0pKD86XFwuKFxcZHszfSkpPyk/KD86KFopfChbK1xcLV0pKFxcZHsyfSkoPzo6KFxcZHsyfSkpPyk/KT8kLyxcbiAgTUFJTFRPX1VSSTogICAgICAgICAgL15tYWlsdG86LyxcbiAgQ09OVEFJTlNfV0hJVEVTUEFDRTogL1xccy9nLFxuICBTRU1WRVJfMV9QXzBfUF8wOiAgICAvXigoXFxkKylcXC4oXFxkKylcXC4oXFxkKykpKD86LShbXFxkQS1aYS16XFwtXSspKT8kLyxcbiAgQkFTRV82NDogICAgICAgICAgICAgL14oPzpbQS1aYS16MC05XFwrXFwvXXs0fSkqKD86W0EtWmEtejAtOVxcK1xcL117Mn09PXxbQS1aYS16MC05XFwrXFwvXXszfT18W0EtWmEtejAtOVxcK1xcL117NH0pJC8sXG4gIElSSTogICAgICAgICAgICAgICAgIC9eW2Etel0oPzpbXFwtYS16MC05XFwrXFwuXSkqOig/OlxcL1xcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06XSkqQCk/KD86XFxbKD86KD86KD86WzAtOWEtZl17MSw0fTopezZ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8OjooPzpbMC05YS1mXXsxLDR9Oil7NX0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXs0fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7M30oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwyfVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezJ9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsM31bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH06KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNH1bMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDV9WzAtOWEtZl17MSw0fSk/OjpbMC05YS1mXXsxLDR9fCg/Oig/OlswLTlhLWZdezEsNH06KXswLDZ9WzAtOWEtZl17MSw0fSk/OjopfHZbMC05YS1mXStbXFwtYS16MC05XFwuX34hXFwkJidcXChcXClcXCpcXCssOz06XSspXFxdfCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfXwoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9QF0pKikoPzo6WzAtOV0qKT8oPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSp8XFwvKD86KD86KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKykoPzpcXC8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkqKSopP3woPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnwoPyEoPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkpKD86XFw/KD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcdUUwMDAtXFx1RjhGRlxcdUYwMDAwLVxcdUZGRkZEfFxcdTEwMDAwMC1cXHUxMEZGRkRcXC9cXD9dKSopPyg/OlxcIyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pfFtcXC9cXD9dKSopPyQvaSxcbiAgQkNQXzQ3OiAgICAgICAgICAgICAgL14oPzooZW4tR0Itb2VkfGktKD86YW1pfGJubnxkZWZhdWx0fGVub2NoaWFufGhha3xrbGluZ29ufGx1eHxtaW5nb3xuYXZham98cHdufHRhb3x0YXl8dHN1KXxzZ24tKD86QkUtRlJ8QkUtTkx8Q0gtREUpKXwoYXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby0oPzpib2t8bnluKXx6aC0oPzpndW95dXxoYWtrYXxtaW58bWluLW5hbnx4aWFuZykpKSR8Xih4KD86LVswLTlhLXpdezEsOH0pKykkfF4oPzooKD86W2Etel17MiwzfSg/Oig/Oi1bYS16XXszfSl7MSwzfSk/KXxbYS16XXs0fXxbYS16XXs1LDh9KSg/Oi0oW2Etel17NH0pKT8oPzotKFthLXpdezJ9fFswLTldezN9KSk/KCg/Oi0oPzpbYS16MC05XXs1LDh9fFswLTldW2EtejAtOV17M30pKSopPygoPzotWzAtOWEtd3ktel0oPzotW2EtejAtOV17Miw4fSl7MSx9KSopPygteCg/Oi1bMC05YS16XXsxLDh9KSspPykkL2lcbn0pO1xuXG5jb25zdCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMgPSBPYmplY3QuZnJlZXplKHtcbiAgWUVBUjogICAgICAgICAgICAgMSxcbiAgTU9OVEg6ICAgICAgICAgICAgMixcbiAgREFZOiAgICAgICAgICAgICAgMyxcbiAgSE9VUjogICAgICAgICAgICAgNCxcbiAgTUlOVVRFOiAgICAgICAgICAgNSxcbiAgU0VDT05EOiAgICAgICAgICAgNixcbiAgTVNFQ09ORDogICAgICAgICAgNyxcbiAgWk9ORTogICAgICAgICAgICAgOCxcbiAgUkVMQVRJVkVfVElNRTogICAgOSxcbiAgVElNRV9aT05FX0hPVVI6ICAgMTAsXG4gIFRJTUVfWk9ORV9NSU5VVEU6IDExXG59KTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fTtcbmV4cG9ydCB7ZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfTtcbiIsIiAndXNlIHN0cmljdCc7XG4gaW1wb3J0IHtwcm9wZXJ0aWVzfSBmcm9tICcuLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5cbiBjb25zdCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcyA9IE9iamVjdC5mcmVlemUoe1xuICAgSUZJOiBbXG4gICAgIHByb3BlcnRpZXMuSE9NRV9QQUdFLFxuICAgICBwcm9wZXJ0aWVzLk5BTUVcbiAgIF0sXG4gICBVUkk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZXG4gICBdLFxuICAgQ09NUE9ORU5UX0FSUkFZOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVTQ1JJUFRJT05cbiAgIF0sXG4gICBBQ1RJVklUWV9ERUZJTklUSU9OOiBbXG4gICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5UWVBFLFxuICAgICBwcm9wZXJ0aWVzLk1PUkVfSU5GTyxcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TLFxuICAgICBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTixcbiAgICAgcHJvcGVydGllcy5DSE9JQ0VTLFxuICAgICBwcm9wZXJ0aWVzLlNDQUxFLFxuICAgICBwcm9wZXJ0aWVzLlNPVVJDRSxcbiAgICAgcHJvcGVydGllcy5UQVJHRVQsXG4gICAgIHByb3BlcnRpZXMuU1RFUFNcbiAgIF0sXG4gICBBQ1RJVklUWTogW1xuICAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRFRklOSVRJT05cbiAgIF0sXG4gICBTVEFURU1FTlRfUkVGOiBbXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgIF0sXG4gICBTQ09SRTogW1xuICAgICBwcm9wZXJ0aWVzLlNDQUxFRCxcbiAgICAgcHJvcGVydGllcy5SQVcsXG4gICAgIHByb3BlcnRpZXMuTUlOLFxuICAgICBwcm9wZXJ0aWVzLk1BWFxuICAgXSxcbiAgIFJFU1VMVDogW1xuICAgICBwcm9wZXJ0aWVzLlNDT1JFLFxuICAgICBwcm9wZXJ0aWVzLlNVQ0NFU1MsXG4gICAgIHByb3BlcnRpZXMuQ09NUExFVElPTixcbiAgICAgcHJvcGVydGllcy5SRVNQT05TRSxcbiAgICAgcHJvcGVydGllcy5EVVJBVElPTixcbiAgICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gICBdLFxuICAgQVRUQUNITUVOVDogW1xuICAgICBwcm9wZXJ0aWVzLlVTQUdFX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuRElTUExBWSxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTixcbiAgICAgcHJvcGVydGllcy5DT05URU5UX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuTEVOR1RILFxuICAgICBwcm9wZXJ0aWVzLlNIQTIsXG4gICAgIHByb3BlcnRpZXMuRklMRV9VUkxcbiAgIF0sXG4gIEFHRU5UOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBHUk9VUDogW1xuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgcHJvcGVydGllcy5OQU1FLFxuICAgIHByb3BlcnRpZXMuTUVNQkVSLFxuICAgIHByb3BlcnRpZXMuQUNDT1VOVCxcbiAgICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICAgIHByb3BlcnRpZXMuTUJPWCxcbiAgICBwcm9wZXJ0aWVzLk9QRU5fSURcbiAgXSxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTOiBbXG4gICAgcHJvcGVydGllcy5QQVJFTlQsXG4gICAgcHJvcGVydGllcy5HUk9VUElORyxcbiAgICBwcm9wZXJ0aWVzLkNBVEVHT1JZLFxuICAgIHByb3BlcnRpZXMuT1RIRVJcbiAgXSxcbiAgU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5JRCxcbiAgICBwcm9wZXJ0aWVzLkFDVE9SLFxuICAgIHByb3BlcnRpZXMuVkVSQixcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVCxcbiAgICBwcm9wZXJ0aWVzLlJFU1VMVCxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFQsXG4gICAgcHJvcGVydGllcy5USU1FU1RBTVAsXG4gICAgcHJvcGVydGllcy5TVE9SRUQsXG4gICAgcHJvcGVydGllcy5BVVRIT1JJVFksXG4gICAgcHJvcGVydGllcy5WRVJTSU9OLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFNcbiAgXSxcbiAgU1VCX1NUQVRFTUVOVDogW1xuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTLFxuICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEVcbiAgXSxcbiAgRVhURU5TSU9OUzogW1xuICAgIHByb3BlcnRpZXMuUkVHSVNUUkFUSU9OLFxuICAgIHByb3BlcnRpZXMuSU5TVFJVQ1RPUixcbiAgICBwcm9wZXJ0aWVzLlRFQU0sXG4gICAgcHJvcGVydGllcy5DT05URVhUX0FDVElWSVRJRVMsXG4gICAgcHJvcGVydGllcy5SRVZJU0lPTixcbiAgICBwcm9wZXJ0aWVzLlBMQVRGT1JNLFxuICAgIHByb3BlcnRpZXMuTEFOR1VBR0UsXG4gICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgcHJvcGVydGllcy5FWFRFTlNJT05TXG4gIF1cbn0pO1xuXG4gZXhwb3J0IHt4YXBpV2hpdGVMaXN0UHJvcGVydGllc307XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleH0gZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7b2JqZWN0VHlwZXN9IGZyb20gJy4uL2NvbnN0YW50cy9wcm9wZXJ0aWVzJztcblxuY29uc3RcbiAgSVNfU1RSSU5HICA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICBJU19BUlJBWSAgID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgSVNfQk9PTEVBTiA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgSVNfTlVNQkVSICA9ICdbb2JqZWN0IE51bWJlcl0nO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHhhcGlWYWxpZGF0aW9uVXRpbHM7XG5cbnhhcGlWYWxpZGF0aW9uVXRpbHMgPSB7XG4gIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX1NUUklORztcbiAgfSxcblxuICBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKTtcbiAgfSxcblxuICBpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX0FSUkFZO1xuICB9LFxuXG4gIGlzQm9vbGVhbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSBJU19CT09MRUFOO1xuICB9LFxuXG4gIGlzTnVtYmVyKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX05VTUJFUjtcbiAgfSxcblxuICBpc0RlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuIChvYmogIT09IG51bGwgfHwgb2JqICE9PSB1bmRlZmluZWQpO1xuICB9LFxuXG4gIGlzTm9uTnVsbE1hcE9iamVjdCh0YXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCh0YXJnZXQpICYmIHRoaXMuaXNPYmplY3QodGFyZ2V0KSAmJiAhdGhpcy5pc0FycmF5KHRhcmdldCk7XG4gIH0sXG5cbiAgaXNWYWxpZExhbmd1YWdlVGFnKHRhcmdldCkge1xuICAgIC8vIFRPRE8gLSB1c2UgbW9yZSBwcmVjaXNlIDU2NDYgaGFuZGxpbmcsIHJhdGhlciB0aGFuIHRoaXMgc2ltcGxpZmllZCBCQ1AgNDcgcmVnZXgsIHdoaWNoIGNvbWJpbmVzIFJGQyA1NjQ2IGFuZCBSRkMgNDY0Ny5cbiAgICByZXR1cm4gdGhpcy5pc0RlZmluZWQodGFyZ2V0KSAmJiB0aGlzLmlzU3RyaW5nKHRhcmdldCkgJiYgeGFwaVZhbGlkYXRpb25SZWdleC5CQ1BfNDcudGVzdCh0YXJnZXQpO1xuICB9LFxuXG4gIGFkZFByb3BUb1RyYWNlKHRyYWNlLCBhZGRlbmR1bSkge1xuICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZChhZGRlbmR1bSkgPyBgJHt0cmFjZX0uJHthZGRlbmR1bX1gIDogdHJhY2U7XG4gIH0sXG5cbiAgYWRkTG9va3VwVG9UcmFjZSh0cmFjZSwga2V5KSB7XG4gICAgcmV0dXJuICghdGhpcy5pc0RlZmluZWQoa2V5KSkgPyB0cmFjZSA6ICh0aGlzLmlzTnVtYmVyKGtleSkgPyBgJHt0cmFjZX1bJHtrZXl9XWAgOiBgJHt0cmFjZX1bXCIke2tleX1cIl1gKTtcbiAgfSxcblxuICBsb2NhbFRyYWNlVG9TdHJpbmcodHJhY2UsIGFkZGVuZHVtKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkUHJvcFRvVHJhY2UodHJhY2UsIGFkZGVuZHVtKTtcbiAgfSxcblxuICBpc0dyb3VwKGFjdG9yT3JHcm91cCkge1xuICAgIHJldHVybiAoYWN0b3JPckdyb3VwLm1lbWJlciAhPT0gbnVsbCAmJiBhY3Rvck9yR3JvdXAubWVtYmVyICE9PSB1bmRlZmluZWQpIHx8IGFjdG9yT3JHcm91cC5vYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUDtcbiAgfVxufTtcblxuZXhwb3J0IHt4YXBpVmFsaWRhdGlvblV0aWxzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtwcm9wZXJ0aWVzLCBvYmplY3RUeXBlcywgeGFwaVZhbGlkYXRpb25JZmlQcm9wZXJ0eU5hbWVzLCB4QXBpVmFsaWRPYmplY3RUeXBlc30gZnJvbSAnLi9jb25zdGFudHMvcHJvcGVydGllcyc7XG5pbXBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfSBmcm9tICcuL2NvbnN0YW50cy93aGl0ZWxpc3RzJztcbmltcG9ydCB7eGFwaUVycm9yTGV2ZWxzLCB4YXBpVmFsaWRhdGlvbkVycm9yc30gZnJvbSAnLi9jb25zdGFudHMvZXJyb3JzJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25SZWdleCwgZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zfSBmcm9tICcuL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uSW50ZXJhY3Rpb25UeXBlc30gZnJvbSAnLi9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMnO1xuaW1wb3J0IHt4YXBpR2VuZXJhbH0gZnJvbSAnLi9jb25zdGFudHMvZ2VuZXJhbCc7XG5pbXBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG52YXIgeGFwaVZhbGlkYXRvcjtcblxuZnVuY3Rpb24gbWFrZVYxUmVwb3J0KGluc3RhbmNlLCBlcnJvcnMpIHtcbiAgdmFyIHZlcnNpb247XG5cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZSB8fCBudWxsO1xuICBlcnJvcnMgICA9IGVycm9ycyAgIHx8IG51bGw7XG4gIHZlcnNpb24gID0geGFwaUdlbmVyYWwuRklSU1RfUkVQT1JUX1ZFUlNUSU9OO1xuICByZXR1cm4ge2luc3RhbmNlLCBlcnJvcnMsIHZlcnNpb259O1xufVxuXG5mdW5jdGlvbiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChpbnN0YW5jZSwgZXJyb3IpIHtcbiAgcmV0dXJuIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCA/IFtdIDogW2Vycm9yXSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHRhcmdldCwgYWxsb3dlZFByb3BlcnRpZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuXG4gIGZvciAocHJvcGVydHlOYW1lIGluIHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSAmJiBhbGxvd2VkUHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5TmFtZSkgPT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5VTkVYUEVDVEVELFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkLCB2aW9sYXRpb25UeXBlKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlLCBsb2NhbFZpb2xhdGlvblR5cGU7XG5cbiAgbG9jYWxFcnJvcnMgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgICAgICAgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdLFxuICBsb2NhbFZpb2xhdGlvblR5cGUgPSB2aW9sYXRpb25UeXBlIHx8IHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTjtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgbG9jYWxWaW9sYXRpb25UeXBlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIGxvY2FsVmlvbGF0aW9uVHlwZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHRhcmdldFtwcm9wZXJ0eU5hbWVdO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1VSSV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4LklSSS50ZXN0KHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0lSSV9TVFJJTkd9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfVVJJX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzVXJsKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIC8vIFRPRE8gLSBjaGVjayB3aGV0aGVyIGEgZm9ybWFsIFVSTCBmb3JtYXQgZGVmaW5pdGlvbiBpcyByZWNvbW1lbmRlZC9lbmZvcmNlZCBmb3IgeEFQSVxuICByZXR1cm4gdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG4gIHByb3BWYWx1ZSAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0Jvb2xlYW4ocHJvcFZhbHVlKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0JPT0xFQU59YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX0JPT0xFQU5fUFJFU0VOVH1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTnVtYmVyKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9OVU1CRVJ9YCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfTlVNQkVSX1BSRVNFTlR9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUlGSVByb3BlcnRpZXModGFyZ2V0LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgYWNjb3VudFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcblxuICBpZiAodGFyZ2V0Lm1ib3ggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQubWJveCAhPT0gbnVsbCkge1xuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQk9YKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSUZJX01VU1RfQkVfTUJPWF9VUkksXG4gICAgICAgIGxldmVsOiB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXhhcGlWYWxpZGF0aW9uUmVnZXguTUFJTFRPX1VSSS50ZXN0KHRhcmdldC5tYm94KSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUJPWCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklGSV9NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFULFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQsIHByb3BlcnRpZXMuT1BFTl9JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmICh0YXJnZXQuYWNjb3VudCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC5hY2NvdW50ICE9PSBudWxsKSB7XG4gICAgYWNjb3VudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDQ09VTlQpO1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc1VyaSh0YXJnZXQuYWNjb3VudCwgcHJvcGVydGllcy5IT01FX1BBR0UsYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuTkFNRSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlKTtcbiAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQuYWNjb3VudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuSUZJLCBhY2NvdW50VHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJcyh0YXJnZXQpIHtcbiAgdmFyIGlmaXM7XG5cbiAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHVuZGVmaW5lZCkge3JldHVybiBbXTt9XG5cbiAgaWZpcyA9IHhhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+IHtcbiAgICBpZiAodGFyZ2V0W25hbWVdICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0W25hbWVdICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge2tleTogbmFtZSwgdmFsdWU6IHRhcmdldFtuYW1lXX07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaWZpcztcbn1cblxuZnVuY3Rpb24gZ2V0SUZJQ291bnQodGFyZ2V0KSB7XG4gIHJldHVybiBnZXRJRklzKHRhcmdldCkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW10sXG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuRVhURU5TSU9OUztcblxuICBpZiAoZXh0ZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGV4dGVuc2lvbnMpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRVhURU5TSU9OU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cbiAgLy8gVE9ETyAtIGRvdWJsZS1jaGVjayB3aGF0IGZ1cnRoZXIgZW5mb3JjZWFibGUgY29uc3RyYWludHMgZXhpc3Qgb24gZXh0ZW5zaW9uIG9iamVjdCBwcm9wZXJ0aWVzXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVMYW5ndWFnZU1hcChsYW5ndWFnZU1hcCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BOYW1lLCBtYXBwZWRWYWx1ZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5MQU5HVUFHRV9NQVA7XG5cbiAgaWYgKGxhbmd1YWdlTWFwID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QobGFuZ3VhZ2VNYXApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBmb3IgKHByb3BOYW1lIGluIGxhbmd1YWdlTWFwKSB7XG5cbiAgICBpZiAobGFuZ3VhZ2VNYXAuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKHByb3BOYW1lKSkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wTmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5MQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUR9YCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG1hcHBlZFZhbHVlID0gbGFuZ3VhZ2VNYXBbcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobWFwcGVkVmFsdWUgPT09IG51bGwgfHwgbWFwcGVkVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhtYXBwZWRWYWx1ZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BOYW1lKSxcbiAgICAgICAgICBtZXNzYWdlOiBgJHtwcm9wTmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5MQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HfWAsXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJiKHZlcmIsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUkI7XG5cbiAgaWYgKHZlcmIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5WRVJCX01VU1RfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QodmVyYikpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodmVyYiwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmICh2ZXJiLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAodmVyYi5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHZlcmIsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlVSSSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KGNvbXBvbmVudHMsIGludGVyYWN0aW9uVHlwZSwgYWxsb3dlZEludGVyYWN0aW9uVHlwZXMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBpc0FsbG93ZWRDb21wb25lbnRUeXBlLCBpZHMsIHBlckNvbXBvbmVudFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzICAgICAgICAgICAgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgICAgICAgICAgICAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5JTlRFUkFDVElPTl9DT01QT05FTlRTO1xuICBpc0FsbG93ZWRDb21wb25lbnRUeXBlID0gYWxsb3dlZEludGVyYWN0aW9uVHlwZXMuaW5kZXhPZihpbnRlcmFjdGlvblR5cGUpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORDtcbiAgaWRzICAgICAgICAgICAgICAgICAgICA9IFtdO1xuXG4gIGlmIChpc0FsbG93ZWRDb21wb25lbnRUeXBlICYmIGNvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChjb21wb25lbnRzID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoY29tcG9uZW50cykpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9DT01QT05FTlRfU0hPVUxEX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoaW50ZXJhY3Rpb25Db21wb25lbnQsIGkpID0+IHtcbiAgICAgICAgcGVyQ29tcG9uZW50VHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSk7XG5cbiAgICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChpbnRlcmFjdGlvbkNvbXBvbmVudCkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHBlckNvbXBvbmVudFRyYWNlLFxuICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoaW50ZXJhY3Rpb25Db21wb25lbnQsIHByb3BlcnRpZXMuSUQsIHBlckNvbXBvbmVudFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICAgICAgICAgIGlmIChpZHMuaW5kZXhPZihpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShwZXJDb21wb25lbnRUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVU5JUVVFLFxuICAgICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZHMucHVzaChpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGludGVyYWN0aW9uQ29tcG9uZW50LmlkICYmIHhhcGlWYWxpZGF0aW9uUmVnZXguQ09OVEFJTlNfV0hJVEVTUEFDRS50ZXN0KGludGVyYWN0aW9uQ29tcG9uZW50LmlkKSkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9TSE9VTERfTk9UX0NPTlRBSU5fV0hJVEVTUEFDRVMsXG4gICAgICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGludGVyYWN0aW9uQ29tcG9uZW50LmRlc2NyaXB0aW9uLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICAgIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGludGVyYWN0aW9uQ29tcG9uZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5DT01QT05FTlRfQVJSQVksIHBlckNvbXBvbmVudFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfVxuICB9IGVsc2UgaWYgKGludGVyYWN0aW9uVHlwZSAmJiBjb21wb25lbnRzKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICBsb2NhbFRyYWNlLFxuICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX1ZBTElEfSAke2ludGVyYWN0aW9uVHlwZX1gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eURlZmludGlvbihkZWZpbml0aW9uLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgICAgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuREVGSU5JVElPTjtcbiAgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOKTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGRlZmluaXRpb24ubmFtZSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk5BTUUpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoZGVmaW5pdGlvbi5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLlRZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1VybChkZWZpbml0aW9uLCBwcm9wZXJ0aWVzLk1PUkVfSU5GTywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKGRlZmluaXRpb24uZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgaWYgKGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50eXBlICE9PSB4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEUpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRZUEUpLFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9BQ1RJVklUWV9TSE9VTERfSEFWRX0gXCIke3hhcGlHZW5lcmFsLklOVEVSQUNUSU9OX0RFRklOSVRJT05fVFlQRX1cImAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoeGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5URVJBQ1RJT05fVFlQRSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9DTUksXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGRlZmluaXRpb24uY29ycmVjdFJlc3BvbnNlc1BhdHRlcm4pKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgY29ycmVjdFJlc3BvbnNlc1BhdHRlcm5UcmFjZSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX0FSUkFZLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuLmZvckVhY2goKHJlc3BvbnNlLCBpKSA9PiB7XG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHJlc3BvbnNlKSkge1xuICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsIGkpLFxuICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTl9NVVNUX0JFX1NUUklOR1MsXG4gICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uY2hvaWNlcyxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5DSE9JQ0UsIHByb3BlcnRpZXMuU0VRVUVOQ0lOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNIT0lDRVMpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc2NhbGUsXG4gICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgW3Byb3BlcnRpZXMuTElLRVJUXSxcbiAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0NBTEUpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc291cmNlLFxuICAgIGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlLFxuICAgIFtwcm9wZXJ0aWVzLk1BVENISU5HXSxcbiAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU09VUkNFKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICBkZWZpbml0aW9uLnRhcmdldCxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRBUkdFVCksXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgZGVmaW5pdGlvbi5zdGVwcyxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5QRVJGT1JNQU5DRV0sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNURVBTKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGRlZmluaXRpb24sIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkFDVElWSVRZX0RFRklOSVRJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RJVklUWTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFjdGl2aXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1VyaShhY3Rpdml0eSwgcHJvcGVydGllcy5JRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL3RydWUpO1xuXG4gIGlmIChhY3Rpdml0eS5kZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZUFjdGl2aXR5RGVmaW50aW9uKFxuICAgICAgYWN0aXZpdHkuZGVmaW5pdGlvbixcbiAgICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERUZJTklUSU9OKSxcbiAgICAgIGxvY2FsRXJyb3JzXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFjdGl2aXR5LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnRSZWYoc3RhdGVtZW50UmVmLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlRfUkVGO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50UmVmKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuXG4gIGlmIChzdGF0ZW1lbnRSZWYub2JqZWN0VHlwZSAhPT0gb2JqZWN0VHlwZXMuU1RBVEVNRU5UX1JFRikge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9UWVBFX01VU1RfQkVfU1RBVEVNRU5UX1JFRixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFzdGF0ZW1lbnRSZWYuaWQgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KHN0YXRlbWVudFJlZi5pZCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElEX1VVSURfUkVGLFxuICAgICAgbGV2ZWw6ICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKHN0YXRlbWVudFJlZiwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29yZShzY29yZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU0NPUkU7XG5cbiAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5TQ0FMRUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgaWYgKHNjb3JlLnNjYWxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNjb3JlLnNjYWxlZCA8IHhhcGlHZW5lcmFsLk1JTl9TQ0FMRURfVkFMVUUgfHwgc2NvcmUuc2NhbGVkID4geGFwaUdlbmVyYWwuTUFYX1NDQUxFRF9WQUxVRSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ0FMRUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2NvcmUubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuTUlOLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gICAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SQVcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NvcmUubWF4ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUubWF4IDwgc2NvcmUubWluKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NQVgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk1BWF9NVVNUX0JFX0dSRUFURVJfVEhBTl9NSU4sXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1BWCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgIGlmIChzY29yZS5yYXcgIT09IHVuZGVmaW5lZCAmJiBzY29yZS5yYXcgPiBzY29yZS5tYXgpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkFXX01VU1RfQkVfTEVTU19USEFOX01BWCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuUkFXLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzY29yZSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU0NPUkUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzdWx0KHJlc3VsdCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuUkVTVUxUO1xuXG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChyZXN1bHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVTY29yZShyZXN1bHQuc2NvcmUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TQ09SRSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuU1VDQ0VTUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzQm9vbGVhbihyZXN1bHQsIHByb3BlcnRpZXMuQ09NUExFVElPTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHJlc3VsdCwgcHJvcGVydGllcy5SRVNQT05TRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVFeHRlbnNpb25zKHJlc3VsdC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcblxuICBpZiAocmVzdWx0LmR1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHJlc3VsdC5kdXJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXN1bHQuZHVyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LklTT184NjAxX0RVUkFUSU9OLnRlc3QocmVzdWx0LmR1cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5EVVJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EVVJBVElPTl9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhyZXN1bHQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlJFU1VMVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1hdGNoZWQsIGRhdGV0aW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRBVEVfVElNRTtcbiAgZGF0ZXRpbWUgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAoZGF0ZXRpbWUgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKGRhdGV0aW1lID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGRhdGV0aW1lKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1NUUklOR31gLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBtYXRjaGVkID0geGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EQVRFX1RJTUUuZXhlYyhkYXRldGltZSk7XG5cbiAgaWYgKG1hdGNoZWQpIHtcbiAgICBpZiAoIWRhdGVJbmNsdWRlc1pvbmVJbmZvcm1hdGlvbihtYXRjaGVkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRBVEVfU0hPVUxEX0lOQ0xVREVfWk9ORV9JTkZPUk1BVElPTixcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX01VU1RfQkVfVkFMSUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24sIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlZFUlNJT047XG5cbiAgaWYgKHZlcnNpb24gPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHZlcnNpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodmVyc2lvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguU0VNVkVSXzFfUF8wX1BfMC50ZXN0KHZlcnNpb24pKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUlNJT05fTVVTVF9DT01QTFlfU0VNQU5USUNfVkVSU0lPTklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dGFjaG1lbnRPYmplY3QoYXR0YWNobWVudCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgfHwgcHJvcGVydGllcy5BVFRBQ0hNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXR0YWNobWVudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKGF0dGFjaG1lbnQuZGlzcGxheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRElTUExBWV9TSE9VTERfQkVfUFJPVklERUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kaXNwbGF5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRElTUExBWSksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIHZhbGlkYXRlTGFuZ3VhZ2VNYXAoYXR0YWNobWVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5VU0FHRV9UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi90cnVlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYXR0YWNobWVudCwgcHJvcGVydGllcy5GSUxFX1VSTCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIC8vIFRPRE8gLSBtb3JlIGNvbXBsZXRlIHZhbGlkYXRpb24gZm9yIEludGVybmV0IE1lZGlhIFR5cGUgdmlhIFJGQyAyMDQ2XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhdHRhY2htZW50LCBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICBpZiAoYXR0YWNobWVudC5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBhdHRhY2htZW50Lmxlbmd0aCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihhdHRhY2htZW50Lmxlbmd0aCkgfHwgKGF0dGFjaG1lbnQubGVuZ3RoICUgMSAhPT0gMCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEVOR1RIKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxFTkdUSF9NVVNUX0JFX0lOVEVHRVIsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LnNoYTIgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9CRV9QUk9WSURFRF9PTl9BVFRBQ0hNRU5UX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhdHRhY2htZW50LnNoYTIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoYXR0YWNobWVudC5zaGEyKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5CQVNFXzY0LnRlc3QoYXR0YWNobWVudC5zaGEyKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TSEEyKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNIQTJfTVVTVF9DT05UQUlOX0JBU0VfNjRfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhdHRhY2htZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BVFRBQ0hNRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50cyhhdHRhY2htZW50cywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQVRUQUNITUVOVFM7XG5cbiAgaWYgKGF0dGFjaG1lbnRzID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGF0dGFjaG1lbnRzKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BVFRBQ0hNRU5UU19NVVNUX0JFX05PVF9OVUxMX0FSUkFZLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBhdHRhY2htZW50cy5mb3JFYWNoKChhdHRhY2htZW50LCBpKSA9PiB7XG4gICAgdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICB9KTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWdlbnQoYWdlbnQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBpZmlDb3VudDtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BR0VOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGFnZW50KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZmlDb3VudCA9IGdldElGSUNvdW50KGFnZW50KTtcblxuICBpZiAoaWZpQ291bnQgIT09IHhhcGlHZW5lcmFsLk5VTUVSX09GX1NQRUNJRklFRF9JRklfUFJPUEVSVElFUykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9JRklfUFJPUEVSVElFU19NVVNUX0JFX1NQRUNJRklFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFnZW50Lm9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkdST1VQKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFHRU5UX01VU1RfTk9UX0hBVkVfR1JPVVBfQ0hBUkFDVEVSSVNUSUNTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUlGSVByb3BlcnRpZXMoYWdlbnQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGFnZW50LCBwcm9wZXJ0aWVzLk5BTUUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoYWdlbnQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkFHRU5ULCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdyb3VwKGdyb3VwLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgbWVtYmVyVHJhY2UsIGlmaUNvdW50O1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkdST1VQO1xuICBtZW1iZXJUcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NRU1CRVIpO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoZ3JvdXApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWZpQ291bnQgPSBnZXRJRklDb3VudChncm91cCk7XG5cbiAgaWYgKGlmaUNvdW50ID09PSAwKSB7XG4gICAgaWYgKGdyb3VwLm1lbWJlciA9PT0gbnVsbCB8fCBncm91cC5tZW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIG1lbWJlclRyYWNlLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NRU1CRVJfTVVTVF9CRV9QUk9WSURFRF9GT1JfQU5PTllNT1VTX0dST1VQUyxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaWZpQ291bnQgPiB4YXBpR2VuZXJhbC5OVU1FUl9PRl9TUEVDSUZJRURfSUZJX1BST1BFUlRJRVMpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfSUZJX1BST1BFUlRJRVNfTVVTVF9CRV9TUEVDSUZJRUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlSUZJUHJvcGVydGllcyhncm91cCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhncm91cCwgcHJvcGVydGllcy5OQU1FLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmIChncm91cC5tZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChncm91cC5tZW1iZXIgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShncm91cC5tZW1iZXIpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5NRU1CRVIpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAubWVtYmVyLmZvckVhY2goKG1lbWJlciwgaSkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFnZW50KG1lbWJlciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKG1lbWJlclRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoZ3JvdXAsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkdST1VQLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdG9yKGFjdG9yLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5BQ1RPUjtcblxuICBpZiAoYWN0b3IgPT09IG51bGwgfHwgYWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BQ1RPUl9NVVNUX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc0dyb3VwKGFjdG9yKSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYWN0b3IsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXR5KGF1dGhvcml0eSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQVVUSE9SSVRZO1xuXG4gIGlmIChhdXRob3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoYXV0aG9yaXR5KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BVVRIT1JJVFlfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhdXRob3JpdHkpKSB7XG4gICAgdmFsaWRhdGVHcm91cChhdXRob3JpdHksIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICBpZiAoIWF1dGhvcml0eS5tZW1iZXIgfHwgIWF1dGhvcml0eS5tZW1iZXIubGVuZ3RoIHx8IGF1dGhvcml0eS5tZW1iZXIubGVuZ3RoICE9PSB4YXBpR2VuZXJhbC5HUk9VUF9BVVRIT1JJVFlfQUdFTlRfTUVNQkVSUykge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUVNQkVSKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV08sXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlQWdlbnQoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChzdWJDb250ZXh0LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVUJfQ09OVEVYVDtcblxuICBpZiAoc3ViQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoc3ViQ29udGV4dCA9PT0gbnVsbCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX0FDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdWJDb250ZXh0KSkge1xuICAgIHN1YkNvbnRleHQuZm9yRWFjaCgoYWN0aXZpdHksIGkpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZpdHkoYWN0aXZpdHksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBpKSwgbG9jYWxFcnJvcnMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3ViQ29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICB2YWxpZGF0ZUFjdGl2aXR5KHN1YkNvbnRleHQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgfSBlbHNlIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfQVJSQVlfT1JfQUNUSVZJVFlfT0JKLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OfSk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0aWVzKGNvbnRleHRBY3Rpdml0aWVzLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5DT05URVhUX0FDVElWSVRJRVM7XG5cbiAgaWYgKGNvbnRleHRBY3Rpdml0aWVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGNvbnRleHRBY3Rpdml0aWVzKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX0FDVElWSVRJRVNfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLnBhcmVudCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBBUkVOVCksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLmdyb3VwaW5nLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuR1JPVVBJTkcpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5jYXRlZ29yeSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNBVEVHT1JZKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMub3RoZXIsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PVEhFUiksIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhjb250ZXh0QWN0aXZpdGllcywgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHQoY29udGV4dCwgdHJhY2UsIGVycm9ycywgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgPSB0cmFjZSB8fCBwcm9wZXJ0aWVzLkNPTlRFWFQ7XG5cbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfTVVTVF9CRV9OT05fTlVMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmIChjb250ZXh0LnJlZ2lzdHJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIChjb250ZXh0LnJlZ2lzdHJhdGlvbiA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhjb250ZXh0LnJlZ2lzdHJhdGlvbikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguVVVJRC50ZXN0KGNvbnRleHQucmVnaXN0cmF0aW9uKSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVHSVNUUkFUSU9OKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFR0lTVFJBVElPTl9NVVNUX0JFX1VVSURfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoW29iamVjdFR5cGVzLkdST1VQLCBvYmplY3RUeXBlcy5BR0VOVF0uaW5kZXhPZihzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlKSAhPT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICBpZiAoY29udGV4dC5yZXZpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SRVZJU0lPTiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFVklTSU9OX01VU1RfQkVfQUdFTlRfT1JfR1JPVVAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQucGxhdGZvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUExBVEZPUk0pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5QTEFURk9STV9NVVNUX05PVF9CRV9VU0VEX1dJVEhfUkVWSVNJT05fQUdFTlRfT1JfR1JPVVAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUkVWSVNJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoY29udGV4dCwgcHJvcGVydGllcy5QTEFURk9STSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovZmFsc2UsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgaWYgKGNvbnRleHQudGVhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQudGVhbSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlRFQU0pLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0LmNvbnRleHRBY3Rpdml0aWVzLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQubGFuZ3VhZ2UgIT09IHVuZGVmaW5lZCAmJiAheGFwaVZhbGlkYXRpb25VdGlscy5pc1ZhbGlkTGFuZ3VhZ2VUYWcoY29udGV4dC5sYW5ndWFnZSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTEFOR1VBR0UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTVVTVF9CRV9TVFJJTkcsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LnN0YXRlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVTdGF0ZW1lbnRSZWYoY29udGV4dC5zdGF0ZW1lbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEFURU1FTlQpLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5pbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc0dyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvcikpIHtcbiAgICAgIHZhbGlkYXRlR3JvdXAoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVBZ2VudChjb250ZXh0Lmluc3RydWN0b3IsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JTlNUUlVDVE9SKSwgbG9jYWxFcnJvcnMpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlRXh0ZW5zaW9ucyhjb250ZXh0LmV4dGVuc2lvbnMsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5FWFRFTlNJT05TKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhjb250ZXh0LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5FWFRFTlNJT05TLGxvY2FsVHJhY2UsbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qob2JqZWN0LCB0cmFjZSwgZXJyb3JzLCBpc1dpdGhpblN1YlN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG9iamVjdFR5cGU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuT0JKRUNUO1xuXG4gIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfTVVTVF9CRV9ERUZJTkVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KG9iamVjdCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKG9iamVjdCwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT04pO1xuXG4gIG9iamVjdFR5cGUgPSBvYmplY3Qub2JqZWN0VHlwZSB8fCBvYmplY3RUeXBlcy5BQ1RJVklUWTtcblxuICBzd2l0Y2ggKG9iamVjdFR5cGUpIHtcbiAgICBjYXNlIG9iamVjdFR5cGVzLkFDVElWSVRZOlxuICAgICAgdmFsaWRhdGVBY3Rpdml0eShvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuQUdFTlQ6XG4gICAgICB2YWxpZGF0ZUFnZW50KG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBvYmplY3RUeXBlcy5HUk9VUDpcbiAgICAgIHZhbGlkYXRlR3JvdXAob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG9iamVjdFR5cGVzLlNUQVRFTUVOVF9SRUY6XG4gICAgICB2YWxpZGF0ZVN0YXRlbWVudFJlZihvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuU1VCX1NUQVRFTUVOVDpcbiAgICAgIGlmIChpc1dpdGhpblN1YlN0YXRlbWVudCkge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVUJfU1RBVEVNRU5UX01VU1RfTk9UX0NPTlRBSU5fU1VCX1NUQVRFTUVOVCxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YWxpZGF0ZVN0YXRlbWVudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1N1YlN0YXRlbWVudCovdHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUpLFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1ZBTElEX09QVElPTn0gJHt4QXBpVmFsaWRPYmplY3RUeXBlcy50b1N0cmluZygpfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gIH1cbiAgXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZW1lbnQoc3RhdGVtZW50LCB0cmFjZSwgZXJyb3JzLCBpc1N1YlN0YXRlbWVudCkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUsIHdoaXRlbGlzdGVkUHJvcGVydGllcztcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5TVEFURU1FTlQ7XG5cbiAgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzID0geGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuU1RBVEVNRU5UO1xuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3Qoc3RhdGVtZW50KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfUkVGX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmICghaXNTdWJTdGF0ZW1lbnQpIHtcbiAgICBpZiAoc3RhdGVtZW50LmlkID09PSBudWxsIHx8IHN0YXRlbWVudC5pZCA9PT0gdW5kZWZpbmVkIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHN0YXRlbWVudC5pZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURTX1NIT1VMRF9CRV9HRU5FUkFURURfQllfTFJTLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICgheGFwaVZhbGlkYXRpb25SZWdleC5VVUlELnRlc3Qoc3RhdGVtZW50LmlkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1ZBTElELFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGl0ZWxpc3RlZFByb3BlcnRpZXMgPSB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5TVUJfU1RBVEVNRU5UO1xuICB9XG5cbiAgdmFsaWRhdGVBY3RvcihzdGF0ZW1lbnQuYWN0b3IsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVWZXJiKHN0YXRlbWVudC52ZXJiLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVkVSQiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVPYmplY3Qoc3RhdGVtZW50Lm9iamVjdCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVCksIGxvY2FsRXJyb3JzLCBpc1N1YlN0YXRlbWVudCk7XG4gIHZhbGlkYXRlUmVzdWx0KHN0YXRlbWVudC5yZXN1bHQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5SRVNVTFQpLCBsb2NhbEVycm9ycyk7XG5cbiAgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSA9IHN0YXRlbWVudC5vYmplY3QgJiYgc3RhdGVtZW50Lm9iamVjdC5vYmplY3RUeXBlID8gc3RhdGVtZW50Lm9iamVjdC5vYmplY3RUeXBlIDogb2JqZWN0VHlwZXMuQUNUSVZJVFk7XG5cbiAgdmFsaWRhdGVDb250ZXh0KHN0YXRlbWVudC5jb250ZXh0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09OVEVYVCksIGxvY2FsRXJyb3JzLCBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhzdGF0ZW1lbnQsIHByb3BlcnRpZXMuVElNRVNUQU1QLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLlNUT1JFRCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHZhbGlkYXRlQXV0aG9yaXR5KHN0YXRlbWVudC5hdXRob3JpdHksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BVVRIT1JJVFkpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlVmVyc2lvbihzdGF0ZW1lbnQudmVyc2lvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlZFUlNJT04pLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQXR0YWNobWVudHMoc3RhdGVtZW50LmF0dGFjaG1lbnRzLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQVRUQUNITUVOVFMpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoc3RhdGVtZW50LCB3aGl0ZWxpc3RlZFByb3BlcnRpZXMsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIG1ha2VTdGF0ZW1lbnRSZXBvcnQoc3RhdGVtZW50KSB7XG4gIHZhciBsb2NhbEVycm9ycztcblxuICBsb2NhbEVycm9ycyA9IFtdO1xuICB2YWxpZGF0ZVN0YXRlbWVudChzdGF0ZW1lbnQsIHByb3BlcnRpZXMuU1RBVEVNRU5ULCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIHJldHVybiBtYWtlVjFSZXBvcnQoc3RhdGVtZW50LCBsb2NhbEVycm9ycyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQW1iaWd1b3VzVHlwZVN0YXRlbWVudChzdGF0ZW1lbnQpIHtcbiAgdmFyIHN0YXRlbWVudE9iamVjdDtcblxuICBpZiAoc3RhdGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfQVJHVU1FTlRfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN0YXRlbWVudCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhzdGF0ZW1lbnQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXRlbWVudE9iamVjdCA9IEpTT04ucGFyc2Uoc3RhdGVtZW50KTtcbiAgICAgIGlmIChzdGF0ZW1lbnRPYmplY3QgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3RhdGVtZW50T2JqZWN0KSB8fCB4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3RhdGVtZW50T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoc3RhdGVtZW50T2JqZWN0LCB7XG4gICAgICAgICAgdHJhY2U6ICAgcHJvcGVydGllcy5TVEFURU1FTlQsXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX01VU1RfQkVfUEFSU0VEX0NPUlJFQ1RMWSxcbiAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KHN0YXRlbWVudE9iamVjdCwge1xuICAgICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5WQUxJRF9KU09OfTogJHtlLm1lc3NhZ2V9YCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnRPYmplY3QpO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNPYmplY3Qoc3RhdGVtZW50KSAmJiAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KHN0YXRlbWVudCkpIHtcbiAgICByZXR1cm4gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfQVJHVU1FTlRfSVNfTk9UX1ZBTElELFxuICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGF0ZUluY2x1ZGVzWm9uZUluZm9ybWF0aW9uKG1hdGNoZWQpIHtcbiAgcmV0dXJuIG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlpPTkVdIHx8XG4gICAgICAgICAgKG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlJFTEFUSVZFX1RJTUVdICYmIG1hdGNoZWRbZGF0ZUZvcm1hdFJlZ2V4UG9zaXRpb25zLlRJTUVfWk9ORV9IT1VSXSk7XG59XG5cbnhhcGlWYWxpZGF0b3IgPSB7XG4gIHZhbGlkYXRlU3RhdGVtZW50OiB2YWxpZGF0ZUFtYmlndW91c1R5cGVTdGF0ZW1lbnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHhhcGlWYWxpZGF0b3I7XG53aW5kb3cueGFwaVZhbGlkYXRvciA9IHhhcGlWYWxpZGF0b3I7IC8vRklYTUVcbiJdfQ==\n"]} \ No newline at end of file +{"version":3,"sources":["xapiValidator.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","xapiValidator","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","Object","defineProperty","value","xapiErrorLevels","freeze","MAY_VIOLATION","MUST_VIOLATION","SHOULD_VIOLATION","xapiValidationErrors","ACTIVITIES_MUST_NOT_BE_NULL_MAP_OBJECTS","ACTOR_MUST_BE_PROVIDED","AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED","AGENT_MUST_BE_NON_NULL_MAP_OBJECT","AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS","ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY","ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS","AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ","CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT","CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL","CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY","CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT","CORRECT_RESPONSES_PATTERN_MUST_BE_ARRAY","CORRECT_RESPONSES_PATTERN_MUST_BE_STRINGS","DATE_MUST_BE_VALID","DATE_SHOULD_INCLUDE_ZONE_INFORMATION","DEFINITIONS_MUST_BE_OBJECTS","DISPLAY_SHOULD_BE_PROVIDED","DURATION_MUST_BE_VALID","EXTENSIONS_MUST_NOT_BE_NULL","GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO","GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED","GROUP_MEMBER_MUST_BE_ARRAY","GROUP_MUST_BE_NON_NULL_MAP_OBJECT","ID_MUST_BE_UNIQUE","ID_MUST_BE_VALID_UUID_REF","ID_MUST_BE_VALID","ID_SHOULD_NOT_CONTAIN_WHITESPACES","IDS_SHOULD_BE_GENERATED_BY_LRS","IFI_MUST_BE_MBOX_URI","IFI_MUST_BE_VALID_MBOX_FORMAT","INTERACTION_ACTIVITY_SHOULD_HAVE","INTERACTION_COMPONENT_MUST_NOT_BE_NULL","INTERACTION_COMPONENT_SHOULD_BE_ARRAY","INTERACTION_TYPE_MUST_BE_CMI","INTERACTION_TYPE_MUST_BE_VALID","INVALID_JSON","LANGUAGE_MAP_KEY_INVALID","LANGUAGE_MAP_KEY_MUST_BE_STRING","LANGUAGE_MAPS_MUST_NOT_BE_NULL","LANGUAGE_MUST_BE_STRING","LENGTH_MUST_BE_INTEGER","MAX_MUST_BE_GREATER_THAN_MIN","MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS","MUST_BE_BOOLEAN_PRESENT","MUST_BE_BOOLEAN","MUST_BE_IRI_STRING","MUST_BE_NUMBER_PRESENT","MUST_BE_NUMBER","MUST_BE_PRESENT","MUST_BE_STRING","MUST_BE_URI_PRESENT","MUST_BE_URI_STRING","OBJECT_MUST_BE_DEFINED","OBJECT_MUST_BE_NON_NULL_MAP_OBJECT","OBJECT_TYPE_MUST_BE_STATEMENT_REF","OBJECT_TYPE_MUST_BE_VALID_OPTION","RAW_MUST_BE_GREATER_THAN_MIN","RAW_MUST_BE_LESS_THAN_MAX","REGISTRATION_MUST_BE_UUID_STRING","RESULT_MUST_BE_MAP_OBJECT","REVISION_MUST_BE_AGENT_OR_GROUP","SCALED_MUST_BE_BETWEEN_0_1","SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS","SHA2_MUST_CONTAIN_BASE_64_STRING","STATEMENT_ARGUMENT_IS_NOT_VALID","STATEMENT_ARGUMENT_MUST_BE_PROVIDED","STATEMENT_MUST_BE_PARSED_CORRECTLY","STATEMENT_MUST_NOT_BE_NULL","STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS","SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT","UNEXPECTED","VERB_MUST_BE_PROVIDED","VERB_MUST_NOT_BE_NULL","VERSION_MUST_COMPLY_SEMANTIC_VERSIONING","2","xapiGeneral","FIRST_REPORT_VERSTION","GROUP_AUTHORITY_AGENT_MEMBERS","INTERACTION_DEFINITION_TYPE","MAX_SCALED_VALUE","MIN_SCALED_VALUE","NO_INDEX_FOUND","NUMER_OF_SPECIFIED_IFI_PROPERTIES","3","interactionTypes","CHOICE","FILL_IN","LIKERT","LONG_FILL_IN","MATCHING","NUMERIC","OTHER","PERFORMANCE","SEQUENCING","TRUE_FALSE","xapiValidationInteractionTypes","4","properties","ACCOUNT","ACTIVITY","ACTOR","AGENT","ATTACHMENT","ATTACHMENTS","AUTHORITY","CATEGORY","CHOICES","COMPLETION","CONTENT_TYPE","CONTEXT_ACTIVITIES","CONTEXT","CORRECT_RESPONSES_PATTERN","DATE_TIME","DEFINITION","DESCRIPTION","DISPLAY","DURATION","EXTENSIONS","FILE_URL","GROUP","GROUPING","HOME_PAGE","ID","INSTRUCTOR","INTERACTION_COMPONENTS","INTERACTION_TYPE","LANGUAGE_MAP","LANGUAGE","LENGTH","MAX","MBOX_SHA_1_SUM","MBOX","MEMBER","MIN","MORE_INFO","NAME","OBJECT_TYPE","OBJECT","OPEN_ID","PARENT","PLATFORM","RAW","REGISTRATION","RESPONSE","RESULT","REVISION","SCALE","SCALED","SCORE","SHA2","SOURCE","STATEMENT_REF","STATEMENT","STEPS","STORED","SUB_CONTEXT","SUCCESS","TARGET","TEAM","TIMESTAMP","TYPE","USAGE_TYPE","VERB","VERSION","objectTypes","SUB_STATEMENT","xapiValidationIfiPropertyNames","xApiValidObjectTypes","5","xapiValidationRegex","UUID","ISO_8601_DURATION","ISO_8601_DATE_TIME","MAILTO_URI","CONTAINS_WHITESPACE","SEMVER_1_P_0_P_0","BASE_64","IRI","BCP_47","dateFormatRegexPositions","YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MSECOND","ZONE","RELATIVE_TIME","TIME_ZONE_HOUR","TIME_ZONE_MINUTE","6","xapiWhiteListProperties","undefined","_properties","IFI","URI","COMPONENT_ARRAY","ACTIVITY_DEFINITION","../constants/properties","7","xapiValidationUtils","_regex","IS_STRING","IS_ARRAY","IS_BOOLEAN","IS_NUMBER","toString","prototype","isString","obj","isObject","isArray","Array","isBoolean","isNumber","isDefined","isNonNullMapObject","target","isValidLanguageTag","test","addPropToTrace","trace","addendum","addLookupToTrace","key","localTraceToString","isGroup","actorOrGroup","member","objectType","../constants/regex","8","makeV1Report","instance","errors","version","_general","makeV1SingleErrorReport","error","validateAbsenceOfNonWhitelistedProperties","allowedProperties","localErrors","localTrace","propertyName","hasOwnProperty","indexOf","push","_utils","message","_errors","level","validatePropertyIsString","parent","isRequired","violationType","propValue","localViolationType","validatePropertyIsUri","validatePropertyIsUrl","validatePropertyIsBoolean","validatePropertyIsNumber","validateIFIProperties","accountTrace","mbox","account","_whitelists","getIFIs","ifis","filter","name","getIFICount","validateExtensions","extensions","validateLanguageMap","languageMap","propName","mappedValue","validateVerb","verb","display","validateInteractionComponentArray","components","interactionType","allowedInteractionTypes","isAllowedComponentType","ids","perComponentTrace","forEach","interactionComponent","id","description","validateActivityDefintion","definition","correctResponsesPatternTrace","type","_interactionTypes","correctResponsesPattern","response","choices","scale","source","steps","validateActivity","activity","ACTIVITIES_MUST_NOT_BE_NULL","validateStatementRef","statementRef","validateScore","score","scaled","min","raw","max","validateResult","result","duration","validatePropertyIsISO8601String","matched","datetime","exec","dateIncludesZoneInformation","validateVersion","validateAttachmentObject","attachment","sha2","validateAttachments","attachments","validateAgent","agent","ifiCount","validateGroup","group","memberTrace","validateActor","actor","validateAuthority","authority","validateContextActivitySubContext","subContext","validateContextActivities","contextActivities","grouping","category","other","validateContext","context","statementObjectObjectType","registration","revision","platform","PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP","team","language","statement","instructor","validateObject","object","isWithinSubStatement","validate","isSubStatement","whitelistedProperties","makeStatementReport","validateAmbiguousTypeStatement","statementObject","JSON","parse","validateStatement","./constants/errors","./constants/general","./constants/interaction-types","./constants/properties","./constants/regex","./constants/whitelists","./utils/utils"],"mappings":"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","file":"../xapiValidator.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.xapiValidator = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o _general.xapiGeneral.MAX_SCALED_VALUE) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCALED),\n message: _errors.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.min !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MIN, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (score.max !== undefined && score.max < score.min) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MAX),\n message: _errors.xapiValidationErrors.MAX_MUST_BE_GREATER_THAN_MIN,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n if (score.max !== undefined) {\n validatePropertyIsNumber(score, _properties.properties.MAX, localTrace, localErrors, /*isRequired*/false);\n\n if (score.raw !== undefined && score.raw > score.max) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RAW),\n message: _errors.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsNumber(score, _properties.properties.RAW, localTrace, localErrors, /*isRequired*/false);\n validateAbsenceOfNonWhitelistedProperties(score, _whitelists.xapiWhiteListProperties.SCORE, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateResult(result, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.RESULT;\n\n if (result === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(result)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace),\n message: _errors.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validateScore(result.score, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.SCORE), localErrors);\n validatePropertyIsBoolean(result, _properties.properties.SUCCESS, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsBoolean(result, _properties.properties.COMPLETION, localTrace, localErrors, /*isRequired*/false);\n validatePropertyIsString(result, _properties.properties.RESPONSE, localTrace, localErrors, /*isRequired*/false);\n validateExtensions(result.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n\n if (result.duration !== undefined && (result.duration === null || !_utils.xapiValidationUtils.isString(result.duration) || !_regex.xapiValidationRegex.ISO_8601_DURATION.test(result.duration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DURATION),\n message: _errors.xapiValidationErrors.DURATION_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(result, _whitelists.xapiWhiteListProperties.RESULT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validatePropertyIsISO8601String(parent, propertyName, trace, errors) {\n var localErrors, localTrace, matched, datetime;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.DATE_TIME;\n datetime = parent[propertyName];\n\n if (datetime === undefined) {\n return localErrors;\n }\n\n if (datetime === null || !_utils.xapiValidationUtils.isString(datetime)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: propertyName + ' ' + _errors.xapiValidationErrors.MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n matched = _regex.xapiValidationRegex.ISO_8601_DATE_TIME.exec(datetime);\n\n if (matched) {\n if (!dateIncludesZoneInformation(matched)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n }\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, propertyName),\n message: _errors.xapiValidationErrors.DATE_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateVersion(version, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.VERSION;\n\n if (version === undefined) {\n return localErrors;\n }\n\n if (version === null || !_utils.xapiValidationUtils.isString(version) || !_regex.xapiValidationRegex.SEMVER_1_P_0_P_0.test(version)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validateAttachmentObject(attachment, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(attachment)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (attachment.display === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.DISPLAY),\n message: _errors.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n validateLanguageMap(attachment.display, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DISPLAY), localErrors);\n }\n\n validateLanguageMap(attachment.description, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.DESCRIPTION), localErrors);\n validatePropertyIsUri(attachment, _properties.properties.USAGE_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsUri(attachment, _properties.properties.FILE_URL, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n // TODO - more complete validation for Internet Media Type via RFC 2046\n validatePropertyIsString(attachment, _properties.properties.CONTENT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (attachment.length === undefined || attachment.length === null || !_utils.xapiValidationUtils.isNumber(attachment.length) || attachment.length % 1 !== 0) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LENGTH),\n message: _errors.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (attachment.sha2 === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (attachment.sha2 === null || !_utils.xapiValidationUtils.isString(attachment.sha2) || !_regex.xapiValidationRegex.BASE_64.test(attachment.sha2)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.SHA2),\n message: _errors.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateAbsenceOfNonWhitelistedProperties(attachment, _whitelists.xapiWhiteListProperties.ATTACHMENT, localTrace, localErrors);\n return localErrors;\n}\n\nfunction validateAttachments(attachments, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ATTACHMENTS;\n\n if (attachments === undefined) {\n return localErrors;\n }\n\n if (attachments === null || !_utils.xapiValidationUtils.isArray(attachments)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n attachments.forEach(function (attachment, i) {\n validateAttachmentObject(attachment, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n });\n\n return localErrors;\n}\n\nfunction validateAgent(agent, trace, errors) {\n var localErrors, localTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AGENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(agent)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n ifiCount = getIFICount(agent);\n\n if (ifiCount !== _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (agent.objectType === _properties.objectTypes.GROUP) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(agent, localTrace, localErrors);\n validatePropertyIsString(agent, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n validateAbsenceOfNonWhitelistedProperties(agent, _whitelists.xapiWhiteListProperties.AGENT, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateGroup(group, trace, errors) {\n var localErrors, localTrace, memberTrace, ifiCount;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.GROUP;\n memberTrace = _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.MEMBER);\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(group)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n ifiCount = getIFICount(group);\n\n if (ifiCount === 0) {\n if (group.member === null || group.member === undefined) {\n localErrors.push({\n trace: memberTrace,\n message: _errors.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else if (ifiCount > _general.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n validateIFIProperties(group, localTrace, localErrors);\n\n validatePropertyIsString(group, _properties.properties.NAME, localTrace, localErrors, /*isRequired*/false);\n\n if (group.member !== undefined) {\n if (group.member === null || !_utils.xapiValidationUtils.isArray(group.member)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else {\n group.member.forEach(function (member, i) {\n validateAgent(member, _utils.xapiValidationUtils.addLookupToTrace(memberTrace, i), localErrors);\n });\n }\n }\n\n validateAbsenceOfNonWhitelistedProperties(group, _whitelists.xapiWhiteListProperties.GROUP, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateActor(actor, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.ACTOR;\n\n if (actor === null || actor === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (_utils.xapiValidationUtils.isGroup(actor)) {\n validateGroup(actor, localTrace, localErrors);\n } else {\n validateAgent(actor, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateAuthority(authority, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.AUTHORITY;\n\n if (authority === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(authority)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n if (_utils.xapiValidationUtils.isGroup(authority)) {\n validateGroup(authority, localTrace, localErrors);\n if (!authority.member || !authority.member.length || authority.member.length !== _general.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.MEMBER),\n message: _errors.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n validateAgent(authority, localTrace, localErrors);\n }\n\n return localErrors;\n}\n\nfunction validateContextActivitySubContext(subContext, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.SUB_CONTEXT;\n\n if (subContext === undefined) {\n return localErrors;\n }\n\n if (subContext === null) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n } else if (_utils.xapiValidationUtils.isArray(subContext)) {\n subContext.forEach(function (activity, i) {\n validateActivity(activity, _utils.xapiValidationUtils.addLookupToTrace(localTrace, i), localErrors);\n });\n } else if (_utils.xapiValidationUtils.isObject(subContext)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n\n validateActivity(subContext, localTrace, localErrors);\n } else {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,\n level: _errors.xapiErrorLevels.MUST_VIOLATION });\n }\n return localErrors;\n}\n\nfunction validateContextActivities(contextActivities, trace, errors) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT_ACTIVITIES;\n\n if (contextActivities === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(contextActivities)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n return localErrors;\n }\n\n validateContextActivitySubContext(contextActivities.parent, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.PARENT), localErrors);\n validateContextActivitySubContext(contextActivities.grouping, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.GROUPING), localErrors);\n validateContextActivitySubContext(contextActivities.category, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CATEGORY), localErrors);\n validateContextActivitySubContext(contextActivities.other, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OTHER), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(contextActivities, _whitelists.xapiWhiteListProperties.CONTEXT_ACTIVITIES, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateContext(context, trace, errors, statementObjectObjectType) {\n var localErrors, localTrace;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.CONTEXT;\n\n if (context === undefined) {\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(context)) {\n localErrors.push({\n trace: localTrace,\n message: _errors.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (context.registration !== undefined && (context.registration === null || !_utils.xapiValidationUtils.isString(context.registration) || !_regex.xapiValidationRegex.UUID.test(context.registration))) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REGISTRATION),\n message: _errors.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if ([_properties.objectTypes.GROUP, _properties.objectTypes.AGENT].indexOf(statementObjectObjectType) !== _general.xapiGeneral.NO_INDEX_FOUND) {\n if (context.revision !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.REVISION),\n message: _errors.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.platform !== undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.PLATFORM),\n message: _errors.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n }\n\n validatePropertyIsString(context, _properties.properties.REVISION, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n validatePropertyIsString(context, _properties.properties.PLATFORM, localTrace, localErrors, /*isRequired*/false, _errors.xapiErrorLevels.MUST_VIOLATION);\n\n if (context.team !== undefined) {\n validateGroup(context.team, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.TEAM), localErrors);\n }\n\n if (context.contextActivities !== undefined) {\n validateContextActivities(context.contextActivities, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT_ACTIVITIES), localErrors);\n }\n\n if (context.language !== undefined && !_utils.xapiValidationUtils.isValidLanguageTag(context.language)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.LANGUAGE),\n message: _errors.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (context.statement !== undefined) {\n validateStatementRef(context.statement, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.STATEMENT), localErrors);\n }\n\n if (context.instructor !== undefined) {\n if (_utils.xapiValidationUtils.isGroup(context.instructor)) {\n validateGroup(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n } else {\n validateAgent(context.instructor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.INSTRUCTOR), localErrors);\n }\n }\n\n validateExtensions(context.extensions, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.EXTENSIONS), localErrors);\n validateAbsenceOfNonWhitelistedProperties(context, _whitelists.xapiWhiteListProperties.EXTENSIONS, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction validateObject(object, trace, errors, isWithinSubStatement) {\n var localErrors, localTrace, objectType;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.OBJECT;\n\n if (object === undefined) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(object)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n validatePropertyIsString(object, _properties.properties.OBJECT_TYPE, localTrace, localErrors, /*isRequired*/true, _errors.xapiErrorLevels.SHOULD_VIOLATION);\n\n objectType = object.objectType || _properties.objectTypes.ACTIVITY;\n\n switch (objectType) {\n case _properties.objectTypes.ACTIVITY:\n validateActivity(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.AGENT:\n validateAgent(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.GROUP:\n validateGroup(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.STATEMENT_REF:\n validateStatementRef(object, localTrace, localErrors);\n break;\n case _properties.objectTypes.SUB_STATEMENT:\n if (isWithinSubStatement) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n validate(object, localTrace, localErrors, /*isSubStatement*/true);\n break;\n default:\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.OBJECT_TYPE),\n message: _errors.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION + ' ' + _properties.xApiValidObjectTypes.toString(),\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return localErrors;\n}\n\nfunction validate(statement, trace, errors, isSubStatement) {\n var localErrors, localTrace, statementObjectObjectType, whitelistedProperties;\n\n localErrors = errors || [];\n localTrace = trace || _properties.properties.STATEMENT;\n\n whitelistedProperties = _whitelists.xapiWhiteListProperties.STATEMENT;\n\n if (!_utils.xapiValidationUtils.isNonNullMapObject(statement)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace),\n message: _errors.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n\n return localErrors;\n }\n\n if (!isSubStatement) {\n if (statement.id === null || statement.id === undefined || !_utils.xapiValidationUtils.isString(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,\n level: _errors.xapiErrorLevels.SHOULD_VIOLATION\n });\n } else if (!_regex.xapiValidationRegex.UUID.test(statement.id)) {\n localErrors.push({\n trace: _utils.xapiValidationUtils.localTraceToString(localTrace, _properties.properties.ID),\n message: _errors.xapiValidationErrors.ID_MUST_BE_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } else {\n whitelistedProperties = _whitelists.xapiWhiteListProperties.SUB_STATEMENT;\n }\n\n validateActor(statement.actor, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ACTOR), localErrors);\n validateVerb(statement.verb, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERB), localErrors);\n validateObject(statement.object, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.OBJECT), localErrors, isSubStatement);\n validateResult(statement.result, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.RESULT), localErrors);\n\n statementObjectObjectType = statement.object && statement.object.objectType ? statement.object.objectType : _properties.objectTypes.ACTIVITY;\n\n validateContext(statement.context, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.CONTEXT), localErrors, statementObjectObjectType);\n validatePropertyIsISO8601String(statement, _properties.properties.TIMESTAMP, localTrace, localErrors);\n validatePropertyIsISO8601String(statement, _properties.properties.STORED, localTrace, localErrors);\n\n validateAuthority(statement.authority, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.AUTHORITY), localErrors);\n validateVersion(statement.version, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.VERSION), localErrors);\n validateAttachments(statement.attachments, _utils.xapiValidationUtils.addPropToTrace(localTrace, _properties.properties.ATTACHMENTS), localErrors);\n\n validateAbsenceOfNonWhitelistedProperties(statement, whitelistedProperties, localTrace, localErrors);\n\n return localErrors;\n}\n\nfunction makeStatementReport(statement) {\n var localErrors;\n\n localErrors = [];\n validate(statement, _properties.properties.STATEMENT, localErrors, /*isRequired*/false);\n\n return makeV1Report(statement, localErrors);\n}\n\nfunction validateAmbiguousTypeStatement(statement) {\n var statementObject;\n\n if (statement === undefined) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (statement === null) {\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n if (_utils.xapiValidationUtils.isString(statement)) {\n try {\n statementObject = JSON.parse(statement);\n if (statementObject === null || !_utils.xapiValidationUtils.isObject(statementObject) || _utils.xapiValidationUtils.isArray(statementObject)) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n } catch (e) {\n return makeV1SingleErrorReport(statementObject, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.INVALID_JSON + ': ' + e.message,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n }\n\n return makeStatementReport(statementObject);\n }\n\n if (_utils.xapiValidationUtils.isObject(statement) && !_utils.xapiValidationUtils.isArray(statement)) {\n return makeStatementReport(statement);\n }\n\n return makeV1SingleErrorReport( /*instance*/null, {\n trace: _properties.properties.STATEMENT,\n message: _errors.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,\n level: _errors.xapiErrorLevels.MUST_VIOLATION\n });\n}\n\nfunction dateIncludesZoneInformation(matched) {\n return matched[_regex.dateFormatRegexPositions.ZONE] || matched[_regex.dateFormatRegexPositions.RELATIVE_TIME] && matched[_regex.dateFormatRegexPositions.TIME_ZONE_HOUR];\n}\n\nvar validateStatement = exports.validateStatement = validateAmbiguousTypeStatement;\n\n},{\"./constants/errors\":1,\"./constants/general\":2,\"./constants/interaction-types\":3,\"./constants/properties\":4,\"./constants/regex\":5,\"./constants/whitelists\":6,\"./utils/utils\":7}]},{},[8])(8)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvY29uc3RhbnRzL2Vycm9ycy5qcyIsInNyYy9jb25zdGFudHMvZ2VuZXJhbC5qcyIsInNyYy9jb25zdGFudHMvaW50ZXJhY3Rpb24tdHlwZXMuanMiLCJzcmMvY29uc3RhbnRzL3Byb3BlcnRpZXMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2NvbnN0YW50cy93aGl0ZWxpc3RzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3hhcGlWYWxpZGF0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7QUFFQSxJQUFNLGtCQUFrQixPQUFPLE1BQVAsQ0FBYztBQUNwQyxpQkFBa0IsZUFEa0I7QUFFcEMsa0JBQWtCLGdCQUZrQjtBQUdwQyxvQkFBa0I7QUFIa0IsQ0FBZCxDQUF4Qjs7QUFNQSxJQUFNLHVCQUF1QixPQUFPLE1BQVAsQ0FBYztBQUN6QywyQ0FBa0QseUNBRFQ7QUFFekMsMEJBQWtELHlCQUZUO0FBR3pDLDBDQUFrRCxzRkFIVDtBQUl6QyxxQ0FBa0QsdUNBSlQ7QUFLekMsNkNBQWtELDRFQUxUO0FBTXpDLHNDQUFrRCx5Q0FOVDtBQU96Qyw0Q0FBa0Qsc0RBUFQ7QUFRekMseUNBQWtELHFFQVJUO0FBU3pDLG9EQUFrRCxzR0FUVDtBQVV6QyxrREFBa0QsaUVBVlQ7QUFXekMsdUNBQWtELHdEQVhUO0FBWXpDLHlDQUFrRCxxSEFaVDtBQWF6QyxzQ0FBa0QsbUVBYlQ7QUFjekMsMkNBQWtELDhFQWRUO0FBZXpDLDZDQUFrRCxrREFmVDtBQWdCekMsc0JBQWtELDRFQWhCVDtBQWlCekMsd0NBQWtELG1GQWpCVDtBQWtCekMsK0JBQWtELGtEQWxCVDtBQW1CekMsOEJBQWtELHdDQW5CVDtBQW9CekMsMEJBQWtELHdFQXBCVDtBQXFCekMsK0JBQWtELG9FQXJCVDtBQXNCekMsNkNBQWtELHNJQXRCVDtBQXVCekMsMENBQWtELHFGQXZCVDtBQXdCekMsOEJBQWtELDZEQXhCVDtBQXlCekMscUNBQWtELHVDQXpCVDtBQTBCekMscUJBQWtELHdFQTFCVDtBQTJCekMsNkJBQWtELGtGQTNCVDtBQTRCekMsb0JBQWtELHlCQTVCVDtBQTZCekMscUNBQWtELHlFQTdCVDtBQThCekMsa0NBQWtELG9GQTlCVDtBQStCekMsd0JBQWtELHFGQS9CVDtBQWdDekMsaUNBQWtELDZGQWhDVDtBQWlDekMsb0NBQWtELGlFQWpDVDtBQWtDekMsMENBQWtELDRFQWxDVDtBQW1DekMseUNBQWtELG9FQW5DVDtBQW9DekMsZ0NBQWtELGdGQXBDVDtBQXFDekMsa0NBQWtELHdHQXJDVDtBQXNDekMsZ0JBQWtELGtEQXRDVDtBQXVDekMsNEJBQWtELDRDQXZDVDtBQXdDekMsbUNBQWtELHlEQXhDVDtBQXlDekMsa0NBQWtELDJEQXpDVDtBQTBDekMsMkJBQWtELHFGQTFDVDtBQTJDekMsMEJBQWtELDBEQTNDVDtBQTRDekMsZ0NBQWtELHdGQTVDVDtBQTZDekMsZ0RBQWtELDBEQTdDVDtBQThDekMsMkJBQWtELHVEQTlDVDtBQStDekMsbUJBQWtELDBDQS9DVDtBQWdEekMsc0JBQWtELHVFQWhEVDtBQWlEekMsMEJBQWtELHNEQWpEVDtBQWtEekMsa0JBQWtELHlDQWxEVDtBQW1EekMsbUJBQWtELHNEQW5EVDtBQW9EekMsa0JBQWtELHlDQXBEVDtBQXFEekMsdUJBQWtELDBEQXJEVDtBQXNEekMsc0JBQWtELDZDQXREVDtBQXVEekMsMEJBQWtELHFDQXZEVDtBQXdEekMsc0NBQWtELGtEQXhEVDtBQXlEekMscUNBQWtELHFGQXpEVDtBQTBEekMsb0NBQWtELHFEQTFEVDtBQTJEekMsZ0NBQWtELHdGQTNEVDtBQTREekMsNkJBQWtELHFGQTVEVDtBQTZEekMsb0NBQWtELDhEQTdEVDtBQThEekMsNkJBQWtELDZDQTlEVDtBQStEekMsbUNBQWtELHlGQS9EVDtBQWdFekMsOEJBQWtELCtEQWhFVDtBQWlFekMsK0NBQWtELHdEQWpFVDtBQWtFekMsb0NB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LEVBQThDO0FBQzVDLFNBQU8sUUFBUSxnQ0FBeUIsSUFBakMsS0FDRSxRQUFRLGdDQUF5QixhQUFqQyxLQUFtRCxRQUFRLGdDQUF5QixjQUFqQyxDQUQ1RDtBQUVEOztBQUVNLElBQUksZ0RBQW9CLDhCQUF4QiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHhhcGlFcnJvckxldmVscyA9IE9iamVjdC5mcmVlemUoe1xuICBNQVlfVklPTEFUSU9OOiAgICAnTUFZX1ZJT0xBVElPTicsXG4gIE1VU1RfVklPTEFUSU9OOiAgICdNVVNUX1ZJT0xBVElPTicsXG4gIFNIT1VMRF9WSU9MQVRJT046ICdTSE9VTERfVklPTEFUSU9OJ1xufSk7XG5cbmNvbnN0IHhhcGlWYWxpZGF0aW9uRXJyb3JzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEFDVElWSVRJRVNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgICAgJ0FjdGl2aXRpZXMgbXVzdCBiZSBub24tbnVsbCBtYXAgb2JqZWN0cycsXG4gIEFDVE9SX01VU1RfQkVfUFJPVklERUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdG9yIG11c3QgYmUgcHJvdmlkZWQuJyxcbiAgQUdFTlRfSUZJX1BST1BFUlRJRVNfTVVTVF9CRV9TUEVDSUZJRUQ6ICAgICAgICAgICAnRXhhY3RseSBvbmUgSW52ZXJzZSBGdW5jdGlvbmFsIElkZW50aWZpZXIgcHJvcGVydHkgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIFwiYWdlbnRcIi4nLFxuICBBR0VOVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgICdcImFnZW50XCIgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QnLFxuICBBR0VOVF9NVVNUX05PVF9IQVZFX0dST1VQX0NIQVJBQ1RFUklTVElDUzogICAgICAgICdJbnZhbGlkIG9iamVjdCB3aXRoIGNoYXJhY3RlcmlzdGljcyBvZiBhIEdyb3VwIHdoZW4gYW4gQWdlbnQgd2FzIGV4cGVjdGVkLicsXG4gIEFUVEFDSE1FTlRTX01VU1RfQkVfTk9UX05VTExfQVJSQVk6ICAgICAgICAgICAgICAgJ1wiYXR0YWNobWVudHNcIiBtdXN0IGJlIGEgbm9uLW51bGwgQXJyYXkuJyxcbiAgQVRUQUNITUVOVFNfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUzogICAgICAgICAnXCJhdHRhY2htZW50XCIgaW5zdGFuY2VzIG11c3QgYmUgbm9uLW51bGwgbWFwIG9iamVjdHMuJyxcbiAgQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVDogICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiYXV0aG9yaXR5XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfQVJSQVlfT1JfQUNUSVZJVFlfT0JKOiAnQ29udGV4dCBBY3Rpdml0aWVzIHByb3BlcnR5IHZhbHVlcyBtdXN0IGJlIGFuIGFycmF5IG9mIEFjdGl2aXR5IE9iamVjdHMgb3IgYSBzaW5nbGUgQWN0aXZpdHkgT2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgJ1RoZSBDb250ZXh0IEFjdGl2aXRpZXMgaW5zdGFuY2VzIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0LicsXG4gIENPTlRFWFRfQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgJ1wiQ29udGV4dCBBY3Rpdml0aWVzXCIgcHJvcGVydHkgdmFsdWVzIG11c3Qgbm90IGJlIG51bGwuJyxcbiAgQ09OVEVYVF9BQ1RJVklUSUVTX1NIT1VMRF9CRV9BTl9BUlJBWTogICAgICAgICAgICAnQ29udGV4dCBBY3Rpdml0aWVzIHByb3BlcnR5IHZhbHVlcyBzaG91bGQgcHJlZmVyIHRvIGJlIGFuIGFycmF5IG9mIEFjdGl2aXRpZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQWN0aXZpdHkgb2JqZWN0LicsXG4gIENPTlRFWFRfTVVTVF9CRV9OT05fTlVMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgJ0lmIHByZXNlbnQsIHRoZSBcImNvbnRleHRcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdC4nLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOX01VU1RfQkVfQVJSQVk6ICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgXCJjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblwiIHZhbHVlIG11c3QgYmUgYW4gQXJyYXkgb2Ygc3RyaW5ncy4nLFxuICBDT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOX01VU1RfQkVfU1RSSU5HUzogICAgICAgICdcImNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuXCIgaXRlbXMgbXVzdCBiZSBzdHJpbmdzLicsXG4gIERBVEVfTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgcHJvcGVydHlzIHN0cmluZyB2YWx1ZSBtdXN0IGJlIGNvbmZvcm1hbnQgdG8gSVNPIDg2MDEgZm9yIERhdGUgVGltZXMuJyxcbiAgREFURV9TSE9VTERfSU5DTFVERV9aT05FX0lORk9STUFUSU9OOiAgICAgICAgICAgICAnSVNPIDg2MDEgZGF0ZSB0aW1lIHN0cmluZ3MgdXNlZCBpbiB0aGUgeEFQSSBzaG91bGQgaW5jbHVkZSB0aW1lIHpvbmUgaW5mb3JtYXRpb24uJyxcbiAgREVGSU5JVElPTlNfTVVTVF9CRV9PQkpFQ1RTOiAgICAgICAgICAgICAgICAgICAgICAnXCJkZWZpbml0aW9uc1wiLCB3aGVuIHByZXNlbnQsIG11c3QgYmUgbWFwIG9iamVjdHMnLFxuICBESVNQTEFZX1NIT1VMRF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICAgICAgICAgICdcImRpc3BsYXlcIiBwcm9wZXJ0eSBzaG91bGQgYmUgcHJvdmlkZWQuJyxcbiAgRFVSQVRJT05fTVVTVF9CRV9WQUxJRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiZHVyYXRpb25cIiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGFuIElTTyA4NjAxIGR1cmF0aW9uJyxcbiAgRVhURU5TSU9OU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIGV4dGVuc2lvbnMgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlNfTVVTVF9CRV9UV086ICAgICAgICAnSWYgdXNlZCBhcyBhIEdyb3VwLCB0aGUgXCJhdXRob3JpdHlcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBcIm1lbWJlclwiIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBleGFjdGx5IHR3byBBZ2VudCBvYmplY3RzLicsXG4gIEdST1VQX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVEOiAgICAgICAgICAgJ0V4YWN0bHkgb25lIEludmVyc2UgRnVuY3Rpb25hbCBJZGVudGlmaWVyIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIFwiZ3JvdXBcIi4nLFxuICBHUk9VUF9NRU1CRVJfTVVTVF9CRV9BUlJBWTogICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgbWVtYmVyIHByb3BlcnR5IG9mIGEgR3JvdXAgbXVzdCBiZSBhbiBBcnJheScsXG4gIEdST1VQX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVDogICAgICAgICAgICAgICAgJ1wiZ3JvdXBcIiBtdXN0IGJlIGEgbm9uLW51bGwgbWFwIG9iamVjdCcsXG4gIElEX01VU1RfQkVfVU5JUVVFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBlYWNoIGludGVyYWN0aW9uIGNvbXBvbmVudCBhcnJheScsXG4gIElEX01VU1RfQkVfVkFMSURfVVVJRF9SRUY6ICAgICAgICAgICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRCBzdHJpbmcgZm9yIHN0YXRlbWVudCByZWZlcmVuY2Ugb2JqZWN0cy4nLFxuICBJRF9NVVNUX0JFX1ZBTElEOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJZCB3YXMgbm90IGEgdmFsaWQgVVVJRCcsXG4gIElEX1NIT1VMRF9OT1RfQ09OVEFJTl9XSElURVNQQUNFUzogICAgICAgICAgICAgICAgJ1wiaWRcIiBwcm9wZXJ0aWVzIG9uIGludGVyYWN0aW9uIGNvbXBvbmVudHMgc2hvdWxkIG5vdCBjb250YWluIHdoaXRlc3BhY2UnLFxuICBJRFNfU0hPVUxEX0JFX0dFTkVSQVRFRF9CWV9MUlM6ICAgICAgICAgICAgICAgICAgICdJZHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgQWN0aXZpdHkgUHJvdmlkZXIsIGFuZCBtdXN0IGJlIGdlbmVyYXRlZCBieSB0aGUgTFJTJyxcbiAgSUZJX01VU1RfQkVfTUJPWF9VUkk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJtYm94XCIgcHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgbWFpbHRvIFVSSSBzdHJpbmcgYnV0IHdhcyBub3QgYSBzdHJpbmcgYXQgYWxsLicsXG4gIElGSV9NVVNUX0JFX1ZBTElEX01CT1hfRk9STUFUOiAgICAgICAgICAgICAgICAgICAgJ1wibWJveFwiIHByb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIG1haWx0byBVUkkgc3RyaW5nIGJ1dCBkaWQgbm90IG1hdGNoIHRoZSBtYWlsdG8gZm9ybWF0LicsXG4gIElOVEVSQUNUSU9OX0FDVElWSVRZX1NIT1VMRF9IQVZFOiAgICAgICAgICAgICAgICAgJ0ludGVyYWN0aW9uIEFjdGl2aXR5IERlZmluaXRpb25zIHNob3VsZCBoYXZlIGEgdHlwZSBwcm9wZXJ0eSBvZicsXG4gIElOVEVSQUNUSU9OX0NPTVBPTkVOVF9NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgJ1RoaXMgaW50ZXJhY3Rpb24gY29tcG9uZW50IGNvbGxlY3Rpb24gbWVtYmVyIG11c3QgYmUgYSBub24tbnVsbCBtYXAgb2JqZWN0JyxcbiAgSU5URVJBQ1RJT05fQ09NUE9ORU5UX1NIT1VMRF9CRV9BUlJBWTogICAgICAgICAgICAnVGhpcyBpbnRlcmFjdGlvbiBjb21wb25lbnQgY29sbGVjdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkuJyxcbiAgSU5URVJBQ1RJT05fVFlQRV9NVVNUX0JFX0NNSTogICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIFwiaW50ZXJhY3Rpb25UeXBlXCIgdmFsdWUgbXVzdCBiZSBhIENNSSBpbnRlcmFjdGlvbiB0eXBlIG9wdGlvbi4nLFxuICBJTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfVkFMSUQ6ICAgICAgICAgICAgICAgICAgICdUaGlzIGludGVyYWN0aW9uIGNvbXBvbmVudCBjb2xsZWN0aW9uIHByb3BlcnR5IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZXNlbnQgaW50ZXJhY3Rpb25UeXBlIG9mOiAnLFxuICBJTlZBTElEX0pTT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIEpTT04uIFRoZSBzdGF0ZW1lbnQgY291bGQgbm90IGJlIHBhcnNlZC4nLFxuICBMQU5HVUFHRV9NQVBfS0VZX0lOVkFMSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICdrZXksIExhbmd1YWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gUkZDIDU2NDYnLFxuICBMQU5HVUFHRV9NQVBfS0VZX01VU1RfQkVfU1RSSU5HOiAgICAgICAgICAgICAgICAgICdrZXk6IExhbmd1YWdlIE1hcCB2YWx1ZSBzaG91bGQgYmUgYSBTdHJpbmcsIGJ1dCB3YXMgbm90JyxcbiAgTEFOR1VBR0VfTUFQU19NVVNUX05PVF9CRV9OVUxMOiAgICAgICAgICAgICAgICAgICAnTGFuZ3VhZ2UgTWFwcywgd2hlbiBwcmVzZW50LCBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgTEFOR1VBR0VfTVVTVF9CRV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGxhbmd1YWdlIHByb3BlcnR5IG11c3QgYmUgZW5jb2RlZCBhcyBhbiBSRkMgNTY0NiBjb21wbGlhbnQgc3RyaW5nLCBidXQgd2FzIG5vdC4nLFxuICBMRU5HVEhfTVVTVF9CRV9JTlRFR0VSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdcImxlbmd0aFwiIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQgd2l0aCBhbiBpbnRlZ2VyIHZhbHVlJyxcbiAgTUFYX01VU1RfQkVfR1JFQVRFUl9USEFOX01JTjogICAgICAgICAgICAgICAgICAgICAnSWYgYm90aCBcIm1heFwiIGFuZCBcIm1pblwiIGFyZSBwcmVzZW50LCB0aGUgbWF4IHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gbWluJyxcbiAgTUVNQkVSX01VU1RfQkVfUFJPVklERURfRk9SX0FOT05ZTU9VU19HUk9VUFM6ICAgICAnXCJtZW1iZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkIGZvciBBbm9ueW1vdXMgR3JvdXBzLicsXG4gIE1VU1RfQkVfQk9PTEVBTl9QUkVTRU5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIEJvb2xlYW4gYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9CT09MRUFOOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBCb29sZWFuLicsXG4gIE1VU1RfQkVfSVJJX1NUUklORzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LCBpZiBwcmVzZW50LCBzaG91bGQgYmUgYSBJUkktbGlrZSBhYnNvbHV0ZSBVUkkgcGVyIFJGQyAzOTg3LicsXG4gIE1VU1RfQkVfTlVNQkVSX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5IHdhcyByZXF1aXJlZCB0byBiZSBhIE51bWJlciBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX05VTUJFUjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIE51bWJlci4nLFxuICBNVVNUX0JFX1BSRVNFTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSB3YXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcgYnV0IHdhcyBhYnNlbnQuJyxcbiAgTVVTVF9CRV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHksIGlmIHByZXNlbnQsIG11c3QgYmUgYSBzdHJpbmcuJyxcbiAgTVVTVF9CRV9VUklfUFJFU0VOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkgd2FzIHJlcXVpcmVkIHRvIGJlIGEgVVJJIHN0cmluZyBidXQgd2FzIGFic2VudC4nLFxuICBNVVNUX0JFX1VSSV9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIFVSSSBzdHJpbmcuJyxcbiAgT0JKRUNUX01VU1RfQkVfREVGSU5FRDogICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJvYmplY3RcIiBwcm9wZXJ0eSBtdXN0IGJlIHByb3ZpZGVkLicsXG4gIE9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1Q6ICAgICAgICAgICAgICAgJ1wib2JqZWN0XCIgcHJvcGVydHkgbXVzdCBiZSBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgT0JKRUNUX1RZUEVfTVVTVF9CRV9TVEFURU1FTlRfUkVGOiAgICAgICAgICAgICAgICAnXCJvYmplY3RUeXBlXCIgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBcIlN0YXRlbWVudFJlZlwiIGZvciBzdGF0ZW1lbnQgcmVmZXJlbmNlIG9iamVjdHMuJyxcbiAgT0JKRUNUX1RZUEVfTVVTVF9CRV9WQUxJRF9PUFRJT046ICAgICAgICAgICAgICAgICAnb2JqZWN0XFwncyBcIm9iamVjdFR5cGVcIiBkaWQgbm90IG1hdGNoIGEgdmFsaWQgb3B0aW9uJyxcbiAgUkFXX01VU1RfQkVfR1JFQVRFUl9USEFOX01JTjogICAgICAgICAgICAgICAgICAgICAnSWYgYm90aCBcInJhd1wiIGFuZCBcIm1pblwiIGFyZSBwcmVzZW50LCB0aGUgcmF3IHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gbWluJyxcbiAgUkFXX01VU1RfQkVfTEVTU19USEFOX01BWDogICAgICAgICAgICAgICAgICAgICAgICAnSWYgYm90aCBcInJhd1wiIGFuZCBcIm1heFwiIGFyZSBwcmVzZW50LCB0aGUgcmF3IHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gbWF4JyxcbiAgUkVHSVNUUkFUSU9OX01VU1RfQkVfVVVJRF9TVFJJTkc6ICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBtdXN0IGJlIGEgVVVJRCBzdHJpbmcuJyxcbiAgUkVTVUxUX01VU1RfQkVfTUFQX09CSkVDVDogICAgICAgICAgICAgICAgICAgICAgICAnSWYgcHJlc2VudCwgdGhlIHJlc3VsdCBtdXN0IGJlIGEgbWFwIG9iamVjdCcsXG4gIFJFVklTSU9OX01VU1RfQkVfQUdFTlRfT1JfR1JPVVA6ICAgICAgICAgICAgICAgICAgJ1RoZSByZXZpc2lvbiBwcm9wZXJ0eSBtdXN0IG5vdCBiZSB1c2VkIGlmIHRoZSBTdGF0ZW1lbnRcXCdzIE9iamVjdCBpcyBhbiBBZ2VudCBvciBHcm91cC4nLFxuICBTQ0FMRURfTVVTVF9CRV9CRVRXRUVOXzBfMTogICAgICAgICAgICAgICAgICAgICAgICdJZiBwcmVzZW50LCB0aGUgc2NhbGVkIHByb3BlcnR5IHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxJyxcbiAgU0hBMl9NVVNUX0JFX1BST1ZJREVEX09OX0FUVEFDSE1FTlRfT0JKRUNUUzogICAgICAnXCJzaGEyXCIgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCBvbiBhdHRhY2htZW50IG9iamVjdHMnLFxuICBTSEEyX01VU1RfQ09OVEFJTl9CQVNFXzY0X1NUUklORzogICAgICAgICAgICAgICAgICdcInNoYTJcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gYSBzdHJpbmcgd2l0aCBiYXNlNjQgY29udGVudHMnLFxuICBTVEFURU1FTlRfQVJHVU1FTlRfSVNfTk9UX1ZBTElEOiAgICAgICAgICAgICAgICAgICdTdGF0ZW1lbnQgYXJndW1lbnQgcHJvdmlkZWQgd2FzIG5vdCBhIHZhbGlkIG9iamVjdCBvciBhIHZhbGlkIEpTT04gc3RyaW5nLicsXG4gIFNUQVRFTUVOVF9BUkdVTUVOVF9NVVNUX0JFX1BST1ZJREVEOiAgICAgICAgICAgICAgJ05vIHN0YXRlbWVudCBhcmd1bWVudCBwcm92aWRlZC4nLFxuICBTVEFURU1FTlRfTVVTVF9CRV9QQVJTRURfQ09SUkVDVExZOiAgICAgICAgICAgICAgICdOdWxsIG9yIG5vbi1vYmplY3Qgc3RhdGVtZW50IHZhbHVlIHBhcnNlZCBmcm9tIHByb3ZpZGVkIHN0YXRtZW50IEpTT04uJyxcbiAgU1RBVEVNRU5UX01VU1RfTk9UX0JFX05VTEw6ICAgICAgICAgICAgICAgICAgICAgICAnTnVsbCBzdGF0ZW1lbnQgYXJndW1lbnQgcHJvdmlkZWQuJyxcbiAgU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTOiAgICAgICAnU3RhdGVtZW50UmVmIGluc3RhbmNlcyBtdXN0IGJlIG5vbi1udWxsIG1hcCBvYmplY3RzJyxcbiAgU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQ6ICAgICAnQSBTdWJTdGF0ZW1lbnQgbXVzdCBub3QgY29udGFpbiBhIFN1YlN0YXRlbWVudCcsXG4gIFVORVhQRUNURUQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgcHJvcGVydHkgbm90IHBlcm1pdHRlZCcsXG4gIFZFUkJfTVVTVF9CRV9QUk9WSURFRDogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcmIgbXVzdCBiZSBwcm92aWRlZCcsXG4gIFZFUkJfTVVTVF9OT1RfQkVfTlVMTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZlcmIgcHJvcGVydHkgdmFsdWUgbXVzdCBhIG5vbi1udWxsIG1hcCBvYmplY3QuJyxcbiAgVkVSU0lPTl9NVVNUX0NPTVBMWV9TRU1BTlRJQ19WRVJTSU9OSU5HOiAgICAgICAgICAnXCJ2ZXJzaW9uXCIgbXVzdCBiZSBhIG5vbi1udWxsIHN0cmluZyB0aGF0IGNvbXBsaWVzIHdpdGggU2VtYW50aWMgVmVyc2lvbmluZyAxLjAuMCdcbn0pO1xuXG5leHBvcnQge3hhcGlFcnJvckxldmVsc307XG5leHBvcnQge3hhcGlWYWxpZGF0aW9uRXJyb3JzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeGFwaUdlbmVyYWwgPSBPYmplY3QuZnJlZXplKHtcbiAgRklSU1RfUkVQT1JUX1ZFUlNUSU9OICAgICAgICAgICAgIDogJzEuMC4wJyxcbiAgR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlMgICAgIDogMixcbiAgSU5URVJBQ1RJT05fREVGSU5JVElPTl9UWVBFICAgICAgIDogJ2h0dHA6Ly9hZGxuZXQuZ292L2V4cGFwaS9hY3Rpdml0aWVzL2NtaS5pbnRlcmFjdGlvbicsXG4gIE1BWF9TQ0FMRURfVkFMVUUgICAgICAgICAgICAgICAgICA6IDEsXG4gIE1JTl9TQ0FMRURfVkFMVUUgICAgICAgICAgICAgICAgICA6IDAsXG4gIE5PX0lOREVYX0ZPVU5EICAgICAgICAgICAgICAgICAgICA6IC0xLFxuICBOVU1FUl9PRl9TUEVDSUZJRURfSUZJX1BST1BFUlRJRVMgOiAxXG59KTtcblxuZXhwb3J0IHt4YXBpR2VuZXJhbH07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBjb25zdCBpbnRlcmFjdGlvblR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIENIT0lDRTogICAgICAgJ2Nob2ljZScsXG4gIEZJTExfSU46ICAgICAgJ2ZpbGwtaW4nLFxuICBMSUtFUlQ6ICAgICAgICdsaWtlcnQnLFxuICBMT05HX0ZJTExfSU46ICdsb25nLWZpbGwtaW4nLFxuICBNQVRDSElORzogICAgICdtYXRjaGluZycsXG4gIE5VTUVSSUM6ICAgICAgJ251bWVyaWMnLFxuICBPVEhFUjogICAgICAgICdvdGhlcicsXG4gIFBFUkZPUk1BTkNFOiAgJ3BlcmZvcm1hbmNlJyxcbiAgU0VRVUVOQ0lORzogICAnc2VxdWVuY2luZycsXG4gIFRSVUVfRkFMU0U6ICAgJ3RydWUtZmFsc2UnXG59KTtcblxuZXhwb3J0IGNvbnN0IHhhcGlWYWxpZGF0aW9uSW50ZXJhY3Rpb25UeXBlcyA9IE9iamVjdC5mcmVlemUoW1xuICBpbnRlcmFjdGlvblR5cGVzLkNIT0lDRSxcbiAgaW50ZXJhY3Rpb25UeXBlcy5GSUxMX0lOLFxuICBpbnRlcmFjdGlvblR5cGVzLkxJS0VSVCxcbiAgaW50ZXJhY3Rpb25UeXBlcy5MT05HX0ZJTExfSU4sXG4gIGludGVyYWN0aW9uVHlwZXMuTUFUQ0hJTkcsXG4gIGludGVyYWN0aW9uVHlwZXMuTlVNRVJJQyxcbiAgaW50ZXJhY3Rpb25UeXBlcy5PVEhFUixcbiAgaW50ZXJhY3Rpb25UeXBlcy5QRVJGT1JNQU5DRSxcbiAgaW50ZXJhY3Rpb25UeXBlcy5TRVFVRU5DSU5HLFxuICBpbnRlcmFjdGlvblR5cGVzLlRSVUVfRkFMU0Vcbl0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEFDQ09VTlQ6ICAgICAgICAgICAgICAgICAgICdhY2NvdW50JyxcbiAgQUNUSVZJVFk6ICAgICAgICAgICAgICAgICAgJ2FjdGl2aXR5JyxcbiAgQUNUT1I6ICAgICAgICAgICAgICAgICAgICAgJ2FjdG9yJyxcbiAgQUdFTlQ6ICAgICAgICAgICAgICAgICAgICAgJ2FnZW50JyxcbiAgQVRUQUNITUVOVDogICAgICAgICAgICAgICAgJ2F0dGFjaG1lbnQnLFxuICBBVFRBQ0hNRU5UUzogICAgICAgICAgICAgICAnYXR0YWNobWVudHMnLFxuICBBVVRIT1JJVFk6ICAgICAgICAgICAgICAgICAnYXV0aG9yaXR5JyxcbiAgQ0FURUdPUlk6ICAgICAgICAgICAgICAgICAgJ2NhdGVnb3J5JyxcbiAgQ0hPSUNFOiAgICAgICAgICAgICAgICAgICAgJ2Nob2ljZScsXG4gIENIT0lDRVM6ICAgICAgICAgICAgICAgICAgICdjaG9pY2VzJyxcbiAgQ09NUExFVElPTjogICAgICAgICAgICAgICAgJ2NvbXBsZXRpb24nLFxuICBDT05URU5UX1RZUEU6ICAgICAgICAgICAgICAnY29udGVudFR5cGUnLFxuICBDT05URVhUX0FDVElWSVRJRVM6ICAgICAgICAnY29udGV4dEFjdGl2aXRpZXMnLFxuICBDT05URVhUOiAgICAgICAgICAgICAgICAgICAnY29udGV4dCcsXG4gIENPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk46ICdjb3JyZWN0UmVzcG9uc2VzUGF0dGVybicsXG4gIERBVEVfVElNRTogICAgICAgICAgICAgICAgICdkYXRlVGltZScsXG4gIERFRklOSVRJT046ICAgICAgICAgICAgICAgICdkZWZpbml0aW9uJyxcbiAgREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgRElTUExBWTogICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknLFxuICBEVVJBVElPTjogICAgICAgICAgICAgICAgICAnZHVyYXRpb24nLFxuICBFWFRFTlNJT05TOiAgICAgICAgICAgICAgICAnZXh0ZW5zaW9ucycsXG4gIEZJTEVfVVJMOiAgICAgICAgICAgICAgICAgICdmaWxlVXJsJyxcbiAgR1JPVVA6ICAgICAgICAgICAgICAgICAgICAgJ2dyb3VwJyxcbiAgR1JPVVBJTkc6ICAgICAgICAgICAgICAgICAgJ2dyb3VwaW5nJyxcbiAgSE9NRV9QQUdFOiAgICAgICAgICAgICAgICAgJ2hvbWVQYWdlJyxcbiAgSUQ6ICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJyxcbiAgSU5TVFJVQ1RPUjogICAgICAgICAgICAgICAgJ2luc3RydWN0b3InLFxuICBJTlRFUkFDVElPTl9DT01QT05FTlRTOiAgICAnaW50ZXJhY3Rpb25Db21wb25lbnRzJyxcbiAgSU5URVJBQ1RJT05fVFlQRTogICAgICAgICAgJ2ludGVyYWN0aW9uVHlwZScsXG4gIExBTkdVQUdFX01BUDogICAgICAgICAgICAgICdsYW5ndWFnZU1hcCcsXG4gIExBTkdVQUdFOiAgICAgICAgICAgICAgICAgICdsYW5ndWFnZScsXG4gIExFTkdUSDogICAgICAgICAgICAgICAgICAgICdsZW5ndGgnLFxuICBMSUtFUlQ6ICAgICAgICAgICAgICAgICAgICAnbGlrZXJ0JyxcbiAgTUFUQ0hJTkc6ICAgICAgICAgICAgICAgICAgJ21hdGNoaW5nJyxcbiAgTUFYOiAgICAgICAgICAgICAgICAgICAgICAgJ21heCcsXG4gIE1CT1hfU0hBXzFfU1VNOiAgICAgICAgICAgICdtYm94X3NoYTFzdW0nLFxuICBNQk9YOiAgICAgICAgICAgICAgICAgICAgICAnbWJveCcsXG4gIE1FTUJFUjogICAgICAgICAgICAgICAgICAgICdtZW1iZXInLFxuICBNSU46ICAgICAgICAgICAgICAgICAgICAgICAnbWluJyxcbiAgTU9SRV9JTkZPOiAgICAgICAgICAgICAgICAgJ21vcmVJbmZvJyxcbiAgTkFNRTogICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLFxuICBPQkpFQ1RfVFlQRTogICAgICAgICAgICAgICAnb2JqZWN0VHlwZScsXG4gIE9CSkVDVDogICAgICAgICAgICAgICAgICAgICdvYmplY3QnLFxuICBPUEVOX0lEOiAgICAgICAgICAgICAgICAgICAnb3BlbklEJyxcbiAgT1RIRVI6ICAgICAgICAgICAgICAgICAgICAgJ290aGVyJyxcbiAgUEFSRU5UOiAgICAgICAgICAgICAgICAgICAgJ3BhcmVudCcsXG4gIFBFUkZPUk1BTkNFOiAgICAgICAgICAgICAgICdwZXJmb3JtYW5jZScsXG4gIFBMQVRGT1JNOiAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybScsXG4gIFJBVzogICAgICAgICAgICAgICAgICAgICAgICdyYXcnLFxuICBSRUdJU1RSQVRJT046ICAgICAgICAgICAgICAncmVnaXN0cmF0aW9uJyxcbiAgUkVTUE9OU0U6ICAgICAgICAgICAgICAgICAgJ3Jlc3BvbnNlJyxcbiAgUkVTVUxUOiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCcsXG4gIFJFVklTSU9OOiAgICAgICAgICAgICAgICAgICdyZXZpc2lvbicsXG4gIFNDQUxFOiAgICAgICAgICAgICAgICAgICAgICdzY2FsZScsXG4gIFNDQUxFRDogICAgICAgICAgICAgICAgICAgICdzY2FsZWQnLFxuICBTQ09SRTogICAgICAgICAgICAgICAgICAgICAnc2NvcmUnLFxuICBTRVFVRU5DSU5HOiAgICAgICAgICAgICAgICAnc2VxdWVuY2luZycsXG4gIFNIQTI6ICAgICAgICAgICAgICAgICAgICAgICdzaGEyJyxcbiAgU09VUkNFOiAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZScsXG4gIFNUQVRFTUVOVF9SRUY6ICAgICAgICAgICAgICdzdGF0ZW1lbnRSZWYnLFxuICBTVEFURU1FTlQ6ICAgICAgICAgICAgICAgICAnc3RhdGVtZW50JyxcbiAgU1RFUFM6ICAgICAgICAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgU1RPUkVEOiAgICAgICAgICAgICAgICAgICAgJ3N0b3JlZCcsXG4gIFNVQl9DT05URVhUOiAgICAgICAgICAgICAgICdzdWJDb250ZXh0JyxcbiAgU1VDQ0VTUzogICAgICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnLFxuICBUQVJHRVQ6ICAgICAgICAgICAgICAgICAgICAndGFyZ2V0JyxcbiAgVEVBTTogICAgICAgICAgICAgICAgICAgICAgJ3RlYW0nLFxuICBUSU1FU1RBTVA6ICAgICAgICAgICAgICAgICAndGltZXN0YW1wJyxcbiAgVFlQRTogICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnLFxuICBVU0FHRV9UWVBFOiAgICAgICAgICAgICAgICAndXNhZ2VUeXBlJyxcbiAgVkVSQjogICAgICAgICAgICAgICAgICAgICAgJ3ZlcmInLFxuICBWRVJTSU9OOiAgICAgICAgICAgICAgICAgICAndmVyc2lvbidcbn0pO1xuXG5jb25zdCBvYmplY3RUeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICBHUk9VUDogICAgICAgICAnR3JvdXAnLFxuICBBR0VOVDogICAgICAgICAnQWdlbnQnLFxuICBBQ1RJVklUWTogICAgICAnQWN0aXZpdHknLFxuICBTVEFURU1FTlRfUkVGOiAnU3RhdGVtZW50UmVmJyxcbiAgU1VCX1NUQVRFTUVOVDogJ1N1YlN0YXRlbWVudCdcbn0pO1xuXG5jb25zdCB4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXMgPSBPYmplY3QuZnJlZXplKFtcbiAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLFxuICBwcm9wZXJ0aWVzLk1CT1gsXG4gIHByb3BlcnRpZXMuT1BFTl9JRFxuXSk7XG5cbmNvbnN0IHhBcGlWYWxpZE9iamVjdFR5cGVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIG9iamVjdFR5cGVzLkdST1VQLFxuICBvYmplY3RUeXBlcy5BR0VOVCxcbiAgb2JqZWN0VHlwZXMuQUNUSVZJVFksXG4gIG9iamVjdFR5cGVzLlNUQVRFTUVOVF9SRUYsXG4gIG9iamVjdFR5cGVzLlNVQl9TVEFURU1FTlRcbl0pO1xuXG5leHBvcnQge3Byb3BlcnRpZXN9O1xuZXhwb3J0IHtvYmplY3RUeXBlc307XG5leHBvcnQge3hhcGlWYWxpZGF0aW9uSWZpUHJvcGVydHlOYW1lc307XG5leHBvcnQge3hBcGlWYWxpZE9iamVjdFR5cGVzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeGFwaVZhbGlkYXRpb25SZWdleCA9IE9iamVjdC5mcmVlemUoe1xuICBVVUlEOiAgICAgICAgICAgICAgICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaSxcbiAgSVNPXzg2MDFfRFVSQVRJT046ICAgL15QKChcXGQrKFtcXC4sXVxcZCspP1kpPyhcXGQrKFtcXC4sXVxcZCspP00pPyhcXGQrKFtcXC4sXVxcZCspP1cpPyhcXGQrKFtcXC4sXVxcZCspP0QpPyk/KFQoXFxkKyhbXFwuLF1cXGQrKT9IKT8oXFxkKyhbXFwuLF1cXGQrKT9NKT8oXFxkKyhbXFwuLF1cXGQrKT9TKT8pPyQvLFxuICBJU09fODYwMV9EQVRFX1RJTUU6ICAvXihcXGR7NH18WytcXC1dXFxkezZ9KSg/Oi0oXFxkezJ9KSg/Oi0oXFxkezJ9KSk/KT8oPzpUKFxcZHsyfSk6KFxcZHsyfSkoPzo6KFxcZHsyfSkoPzpcXC4oXFxkezN9KSk/KT8oPzooWil8KFsrXFwtXSkoXFxkezJ9KSg/OjooXFxkezJ9KSk/KT8pPyQvLFxuICBNQUlMVE9fVVJJOiAgICAgICAgICAvXm1haWx0bzovLFxuICBDT05UQUlOU19XSElURVNQQUNFOiAvXFxzL2csXG4gIFNFTVZFUl8xX1BfMF9QXzA6ICAgIC9eKChcXGQrKVxcLihcXGQrKVxcLihcXGQrKSkoPzotKFtcXGRBLVphLXpcXC1dKykpPyQvLFxuICBCQVNFXzY0OiAgICAgICAgICAgICAvXig/OltBLVphLXowLTlcXCtcXC9dezR9KSooPzpbQS1aYS16MC05XFwrXFwvXXsyfT09fFtBLVphLXowLTlcXCtcXC9dezN9PXxbQS1aYS16MC05XFwrXFwvXXs0fSkkLyxcbiAgSVJJOiAgICAgICAgICAgICAgICAgL15bYS16XSg/OltcXC1hLXowLTlcXCtcXC5dKSo6KD86XFwvXFwvKD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpdKSpAKT8oPzpcXFsoPzooPzooPzpbMC05YS1mXXsxLDR9Oil7Nn0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXw6Oig/OlswLTlhLWZdezEsNH06KXs1fSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/OlswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTopezR9KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9KT86Oig/OlswLTlhLWZdezEsNH06KXszfSg/OlswLTlhLWZdezEsNH06WzAtOWEtZl17MSw0fXwoPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKD86XFwuKD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSl7M30pfCg/Oig/OlswLTlhLWZdezEsNH06KXswLDJ9WzAtOWEtZl17MSw0fSk/OjooPzpbMC05YS1mXXsxLDR9Oil7Mn0oPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCwzfVswLTlhLWZdezEsNH0pPzo6WzAtOWEtZl17MSw0fTooPzpbMC05YS1mXXsxLDR9OlswLTlhLWZdezEsNH18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9KXwoPzooPzpbMC05YS1mXXsxLDR9Oil7MCw0fVswLTlhLWZdezEsNH0pPzo6KD86WzAtOWEtZl17MSw0fTpbMC05YS1mXXsxLDR9fCg/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkoPzpcXC4oPzpbMC05XXxbMS05XVswLTldfDFbMC05XVswLTldfDJbMC00XVswLTldfDI1WzAtNV0pKXszfSl8KD86KD86WzAtOWEtZl17MSw0fTopezAsNX1bMC05YS1mXXsxLDR9KT86OlswLTlhLWZdezEsNH18KD86KD86WzAtOWEtZl17MSw0fTopezAsNn1bMC05YS1mXXsxLDR9KT86Oil8dlswLTlhLWZdK1tcXC1hLXowLTlcXC5ffiFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpdKylcXF18KD86WzAtOV18WzEtOV1bMC05XXwxWzAtOV1bMC05XXwyWzAtNF1bMC05XXwyNVswLTVdKSg/OlxcLig/OlswLTldfFsxLTldWzAtOV18MVswLTldWzAtOV18MlswLTRdWzAtOV18MjVbMC01XSkpezN9fCg/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz1AXSkqKSg/OjpbMC05XSopPyg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKnxcXC8oPzooPzooPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKSkrKSg/OlxcLyg/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSopKik/fCg/Oig/Oig/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSspKD86XFwvKD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSkpKikqfCg/ISg/OiVbMC05YS1mXVswLTlhLWZdfFtcXC1hLXowLTlcXC5fflxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRlxcdTEwMDAwLVxcdTFGRkZEXFx1MjAwMDAtXFx1MkZGRkRcXHUzMDAwMC1cXHUzRkZGRFxcdTQwMDAwLVxcdTRGRkZEXFx1NTAwMDAtXFx1NUZGRkRcXHU2MDAwMC1cXHU2RkZGRFxcdTcwMDAwLVxcdTdGRkZEXFx1ODAwMDAtXFx1OEZGRkRcXHU5MDAwMC1cXHU5RkZGRFxcdUEwMDAwLVxcdUFGRkZEXFx1QjAwMDAtXFx1QkZGRkRcXHVDMDAwMC1cXHVDRkZGRFxcdUQwMDAwLVxcdURGRkZEXFx1RTEwMDAtXFx1RUZGRkQhXFwkJidcXChcXClcXCpcXCssOz06QF0pKSkoPzpcXD8oPzooPzolWzAtOWEtZl1bMC05YS1mXXxbXFwtYS16MC05XFwuX35cXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZcXHUxMDAwMC1cXHUxRkZGRFxcdTIwMDAwLVxcdTJGRkZEXFx1MzAwMDAtXFx1M0ZGRkRcXHU0MDAwMC1cXHU0RkZGRFxcdTUwMDAwLVxcdTVGRkZEXFx1NjAwMDAtXFx1NkZGRkRcXHU3MDAwMC1cXHU3RkZGRFxcdTgwMDAwLVxcdThGRkZEXFx1OTAwMDAtXFx1OUZGRkRcXHVBMDAwMC1cXHVBRkZGRFxcdUIwMDAwLVxcdUJGRkZEXFx1QzAwMDAtXFx1Q0ZGRkRcXHVEMDAwMC1cXHVERkZGRFxcdUUxMDAwLVxcdUVGRkZEIVxcJCYnXFwoXFwpXFwqXFwrLDs9OkBdKXxbXFx1RTAwMC1cXHVGOEZGXFx1RjAwMDAtXFx1RkZGRkR8XFx1MTAwMDAwLVxcdTEwRkZGRFxcL1xcP10pKik/KD86XFwjKD86KD86JVswLTlhLWZdWzAtOWEtZl18W1xcLWEtejAtOVxcLl9+XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXFx1MTAwMDAtXFx1MUZGRkRcXHUyMDAwMC1cXHUyRkZGRFxcdTMwMDAwLVxcdTNGRkZEXFx1NDAwMDAtXFx1NEZGRkRcXHU1MDAwMC1cXHU1RkZGRFxcdTYwMDAwLVxcdTZGRkZEXFx1NzAwMDAtXFx1N0ZGRkRcXHU4MDAwMC1cXHU4RkZGRFxcdTkwMDAwLVxcdTlGRkZEXFx1QTAwMDAtXFx1QUZGRkRcXHVCMDAwMC1cXHVCRkZGRFxcdUMwMDAwLVxcdUNGRkZEXFx1RDAwMDAtXFx1REZGRkRcXHVFMTAwMC1cXHVFRkZGRCFcXCQmJ1xcKFxcKVxcKlxcKyw7PTpAXSl8W1xcL1xcP10pKik/JC9pLFxuICBCQ1BfNDc6ICAgICAgICAgICAgICAvXig/Oihlbi1HQi1vZWR8aS0oPzphbWl8Ym5ufGRlZmF1bHR8ZW5vY2hpYW58aGFrfGtsaW5nb258bHV4fG1pbmdvfG5hdmFqb3xwd258dGFvfHRheXx0c3UpfHNnbi0oPzpCRS1GUnxCRS1OTHxDSC1ERSkpfChhcnQtbG9qYmFufGNlbC1nYXVsaXNofG5vLSg/OmJva3xueW4pfHpoLSg/Omd1b3l1fGhha2thfG1pbnxtaW4tbmFufHhpYW5nKSkpJHxeKHgoPzotWzAtOWEtel17MSw4fSkrKSR8Xig/OigoPzpbYS16XXsyLDN9KD86KD86LVthLXpdezN9KXsxLDN9KT8pfFthLXpdezR9fFthLXpdezUsOH0pKD86LShbYS16XXs0fSkpPyg/Oi0oW2Etel17Mn18WzAtOV17M30pKT8oKD86LSg/OlthLXowLTldezUsOH18WzAtOV1bYS16MC05XXszfSkpKik/KCg/Oi1bMC05YS13eS16XSg/Oi1bYS16MC05XXsyLDh9KXsxLH0pKik/KC14KD86LVswLTlhLXpdezEsOH0pKyk/KSQvaVxufSk7XG5cbmNvbnN0IGRhdGVGb3JtYXRSZWdleFBvc2l0aW9ucyA9IE9iamVjdC5mcmVlemUoe1xuICBZRUFSOiAgICAgICAgICAgICAxLFxuICBNT05USDogICAgICAgICAgICAyLFxuICBEQVk6ICAgICAgICAgICAgICAzLFxuICBIT1VSOiAgICAgICAgICAgICA0LFxuICBNSU5VVEU6ICAgICAgICAgICA1LFxuICBTRUNPTkQ6ICAgICAgICAgICA2LFxuICBNU0VDT05EOiAgICAgICAgICA3LFxuICBaT05FOiAgICAgICAgICAgICA4LFxuICBSRUxBVElWRV9USU1FOiAgICA5LFxuICBUSU1FX1pPTkVfSE9VUjogICAxMCxcbiAgVElNRV9aT05FX01JTlVURTogMTFcbn0pO1xuXG5leHBvcnQge3hhcGlWYWxpZGF0aW9uUmVnZXh9O1xuZXhwb3J0IHtkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnN9O1xuIiwiICd1c2Ugc3RyaWN0JztcbiBpbXBvcnQge3Byb3BlcnRpZXN9IGZyb20gJy4uL2NvbnN0YW50cy9wcm9wZXJ0aWVzJztcblxuIGNvbnN0IHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICBJRkk6IFtcbiAgICAgcHJvcGVydGllcy5IT01FX1BBR0UsXG4gICAgIHByb3BlcnRpZXMuTkFNRVxuICAgXSxcbiAgIFVSSTogW1xuICAgICBwcm9wZXJ0aWVzLklELFxuICAgICBwcm9wZXJ0aWVzLkRJU1BMQVlcbiAgIF0sXG4gICBDT01QT05FTlRfQVJSQVk6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5ERVNDUklQVElPTlxuICAgXSxcbiAgIEFDVElWSVRZX0RFRklOSVRJT046IFtcbiAgICAgcHJvcGVydGllcy5OQU1FLFxuICAgICBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OLFxuICAgICBwcm9wZXJ0aWVzLlRZUEUsXG4gICAgIHByb3BlcnRpZXMuTU9SRV9JTkZPLFxuICAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMsXG4gICAgIHByb3BlcnRpZXMuSU5URVJBQ1RJT05fVFlQRSxcbiAgICAgcHJvcGVydGllcy5DT1JSRUNUX1JFU1BPTlNFU19QQVRURVJOLFxuICAgICBwcm9wZXJ0aWVzLkNIT0lDRVMsXG4gICAgIHByb3BlcnRpZXMuU0NBTEUsXG4gICAgIHByb3BlcnRpZXMuU09VUkNFLFxuICAgICBwcm9wZXJ0aWVzLlRBUkdFVCxcbiAgICAgcHJvcGVydGllcy5TVEVQU1xuICAgXSxcbiAgIEFDVElWSVRZOiBbXG4gICAgIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsXG4gICAgIHByb3BlcnRpZXMuSUQsXG4gICAgIHByb3BlcnRpZXMuREVGSU5JVElPTlxuICAgXSxcbiAgIFNUQVRFTUVOVF9SRUY6IFtcbiAgICAgcHJvcGVydGllcy5JRCxcbiAgICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRVxuICAgXSxcbiAgIFNDT1JFOiBbXG4gICAgIHByb3BlcnRpZXMuU0NBTEVELFxuICAgICBwcm9wZXJ0aWVzLlJBVyxcbiAgICAgcHJvcGVydGllcy5NSU4sXG4gICAgIHByb3BlcnRpZXMuTUFYXG4gICBdLFxuICAgUkVTVUxUOiBbXG4gICAgIHByb3BlcnRpZXMuU0NPUkUsXG4gICAgIHByb3BlcnRpZXMuU1VDQ0VTUyxcbiAgICAgcHJvcGVydGllcy5DT01QTEVUSU9OLFxuICAgICBwcm9wZXJ0aWVzLlJFU1BPTlNFLFxuICAgICBwcm9wZXJ0aWVzLkRVUkFUSU9OLFxuICAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlNcbiAgIF0sXG4gICBBVFRBQ0hNRU5UOiBbXG4gICAgIHByb3BlcnRpZXMuVVNBR0VfVFlQRSxcbiAgICAgcHJvcGVydGllcy5ESVNQTEFZLFxuICAgICBwcm9wZXJ0aWVzLkRFU0NSSVBUSU9OLFxuICAgICBwcm9wZXJ0aWVzLkNPTlRFTlRfVFlQRSxcbiAgICAgcHJvcGVydGllcy5MRU5HVEgsXG4gICAgIHByb3BlcnRpZXMuU0hBMixcbiAgICAgcHJvcGVydGllcy5GSUxFX1VSTFxuICAgXSxcbiAgQUdFTlQ6IFtcbiAgICBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFLFxuICAgIHByb3BlcnRpZXMuTkFNRSxcbiAgICBwcm9wZXJ0aWVzLkFDQ09VTlQsXG4gICAgcHJvcGVydGllcy5NQk9YX1NIQV8xX1NVTSxcbiAgICBwcm9wZXJ0aWVzLk1CT1gsXG4gICAgcHJvcGVydGllcy5PUEVOX0lEXG4gIF0sXG4gIEdST1VQOiBbXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSxcbiAgICBwcm9wZXJ0aWVzLk5BTUUsXG4gICAgcHJvcGVydGllcy5NRU1CRVIsXG4gICAgcHJvcGVydGllcy5BQ0NPVU5ULFxuICAgIHByb3BlcnRpZXMuTUJPWF9TSEFfMV9TVU0sXG4gICAgcHJvcGVydGllcy5NQk9YLFxuICAgIHByb3BlcnRpZXMuT1BFTl9JRFxuICBdLFxuICBDT05URVhUX0FDVElWSVRJRVM6IFtcbiAgICBwcm9wZXJ0aWVzLlBBUkVOVCxcbiAgICBwcm9wZXJ0aWVzLkdST1VQSU5HLFxuICAgIHByb3BlcnRpZXMuQ0FURUdPUlksXG4gICAgcHJvcGVydGllcy5PVEhFUlxuICBdLFxuICBTVEFURU1FTlQ6IFtcbiAgICBwcm9wZXJ0aWVzLklELFxuICAgIHByb3BlcnRpZXMuQUNUT1IsXG4gICAgcHJvcGVydGllcy5WRVJCLFxuICAgIHByb3BlcnRpZXMuT0JKRUNULFxuICAgIHByb3BlcnRpZXMuUkVTVUxULFxuICAgIHByb3BlcnRpZXMuQ09OVEVYVCxcbiAgICBwcm9wZXJ0aWVzLlRJTUVTVEFNUCxcbiAgICBwcm9wZXJ0aWVzLlNUT1JFRCxcbiAgICBwcm9wZXJ0aWVzLkFVVEhPUklUWSxcbiAgICBwcm9wZXJ0aWVzLlZFUlNJT04sXG4gICAgcHJvcGVydGllcy5BVFRBQ0hNRU5UU1xuICBdLFxuICBTVUJfU1RBVEVNRU5UOiBbXG4gICAgcHJvcGVydGllcy5BQ1RPUixcbiAgICBwcm9wZXJ0aWVzLlZFUkIsXG4gICAgcHJvcGVydGllcy5PQkpFQ1QsXG4gICAgcHJvcGVydGllcy5SRVNVTFQsXG4gICAgcHJvcGVydGllcy5DT05URVhULFxuICAgIHByb3BlcnRpZXMuVElNRVNUQU1QLFxuICAgIHByb3BlcnRpZXMuQVRUQUNITUVOVFMsXG4gICAgcHJvcGVydGllcy5PQkpFQ1RfVFlQRVxuICBdLFxuICBFWFRFTlNJT05TOiBbXG4gICAgcHJvcGVydGllcy5SRUdJU1RSQVRJT04sXG4gICAgcHJvcGVydGllcy5JTlNUUlVDVE9SLFxuICAgIHByb3BlcnRpZXMuVEVBTSxcbiAgICBwcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUyxcbiAgICBwcm9wZXJ0aWVzLlJFVklTSU9OLFxuICAgIHByb3BlcnRpZXMuUExBVEZPUk0sXG4gICAgcHJvcGVydGllcy5MQU5HVUFHRSxcbiAgICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICBwcm9wZXJ0aWVzLkVYVEVOU0lPTlNcbiAgXVxufSk7XG5cbiBleHBvcnQge3hhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4fSBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHtvYmplY3RUeXBlc30gZnJvbSAnLi4vY29uc3RhbnRzL3Byb3BlcnRpZXMnO1xuXG5jb25zdFxuICBJU19TVFJJTkcgID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gIElTX0FSUkFZICAgPSAnW29iamVjdCBBcnJheV0nLFxuICBJU19CT09MRUFOID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICBJU19OVU1CRVIgID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgeGFwaVZhbGlkYXRpb25VdGlscztcblxueGFwaVZhbGlkYXRpb25VdGlscyA9IHtcbiAgaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfU1RSSU5HO1xuICB9LFxuXG4gIGlzT2JqZWN0KG9iaikge1xuICAgIHJldHVybiBvYmogPT09IE9iamVjdChvYmopO1xuICB9LFxuXG4gIGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfQVJSQVk7XG4gIH0sXG5cbiAgaXNCb29sZWFuKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IHRydWUgfHwgb2JqID09PSBmYWxzZSB8fCB0b1N0cmluZy5jYWxsKG9iaikgPT09IElTX0JPT0xFQU47XG4gIH0sXG5cbiAgaXNOdW1iZXIob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gSVNfTlVNQkVSO1xuICB9LFxuXG4gIGlzRGVmaW5lZChvYmopIHtcbiAgICByZXR1cm4gKG9iaiAhPT0gbnVsbCB8fCBvYmogIT09IHVuZGVmaW5lZCk7XG4gIH0sXG5cbiAgaXNOb25OdWxsTWFwT2JqZWN0KHRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKHRhcmdldCkgJiYgdGhpcy5pc09iamVjdCh0YXJnZXQpICYmICF0aGlzLmlzQXJyYXkodGFyZ2V0KTtcbiAgfSxcblxuICBpc1ZhbGlkTGFuZ3VhZ2VUYWcodGFyZ2V0KSB7XG4gICAgLy8gVE9ETyAtIHVzZSBtb3JlIHByZWNpc2UgNTY0NiBoYW5kbGluZywgcmF0aGVyIHRoYW4gdGhpcyBzaW1wbGlmaWVkIEJDUCA0NyByZWdleCwgd2hpY2ggY29tYmluZXMgUkZDIDU2NDYgYW5kIFJGQyA0NjQ3LlxuICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCh0YXJnZXQpICYmIHRoaXMuaXNTdHJpbmcodGFyZ2V0KSAmJiB4YXBpVmFsaWRhdGlvblJlZ2V4LkJDUF80Ny50ZXN0KHRhcmdldCk7XG4gIH0sXG5cbiAgYWRkUHJvcFRvVHJhY2UodHJhY2UsIGFkZGVuZHVtKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKGFkZGVuZHVtKSA/IGAke3RyYWNlfS4ke2FkZGVuZHVtfWAgOiB0cmFjZTtcbiAgfSxcblxuICBhZGRMb29rdXBUb1RyYWNlKHRyYWNlLCBrZXkpIHtcbiAgICByZXR1cm4gKCF0aGlzLmlzRGVmaW5lZChrZXkpKSA/IHRyYWNlIDogKHRoaXMuaXNOdW1iZXIoa2V5KSA/IGAke3RyYWNlfVske2tleX1dYCA6IGAke3RyYWNlfVtcIiR7a2V5fVwiXWApO1xuICB9LFxuXG4gIGxvY2FsVHJhY2VUb1N0cmluZyh0cmFjZSwgYWRkZW5kdW0pIHtcbiAgICByZXR1cm4gdGhpcy5hZGRQcm9wVG9UcmFjZSh0cmFjZSwgYWRkZW5kdW0pO1xuICB9LFxuXG4gIGlzR3JvdXAoYWN0b3JPckdyb3VwKSB7XG4gICAgcmV0dXJuIChhY3Rvck9yR3JvdXAubWVtYmVyICE9PSBudWxsICYmIGFjdG9yT3JHcm91cC5tZW1iZXIgIT09IHVuZGVmaW5lZCkgfHwgYWN0b3JPckdyb3VwLm9iamVjdFR5cGUgPT09IG9iamVjdFR5cGVzLkdST1VQO1xuICB9XG59O1xuXG5leHBvcnQge3hhcGlWYWxpZGF0aW9uVXRpbHN9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge3Byb3BlcnRpZXMsIG9iamVjdFR5cGVzLCB4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXMsIHhBcGlWYWxpZE9iamVjdFR5cGVzfSBmcm9tICcuL2NvbnN0YW50cy9wcm9wZXJ0aWVzJztcbmltcG9ydCB7eGFwaVdoaXRlTGlzdFByb3BlcnRpZXN9IGZyb20gJy4vY29uc3RhbnRzL3doaXRlbGlzdHMnO1xuaW1wb3J0IHt4YXBpRXJyb3JMZXZlbHMsIHhhcGlWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuL2NvbnN0YW50cy9lcnJvcnMnO1xuaW1wb3J0IHt4YXBpVmFsaWRhdGlvblJlZ2V4LCBkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnN9IGZyb20gJy4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25JbnRlcmFjdGlvblR5cGVzfSBmcm9tICcuL2NvbnN0YW50cy9pbnRlcmFjdGlvbi10eXBlcyc7XG5pbXBvcnQge3hhcGlHZW5lcmFsfSBmcm9tICcuL2NvbnN0YW50cy9nZW5lcmFsJztcbmltcG9ydCB7eGFwaVZhbGlkYXRpb25VdGlsc30gZnJvbSAnLi91dGlscy91dGlscyc7XG5cbmZ1bmN0aW9uIG1ha2VWMVJlcG9ydChpbnN0YW5jZSwgZXJyb3JzKSB7XG4gIHZhciB2ZXJzaW9uO1xuXG4gIGluc3RhbmNlID0gaW5zdGFuY2UgfHwgbnVsbDtcbiAgZXJyb3JzICAgPSBlcnJvcnMgICB8fCBudWxsO1xuICB2ZXJzaW9uICA9IHhhcGlHZW5lcmFsLkZJUlNUX1JFUE9SVF9WRVJTVElPTjtcbiAgcmV0dXJuIHtpbnN0YW5jZSwgZXJyb3JzLCB2ZXJzaW9ufTtcbn1cblxuZnVuY3Rpb24gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoaW5zdGFuY2UsIGVycm9yKSB7XG4gIHJldHVybiBtYWtlVjFSZXBvcnQoaW5zdGFuY2UsIGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQgPyBbXSA6IFtlcnJvcl0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh0YXJnZXQsIGFsbG93ZWRQcm9wZXJ0aWVzLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcblxuICBmb3IgKHByb3BlcnR5TmFtZSBpbiB0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkgJiYgYWxsb3dlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVU5FWFBFQ1RFRCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhwYXJlbnQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCwgdmlvbGF0aW9uVHlwZSkge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIHByb3BWYWx1ZSwgbG9jYWxWaW9sYXRpb25UeXBlO1xuXG4gIGxvY2FsRXJyb3JzICAgICAgICA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgICAgICAgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICAgICAgICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXSxcbiAgbG9jYWxWaW9sYXRpb25UeXBlID0gdmlvbGF0aW9uVHlwZSB8fCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT047XG5cbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfU1RSSU5HfWAsXG4gICAgICAgIGxldmVsOiAgIGxvY2FsVmlvbGF0aW9uVHlwZVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9QUkVTRU5UfWAsXG4gICAgICBsZXZlbDogICBsb2NhbFZpb2xhdGlvblR5cGVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKHRhcmdldCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgPSB0YXJnZXRbcHJvcGVydHlOYW1lXTtcblxuICBpZiAocHJvcFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9VUklfU1RSSU5HfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICgheGFwaVZhbGlkYXRpb25SZWdleC5JUkkudGVzdChwcm9wVmFsdWUpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9JUklfU1RSSU5HfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydHlOYW1lKSxcbiAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX1VSSV9QUkVTRU5UfWAsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc1VybCh0YXJnZXQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCkge1xuICAvLyBUT0RPIC0gY2hlY2sgd2hldGhlciBhIGZvcm1hbCBVUkwgZm9ybWF0IGRlZmluaXRpb24gaXMgcmVjb21tZW5kZWQvZW5mb3JjZWQgZm9yIHhBUElcbiAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyh0YXJnZXQsIHByb3BlcnR5TmFtZSwgdHJhY2UsIGVycm9ycywgaXNSZXF1aXJlZCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc0Jvb2xlYW4ocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMsIGlzUmVxdWlyZWQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8ICcnO1xuICBwcm9wVmFsdWUgICA9IHBhcmVudFtwcm9wZXJ0eU5hbWVdO1xuXG4gIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNCb29sZWFuKHByb3BWYWx1ZSkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9CT09MRUFOfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9CT09MRUFOX1BSRVNFTlR9YCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHBhcmVudCwgcHJvcGVydHlOYW1lLCB0cmFjZSwgZXJyb3JzLCBpc1JlcXVpcmVkKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgcHJvcFZhbHVlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCAnJztcbiAgcHJvcFZhbHVlICAgPSBwYXJlbnRbcHJvcGVydHlOYW1lXTtcblxuICAgIGlmIChwcm9wVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc051bWJlcihwcm9wVmFsdWUpKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7cHJvcGVydHlOYW1lfSAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLk1VU1RfQkVfTlVNQkVSfWAsXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BlcnR5TmFtZX0gJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5NVVNUX0JFX05VTUJFUl9QUkVTRU5UfWAsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJRklQcm9wZXJ0aWVzKHRhcmdldCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGFjY291bnRUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgJyc7XG5cbiAgaWYgKHRhcmdldC5tYm94ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0Lm1ib3ggIT09IG51bGwpIHtcbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcodGFyZ2V0Lm1ib3gpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6IHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUJPWCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklGSV9NVVNUX0JFX01CT1hfVVJJLFxuICAgICAgICBsZXZlbDogeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4Lk1BSUxUT19VUkkudGVzdCh0YXJnZXQubWJveCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1CT1gpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRklfTVVTVF9CRV9WQUxJRF9NQk9YX0ZPUk1BVCxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcodGFyZ2V0LCBwcm9wZXJ0aWVzLk1CT1hfU0hBXzFfU1VNLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodGFyZ2V0LCBwcm9wZXJ0aWVzLk9QRU5fSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICBpZiAodGFyZ2V0LmFjY291bnQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQuYWNjb3VudCAhPT0gbnVsbCkge1xuICAgIGFjY291bnRUcmFjZSA9IHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BQ0NPVU5UKTtcbiAgICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkodGFyZ2V0LmFjY291bnQsIHByb3BlcnRpZXMuSE9NRV9QQUdFLGFjY291bnRUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKHRhcmdldC5hY2NvdW50LCBwcm9wZXJ0aWVzLk5BTUUsIGFjY291bnRUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSk7XG4gICAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXModGFyZ2V0LmFjY291bnQsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLklGSSwgYWNjb3VudFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIGdldElGSXModGFyZ2V0KSB7XG4gIHZhciBpZmlzO1xuXG4gIGlmICh0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gW107fVxuXG4gIGlmaXMgPSB4YXBpVmFsaWRhdGlvbklmaVByb3BlcnR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiB7XG4gICAgaWYgKHRhcmdldFtuYW1lXSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFtuYW1lXSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtrZXk6IG5hbWUsIHZhbHVlOiB0YXJnZXRbbmFtZV19O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlmaXM7XG59XG5cbmZ1bmN0aW9uIGdldElGSUNvdW50KHRhcmdldCkge1xuICByZXR1cm4gZ2V0SUZJcyh0YXJnZXQpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdLFxuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlM7XG5cbiAgaWYgKGV4dGVuc2lvbnMgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChleHRlbnNpb25zKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkVYVEVOU0lPTlNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG4gIC8vIFRPRE8gLSBkb3VibGUtY2hlY2sgd2hhdCBmdXJ0aGVyIGVuZm9yY2VhYmxlIGNvbnN0cmFpbnRzIGV4aXN0IG9uIGV4dGVuc2lvbiBvYmplY3QgcHJvcGVydGllc1xuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTGFuZ3VhZ2VNYXAobGFuZ3VhZ2VNYXAsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBwcm9wTmFtZSwgbWFwcGVkVmFsdWU7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuTEFOR1VBR0VfTUFQO1xuXG4gIGlmIChsYW5ndWFnZU1hcCA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGxhbmd1YWdlTWFwKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01BUFNfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgZm9yIChwcm9wTmFtZSBpbiBsYW5ndWFnZU1hcCkge1xuXG4gICAgaWYgKGxhbmd1YWdlTWFwLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzVmFsaWRMYW5ndWFnZVRhZyhwcm9wTmFtZSkpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wTmFtZSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7cHJvcE5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQX0tFWV9JTlZBTElEfWAsXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBtYXBwZWRWYWx1ZSA9IGxhbmd1YWdlTWFwW3Byb3BOYW1lXTtcblxuICAgICAgaWYgKG1hcHBlZFZhbHVlID09PSBudWxsIHx8IG1hcHBlZFZhbHVlID09PSB1bmRlZmluZWQgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcobWFwcGVkVmFsdWUpKSB7XG4gICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wTmFtZSksXG4gICAgICAgICAgbWVzc2FnZTogYCR7cHJvcE5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTEFOR1VBR0VfTUFQX0tFWV9NVVNUX0JFX1NUUklOR31gLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVmVyYih2ZXJiLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5WRVJCO1xuXG4gIGlmICh2ZXJiID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuVkVSQl9NVVNUX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KHZlcmIpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlZFUkJfTVVTVF9OT1RfQkVfTlVMTCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKHZlcmIsIHByb3BlcnRpZXMuSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi90cnVlKTtcblxuICBpZiAodmVyYi5kaXNwbGF5ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRJU1BMQVlfU0hPVUxEX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUxhbmd1YWdlTWFwKHZlcmIuZGlzcGxheSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyh2ZXJiLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5VUkksIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShjb21wb25lbnRzLCBpbnRlcmFjdGlvblR5cGUsIGFsbG93ZWRJbnRlcmFjdGlvblR5cGVzLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgaXNBbGxvd2VkQ29tcG9uZW50VHlwZSwgaWRzLCBwZXJDb21wb25lbnRUcmFjZTtcblxuICBsb2NhbEVycm9ycyAgICAgICAgICAgID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICAgICAgICAgICAgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuSU5URVJBQ1RJT05fQ09NUE9ORU5UUztcbiAgaXNBbGxvd2VkQ29tcG9uZW50VHlwZSA9IGFsbG93ZWRJbnRlcmFjdGlvblR5cGVzLmluZGV4T2YoaW50ZXJhY3Rpb25UeXBlKSAhPT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQ7XG4gIGlkcyAgICAgICAgICAgICAgICAgICAgPSBbXTtcblxuICBpZiAoaXNBbGxvd2VkQ29tcG9uZW50VHlwZSAmJiBjb21wb25lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoY29tcG9uZW50cyA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc0FycmF5KGNvbXBvbmVudHMpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQ09NUE9ORU5UX1NIT1VMRF9CRV9BUlJBWSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLlNIT1VMRF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLmZvckVhY2goKGludGVyYWN0aW9uQ29tcG9uZW50LCBpKSA9PiB7XG4gICAgICAgIHBlckNvbXBvbmVudFRyYWNlID0geGFwaVZhbGlkYXRpb25VdGlscy5hZGRMb29rdXBUb1RyYWNlKGxvY2FsVHJhY2UsIGkpO1xuXG4gICAgICAgIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoaW50ZXJhY3Rpb25Db21wb25lbnQpKSB7XG4gICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICB0cmFjZTogICBwZXJDb21wb25lbnRUcmFjZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX0NPTVBPTkVOVF9NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGludGVyYWN0aW9uQ29tcG9uZW50LCBwcm9wZXJ0aWVzLklELCBwZXJDb21wb25lbnRUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgICAgICAgICBpZiAoaWRzLmluZGV4T2YoaW50ZXJhY3Rpb25Db21wb25lbnQuaWQpICE9PSB4YXBpR2VuZXJhbC5OT19JTkRFWF9GT1VORCkge1xuICAgICAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UocGVyQ29tcG9uZW50VHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRF9NVVNUX0JFX1VOSVFVRSxcbiAgICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRzLnB1c2goaW50ZXJhY3Rpb25Db21wb25lbnQuaWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCAmJiB4YXBpVmFsaWRhdGlvblJlZ2V4LkNPTlRBSU5TX1dISVRFU1BBQ0UudGVzdChpbnRlcmFjdGlvbkNvbXBvbmVudC5pZCkpIHtcbiAgICAgICAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKHBlckNvbXBvbmVudFRyYWNlLCBwcm9wZXJ0aWVzLklEKSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURfU0hPVUxEX05PVF9DT05UQUlOX1dISVRFU1BBQ0VTLFxuICAgICAgICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsaWRhdGVMYW5ndWFnZU1hcChpbnRlcmFjdGlvbkNvbXBvbmVudC5kZXNjcmlwdGlvbiwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShwZXJDb21wb25lbnRUcmFjZSwgcHJvcGVydGllcy5ERVNDUklQVElPTiksIGxvY2FsRXJyb3JzKTtcbiAgICAgICAgICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhpbnRlcmFjdGlvbkNvbXBvbmVudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQ09NUE9ORU5UX0FSUkFZLCBwZXJDb21wb25lbnRUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIH1cbiAgfSBlbHNlIGlmIChpbnRlcmFjdGlvblR5cGUgJiYgY29tcG9uZW50cykge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgbG9jYWxUcmFjZSxcbiAgICAgIG1lc3NhZ2U6IGAke3hhcGlWYWxpZGF0aW9uRXJyb3JzLklOVEVSQUNUSU9OX1RZUEVfTVVTVF9CRV9WQUxJRH0gJHtpbnRlcmFjdGlvblR5cGV9YCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQWN0aXZpdHlEZWZpbnRpb24oZGVmaW5pdGlvbiwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgICAgICAgICAgICAgICAgICA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgICAgICAgICAgICAgICAgICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkRFRklOSVRJT047XG4gIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuQ09SUkVDVF9SRVNQT05TRVNfUEFUVEVSTik7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChkZWZpbml0aW9uKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRFRklOSVRJT05TX01VU1RfQkVfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgdmFsaWRhdGVMYW5ndWFnZU1hcChkZWZpbml0aW9uLm5hbWUsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5OQU1FKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGRlZmluaXRpb24uZGVzY3JpcHRpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERVNDUklQVElPTiksIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoZGVmaW5pdGlvbiwgcHJvcGVydGllcy5UWVBFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmwoZGVmaW5pdGlvbiwgcHJvcGVydGllcy5NT1JFX0lORk8sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlRXh0ZW5zaW9ucyhkZWZpbml0aW9uLmV4dGVuc2lvbnMsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5FWFRFTlNJT05TKSwgbG9jYWxFcnJvcnMpO1xuXG4gIGlmIChkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0geGFwaUdlbmVyYWwuSU5URVJBQ1RJT05fREVGSU5JVElPTl9UWVBFKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5UWVBFKSxcbiAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuSU5URVJBQ1RJT05fQUNUSVZJVFlfU0hPVUxEX0hBVkV9IFwiJHt4YXBpR2VuZXJhbC5JTlRFUkFDVElPTl9ERUZJTklUSU9OX1RZUEV9XCJgLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHhhcGlWYWxpZGF0aW9uSW50ZXJhY3Rpb25UeXBlcy5pbmRleE9mKGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlKSA9PT0geGFwaUdlbmVyYWwuTk9fSU5ERVhfRk9VTkQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOVEVSQUNUSU9OX1RZUEUpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlRFUkFDVElPTl9UWVBFX01VU1RfQkVfQ01JLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShkZWZpbml0aW9uLmNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIGNvcnJlY3RSZXNwb25zZXNQYXR0ZXJuVHJhY2UsXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9BUlJBWSxcbiAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmaW5pdGlvbi5jb3JyZWN0UmVzcG9uc2VzUGF0dGVybi5mb3JFYWNoKChyZXNwb25zZSwgaSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgPT09IG51bGwgfHwgcmVzcG9uc2UgPT09IHVuZGVmaW5lZCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhyZXNwb25zZSkpIHtcbiAgICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShjb3JyZWN0UmVzcG9uc2VzUGF0dGVyblRyYWNlLCBpKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPUlJFQ1RfUkVTUE9OU0VTX1BBVFRFUk5fTVVTVF9CRV9TVFJJTkdTLFxuICAgICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICBkZWZpbml0aW9uLmNob2ljZXMsXG4gICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgW3Byb3BlcnRpZXMuQ0hPSUNFLCBwcm9wZXJ0aWVzLlNFUVVFTkNJTkddLFxuICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DSE9JQ0VTKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICBkZWZpbml0aW9uLnNjYWxlLFxuICAgIGRlZmluaXRpb24uaW50ZXJhY3Rpb25UeXBlLFxuICAgIFtwcm9wZXJ0aWVzLkxJS0VSVF0sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNDQUxFKSxcbiAgICBsb2NhbEVycm9yc1xuICApO1xuXG4gIHZhbGlkYXRlSW50ZXJhY3Rpb25Db21wb25lbnRBcnJheShcbiAgICBkZWZpbml0aW9uLnNvdXJjZSxcbiAgICBkZWZpbml0aW9uLmludGVyYWN0aW9uVHlwZSxcbiAgICBbcHJvcGVydGllcy5NQVRDSElOR10sXG4gICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlNPVVJDRSksXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICB2YWxpZGF0ZUludGVyYWN0aW9uQ29tcG9uZW50QXJyYXkoXG4gICAgZGVmaW5pdGlvbi50YXJnZXQsXG4gICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgW3Byb3BlcnRpZXMuTUFUQ0hJTkddLFxuICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5UQVJHRVQpLFxuICAgIGxvY2FsRXJyb3JzXG4gICk7XG5cbiAgdmFsaWRhdGVJbnRlcmFjdGlvbkNvbXBvbmVudEFycmF5KFxuICAgIGRlZmluaXRpb24uc3RlcHMsXG4gICAgZGVmaW5pdGlvbi5pbnRlcmFjdGlvblR5cGUsXG4gICAgW3Byb3BlcnRpZXMuUEVSRk9STUFOQ0VdLFxuICAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5TVEVQUyksXG4gICAgbG9jYWxFcnJvcnNcbiAgKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhkZWZpbml0aW9uLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BQ1RJVklUWV9ERUZJTklUSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eShhY3Rpdml0eSwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUNUSVZJVFk7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChhY3Rpdml0eSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUNUSVZJVElFU19NVVNUX05PVF9CRV9OVUxMLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNVcmkoYWN0aXZpdHksIHByb3BlcnRpZXMuSUQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi90cnVlKTtcblxuICBpZiAoYWN0aXZpdHkuZGVmaW5pdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVBY3Rpdml0eURlZmludGlvbihcbiAgICAgIGFjdGl2aXR5LmRlZmluaXRpb24sXG4gICAgICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuREVGSU5JVElPTiksXG4gICAgICBsb2NhbEVycm9yc1xuICAgICk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhhY3Rpdml0eSwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQUNUSVZJVFksIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGVtZW50UmVmKHN0YXRlbWVudFJlZiwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1RBVEVNRU5UX1JFRjtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KHN0YXRlbWVudFJlZikpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX1JFRl9NVVNUX05PVF9CRV9OVUxMX01BUF9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cblxuICBpZiAoc3RhdGVtZW50UmVmLm9iamVjdFR5cGUgIT09IG9iamVjdFR5cGVzLlNUQVRFTUVOVF9SRUYpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5PQkpFQ1RfVFlQRV9NVVNUX0JFX1NUQVRFTUVOVF9SRUYsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmICghc3RhdGVtZW50UmVmLmlkIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChzdGF0ZW1lbnRSZWYuaWQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuSURfTVVTVF9CRV9WQUxJRF9VVUlEX1JFRixcbiAgICAgIGxldmVsOiAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzdGF0ZW1lbnRSZWYsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNUQVRFTUVOVF9SRUYsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2NvcmUoc2NvcmUsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlNDT1JFO1xuXG4gIGlmIChzY29yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BlcnR5SXNOdW1iZXIoc2NvcmUsIHByb3BlcnRpZXMuU0NBTEVELCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIGlmIChzY29yZS5zY2FsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzY29yZS5zY2FsZWQgPCB4YXBpR2VuZXJhbC5NSU5fU0NBTEVEX1ZBTFVFIHx8IHNjb3JlLnNjYWxlZCA+IHhhcGlHZW5lcmFsLk1BWF9TQ0FMRURfVkFMVUUpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0NBTEVEKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU0NBTEVEX01VU1RfQkVfQkVUV0VFTl8wXzEsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNjb3JlLm1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLk1JTiwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICAgICAgaWYgKHNjb3JlLnJhdyAhPT0gdW5kZWZpbmVkICYmIHNjb3JlLnJhdyA8IHNjb3JlLm1pbikge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkFXKSxcbiAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SQVdfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjb3JlLm1heCAhPT0gdW5kZWZpbmVkICYmIHNjb3JlLm1heCA8IHNjb3JlLm1pbikge1xuICAgICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUFYKSxcbiAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5NQVhfTVVTVF9CRV9HUkVBVEVSX1RIQU5fTUlOLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgfVxuXG4gIGlmIChzY29yZS5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlUHJvcGVydHlJc051bWJlcihzY29yZSwgcHJvcGVydGllcy5NQVgsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgICBpZiAoc2NvcmUucmF3ICE9PSB1bmRlZmluZWQgJiYgc2NvcmUucmF3ID4gc2NvcmUubWF4KSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJBVyksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJBV19NVVNUX0JFX0xFU1NfVEhBTl9NQVgsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eUlzTnVtYmVyKHNjb3JlLCBwcm9wZXJ0aWVzLlJBVywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoc2NvcmUsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNDT1JFLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJlc3VsdChyZXN1bHQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlJFU1VMVDtcblxuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QocmVzdWx0KSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlJFU1VMVF9NVVNUX0JFX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlU2NvcmUocmVzdWx0LnNjb3JlLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0NPUkUpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0Jvb2xlYW4ocmVzdWx0LCBwcm9wZXJ0aWVzLlNVQ0NFU1MsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc0Jvb2xlYW4ocmVzdWx0LCBwcm9wZXJ0aWVzLkNPTVBMRVRJT04sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhyZXN1bHQsIHByb3BlcnRpZXMuUkVTUE9OU0UsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG4gIHZhbGlkYXRlRXh0ZW5zaW9ucyhyZXN1bHQuZXh0ZW5zaW9ucywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkVYVEVOU0lPTlMpLCBsb2NhbEVycm9ycyk7XG5cbiAgaWYgKHJlc3VsdC5kdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIChyZXN1bHQuZHVyYXRpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcocmVzdWx0LmR1cmF0aW9uKSB8fCAheGFwaVZhbGlkYXRpb25SZWdleC5JU09fODYwMV9EVVJBVElPTi50ZXN0KHJlc3VsdC5kdXJhdGlvbikpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRFVSQVRJT04pLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuRFVSQVRJT05fTVVTVF9CRV9WQUxJRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMocmVzdWx0LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5SRVNVTFQsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHlJc0lTTzg2MDFTdHJpbmcocGFyZW50LCBwcm9wZXJ0eU5hbWUsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBtYXRjaGVkLCBkYXRldGltZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5EQVRFX1RJTUU7XG4gIGRhdGV0aW1lICAgID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG5cbiAgaWYgKGRhdGV0aW1lID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmIChkYXRldGltZSA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc1N0cmluZyhkYXRldGltZSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnR5TmFtZSksXG4gICAgICBtZXNzYWdlOiBgJHtwcm9wZXJ0eU5hbWV9ICR7eGFwaVZhbGlkYXRpb25FcnJvcnMuTVVTVF9CRV9TVFJJTkd9YCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgbWF0Y2hlZCA9IHhhcGlWYWxpZGF0aW9uUmVnZXguSVNPXzg2MDFfREFURV9USU1FLmV4ZWMoZGF0ZXRpbWUpO1xuXG4gIGlmIChtYXRjaGVkKSB7XG4gICAgaWYgKCFkYXRlSW5jbHVkZXNab25lSW5mb3JtYXRpb24obWF0Y2hlZCkpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5EQVRFX1NIT1VMRF9JTkNMVURFX1pPTkVfSU5GT1JNQVRJT04sXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0eU5hbWUpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuREFURV9NVVNUX0JFX1ZBTElELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVmVyc2lvbih2ZXJzaW9uLCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZTtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5WRVJTSU9OO1xuXG4gIGlmICh2ZXJzaW9uID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICh2ZXJzaW9uID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHZlcnNpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlNFTVZFUl8xX1BfMF9QXzAudGVzdCh2ZXJzaW9uKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5WRVJTSU9OX01VU1RfQ09NUExZX1NFTUFOVElDX1ZFUlNJT05JTkcsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBdHRhY2htZW50T2JqZWN0KGF0dGFjaG1lbnQsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlIHx8IHByb3BlcnRpZXMuQVRUQUNITUVOVDtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGF0dGFjaG1lbnQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkFUVEFDSE1FTlRTX01VU1RfTk9UX0JFX05VTExfTUFQX09CSkVDVFMsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmIChhdHRhY2htZW50LmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ESVNQTEFZKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkRJU1BMQVlfU0hPVUxEX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGF0dGFjaG1lbnQuZGlzcGxheSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkRJU1BMQVkpLCBsb2NhbEVycm9ycyk7XG4gIH1cblxuICB2YWxpZGF0ZUxhbmd1YWdlTWFwKGF0dGFjaG1lbnQuZGVzY3JpcHRpb24sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5ERVNDUklQVElPTiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKGF0dGFjaG1lbnQsIHByb3BlcnRpZXMuVVNBR0VfVFlQRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsIC8qaXNSZXF1aXJlZCovdHJ1ZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzVXJpKGF0dGFjaG1lbnQsIHByb3BlcnRpZXMuRklMRV9VUkwsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcblxuICAvLyBUT0RPIC0gbW9yZSBjb21wbGV0ZSB2YWxpZGF0aW9uIGZvciBJbnRlcm5ldCBNZWRpYSBUeXBlIHZpYSBSRkMgMjA0NlxuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoYXR0YWNobWVudCwgcHJvcGVydGllcy5DT05URU5UX1RZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTik7XG5cbiAgaWYgKGF0dGFjaG1lbnQubGVuZ3RoID09PSB1bmRlZmluZWQgfHwgYXR0YWNobWVudC5sZW5ndGggPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOdW1iZXIoYXR0YWNobWVudC5sZW5ndGgpIHx8IChhdHRhY2htZW50Lmxlbmd0aCAlIDEgIT09IDApKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkxFTkdUSCksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5MRU5HVEhfTVVTVF9CRV9JTlRFR0VSLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYXR0YWNobWVudC5zaGEyID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0hBMiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TSEEyX01VU1RfQkVfUFJPVklERURfT05fQVRUQUNITUVOVF9PQkpFQ1RTLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYXR0YWNobWVudC5zaGEyID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKGF0dGFjaG1lbnQuc2hhMikgfHwgIXhhcGlWYWxpZGF0aW9uUmVnZXguQkFTRV82NC50ZXN0KGF0dGFjaG1lbnQuc2hhMikpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU0hBMiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TSEEyX01VU1RfQ09OVEFJTl9CQVNFXzY0X1NUUklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoYXR0YWNobWVudCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuQVRUQUNITUVOVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXR0YWNobWVudHMoYXR0YWNobWVudHMsIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFUVEFDSE1FTlRTO1xuXG4gIGlmIChhdHRhY2htZW50cyA9PT0gdW5kZWZpbmVkKSB7cmV0dXJuIGxvY2FsRXJyb3JzO31cblxuICBpZiAoYXR0YWNobWVudHMgPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShhdHRhY2htZW50cykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVRUQUNITUVOVFNfTVVTVF9CRV9OT1RfTlVMTF9BUlJBWSxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgYXR0YWNobWVudHMuZm9yRWFjaCgoYXR0YWNobWVudCwgaSkgPT4ge1xuICAgIHZhbGlkYXRlQXR0YWNobWVudE9iamVjdChhdHRhY2htZW50LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFnZW50KGFnZW50LCB0cmFjZSwgZXJyb3JzKSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgaWZpQ291bnQ7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUdFTlQ7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChhZ2VudCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUdFTlRfTVVTVF9CRV9OT05fTlVMTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWZpQ291bnQgPSBnZXRJRklDb3VudChhZ2VudCk7XG5cbiAgaWYgKGlmaUNvdW50ICE9PSB4YXBpR2VuZXJhbC5OVU1FUl9PRl9TUEVDSUZJRURfSUZJX1BST1BFUlRJRVMpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUdFTlRfSUZJX1BST1BFUlRJRVNfTVVTVF9CRV9TUEVDSUZJRUQsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhZ2VudC5vYmplY3RUeXBlID09PSBvYmplY3RUeXBlcy5HUk9VUCkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5BR0VOVF9NVVNUX05PVF9IQVZFX0dST1VQX0NIQVJBQ1RFUklTVElDUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVJRklQcm9wZXJ0aWVzKGFnZW50LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhhZ2VudCwgcHJvcGVydGllcy5OQU1FLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNSZXF1aXJlZCovZmFsc2UpO1xuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGFnZW50LCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5BR0VOVCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVHcm91cChncm91cCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2UsIG1lbWJlclRyYWNlLCBpZmlDb3VudDtcblxuICBsb2NhbEVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgbG9jYWxUcmFjZSAgPSB0cmFjZSAgfHwgcHJvcGVydGllcy5HUk9VUDtcbiAgbWVtYmVyVHJhY2UgPSB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUVNQkVSKTtcblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGdyb3VwKSkge1xuICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5HUk9VUF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIGlmaUNvdW50ID0gZ2V0SUZJQ291bnQoZ3JvdXApO1xuXG4gIGlmIChpZmlDb3VudCA9PT0gMCkge1xuICAgIGlmIChncm91cC5tZW1iZXIgPT09IG51bGwgfHwgZ3JvdXAubWVtYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICBtZW1iZXJUcmFjZSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuTUVNQkVSX01VU1RfQkVfUFJPVklERURfRk9SX0FOT05ZTU9VU19HUk9VUFMsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlmaUNvdW50ID4geGFwaUdlbmVyYWwuTlVNRVJfT0ZfU1BFQ0lGSUVEX0lGSV9QUk9QRVJUSUVTKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX0lGSV9QUk9QRVJUSUVTX01VU1RfQkVfU1BFQ0lGSUVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUlGSVByb3BlcnRpZXMoZ3JvdXAsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZVByb3BlcnR5SXNTdHJpbmcoZ3JvdXAsIHByb3BlcnRpZXMuTkFNRSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMsICAvKmlzUmVxdWlyZWQqL2ZhbHNlKTtcblxuICBpZiAoZ3JvdXAubWVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZ3JvdXAubWVtYmVyID09PSBudWxsIHx8ICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoZ3JvdXAubWVtYmVyKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuTUVNQkVSKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuR1JPVVBfTUVNQkVSX01VU1RfQkVfQVJSQVksXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKChtZW1iZXIsIGkpID0+IHtcbiAgICAgICAgdmFsaWRhdGVBZ2VudChtZW1iZXIsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkTG9va3VwVG9UcmFjZShtZW1iZXJUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlQWJzZW5jZU9mTm9uV2hpdGVsaXN0ZWRQcm9wZXJ0aWVzKGdyb3VwLCB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5HUk9VUCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3RvcihhY3RvciwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQUNUT1I7XG5cbiAgaWYgKGFjdG9yID09PSBudWxsIHx8IGFjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQUNUT1JfTVVTVF9CRV9QUk9WSURFRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChhY3RvcikpIHtcbiAgICB2YWxpZGF0ZUdyb3VwKGFjdG9yLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVBZ2VudChhY3RvciwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml0eShhdXRob3JpdHksIHRyYWNlLCBlcnJvcnMpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLkFVVEhPUklUWTtcblxuICBpZiAoYXV0aG9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNOb25OdWxsTWFwT2JqZWN0KGF1dGhvcml0eSkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQVVUSE9SSVRZX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzR3JvdXAoYXV0aG9yaXR5KSkge1xuICAgIHZhbGlkYXRlR3JvdXAoYXV0aG9yaXR5LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgaWYgKCFhdXRob3JpdHkubWVtYmVyIHx8ICFhdXRob3JpdHkubWVtYmVyLmxlbmd0aCB8fCBhdXRob3JpdHkubWVtYmVyLmxlbmd0aCAhPT0geGFwaUdlbmVyYWwuR1JPVVBfQVVUSE9SSVRZX0FHRU5UX01FTUJFUlMpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk1FTUJFUiksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkdST1VQX0FVVEhPUklUWV9BR0VOVF9NRU1CRVJTX01VU1RfQkVfVFdPLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZUFnZW50KGF1dGhvcml0eSwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoc3ViQ29udGV4dCwgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuU1VCX0NPTlRFWFQ7XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IHVuZGVmaW5lZCkge3JldHVybiBsb2NhbEVycm9yczt9XG5cbiAgaWYgKHN1YkNvbnRleHQgPT09IG51bGwpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3ViQ29udGV4dCkpIHtcbiAgICBzdWJDb250ZXh0LmZvckVhY2goKGFjdGl2aXR5LCBpKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2aXR5KGFjdGl2aXR5LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZExvb2t1cFRvVHJhY2UobG9jYWxUcmFjZSwgaSksIGxvY2FsRXJyb3JzKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzT2JqZWN0KHN1YkNvbnRleHQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19TSE9VTERfQkVfQU5fQVJSQVksXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuU0hPVUxEX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgdmFsaWRhdGVBY3Rpdml0eShzdWJDb250ZXh0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gIH0gZWxzZSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkNPTlRFWFRfQUNUSVZJVElFU19NVVNUX0JFX0FSUkFZX09SX0FDVElWSVRZX09CSixcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTn0pO1xuICB9XG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0QWN0aXZpdGllcyhjb250ZXh0QWN0aXZpdGllcywgdHJhY2UsIGVycm9ycykge1xuICB2YXIgbG9jYWxFcnJvcnMsIGxvY2FsVHJhY2U7XG5cbiAgbG9jYWxFcnJvcnMgPSBlcnJvcnMgfHwgW107XG4gIGxvY2FsVHJhY2UgID0gdHJhY2UgIHx8IHByb3BlcnRpZXMuQ09OVEVYVF9BQ1RJVklUSUVTO1xuXG4gIGlmIChjb250ZXh0QWN0aXZpdGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChjb250ZXh0QWN0aXZpdGllcykpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuQ09OVEVYVF9BQ1RJVklUSUVTX01VU1RfQkVfTk9OX05VTExfTUFQX09CSkVDVCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5wYXJlbnQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5QQVJFTlQpLCBsb2NhbEVycm9ycyk7XG4gIHZhbGlkYXRlQ29udGV4dEFjdGl2aXR5U3ViQ29udGV4dChjb250ZXh0QWN0aXZpdGllcy5ncm91cGluZywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkdST1VQSU5HKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZUNvbnRleHRBY3Rpdml0eVN1YkNvbnRleHQoY29udGV4dEFjdGl2aXRpZXMuY2F0ZWdvcnksIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DQVRFR09SWSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVDb250ZXh0QWN0aXZpdHlTdWJDb250ZXh0KGNvbnRleHRBY3Rpdml0aWVzLm90aGVyLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT1RIRVIpLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoY29udGV4dEFjdGl2aXRpZXMsIHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb250ZXh0KGNvbnRleHQsIHRyYWNlLCBlcnJvcnMsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlID0gdHJhY2UgfHwgcHJvcGVydGllcy5DT05URVhUO1xuXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtyZXR1cm4gbG9jYWxFcnJvcnM7fVxuXG4gIGlmICgheGFwaVZhbGlkYXRpb25VdGlscy5pc05vbk51bGxNYXBPYmplY3QoY29udGV4dCkpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIGxvY2FsVHJhY2UsXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5DT05URVhUX01VU1RfQkVfTk9OX05VTF9NQVBfT0JKRUNULFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG9jYWxFcnJvcnM7XG4gIH1cblxuICBpZiAoY29udGV4dC5yZWdpc3RyYXRpb24gIT09IHVuZGVmaW5lZCAmJiAoY29udGV4dC5yZWdpc3RyYXRpb24gPT09IG51bGwgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoY29udGV4dC5yZWdpc3RyYXRpb24pIHx8ICF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChjb250ZXh0LnJlZ2lzdHJhdGlvbikpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJFR0lTVFJBVElPTiksXG4gICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRUdJU1RSQVRJT05fTVVTVF9CRV9VVUlEX1NUUklORyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuICB9XG5cbiAgaWYgKFtvYmplY3RUeXBlcy5HUk9VUCwgb2JqZWN0VHlwZXMuQUdFTlRdLmluZGV4T2Yoc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSkgIT09IHhhcGlHZW5lcmFsLk5PX0lOREVYX0ZPVU5EKSB7XG4gICAgaWYgKGNvbnRleHQucmV2aXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuUkVWSVNJT04pLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5SRVZJU0lPTl9NVVNUX0JFX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0LnBsYXRmb3JtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlBMQVRGT1JNKSxcbiAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuUExBVEZPUk1fTVVTVF9OT1RfQkVfVVNFRF9XSVRIX1JFVklTSU9OX0FHRU5UX09SX0dST1VQLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhjb250ZXh0LCBwcm9wZXJ0aWVzLlJFVklTSU9OLCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgLyppc1JlcXVpcmVkKi9mYWxzZSwgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzU3RyaW5nKGNvbnRleHQsIHByb3BlcnRpZXMuUExBVEZPUk0sIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL2ZhbHNlLCB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT04pO1xuXG4gIGlmIChjb250ZXh0LnRlYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdGVHcm91cChjb250ZXh0LnRlYW0sIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5URUFNKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuY29udGV4dEFjdGl2aXRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlQ29udGV4dEFjdGl2aXRpZXMoY29udGV4dC5jb250ZXh0QWN0aXZpdGllcywgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkNPTlRFWFRfQUNUSVZJVElFUyksIGxvY2FsRXJyb3JzKTtcbiAgfVxuXG4gIGlmIChjb250ZXh0Lmxhbmd1YWdlICE9PSB1bmRlZmluZWQgJiYgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNWYWxpZExhbmd1YWdlVGFnKGNvbnRleHQubGFuZ3VhZ2UpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkxBTkdVQUdFKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLkxBTkdVQUdFX01VU1RfQkVfU1RSSU5HLFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoY29udGV4dC5zdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkYXRlU3RhdGVtZW50UmVmKGNvbnRleHQuc3RhdGVtZW50LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuU1RBVEVNRU5UKSwgbG9jYWxFcnJvcnMpO1xuICB9XG5cbiAgaWYgKGNvbnRleHQuaW5zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNHcm91cChjb250ZXh0Lmluc3RydWN0b3IpKSB7XG4gICAgICB2YWxpZGF0ZUdyb3VwKGNvbnRleHQuaW5zdHJ1Y3RvciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLklOU1RSVUNUT1IpLCBsb2NhbEVycm9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlQWdlbnQoY29udGV4dC5pbnN0cnVjdG9yLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSU5TVFJVQ1RPUiksIGxvY2FsRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUV4dGVuc2lvbnMoY29udGV4dC5leHRlbnNpb25zLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuRVhURU5TSU9OUyksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVBYnNlbmNlT2ZOb25XaGl0ZWxpc3RlZFByb3BlcnRpZXMoY29udGV4dCwgeGFwaVdoaXRlTGlzdFByb3BlcnRpZXMuRVhURU5TSU9OUyxsb2NhbFRyYWNlLGxvY2FsRXJyb3JzKTtcblxuICByZXR1cm4gbG9jYWxFcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9iamVjdCwgdHJhY2UsIGVycm9ycywgaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzLCBsb2NhbFRyYWNlLCBvYmplY3RUeXBlO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLk9CSkVDVDtcblxuICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UpLFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX01VU1RfQkVfREVGSU5FRCxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChvYmplY3QpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLk9CSkVDVF9NVVNUX0JFX05PTl9OVUxMX01BUF9PQkpFQ1QsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcblxuICAgIHJldHVybiBsb2NhbEVycm9ycztcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcGVydHlJc1N0cmluZyhvYmplY3QsIHByb3BlcnRpZXMuT0JKRUNUX1RZUEUsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzLCAvKmlzUmVxdWlyZWQqL3RydWUsIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OKTtcblxuICBvYmplY3RUeXBlID0gb2JqZWN0Lm9iamVjdFR5cGUgfHwgb2JqZWN0VHlwZXMuQUNUSVZJVFk7XG5cbiAgc3dpdGNoIChvYmplY3RUeXBlKSB7XG4gICAgY2FzZSBvYmplY3RUeXBlcy5BQ1RJVklUWTpcbiAgICAgIHZhbGlkYXRlQWN0aXZpdHkob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG9iamVjdFR5cGVzLkFHRU5UOlxuICAgICAgdmFsaWRhdGVBZ2VudChvYmplY3QsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2Ugb2JqZWN0VHlwZXMuR1JPVVA6XG4gICAgICB2YWxpZGF0ZUdyb3VwKG9iamVjdCwgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBvYmplY3RUeXBlcy5TVEFURU1FTlRfUkVGOlxuICAgICAgdmFsaWRhdGVTdGF0ZW1lbnRSZWYob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIG9iamVjdFR5cGVzLlNVQl9TVEFURU1FTlQ6XG4gICAgICBpZiAoaXNXaXRoaW5TdWJTdGF0ZW1lbnQpIHtcbiAgICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5PQkpFQ1RfVFlQRSksXG4gICAgICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1VCX1NUQVRFTUVOVF9NVVNUX05PVF9DT05UQUlOX1NVQl9TVEFURU1FTlQsXG4gICAgICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFsaWRhdGUob2JqZWN0LCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycywgIC8qaXNTdWJTdGF0ZW1lbnQqL3RydWUpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGxvY2FsRXJyb3JzLnB1c2goe1xuICAgICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLk9CSkVDVF9UWVBFKSxcbiAgICAgICAgbWVzc2FnZTogYCR7eGFwaVZhbGlkYXRpb25FcnJvcnMuT0JKRUNUX1RZUEVfTVVTVF9CRV9WQUxJRF9PUFRJT059ICR7eEFwaVZhbGlkT2JqZWN0VHlwZXMudG9TdHJpbmcoKX1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxvY2FsRXJyb3JzO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShzdGF0ZW1lbnQsIHRyYWNlLCBlcnJvcnMsIGlzU3ViU3RhdGVtZW50KSB7XG4gIHZhciBsb2NhbEVycm9ycywgbG9jYWxUcmFjZSwgc3RhdGVtZW50T2JqZWN0T2JqZWN0VHlwZSwgd2hpdGVsaXN0ZWRQcm9wZXJ0aWVzO1xuXG4gIGxvY2FsRXJyb3JzID0gZXJyb3JzIHx8IFtdO1xuICBsb2NhbFRyYWNlICA9IHRyYWNlICB8fCBwcm9wZXJ0aWVzLlNUQVRFTUVOVDtcblxuICB3aGl0ZWxpc3RlZFByb3BlcnRpZXMgPSB4YXBpV2hpdGVMaXN0UHJvcGVydGllcy5TVEFURU1FTlQ7XG5cbiAgaWYgKCF4YXBpVmFsaWRhdGlvblV0aWxzLmlzTm9uTnVsbE1hcE9iamVjdChzdGF0ZW1lbnQpKSB7XG4gICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICB0cmFjZTogICB4YXBpVmFsaWRhdGlvblV0aWxzLmxvY2FsVHJhY2VUb1N0cmluZyhsb2NhbFRyYWNlKSxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9SRUZfTVVTVF9OT1RfQkVfTlVMTF9NQVBfT0JKRUNUUyxcbiAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvY2FsRXJyb3JzO1xuICB9XG5cbiAgaWYgKCFpc1N1YlN0YXRlbWVudCkge1xuICAgIGlmIChzdGF0ZW1lbnQuaWQgPT09IG51bGwgfHwgc3RhdGVtZW50LmlkID09PSB1bmRlZmluZWQgfHwgIXhhcGlWYWxpZGF0aW9uVXRpbHMuaXNTdHJpbmcoc3RhdGVtZW50LmlkKSkge1xuICAgICAgbG9jYWxFcnJvcnMucHVzaCh7XG4gICAgICAgIHRyYWNlOiAgIHhhcGlWYWxpZGF0aW9uVXRpbHMubG9jYWxUcmFjZVRvU3RyaW5nKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuSUQpLFxuICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5JRFNfU0hPVUxEX0JFX0dFTkVSQVRFRF9CWV9MUlMsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5TSE9VTERfVklPTEFUSU9OXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCF4YXBpVmFsaWRhdGlvblJlZ2V4LlVVSUQudGVzdChzdGF0ZW1lbnQuaWQpKSB7XG4gICAgICBsb2NhbEVycm9ycy5wdXNoKHtcbiAgICAgICAgdHJhY2U6ICAgeGFwaVZhbGlkYXRpb25VdGlscy5sb2NhbFRyYWNlVG9TdHJpbmcobG9jYWxUcmFjZSwgcHJvcGVydGllcy5JRCksXG4gICAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLklEX01VU1RfQkVfVkFMSUQsXG4gICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaXRlbGlzdGVkUHJvcGVydGllcyA9IHhhcGlXaGl0ZUxpc3RQcm9wZXJ0aWVzLlNVQl9TVEFURU1FTlQ7XG4gIH1cblxuICB2YWxpZGF0ZUFjdG9yKHN0YXRlbWVudC5hY3RvciwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFDVE9SKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZVZlcmIoc3RhdGVtZW50LnZlcmIsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5WRVJCKSwgbG9jYWxFcnJvcnMpO1xuICB2YWxpZGF0ZU9iamVjdChzdGF0ZW1lbnQub2JqZWN0LCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuT0JKRUNUKSwgbG9jYWxFcnJvcnMsIGlzU3ViU3RhdGVtZW50KTtcbiAgdmFsaWRhdGVSZXN1bHQoc3RhdGVtZW50LnJlc3VsdCwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLlJFU1VMVCksIGxvY2FsRXJyb3JzKTtcblxuICBzdGF0ZW1lbnRPYmplY3RPYmplY3RUeXBlID0gc3RhdGVtZW50Lm9iamVjdCAmJiBzdGF0ZW1lbnQub2JqZWN0Lm9iamVjdFR5cGUgPyBzdGF0ZW1lbnQub2JqZWN0Lm9iamVjdFR5cGUgOiBvYmplY3RUeXBlcy5BQ1RJVklUWTtcblxuICB2YWxpZGF0ZUNvbnRleHQoc3RhdGVtZW50LmNvbnRleHQsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5DT05URVhUKSwgbG9jYWxFcnJvcnMsIHN0YXRlbWVudE9iamVjdE9iamVjdFR5cGUpO1xuICB2YWxpZGF0ZVByb3BlcnR5SXNJU084NjAxU3RyaW5nKHN0YXRlbWVudCwgcHJvcGVydGllcy5USU1FU1RBTVAsIGxvY2FsVHJhY2UsIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVQcm9wZXJ0eUlzSVNPODYwMVN0cmluZyhzdGF0ZW1lbnQsIHByb3BlcnRpZXMuU1RPUkVELCBsb2NhbFRyYWNlLCBsb2NhbEVycm9ycyk7XG5cbiAgdmFsaWRhdGVBdXRob3JpdHkoc3RhdGVtZW50LmF1dGhvcml0eSwgeGFwaVZhbGlkYXRpb25VdGlscy5hZGRQcm9wVG9UcmFjZShsb2NhbFRyYWNlLCBwcm9wZXJ0aWVzLkFVVEhPUklUWSksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVWZXJzaW9uKHN0YXRlbWVudC52ZXJzaW9uLCB4YXBpVmFsaWRhdGlvblV0aWxzLmFkZFByb3BUb1RyYWNlKGxvY2FsVHJhY2UsIHByb3BlcnRpZXMuVkVSU0lPTiksIGxvY2FsRXJyb3JzKTtcbiAgdmFsaWRhdGVBdHRhY2htZW50cyhzdGF0ZW1lbnQuYXR0YWNobWVudHMsIHhhcGlWYWxpZGF0aW9uVXRpbHMuYWRkUHJvcFRvVHJhY2UobG9jYWxUcmFjZSwgcHJvcGVydGllcy5BVFRBQ0hNRU5UUyksIGxvY2FsRXJyb3JzKTtcblxuICB2YWxpZGF0ZUFic2VuY2VPZk5vbldoaXRlbGlzdGVkUHJvcGVydGllcyhzdGF0ZW1lbnQsIHdoaXRlbGlzdGVkUHJvcGVydGllcywgbG9jYWxUcmFjZSwgbG9jYWxFcnJvcnMpO1xuXG4gIHJldHVybiBsb2NhbEVycm9ycztcbn1cblxuZnVuY3Rpb24gbWFrZVN0YXRlbWVudFJlcG9ydChzdGF0ZW1lbnQpIHtcbiAgdmFyIGxvY2FsRXJyb3JzO1xuXG4gIGxvY2FsRXJyb3JzID0gW107XG4gIHZhbGlkYXRlKHN0YXRlbWVudCwgcHJvcGVydGllcy5TVEFURU1FTlQsIGxvY2FsRXJyb3JzLCAgLyppc1JlcXVpcmVkKi9mYWxzZSk7XG5cbiAgcmV0dXJuIG1ha2VWMVJlcG9ydChzdGF0ZW1lbnQsIGxvY2FsRXJyb3JzKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBbWJpZ3VvdXNUeXBlU3RhdGVtZW50KHN0YXRlbWVudCkge1xuICB2YXIgc3RhdGVtZW50T2JqZWN0O1xuXG4gIGlmIChzdGF0ZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydCgvKmluc3RhbmNlKi9udWxsLCB7XG4gICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9BUkdVTUVOVF9NVVNUX0JFX1BST1ZJREVELFxuICAgICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gICAgfSk7XG4gIH1cblxuICBpZiAoc3RhdGVtZW50ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG1ha2VWMVNpbmdsZUVycm9yUmVwb3J0KC8qaW5zdGFuY2UqL251bGwsIHtcbiAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgbWVzc2FnZTogeGFwaVZhbGlkYXRpb25FcnJvcnMuU1RBVEVNRU5UX01VU1RfTk9UX0JFX05VTEwsXG4gICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICB9KTtcbiAgfVxuXG4gIGlmICh4YXBpVmFsaWRhdGlvblV0aWxzLmlzU3RyaW5nKHN0YXRlbWVudCkpIHtcbiAgICB0cnkge1xuICAgICAgc3RhdGVtZW50T2JqZWN0ID0gSlNPTi5wYXJzZShzdGF0ZW1lbnQpO1xuICAgICAgaWYgKHN0YXRlbWVudE9iamVjdCA9PT0gbnVsbCB8fCAheGFwaVZhbGlkYXRpb25VdGlscy5pc09iamVjdChzdGF0ZW1lbnRPYmplY3QpIHx8IHhhcGlWYWxpZGF0aW9uVXRpbHMuaXNBcnJheShzdGF0ZW1lbnRPYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBtYWtlVjFTaW5nbGVFcnJvclJlcG9ydChzdGF0ZW1lbnRPYmplY3QsIHtcbiAgICAgICAgICB0cmFjZTogICBwcm9wZXJ0aWVzLlNUQVRFTUVOVCxcbiAgICAgICAgICBtZXNzYWdlOiB4YXBpVmFsaWRhdGlvbkVycm9ycy5TVEFURU1FTlRfTVVTVF9CRV9QQVJTRURfQ09SUkVDVExZLFxuICAgICAgICAgIGxldmVsOiAgIHhhcGlFcnJvckxldmVscy5NVVNUX1ZJT0xBVElPTlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoc3RhdGVtZW50T2JqZWN0LCB7XG4gICAgICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgICAgICBtZXNzYWdlOiBgJHt4YXBpVmFsaWRhdGlvbkVycm9ycy5JTlZBTElEX0pTT059OiAke2UubWVzc2FnZX1gLFxuICAgICAgICBsZXZlbDogICB4YXBpRXJyb3JMZXZlbHMuTVVTVF9WSU9MQVRJT05cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYWtlU3RhdGVtZW50UmVwb3J0KHN0YXRlbWVudE9iamVjdCk7XG4gIH1cblxuICBpZiAoeGFwaVZhbGlkYXRpb25VdGlscy5pc09iamVjdChzdGF0ZW1lbnQpICYmICF4YXBpVmFsaWRhdGlvblV0aWxzLmlzQXJyYXkoc3RhdGVtZW50KSkge1xuICAgIHJldHVybiBtYWtlU3RhdGVtZW50UmVwb3J0KHN0YXRlbWVudCk7XG4gIH1cblxuICByZXR1cm4gbWFrZVYxU2luZ2xlRXJyb3JSZXBvcnQoLyppbnN0YW5jZSovbnVsbCwge1xuICAgIHRyYWNlOiAgIHByb3BlcnRpZXMuU1RBVEVNRU5ULFxuICAgIG1lc3NhZ2U6IHhhcGlWYWxpZGF0aW9uRXJyb3JzLlNUQVRFTUVOVF9BUkdVTUVOVF9JU19OT1RfVkFMSUQsXG4gICAgbGV2ZWw6ICAgeGFwaUVycm9yTGV2ZWxzLk1VU1RfVklPTEFUSU9OXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkYXRlSW5jbHVkZXNab25lSW5mb3JtYXRpb24obWF0Y2hlZCkge1xuICByZXR1cm4gbWF0Y2hlZFtkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMuWk9ORV0gfHxcbiAgICAgICAgICAobWF0Y2hlZFtkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMuUkVMQVRJVkVfVElNRV0gJiYgbWF0Y2hlZFtkYXRlRm9ybWF0UmVnZXhQb3NpdGlvbnMuVElNRV9aT05FX0hPVVJdKTtcbn1cblxuZXhwb3J0IHZhciB2YWxpZGF0ZVN0YXRlbWVudCA9IHZhbGlkYXRlQW1iaWd1b3VzVHlwZVN0YXRlbWVudDtcbiJdfQ==\n"]} \ No newline at end of file diff --git a/lib/xapiValidator.js b/lib/xapiValidator.js index 400f97f..9d95f3f 100644 --- a/lib/xapiValidator.js +++ b/lib/xapiValidator.js @@ -1,4 +1,4 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.beepBoop = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;ow.xapiGeneral.MAX_SCALED_VALUE)&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.SCALED),message:Y.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.min&&(E(e,H.properties.MIN,t,a,!1),void 0!==e.raw&&e.rawe.max&&a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.RAW),message:Y.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,level:Y.xapiErrorLevels.MUST_VIOLATION})),E(e,H.properties.RAW,t,a,!1), -o(e,j.xapiWhiteListProperties.SCORE,t,a),a)}function U(e,i,r){var a,t;return a=r||[],t=i||H.properties.RESULT,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(F(e.score,z.xapiValidationUtils.addPropToTrace(t,H.properties.SCORE),a),n(e,H.properties.SUCCESS,t,a,!1),n(e,H.properties.COMPLETION,t,a,!1),s(e,H.properties.RESPONSE,t,a,!1),I(e.extensions,z.xapiValidationUtils.addPropToTrace(t,H.properties.EXTENSIONS),a),void 0===e.duration||null!==e.duration&&z.xapiValidationUtils.isString(e.duration)&&X.xapiValidationRegex.ISO_8601_DURATION.test(e.duration)||a.push({trace:z.xapiValidationUtils.addPropToTrace(t,H.properties.DURATION),message:Y.xapiValidationErrors.DURATION_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.RESULT,t,a),a):(a.push({trace:z.xapiValidationUtils.addPropToTrace(t),message:Y.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function M(e,i,r,a){var t,o,s,T;return t=a||[],o=r||H.properties.DATE_TIME,T=e[i],void 0===T?t:null!==T&&z.xapiValidationUtils.isString(T)?(s=X.xapiValidationRegex.ISO_8601_DATE_TIME.exec(T),s?G(s)||t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,level:Y.xapiErrorLevels.SHOULD_VIOLATION}):t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:Y.xapiValidationErrors.DATE_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}),t):(t.push({trace:z.xapiValidationUtils.localTraceToString(o,i),message:i+" "+Y.xapiValidationErrors.MUST_BE_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function V(e,i,r){var a,t;return a=r||[],t=i||H.properties.VERSION,void 0===e?a:(null!==e&&z.xapiValidationUtils.isString(e)&&X.xapiValidationRegex.SEMVER_1_P_0_P_0.test(e)||a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function x(e,i,r){var a,t;return a=r||[],t=i||H.properties.ATTACHMENT,z.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.display?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.DISPLAY),message:Y.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION}):O(e.display,z.xapiValidationUtils.addPropToTrace(t,H.properties.DISPLAY),a),O(e.description,z.xapiValidationUtils.addPropToTrace(t,H.properties.DESCRIPTION),a),T(e,H.properties.USAGE_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),T(e,H.properties.FILE_URL,t,a,!1,Y.xapiErrorLevels.MUST_VIOLATION),s(e,H.properties.CONTENT_TYPE,t,a,!0,Y.xapiErrorLevels.MUST_VIOLATION),void 0!==e.length&&null!==e.length&&z.xapiValidationUtils.isNumber(e.length)&&e.length%1===0||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.LENGTH),message:Y.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0===e.sha2?a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}):null!==e.sha2&&z.xapiValidationUtils.isString(e.sha2)&&X.xapiValidationRegex.BASE_64.test(e.sha2)||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.SHA2),message:Y.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),o(e,j.xapiWhiteListProperties.ATTACHMENT,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function R(e,i,r){var a,t;return a=r||[],t=i||H.properties.ATTACHMENTS,void 0===e?a:null!==e&&z.xapiValidationUtils.isArray(e)?(e.forEach(function(e,i){x(e,z.xapiValidationUtils.addLookupToTrace(t,i),a)}),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function L(e,i,r){var a,t,T;return a=r||[],t=i||H.properties.AGENT,z.xapiValidationUtils.isNonNullMapObject(e)?(T=u(e),T!==w.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:Y.xapiErrorLevels.MUST_VIOLATION}),e.objectType===H.objectTypes.GROUP&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,level:Y.xapiErrorLevels.MUST_VIOLATION}),l(e,t,a),s(e,H.properties.NAME,t,a,!1),o(e,j.xapiWhiteListProperties.AGENT,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function D(e,i,r){var a,t,T,p;return a=r||[],t=i||H.properties.GROUP,T=z.xapiValidationUtils.addPropToTrace(t,H.properties.MEMBER),z.xapiValidationUtils.isNonNullMapObject(e)?(p=u(e),0===p?null!==e.member&&void 0!==e.member||a.push({trace:T,message:Y.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,level:Y.xapiErrorLevels.MUST_VIOLATION}):p>w.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:Y.xapiErrorLevels.MUST_VIOLATION}),l(e,t,a),s(e,H.properties.NAME,t,a,!1),void 0!==e.member&&(null!==e.member&&z.xapiValidationUtils.isArray(e.member)?e.member.forEach(function(e,i){L(e,z.xapiValidationUtils.addLookupToTrace(T,i),a)}):a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.MEMBER),message:Y.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,level:Y.xapiErrorLevels.MUST_VIOLATION})),o(e,j.xapiWhiteListProperties.GROUP,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function v(e,i,r){var a,t;return a=r||[],t=i||H.properties.ACTOR,null===e||void 0===e?(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION}),a):(z.xapiValidationUtils.isGroup(e)?D(e,t,a):L(e,t,a),a)}function C(e,i,r){var a,t;return a=r||[],t=i||H.properties.AUTHORITY,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(z.xapiValidationUtils.isGroup(e)?(D(e,t,a),e.member&&e.member.length&&e.member.length===w.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS||a.push({trace:z.xapiValidationUtils.localTraceToString(t,H.properties.MEMBER),message:Y.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,level:Y.xapiErrorLevels.MUST_VIOLATION})):L(e,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function P(e,i,r){var a,t;return a=r||[],t=i||H.properties.SUB_CONTEXT,void 0===e?a:(null===e?a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,level:Y.xapiErrorLevels.MUST_VIOLATION}):z.xapiValidationUtils.isArray(e)?e.forEach(function(e,i){c(e,z.xapiValidationUtils.addLookupToTrace(t,i),a)}):z.xapiValidationUtils.isObject(e)?(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,level:Y.xapiErrorLevels.SHOULD_VIOLATION}),c(e,t,a)):a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function m(e,i,r){var a,t;return a=r||[],t=i||H.properties.CONTEXT_ACTIVITIES,void 0===e?a:z.xapiValidationUtils.isNonNullMapObject(e)?(P(e.parent,z.xapiValidationUtils.addPropToTrace(t,H.properties.PARENT),a),P(e.grouping,z.xapiValidationUtils.addPropToTrace(t,H.properties.GROUPING),a),P(e.category,z.xapiValidationUtils.addPropToTrace(t,H.properties.CATEGORY),a),P(e.other,z.xapiValidationUtils.addPropToTrace(t,H.properties.OTHER),a),o(e,j.xapiWhiteListProperties.CONTEXT_ACTIVITIES,t,a),a):(a.push({trace:z.xapiValidationUtils.localTraceToString(t),message:Y.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),a)}function g(e,i,r,a){var t,T;return t=r||[],T=i||H.properties.CONTEXT,void 0===e?t:z.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.registration||null!==e.registration&&z.xapiValidationUtils.isString(e.registration)&&X.xapiValidationRegex.UUID.test(e.registration)||t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.REGISTRATION),message:Y.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),[H.objectTypes.GROUP,H.objectTypes.AGENT].indexOf(a)!==w.xapiGeneral.NO_INDEX_FOUND&&(void 0!==e.revision&&t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.REVISION),message:Y.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.platform&&t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.PLATFORM),message:Y.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,level:Y.xapiErrorLevels.MUST_VIOLATION})),s(e,H.properties.REVISION,T,t,!1,Y.xapiErrorLevels.MUST_VIOLATION),s(e,H.properties.PLATFORM,T,t,!1,Y.xapiErrorLevels.MUST_VIOLATION),void 0!==e.team&&D(e.team,z.xapiValidationUtils.addPropToTrace(T,H.properties.TEAM),t),void 0!==e.contextActivities&&m(e.contextActivities,z.xapiValidationUtils.addPropToTrace(T,H.properties.CONTEXT_ACTIVITIES),t),void 0===e.language||z.xapiValidationUtils.isValidLanguageTag(e.language)||t.push({trace:z.xapiValidationUtils.localTraceToString(T,H.properties.LANGUAGE),message:Y.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,level:Y.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.statement&&A(e.statement,z.xapiValidationUtils.addPropToTrace(T,H.properties.STATEMENT),t),void 0!==e.instructor&&(z.xapiValidationUtils.isGroup(e.instructor)?D(e.instructor,z.xapiValidationUtils.addPropToTrace(T,H.properties.INSTRUCTOR),t):L(e.instructor,z.xapiValidationUtils.addPropToTrace(T,H.properties.INSTRUCTOR),t)),I(e.extensions,z.xapiValidationUtils.addPropToTrace(T,H.properties.EXTENSIONS),t),o(e,j.xapiWhiteListProperties.EXTENSIONS,T,t),t):(t.push({trace:T,message:Y.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function B(e,i,r,a){var t,o,T;if(t=r||[],o=i||H.properties.OBJECT,void 0===e)return t.push({trace:z.xapiValidationUtils.localTraceToString(o),message:Y.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,level:Y.xapiErrorLevels.MUST_VIOLATION}),t;if(!z.xapiValidationUtils.isNonNullMapObject(e))return t.push({trace:z.xapiValidationUtils.localTraceToString(o),message:Y.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,level:Y.xapiErrorLevels.MUST_VIOLATION}),t;switch(s(e,H.properties.OBJECT_TYPE,o,t,!0,Y.xapiErrorLevels.SHOULD_VIOLATION),T=e.objectType||H.objectTypes.ACTIVITY){case H.objectTypes.ACTIVITY:c(e,o,t);break;case H.objectTypes.AGENT:L(e,o,t);break;case H.objectTypes.GROUP:D(e,o,t);break;case H.objectTypes.STATEMENT_REF:A(e,o,t);break;case H.objectTypes.SUB_STATEMENT:a&&t.push({trace:z.xapiValidationUtils.localTraceToString(o,H.properties.OBJECT_TYPE),message:Y.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,level:Y.xapiErrorLevels.MUST_VIOLATION}),f(e,o,t,!0);break;default:t.push({trace:z.xapiValidationUtils.localTraceToString(o,H.properties.OBJECT_TYPE),message:Y.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION+" "+H.xApiValidObjectTypes.toString(),level:Y.xapiErrorLevels.MUST_VIOLATION})}return t}function f(e,i,r,a){var t,s,T,p;return t=r||[],s=i||H.properties.STATEMENT,p=j.xapiWhiteListProperties.STATEMENT,z.xapiValidationUtils.isNonNullMapObject(e)?(a?p=j.xapiWhiteListProperties.SUB_STATEMENT:null!==e.id&&void 0!==e.id&&z.xapiValidationUtils.isString(e.id)?X.xapiValidationRegex.UUID.test(e.id)||t.push({trace:z.xapiValidationUtils.localTraceToString(s,H.properties.ID),message:Y.xapiValidationErrors.ID_MUST_BE_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION}):t.push({trace:z.xapiValidationUtils.localTraceToString(s,H.properties.ID),message:Y.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,level:Y.xapiErrorLevels.SHOULD_VIOLATION}),v(e.actor,z.xapiValidationUtils.addPropToTrace(s,H.properties.ACTOR),t),N(e.verb,z.xapiValidationUtils.addPropToTrace(s,H.properties.VERB),t),B(e.object,z.xapiValidationUtils.addPropToTrace(s,H.properties.OBJECT),t,a),U(e.result,z.xapiValidationUtils.addPropToTrace(s,H.properties.RESULT),t),T=e.object&&e.object.objectType?e.object.objectType:H.objectTypes.ACTIVITY,g(e.context,z.xapiValidationUtils.addPropToTrace(s,H.properties.CONTEXT),t,T),M(e,H.properties.TIMESTAMP,s,t),M(e,H.properties.STORED,s,t),C(e.authority,z.xapiValidationUtils.addPropToTrace(s,H.properties.AUTHORITY),t),V(e.version,z.xapiValidationUtils.addPropToTrace(s,H.properties.VERSION),t),R(e.attachments,z.xapiValidationUtils.addPropToTrace(s,H.properties.ATTACHMENTS),t),o(e,p,s,t),t):(t.push({trace:z.xapiValidationUtils.localTraceToString(s),message:Y.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,level:Y.xapiErrorLevels.MUST_VIOLATION}),t)}function b(e){var i;return i=[],f(e,H.properties.STATEMENT,i,!1),a(e,i)}function h(e){var i;if(void 0===e)return t(null,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,level:Y.xapiErrorLevels.MUST_VIOLATION});if(null===e)return t(null,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,level:Y.xapiErrorLevels.MUST_VIOLATION});if(z.xapiValidationUtils.isString(e)){try{if(i=JSON.parse(e),null===i||!z.xapiValidationUtils.isObject(i)||z.xapiValidationUtils.isArray(i))return t(i,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,level:Y.xapiErrorLevels.MUST_VIOLATION})}catch(e){return t(i,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.INVALID_JSON+": "+e.message,level:Y.xapiErrorLevels.MUST_VIOLATION})}return b(i)}return z.xapiValidationUtils.isObject(e)&&!z.xapiValidationUtils.isArray(e)?b(e):t(null,{trace:H.properties.STATEMENT,message:Y.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,level:Y.xapiErrorLevels.MUST_VIOLATION})}function G(e){return e[X.dateFormatRegexPositions.ZONE]||e[X.dateFormatRegexPositions.RELATIVE_TIME]&&e[X.dateFormatRegexPositions.TIME_ZONE_HOUR]}Object.defineProperty(r,"__esModule",{value:!0});var y,H=e("./constants/properties"),j=e("./constants/whitelists"),Y=e("./constants/errors"),X=e("./constants/regex"),J=e("./constants/interaction-types"),w=e("./constants/general"),z=e("./utils/utils");y={validateStatement:h},r.default=y,window.xapiValidator=y},{"./constants/errors":1,"./constants/general":2,"./constants/interaction-types":3,"./constants/properties":4,"./constants/regex":5,"./constants/whitelists":6,"./utils/utils":7}]},{},[8])(8)}); +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i;i="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,i.xapiValidator=e()}}(function(){return function e(i,r,a){function t(s,T){if(!r[s]){if(!i[s]){var p="function"==typeof require&&require;if(!T&&p)return p(s,!0);if(o)return o(s,!0);var n=new Error("Cannot find module '"+s+"'");throw n.code="MODULE_NOT_FOUND",n}var E=r[s]={exports:{}};i[s][0].call(E.exports,function(e){var r=i[s][1][e];return t(r?r:e)},E,E.exports,e,i,r,a)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;sJ.xapiGeneral.MAX_SCALED_VALUE)&&a.push({trace:w.xapiValidationUtils.addPropToTrace(t,y.properties.SCALED),message:j.xapiValidationErrors.SCALED_MUST_BE_BETWEEN_0_1,level:j.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.min&&(E(e,y.properties.MIN,t,a,!1),void 0!==e.raw&&e.rawe.max&&a.push({trace:w.xapiValidationUtils.addPropToTrace(t,y.properties.RAW),message:j.xapiValidationErrors.RAW_MUST_BE_LESS_THAN_MAX,level:j.xapiErrorLevels.MUST_VIOLATION})),E(e,y.properties.RAW,t,a,!1), +o(e,H.xapiWhiteListProperties.SCORE,t,a),a)}function U(e,i,r){var a,t;return a=r||[],t=i||y.properties.RESULT,void 0===e?a:w.xapiValidationUtils.isNonNullMapObject(e)?(F(e.score,w.xapiValidationUtils.addPropToTrace(t,y.properties.SCORE),a),n(e,y.properties.SUCCESS,t,a,!1),n(e,y.properties.COMPLETION,t,a,!1),s(e,y.properties.RESPONSE,t,a,!1),I(e.extensions,w.xapiValidationUtils.addPropToTrace(t,y.properties.EXTENSIONS),a),void 0===e.duration||null!==e.duration&&w.xapiValidationUtils.isString(e.duration)&&Y.xapiValidationRegex.ISO_8601_DURATION.test(e.duration)||a.push({trace:w.xapiValidationUtils.addPropToTrace(t,y.properties.DURATION),message:j.xapiValidationErrors.DURATION_MUST_BE_VALID,level:j.xapiErrorLevels.MUST_VIOLATION}),o(e,H.xapiWhiteListProperties.RESULT,t,a),a):(a.push({trace:w.xapiValidationUtils.addPropToTrace(t),message:j.xapiValidationErrors.RESULT_MUST_BE_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function M(e,i,r,a){var t,o,s,T;return t=a||[],o=r||y.properties.DATE_TIME,T=e[i],void 0===T?t:null!==T&&w.xapiValidationUtils.isString(T)?(s=Y.xapiValidationRegex.ISO_8601_DATE_TIME.exec(T),s?G(s)||t.push({trace:w.xapiValidationUtils.localTraceToString(o,i),message:j.xapiValidationErrors.DATE_SHOULD_INCLUDE_ZONE_INFORMATION,level:j.xapiErrorLevels.SHOULD_VIOLATION}):t.push({trace:w.xapiValidationUtils.localTraceToString(o,i),message:j.xapiValidationErrors.DATE_MUST_BE_VALID,level:j.xapiErrorLevels.MUST_VIOLATION}),t):(t.push({trace:w.xapiValidationUtils.localTraceToString(o,i),message:i+" "+j.xapiValidationErrors.MUST_BE_STRING,level:j.xapiErrorLevels.MUST_VIOLATION}),t)}function V(e,i,r){var a,t;return a=r||[],t=i||y.properties.VERSION,void 0===e?a:(null!==e&&w.xapiValidationUtils.isString(e)&&Y.xapiValidationRegex.SEMVER_1_P_0_P_0.test(e)||a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.VERSION_MUST_COMPLY_SEMANTIC_VERSIONING,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function x(e,i,r){var a,t;return a=r||[],t=i||y.properties.ATTACHMENT,w.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.display?a.push({trace:w.xapiValidationUtils.localTraceToString(t,y.properties.DISPLAY),message:j.xapiValidationErrors.DISPLAY_SHOULD_BE_PROVIDED,level:j.xapiErrorLevels.MUST_VIOLATION}):O(e.display,w.xapiValidationUtils.addPropToTrace(t,y.properties.DISPLAY),a),O(e.description,w.xapiValidationUtils.addPropToTrace(t,y.properties.DESCRIPTION),a),T(e,y.properties.USAGE_TYPE,t,a,!0,j.xapiErrorLevels.MUST_VIOLATION),T(e,y.properties.FILE_URL,t,a,!1,j.xapiErrorLevels.MUST_VIOLATION),s(e,y.properties.CONTENT_TYPE,t,a,!0,j.xapiErrorLevels.MUST_VIOLATION),void 0!==e.length&&null!==e.length&&w.xapiValidationUtils.isNumber(e.length)&&e.length%1===0||a.push({trace:w.xapiValidationUtils.localTraceToString(t,y.properties.LENGTH),message:j.xapiValidationErrors.LENGTH_MUST_BE_INTEGER,level:j.xapiErrorLevels.MUST_VIOLATION}),void 0===e.sha2?a.push({trace:w.xapiValidationUtils.localTraceToString(t,y.properties.SHA2),message:j.xapiValidationErrors.SHA2_MUST_BE_PROVIDED_ON_ATTACHMENT_OBJECTS,level:j.xapiErrorLevels.MUST_VIOLATION}):null!==e.sha2&&w.xapiValidationUtils.isString(e.sha2)&&Y.xapiValidationRegex.BASE_64.test(e.sha2)||a.push({trace:w.xapiValidationUtils.localTraceToString(t,y.properties.SHA2),message:j.xapiValidationErrors.SHA2_MUST_CONTAIN_BASE_64_STRING,level:j.xapiErrorLevels.MUST_VIOLATION}),o(e,H.xapiWhiteListProperties.ATTACHMENT,t,a),a):(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.ATTACHMENTS_MUST_NOT_BE_NULL_MAP_OBJECTS,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function R(e,i,r){var a,t;return a=r||[],t=i||y.properties.ATTACHMENTS,void 0===e?a:null!==e&&w.xapiValidationUtils.isArray(e)?(e.forEach(function(e,i){x(e,w.xapiValidationUtils.addLookupToTrace(t,i),a)}),a):(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.ATTACHMENTS_MUST_BE_NOT_NULL_ARRAY,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function L(e,i,r){var a,t,T;return a=r||[],t=i||y.properties.AGENT,w.xapiValidationUtils.isNonNullMapObject(e)?(T=u(e),T!==J.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.AGENT_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:j.xapiErrorLevels.MUST_VIOLATION}),e.objectType===y.objectTypes.GROUP&&a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.AGENT_MUST_NOT_HAVE_GROUP_CHARACTERISTICS,level:j.xapiErrorLevels.MUST_VIOLATION}),l(e,t,a),s(e,y.properties.NAME,t,a,!1),o(e,H.xapiWhiteListProperties.AGENT,t,a),a):(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.AGENT_MUST_BE_NON_NULL_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function D(e,i,r){var a,t,T,p;return a=r||[],t=i||y.properties.GROUP,T=w.xapiValidationUtils.addPropToTrace(t,y.properties.MEMBER),w.xapiValidationUtils.isNonNullMapObject(e)?(p=u(e),0===p?null!==e.member&&void 0!==e.member||a.push({trace:T,message:j.xapiValidationErrors.MEMBER_MUST_BE_PROVIDED_FOR_ANONYMOUS_GROUPS,level:j.xapiErrorLevels.MUST_VIOLATION}):p>J.xapiGeneral.NUMER_OF_SPECIFIED_IFI_PROPERTIES&&a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.GROUP_IFI_PROPERTIES_MUST_BE_SPECIFIED,level:j.xapiErrorLevels.MUST_VIOLATION}),l(e,t,a),s(e,y.properties.NAME,t,a,!1),void 0!==e.member&&(null!==e.member&&w.xapiValidationUtils.isArray(e.member)?e.member.forEach(function(e,i){L(e,w.xapiValidationUtils.addLookupToTrace(T,i),a)}):a.push({trace:w.xapiValidationUtils.localTraceToString(t,y.properties.MEMBER),message:j.xapiValidationErrors.GROUP_MEMBER_MUST_BE_ARRAY,level:j.xapiErrorLevels.MUST_VIOLATION})),o(e,H.xapiWhiteListProperties.GROUP,t,a),a):(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.GROUP_MUST_BE_NON_NULL_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function v(e,i,r){var a,t;return a=r||[],t=i||y.properties.ACTOR,null===e||void 0===e?(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.ACTOR_MUST_BE_PROVIDED,level:j.xapiErrorLevels.MUST_VIOLATION}),a):(w.xapiValidationUtils.isGroup(e)?D(e,t,a):L(e,t,a),a)}function C(e,i,r){var a,t;return a=r||[],t=i||y.properties.AUTHORITY,void 0===e?a:w.xapiValidationUtils.isNonNullMapObject(e)?(w.xapiValidationUtils.isGroup(e)?(D(e,t,a),e.member&&e.member.length&&e.member.length===J.xapiGeneral.GROUP_AUTHORITY_AGENT_MEMBERS||a.push({trace:w.xapiValidationUtils.localTraceToString(t,y.properties.MEMBER),message:j.xapiValidationErrors.GROUP_AUTHORITY_AGENT_MEMBERS_MUST_BE_TWO,level:j.xapiErrorLevels.MUST_VIOLATION})):L(e,t,a),a):(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.AUTHORITY_MUST_BE_NON_NULL_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function P(e,i,r){var a,t;return a=r||[],t=i||y.properties.SUB_CONTEXT,void 0===e?a:(null===e?a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_NOT_BE_NULL,level:j.xapiErrorLevels.MUST_VIOLATION}):w.xapiValidationUtils.isArray(e)?e.forEach(function(e,i){c(e,w.xapiValidationUtils.addLookupToTrace(t,i),a)}):w.xapiValidationUtils.isObject(e)?(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.CONTEXT_ACTIVITIES_SHOULD_BE_AN_ARRAY,level:j.xapiErrorLevels.SHOULD_VIOLATION}),c(e,t,a)):a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_ARRAY_OR_ACTIVITY_OBJ,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function m(e,i,r){var a,t;return a=r||[],t=i||y.properties.CONTEXT_ACTIVITIES,void 0===e?a:w.xapiValidationUtils.isNonNullMapObject(e)?(P(e.parent,w.xapiValidationUtils.addPropToTrace(t,y.properties.PARENT),a),P(e.grouping,w.xapiValidationUtils.addPropToTrace(t,y.properties.GROUPING),a),P(e.category,w.xapiValidationUtils.addPropToTrace(t,y.properties.CATEGORY),a),P(e.other,w.xapiValidationUtils.addPropToTrace(t,y.properties.OTHER),a),o(e,H.xapiWhiteListProperties.CONTEXT_ACTIVITIES,t,a),a):(a.push({trace:w.xapiValidationUtils.localTraceToString(t),message:j.xapiValidationErrors.CONTEXT_ACTIVITIES_MUST_BE_NON_NULL_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),a)}function g(e,i,r,a){var t,T;return t=r||[],T=i||y.properties.CONTEXT,void 0===e?t:w.xapiValidationUtils.isNonNullMapObject(e)?(void 0===e.registration||null!==e.registration&&w.xapiValidationUtils.isString(e.registration)&&Y.xapiValidationRegex.UUID.test(e.registration)||t.push({trace:w.xapiValidationUtils.localTraceToString(T,y.properties.REGISTRATION),message:j.xapiValidationErrors.REGISTRATION_MUST_BE_UUID_STRING,level:j.xapiErrorLevels.MUST_VIOLATION}),[y.objectTypes.GROUP,y.objectTypes.AGENT].indexOf(a)!==J.xapiGeneral.NO_INDEX_FOUND&&(void 0!==e.revision&&t.push({trace:w.xapiValidationUtils.localTraceToString(T,y.properties.REVISION),message:j.xapiValidationErrors.REVISION_MUST_BE_AGENT_OR_GROUP,level:j.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.platform&&t.push({trace:w.xapiValidationUtils.localTraceToString(T,y.properties.PLATFORM),message:j.xapiValidationErrors.PLATFORM_MUST_NOT_BE_USED_WITH_REVISION_AGENT_OR_GROUP,level:j.xapiErrorLevels.MUST_VIOLATION})),s(e,y.properties.REVISION,T,t,!1,j.xapiErrorLevels.MUST_VIOLATION),s(e,y.properties.PLATFORM,T,t,!1,j.xapiErrorLevels.MUST_VIOLATION),void 0!==e.team&&D(e.team,w.xapiValidationUtils.addPropToTrace(T,y.properties.TEAM),t),void 0!==e.contextActivities&&m(e.contextActivities,w.xapiValidationUtils.addPropToTrace(T,y.properties.CONTEXT_ACTIVITIES),t),void 0===e.language||w.xapiValidationUtils.isValidLanguageTag(e.language)||t.push({trace:w.xapiValidationUtils.localTraceToString(T,y.properties.LANGUAGE),message:j.xapiValidationErrors.LANGUAGE_MUST_BE_STRING,level:j.xapiErrorLevels.MUST_VIOLATION}),void 0!==e.statement&&A(e.statement,w.xapiValidationUtils.addPropToTrace(T,y.properties.STATEMENT),t),void 0!==e.instructor&&(w.xapiValidationUtils.isGroup(e.instructor)?D(e.instructor,w.xapiValidationUtils.addPropToTrace(T,y.properties.INSTRUCTOR),t):L(e.instructor,w.xapiValidationUtils.addPropToTrace(T,y.properties.INSTRUCTOR),t)),I(e.extensions,w.xapiValidationUtils.addPropToTrace(T,y.properties.EXTENSIONS),t),o(e,H.xapiWhiteListProperties.EXTENSIONS,T,t),t):(t.push({trace:T,message:j.xapiValidationErrors.CONTEXT_MUST_BE_NON_NUL_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),t)}function B(e,i,r,a){var t,o,T;if(t=r||[],o=i||y.properties.OBJECT,void 0===e)return t.push({trace:w.xapiValidationUtils.localTraceToString(o),message:j.xapiValidationErrors.OBJECT_MUST_BE_DEFINED,level:j.xapiErrorLevels.MUST_VIOLATION}),t;if(!w.xapiValidationUtils.isNonNullMapObject(e))return t.push({trace:w.xapiValidationUtils.localTraceToString(o),message:j.xapiValidationErrors.OBJECT_MUST_BE_NON_NULL_MAP_OBJECT,level:j.xapiErrorLevels.MUST_VIOLATION}),t;switch(s(e,y.properties.OBJECT_TYPE,o,t,!0,j.xapiErrorLevels.SHOULD_VIOLATION),T=e.objectType||y.objectTypes.ACTIVITY){case y.objectTypes.ACTIVITY:c(e,o,t);break;case y.objectTypes.AGENT:L(e,o,t);break;case y.objectTypes.GROUP:D(e,o,t);break;case y.objectTypes.STATEMENT_REF:A(e,o,t);break;case y.objectTypes.SUB_STATEMENT:a&&t.push({trace:w.xapiValidationUtils.localTraceToString(o,y.properties.OBJECT_TYPE),message:j.xapiValidationErrors.SUB_STATEMENT_MUST_NOT_CONTAIN_SUB_STATEMENT,level:j.xapiErrorLevels.MUST_VIOLATION}),f(e,o,t,!0);break;default:t.push({trace:w.xapiValidationUtils.localTraceToString(o,y.properties.OBJECT_TYPE),message:j.xapiValidationErrors.OBJECT_TYPE_MUST_BE_VALID_OPTION+" "+y.xApiValidObjectTypes.toString(),level:j.xapiErrorLevels.MUST_VIOLATION})}return t}function f(e,i,r,a){var t,s,T,p;return t=r||[],s=i||y.properties.STATEMENT,p=H.xapiWhiteListProperties.STATEMENT,w.xapiValidationUtils.isNonNullMapObject(e)?(a?p=H.xapiWhiteListProperties.SUB_STATEMENT:null!==e.id&&void 0!==e.id&&w.xapiValidationUtils.isString(e.id)?Y.xapiValidationRegex.UUID.test(e.id)||t.push({trace:w.xapiValidationUtils.localTraceToString(s,y.properties.ID),message:j.xapiValidationErrors.ID_MUST_BE_VALID,level:j.xapiErrorLevels.MUST_VIOLATION}):t.push({trace:w.xapiValidationUtils.localTraceToString(s,y.properties.ID),message:j.xapiValidationErrors.IDS_SHOULD_BE_GENERATED_BY_LRS,level:j.xapiErrorLevels.SHOULD_VIOLATION}),v(e.actor,w.xapiValidationUtils.addPropToTrace(s,y.properties.ACTOR),t),N(e.verb,w.xapiValidationUtils.addPropToTrace(s,y.properties.VERB),t),B(e.object,w.xapiValidationUtils.addPropToTrace(s,y.properties.OBJECT),t,a),U(e.result,w.xapiValidationUtils.addPropToTrace(s,y.properties.RESULT),t),T=e.object&&e.object.objectType?e.object.objectType:y.objectTypes.ACTIVITY,g(e.context,w.xapiValidationUtils.addPropToTrace(s,y.properties.CONTEXT),t,T),M(e,y.properties.TIMESTAMP,s,t),M(e,y.properties.STORED,s,t),C(e.authority,w.xapiValidationUtils.addPropToTrace(s,y.properties.AUTHORITY),t),V(e.version,w.xapiValidationUtils.addPropToTrace(s,y.properties.VERSION),t),R(e.attachments,w.xapiValidationUtils.addPropToTrace(s,y.properties.ATTACHMENTS),t),o(e,p,s,t),t):(t.push({trace:w.xapiValidationUtils.localTraceToString(s),message:j.xapiValidationErrors.STATEMENT_REF_MUST_NOT_BE_NULL_MAP_OBJECTS,level:j.xapiErrorLevels.MUST_VIOLATION}),t)}function b(e){var i;return i=[],f(e,y.properties.STATEMENT,i,!1),a(e,i)}function h(e){var i;if(void 0===e)return t(null,{trace:y.properties.STATEMENT,message:j.xapiValidationErrors.STATEMENT_ARGUMENT_MUST_BE_PROVIDED,level:j.xapiErrorLevels.MUST_VIOLATION});if(null===e)return t(null,{trace:y.properties.STATEMENT,message:j.xapiValidationErrors.STATEMENT_MUST_NOT_BE_NULL,level:j.xapiErrorLevels.MUST_VIOLATION});if(w.xapiValidationUtils.isString(e)){try{if(i=JSON.parse(e),null===i||!w.xapiValidationUtils.isObject(i)||w.xapiValidationUtils.isArray(i))return t(i,{trace:y.properties.STATEMENT,message:j.xapiValidationErrors.STATEMENT_MUST_BE_PARSED_CORRECTLY,level:j.xapiErrorLevels.MUST_VIOLATION})}catch(e){return t(i,{trace:y.properties.STATEMENT,message:j.xapiValidationErrors.INVALID_JSON+": "+e.message,level:j.xapiErrorLevels.MUST_VIOLATION})}return b(i)}return w.xapiValidationUtils.isObject(e)&&!w.xapiValidationUtils.isArray(e)?b(e):t(null,{trace:y.properties.STATEMENT,message:j.xapiValidationErrors.STATEMENT_ARGUMENT_IS_NOT_VALID,level:j.xapiErrorLevels.MUST_VIOLATION})}function G(e){return e[Y.dateFormatRegexPositions.ZONE]||e[Y.dateFormatRegexPositions.RELATIVE_TIME]&&e[Y.dateFormatRegexPositions.TIME_ZONE_HOUR]}Object.defineProperty(r,"__esModule",{value:!0}),r.validateStatement=void 0;var y=e("./constants/properties"),H=e("./constants/whitelists"),j=e("./constants/errors"),Y=e("./constants/regex"),X=e("./constants/interaction-types"),J=e("./constants/general"),w=e("./utils/utils");r.validateStatement=h},{"./constants/errors":1,"./constants/general":2,"./constants/interaction-types":3,"./constants/properties":4,"./constants/regex":5,"./constants/whitelists":6,"./utils/utils":7}]},{},[8])(8)}); //# sourceMappingURL=maps/xapiValidator.min.js.map diff --git a/spec/mocha_runner.html b/spec/mocha_runner.html index afc5a35..46f5a38 100644 --- a/spec/mocha_runner.html +++ b/spec/mocha_runner.html @@ -13,7 +13,7 @@ expect = chai.expect; - +