diff --git a/creator/packages/steedos-creator/server/lib/uuflowManagerForInitApproval.coffee b/creator/packages/steedos-creator/server/lib/uuflowManagerForInitApproval.coffee index de0bb955a9..caeececa31 100644 --- a/creator/packages/steedos-creator/server/lib/uuflowManagerForInitApproval.coffee +++ b/creator/packages/steedos-creator/server/lib/uuflowManagerForInitApproval.coffee @@ -185,6 +185,8 @@ getInstanceFieldValue = (objField, formField, record, object_field, spaceId, rec value = selectFieldValue else if formField && objField && formField.type == 'date' && recordFieldValue value = uuflowManagerForInitApproval.formatDate(recordFieldValue) # Date转String + else if formField && objField && formField.type == 'time' && recordFieldValue + value = uuflowManagerForInitApproval.formatTime(recordFieldValue) # Time转String else if formField && objField && recordFieldValue && (formField.type == 'image' || formField.type == 'file') value = getFileFieldValue(recordFieldValue, formField.type) else if formField && objField && recordFieldValue && formField.type == 'lookup' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to) @@ -721,4 +723,7 @@ uuflowManagerForInitApproval.checkIsInApproval = (recordIds, spaceId) -> uuflowManagerForInitApproval.formatDate = (date) -> - return moment(date).format("YYYY-MM-DD") \ No newline at end of file + return moment(date).format("YYYY-MM-DD") + +uuflowManagerForInitApproval.formatTime = (date) -> + return moment(date).utcOffset(0).format("1970-01-01THH:mm:00.000[Z]") \ No newline at end of file diff --git a/creator/packages/steedos-formbuilder/lib/options.coffee b/creator/packages/steedos-formbuilder/lib/options.coffee index 9b5f077e8c..1016f4ffc6 100644 --- a/creator/packages/steedos-formbuilder/lib/options.coffee +++ b/creator/packages/steedos-formbuilder/lib/options.coffee @@ -1,8 +1,8 @@ # 定义 formBuilder 所有的字段类型 FORMBUILDERFIELDTYPES = ["autocomplete", "paragraph", "header", "select", - "checkbox-group", "radio-group", "checkbox", "text", "file", "image", "lookup" + "checkbox-group", "radio-group", "checkbox", "text", "file", "image", "lookup", "date", "number", "textarea", - "dateTime", "dateNew", "checkboxBoolean", "email", "url", "password", "user", "group", + "dateTime", "dateNew", "time", "checkboxBoolean", "email", "url", "password", "user", "group", "table", "section", "odata", "html"] @@ -17,7 +17,7 @@ DISABLEDATTRS = ['description', 'maxlength', 'placeholder', "access", "value", ' 'toggle', 'rows', 'subtype', 'multiple', 'name'] # 定义字段类型排序 -CONTROLORDER = ['text', 'textarea', 'number', 'dateNew', 'dateTime', 'date', 'checkboxBoolean', +CONTROLORDER = ['text', 'textarea', 'number', 'dateNew', 'dateTime', 'date', "time", 'checkboxBoolean', 'email', 'url', 'password', 'select', 'user', 'group', "radio-group", "checkbox-group", "file", "image", "lookup", "odata", "html", 'table', 'section'] # 获取各字段类型禁用的字段属性 @@ -177,6 +177,8 @@ getTypeUserAttrs = ()-> typeUserAttrs[item] = _.extend {}, CODEUSERATTRS, BASEUSERATTRS when 'dateTime' typeUserAttrs[item] = _.extend {}, CODEUSERATTRS, BASEUSERATTRS + when 'time' + typeUserAttrs[item] = _.extend {}, CODEUSERATTRS, BASEUSERATTRS when 'checkboxBoolean' typeUserAttrs[item] = _.extend {}, CODEUSERATTRS, BASEUSERATTRS when 'email' @@ -328,6 +330,13 @@ getFields = ()-> } icon: "🕛" }, + { + label: "时间", + attrs: { + type: 'time' + } + icon: "🕛" + }, { label: "勾选框" attrs: { @@ -433,6 +442,12 @@ getFieldTemplates = ()-> return { field: "", }; + time: (fieldData) -> + if !fieldData.className + fieldData.className = 'form-control' + return { + field: "", + }; checkboxBoolean: (fieldData)-> if fieldData.value fieldData.checked = fieldData.value diff --git a/creator/packages/steedos-formbuilder/lib/transform.coffee b/creator/packages/steedos-formbuilder/lib/transform.coffee index b755c49160..751bd199dd 100644 --- a/creator/packages/steedos-formbuilder/lib/transform.coffee +++ b/creator/packages/steedos-formbuilder/lib/transform.coffee @@ -115,6 +115,9 @@ Creator.formBuilder.transformFormFieldsIn = (formFields)-> when 'lookup' field.type = 'lookup'; fields.push field; + when 'time' + field.type = 'time'; + fields.push field; else console.log(f.code, f.name, f.type) diff --git a/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.js b/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.js index 89ece0435d..3ea78ef802 100644 --- a/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.js +++ b/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.js @@ -554,6 +554,7 @@ SteedosTable.getTDValue = function (field, value) { case 'file': case 'lookup': case 'image': + case 'time': td_value = InstanceReadOnlyTemplate.getValue(value, field); break default: diff --git a/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.less b/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.less index c00233513a..61b9c9af4f 100644 --- a/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.less +++ b/creator/packages/steedos-workflow/client/coreform/inputTypes/coreform-table/steedos-table.less @@ -160,6 +160,12 @@ display: none; } } + + .form-control{ + height: 100%; + min-height: 34px; + } + } .steedosTable-item-add{ diff --git a/creator/packages/steedos-workflow/client/coreform/inputTypes/steedos-field/steedos-field.js b/creator/packages/steedos-workflow/client/coreform/inputTypes/steedos-field/steedos-field.js index fa72fce7a5..c7d1ff2ae2 100644 --- a/creator/packages/steedos-workflow/client/coreform/inputTypes/steedos-field/steedos-field.js +++ b/creator/packages/steedos-workflow/client/coreform/inputTypes/steedos-field/steedos-field.js @@ -1,8 +1,8 @@ /* * @Author: baozhoutao@steedos.com * @Date: 2023-10-28 15:25:17 - * @LastEditors: baozhoutao@steedos.com - * @LastEditTime: 2023-11-23 13:27:39 + * @LastEditors: 孙浩林 sunhaolin@steedos.com + * @LastEditTime: 2024-04-26 10:45:13 * @Description: */ if (Meteor.isClient) { @@ -110,6 +110,14 @@ if (Meteor.isClient) { $("[name='"+atts.name+"']").data('value', values); $("[name='"+atts.name+"']").data('multiple', atts.multiple); const config = JSON.parse(atts.config || "{}"); + + let data = disabled ? {[atts.name]: values, _display: {}} : {_display: {}}; + let value = values; + if (atts.fieldType === 'time') { // 因为time类型在amis中给value赋值时,在编辑状态下值显示会多8小时,所以这里特殊处理。 + data = {[atts.name]: values, _display: {}}; + value = undefined; + } + const schema = { render_engine: 'amis', name: "steedos-field-"+atts.id, @@ -123,7 +131,7 @@ if (Meteor.isClient) { "actions": false, "wrapWithPanel": false, id: 'steedosField_' + atts.id, - data: disabled ? {[atts.name]: values, _display: {}} : {_display: {}}, + data: data, body: [ { type: 'steedos-field', @@ -137,7 +145,7 @@ if (Meteor.isClient) { reference_to_field: atts.reference_to_field, filters: _.isString(atts.filters) ? JSON.parse(atts.filters) : atts.filters, amis: { - value: values, + value: value, static: disabled, disabled: disabled, disabledOn: undefined diff --git a/creator/packages/steedos-workflow/client/lib/2_steedos_data_format.js b/creator/packages/steedos-workflow/client/lib/2_steedos_data_format.js index 391c9fa1d9..4594a3823f 100644 --- a/creator/packages/steedos-workflow/client/lib/2_steedos_data_format.js +++ b/creator/packages/steedos-workflow/client/lib/2_steedos_data_format.js @@ -306,6 +306,13 @@ var s_autoform = function (schema, field) { autoform.filters = field.filters; autoform.config = field.config; break; + case 'time': + schema.type = String; + autoform.readonly = (permission == 'readonly'); + autoform.disabled = (permission == 'readonly'); + autoform.type = 'steedos-field' + autoform.fieldType = 'time' + break; default: schema.type = String; autoform.readonly = (permission == 'readonly'); diff --git a/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee b/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee index 2354b3672c..2c5d3084fb 100644 --- a/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee +++ b/creator/packages/steedos-workflow/client/lib/instance_readonly_template.coffee @@ -315,6 +315,23 @@ InstanceReadOnlyTemplate.getValue = (value, field, locale, utcOffset) -> value = new Date(value) value = InstanceReadOnlyTemplate.formatDate(value, utcOffset); + when 'time' + if value && value.length == 16 + t = value.split("T") + t0 = t[0].split("-"); + t1 = t[1].split(":"); + + year = t0[0]; + month = t0[1]; + date = t0[2]; + hours = t1[0]; + seconds = t1[1]; + + value = new Date(year, month - 1, date, hours, seconds) + else + value = new Date(value) + + value = InstanceReadOnlyTemplate.formatTime(value); when 'input' if field.is_textarea value = value @@ -553,6 +570,10 @@ InstanceReadOnlyTemplate.formatDate = (date, utcOffset)-> return moment(date).utcOffset(utcOffset, passing).format("YYYY-MM-DD HH:mm"); +InstanceReadOnlyTemplate.formatTime = (date)-> + utcOffset = 0 + return moment(date).utcOffset(utcOffset).format("HH:mm"); + InstanceReadOnlyTemplate.getInstanceView = (user, space, instance, options)-> steedosData = _getTemplateData(user, space, instance, options) diff --git a/packages/standard-objects/objectTranslations/forms.en/forms.en.objectTranslation.yml b/packages/standard-objects/objectTranslations/forms.en/forms.en.objectTranslation.yml index c5838a6868..d4ae75f9cc 100644 --- a/packages/standard-objects/objectTranslations/forms.en/forms.en.objectTranslation.yml +++ b/packages/standard-objects/objectTranslations/forms.en/forms.en.objectTranslation.yml @@ -94,6 +94,8 @@ fields: value: dateTimeD - label: Date value: date + - label: Time + value: time - label: EmailGM - label: Group value: group diff --git a/packages/standard-objects/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml b/packages/standard-objects/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml index 39cfedcb4c..ec2954dfa5 100644 --- a/packages/standard-objects/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml +++ b/packages/standard-objects/objectTranslations/forms.zh-CN/forms.zh-CN.objectTranslation.yml @@ -94,6 +94,8 @@ fields: value: dateTime - label: 日期 value: date + - label: 时间 + value: time - label: 电子邮件 value: email - label: Group diff --git a/packages/standard-objects/workflow/forms.object.yml b/packages/standard-objects/workflow/forms.object.yml index 3e3eaeb472..ca920616cd 100644 --- a/packages/standard-objects/workflow/forms.object.yml +++ b/packages/standard-objects/workflow/forms.object.yml @@ -136,6 +136,8 @@ fields: value: dateTime - label: Date value: date + - label: Time + value: time - label: Email value: email - label: Group diff --git a/packages/standard-objects/workflow/instance_record_queue.object.js b/packages/standard-objects/workflow/instance_record_queue.object.js index 0555ca45d5..2ea3a34bef 100644 --- a/packages/standard-objects/workflow/instance_record_queue.object.js +++ b/packages/standard-objects/workflow/instance_record_queue.object.js @@ -300,7 +300,7 @@ const getRecordFieldValue = function (oField, wField, ofValue, wfValue, spaceId, value = wfValue ? wfValue : null } // 日期、日期时间 - else if (oFieldType === 'date' || oFieldType === 'datetime') { + else if (oFieldType === 'date' || oFieldType === 'datetime' || oFieldType === 'time') { if (wfValue && _.isDate(new Date(wfValue))) { value = new Date(wfValue); } diff --git a/packages/workflow/src/designerManager.js b/packages/workflow/src/designerManager.js index ff6769888c..251db1c01a 100644 --- a/packages/workflow/src/designerManager.js +++ b/packages/workflow/src/designerManager.js @@ -492,7 +492,7 @@ async function _transformObjectFieldToFormField(objField, codePrefix = '') { formField.type = "dateTime"; break; case 'time': - formField.type = "input"; + formField.type = "time"; break; case 'number': formField.type = "number"; diff --git a/server/bundle/programs/server/packages/modules.js b/server/bundle/programs/server/packages/modules.js index 3df18092c4..3f3823fcc3 100644 --- a/server/bundle/programs/server/packages/modules.js +++ b/server/bundle/programs/server/packages/modules.js @@ -463,7 +463,7 @@ module.useNode(); // module.exports = { "name": "@steedos/objectql", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "lib/index.js" }; @@ -490,7 +490,7 @@ module.useNode(); // module.exports = { "name": "@steedos/i18n", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "lib/index.js" }; @@ -517,7 +517,7 @@ module.useNode(); // module.exports = { "name": "@steedos/core", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "lib/index.js" }; @@ -544,7 +544,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-meteor-package-loader", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "index.js" }; @@ -571,7 +571,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-api", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "index.js" }; @@ -598,7 +598,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-metadata-server", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "index.js" }; @@ -625,7 +625,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-package-registry", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "package.service.js" }; @@ -652,7 +652,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-objectql", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "package.service.js" }; @@ -679,7 +679,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-ui", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "package.service.js" }; @@ -706,7 +706,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-pages", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "package.service.js" }; @@ -733,7 +733,7 @@ module.useNode(); // module.exports = { "name": "@steedos/router", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "lib/index.js" }; @@ -760,7 +760,7 @@ module.useNode(); // module.exports = { "name": "@steedos/auth", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "lib/index.js" }; @@ -787,7 +787,7 @@ module.useNode(); // module.exports = { "name": "@steedos/workflow", - "version": "2.7.0-beta.34", + "version": "2.7.1-beta.2", "main": "index.js" }; diff --git a/server/bundle/programs/server/packages/steedos_creator.js b/server/bundle/programs/server/packages/steedos_creator.js index 0216cde59a..6e1f93f896 100644 --- a/server/bundle/programs/server/packages/steedos_creator.js +++ b/server/bundle/programs/server/packages/steedos_creator.js @@ -2908,6 +2908,8 @@ getInstanceFieldValue = function (objField, formField, record, object_field, spa } } else if (formField && objField && formField.type === 'date' && recordFieldValue) { value = uuflowManagerForInitApproval.formatDate(recordFieldValue); + } else if (formField && objField && formField.type === 'time' && recordFieldValue) { + value = uuflowManagerForInitApproval.formatTime(recordFieldValue); } else if (formField && objField && recordFieldValue && (formField.type === 'image' || formField.type === 'file')) { value = getFileFieldValue(recordFieldValue, formField.type); } else if (formField && objField && recordFieldValue && formField.type === 'lookup' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)) { @@ -3540,6 +3542,10 @@ uuflowManagerForInitApproval.checkIsInApproval = function (recordIds, spaceId) { uuflowManagerForInitApproval.formatDate = function (date) { return moment(date).format("YYYY-MM-DD"); }; + +uuflowManagerForInitApproval.formatTime = function (date) { + return moment(date).utcOffset(0).format("1970-01-01THH:mm:00.000[Z]"); +}; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }}}}}}},{ @@ -3582,4 +3588,4 @@ Package._define("steedos:creator", { })(); //# sourceURL=meteor://💻app/packages/steedos_creator.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpjcmVhdG9yL2NoZWNrTnBtLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3IvY29yZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3IvbGliL2FwcHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL21ldGhvZHMvb2JqZWN0X3JlY2VudF92aWV3ZWQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9vYmplY3RfcmVjZW50X3ZpZXdlZC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbWV0aG9kcy9vYmplY3RfcmVjZW50X3JlY29yZC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF9yZWNlbnRfcmVjb3JkLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9tZXRob2RzL29iamVjdF9saXN0dmlld3Nfb3B0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF9saXN0dmlld3Nfb3B0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbWV0aG9kcy9yZXBvcnRfZGF0YS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3JlcG9ydF9kYXRhLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9tZXRob2RzL3VzZXJfdGFidWxhcl9zZXR0aW5ncy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3VzZXJfdGFidWxhcl9zZXR0aW5ncy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbWV0aG9kcy9vYmplY3RfZXhwb3J0MnhtbC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF9leHBvcnQyeG1sLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9tZXRob2RzL3JlbGF0ZWRfb2JqZWN0c19yZWNvcmRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvcmVsYXRlZF9vYmplY3RzX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL21ldGhvZHMvcGVuZGluZ19zcGFjZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3BlbmRpbmdfc3BhY2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9vYmplY3QuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL29iamVjdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvcHVibGljYXRpb25zL29iamVjdF90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9vYmplY3RfdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvcHVibGljYXRpb25zL29iamVjdF9saXN0dmlld3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX3RhYnVsYXJfc2V0dGluZ3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9yZWxhdGVkX29iamVjdHNfcmVjb3Jkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvcmVsYXRlZF9vYmplY3RzX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9zcGFjZV91c2VyX2luZm8uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9jb250YWN0c192aWV3X2xpbWl0cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvY29udGFjdHNfdmlld19saW1pdHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9jb250YWN0c19ub19mb3JjZV9waG9uZV91c2Vycy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvY29udGFjdHNfbm9fZm9yY2VfcGhvbmVfdXNlcnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9zcGFjZV9uZWVkX3RvX2NvbmZpcm0uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL3NwYWNlX25lZWRfdG9fY29uZmlybS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbGliL3Blcm1pc3Npb25fbWFuYWdlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9saWIvcGVybWlzc2lvbl9tYW5hZ2VyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9saWIvdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9saWIvdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jb2ZmZWUiXSwibmFtZXMiOlsiY2hlY2tOcG1WZXJzaW9ucyIsIm1vZHVsZSIsImxpbmsiLCJ2IiwiYnVzYm95IiwiTWV0ZW9yIiwic2V0dGluZ3MiLCJjZnMiLCJhbGl5dW4iLCJDcmVhdG9yIiwiZ2V0U2NoZW1hIiwib2JqZWN0X25hbWUiLCJyZWYiLCJnZXRPYmplY3QiLCJzY2hlbWEiLCJnZXRPYmplY3RIb21lQ29tcG9uZW50IiwiZ2V0T2JqZWN0VXJsIiwicmVjb3JkX2lkIiwiYXBwX2lkIiwibGlzdF92aWV3IiwibGlzdF92aWV3X2lkIiwiU2Vzc2lvbiIsImdldCIsImdldExpc3RWaWV3IiwiX2lkIiwiZ2V0UmVsYXRpdmVVcmwiLCJnZXRPYmplY3RBYnNvbHV0ZVVybCIsIlN0ZWVkb3MiLCJhYnNvbHV0ZVVybCIsImdldE9iamVjdFJvdXRlclVybCIsImdldExpc3RWaWV3VXJsIiwidXJsIiwiZ2V0TGlzdFZpZXdSZWxhdGl2ZVVybCIsImdldFN3aXRjaExpc3RVcmwiLCJnZXRSZWxhdGVkT2JqZWN0VXJsIiwicmVsYXRlZF9vYmplY3RfbmFtZSIsInJlbGF0ZWRfZmllbGRfbmFtZSIsImdldE9iamVjdExvb2t1cEZpZWxkT3B0aW9ucyIsImlzX2RlZXAiLCJpc19za2lwX2hpZGUiLCJpc19yZWxhdGVkIiwiX29iamVjdCIsIl9vcHRpb25zIiwiZmllbGRzIiwiaWNvbiIsInJlbGF0ZWRPYmplY3RzIiwiXyIsImZvckVhY2giLCJmIiwiayIsImhpZGRlbiIsInR5cGUiLCJwdXNoIiwibGFiZWwiLCJ2YWx1ZSIsInJfb2JqZWN0IiwicmVmZXJlbmNlX3RvIiwiaXNTdHJpbmciLCJmMiIsImsyIiwiZ2V0UmVsYXRlZE9iamVjdHMiLCJlYWNoIiwiX3RoaXMiLCJfcmVsYXRlZE9iamVjdCIsInJlbGF0ZWRPYmplY3QiLCJyZWxhdGVkT3B0aW9ucyIsInJlbGF0ZWRPcHRpb24iLCJmb3JlaWduX2tleSIsIm5hbWUiLCJnZXRPYmplY3RGaWx0ZXJGaWVsZE9wdGlvbnMiLCJwZXJtaXNzaW9uX2ZpZWxkcyIsImdldEZpZWxkcyIsImluY2x1ZGUiLCJ0ZXN0IiwiaW5kZXhPZiIsImdldE9iamVjdEZpZWxkT3B0aW9ucyIsImdldEZpbHRlcnNXaXRoRmlsdGVyRmllbGRzIiwiZmlsdGVycyIsImZpbHRlcl9maWVsZHMiLCJsZW5ndGgiLCJuIiwiZmllbGQiLCJyZXF1aXJlZCIsImZpbmRXaGVyZSIsImlzX2RlZmF1bHQiLCJpc19yZXF1aXJlZCIsImZpbHRlckl0ZW0iLCJtYXRjaEZpZWxkIiwiZmluZCIsImdldE9iamVjdFJlY29yZCIsInNlbGVjdF9maWVsZHMiLCJleHBhbmQiLCJjb2xsZWN0aW9uIiwib2JqIiwicmVjb3JkIiwicmVmMSIsInJlZjIiLCJpc0NsaWVudCIsIlRlbXBsYXRlIiwiaW5zdGFuY2UiLCJvZGF0YSIsImRhdGFiYXNlX25hbWUiLCJnZXRDb2xsZWN0aW9uIiwiZmluZE9uZSIsImdldE9iamVjdFJlY29yZE5hbWUiLCJuYW1lX2ZpZWxkX2tleSIsIk5BTUVfRklFTERfS0VZIiwiZ2V0QXBwIiwiYXBwTWVudXMiLCJjdXJyZW50QXBwIiwibWVudUl0ZW0iLCJpZCIsImdldEFwcERhc2hib2FyZCIsImFwcCIsImRhc2hib2FyZCIsIkRhc2hib2FyZHMiLCJhcHBzIiwiZ2V0QXBwRGFzaGJvYXJkQ29tcG9uZW50IiwiZ2V0QXBwT2JqZWN0TmFtZXMiLCJhcHBPYmplY3RzIiwiaXNNb2JpbGUiLCJvYmplY3RzIiwibW9iaWxlX29iamVjdHMiLCJwZXJtaXNzaW9ucyIsImFsbG93UmVhZCIsImdldFVybFdpdGhUb2tlbiIsImV4cHJlc3Npb25Gb3JtRGF0YSIsImhhc1F1ZXJ5U3ltYm9sIiwibGlua1N0ciIsInBhcmFtcyIsInNwYWNlSWQiLCJ1c2VySWQiLCJnZXRVc2VyQ29tcGFueUlkcyIsIkFjY291bnRzIiwiX3N0b3JlZExvZ2luVG9rZW4iLCJpc0V4cHJlc3Npb24iLCJwYXJzZVNpbmdsZUV4cHJlc3Npb24iLCJVU0VSX0NPTlRFWFQiLCIkIiwicGFyYW0iLCJnZXRBcHBNZW51IiwibWVudV9pZCIsIm1lbnVzIiwiZ2V0QXBwTWVudXMiLCJtZW51IiwiZ2V0QXBwTWVudVVybEZvckludGVybmV0IiwicGF0aCIsImdldEFwcE1lbnVVcmwiLCJ0YXJnZXQiLCJjdXJlbnRBcHBNZW51cyIsImNoaWxkcmVuIiwibG9hZEFwcHNNZW51cyIsImRhdGEiLCJvcHRpb25zIiwibW9iaWxlIiwic3VjY2VzcyIsInNldCIsImF1dGhSZXF1ZXN0IiwiY3JlYXRvckFwcHNTZWxlY3RvciIsImFzc2lnbmVkX2FwcHMiLCJhZG1pbkFwcCIsImNyZWF0b3JBcHBzIiwic29ydGVkQXBwcyIsImtleSIsImlzX2NyZWF0b3IiLCJ2aXNpYmxlIiwic29ydEJ5IiwidmFsdWVzIiwiYWRtaW4iLCJ2aXNpYmxlQXBwc1NlbGVjdG9yIiwiaW5jbHVkZUFkbWluIiwiZ2V0VmlzaWJsZUFwcHMiLCJjaGFuZ2VBcHAiLCJfc3ViQXBwIiwiT2JqZWN0IiwiYXNzaWduIiwiQXBwcyIsImdldFZpc2libGVBcHBzT2JqZWN0cyIsInZpc2libGVPYmplY3ROYW1lcyIsImZsYXR0ZW4iLCJwbHVjayIsImZpbHRlciIsIk9iamVjdHMiLCJzb3J0Iiwic29ydGluZ01ldGhvZCIsImJpbmQiLCJ1bmlxIiwiZ2V0QXBwc09iamVjdHMiLCJ0ZW1wT2JqZWN0cyIsImNvbmNhdCIsInZhbGlkYXRlRmlsdGVycyIsImxvZ2ljIiwiZSIsImVycm9yTXNnIiwiZmlsdGVyX2l0ZW1zIiwiZmlsdGVyX2xlbmd0aCIsImZsYWciLCJpbmRleCIsIndvcmQiLCJtYXAiLCJpc0VtcHR5IiwiY29tcGFjdCIsInJlcGxhY2UiLCJtYXRjaCIsImkiLCJpbmNsdWRlcyIsInciLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJ0b2FzdHIiLCJmb3JtYXRGaWx0ZXJzVG9Nb25nbyIsInNlbGVjdG9yIiwiQXJyYXkiLCJvcGVyYXRpb24iLCJvcHRpb24iLCJyZWciLCJzdWJfc2VsZWN0b3IiLCJldmFsdWF0ZUZvcm11bGEiLCJSZWdFeHAiLCJpc0JldHdlZW5GaWx0ZXJPcGVyYXRpb24iLCJnZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXMiLCJmb3JtYXRGaWx0ZXJzVG9EZXYiLCJsb2dpY1RlbXBGaWx0ZXJzIiwiaXNfbG9naWNfb3IiLCJwb3AiLCJTdGVlZG9zRmlsdGVycyIsImZvcm1hdExvZ2ljRmlsdGVyc1RvRGV2IiwiZmlsdGVyX2xvZ2ljIiwiZm9ybWF0X2xvZ2ljIiwieCIsIl9mIiwiaXNBcnJheSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZWxhdGVkX29iamVjdF9uYW1lcyIsInJlbGF0ZWRfb2JqZWN0cyIsInVucmVsYXRlZF9vYmplY3RzIiwiZ2V0T2JqZWN0UmVsYXRlZHMiLCJfY29sbGVjdGlvbl9uYW1lIiwiZ2V0UGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwicmVsYXRlZF9vYmplY3QiLCJpc0FjdGl2ZSIsImFsbG93UmVhZEZpbGVzIiwiZ2V0UmVsYXRlZE9iamVjdE5hbWVzIiwiZ2V0UmVsYXRlZE9iamVjdExpc3RBY3Rpb25zIiwicmVsYXRlZE9iamVjdE5hbWUiLCJhY3Rpb25zIiwiZ2V0QWN0aW9ucyIsImFjdGlvbiIsIm9uIiwiZGlzYWJsZWRfYWN0aW9ucyIsImhhcyIsImFsbG93X2N1c3RvbUFjdGlvbnMiLCJrZXlzIiwiZXhjbHVkZV9hY3Rpb25zIiwiZ2V0TGlzdFZpZXdzIiwiZGlzYWJsZWRfbGlzdF92aWV3cyIsImxpc3RWaWV3cyIsImxpc3Rfdmlld3MiLCJvYmplY3QiLCJpdGVtIiwiaXRlbV9uYW1lIiwiaXNEaXNhYmxlZCIsIm93bmVyIiwiZmllbGRzTmFtZSIsInVucmVhZGFibGVfZmllbGRzIiwiZ2V0T2JqZWN0RmllbGRzTmFtZSIsImlzbG9hZGluZyIsImJvb3RzdHJhcExvYWRlZCIsImNvbnZlcnRTcGVjaWFsQ2hhcmFjdGVyIiwic3RyIiwiZ2V0RGlzYWJsZWRGaWVsZHMiLCJmaWVsZE5hbWUiLCJhdXRvZm9ybSIsImRpc2FibGVkIiwib21pdCIsImdldEhpZGRlbkZpZWxkcyIsImdldEZpZWxkc1dpdGhOb0dyb3VwIiwiZ3JvdXAiLCJnZXRTb3J0ZWRGaWVsZEdyb3VwTmFtZXMiLCJuYW1lcyIsInVuaXF1ZSIsImdldEZpZWxkc0Zvckdyb3VwIiwiZ3JvdXBOYW1lIiwiZ2V0U3lzdGVtQmFzZUZpZWxkcyIsImdldEZpZWxkc1dpdGhvdXRTeXN0ZW1CYXNlIiwiZ2V0RmllbGRzV2l0aG91dE9taXQiLCJwaWNrIiwiZ2V0RmllbGRzSW5GaXJzdExldmVsIiwiZmlyc3RMZXZlbEtleXMiLCJnZXRGaWVsZHNGb3JSZW9yZGVyIiwiaXNTaW5nbGUiLCJfa2V5cyIsImNoaWxkS2V5cyIsImlzX3dpZGVfMSIsImlzX3dpZGVfMiIsInNjXzEiLCJzY18yIiwiZW5kc1dpdGgiLCJpc193aWRlIiwic2xpY2UiLCJpc0ZpbHRlclZhbHVlRW1wdHkiLCJOdW1iZXIiLCJpc05hTiIsImdldEZpZWxkRGF0YVR5cGUiLCJvYmplY3RGaWVsZHMiLCJyZXN1bHQiLCJkYXRhX3R5cGUiLCJpc1NlcnZlciIsImdldEFsbFJlbGF0ZWRPYmplY3RzIiwicmVsYXRlZF9maWVsZCIsImVuYWJsZV9maWxlcyIsImZvcm1hdEluZGV4IiwiYXJyYXkiLCJpbmRleE5hbWUiLCJpc2RvY3VtZW50REIiLCJiYWNrZ3JvdW5kIiwiZGF0YXNvdXJjZXMiLCJkb2N1bWVudERCIiwiam9pbiIsInN1YnN0cmluZyIsImFwcHNCeU5hbWUiLCJtZXRob2RzIiwic3BhY2VfaWQiLCJjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQiLCJjdXJyZW50X3JlY2VudF92aWV3ZWQiLCJkb2MiLCJzcGFjZSIsInVwZGF0ZSIsIiRpbmMiLCJjb3VudCIsIiRzZXQiLCJtb2RpZmllZCIsIkRhdGUiLCJtb2RpZmllZF9ieSIsImluc2VydCIsIl9tYWtlTmV3SUQiLCJvIiwiaWRzIiwiY3JlYXRlZCIsImNyZWF0ZWRfYnkiLCJ2YWxpZGF0ZSIsImFzeW5jX3JlY2VudF9hZ2dyZWdhdGUiLCJyZWNlbnRfYWdncmVnYXRlIiwic2VhcmNoX29iamVjdCIsIl9yZWNvcmRzIiwiY2FsbGJhY2siLCJDb2xsZWN0aW9ucyIsIm9iamVjdF9yZWNlbnRfdmlld2VkIiwicmF3Q29sbGVjdGlvbiIsImFnZ3JlZ2F0ZSIsIiRtYXRjaCIsIiRncm91cCIsIm1heENyZWF0ZWQiLCIkbWF4IiwiJHNvcnQiLCIkbGltaXQiLCJ0b0FycmF5IiwiZXJyIiwiRXJyb3IiLCJpc0Z1bmN0aW9uIiwid3JhcEFzeW5jIiwic2VhcmNoVGV4dCIsIl9vYmplY3RfY29sbGVjdGlvbiIsIl9vYmplY3RfbmFtZV9rZXkiLCJxdWVyeSIsInF1ZXJ5X2FuZCIsInJlY29yZHMiLCJzZWFyY2hfS2V5d29yZHMiLCJzcGxpdCIsImtleXdvcmQiLCJzdWJxdWVyeSIsIiRyZWdleCIsInRyaW0iLCIkYW5kIiwiJGluIiwibGltaXQiLCJfbmFtZSIsIl9vYmplY3RfbmFtZSIsInJlY29yZF9vYmplY3QiLCJyZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24iLCJzZWxmIiwib2JqZWN0c0J5TmFtZSIsIm9iamVjdF9yZWNvcmQiLCJlbmFibGVfc2VhcmNoIiwidXBkYXRlX2ZpbHRlcnMiLCJsaXN0dmlld19pZCIsImZpbHRlcl9zY29wZSIsIm9iamVjdF9saXN0dmlld3MiLCJkaXJlY3QiLCJ1cGRhdGVfY29sdW1ucyIsImNvbHVtbnMiLCJjaGVjayIsImNvbXBvdW5kRmllbGRzIiwiY3Vyc29yIiwiZmlsdGVyRmllbGRzIiwiY2hpbGRLZXkiLCJvYmplY3RGaWVsZCIsInNwbGl0cyIsImlzQ29tbW9uU3BhY2UiLCJpc1NwYWNlQWRtaW4iLCJza2lwIiwiZmV0Y2giLCJjb21wb3VuZEZpZWxkSXRlbSIsImNvbXBvdW5kRmlsdGVyRmllbGRzIiwiaXRlbUtleSIsIml0ZW1WYWx1ZSIsInJlZmVyZW5jZUl0ZW0iLCJzZXR0aW5nIiwiY29sdW1uX3dpZHRoIiwib2JqMSIsIl9pZF9hY3Rpb25zIiwiX21peEZpZWxkc0RhdGEiLCJfbWl4UmVsYXRlZERhdGEiLCJfd3JpdGVYbWxGaWxlIiwiZnMiLCJsb2dnZXIiLCJta2RpcnAiLCJ4bWwyanMiLCJyZXF1aXJlIiwiTG9nZ2VyIiwianNvbk9iaiIsIm9iak5hbWUiLCJidWlsZGVyIiwiZGF5IiwiZmlsZUFkZHJlc3MiLCJmaWxlTmFtZSIsImZpbGVQYXRoIiwibW9udGgiLCJub3ciLCJzdHJlYW0iLCJ4bWwiLCJ5ZWFyIiwiQnVpbGRlciIsImJ1aWxkT2JqZWN0IiwiQnVmZmVyIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJfX21ldGVvcl9ib290c3RyYXBfXyIsInNlcnZlckRpciIsImV4aXN0c1N5bmMiLCJzeW5jIiwid3JpdGVGaWxlIiwibWl4Qm9vbCIsIm1peERhdGUiLCJtaXhEZWZhdWx0Iiwib2JqRmllbGRzIiwiZmllbGRfbmFtZSIsImRhdGUiLCJkYXRlU3RyIiwiZm9ybWF0IiwibW9tZW50IiwicmVsYXRlZE9iak5hbWVzIiwicmVsYXRlZE9iak5hbWUiLCJyZWxhdGVkQ29sbGVjdGlvbiIsInJlbGF0ZWRSZWNvcmRMaXN0IiwicmVsYXRlZFRhYmxlRGF0YSIsInJlbGF0ZWRPYmoiLCJmaWVsZHNEYXRhIiwiRXhwb3J0MnhtbCIsInJlY29yZExpc3QiLCJpbmZvIiwidGltZSIsInJlY29yZE9iaiIsInRpbWVFbmQiLCJyZWxhdGVkX29iamVjdHNfcmVjb3JkcyIsInJlbGF0ZWRfcmVjb3JkcyIsInZpZXdBbGxSZWNvcmRzIiwiZ2V0UGVuZGluZ1NwYWNlSW5mbyIsImludml0ZXJJZCIsImludml0ZXJOYW1lIiwic3BhY2VOYW1lIiwiZGIiLCJ1c2VycyIsInNwYWNlcyIsImludml0ZXIiLCJyZWZ1c2VKb2luU3BhY2UiLCJzcGFjZV91c2VycyIsImludml0ZV9zdGF0ZSIsImFjY2VwdEpvaW5TcGFjZSIsInVzZXJfYWNjZXB0ZWQiLCJwdWJsaXNoIiwicHVibGlzaENvbXBvc2l0ZSIsInRhYmxlTmFtZSIsIl9maWVsZHMiLCJvYmplY3RfY29sbGVjaXRvbiIsInJlZmVyZW5jZV9maWVsZHMiLCJyZWFkeSIsIlN0cmluZyIsIk1hdGNoIiwiT3B0aW9uYWwiLCJnZXRPYmplY3ROYW1lIiwidW5ibG9jayIsImZpZWxkX2tleXMiLCJfb2JqZWN0S2V5cyIsInJlZmVyZW5jZV9maWVsZCIsInBhcmVudCIsImNoaWxkcmVuX2ZpZWxkcyIsInBfayIsInJlZmVyZW5jZV9pZHMiLCJyZWZlcmVuY2VfdG9fb2JqZWN0Iiwic19rIiwiZ2V0UHJvcGVydHkiLCJyZWR1Y2UiLCJpc09iamVjdCIsInNoYXJlZCIsInVzZXIiLCJzcGFjZV9zZXR0aW5ncyIsInBlcm1pc3Npb25NYW5hZ2VyRm9ySW5pdEFwcHJvdmFsIiwiZ2V0Rmxvd1Blcm1pc3Npb25zIiwiZmxvd19pZCIsInVzZXJfaWQiLCJmbG93IiwibXlfcGVybWlzc2lvbnMiLCJvcmdfaWRzIiwib3JnYW5pemF0aW9ucyIsIm9yZ3NfY2FuX2FkZCIsIm9yZ3NfY2FuX2FkbWluIiwib3Jnc19jYW5fbW9uaXRvciIsInVzZXJzX2Nhbl9hZGQiLCJ1c2Vyc19jYW5fYWRtaW4iLCJ1c2Vyc19jYW5fbW9uaXRvciIsInV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwiLCJnZXRGbG93IiwicGFyZW50cyIsIm9yZyIsInBhcmVudF9pZCIsInBlcm1zIiwib3JnX2lkIiwiX2V2YWwiLCJjaGVja1JlcXVpcmVkRGV0YWlscyIsImdldEZpZWxkT2RhdGFWYWx1ZSIsImdldEZpbGVGaWVsZFZhbHVlIiwiZ2V0Rm9ybUZpZWxkIiwiZ2V0Rm9ybVRhYmxlRmllbGQiLCJnZXRGb3JtVGFibGVGaWVsZENvZGUiLCJnZXRGb3JtVGFibGVTdWJGaWVsZCIsImdldEluc3RhbmNlRmllbGRWYWx1ZSIsImdldE9iamVjdENvbmZpZyIsImdldE9iamVjdE5hbWVGaWVsZEtleSIsImdldFJlbGF0ZWRPYmplY3RGaWVsZENvZGUiLCJnZXRSZWxhdGVkcyIsImdldFNlbGVjdE9yZ1ZhbHVlIiwiZ2V0U2VsZWN0T3JnVmFsdWVzIiwiZ2V0U2VsZWN0VXNlclZhbHVlIiwiZ2V0U2VsZWN0VXNlclZhbHVlcyIsIm9iamVjdEZpbmQiLCJvYmplY3RGaW5kT25lIiwib2JqZWN0VXBkYXRlIiwib2JqZWN0cWwiLCJvYmplY3RBcGlOYW1lIiwidG9Db25maWciLCJjYiIsInRoZW4iLCJyZXNvbHZlIiwicmVqZWN0IiwidG9wIiwicmVsYXRlZE9iamVjdHNLZXlzIiwicmVsYXRlZE9iamVjdHNLZXkiLCJzdGFydHNXaXRoIiwiZm9ybVRhYmxlRmllbGRzQ29kZSIsImZvcm1UYWJsZUZpZWxkQ29kZSIsImZvcm1UYWJsZUZpZWxkcyIsImNvZGUiLCJmb3JtRmllbGRzIiwiZmYiLCJzZiIsInRhYmxlRmllbGQiLCJzdWJGaWVsZENvZGUiLCJyZWZlcmVuY2VUb0ZpZWxkTmFtZSIsIl9yZWNvcmQiLCJuYW1lS2V5Iiwic3UiLCJ1c2VySWRzIiwic3VzIiwib3JnSWQiLCJmdWxsbmFtZSIsIm9yZ0lkcyIsIm9yZ3MiLCJyZWNvcmRGaWVsZElkIiwiZlR5cGUiLCJmaWxlcyIsIm5ld0ZpbGUiLCJGUyIsIkZpbGUiLCJhdHRhY2hEYXRhIiwiY3JlYXRlUmVhZFN0cmVhbSIsIm9yaWdpbmFsIiwibWV0YWRhdGEiLCJyZWFzb24iLCJzaXplIiwiaW5zdGFuY2VzIiwib2JqRmllbGQiLCJmb3JtRmllbGQiLCJvYmplY3RfZmllbGQiLCJyZWNvcmRGaWVsZFZhbHVlIiwiZW5hYmxlQW1pc2Zvcm0iLCJvZGF0YUZpZWxkVmFsdWUiLCJyZWZlcmVuY2VUb09iamVjdE5hbWUiLCJzZWxlY3RGaWVsZFZhbHVlIiwic3RlZWRvc19maWVsZCIsInJlZmVyZW5jZV90b19maWVsZCIsIm11bHRpcGxlIiwiaXNfbXVsdGlzZWxlY3QiLCJmb3JtYXREYXRlIiwiaGFzT3duUHJvcGVydHkiLCJyZXF1aXJlZERldGFpbHMiLCJtYXN0ZXJSZWNvcmQiLCJyZCIsIm1hc3RlckZpZWxkIiwibWFzdGVyRmllbGRWYWx1ZSIsInJlZklkIiwic3ViT2JqQ29uZmlnIiwic3ViVGFibGVNYXN0ZXJGaWVsZCIsInN1YlRhYmxlTmFtZSIsInN1YlRhYmxlUmVjb3JkIiwiY2hlY2tfYXV0aG9yaXphdGlvbiIsInJlcSIsImF1dGhUb2tlbiIsImhhc2hlZFRva2VuIiwiX2hhc2hMb2dpblRva2VuIiwiZ2V0U3BhY2UiLCJmbG93cyIsImdldFNwYWNlVXNlciIsInNwYWNlX3VzZXIiLCJnZXRTcGFjZVVzZXJPcmdJbmZvIiwib3JnYW5pemF0aW9uIiwib3JnYW5pemF0aW9uX25hbWUiLCJvcmdhbml6YXRpb25fZnVsbG5hbWUiLCJpc0Zsb3dFbmFibGVkIiwic3RhdGUiLCJpc0Zsb3dTcGFjZU1hdGNoZWQiLCJnZXRGb3JtIiwiZm9ybV9pZCIsImZvcm0iLCJmb3JtcyIsImdldENhdGVnb3J5IiwiY2F0ZWdvcnlfaWQiLCJjYXRlZ29yaWVzIiwiY2hlY2tTeW5jRGlyZWN0aW9uIiwib3ciLCJzeW5jRGlyZWN0aW9uIiwib2JqZWN0X3dvcmtmbG93cyIsInN5bmNfZGlyZWN0aW9uIiwiY3JlYXRlX2luc3RhbmNlIiwiaW5zdGFuY2VfZnJvbV9jbGllbnQiLCJ1c2VyX2luZm8iLCJhcHByX29iaiIsImFwcHJvdmVfZnJvbV9jbGllbnQiLCJjYXRlZ29yeSIsImluc19vYmoiLCJuZXdfaW5zX2lkIiwicmVsYXRlZFRhYmxlc0luZm8iLCJzcGFjZV91c2VyX29yZ19pbmZvIiwic3RhcnRfc3RlcCIsInRyYWNlX2Zyb21fY2xpZW50IiwidHJhY2Vfb2JqIiwiY2hlY2tJc0luQXBwcm92YWwiLCJwZXJtaXNzaW9uTWFuYWdlciIsImZsb3dfdmVyc2lvbiIsImN1cnJlbnQiLCJmb3JtX3ZlcnNpb24iLCJzdWJtaXR0ZXIiLCJzdWJtaXR0ZXJfbmFtZSIsImFwcGxpY2FudCIsImFwcGxpY2FudF9uYW1lIiwiYXBwbGljYW50X29yZ2FuaXphdGlvbiIsImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZSIsImFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWUiLCJhcHBsaWNhbnRfY29tcGFueSIsImNvbXBhbnlfaWQiLCJpc19hcmNoaXZlZCIsImlzX2RlbGV0ZWQiLCJyZWNvcmRfaWRzIiwiTW9uZ28iLCJPYmplY3RJRCIsIl9zdHIiLCJpc19maW5pc2hlZCIsInN0ZXBzIiwic3RlcCIsInN0ZXBfdHlwZSIsInN0YXJ0X2RhdGUiLCJ0cmFjZSIsInVzZXJfbmFtZSIsImhhbmRsZXIiLCJoYW5kbGVyX25hbWUiLCJoYW5kbGVyX29yZ2FuaXphdGlvbiIsImhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUiLCJoYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZSIsInJlYWRfZGF0ZSIsImlzX3JlYWQiLCJpc19lcnJvciIsImRlc2NyaXB0aW9uIiwiaW5pdGlhdGVWYWx1ZXMiLCJhcHByb3ZlcyIsInRyYWNlcyIsImluYm94X3VzZXJzIiwiY3VycmVudF9zdGVwX25hbWUiLCJhdXRvX3JlbWluZCIsImZsb3dfbmFtZSIsImNhdGVnb3J5X25hbWUiLCJpbml0aWF0ZVJlY29yZEluc3RhbmNlSW5mbyIsImluaXRpYXRlQXR0YWNoIiwicmVjb3JkSWRzIiwiZmxvd0lkIiwiZmllbGRDb2RlcyIsImZpbHRlclZhbHVlcyIsIm9iamVjdE5hbWUiLCJyZWNvcmRJZCIsInRhYmxlRmllbGRDb2RlcyIsInRhYmxlRmllbGRNYXAiLCJ0YWJsZVRvUmVsYXRlZE1hcCIsImVuYWJsZV9hbWlzZm9ybSIsInJlcXVpcmVkX2RldGFpbHMiLCJmaWVsZF9tYXAiLCJmbSIsImdyaWRDb2RlIiwibG9va3VwRmllbGROYW1lIiwibG9va3VwRmllbGRPYmoiLCJsb29rdXBPYmplY3RSZWNvcmQiLCJvVGFibGVDb2RlIiwib1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkIiwib1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkQ29kZSIsIm9UYWJsZUZpZWxkQ29kZSIsIm9iamVjdEZpZWxkTmFtZSIsIm9iamVjdEZpZWxkT2JqZWN0TmFtZSIsIm9iamVjdExvb2t1cEZpZWxkIiwicmVmZXJlbmNlVG9Eb2MiLCJyZWZlcmVuY2VUb0ZpZWxkVmFsdWUiLCJyZWxhdGVkT2JqZWN0RmllbGRDb2RlIiwidGFibGVUb1JlbGF0ZWRNYXBLZXkiLCJ3VGFibGVDb2RlIiwid29ya2Zsb3dfZmllbGQiLCJ0YWJsZTEiLCJ3b3JrZmxvd190YWJsZV9maWVsZF9jb2RlIiwib2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGUiLCJ0ZmMiLCJjIiwicGFyc2UiLCJ0ciIsIm5ld1RyIiwidGRWYWx1ZSIsInRmbSIsIndUZENvZGUiLCJmb3JtVGFibGVGaWVsZCIsInJlbGF0ZWRGaWVsZCIsInJlbGF0ZWRGaWVsZE5hbWUiLCJyZWxhdGVkUmVjb3JkcyIsInJlbGF0ZWRUYWJsZUl0ZW1zIiwidGFibGVDb2RlIiwidGFibGVWYWx1ZXMiLCJfRlJPTV9UQUJMRV9DT0RFIiwid2FybiIsInJlbGF0ZWRSZWNvcmQiLCJ0YWJsZVZhbHVlSXRlbSIsInZhbHVlS2V5IiwiZmllbGRLZXkiLCJmb3JtRmllbGRLZXkiLCJyZWxhdGVkT2JqZWN0RmllbGQiLCJ0YWJsZUZpZWxkVmFsdWUiLCJfdGFibGUiLCJfY29kZSIsImZpZWxkX21hcF9zY3JpcHQiLCJleHRlbmQiLCJldmFsRmllbGRNYXBTY3JpcHQiLCJvYmplY3RJZCIsImZ1bmMiLCJzY3JpcHQiLCJpbnNJZCIsImFwcHJvdmVJZCIsImNmIiwidmVyc2lvbnMiLCJ2ZXJzaW9uSWQiLCJpZHgiLCJvd25lcl9uYW1lIiwiYXBwcm92ZSIsImxvY2tlZCIsImluc3RhbmNlX3N0YXRlIiwiaW5pdGlhdGVSZWxhdGVkUmVjb3JkSW5zdGFuY2VJbmZvIiwidGFibGVJdGVtcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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LEVBQVloa0IsT0FBWjtBQUloRCxNQUFBcEMsTUFBQTtBQUFBQSxXQUFTd2MsY0FBYzRKLFVBQVUvVyxDQUF4QixFQUEyQjtBQUFFdFEsYUFBUyxDQUFDLENBQUMsS0FBRCxFQUFRLEdBQVIsRUFBYXFuQixVQUFVOVcsR0FBVixDQUFjLENBQWQsQ0FBYixDQUFELENBQVg7QUFBNkN6UyxZQUFRLENBQUMsV0FBRDtBQUFyRCxHQUEzQixDQUFUOztBQUVBLE1BQUdtRCxVQUFXQSxPQUFPb2YsU0FBbEIsSUFBZ0NwZixPQUFPb2YsU0FBUCxDQUFpQixDQUFqQixFQUFvQnVDLEtBQXBCLEtBQStCLFdBQS9ELElBQStFaG5CLFFBQVFvVixXQUFSLENBQW9CcVAsU0FBcEIsQ0FBOEIxZixJQUE5QixDQUFtQ00sT0FBT29mLFNBQVAsQ0FBaUIsQ0FBakIsRUFBb0IxakIsR0FBdkQsRUFBNERvVCxLQUE1RCxLQUFzRSxDQUF4SjtBQUNDLFVBQU0sSUFBSXZVLE9BQU9vVyxLQUFYLENBQWlCLFFBQWpCLEVBQTJCLCtCQUEzQixDQUFOO0FDaUhDO0FEeEg4QyxDQUFqRDs7QUFZQW9LLDZCQUE2QmtGLFVBQTdCLEdBQTBDLFVBQUM1SixJQUFEO0FBQ3pDLFNBQU9HLE9BQU9ILElBQVAsRUFBYUUsTUFBYixDQUFvQixZQUFwQixDQUFQO0FBRHlDLENBQTFDLEMiLCJmaWxlIjoiL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGNoZWNrTnBtVmVyc2lvbnNcbn0gZnJvbSAnbWV0ZW9yL3RtZWFzZGF5OmNoZWNrLW5wbS12ZXJzaW9ucyc7XG5jaGVja05wbVZlcnNpb25zKHtcblx0YnVzYm95OiBcIl4wLjIuMTNcIixcblx0XCJ4bWwyanNcIjogXCJeMC40LjE5XCIsXG59LCAnc3RlZWRvczpjcmVhdG9yJyk7XG5cbmlmIChNZXRlb3Iuc2V0dGluZ3MgJiYgTWV0ZW9yLnNldHRpbmdzLmNmcyAmJiBNZXRlb3Iuc2V0dGluZ3MuY2ZzLmFsaXl1bikge1xuXHRjaGVja05wbVZlcnNpb25zKHtcblx0XHRcImFsaXl1bi1zZGtcIjogXCJeMS4xMS4xMlwiXG5cdH0sICdzdGVlZG9zOmNyZWF0b3InKTtcbn0iLCJcblx0IyBDcmVhdG9yLmluaXRBcHBzKClcblxuXG4jIENyZWF0b3IuaW5pdEFwcHMgPSAoKS0+XG4jIFx0aWYgTWV0ZW9yLmlzU2VydmVyXG4jIFx0XHRfLmVhY2ggQ3JlYXRvci5BcHBzLCAoYXBwLCBhcHBfaWQpLT5cbiMgXHRcdFx0ZGJfYXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZClcbiMgXHRcdFx0aWYgIWRiX2FwcFxuIyBcdFx0XHRcdGFwcC5faWQgPSBhcHBfaWRcbiMgXHRcdFx0XHRkYi5hcHBzLmluc2VydChhcHApXG4jIGVsc2VcbiMgXHRhcHAuX2lkID0gYXBwX2lkXG4jIFx0ZGIuYXBwcy51cGRhdGUoe19pZDogYXBwX2lkfSwgYXBwKVxuXG5DcmVhdG9yLmdldFNjaGVtYSA9IChvYmplY3RfbmFtZSktPlxuXHRyZXR1cm4gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpPy5zY2hlbWFcblxuQ3JlYXRvci5nZXRPYmplY3RIb21lQ29tcG9uZW50ID0gKG9iamVjdF9uYW1lKS0+XG5cdCMgaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdCMgXHRyZXR1cm4gQnVpbGRlckNyZWF0b3IucGx1Z2luQ29tcG9uZW50U2VsZWN0b3IoQnVpbGRlckNyZWF0b3Iuc3RvcmUuZ2V0U3RhdGUoKSwgXCJPYmplY3RIb21lXCIsIG9iamVjdF9uYW1lKVxuXHRyZXR1cm4gZmFsc2U7XG5cbkNyZWF0b3IuZ2V0T2JqZWN0VXJsID0gKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkgLT5cblx0aWYgIWFwcF9pZFxuXHRcdGFwcF9pZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpXG5cdGlmICFvYmplY3RfbmFtZVxuXHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdGxpc3RfdmlldyA9IENyZWF0b3IuZ2V0TGlzdFZpZXcob2JqZWN0X25hbWUsIG51bGwpXG5cdGxpc3Rfdmlld19pZCA9IGxpc3Rfdmlldz8uX2lkXG5cblx0aWYgcmVjb3JkX2lkXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL3ZpZXcvXCIgKyByZWNvcmRfaWQpXG5cdGVsc2Vcblx0XHRpZiBDcmVhdG9yLmdldE9iamVjdEhvbWVDb21wb25lbnQob2JqZWN0X25hbWUpXG5cdFx0XHRyZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lKVxuXHRcdGVsc2Vcblx0XHRcdGlmIGxpc3Rfdmlld19pZFxuXHRcdFx0XHRyZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvZ3JpZC9cIiArIGxpc3Rfdmlld19pZClcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSlcblxuQ3JlYXRvci5nZXRPYmplY3RBYnNvbHV0ZVVybCA9IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpIC0+XG5cdGlmICFhcHBfaWRcblx0XHRhcHBfaWQgPSBTZXNzaW9uLmdldChcImFwcF9pZFwiKVxuXHRpZiAhb2JqZWN0X25hbWVcblx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblxuXHRsaXN0X3ZpZXcgPSBDcmVhdG9yLmdldExpc3RWaWV3KG9iamVjdF9uYW1lLCBudWxsKVxuXHRsaXN0X3ZpZXdfaWQgPSBsaXN0X3ZpZXc/Ll9pZFxuXG5cdGlmIHJlY29yZF9pZFxuXHRcdHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi92aWV3L1wiICsgcmVjb3JkX2lkLCB0cnVlKVxuXHRlbHNlXG5cdFx0cmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL2dyaWQvXCIgKyBsaXN0X3ZpZXdfaWQsIHRydWUpXG5cbkNyZWF0b3IuZ2V0T2JqZWN0Um91dGVyVXJsID0gKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkgLT5cblx0aWYgIWFwcF9pZFxuXHRcdGFwcF9pZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpXG5cdGlmICFvYmplY3RfbmFtZVxuXHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdGxpc3RfdmlldyA9IENyZWF0b3IuZ2V0TGlzdFZpZXcob2JqZWN0X25hbWUsIG51bGwpXG5cdGxpc3Rfdmlld19pZCA9IGxpc3Rfdmlldz8uX2lkXG5cblx0aWYgcmVjb3JkX2lkXG5cdFx0cmV0dXJuIFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi92aWV3L1wiICsgcmVjb3JkX2lkXG5cdGVsc2Vcblx0XHRyZXR1cm4gXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL2dyaWQvXCIgKyBsaXN0X3ZpZXdfaWRcblxuQ3JlYXRvci5nZXRMaXN0Vmlld1VybCA9IChvYmplY3RfbmFtZSwgYXBwX2lkLCBsaXN0X3ZpZXdfaWQpIC0+XG5cdHVybCA9IENyZWF0b3IuZ2V0TGlzdFZpZXdSZWxhdGl2ZVVybChvYmplY3RfbmFtZSwgYXBwX2lkLCBsaXN0X3ZpZXdfaWQpXG5cdHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKHVybClcblxuQ3JlYXRvci5nZXRMaXN0Vmlld1JlbGF0aXZlVXJsID0gKG9iamVjdF9uYW1lLCBhcHBfaWQsIGxpc3Rfdmlld19pZCkgLT5cblx0cmV0dXJuIFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkXG5cbkNyZWF0b3IuZ2V0U3dpdGNoTGlzdFVybCA9IChvYmplY3RfbmFtZSwgYXBwX2lkLCBsaXN0X3ZpZXdfaWQpIC0+XG5cdGlmIGxpc3Rfdmlld19pZFxuXHRcdHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9cIiArIGxpc3Rfdmlld19pZCArIFwiL2xpc3RcIilcblx0ZWxzZVxuXHRcdHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9saXN0L3N3aXRjaFwiKVxuXG5DcmVhdG9yLmdldFJlbGF0ZWRPYmplY3RVcmwgPSAob2JqZWN0X25hbWUsIGFwcF9pZCwgcmVjb3JkX2lkLCByZWxhdGVkX29iamVjdF9uYW1lLCByZWxhdGVkX2ZpZWxkX25hbWUpIC0+XG5cdGlmIHJlbGF0ZWRfZmllbGRfbmFtZVxuXHRcdHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9cIiArIHJlY29yZF9pZCArIFwiL1wiICsgcmVsYXRlZF9vYmplY3RfbmFtZSArIFwiL2dyaWQ/cmVsYXRlZF9maWVsZF9uYW1lPVwiICsgcmVsYXRlZF9maWVsZF9uYW1lKVxuXHRlbHNlXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL1wiICsgcmVjb3JkX2lkICsgXCIvXCIgKyByZWxhdGVkX29iamVjdF9uYW1lICsgXCIvZ3JpZFwiKVxuXG5DcmVhdG9yLmdldE9iamVjdExvb2t1cEZpZWxkT3B0aW9ucyA9IChvYmplY3RfbmFtZSwgaXNfZGVlcCwgaXNfc2tpcF9oaWRlLCBpc19yZWxhdGVkKS0+XG5cdF9vcHRpb25zID0gW11cblx0dW5sZXNzIG9iamVjdF9uYW1lXG5cdFx0cmV0dXJuIF9vcHRpb25zXG5cdF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0ZmllbGRzID0gX29iamVjdD8uZmllbGRzXG5cdGljb24gPSBfb2JqZWN0Py5pY29uXG5cdF8uZm9yRWFjaCBmaWVsZHMsIChmLCBrKS0+XG5cdFx0aWYgaXNfc2tpcF9oaWRlIGFuZCBmLmhpZGRlblxuXHRcdFx0cmV0dXJuXG5cdFx0aWYgZi50eXBlID09IFwic2VsZWN0XCJcblx0XHRcdF9vcHRpb25zLnB1c2gge2xhYmVsOiBcIiN7Zi5sYWJlbCB8fCBrfVwiLCB2YWx1ZTogXCIje2t9XCIsIGljb246IGljb259XG5cdFx0ZWxzZVxuXHRcdFx0X29wdGlvbnMucHVzaCB7bGFiZWw6IGYubGFiZWwgfHwgaywgdmFsdWU6IGssIGljb246IGljb259XG5cdGlmIGlzX2RlZXBcblx0XHRfLmZvckVhY2ggZmllbGRzLCAoZiwgayktPlxuXHRcdFx0aWYgaXNfc2tpcF9oaWRlIGFuZCBmLmhpZGRlblxuXHRcdFx0XHRyZXR1cm5cblx0XHRcdGlmIChmLnR5cGUgPT0gXCJsb29rdXBcIiB8fCBmLnR5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCIpICYmIGYucmVmZXJlbmNlX3RvICYmIF8uaXNTdHJpbmcoZi5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdCMg5LiN5pSv5oyBZi5yZWZlcmVuY2VfdG/kuLpmdW5jdGlvbueahOaDheWGte+8jOaciemcgOaxguWGjeivtFxuXHRcdFx0XHRyX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KGYucmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRpZiByX29iamVjdFxuXHRcdFx0XHRcdF8uZm9yRWFjaCByX29iamVjdC5maWVsZHMsIChmMiwgazIpLT5cblx0XHRcdFx0XHRcdF9vcHRpb25zLnB1c2gge2xhYmVsOiBcIiN7Zi5sYWJlbCB8fCBrfT0+I3tmMi5sYWJlbCB8fCBrMn1cIiwgdmFsdWU6IFwiI3trfS4je2syfVwiLCBpY29uOiByX29iamVjdD8uaWNvbn1cblx0aWYgaXNfcmVsYXRlZFxuXHRcdHJlbGF0ZWRPYmplY3RzID0gQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0cyhvYmplY3RfbmFtZSlcblx0XHRfLmVhY2ggcmVsYXRlZE9iamVjdHMsIChfcmVsYXRlZE9iamVjdCk9PlxuXHRcdFx0cmVsYXRlZE9wdGlvbnMgPSBDcmVhdG9yLmdldE9iamVjdExvb2t1cEZpZWxkT3B0aW9ucyhfcmVsYXRlZE9iamVjdC5vYmplY3RfbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSlcblx0XHRcdHJlbGF0ZWRPYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChfcmVsYXRlZE9iamVjdC5vYmplY3RfbmFtZSlcblx0XHRcdF8uZWFjaCByZWxhdGVkT3B0aW9ucywgKHJlbGF0ZWRPcHRpb24pLT5cblx0XHRcdFx0aWYgX3JlbGF0ZWRPYmplY3QuZm9yZWlnbl9rZXkgIT0gcmVsYXRlZE9wdGlvbi52YWx1ZVxuXHRcdFx0XHRcdF9vcHRpb25zLnB1c2gge2xhYmVsOiBcIiN7cmVsYXRlZE9iamVjdC5sYWJlbCB8fCByZWxhdGVkT2JqZWN0Lm5hbWV9PT4je3JlbGF0ZWRPcHRpb24ubGFiZWx9XCIsIHZhbHVlOiBcIiN7cmVsYXRlZE9iamVjdC5uYW1lfS4je3JlbGF0ZWRPcHRpb24udmFsdWV9XCIsIGljb246IHJlbGF0ZWRPYmplY3Q/Lmljb259XG5cdHJldHVybiBfb3B0aW9uc1xuXG4jIOe7n+S4gOS4uuWvueixoW9iamVjdF9uYW1l5o+Q5L6b5Y+v55So5LqO6L+H6JmR5Zmo6L+H6JmR5a2X5q61XG5DcmVhdG9yLmdldE9iamVjdEZpbHRlckZpZWxkT3B0aW9ucyA9IChvYmplY3RfbmFtZSktPlxuXHRfb3B0aW9ucyA9IFtdXG5cdHVubGVzcyBvYmplY3RfbmFtZVxuXHRcdHJldHVybiBfb3B0aW9uc1xuXHRfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdGZpZWxkcyA9IF9vYmplY3Q/LmZpZWxkc1xuXHRwZXJtaXNzaW9uX2ZpZWxkcyA9IENyZWF0b3IuZ2V0RmllbGRzKG9iamVjdF9uYW1lKVxuXHRpY29uID0gX29iamVjdD8uaWNvblxuXHRfLmZvckVhY2ggZmllbGRzLCAoZiwgayktPlxuXHRcdCMgaGlkZGVuLGdyaWTnrYnnsbvlnovnmoTlrZfmrrXvvIzkuI3pnIDopoHov4fmu6Rcblx0XHRpZiAhXy5pbmNsdWRlKFtcImdyaWRcIixcIm9iamVjdFwiLCBcIltPYmplY3RdXCIsIFwiW29iamVjdF1cIiwgXCJPYmplY3RcIiwgXCJhdmF0YXJcIiwgXCJpbWFnZVwiLCBcIm1hcmtkb3duXCIsIFwiaHRtbFwiXSwgZi50eXBlKSBhbmQgIWYuaGlkZGVuXG5cdFx0XHQjIGZpbHRlcnMuJC5maWVsZOWPimZsb3cuY3VycmVudOetieWtkOWtl+auteS5n+S4jemcgOimgei/h+a7pFxuXHRcdFx0aWYgIS9cXHcrXFwuLy50ZXN0KGspIGFuZCBfLmluZGV4T2YocGVybWlzc2lvbl9maWVsZHMsIGspID4gLTFcblx0XHRcdFx0X29wdGlvbnMucHVzaCB7bGFiZWw6IGYubGFiZWwgfHwgaywgdmFsdWU6IGssIGljb246IGljb259XG5cblx0cmV0dXJuIF9vcHRpb25zXG5cbkNyZWF0b3IuZ2V0T2JqZWN0RmllbGRPcHRpb25zID0gKG9iamVjdF9uYW1lKS0+XG5cdF9vcHRpb25zID0gW11cblx0dW5sZXNzIG9iamVjdF9uYW1lXG5cdFx0cmV0dXJuIF9vcHRpb25zXG5cdF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0ZmllbGRzID0gX29iamVjdD8uZmllbGRzXG5cdHBlcm1pc3Npb25fZmllbGRzID0gQ3JlYXRvci5nZXRGaWVsZHMob2JqZWN0X25hbWUpXG5cdGljb24gPSBfb2JqZWN0Py5pY29uXG5cdF8uZm9yRWFjaCBmaWVsZHMsIChmLCBrKS0+XG5cdFx0aWYgIV8uaW5jbHVkZShbXCJncmlkXCIsXCJvYmplY3RcIiwgXCJbT2JqZWN0XVwiLCBcIltvYmplY3RdXCIsIFwiT2JqZWN0XCIsIFwibWFya2Rvd25cIiwgXCJodG1sXCJdLCBmLnR5cGUpXG5cdFx0XHRpZiAhL1xcdytcXC4vLnRlc3QoaykgYW5kIF8uaW5kZXhPZihwZXJtaXNzaW9uX2ZpZWxkcywgaykgPiAtMVxuXHRcdFx0XHRfb3B0aW9ucy5wdXNoIHtsYWJlbDogZi5sYWJlbCB8fCBrLCB2YWx1ZTogaywgaWNvbjogaWNvbn1cblx0cmV0dXJuIF9vcHRpb25zXG5cbiMjI1xuZmlsdGVyczog6KaB6L2s5o2i55qEZmlsdGVyc1xuZmllbGRzOiDlr7nosaHlrZfmrrVcbmZpbHRlcl9maWVsZHM6IOm7mOiupOi/h+a7pOWtl+aute+8jOaUr+aMgeWtl+espuS4suaVsOe7hOWSjOWvueixoeaVsOe7hOS4pOenjeagvOW8j++8jOWmgjpbJ2ZpbGVkX25hbWUxJywnZmlsZWRfbmFtZTInXSxbe2ZpZWxkOidmaWxlZF9uYW1lMScscmVxdWlyZWQ6dHJ1ZX1dXG7lpITnkIbpgLvovpE6IOaKimZpbHRlcnPkuK3lrZjlnKjkuo5maWx0ZXJfZmllbGRz55qE6L+H5ruk5p2h5Lu25aKe5Yqg5q+P6aG555qEaXNfZGVmYXVsdOOAgWlzX3JlcXVpcmVk5bGe5oCn77yM5LiN5a2Y5Zyo5LqOZmlsdGVyX2ZpZWxkc+eahOi/h+a7pOadoeS7tuWvueW6lOeahOenu+mZpOavj+mhueeahOebuOWFs+WxnuaAp1xu6L+U5Zue57uT5p6cOiDlpITnkIblkI7nmoRmaWx0ZXJzXG4jIyNcbkNyZWF0b3IuZ2V0RmlsdGVyc1dpdGhGaWx0ZXJGaWVsZHMgPSAoZmlsdGVycywgZmllbGRzLCBmaWx0ZXJfZmllbGRzKS0+XG5cdHVubGVzcyBmaWx0ZXJzXG5cdFx0ZmlsdGVycyA9IFtdXG5cdHVubGVzcyBmaWx0ZXJfZmllbGRzXG5cdFx0ZmlsdGVyX2ZpZWxkcyA9IFtdXG5cdGlmIGZpbHRlcl9maWVsZHM/Lmxlbmd0aFxuXHRcdGZpbHRlcl9maWVsZHMuZm9yRWFjaCAobiktPlxuXHRcdFx0aWYgXy5pc1N0cmluZyhuKVxuXHRcdFx0XHRuID0gXG5cdFx0XHRcdFx0ZmllbGQ6IG4sXG5cdFx0XHRcdFx0cmVxdWlyZWQ6IGZhbHNlXG5cdFx0XHRpZiBmaWVsZHNbbi5maWVsZF0gYW5kICFfLmZpbmRXaGVyZShmaWx0ZXJzLHtmaWVsZDpuLmZpZWxkfSlcblx0XHRcdFx0ZmlsdGVycy5wdXNoXG5cdFx0XHRcdFx0ZmllbGQ6IG4uZmllbGQsXG5cdFx0XHRcdFx0aXNfZGVmYXVsdDogdHJ1ZSxcblx0XHRcdFx0XHRpc19yZXF1aXJlZDogbi5yZXF1aXJlZFxuXHRmaWx0ZXJzLmZvckVhY2ggKGZpbHRlckl0ZW0pLT5cblx0XHRtYXRjaEZpZWxkID0gZmlsdGVyX2ZpZWxkcy5maW5kIChuKS0+IHJldHVybiBuID09IGZpbHRlckl0ZW0uZmllbGQgb3Igbi5maWVsZCA9PSBmaWx0ZXJJdGVtLmZpZWxkXG5cdFx0aWYgXy5pc1N0cmluZyhtYXRjaEZpZWxkKVxuXHRcdFx0bWF0Y2hGaWVsZCA9IFxuXHRcdFx0XHRmaWVsZDogbWF0Y2hGaWVsZCxcblx0XHRcdFx0cmVxdWlyZWQ6IGZhbHNlXG5cdFx0aWYgbWF0Y2hGaWVsZFxuXHRcdFx0ZmlsdGVySXRlbS5pc19kZWZhdWx0ID0gdHJ1ZVxuXHRcdFx0ZmlsdGVySXRlbS5pc19yZXF1aXJlZCA9IG1hdGNoRmllbGQucmVxdWlyZWRcblx0XHRlbHNlXG5cdFx0XHRkZWxldGUgZmlsdGVySXRlbS5pc19kZWZhdWx0XG5cdFx0XHRkZWxldGUgZmlsdGVySXRlbS5pc19yZXF1aXJlZFxuXHRyZXR1cm4gZmlsdGVyc1xuXG5DcmVhdG9yLmdldE9iamVjdFJlY29yZCA9IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzZWxlY3RfZmllbGRzLCBleHBhbmQpLT5cblxuXHRpZiAhb2JqZWN0X25hbWVcblx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblxuXHRpZiAhcmVjb3JkX2lkXG5cdFx0cmVjb3JkX2lkID0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIilcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgb2JqZWN0X25hbWUgPT0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKSAmJiAgcmVjb3JkX2lkID09IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpXG5cdFx0XHRpZiBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5yZWNvcmRcblx0XHRcdFx0cmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCk/LnJlY29yZD8uZ2V0KClcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gQ3JlYXRvci5vZGF0YS5nZXQob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgc2VsZWN0X2ZpZWxkcywgZXhwYW5kKVxuXG5cdG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXG5cdGlmIG9iai5kYXRhYmFzZV9uYW1lID09IFwibWV0ZW9yXCIgfHwgIW9iai5kYXRhYmFzZV9uYW1lXG5cdFx0Y29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSlcblx0XHRpZiBjb2xsZWN0aW9uXG5cdFx0XHRyZWNvcmQgPSBjb2xsZWN0aW9uLmZpbmRPbmUocmVjb3JkX2lkKVxuXHRcdFx0cmV0dXJuIHJlY29yZFxuXHRlbHNlIGlmIG9iamVjdF9uYW1lICYmIHJlY29yZF9pZFxuXHRcdHJldHVybiBDcmVhdG9yLm9kYXRhLmdldChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzZWxlY3RfZmllbGRzLCBleHBhbmQpXG5cbkNyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkTmFtZSA9IChyZWNvcmQsIG9iamVjdF9uYW1lKS0+XG5cdHVubGVzcyByZWNvcmRcblx0XHRyZWNvcmQgPSBDcmVhdG9yLmdldE9iamVjdFJlY29yZCgpXG5cdGlmIHJlY29yZFxuXHRcdCMg5pi+56S657uE57uH5YiX6KGo5pe277yM54m55q6K5aSE55CGbmFtZV9maWVsZF9rZXnkuLpuYW1l5a2X5q61XG5cdFx0bmFtZV9maWVsZF9rZXkgPSBpZiBvYmplY3RfbmFtZSA9PSBcIm9yZ2FuaXphdGlvbnNcIiB0aGVuIFwibmFtZVwiIGVsc2UgQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpPy5OQU1FX0ZJRUxEX0tFWVxuXHRcdGlmIHJlY29yZCBhbmQgbmFtZV9maWVsZF9rZXlcblx0XHRcdHJldHVybiByZWNvcmQubGFiZWwgfHwgcmVjb3JkW25hbWVfZmllbGRfa2V5XVxuXG5DcmVhdG9yLmdldEFwcCA9IChhcHBfaWQpLT5cblx0YXBwTWVudXMgPSBTZXNzaW9uLmdldChcIl9hcHBfbWVudXNcIikgfHwgU2Vzc2lvbi5nZXQoXCJhcHBfbWVudXNcIik7XG5cdHVubGVzcyBhcHBNZW51c1xuXHRcdHJldHVybiB7fVxuXHRjdXJyZW50QXBwID0gYXBwTWVudXMuZmluZCAobWVudUl0ZW0pIC0+XG5cdFx0cmV0dXJuIG1lbnVJdGVtLmlkID09IGFwcF9pZFxuXHRyZXR1cm4gY3VycmVudEFwcFxuXG5DcmVhdG9yLmdldEFwcERhc2hib2FyZCA9IChhcHBfaWQpLT5cblx0YXBwID0gQ3JlYXRvci5nZXRBcHAoYXBwX2lkKVxuXHRpZiAhYXBwXG5cdFx0cmV0dXJuXG5cdGRhc2hib2FyZCA9IG51bGxcblx0Xy5lYWNoIENyZWF0b3IuRGFzaGJvYXJkcywgKHYsIGspLT5cblx0XHRpZiB2LmFwcHM/LmluZGV4T2YoYXBwLl9pZCkgPiAtMVxuXHRcdFx0ZGFzaGJvYXJkID0gdjtcblx0cmV0dXJuIGRhc2hib2FyZDtcblxuQ3JlYXRvci5nZXRBcHBEYXNoYm9hcmRDb21wb25lbnQgPSAoYXBwX2lkKS0+XG5cdGFwcCA9IENyZWF0b3IuZ2V0QXBwKGFwcF9pZClcblx0aWYgIWFwcCB8fCB0cnVlXG5cdFx0cmV0dXJuXG5cdCMgcmV0dXJuIEJ1aWxkZXJDcmVhdG9yLnBsdWdpbkNvbXBvbmVudFNlbGVjdG9yKEJ1aWxkZXJDcmVhdG9yLnN0b3JlLmdldFN0YXRlKCksIFwiRGFzaGJvYXJkXCIsIGFwcC5faWQpO1xuXG5DcmVhdG9yLmdldEFwcE9iamVjdE5hbWVzID0gKGFwcF9pZCktPlxuXHRhcHAgPSBDcmVhdG9yLmdldEFwcChhcHBfaWQpXG5cdGlmICFhcHBcblx0XHRyZXR1cm5cblx0aXNNb2JpbGUgPSBTdGVlZG9zLmlzTW9iaWxlKClcblx0YXBwT2JqZWN0cyA9IGlmIGlzTW9iaWxlIHRoZW4gYXBwLm1vYmlsZV9vYmplY3RzIGVsc2UgYXBwLm9iamVjdHNcblx0b2JqZWN0cyA9IFtdXG5cdGlmIGFwcFxuXHRcdF8uZWFjaCBhcHBPYmplY3RzLCAodiktPlxuXHRcdFx0b2JqID0gQ3JlYXRvci5nZXRPYmplY3Qodilcblx0XHRcdGlmIG9iaj8ucGVybWlzc2lvbnMuZ2V0KCkuYWxsb3dSZWFkXG5cdFx0XHRcdG9iamVjdHMucHVzaCB2XG5cdHJldHVybiBvYmplY3RzXG5cbkNyZWF0b3IuZ2V0VXJsV2l0aFRva2VuID0gKHVybCwgZXhwcmVzc2lvbkZvcm1EYXRhKSAtPlxuXHQjIOe7mXVybOaXtuaLvOaOpeW9k+WJjeeUqOaIt3Rva2Vu55u45YWz5L+h5oGv55So5LqO55m75b2V6aqM6K+B77yM5pSv5oyB6YWN572u6KGo6L6+5byPXG5cdHBhcmFtcyA9IHt9O1xuXHRwYXJhbXNbXCJYLVNwYWNlLUlkXCJdID0gU3RlZWRvcy5zcGFjZUlkKClcblx0cGFyYW1zW1wiWC1Vc2VyLUlkXCJdID0gU3RlZWRvcy51c2VySWQoKTtcblx0cGFyYW1zW1wiWC1Db21wYW55LUlkc1wiXSA9IFN0ZWVkb3MuZ2V0VXNlckNvbXBhbnlJZHMoKTtcblx0cGFyYW1zW1wiWC1BdXRoLVRva2VuXCJdID0gQWNjb3VudHMuX3N0b3JlZExvZ2luVG9rZW4oKTtcblx0aWYgU3RlZWRvcy5pc0V4cHJlc3Npb24odXJsKVxuXHRcdHVybCA9IFN0ZWVkb3MucGFyc2VTaW5nbGVFeHByZXNzaW9uKHVybCwgZXhwcmVzc2lvbkZvcm1EYXRhLCBcIiNcIiwgQ3JlYXRvci5VU0VSX0NPTlRFWFQpXG5cdCMg5aSW6YOo6ZO+5o6l5Zyw5Z2A5Lit5Y+v6IO95Lya5bim5pyJI+WPt++8jOavlOWmgi9idWlsZGVyLz9wX2lkcz02MTkzODM1NDViMmU5YTcyZWMwNTU4YjMjL3BhZ2UvcHVibGljL3Rlc3Rcblx0IyDmraTml7Z1cmzkuK3lt7Lnu4/lnKgj5Y+35YmN6Z2i5Ye6546w5LqG5LiA5LiqP+WPt++8jOi/meS4qumXruWPt+S4jeWPr+S7peiiq+ivhuWIq+S4unVybOWPguaVsO+8jOWPquaciSPlj7flkI7pnaLnmoQ/5Y+35omN5bqU6K+l6KKr6K+G5Yir5Li6dXJs5Y+C5pWwXG5cdGhhc1F1ZXJ5U3ltYm9sID0gLyhcXCMuK1xcPyl8KFxcP1teI10qJCkvZy50ZXN0KHVybClcblx0bGlua1N0ciA9IGlmIGhhc1F1ZXJ5U3ltYm9sIHRoZW4gXCImXCIgZWxzZSBcIj9cIlxuXHRyZXR1cm4gXCIje3VybH0je2xpbmtTdHJ9I3skLnBhcmFtKHBhcmFtcyl9XCJcblxuQ3JlYXRvci5nZXRBcHBNZW51ID0gKGFwcF9pZCwgbWVudV9pZCktPlxuXHRtZW51cyA9IENyZWF0b3IuZ2V0QXBwTWVudXMoYXBwX2lkKVxuXHRyZXR1cm4gbWVudXMgJiYgbWVudXMuZmluZCAobWVudSktPiByZXR1cm4gbWVudS5pZCA9PSBtZW51X2lkXG5cbkNyZWF0b3IuZ2V0QXBwTWVudVVybEZvckludGVybmV0ID0gKG1lbnUpLT5cblx0IyDlvZN0YWJz57G75Z6L5Li6dXJs5pe277yM5oyJ5aSW6YOo6ZO+5o6l5aSE55CG77yM5pSv5oyB6YWN572u6KGo6L6+5byP5bm25Yqg5LiK57uf5LiA55qEdXJs5Y+C5pWwXG5cdHJldHVybiBDcmVhdG9yLmdldFVybFdpdGhUb2tlbiBtZW51LnBhdGgsIG1lbnVcblxuQ3JlYXRvci5nZXRBcHBNZW51VXJsID0gKG1lbnUpLT5cblx0dXJsID0gbWVudS5wYXRoXG5cdGlmIG1lbnUudHlwZSA9PSBcInVybFwiXG5cdFx0aWYgbWVudS50YXJnZXRcblx0XHRcdHJldHVybiBDcmVhdG9yLmdldEFwcE1lbnVVcmxGb3JJbnRlcm5ldChtZW51KVxuXHRcdGVsc2Vcblx0XHRcdCMg5ZyoaWZyYW1l5Lit5pi+56S6dXJs55WM6Z2iXG5cdFx0XHRyZXR1cm4gXCIvYXBwLy0vdGFiX2lmcmFtZS8je21lbnUuaWR9XCJcblx0ZWxzZVxuXHRcdHJldHVybiBtZW51LnBhdGhcblxuQ3JlYXRvci5nZXRBcHBNZW51cyA9IChhcHBfaWQpLT5cblx0YXBwTWVudXMgPSBTZXNzaW9uLmdldChcIl9hcHBfbWVudXNcIikgfHwgU2Vzc2lvbi5nZXQoXCJhcHBfbWVudXNcIik7XG5cdHVubGVzcyBhcHBNZW51c1xuXHRcdHJldHVybiBbXVxuXHRjdXJlbnRBcHBNZW51cyA9IGFwcE1lbnVzLmZpbmQgKG1lbnVJdGVtKSAtPlxuXHRcdHJldHVybiBtZW51SXRlbS5pZCA9PSBhcHBfaWRcblx0aWYgY3VyZW50QXBwTWVudXNcblx0XHRyZXR1cm4gY3VyZW50QXBwTWVudXMuY2hpbGRyZW5cblxuQ3JlYXRvci5sb2FkQXBwc01lbnVzID0gKCktPlxuXHRpc01vYmlsZSA9IFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRkYXRhID0geyB9XG5cdGlmIGlzTW9iaWxlXG5cdFx0ZGF0YS5tb2JpbGUgPSBpc01vYmlsZVxuXHRvcHRpb25zID0geyBcblx0XHR0eXBlOiAnZ2V0JywgXG5cdFx0ZGF0YTogZGF0YSwgXG5cdFx0c3VjY2VzczogKGRhdGEpLT5cblx0XHRcdFNlc3Npb24uc2V0KFwiYXBwX21lbnVzXCIsIGRhdGEpO1xuXHQgfVxuXHRTdGVlZG9zPy5hdXRoUmVxdWVzdCBcIi9zZXJ2aWNlL2FwaS9hcHBzL21lbnVzXCIsIG9wdGlvbnNcblxuQ3JlYXRvci5jcmVhdG9yQXBwc1NlbGVjdG9yID0gKGFwcHMsIGFzc2lnbmVkX2FwcHMpIC0+XG5cdGFkbWluQXBwID0gdW5kZWZpbmVkXG5cdHNvcnRlZEFwcHMgPSB1bmRlZmluZWRcblx0Xy5lYWNoIGFwcHMsIChhcHAsIGtleSkgLT5cblx0XHRpZiAhYXBwLl9pZFxuXHRcdFx0YXBwLl9pZCA9IGtleVxuXHRcdGlmIGFwcC5pc19jcmVhdG9yXG5cdFx0XHQjIOS4jemcgOimgWlzU3BhY2VBZG1pbumAu+i+kVxuXHRcdFx0IyBpZiAoaXNTcGFjZUFkbWluKSB7XG5cdFx0XHQjXHRcdCBhcHAudmlzaWJsZSA9IHRydWU7XG5cdFx0XHQjIH1cblx0XHRlbHNlXG5cdFx0XHQjIOmdnmNyZWF0b3LlupTor6XkuIDlvovkuI3mmL7npLpcblx0XHRcdGFwcC52aXNpYmxlID0gZmFsc2Vcblx0XHRyZXR1cm5cblx0c29ydGVkQXBwcyA9IF8uc29ydEJ5KF8udmFsdWVzKGFwcHMpLCAnc29ydCcpXG5cdGNyZWF0b3JBcHBzID0ge31cblx0YWRtaW5BcHAgPSB7fVxuXHQjIOaMiemSrnNvcnTmjpLluo/mrKHluo/orr7nva5DcmVhdG9yLkFwcHPlgLxcblx0Xy5lYWNoIHNvcnRlZEFwcHMsIChuKSAtPlxuXHRcdGlmIG4uX2lkID09ICdhZG1pbidcblx0XHRcdGFkbWluQXBwID0gblxuXHRcdGVsc2Vcblx0XHRcdGNyZWF0b3JBcHBzW24uX2lkXSA9IG5cblx0IyBhZG1pbuiPnOWNleaYvuekuuWcqOacgOWQjlxuXHRjcmVhdG9yQXBwcy5hZG1pbiA9IGFkbWluQXBwXG5cdGlmIGFzc2lnbmVkX2FwcHMubGVuZ3RoXG5cdFx0Xy5lYWNoIGNyZWF0b3JBcHBzLCAoYXBwLCBrZXkpIC0+XG5cdFx0XHRpZiBhc3NpZ25lZF9hcHBzLmluZGV4T2Yoa2V5KSA+IC0xXG5cdFx0XHRcdGFwcC52aXNpYmxlID0gYXBwLmlzX2NyZWF0b3Jcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXBwLnZpc2libGUgPSBmYWxzZVxuXHRcdFx0cmV0dXJuXG5cdGNyZWF0b3JBcHBzXG5cbkNyZWF0b3IudmlzaWJsZUFwcHNTZWxlY3RvciA9IChjcmVhdG9yQXBwcywgaW5jbHVkZUFkbWluID0gdHJ1ZSkgLT5cblx0YXBwcyA9IFtdXG5cdF8uZWFjaCBjcmVhdG9yQXBwcywgKHYsIGspIC0+XG5cdFx0aWYgdi52aXNpYmxlICE9IGZhbHNlIGFuZCB2Ll9pZCAhPSAnYWRtaW4nIG9yIGluY2x1ZGVBZG1pbiBhbmQgdi5faWQgPT0gJ2FkbWluJ1xuXHRcdFx0YXBwcy5wdXNoIHZcblx0XHRyZXR1cm5cblx0YXBwc1xuXG5DcmVhdG9yLmdldFZpc2libGVBcHBzID0gKGluY2x1ZGVBZG1pbiktPlxuXHRjaGFuZ2VBcHAgPSBDcmVhdG9yLl9zdWJBcHAuZ2V0KCk7XG5cdGNyZWF0b3JBcHBzID0gT2JqZWN0LmFzc2lnbih7fSwgQ3JlYXRvci5BcHBzLCB7YXBwczogY2hhbmdlQXBwfSk7XG5cdHJldHVybiBDcmVhdG9yLnZpc2libGVBcHBzU2VsZWN0b3IoY3JlYXRvckFwcHMsIGluY2x1ZGVBZG1pbilcblxuQ3JlYXRvci5nZXRWaXNpYmxlQXBwc09iamVjdHMgPSAoKS0+XG5cdGFwcHMgPSBDcmVhdG9yLmdldFZpc2libGVBcHBzKClcblx0dmlzaWJsZU9iamVjdE5hbWVzID0gXy5mbGF0dGVuKF8ucGx1Y2soYXBwcywnb2JqZWN0cycpKVxuXHRvYmplY3RzID0gXy5maWx0ZXIgQ3JlYXRvci5PYmplY3RzLCAob2JqKS0+XG5cdFx0aWYgdmlzaWJsZU9iamVjdE5hbWVzLmluZGV4T2Yob2JqLm5hbWUpIDwgMFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHRydWVcblx0b2JqZWN0cyA9IG9iamVjdHMuc29ydChDcmVhdG9yLnNvcnRpbmdNZXRob2QuYmluZCh7a2V5OlwibGFiZWxcIn0pKVxuXHRvYmplY3RzID0gXy5wbHVjayhvYmplY3RzLCduYW1lJylcblx0cmV0dXJuIF8udW5pcSBvYmplY3RzXG5cbkNyZWF0b3IuZ2V0QXBwc09iamVjdHMgPSAoKS0+XG5cdG9iamVjdHMgPSBbXVxuXHR0ZW1wT2JqZWN0cyA9IFtdXG5cdF8uZm9yRWFjaCBDcmVhdG9yLkFwcHMsIChhcHApLT5cblx0XHR0ZW1wT2JqZWN0cyA9IF8uZmlsdGVyIGFwcC5vYmplY3RzLCAob2JqKS0+XG5cdFx0XHRyZXR1cm4gIW9iai5oaWRkZW5cblx0XHRvYmplY3RzID0gb2JqZWN0cy5jb25jYXQodGVtcE9iamVjdHMpXG5cdHJldHVybiBfLnVuaXEgb2JqZWN0c1xuXG5DcmVhdG9yLnZhbGlkYXRlRmlsdGVycyA9IChmaWx0ZXJzLCBsb2dpYyktPlxuXHRmaWx0ZXJfaXRlbXMgPSBfLm1hcCBmaWx0ZXJzLCAob2JqKSAtPlxuXHRcdGlmIF8uaXNFbXB0eShvYmopXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gb2JqXG5cdGZpbHRlcl9pdGVtcyA9IF8uY29tcGFjdChmaWx0ZXJfaXRlbXMpXG5cdGVycm9yTXNnID0gXCJcIlxuXHRmaWx0ZXJfbGVuZ3RoID0gZmlsdGVyX2l0ZW1zLmxlbmd0aFxuXHRpZiBsb2dpY1xuXHRcdCMg5qC85byP5YyWZmlsdGVyXG5cdFx0bG9naWMgPSBsb2dpYy5yZXBsYWNlKC9cXG4vZywgXCJcIikucmVwbGFjZSgvXFxzKy9nLCBcIiBcIilcblxuXHRcdCMg5Yik5pat54m55q6K5a2X56ymXG5cdFx0aWYgL1suX1xcLSErXSsvaWcudGVzdChsb2dpYylcblx0XHRcdGVycm9yTXNnID0gXCLlkKvmnInnibnmrorlrZfnrKbjgIJcIlxuXG5cdFx0aWYgIWVycm9yTXNnXG5cdFx0XHRpbmRleCA9IGxvZ2ljLm1hdGNoKC9cXGQrL2lnKVxuXHRcdFx0aWYgIWluZGV4XG5cdFx0XHRcdGVycm9yTXNnID0gXCLmnInkupvnrZvpgInmnaHku7bov5vooYzkuoblrprkuYnvvIzkvYbmnKrlnKjpq5jnuqfnrZvpgInmnaHku7bkuK3ooqvlvJXnlKjjgIJcIlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbmRleC5mb3JFYWNoIChpKS0+XG5cdFx0XHRcdFx0aWYgaSA8IDEgb3IgaSA+IGZpbHRlcl9sZW5ndGhcblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCLmgqjnmoTnrZvpgInmnaHku7blvJXnlKjkuobmnKrlrprkuYnnmoTnrZvpgInlmajvvJoje2l944CCXCJcblxuXHRcdFx0XHRmbGFnID0gMVxuXHRcdFx0XHR3aGlsZSBmbGFnIDw9IGZpbHRlcl9sZW5ndGhcblx0XHRcdFx0XHRpZiAhaW5kZXguaW5jbHVkZXMoXCIje2ZsYWd9XCIpXG5cdFx0XHRcdFx0XHRlcnJvck1zZyA9IFwi5pyJ5Lqb562b6YCJ5p2h5Lu26L+b6KGM5LqG5a6a5LmJ77yM5L2G5pyq5Zyo6auY57qn562b6YCJ5p2h5Lu25Lit6KKr5byV55So44CCXCJcblx0XHRcdFx0XHRmbGFnKys7XG5cblx0XHRpZiAhZXJyb3JNc2dcblx0XHRcdCMg5Yik5pat5piv5ZCm5pyJ6Z2e5rOV6Iux5paH5a2X56ymXG5cdFx0XHR3b3JkID0gbG9naWMubWF0Y2goL1thLXpBLVpdKy9pZylcblx0XHRcdGlmIHdvcmRcblx0XHRcdFx0d29yZC5mb3JFYWNoICh3KS0+XG5cdFx0XHRcdFx0aWYgIS9eKGFuZHxvcikkL2lnLnRlc3Qodylcblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCLmo4Dmn6XmgqjnmoTpq5jnuqfnrZvpgInmnaHku7bkuK3nmoTmi7zlhpnjgIJcIlxuXG5cdFx0aWYgIWVycm9yTXNnXG5cdFx0XHQjIOWIpOaWreagvOW8j+aYr+WQpuato+ehrlxuXHRcdFx0dHJ5XG5cdFx0XHRcdENyZWF0b3IuZXZhbChsb2dpYy5yZXBsYWNlKC9hbmQvaWcsIFwiJiZcIikucmVwbGFjZSgvb3IvaWcsIFwifHxcIikpXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGVycm9yTXNnID0gXCLmgqjnmoTnrZvpgInlmajkuK3lkKvmnInnibnmrorlrZfnrKZcIlxuXG5cdFx0XHRpZiAvKEFORClbXigpXSsoT1IpL2lnLnRlc3QobG9naWMpIHx8ICAvKE9SKVteKCldKyhBTkQpL2lnLnRlc3QobG9naWMpXG5cdFx0XHRcdGVycm9yTXNnID0gXCLmgqjnmoTnrZvpgInlmajlv4XpobvlnKjov57nu63mgKfnmoQgQU5EIOWSjCBPUiDooajovr7lvI/liY3lkI7kvb/nlKjmi6zlj7fjgIJcIlxuXHRpZiBlcnJvck1zZ1xuXHRcdGNvbnNvbGUubG9nIFwiZXJyb3JcIiwgZXJyb3JNc2dcblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHRvYXN0ci5lcnJvcihlcnJvck1zZylcblx0XHRyZXR1cm4gZmFsc2Vcblx0ZWxzZVxuXHRcdHJldHVybiB0cnVlXG5cbiMgXCI9XCIsIFwiPD5cIiwgXCI+XCIsIFwiPj1cIiwgXCI8XCIsIFwiPD1cIiwgXCJzdGFydHN3aXRoXCIsIFwiY29udGFpbnNcIiwgXCJub3Rjb250YWluc1wiLlxuIyMjXG5vcHRpb25z5Y+C5pWw77yaXG5cdGV4dGVuZC0tIOaYr+WQpumcgOimgeaKiuW9k+WJjeeUqOaIt+WfuuacrOS/oeaBr+WKoOWFpeWFrOW8j++8jOWNs+iuqeWFrOW8j+aUr+aMgUNyZWF0b3IuVVNFUl9DT05URVhU5Lit55qE5YC877yM6buY6K6k5Li6dHJ1ZVxuXHR1c2VySWQtLSDlvZPliY3nmbvlvZXnlKjmiLdcblx0c3BhY2VJZC0tIOW9k+WJjeaJgOWcqOW3peS9nOWMulxuZXh0ZW5k5Li6dHJ1ZeaXtu+8jOWQjuerr+mcgOimgemineWkluS8oOWFpXVzZXJJZOWPinNwYWNlSWTnlKjkuo7mipPlj5ZDcmVhdG9yLlVTRVJfQ09OVEVYVOWvueW6lOeahOWAvFxuIyMjXG5DcmVhdG9yLmZvcm1hdEZpbHRlcnNUb01vbmdvID0gKGZpbHRlcnMsIG9wdGlvbnMpLT5cblx0dW5sZXNzIGZpbHRlcnM/Lmxlbmd0aFxuXHRcdHJldHVyblxuXHQjIOW9k2ZpbHRlcnPkuI3mmK9bQXJyYXld57G75Z6L6ICM5pivW09iamVjdF3nsbvlnovml7bvvIzov5vooYzmoLzlvI/ovazmjaJcblx0dW5sZXNzIGZpbHRlcnNbMF0gaW5zdGFuY2VvZiBBcnJheVxuXHRcdGZpbHRlcnMgPSBfLm1hcCBmaWx0ZXJzLCAob2JqKS0+XG5cdFx0XHRyZXR1cm4gW29iai5maWVsZCwgb2JqLm9wZXJhdGlvbiwgb2JqLnZhbHVlXVxuXHRzZWxlY3RvciA9IFtdXG5cdF8uZWFjaCBmaWx0ZXJzLCAoZmlsdGVyKS0+XG5cdFx0ZmllbGQgPSBmaWx0ZXJbMF1cblx0XHRvcHRpb24gPSBmaWx0ZXJbMV1cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoZmlsdGVyWzJdKVxuXHRcdGVsc2Vcblx0XHRcdHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoZmlsdGVyWzJdLCBudWxsLCBvcHRpb25zKVxuXHRcdHN1Yl9zZWxlY3RvciA9IHt9XG5cdFx0c3ViX3NlbGVjdG9yW2ZpZWxkXSA9IHt9XG5cdFx0aWYgb3B0aW9uID09IFwiPVwiXG5cdFx0XHRzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGVxXCJdID0gdmFsdWVcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcIjw+XCJcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkbmVcIl0gPSB2YWx1ZVxuXHRcdGVsc2UgaWYgb3B0aW9uID09IFwiPlwiXG5cdFx0XHRzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGd0XCJdID0gdmFsdWVcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcIj49XCJcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkZ3RlXCJdID0gdmFsdWVcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcIjxcIlxuXHRcdFx0c3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRsdFwiXSA9IHZhbHVlXG5cdFx0ZWxzZSBpZiBvcHRpb24gPT0gXCI8PVwiXG5cdFx0XHRzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGx0ZVwiXSA9IHZhbHVlXG5cdFx0ZWxzZSBpZiBvcHRpb24gPT0gXCJzdGFydHN3aXRoXCJcblx0XHRcdHJlZyA9IG5ldyBSZWdFeHAoXCJeXCIgKyB2YWx1ZSwgXCJpXCIpXG5cdFx0XHRzdWJfc2VsZWN0b3JbZmllbGRdW1wiJHJlZ2V4XCJdID0gcmVnXG5cdFx0ZWxzZSBpZiBvcHRpb24gPT0gXCJjb250YWluc1wiXG5cdFx0XHRyZWcgPSBuZXcgUmVnRXhwKHZhbHVlLCBcImlcIilcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkcmVnZXhcIl0gPSByZWdcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcIm5vdGNvbnRhaW5zXCJcblx0XHRcdHJlZyA9IG5ldyBSZWdFeHAoXCJeKCg/IVwiICsgdmFsdWUgKyBcIikuKSokXCIsIFwiaVwiKVxuXHRcdFx0c3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRyZWdleFwiXSA9IHJlZ1xuXHRcdHNlbGVjdG9yLnB1c2ggc3ViX3NlbGVjdG9yXG5cdHJldHVybiBzZWxlY3RvclxuXG5DcmVhdG9yLmlzQmV0d2VlbkZpbHRlck9wZXJhdGlvbiA9IChvcGVyYXRpb24pLT5cblx0cmV0dXJuIG9wZXJhdGlvbiA9PSBcImJldHdlZW5cIiBvciAhIUNyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVzKHRydWUpP1tvcGVyYXRpb25dXG5cbiMjI1xub3B0aW9uc+WPguaVsO+8mlxuXHRleHRlbmQtLSDmmK/lkKbpnIDopoHmiorlvZPliY3nlKjmiLfln7rmnKzkv6Hmga/liqDlhaXlhazlvI/vvIzljbPorqnlhazlvI/mlK/mjIFDcmVhdG9yLlVTRVJfQ09OVEVYVOS4reeahOWAvO+8jOm7mOiupOS4unRydWVcblx0dXNlcklkLS0g5b2T5YmN55m75b2V55So5oi3XG5cdHNwYWNlSWQtLSDlvZPliY3miYDlnKjlt6XkvZzljLpcblx0ZXh0ZW5k5Li6dHJ1ZeaXtu+8jOWQjuerr+mcgOimgemineWkluS8oOWFpXVzZXJJZOWPinNwYWNlSWTnlKjkuo7mipPlj5ZDcmVhdG9yLlVTRVJfQ09OVEVYVOWvueW6lOeahOWAvFxuIyMjXG5DcmVhdG9yLmZvcm1hdEZpbHRlcnNUb0RldiA9IChmaWx0ZXJzLCBvYmplY3RfbmFtZSwgb3B0aW9ucyktPlxuXHR1bmxlc3MgZmlsdGVycy5sZW5ndGhcblx0XHRyZXR1cm5cblx0aWYgb3B0aW9ucz8uaXNfbG9naWNfb3Jcblx0XHQjIOWmguaenGlzX2xvZ2ljX29y5Li6dHJ1Ze+8jOS4umZpbHRlcnPnrKzkuIDlsYLlhYPntKDlop7liqBvcumXtOmalFxuXHRcdGxvZ2ljVGVtcEZpbHRlcnMgPSBbXVxuXHRcdGZpbHRlcnMuZm9yRWFjaCAobiktPlxuXHRcdFx0bG9naWNUZW1wRmlsdGVycy5wdXNoKG4pXG5cdFx0XHRsb2dpY1RlbXBGaWx0ZXJzLnB1c2goXCJvclwiKVxuXHRcdGxvZ2ljVGVtcEZpbHRlcnMucG9wKClcblx0XHRmaWx0ZXJzID0gbG9naWNUZW1wRmlsdGVyc1xuXHRzZWxlY3RvciA9IFN0ZWVkb3NGaWx0ZXJzLmZvcm1hdEZpbHRlcnNUb0RldihmaWx0ZXJzLCBDcmVhdG9yLlVTRVJfQ09OVEVYVClcblx0cmV0dXJuIHNlbGVjdG9yXG5cbiMjI1xub3B0aW9uc+WPguaVsO+8mlxuXHRleHRlbmQtLSDmmK/lkKbpnIDopoHmiorlvZPliY3nlKjmiLfln7rmnKzkv6Hmga/liqDlhaXlhazlvI/vvIzljbPorqnlhazlvI/mlK/mjIFDcmVhdG9yLlVTRVJfQ09OVEVYVOS4reeahOWAvO+8jOm7mOiupOS4unRydWVcblx0dXNlcklkLS0g5b2T5YmN55m75b2V55So5oi3XG5cdHNwYWNlSWQtLSDlvZPliY3miYDlnKjlt6XkvZzljLpcbmV4dGVuZOS4unRydWXml7bvvIzlkI7nq6/pnIDopoHpop3lpJbkvKDlhaV1c2VySWTlj4pzcGFjZUlk55So5LqO5oqT5Y+WQ3JlYXRvci5VU0VSX0NPTlRFWFTlr7nlupTnmoTlgLxcbiMjI1xuQ3JlYXRvci5mb3JtYXRMb2dpY0ZpbHRlcnNUb0RldiA9IChmaWx0ZXJzLCBmaWx0ZXJfbG9naWMsIG9wdGlvbnMpLT5cblx0Zm9ybWF0X2xvZ2ljID0gZmlsdGVyX2xvZ2ljLnJlcGxhY2UoL1xcKFxccysvaWcsIFwiKFwiKS5yZXBsYWNlKC9cXHMrXFwpL2lnLCBcIilcIikucmVwbGFjZSgvXFwoL2csIFwiW1wiKS5yZXBsYWNlKC9cXCkvZywgXCJdXCIpLnJlcGxhY2UoL1xccysvZywgXCIsXCIpLnJlcGxhY2UoLyhhbmR8b3IpL2lnLCBcIickMSdcIilcblx0Zm9ybWF0X2xvZ2ljID0gZm9ybWF0X2xvZ2ljLnJlcGxhY2UoLyhcXGQpKy9pZywgKHgpLT5cblx0XHRfZiA9IGZpbHRlcnNbeC0xXVxuXHRcdGZpZWxkID0gX2YuZmllbGRcblx0XHRvcHRpb24gPSBfZi5vcGVyYXRpb25cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoX2YudmFsdWUpXG5cdFx0ZWxzZVxuXHRcdFx0dmFsdWUgPSBDcmVhdG9yLmV2YWx1YXRlRm9ybXVsYShfZi52YWx1ZSwgbnVsbCwgb3B0aW9ucylcblx0XHRzdWJfc2VsZWN0b3IgPSBbXVxuXHRcdGlmIF8uaXNBcnJheSh2YWx1ZSkgPT0gdHJ1ZVxuXHRcdFx0aWYgb3B0aW9uID09IFwiPVwiXG5cdFx0XHRcdF8uZWFjaCB2YWx1ZSwgKHYpLT5cblx0XHRcdFx0XHRzdWJfc2VsZWN0b3IucHVzaCBbZmllbGQsIG9wdGlvbiwgdl0sIFwib3JcIlxuXHRcdFx0ZWxzZSBpZiBvcHRpb24gPT0gXCI8PlwiXG5cdFx0XHRcdF8uZWFjaCB2YWx1ZSwgKHYpLT5cblx0XHRcdFx0XHRzdWJfc2VsZWN0b3IucHVzaCBbZmllbGQsIG9wdGlvbiwgdl0sIFwiYW5kXCJcblx0XHRcdGVsc2Vcblx0XHRcdFx0Xy5lYWNoIHZhbHVlLCAodiktPlxuXHRcdFx0XHRcdHN1Yl9zZWxlY3Rvci5wdXNoIFtmaWVsZCwgb3B0aW9uLCB2XSwgXCJvclwiXG5cdFx0XHRpZiBzdWJfc2VsZWN0b3Jbc3ViX3NlbGVjdG9yLmxlbmd0aCAtIDFdID09IFwiYW5kXCIgfHwgc3ViX3NlbGVjdG9yW3N1Yl9zZWxlY3Rvci5sZW5ndGggLSAxXSA9PSBcIm9yXCJcblx0XHRcdFx0c3ViX3NlbGVjdG9yLnBvcCgpXG5cdFx0ZWxzZVxuXHRcdFx0c3ViX3NlbGVjdG9yID0gW2ZpZWxkLCBvcHRpb24sIHZhbHVlXVxuXHRcdCMgY29uc29sZS5sb2cgXCJzdWJfc2VsZWN0b3JcIiwgc3ViX3NlbGVjdG9yXG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHN1Yl9zZWxlY3Rvcilcblx0KVxuXHRmb3JtYXRfbG9naWMgPSBcIlsje2Zvcm1hdF9sb2dpY31dXCJcblx0cmV0dXJuIENyZWF0b3IuZXZhbChmb3JtYXRfbG9naWMpXG5cbkNyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdHMgPSAob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdGlmICFzcGFjZUlkXG5cdFx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cdFx0aWYgIXVzZXJJZFxuXHRcdFx0dXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpXG5cblx0cmVsYXRlZF9vYmplY3RfbmFtZXMgPSBbXVxuXHRfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cblx0aWYgIV9vYmplY3Rcblx0XHRyZXR1cm4gcmVsYXRlZF9vYmplY3RfbmFtZXNcblxuI1x0cmVsYXRlZF9vYmplY3RfbmFtZXMgPSBfLnBsdWNrKF9vYmplY3QucmVsYXRlZF9vYmplY3RzLFwib2JqZWN0X25hbWVcIilcblxuXHRyZWxhdGVkX29iamVjdHMgPSBDcmVhdG9yLmdldE9iamVjdFJlbGF0ZWRzKF9vYmplY3QuX2NvbGxlY3Rpb25fbmFtZSlcblxuXHRyZWxhdGVkX29iamVjdF9uYW1lcyA9IF8ucGx1Y2socmVsYXRlZF9vYmplY3RzLFwib2JqZWN0X25hbWVcIilcblx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZXM/Lmxlbmd0aCA9PSAwXG5cdFx0cmV0dXJuIHJlbGF0ZWRfb2JqZWN0X25hbWVzXG5cblx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdHVucmVsYXRlZF9vYmplY3RzID0gcGVybWlzc2lvbnMudW5yZWxhdGVkX29iamVjdHNcblxuXHRyZWxhdGVkX29iamVjdF9uYW1lcyA9IF8uZGlmZmVyZW5jZSByZWxhdGVkX29iamVjdF9uYW1lcywgdW5yZWxhdGVkX29iamVjdHNcblx0cmV0dXJuIF8uZmlsdGVyIHJlbGF0ZWRfb2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0KS0+XG5cdFx0cmVsYXRlZF9vYmplY3RfbmFtZSA9IHJlbGF0ZWRfb2JqZWN0Lm9iamVjdF9uYW1lXG5cdFx0aXNBY3RpdmUgPSByZWxhdGVkX29iamVjdF9uYW1lcy5pbmRleE9mKHJlbGF0ZWRfb2JqZWN0X25hbWUpID4gLTFcblx0XHQjIHJlbGF0ZWRfb2JqZWN0X25hbWUgPSBpZiByZWxhdGVkX29iamVjdF9uYW1lID09IFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiB0aGVuIFwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIiBlbHNlIHJlbGF0ZWRfb2JqZWN0X25hbWVcblx0XHRhbGxvd1JlYWQgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk/LmFsbG93UmVhZFxuXHRcdGlmIHJlbGF0ZWRfb2JqZWN0X25hbWUgPT0gXCJjbXNfZmlsZXNcIlxuXHRcdFx0YWxsb3dSZWFkID0gYWxsb3dSZWFkICYmIHBlcm1pc3Npb25zLmFsbG93UmVhZEZpbGVzXG5cdFx0cmV0dXJuIGlzQWN0aXZlIGFuZCBhbGxvd1JlYWRcblxuQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0TmFtZXMgPSAob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCktPlxuXHRyZWxhdGVkX29iamVjdHMgPSBDcmVhdG9yLmdldFJlbGF0ZWRPYmplY3RzKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdHJldHVybiBfLnBsdWNrKHJlbGF0ZWRfb2JqZWN0cyxcIm9iamVjdF9uYW1lXCIpXG5cbkNyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdExpc3RBY3Rpb25zID0gKHJlbGF0ZWRPYmplY3ROYW1lLCBzcGFjZUlkLCB1c2VySWQpLT5cblx0YWN0aW9ucyA9IENyZWF0b3IuZ2V0QWN0aW9ucyhyZWxhdGVkT2JqZWN0TmFtZSwgc3BhY2VJZCwgdXNlcklkKVxuXHRhY3Rpb25zID0gXy5maWx0ZXIgYWN0aW9ucywgKGFjdGlvbiktPlxuXHRcdGlmIGFjdGlvbi5uYW1lID09IFwic3RhbmRhcmRfZm9sbG93XCJcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGlmIGFjdGlvbi5uYW1lID09IFwic3RhbmRhcmRfcXVlcnlcIlxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgYWN0aW9uLm9uID09IFwibGlzdFwiXG5cdFx0XHRpZiB0eXBlb2YgYWN0aW9uLnZpc2libGUgPT0gXCJmdW5jdGlvblwiXG5cdFx0XHRcdHJldHVybiBhY3Rpb24udmlzaWJsZSgpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBhY3Rpb24udmlzaWJsZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXHRyZXR1cm4gYWN0aW9uc1xuXG5DcmVhdG9yLmdldEFjdGlvbnMgPSAob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdGlmICFzcGFjZUlkXG5cdFx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cdFx0aWYgIXVzZXJJZFxuXHRcdFx0dXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpXG5cblx0b2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cblx0aWYgIW9ialxuXHRcdHJldHVyblxuXG5cdHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKVxuXHRkaXNhYmxlZF9hY3Rpb25zID0gcGVybWlzc2lvbnMuZGlzYWJsZWRfYWN0aW9uc1xuXHRhY3Rpb25zID0gXy5zb3J0QnkoXy52YWx1ZXMob2JqLmFjdGlvbnMpICwgJ3NvcnQnKTtcblxuXHRpZiBfLmhhcyhvYmosICdhbGxvd19jdXN0b21BY3Rpb25zJylcblx0XHRhY3Rpb25zID0gXy5maWx0ZXIgYWN0aW9ucywgKGFjdGlvbiktPlxuXHRcdFx0cmV0dXJuIF8uaW5jbHVkZShvYmouYWxsb3dfY3VzdG9tQWN0aW9ucywgYWN0aW9uLm5hbWUpIHx8IF8uaW5jbHVkZShfLmtleXMoQ3JlYXRvci5nZXRPYmplY3QoJ2Jhc2UnKS5hY3Rpb25zKSB8fCB7fSwgYWN0aW9uLm5hbWUpXG5cdGlmIF8uaGFzKG9iaiwgJ2V4Y2x1ZGVfYWN0aW9ucycpXG5cdFx0YWN0aW9ucyA9IF8uZmlsdGVyIGFjdGlvbnMsIChhY3Rpb24pLT5cblx0XHRcdHJldHVybiAhXy5pbmNsdWRlKG9iai5leGNsdWRlX2FjdGlvbnMsIGFjdGlvbi5uYW1lKVxuXG5cdF8uZWFjaCBhY3Rpb25zLCAoYWN0aW9uKS0+XG5cdFx0IyDmiYvmnLrkuIrlj6rmmL7npLrnvJbovpHmjInpkq7vvIzlhbbku5bnmoTmlL7liLDmipjlj6DkuIvmi4noj5zljZXkuK1cblx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKCkgJiYgW1wicmVjb3JkXCIsIFwicmVjb3JkX29ubHlcIl0uaW5kZXhPZihhY3Rpb24ub24pID4gLTEgJiYgYWN0aW9uLm5hbWUgIT0gJ3N0YW5kYXJkX2VkaXQnXG5cdFx0XHRpZiBhY3Rpb24ub24gPT0gXCJyZWNvcmRfb25seVwiXG5cdFx0XHRcdGFjdGlvbi5vbiA9ICdyZWNvcmRfb25seV9tb3JlJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhY3Rpb24ub24gPSAncmVjb3JkX21vcmUnXG5cblx0aWYgU3RlZWRvcy5pc01vYmlsZSgpICYmIFtcImNtc19maWxlc1wiLCBcImNmcy5maWxlcy5maWxlcmVjb3JkXCJdLmluZGV4T2Yob2JqZWN0X25hbWUpID4gLTFcblx0XHQjIOmZhOS7tueJueauiuWkhOeQhu+8jOS4i+i9veaMiemSruaUvuWcqOS4u+iPnOWNle+8jOe8lui+keaMiemSruaUvuWIsOW6leS4i+aKmOWPoOS4i+aLieiPnOWNleS4rVxuXHRcdGFjdGlvbnMuZmluZCgobiktPiByZXR1cm4gbi5uYW1lID09IFwic3RhbmRhcmRfZWRpdFwiKT8ub24gPSBcInJlY29yZF9tb3JlXCJcblx0XHRhY3Rpb25zLmZpbmQoKG4pLT4gcmV0dXJuIG4ubmFtZSA9PSBcImRvd25sb2FkXCIpPy5vbiA9IFwicmVjb3JkXCJcblxuXHRhY3Rpb25zID0gXy5maWx0ZXIgYWN0aW9ucywgKGFjdGlvbiktPlxuXHRcdHJldHVybiBfLmluZGV4T2YoZGlzYWJsZWRfYWN0aW9ucywgYWN0aW9uLm5hbWUpIDwgMFxuXG5cdHJldHVybiBhY3Rpb25zXG5cbi8vL1xuXHTov5Tlm57lvZPliY3nlKjmiLfmnInmnYPpmZDorr/pl67nmoTmiYDmnIlsaXN0X3ZpZXfvvIzljIXmi6zliIbkuqvnmoTvvIznlKjmiLfoh6rlrprkuYnpnZ7liIbkuqvnmoTvvIjpmaTpnZ5vd25lcuWPmOS6hu+8ie+8jOS7peWPium7mOiupOeahOWFtuS7luinhuWbvlxuXHTms6jmhI9DcmVhdG9yLmdldFBlcm1pc3Npb25z5Ye95pWw5Lit5piv5LiN5Lya5pyJ55So5oi36Ieq5a6a5LmJ6Z2e5YiG5Lqr55qE6KeG5Zu+55qE77yM5omA5LulQ3JlYXRvci5nZXRQZXJtaXNzaW9uc+WHveaVsOS4reaLv+WIsOeahOe7k+aenOS4jeWFqO+8jOW5tuS4jeaYr+W9k+WJjeeUqOaIt+iDveeci+WIsOaJgOacieinhuWbvlxuLy8vXG5DcmVhdG9yLmdldExpc3RWaWV3cyA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKS0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdGlmICFvYmplY3RfbmFtZVxuXHRcdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcblx0XHRpZiAhdXNlcklkXG5cdFx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblx0XG5cdHVubGVzcyBvYmplY3RfbmFtZVxuXHRcdHJldHVyblxuXG5cdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXG5cdGlmICFvYmplY3Rcblx0XHRyZXR1cm5cblxuXHRkaXNhYmxlZF9saXN0X3ZpZXdzID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKT8uZGlzYWJsZWRfbGlzdF92aWV3cyB8fCBbXVxuXG5cdGxpc3Rfdmlld3MgPSBbXVxuXG5cdGlzTW9iaWxlID0gU3RlZWRvcy5pc01vYmlsZSgpXG5cblx0Xy5lYWNoIG9iamVjdC5saXN0X3ZpZXdzLCAoaXRlbSwgaXRlbV9uYW1lKS0+XG5cdFx0aXRlbS5uYW1lID0gaXRlbV9uYW1lXG5cblx0bGlzdFZpZXdzID0gXy5zb3J0QnkoXy52YWx1ZXMob2JqZWN0Lmxpc3Rfdmlld3MpICwgJ3NvcnRfbm8nKTtcblxuXHRfLmVhY2ggbGlzdFZpZXdzLCAoaXRlbSktPlxuXHRcdGlmIGlzTW9iaWxlIGFuZCBpdGVtLnR5cGUgPT0gXCJjYWxlbmRhclwiXG5cdFx0XHQjIOaJi+acuuS4iuWFiOS4jeaYvuekuuaXpeWOhuinhuWbvlxuXHRcdFx0cmV0dXJuXG5cdFx0aWYgaXRlbS5uYW1lICAhPSBcImRlZmF1bHRcIlxuXHRcdFx0aXNEaXNhYmxlZCA9IF8uaW5kZXhPZihkaXNhYmxlZF9saXN0X3ZpZXdzLCBpdGVtLm5hbWUpID4gLTEgfHwgKGl0ZW0uX2lkICYmIF8uaW5kZXhPZihkaXNhYmxlZF9saXN0X3ZpZXdzLCBpdGVtLl9pZCkgPiAtMSlcblx0XHRcdGlmICFpc0Rpc2FibGVkIHx8IGl0ZW0ub3duZXIgPT0gdXNlcklkXG5cdFx0XHRcdGxpc3Rfdmlld3MucHVzaCBpdGVtXG5cdHJldHVybiBsaXN0X3ZpZXdzXG5cbiMg5YmN5Y+w55CG6K665LiK5LiN5bqU6K+l6LCD55So6K+l5Ye95pWw77yM5Zug5Li65a2X5q6155qE5p2D6ZmQ6YO95ZyoQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpLmZpZWxkc+eahOebuOWFs+WxnuaAp+S4reacieagh+ivhuS6hlxuQ3JlYXRvci5nZXRGaWVsZHMgPSAob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdGlmICFzcGFjZUlkXG5cdFx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cdFx0aWYgIXVzZXJJZFxuXHRcdFx0dXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpXG5cblx0ZmllbGRzTmFtZSA9IENyZWF0b3IuZ2V0T2JqZWN0RmllbGRzTmFtZShvYmplY3RfbmFtZSlcblx0dW5yZWFkYWJsZV9maWVsZHMgPSAgQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKT8udW5yZWFkYWJsZV9maWVsZHNcblx0cmV0dXJuIF8uZGlmZmVyZW5jZShmaWVsZHNOYW1lLCB1bnJlYWRhYmxlX2ZpZWxkcylcblxuQ3JlYXRvci5pc2xvYWRpbmcgPSAoKS0+XG5cdHJldHVybiAhQ3JlYXRvci5ib290c3RyYXBMb2FkZWQuZ2V0KClcblxuQ3JlYXRvci5jb252ZXJ0U3BlY2lhbENoYXJhY3RlciA9IChzdHIpLT5cblx0cmV0dXJuIHN0ci5yZXBsYWNlKC8oW1xcXlxcJFxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXHxcXFtcXF1cXHtcXH1dKS9nLCBcIlxcXFwkMVwiKVxuXG4jIOiuoeeul2ZpZWxkc+ebuOWFs+WHveaVsFxuIyBTVEFSVFxuQ3JlYXRvci5nZXREaXNhYmxlZEZpZWxkcyA9IChzY2hlbWEpLT5cblx0ZmllbGRzID0gXy5tYXAoc2NoZW1hLCAoZmllbGQsIGZpZWxkTmFtZSkgLT5cblx0XHRyZXR1cm4gZmllbGQuYXV0b2Zvcm0gYW5kIGZpZWxkLmF1dG9mb3JtLmRpc2FibGVkIGFuZCAhZmllbGQuYXV0b2Zvcm0ub21pdCBhbmQgZmllbGROYW1lXG5cdClcblx0ZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcylcblx0cmV0dXJuIGZpZWxkc1xuXG5DcmVhdG9yLmdldEhpZGRlbkZpZWxkcyA9IChzY2hlbWEpLT5cblx0ZmllbGRzID0gXy5tYXAoc2NoZW1hLCAoZmllbGQsIGZpZWxkTmFtZSkgLT5cblx0XHRyZXR1cm4gZmllbGQuYXV0b2Zvcm0gYW5kIGZpZWxkLmF1dG9mb3JtLnR5cGUgPT0gXCJoaWRkZW5cIiBhbmQgIWZpZWxkLmF1dG9mb3JtLm9taXQgYW5kIGZpZWxkTmFtZVxuXHQpXG5cdGZpZWxkcyA9IF8uY29tcGFjdChmaWVsZHMpXG5cdHJldHVybiBmaWVsZHNcblxuQ3JlYXRvci5nZXRGaWVsZHNXaXRoTm9Hcm91cCA9IChzY2hlbWEpLT5cblx0ZmllbGRzID0gXy5tYXAoc2NoZW1hLCAoZmllbGQsIGZpZWxkTmFtZSkgLT5cblx0XHRyZXR1cm4gKCFmaWVsZC5hdXRvZm9ybSBvciAhZmllbGQuYXV0b2Zvcm0uZ3JvdXAgb3IgZmllbGQuYXV0b2Zvcm0uZ3JvdXAgPT0gXCItXCIpIGFuZCAoIWZpZWxkLmF1dG9mb3JtIG9yIGZpZWxkLmF1dG9mb3JtLnR5cGUgIT0gXCJoaWRkZW5cIikgYW5kIGZpZWxkTmFtZVxuXHQpXG5cdGZpZWxkcyA9IF8uY29tcGFjdChmaWVsZHMpXG5cdHJldHVybiBmaWVsZHNcblxuQ3JlYXRvci5nZXRTb3J0ZWRGaWVsZEdyb3VwTmFtZXMgPSAoc2NoZW1hKS0+XG5cdG5hbWVzID0gXy5tYXAoc2NoZW1hLCAoZmllbGQpIC0+XG4gXHRcdHJldHVybiBmaWVsZC5hdXRvZm9ybSBhbmQgZmllbGQuYXV0b2Zvcm0uZ3JvdXAgIT0gXCItXCIgYW5kIGZpZWxkLmF1dG9mb3JtLmdyb3VwXG5cdClcblx0bmFtZXMgPSBfLmNvbXBhY3QobmFtZXMpXG5cdG5hbWVzID0gXy51bmlxdWUobmFtZXMpXG5cdHJldHVybiBuYW1lc1xuXG5DcmVhdG9yLmdldEZpZWxkc0Zvckdyb3VwID0gKHNjaGVtYSwgZ3JvdXBOYW1lKSAtPlxuICBcdGZpZWxkcyA9IF8ubWFwKHNjaGVtYSwgKGZpZWxkLCBmaWVsZE5hbWUpIC0+XG4gICAgXHRyZXR1cm4gZmllbGQuYXV0b2Zvcm0gYW5kIGZpZWxkLmF1dG9mb3JtLmdyb3VwID09IGdyb3VwTmFtZSBhbmQgZmllbGQuYXV0b2Zvcm0udHlwZSAhPSBcImhpZGRlblwiIGFuZCBmaWVsZE5hbWVcbiAgXHQpXG4gIFx0ZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcylcbiAgXHRyZXR1cm4gZmllbGRzXG5cbkNyZWF0b3IuZ2V0U3lzdGVtQmFzZUZpZWxkcyA9ICgpIC0+XG5cdHJldHVybiBbXCJjcmVhdGVkXCIsIFwiY3JlYXRlZF9ieVwiLCBcIm1vZGlmaWVkXCIsIFwibW9kaWZpZWRfYnlcIl1cblxuQ3JlYXRvci5nZXRGaWVsZHNXaXRob3V0U3lzdGVtQmFzZSA9IChrZXlzKSAtPlxuXHRyZXR1cm4gXy5kaWZmZXJlbmNlKGtleXMsIENyZWF0b3IuZ2V0U3lzdGVtQmFzZUZpZWxkcygpKTtcblxuQ3JlYXRvci5nZXRGaWVsZHNXaXRob3V0T21pdCA9IChzY2hlbWEsIGtleXMpIC0+XG5cdGtleXMgPSBfLm1hcChrZXlzLCAoa2V5KSAtPlxuXHRcdGZpZWxkID0gXy5waWNrKHNjaGVtYSwga2V5KVxuXHRcdGlmIGZpZWxkW2tleV0uYXV0b2Zvcm0/Lm9taXRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBrZXlcblx0KVxuXHRrZXlzID0gXy5jb21wYWN0KGtleXMpXG5cdHJldHVybiBrZXlzXG5cbkNyZWF0b3IuZ2V0RmllbGRzSW5GaXJzdExldmVsID0gKGZpcnN0TGV2ZWxLZXlzLCBrZXlzKSAtPlxuXHRrZXlzID0gXy5tYXAoa2V5cywgKGtleSkgLT5cblx0XHRpZiBfLmluZGV4T2YoZmlyc3RMZXZlbEtleXMsIGtleSkgPiAtMVxuXHRcdFx0cmV0dXJuIGtleVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXHQpXG5cdGtleXMgPSBfLmNvbXBhY3Qoa2V5cylcblx0cmV0dXJuIGtleXNcblxuQ3JlYXRvci5nZXRGaWVsZHNGb3JSZW9yZGVyID0gKHNjaGVtYSwga2V5cywgaXNTaW5nbGUpIC0+XG5cdGZpZWxkcyA9IFtdXG5cdGkgPSAwXG5cdF9rZXlzID0gXy5maWx0ZXIoa2V5cywgKGtleSktPlxuXHRcdHJldHVybiAha2V5LmVuZHNXaXRoKCdfZW5kTGluZScpXG5cdCk7XG5cdHdoaWxlIGkgPCBfa2V5cy5sZW5ndGhcblx0XHRzY18xID0gXy5waWNrKHNjaGVtYSwgX2tleXNbaV0pXG5cdFx0c2NfMiA9IF8ucGljayhzY2hlbWEsIF9rZXlzW2krMV0pXG5cblx0XHRpc193aWRlXzEgPSBmYWxzZVxuXHRcdGlzX3dpZGVfMiA9IGZhbHNlXG5cbiNcdFx0aXNfcmFuZ2VfMSA9IGZhbHNlXG4jXHRcdGlzX3JhbmdlXzIgPSBmYWxzZVxuXG5cdFx0Xy5lYWNoIHNjXzEsICh2YWx1ZSkgLT5cblx0XHRcdGlmIHZhbHVlLmF1dG9mb3JtPy5pc193aWRlIHx8IHZhbHVlLmF1dG9mb3JtPy50eXBlID09IFwidGFibGVcIlxuXHRcdFx0XHRpc193aWRlXzEgPSB0cnVlXG5cbiNcdFx0XHRpZiB2YWx1ZS5hdXRvZm9ybT8uaXNfcmFuZ2VcbiNcdFx0XHRcdGlzX3JhbmdlXzEgPSB0cnVlXG5cblx0XHRfLmVhY2ggc2NfMiwgKHZhbHVlKSAtPlxuXHRcdFx0aWYgdmFsdWUuYXV0b2Zvcm0/LmlzX3dpZGUgfHwgdmFsdWUuYXV0b2Zvcm0/LnR5cGUgPT0gXCJ0YWJsZVwiXG5cdFx0XHRcdGlzX3dpZGVfMiA9IHRydWVcblxuI1x0XHRcdGlmIHZhbHVlLmF1dG9mb3JtPy5pc19yYW5nZVxuI1x0XHRcdFx0aXNfcmFuZ2VfMiA9IHRydWVcblxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0aXNfd2lkZV8xID0gdHJ1ZVxuXHRcdFx0aXNfd2lkZV8yID0gdHJ1ZVxuXG5cdFx0aWYgaXNTaW5nbGVcblx0XHRcdGZpZWxkcy5wdXNoIF9rZXlzLnNsaWNlKGksIGkrMSlcblx0XHRcdGkgKz0gMVxuXHRcdGVsc2VcbiNcdFx0XHRpZiAhaXNfcmFuZ2VfMSAmJiBpc19yYW5nZV8yXG4jXHRcdFx0XHRjaGlsZEtleXMgPSBfa2V5cy5zbGljZShpLCBpKzEpXG4jXHRcdFx0XHRjaGlsZEtleXMucHVzaCB1bmRlZmluZWRcbiNcdFx0XHRcdGZpZWxkcy5wdXNoIGNoaWxkS2V5c1xuI1x0XHRcdFx0aSArPSAxXG4jXHRcdFx0ZWxzZVxuXHRcdFx0aWYgaXNfd2lkZV8xXG5cdFx0XHRcdGZpZWxkcy5wdXNoIF9rZXlzLnNsaWNlKGksIGkrMSlcblx0XHRcdFx0aSArPSAxXG5cdFx0XHRlbHNlIGlmICFpc193aWRlXzEgYW5kIGlzX3dpZGVfMlxuXHRcdFx0XHRjaGlsZEtleXMgPSBfa2V5cy5zbGljZShpLCBpKzEpXG5cdFx0XHRcdGNoaWxkS2V5cy5wdXNoIHVuZGVmaW5lZFxuXHRcdFx0XHRmaWVsZHMucHVzaCBjaGlsZEtleXNcblx0XHRcdFx0aSArPSAxXG5cdFx0XHRlbHNlIGlmICFpc193aWRlXzEgYW5kICFpc193aWRlXzJcblx0XHRcdFx0Y2hpbGRLZXlzID0gX2tleXMuc2xpY2UoaSwgaSsxKVxuXHRcdFx0XHRpZiBfa2V5c1tpKzFdXG5cdFx0XHRcdFx0Y2hpbGRLZXlzLnB1c2ggX2tleXNbaSsxXVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2hpbGRLZXlzLnB1c2ggdW5kZWZpbmVkXG5cdFx0XHRcdGZpZWxkcy5wdXNoIGNoaWxkS2V5c1xuXHRcdFx0XHRpICs9IDJcblxuXHRyZXR1cm4gZmllbGRzXG5cbkNyZWF0b3IuaXNGaWx0ZXJWYWx1ZUVtcHR5ID0gKHYpIC0+XG5cdHJldHVybiB0eXBlb2YgdiA9PSBcInVuZGVmaW5lZFwiIHx8IHYgPT0gbnVsbCB8fCBOdW1iZXIuaXNOYU4odikgfHwgdi5sZW5ndGggPT0gMFxuXG5DcmVhdG9yLmdldEZpZWxkRGF0YVR5cGUgPSAob2JqZWN0RmllbGRzLCBrZXkpLT5cblx0aWYgb2JqZWN0RmllbGRzIGFuZCBrZXlcblx0XHRyZXN1bHQgPSBvYmplY3RGaWVsZHNba2V5XT8udHlwZVxuXHRcdGlmIFtcImZvcm11bGFcIiwgXCJzdW1tYXJ5XCJdLmluZGV4T2YocmVzdWx0KSA+IC0xXG5cdFx0XHRyZXN1bHQgPSBvYmplY3RGaWVsZHNba2V5XS5kYXRhX3R5cGVcblx0XHQjIGVsc2UgaWYgcmVzdWx0ID09IFwic2VsZWN0XCIgYW5kIG9iamVjdEZpZWxkc1trZXldPy5kYXRhX3R5cGUgYW5kIG9iamVjdEZpZWxkc1trZXldLmRhdGFfdHlwZSAhPSBcInRleHRcIlxuXHRcdCMgXHRyZXN1bHQgPSBvYmplY3RGaWVsZHNba2V5XS5kYXRhX3R5cGVcblx0XHRyZXR1cm4gcmVzdWx0XG5cdGVsc2Vcblx0XHRyZXR1cm4gXCJ0ZXh0XCJcblxuIyBFTkRcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdENyZWF0b3IuZ2V0QWxsUmVsYXRlZE9iamVjdHMgPSAob2JqZWN0X25hbWUpLT5cblx0XHRyZWxhdGVkX29iamVjdF9uYW1lcyA9IFtdXG5cdFx0Xy5lYWNoIENyZWF0b3IuT2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKS0+XG5cdFx0XHRfLmVhY2ggcmVsYXRlZF9vYmplY3QuZmllbGRzLCAocmVsYXRlZF9maWVsZCwgcmVsYXRlZF9maWVsZF9uYW1lKS0+XG5cdFx0XHRcdGlmIHJlbGF0ZWRfZmllbGQudHlwZSA9PSBcIm1hc3Rlcl9kZXRhaWxcIiBhbmQgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gYW5kIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvID09IG9iamVjdF9uYW1lXG5cdFx0XHRcdFx0cmVsYXRlZF9vYmplY3RfbmFtZXMucHVzaCByZWxhdGVkX29iamVjdF9uYW1lXG5cblx0XHRpZiBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSkuZW5hYmxlX2ZpbGVzXG5cdFx0XHRyZWxhdGVkX29iamVjdF9uYW1lcy5wdXNoIFwiY21zX2ZpbGVzXCJcblxuXHRcdHJldHVybiByZWxhdGVkX29iamVjdF9uYW1lc1xuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0U3RlZWRvcy5mb3JtYXRJbmRleCA9IChhcnJheSkgLT5cblx0XHRvYmplY3QgPSB7XG4gICAgICAgIFx0YmFja2dyb3VuZDogdHJ1ZVxuICAgIFx0fTtcblx0XHRpc2RvY3VtZW50REIgPSBNZXRlb3Iuc2V0dGluZ3M/LmRhdGFzb3VyY2VzPy5kZWZhdWx0Py5kb2N1bWVudERCIHx8IGZhbHNlO1xuXHRcdGlmIGlzZG9jdW1lbnREQlxuXHRcdFx0aWYgYXJyYXkubGVuZ3RoID4gMFxuXHRcdFx0XHRpbmRleE5hbWUgPSBhcnJheS5qb2luKFwiLlwiKTtcblx0XHRcdFx0b2JqZWN0Lm5hbWUgPSBpbmRleE5hbWU7XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiAoaW5kZXhOYW1lLmxlbmd0aCA+IDUyKVxuXHRcdFx0XHRcdG9iamVjdC5uYW1lID0gaW5kZXhOYW1lLnN1YnN0cmluZygwLDUyKTtcblxuXHRcdHJldHVybiBvYmplY3Q7IiwiQ3JlYXRvci5nZXRTY2hlbWEgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgcmVmO1xuICByZXR1cm4gKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKSkgIT0gbnVsbCA/IHJlZi5zY2hlbWEgOiB2b2lkIDA7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdEhvbWVDb21wb25lbnQgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdFVybCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkge1xuICB2YXIgbGlzdF92aWV3LCBsaXN0X3ZpZXdfaWQ7XG4gIGlmICghYXBwX2lkKSB7XG4gICAgYXBwX2lkID0gU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIik7XG4gIH1cbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBsaXN0X3ZpZXcgPSBDcmVhdG9yLmdldExpc3RWaWV3KG9iamVjdF9uYW1lLCBudWxsKTtcbiAgbGlzdF92aWV3X2lkID0gbGlzdF92aWV3ICE9IG51bGwgPyBsaXN0X3ZpZXcuX2lkIDogdm9pZCAwO1xuICBpZiAocmVjb3JkX2lkKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL3ZpZXcvXCIgKyByZWNvcmRfaWQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChDcmVhdG9yLmdldE9iamVjdEhvbWVDb21wb25lbnQob2JqZWN0X25hbWUpKSB7XG4gICAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxpc3Rfdmlld19pZCkge1xuICAgICAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvZ3JpZC9cIiArIGxpc3Rfdmlld19pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0QWJzb2x1dGVVcmwgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpIHtcbiAgdmFyIGxpc3RfdmlldywgbGlzdF92aWV3X2lkO1xuICBpZiAoIWFwcF9pZCkge1xuICAgIGFwcF9pZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpO1xuICB9XG4gIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gIH1cbiAgbGlzdF92aWV3ID0gQ3JlYXRvci5nZXRMaXN0VmlldyhvYmplY3RfbmFtZSwgbnVsbCk7XG4gIGxpc3Rfdmlld19pZCA9IGxpc3RfdmlldyAhPSBudWxsID8gbGlzdF92aWV3Ll9pZCA6IHZvaWQgMDtcbiAgaWYgKHJlY29yZF9pZCkge1xuICAgIHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi92aWV3L1wiICsgcmVjb3JkX2lkLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvZ3JpZC9cIiArIGxpc3Rfdmlld19pZCwgdHJ1ZSk7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0Um91dGVyVXJsID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSB7XG4gIHZhciBsaXN0X3ZpZXcsIGxpc3Rfdmlld19pZDtcbiAgaWYgKCFhcHBfaWQpIHtcbiAgICBhcHBfaWQgPSBTZXNzaW9uLmdldChcImFwcF9pZFwiKTtcbiAgfVxuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICB9XG4gIGxpc3RfdmlldyA9IENyZWF0b3IuZ2V0TGlzdFZpZXcob2JqZWN0X25hbWUsIG51bGwpO1xuICBsaXN0X3ZpZXdfaWQgPSBsaXN0X3ZpZXcgIT0gbnVsbCA/IGxpc3Rfdmlldy5faWQgOiB2b2lkIDA7XG4gIGlmIChyZWNvcmRfaWQpIHtcbiAgICByZXR1cm4gXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL3ZpZXcvXCIgKyByZWNvcmRfaWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldExpc3RWaWV3VXJsID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGFwcF9pZCwgbGlzdF92aWV3X2lkKSB7XG4gIHZhciB1cmw7XG4gIHVybCA9IENyZWF0b3IuZ2V0TGlzdFZpZXdSZWxhdGl2ZVVybChvYmplY3RfbmFtZSwgYXBwX2lkLCBsaXN0X3ZpZXdfaWQpO1xuICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybCh1cmwpO1xufTtcblxuQ3JlYXRvci5nZXRMaXN0Vmlld1JlbGF0aXZlVXJsID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGFwcF9pZCwgbGlzdF92aWV3X2lkKSB7XG4gIHJldHVybiBcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvZ3JpZC9cIiArIGxpc3Rfdmlld19pZDtcbn07XG5cbkNyZWF0b3IuZ2V0U3dpdGNoTGlzdFVybCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBhcHBfaWQsIGxpc3Rfdmlld19pZCkge1xuICBpZiAobGlzdF92aWV3X2lkKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL1wiICsgbGlzdF92aWV3X2lkICsgXCIvbGlzdFwiKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvbGlzdC9zd2l0Y2hcIik7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdFVybCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBhcHBfaWQsIHJlY29yZF9pZCwgcmVsYXRlZF9vYmplY3RfbmFtZSwgcmVsYXRlZF9maWVsZF9uYW1lKSB7XG4gIGlmIChyZWxhdGVkX2ZpZWxkX25hbWUpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvXCIgKyByZWNvcmRfaWQgKyBcIi9cIiArIHJlbGF0ZWRfb2JqZWN0X25hbWUgKyBcIi9ncmlkP3JlbGF0ZWRfZmllbGRfbmFtZT1cIiArIHJlbGF0ZWRfZmllbGRfbmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL1wiICsgcmVjb3JkX2lkICsgXCIvXCIgKyByZWxhdGVkX29iamVjdF9uYW1lICsgXCIvZ3JpZFwiKTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRPYmplY3RMb29rdXBGaWVsZE9wdGlvbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgaXNfZGVlcCwgaXNfc2tpcF9oaWRlLCBpc19yZWxhdGVkKSB7XG4gIHZhciBfb2JqZWN0LCBfb3B0aW9ucywgZmllbGRzLCBpY29uLCByZWxhdGVkT2JqZWN0cztcbiAgX29wdGlvbnMgPSBbXTtcbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIHJldHVybiBfb3B0aW9ucztcbiAgfVxuICBfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBmaWVsZHMgPSBfb2JqZWN0ICE9IG51bGwgPyBfb2JqZWN0LmZpZWxkcyA6IHZvaWQgMDtcbiAgaWNvbiA9IF9vYmplY3QgIT0gbnVsbCA/IF9vYmplY3QuaWNvbiA6IHZvaWQgMDtcbiAgXy5mb3JFYWNoKGZpZWxkcywgZnVuY3Rpb24oZiwgaykge1xuICAgIGlmIChpc19za2lwX2hpZGUgJiYgZi5oaWRkZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGYudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogXCJcIiArIChmLmxhYmVsIHx8IGspLFxuICAgICAgICB2YWx1ZTogXCJcIiArIGssXG4gICAgICAgIGljb246IGljb25cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX29wdGlvbnMucHVzaCh7XG4gICAgICAgIGxhYmVsOiBmLmxhYmVsIHx8IGssXG4gICAgICAgIHZhbHVlOiBrLFxuICAgICAgICBpY29uOiBpY29uXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICBpZiAoaXNfZGVlcCkge1xuICAgIF8uZm9yRWFjaChmaWVsZHMsIGZ1bmN0aW9uKGYsIGspIHtcbiAgICAgIHZhciByX29iamVjdDtcbiAgICAgIGlmIChpc19za2lwX2hpZGUgJiYgZi5oaWRkZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKChmLnR5cGUgPT09IFwibG9va3VwXCIgfHwgZi50eXBlID09PSBcIm1hc3Rlcl9kZXRhaWxcIikgJiYgZi5yZWZlcmVuY2VfdG8gJiYgXy5pc1N0cmluZyhmLnJlZmVyZW5jZV90bykpIHtcbiAgICAgICAgcl9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChmLnJlZmVyZW5jZV90byk7XG4gICAgICAgIGlmIChyX29iamVjdCkge1xuICAgICAgICAgIHJldHVybiBfLmZvckVhY2gocl9vYmplY3QuZmllbGRzLCBmdW5jdGlvbihmMiwgazIpIHtcbiAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgbGFiZWw6IChmLmxhYmVsIHx8IGspICsgXCI9PlwiICsgKGYyLmxhYmVsIHx8IGsyKSxcbiAgICAgICAgICAgICAgdmFsdWU6IGsgKyBcIi5cIiArIGsyLFxuICAgICAgICAgICAgICBpY29uOiByX29iamVjdCAhPSBudWxsID8gcl9vYmplY3QuaWNvbiA6IHZvaWQgMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBpZiAoaXNfcmVsYXRlZCkge1xuICAgIHJlbGF0ZWRPYmplY3RzID0gQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0cyhvYmplY3RfbmFtZSk7XG4gICAgXy5lYWNoKHJlbGF0ZWRPYmplY3RzLCAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihfcmVsYXRlZE9iamVjdCkge1xuICAgICAgICB2YXIgcmVsYXRlZE9iamVjdCwgcmVsYXRlZE9wdGlvbnM7XG4gICAgICAgIHJlbGF0ZWRPcHRpb25zID0gQ3JlYXRvci5nZXRPYmplY3RMb29rdXBGaWVsZE9wdGlvbnMoX3JlbGF0ZWRPYmplY3Qub2JqZWN0X25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICByZWxhdGVkT2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QoX3JlbGF0ZWRPYmplY3Qub2JqZWN0X25hbWUpO1xuICAgICAgICByZXR1cm4gXy5lYWNoKHJlbGF0ZWRPcHRpb25zLCBmdW5jdGlvbihyZWxhdGVkT3B0aW9uKSB7XG4gICAgICAgICAgaWYgKF9yZWxhdGVkT2JqZWN0LmZvcmVpZ25fa2V5ICE9PSByZWxhdGVkT3B0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gX29wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGxhYmVsOiAocmVsYXRlZE9iamVjdC5sYWJlbCB8fCByZWxhdGVkT2JqZWN0Lm5hbWUpICsgXCI9PlwiICsgcmVsYXRlZE9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IHJlbGF0ZWRPYmplY3QubmFtZSArIFwiLlwiICsgcmVsYXRlZE9wdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgaWNvbjogcmVsYXRlZE9iamVjdCAhPSBudWxsID8gcmVsYXRlZE9iamVjdC5pY29uIDogdm9pZCAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KSh0aGlzKSk7XG4gIH1cbiAgcmV0dXJuIF9vcHRpb25zO1xufTtcblxuQ3JlYXRvci5nZXRPYmplY3RGaWx0ZXJGaWVsZE9wdGlvbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgX29iamVjdCwgX29wdGlvbnMsIGZpZWxkcywgaWNvbiwgcGVybWlzc2lvbl9maWVsZHM7XG4gIF9vcHRpb25zID0gW107XG4gIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICByZXR1cm4gX29wdGlvbnM7XG4gIH1cbiAgX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgZmllbGRzID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5maWVsZHMgOiB2b2lkIDA7XG4gIHBlcm1pc3Npb25fZmllbGRzID0gQ3JlYXRvci5nZXRGaWVsZHMob2JqZWN0X25hbWUpO1xuICBpY29uID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5pY29uIDogdm9pZCAwO1xuICBfLmZvckVhY2goZmllbGRzLCBmdW5jdGlvbihmLCBrKSB7XG4gICAgaWYgKCFfLmluY2x1ZGUoW1wiZ3JpZFwiLCBcIm9iamVjdFwiLCBcIltPYmplY3RdXCIsIFwiW29iamVjdF1cIiwgXCJPYmplY3RcIiwgXCJhdmF0YXJcIiwgXCJpbWFnZVwiLCBcIm1hcmtkb3duXCIsIFwiaHRtbFwiXSwgZi50eXBlKSAmJiAhZi5oaWRkZW4pIHtcbiAgICAgIGlmICghL1xcdytcXC4vLnRlc3QoaykgJiYgXy5pbmRleE9mKHBlcm1pc3Npb25fZmllbGRzLCBrKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogZi5sYWJlbCB8fCBrLFxuICAgICAgICAgIHZhbHVlOiBrLFxuICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIF9vcHRpb25zO1xufTtcblxuQ3JlYXRvci5nZXRPYmplY3RGaWVsZE9wdGlvbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgX29iamVjdCwgX29wdGlvbnMsIGZpZWxkcywgaWNvbiwgcGVybWlzc2lvbl9maWVsZHM7XG4gIF9vcHRpb25zID0gW107XG4gIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICByZXR1cm4gX29wdGlvbnM7XG4gIH1cbiAgX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgZmllbGRzID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5maWVsZHMgOiB2b2lkIDA7XG4gIHBlcm1pc3Npb25fZmllbGRzID0gQ3JlYXRvci5nZXRGaWVsZHMob2JqZWN0X25hbWUpO1xuICBpY29uID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5pY29uIDogdm9pZCAwO1xuICBfLmZvckVhY2goZmllbGRzLCBmdW5jdGlvbihmLCBrKSB7XG4gICAgaWYgKCFfLmluY2x1ZGUoW1wiZ3JpZFwiLCBcIm9iamVjdFwiLCBcIltPYmplY3RdXCIsIFwiW29iamVjdF1cIiwgXCJPYmplY3RcIiwgXCJtYXJrZG93blwiLCBcImh0bWxcIl0sIGYudHlwZSkpIHtcbiAgICAgIGlmICghL1xcdytcXC4vLnRlc3QoaykgJiYgXy5pbmRleE9mKHBlcm1pc3Npb25fZmllbGRzLCBrKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogZi5sYWJlbCB8fCBrLFxuICAgICAgICAgIHZhbHVlOiBrLFxuICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIF9vcHRpb25zO1xufTtcblxuXG4vKlxuZmlsdGVyczog6KaB6L2s5o2i55qEZmlsdGVyc1xuZmllbGRzOiDlr7nosaHlrZfmrrVcbmZpbHRlcl9maWVsZHM6IOm7mOiupOi/h+a7pOWtl+aute+8jOaUr+aMgeWtl+espuS4suaVsOe7hOWSjOWvueixoeaVsOe7hOS4pOenjeagvOW8j++8jOWmgjpbJ2ZpbGVkX25hbWUxJywnZmlsZWRfbmFtZTInXSxbe2ZpZWxkOidmaWxlZF9uYW1lMScscmVxdWlyZWQ6dHJ1ZX1dXG7lpITnkIbpgLvovpE6IOaKimZpbHRlcnPkuK3lrZjlnKjkuo5maWx0ZXJfZmllbGRz55qE6L+H5ruk5p2h5Lu25aKe5Yqg5q+P6aG555qEaXNfZGVmYXVsdOOAgWlzX3JlcXVpcmVk5bGe5oCn77yM5LiN5a2Y5Zyo5LqOZmlsdGVyX2ZpZWxkc+eahOi/h+a7pOadoeS7tuWvueW6lOeahOenu+mZpOavj+mhueeahOebuOWFs+WxnuaAp1xu6L+U5Zue57uT5p6cOiDlpITnkIblkI7nmoRmaWx0ZXJzXG4gKi9cblxuQ3JlYXRvci5nZXRGaWx0ZXJzV2l0aEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKGZpbHRlcnMsIGZpZWxkcywgZmlsdGVyX2ZpZWxkcykge1xuICBpZiAoIWZpbHRlcnMpIHtcbiAgICBmaWx0ZXJzID0gW107XG4gIH1cbiAgaWYgKCFmaWx0ZXJfZmllbGRzKSB7XG4gICAgZmlsdGVyX2ZpZWxkcyA9IFtdO1xuICB9XG4gIGlmIChmaWx0ZXJfZmllbGRzICE9IG51bGwgPyBmaWx0ZXJfZmllbGRzLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgIGZpbHRlcl9maWVsZHMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICBpZiAoXy5pc1N0cmluZyhuKSkge1xuICAgICAgICBuID0ge1xuICAgICAgICAgIGZpZWxkOiBuLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkc1tuLmZpZWxkXSAmJiAhXy5maW5kV2hlcmUoZmlsdGVycywge1xuICAgICAgICBmaWVsZDogbi5maWVsZFxuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgZmllbGQ6IG4uZmllbGQsXG4gICAgICAgICAgaXNfZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICBpc19yZXF1aXJlZDogbi5yZXF1aXJlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBmaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVySXRlbSkge1xuICAgIHZhciBtYXRjaEZpZWxkO1xuICAgIG1hdGNoRmllbGQgPSBmaWx0ZXJfZmllbGRzLmZpbmQoZnVuY3Rpb24obikge1xuICAgICAgcmV0dXJuIG4gPT09IGZpbHRlckl0ZW0uZmllbGQgfHwgbi5maWVsZCA9PT0gZmlsdGVySXRlbS5maWVsZDtcbiAgICB9KTtcbiAgICBpZiAoXy5pc1N0cmluZyhtYXRjaEZpZWxkKSkge1xuICAgICAgbWF0Y2hGaWVsZCA9IHtcbiAgICAgICAgZmllbGQ6IG1hdGNoRmllbGQsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1hdGNoRmllbGQpIHtcbiAgICAgIGZpbHRlckl0ZW0uaXNfZGVmYXVsdCA9IHRydWU7XG4gICAgICByZXR1cm4gZmlsdGVySXRlbS5pc19yZXF1aXJlZCA9IG1hdGNoRmllbGQucmVxdWlyZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBmaWx0ZXJJdGVtLmlzX2RlZmF1bHQ7XG4gICAgICByZXR1cm4gZGVsZXRlIGZpbHRlckl0ZW0uaXNfcmVxdWlyZWQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlcnM7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdFJlY29yZCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHNlbGVjdF9maWVsZHMsIGV4cGFuZCkge1xuICB2YXIgY29sbGVjdGlvbiwgb2JqLCByZWNvcmQsIHJlZiwgcmVmMSwgcmVmMjtcbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBpZiAoIXJlY29yZF9pZCkge1xuICAgIHJlY29yZF9pZCA9IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpO1xuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAob2JqZWN0X25hbWUgPT09IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIikgJiYgcmVjb3JkX2lkID09PSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKSkge1xuICAgICAgaWYgKChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gcmVmLnJlY29yZCA6IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gKHJlZjEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjIgPSByZWYxLnJlY29yZCkgIT0gbnVsbCA/IHJlZjIuZ2V0KCkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLm9kYXRhLmdldChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzZWxlY3RfZmllbGRzLCBleHBhbmQpO1xuICAgIH1cbiAgfVxuICBvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGlmIChvYmouZGF0YWJhc2VfbmFtZSA9PT0gXCJtZXRlb3JcIiB8fCAhb2JqLmRhdGFiYXNlX25hbWUpIHtcbiAgICBjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKTtcbiAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgcmVjb3JkID0gY29sbGVjdGlvbi5maW5kT25lKHJlY29yZF9pZCk7XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cbiAgfSBlbHNlIGlmIChvYmplY3RfbmFtZSAmJiByZWNvcmRfaWQpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5vZGF0YS5nZXQob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgc2VsZWN0X2ZpZWxkcywgZXhwYW5kKTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRPYmplY3RSZWNvcmROYW1lID0gZnVuY3Rpb24ocmVjb3JkLCBvYmplY3RfbmFtZSkge1xuICB2YXIgbmFtZV9maWVsZF9rZXksIHJlZjtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSBDcmVhdG9yLmdldE9iamVjdFJlY29yZCgpO1xuICB9XG4gIGlmIChyZWNvcmQpIHtcbiAgICBuYW1lX2ZpZWxkX2tleSA9IG9iamVjdF9uYW1lID09PSBcIm9yZ2FuaXphdGlvbnNcIiA/IFwibmFtZVwiIDogKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKSkgIT0gbnVsbCA/IHJlZi5OQU1FX0ZJRUxEX0tFWSA6IHZvaWQgMDtcbiAgICBpZiAocmVjb3JkICYmIG5hbWVfZmllbGRfa2V5KSB7XG4gICAgICByZXR1cm4gcmVjb3JkLmxhYmVsIHx8IHJlY29yZFtuYW1lX2ZpZWxkX2tleV07XG4gICAgfVxuICB9XG59O1xuXG5DcmVhdG9yLmdldEFwcCA9IGZ1bmN0aW9uKGFwcF9pZCkge1xuICB2YXIgYXBwTWVudXMsIGN1cnJlbnRBcHA7XG4gIGFwcE1lbnVzID0gU2Vzc2lvbi5nZXQoXCJfYXBwX21lbnVzXCIpIHx8IFNlc3Npb24uZ2V0KFwiYXBwX21lbnVzXCIpO1xuICBpZiAoIWFwcE1lbnVzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGN1cnJlbnRBcHAgPSBhcHBNZW51cy5maW5kKGZ1bmN0aW9uKG1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIG1lbnVJdGVtLmlkID09PSBhcHBfaWQ7XG4gIH0pO1xuICByZXR1cm4gY3VycmVudEFwcDtcbn07XG5cbkNyZWF0b3IuZ2V0QXBwRGFzaGJvYXJkID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gIHZhciBhcHAsIGRhc2hib2FyZDtcbiAgYXBwID0gQ3JlYXRvci5nZXRBcHAoYXBwX2lkKTtcbiAgaWYgKCFhcHApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGFzaGJvYXJkID0gbnVsbDtcbiAgXy5lYWNoKENyZWF0b3IuRGFzaGJvYXJkcywgZnVuY3Rpb24odiwgaykge1xuICAgIHZhciByZWY7XG4gICAgaWYgKCgocmVmID0gdi5hcHBzKSAhPSBudWxsID8gcmVmLmluZGV4T2YoYXBwLl9pZCkgOiB2b2lkIDApID4gLTEpIHtcbiAgICAgIHJldHVybiBkYXNoYm9hcmQgPSB2O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXNoYm9hcmQ7XG59O1xuXG5DcmVhdG9yLmdldEFwcERhc2hib2FyZENvbXBvbmVudCA9IGZ1bmN0aW9uKGFwcF9pZCkge1xuICB2YXIgYXBwO1xuICBhcHAgPSBDcmVhdG9yLmdldEFwcChhcHBfaWQpO1xuICBpZiAoIWFwcCB8fCB0cnVlKSB7XG5cbiAgfVxufTtcblxuQ3JlYXRvci5nZXRBcHBPYmplY3ROYW1lcyA9IGZ1bmN0aW9uKGFwcF9pZCkge1xuICB2YXIgYXBwLCBhcHBPYmplY3RzLCBpc01vYmlsZSwgb2JqZWN0cztcbiAgYXBwID0gQ3JlYXRvci5nZXRBcHAoYXBwX2lkKTtcbiAgaWYgKCFhcHApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaXNNb2JpbGUgPSBTdGVlZG9zLmlzTW9iaWxlKCk7XG4gIGFwcE9iamVjdHMgPSBpc01vYmlsZSA/IGFwcC5tb2JpbGVfb2JqZWN0cyA6IGFwcC5vYmplY3RzO1xuICBvYmplY3RzID0gW107XG4gIGlmIChhcHApIHtcbiAgICBfLmVhY2goYXBwT2JqZWN0cywgZnVuY3Rpb24odikge1xuICAgICAgdmFyIG9iajtcbiAgICAgIG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KHYpO1xuICAgICAgaWYgKG9iaiAhPSBudWxsID8gb2JqLnBlcm1pc3Npb25zLmdldCgpLmFsbG93UmVhZCA6IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0cy5wdXNoKHYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvYmplY3RzO1xufTtcblxuQ3JlYXRvci5nZXRVcmxXaXRoVG9rZW4gPSBmdW5jdGlvbih1cmwsIGV4cHJlc3Npb25Gb3JtRGF0YSkge1xuICB2YXIgaGFzUXVlcnlTeW1ib2wsIGxpbmtTdHIsIHBhcmFtcztcbiAgcGFyYW1zID0ge307XG4gIHBhcmFtc1tcIlgtU3BhY2UtSWRcIl0gPSBTdGVlZG9zLnNwYWNlSWQoKTtcbiAgcGFyYW1zW1wiWC1Vc2VyLUlkXCJdID0gU3RlZWRvcy51c2VySWQoKTtcbiAgcGFyYW1zW1wiWC1Db21wYW55LUlkc1wiXSA9IFN0ZWVkb3MuZ2V0VXNlckNvbXBhbnlJZHMoKTtcbiAgcGFyYW1zW1wiWC1BdXRoLVRva2VuXCJdID0gQWNjb3VudHMuX3N0b3JlZExvZ2luVG9rZW4oKTtcbiAgaWYgKFN0ZWVkb3MuaXNFeHByZXNzaW9uKHVybCkpIHtcbiAgICB1cmwgPSBTdGVlZG9zLnBhcnNlU2luZ2xlRXhwcmVzc2lvbih1cmwsIGV4cHJlc3Npb25Gb3JtRGF0YSwgXCIjXCIsIENyZWF0b3IuVVNFUl9DT05URVhUKTtcbiAgfVxuICBoYXNRdWVyeVN5bWJvbCA9IC8oXFwjLitcXD8pfChcXD9bXiNdKiQpL2cudGVzdCh1cmwpO1xuICBsaW5rU3RyID0gaGFzUXVlcnlTeW1ib2wgPyBcIiZcIiA6IFwiP1wiO1xuICByZXR1cm4gXCJcIiArIHVybCArIGxpbmtTdHIgKyAoJC5wYXJhbShwYXJhbXMpKTtcbn07XG5cbkNyZWF0b3IuZ2V0QXBwTWVudSA9IGZ1bmN0aW9uKGFwcF9pZCwgbWVudV9pZCkge1xuICB2YXIgbWVudXM7XG4gIG1lbnVzID0gQ3JlYXRvci5nZXRBcHBNZW51cyhhcHBfaWQpO1xuICByZXR1cm4gbWVudXMgJiYgbWVudXMuZmluZChmdW5jdGlvbihtZW51KSB7XG4gICAgcmV0dXJuIG1lbnUuaWQgPT09IG1lbnVfaWQ7XG4gIH0pO1xufTtcblxuQ3JlYXRvci5nZXRBcHBNZW51VXJsRm9ySW50ZXJuZXQgPSBmdW5jdGlvbihtZW51KSB7XG4gIHJldHVybiBDcmVhdG9yLmdldFVybFdpdGhUb2tlbihtZW51LnBhdGgsIG1lbnUpO1xufTtcblxuQ3JlYXRvci5nZXRBcHBNZW51VXJsID0gZnVuY3Rpb24obWVudSkge1xuICB2YXIgdXJsO1xuICB1cmwgPSBtZW51LnBhdGg7XG4gIGlmIChtZW51LnR5cGUgPT09IFwidXJsXCIpIHtcbiAgICBpZiAobWVudS50YXJnZXQpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLmdldEFwcE1lbnVVcmxGb3JJbnRlcm5ldChtZW51KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiL2FwcC8tL3RhYl9pZnJhbWUvXCIgKyBtZW51LmlkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWVudS5wYXRoO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldEFwcE1lbnVzID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gIHZhciBhcHBNZW51cywgY3VyZW50QXBwTWVudXM7XG4gIGFwcE1lbnVzID0gU2Vzc2lvbi5nZXQoXCJfYXBwX21lbnVzXCIpIHx8IFNlc3Npb24uZ2V0KFwiYXBwX21lbnVzXCIpO1xuICBpZiAoIWFwcE1lbnVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGN1cmVudEFwcE1lbnVzID0gYXBwTWVudXMuZmluZChmdW5jdGlvbihtZW51SXRlbSkge1xuICAgIHJldHVybiBtZW51SXRlbS5pZCA9PT0gYXBwX2lkO1xuICB9KTtcbiAgaWYgKGN1cmVudEFwcE1lbnVzKSB7XG4gICAgcmV0dXJuIGN1cmVudEFwcE1lbnVzLmNoaWxkcmVuO1xuICB9XG59O1xuXG5DcmVhdG9yLmxvYWRBcHBzTWVudXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGRhdGEsIGlzTW9iaWxlLCBvcHRpb25zO1xuICBpc01vYmlsZSA9IFN0ZWVkb3MuaXNNb2JpbGUoKTtcbiAgZGF0YSA9IHt9O1xuICBpZiAoaXNNb2JpbGUpIHtcbiAgICBkYXRhLm1vYmlsZSA9IGlzTW9iaWxlO1xuICB9XG4gIG9wdGlvbnMgPSB7XG4gICAgdHlwZTogJ2dldCcsXG4gICAgZGF0YTogZGF0YSxcbiAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gU2Vzc2lvbi5zZXQoXCJhcHBfbWVudXNcIiwgZGF0YSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHlwZW9mIFN0ZWVkb3MgIT09IFwidW5kZWZpbmVkXCIgJiYgU3RlZWRvcyAhPT0gbnVsbCA/IFN0ZWVkb3MuYXV0aFJlcXVlc3QoXCIvc2VydmljZS9hcGkvYXBwcy9tZW51c1wiLCBvcHRpb25zKSA6IHZvaWQgMDtcbn07XG5cbkNyZWF0b3IuY3JlYXRvckFwcHNTZWxlY3RvciA9IGZ1bmN0aW9uKGFwcHMsIGFzc2lnbmVkX2FwcHMpIHtcbiAgdmFyIGFkbWluQXBwLCBjcmVhdG9yQXBwcywgc29ydGVkQXBwcztcbiAgYWRtaW5BcHAgPSB2b2lkIDA7XG4gIHNvcnRlZEFwcHMgPSB2b2lkIDA7XG4gIF8uZWFjaChhcHBzLCBmdW5jdGlvbihhcHAsIGtleSkge1xuICAgIGlmICghYXBwLl9pZCkge1xuICAgICAgYXBwLl9pZCA9IGtleTtcbiAgICB9XG4gICAgaWYgKGFwcC5pc19jcmVhdG9yKSB7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYXBwLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICBzb3J0ZWRBcHBzID0gXy5zb3J0QnkoXy52YWx1ZXMoYXBwcyksICdzb3J0Jyk7XG4gIGNyZWF0b3JBcHBzID0ge307XG4gIGFkbWluQXBwID0ge307XG4gIF8uZWFjaChzb3J0ZWRBcHBzLCBmdW5jdGlvbihuKSB7XG4gICAgaWYgKG4uX2lkID09PSAnYWRtaW4nKSB7XG4gICAgICByZXR1cm4gYWRtaW5BcHAgPSBuO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3JlYXRvckFwcHNbbi5faWRdID0gbjtcbiAgICB9XG4gIH0pO1xuICBjcmVhdG9yQXBwcy5hZG1pbiA9IGFkbWluQXBwO1xuICBpZiAoYXNzaWduZWRfYXBwcy5sZW5ndGgpIHtcbiAgICBfLmVhY2goY3JlYXRvckFwcHMsIGZ1bmN0aW9uKGFwcCwga2V5KSB7XG4gICAgICBpZiAoYXNzaWduZWRfYXBwcy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgICBhcHAudmlzaWJsZSA9IGFwcC5pc19jcmVhdG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY3JlYXRvckFwcHM7XG59O1xuXG5DcmVhdG9yLnZpc2libGVBcHBzU2VsZWN0b3IgPSBmdW5jdGlvbihjcmVhdG9yQXBwcywgaW5jbHVkZUFkbWluKSB7XG4gIHZhciBhcHBzO1xuICBpZiAoaW5jbHVkZUFkbWluID09IG51bGwpIHtcbiAgICBpbmNsdWRlQWRtaW4gPSB0cnVlO1xuICB9XG4gIGFwcHMgPSBbXTtcbiAgXy5lYWNoKGNyZWF0b3JBcHBzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgaWYgKHYudmlzaWJsZSAhPT0gZmFsc2UgJiYgdi5faWQgIT09ICdhZG1pbicgfHwgaW5jbHVkZUFkbWluICYmIHYuX2lkID09PSAnYWRtaW4nKSB7XG4gICAgICBhcHBzLnB1c2godik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGFwcHM7XG59O1xuXG5DcmVhdG9yLmdldFZpc2libGVBcHBzID0gZnVuY3Rpb24oaW5jbHVkZUFkbWluKSB7XG4gIHZhciBjaGFuZ2VBcHAsIGNyZWF0b3JBcHBzO1xuICBjaGFuZ2VBcHAgPSBDcmVhdG9yLl9zdWJBcHAuZ2V0KCk7XG4gIGNyZWF0b3JBcHBzID0gT2JqZWN0LmFzc2lnbih7fSwgQ3JlYXRvci5BcHBzLCB7XG4gICAgYXBwczogY2hhbmdlQXBwXG4gIH0pO1xuICByZXR1cm4gQ3JlYXRvci52aXNpYmxlQXBwc1NlbGVjdG9yKGNyZWF0b3JBcHBzLCBpbmNsdWRlQWRtaW4pO1xufTtcblxuQ3JlYXRvci5nZXRWaXNpYmxlQXBwc09iamVjdHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFwcHMsIG9iamVjdHMsIHZpc2libGVPYmplY3ROYW1lcztcbiAgYXBwcyA9IENyZWF0b3IuZ2V0VmlzaWJsZUFwcHMoKTtcbiAgdmlzaWJsZU9iamVjdE5hbWVzID0gXy5mbGF0dGVuKF8ucGx1Y2soYXBwcywgJ29iamVjdHMnKSk7XG4gIG9iamVjdHMgPSBfLmZpbHRlcihDcmVhdG9yLk9iamVjdHMsIGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICh2aXNpYmxlT2JqZWN0TmFtZXMuaW5kZXhPZihvYmoubmFtZSkgPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIG9iamVjdHMgPSBvYmplY3RzLnNvcnQoQ3JlYXRvci5zb3J0aW5nTWV0aG9kLmJpbmQoe1xuICAgIGtleTogXCJsYWJlbFwiXG4gIH0pKTtcbiAgb2JqZWN0cyA9IF8ucGx1Y2sob2JqZWN0cywgJ25hbWUnKTtcbiAgcmV0dXJuIF8udW5pcShvYmplY3RzKTtcbn07XG5cbkNyZWF0b3IuZ2V0QXBwc09iamVjdHMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIG9iamVjdHMsIHRlbXBPYmplY3RzO1xuICBvYmplY3RzID0gW107XG4gIHRlbXBPYmplY3RzID0gW107XG4gIF8uZm9yRWFjaChDcmVhdG9yLkFwcHMsIGZ1bmN0aW9uKGFwcCkge1xuICAgIHRlbXBPYmplY3RzID0gXy5maWx0ZXIoYXBwLm9iamVjdHMsIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuICFvYmouaGlkZGVuO1xuICAgIH0pO1xuICAgIHJldHVybiBvYmplY3RzID0gb2JqZWN0cy5jb25jYXQodGVtcE9iamVjdHMpO1xuICB9KTtcbiAgcmV0dXJuIF8udW5pcShvYmplY3RzKTtcbn07XG5cbkNyZWF0b3IudmFsaWRhdGVGaWx0ZXJzID0gZnVuY3Rpb24oZmlsdGVycywgbG9naWMpIHtcbiAgdmFyIGUsIGVycm9yTXNnLCBmaWx0ZXJfaXRlbXMsIGZpbHRlcl9sZW5ndGgsIGZsYWcsIGluZGV4LCB3b3JkO1xuICBmaWx0ZXJfaXRlbXMgPSBfLm1hcChmaWx0ZXJzLCBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoXy5pc0VtcHR5KG9iaikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH0pO1xuICBmaWx0ZXJfaXRlbXMgPSBfLmNvbXBhY3QoZmlsdGVyX2l0ZW1zKTtcbiAgZXJyb3JNc2cgPSBcIlwiO1xuICBmaWx0ZXJfbGVuZ3RoID0gZmlsdGVyX2l0ZW1zLmxlbmd0aDtcbiAgaWYgKGxvZ2ljKSB7XG4gICAgbG9naWMgPSBsb2dpYy5yZXBsYWNlKC9cXG4vZywgXCJcIikucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG4gICAgaWYgKC9bLl9cXC0hK10rL2lnLnRlc3QobG9naWMpKSB7XG4gICAgICBlcnJvck1zZyA9IFwi5ZCr5pyJ54m55q6K5a2X56ym44CCXCI7XG4gICAgfVxuICAgIGlmICghZXJyb3JNc2cpIHtcbiAgICAgIGluZGV4ID0gbG9naWMubWF0Y2goL1xcZCsvaWcpO1xuICAgICAgaWYgKCFpbmRleCkge1xuICAgICAgICBlcnJvck1zZyA9IFwi5pyJ5Lqb562b6YCJ5p2h5Lu26L+b6KGM5LqG5a6a5LmJ77yM5L2G5pyq5Zyo6auY57qn562b6YCJ5p2h5Lu25Lit6KKr5byV55So44CCXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgICBpZiAoaSA8IDEgfHwgaSA+IGZpbHRlcl9sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvck1zZyA9IFwi5oKo55qE562b6YCJ5p2h5Lu25byV55So5LqG5pyq5a6a5LmJ55qE562b6YCJ5Zmo77yaXCIgKyBpICsgXCLjgIJcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmbGFnID0gMTtcbiAgICAgICAgd2hpbGUgKGZsYWcgPD0gZmlsdGVyX2xlbmd0aCkge1xuICAgICAgICAgIGlmICghaW5kZXguaW5jbHVkZXMoXCJcIiArIGZsYWcpKSB7XG4gICAgICAgICAgICBlcnJvck1zZyA9IFwi5pyJ5Lqb562b6YCJ5p2h5Lu26L+b6KGM5LqG5a6a5LmJ77yM5L2G5pyq5Zyo6auY57qn562b6YCJ5p2h5Lu25Lit6KKr5byV55So44CCXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsYWcrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVycm9yTXNnKSB7XG4gICAgICB3b3JkID0gbG9naWMubWF0Y2goL1thLXpBLVpdKy9pZyk7XG4gICAgICBpZiAod29yZCkge1xuICAgICAgICB3b3JkLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgICAgIGlmICghL14oYW5kfG9yKSQvaWcudGVzdCh3KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yTXNnID0gXCLmo4Dmn6XmgqjnmoTpq5jnuqfnrZvpgInmnaHku7bkuK3nmoTmi7zlhpnjgIJcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWVycm9yTXNnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBDcmVhdG9yW1wiZXZhbFwiXShsb2dpYy5yZXBsYWNlKC9hbmQvaWcsIFwiJiZcIikucmVwbGFjZSgvb3IvaWcsIFwifHxcIikpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBlcnJvck1zZyA9IFwi5oKo55qE562b6YCJ5Zmo5Lit5ZCr5pyJ54m55q6K5a2X56ymXCI7XG4gICAgICB9XG4gICAgICBpZiAoLyhBTkQpW14oKV0rKE9SKS9pZy50ZXN0KGxvZ2ljKSB8fCAvKE9SKVteKCldKyhBTkQpL2lnLnRlc3QobG9naWMpKSB7XG4gICAgICAgIGVycm9yTXNnID0gXCLmgqjnmoTnrZvpgInlmajlv4XpobvlnKjov57nu63mgKfnmoQgQU5EIOWSjCBPUiDooajovr7lvI/liY3lkI7kvb/nlKjmi6zlj7fjgIJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGVycm9yTXNnKSB7XG4gICAgY29uc29sZS5sb2coXCJlcnJvclwiLCBlcnJvck1zZyk7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgdG9hc3RyLmVycm9yKGVycm9yTXNnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5cbi8qXG5vcHRpb25z5Y+C5pWw77yaXG5cdGV4dGVuZC0tIOaYr+WQpumcgOimgeaKiuW9k+WJjeeUqOaIt+WfuuacrOS/oeaBr+WKoOWFpeWFrOW8j++8jOWNs+iuqeWFrOW8j+aUr+aMgUNyZWF0b3IuVVNFUl9DT05URVhU5Lit55qE5YC877yM6buY6K6k5Li6dHJ1ZVxuXHR1c2VySWQtLSDlvZPliY3nmbvlvZXnlKjmiLdcblx0c3BhY2VJZC0tIOW9k+WJjeaJgOWcqOW3peS9nOWMulxuZXh0ZW5k5Li6dHJ1ZeaXtu+8jOWQjuerr+mcgOimgemineWkluS8oOWFpXVzZXJJZOWPinNwYWNlSWTnlKjkuo7mipPlj5ZDcmVhdG9yLlVTRVJfQ09OVEVYVOWvueW6lOeahOWAvFxuICovXG5cbkNyZWF0b3IuZm9ybWF0RmlsdGVyc1RvTW9uZ28gPSBmdW5jdGlvbihmaWx0ZXJzLCBvcHRpb25zKSB7XG4gIHZhciBzZWxlY3RvcjtcbiAgaWYgKCEoZmlsdGVycyAhPSBudWxsID8gZmlsdGVycy5sZW5ndGggOiB2b2lkIDApKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghKGZpbHRlcnNbMF0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICBmaWx0ZXJzID0gXy5tYXAoZmlsdGVycywgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gW29iai5maWVsZCwgb2JqLm9wZXJhdGlvbiwgb2JqLnZhbHVlXTtcbiAgICB9KTtcbiAgfVxuICBzZWxlY3RvciA9IFtdO1xuICBfLmVhY2goZmlsdGVycywgZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgdmFyIGZpZWxkLCBvcHRpb24sIHJlZywgc3ViX3NlbGVjdG9yLCB2YWx1ZTtcbiAgICBmaWVsZCA9IGZpbHRlclswXTtcbiAgICBvcHRpb24gPSBmaWx0ZXJbMV07XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgdmFsdWUgPSBDcmVhdG9yLmV2YWx1YXRlRm9ybXVsYShmaWx0ZXJbMl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IENyZWF0b3IuZXZhbHVhdGVGb3JtdWxhKGZpbHRlclsyXSwgbnVsbCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN1Yl9zZWxlY3RvciA9IHt9O1xuICAgIHN1Yl9zZWxlY3RvcltmaWVsZF0gPSB7fTtcbiAgICBpZiAob3B0aW9uID09PSBcIj1cIikge1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRlcVwiXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSBcIjw+XCIpIHtcbiAgICAgIHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkbmVcIl0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbiA9PT0gXCI+XCIpIHtcbiAgICAgIHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkZ3RcIl0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbiA9PT0gXCI+PVwiKSB7XG4gICAgICBzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGd0ZVwiXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSBcIjxcIikge1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRsdFwiXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSBcIjw9XCIpIHtcbiAgICAgIHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkbHRlXCJdID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb24gPT09IFwic3RhcnRzd2l0aFwiKSB7XG4gICAgICByZWcgPSBuZXcgUmVnRXhwKFwiXlwiICsgdmFsdWUsIFwiaVwiKTtcbiAgICAgIHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkcmVnZXhcIl0gPSByZWc7XG4gICAgfSBlbHNlIGlmIChvcHRpb24gPT09IFwiY29udGFpbnNcIikge1xuICAgICAgcmVnID0gbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpO1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRyZWdleFwiXSA9IHJlZztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbiA9PT0gXCJub3Rjb250YWluc1wiKSB7XG4gICAgICByZWcgPSBuZXcgUmVnRXhwKFwiXigoPyFcIiArIHZhbHVlICsgXCIpLikqJFwiLCBcImlcIik7XG4gICAgICBzdWJfc2VsZWN0b3JbZmllbGRdW1wiJHJlZ2V4XCJdID0gcmVnO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3IucHVzaChzdWJfc2VsZWN0b3IpO1xuICB9KTtcbiAgcmV0dXJuIHNlbGVjdG9yO1xufTtcblxuQ3JlYXRvci5pc0JldHdlZW5GaWx0ZXJPcGVyYXRpb24gPSBmdW5jdGlvbihvcGVyYXRpb24pIHtcbiAgdmFyIHJlZjtcbiAgcmV0dXJuIG9wZXJhdGlvbiA9PT0gXCJiZXR3ZWVuXCIgfHwgISEoKHJlZiA9IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVzKHRydWUpKSAhPSBudWxsID8gcmVmW29wZXJhdGlvbl0gOiB2b2lkIDApO1xufTtcblxuXG4vKlxub3B0aW9uc+WPguaVsO+8mlxuXHRleHRlbmQtLSDmmK/lkKbpnIDopoHmiorlvZPliY3nlKjmiLfln7rmnKzkv6Hmga/liqDlhaXlhazlvI/vvIzljbPorqnlhazlvI/mlK/mjIFDcmVhdG9yLlVTRVJfQ09OVEVYVOS4reeahOWAvO+8jOm7mOiupOS4unRydWVcblx0dXNlcklkLS0g5b2T5YmN55m75b2V55So5oi3XG5cdHNwYWNlSWQtLSDlvZPliY3miYDlnKjlt6XkvZzljLpcblx0ZXh0ZW5k5Li6dHJ1ZeaXtu+8jOWQjuerr+mcgOimgemineWkluS8oOWFpXVzZXJJZOWPinNwYWNlSWTnlKjkuo7mipPlj5ZDcmVhdG9yLlVTRVJfQ09OVEVYVOWvueW6lOeahOWAvFxuICovXG5cbkNyZWF0b3IuZm9ybWF0RmlsdGVyc1RvRGV2ID0gZnVuY3Rpb24oZmlsdGVycywgb2JqZWN0X25hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIGxvZ2ljVGVtcEZpbHRlcnMsIHNlbGVjdG9yO1xuICBpZiAoIWZpbHRlcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmlzX2xvZ2ljX29yIDogdm9pZCAwKSB7XG4gICAgbG9naWNUZW1wRmlsdGVycyA9IFtdO1xuICAgIGZpbHRlcnMuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICBsb2dpY1RlbXBGaWx0ZXJzLnB1c2gobik7XG4gICAgICByZXR1cm4gbG9naWNUZW1wRmlsdGVycy5wdXNoKFwib3JcIik7XG4gICAgfSk7XG4gICAgbG9naWNUZW1wRmlsdGVycy5wb3AoKTtcbiAgICBmaWx0ZXJzID0gbG9naWNUZW1wRmlsdGVycztcbiAgfVxuICBzZWxlY3RvciA9IFN0ZWVkb3NGaWx0ZXJzLmZvcm1hdEZpbHRlcnNUb0RldihmaWx0ZXJzLCBDcmVhdG9yLlVTRVJfQ09OVEVYVCk7XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cblxuLypcbm9wdGlvbnPlj4LmlbDvvJpcblx0ZXh0ZW5kLS0g5piv5ZCm6ZyA6KaB5oqK5b2T5YmN55So5oi35Z+65pys5L+h5oGv5Yqg5YWl5YWs5byP77yM5Y2z6K6p5YWs5byP5pSv5oyBQ3JlYXRvci5VU0VSX0NPTlRFWFTkuK3nmoTlgLzvvIzpu5jorqTkuLp0cnVlXG5cdHVzZXJJZC0tIOW9k+WJjeeZu+W9leeUqOaIt1xuXHRzcGFjZUlkLS0g5b2T5YmN5omA5Zyo5bel5L2c5Yy6XG5leHRlbmTkuLp0cnVl5pe277yM5ZCO56uv6ZyA6KaB6aKd5aSW5Lyg5YWldXNlcklk5Y+Kc3BhY2VJZOeUqOS6juaKk+WPlkNyZWF0b3IuVVNFUl9DT05URVhU5a+55bqU55qE5YC8XG4gKi9cblxuQ3JlYXRvci5mb3JtYXRMb2dpY0ZpbHRlcnNUb0RldiA9IGZ1bmN0aW9uKGZpbHRlcnMsIGZpbHRlcl9sb2dpYywgb3B0aW9ucykge1xuICB2YXIgZm9ybWF0X2xvZ2ljO1xuICBmb3JtYXRfbG9naWMgPSBmaWx0ZXJfbG9naWMucmVwbGFjZSgvXFwoXFxzKy9pZywgXCIoXCIpLnJlcGxhY2UoL1xccytcXCkvaWcsIFwiKVwiKS5yZXBsYWNlKC9cXCgvZywgXCJbXCIpLnJlcGxhY2UoL1xcKS9nLCBcIl1cIikucmVwbGFjZSgvXFxzKy9nLCBcIixcIikucmVwbGFjZSgvKGFuZHxvcikvaWcsIFwiJyQxJ1wiKTtcbiAgZm9ybWF0X2xvZ2ljID0gZm9ybWF0X2xvZ2ljLnJlcGxhY2UoLyhcXGQpKy9pZywgZnVuY3Rpb24oeCkge1xuICAgIHZhciBfZiwgZmllbGQsIG9wdGlvbiwgc3ViX3NlbGVjdG9yLCB2YWx1ZTtcbiAgICBfZiA9IGZpbHRlcnNbeCAtIDFdO1xuICAgIGZpZWxkID0gX2YuZmllbGQ7XG4gICAgb3B0aW9uID0gX2Yub3BlcmF0aW9uO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoX2YudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IENyZWF0b3IuZXZhbHVhdGVGb3JtdWxhKF9mLnZhbHVlLCBudWxsLCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3ViX3NlbGVjdG9yID0gW107XG4gICAgaWYgKF8uaXNBcnJheSh2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgIGlmIChvcHRpb24gPT09IFwiPVwiKSB7XG4gICAgICAgIF8uZWFjaCh2YWx1ZSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBzdWJfc2VsZWN0b3IucHVzaChbZmllbGQsIG9wdGlvbiwgdl0sIFwib3JcIik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb24gPT09IFwiPD5cIikge1xuICAgICAgICBfLmVhY2godmFsdWUsIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4gc3ViX3NlbGVjdG9yLnB1c2goW2ZpZWxkLCBvcHRpb24sIHZdLCBcImFuZFwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfLmVhY2godmFsdWUsIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4gc3ViX3NlbGVjdG9yLnB1c2goW2ZpZWxkLCBvcHRpb24sIHZdLCBcIm9yXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJfc2VsZWN0b3Jbc3ViX3NlbGVjdG9yLmxlbmd0aCAtIDFdID09PSBcImFuZFwiIHx8IHN1Yl9zZWxlY3RvcltzdWJfc2VsZWN0b3IubGVuZ3RoIC0gMV0gPT09IFwib3JcIikge1xuICAgICAgICBzdWJfc2VsZWN0b3IucG9wKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Yl9zZWxlY3RvciA9IFtmaWVsZCwgb3B0aW9uLCB2YWx1ZV07XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdWJfc2VsZWN0b3IpO1xuICB9KTtcbiAgZm9ybWF0X2xvZ2ljID0gXCJbXCIgKyBmb3JtYXRfbG9naWMgKyBcIl1cIjtcbiAgcmV0dXJuIENyZWF0b3JbXCJldmFsXCJdKGZvcm1hdF9sb2dpYyk7XG59O1xuXG5DcmVhdG9yLmdldFJlbGF0ZWRPYmplY3RzID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkge1xuICB2YXIgX29iamVjdCwgcGVybWlzc2lvbnMsIHJlbGF0ZWRfb2JqZWN0X25hbWVzLCByZWxhdGVkX29iamVjdHMsIHVucmVsYXRlZF9vYmplY3RzO1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICAgIH1cbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIik7XG4gICAgfVxuICAgIGlmICghdXNlcklkKSB7XG4gICAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgfVxuICB9XG4gIHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gW107XG4gIF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGlmICghX29iamVjdCkge1xuICAgIHJldHVybiByZWxhdGVkX29iamVjdF9uYW1lcztcbiAgfVxuICByZWxhdGVkX29iamVjdHMgPSBDcmVhdG9yLmdldE9iamVjdFJlbGF0ZWRzKF9vYmplY3QuX2NvbGxlY3Rpb25fbmFtZSk7XG4gIHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gXy5wbHVjayhyZWxhdGVkX29iamVjdHMsIFwib2JqZWN0X25hbWVcIik7XG4gIGlmICgocmVsYXRlZF9vYmplY3RfbmFtZXMgIT0gbnVsbCA/IHJlbGF0ZWRfb2JqZWN0X25hbWVzLmxlbmd0aCA6IHZvaWQgMCkgPT09IDApIHtcbiAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RfbmFtZXM7XG4gIH1cbiAgcGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpO1xuICB1bnJlbGF0ZWRfb2JqZWN0cyA9IHBlcm1pc3Npb25zLnVucmVsYXRlZF9vYmplY3RzO1xuICByZWxhdGVkX29iamVjdF9uYW1lcyA9IF8uZGlmZmVyZW5jZShyZWxhdGVkX29iamVjdF9uYW1lcywgdW5yZWxhdGVkX29iamVjdHMpO1xuICByZXR1cm4gXy5maWx0ZXIocmVsYXRlZF9vYmplY3RzLCBmdW5jdGlvbihyZWxhdGVkX29iamVjdCkge1xuICAgIHZhciBhbGxvd1JlYWQsIGlzQWN0aXZlLCByZWYsIHJlbGF0ZWRfb2JqZWN0X25hbWU7XG4gICAgcmVsYXRlZF9vYmplY3RfbmFtZSA9IHJlbGF0ZWRfb2JqZWN0Lm9iamVjdF9uYW1lO1xuICAgIGlzQWN0aXZlID0gcmVsYXRlZF9vYmplY3RfbmFtZXMuaW5kZXhPZihyZWxhdGVkX29iamVjdF9uYW1lKSA+IC0xO1xuICAgIGFsbG93UmVhZCA9IChyZWYgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkpICE9IG51bGwgPyByZWYuYWxsb3dSZWFkIDogdm9pZCAwO1xuICAgIGlmIChyZWxhdGVkX29iamVjdF9uYW1lID09PSBcImNtc19maWxlc1wiKSB7XG4gICAgICBhbGxvd1JlYWQgPSBhbGxvd1JlYWQgJiYgcGVybWlzc2lvbnMuYWxsb3dSZWFkRmlsZXM7XG4gICAgfVxuICAgIHJldHVybiBpc0FjdGl2ZSAmJiBhbGxvd1JlYWQ7XG4gIH0pO1xufTtcblxuQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0TmFtZXMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSB7XG4gIHZhciByZWxhdGVkX29iamVjdHM7XG4gIHJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdHMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gIHJldHVybiBfLnBsdWNrKHJlbGF0ZWRfb2JqZWN0cywgXCJvYmplY3RfbmFtZVwiKTtcbn07XG5cbkNyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdExpc3RBY3Rpb25zID0gZnVuY3Rpb24ocmVsYXRlZE9iamVjdE5hbWUsIHNwYWNlSWQsIHVzZXJJZCkge1xuICB2YXIgYWN0aW9ucztcbiAgYWN0aW9ucyA9IENyZWF0b3IuZ2V0QWN0aW9ucyhyZWxhdGVkT2JqZWN0TmFtZSwgc3BhY2VJZCwgdXNlcklkKTtcbiAgYWN0aW9ucyA9IF8uZmlsdGVyKGFjdGlvbnMsIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgIGlmIChhY3Rpb24ubmFtZSA9PT0gXCJzdGFuZGFyZF9mb2xsb3dcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uLm5hbWUgPT09IFwic3RhbmRhcmRfcXVlcnlcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uLm9uID09PSBcImxpc3RcIikge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24udmlzaWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24udmlzaWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi52aXNpYmxlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGFjdGlvbnM7XG59O1xuXG5DcmVhdG9yLmdldEFjdGlvbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSB7XG4gIHZhciBhY3Rpb25zLCBkaXNhYmxlZF9hY3Rpb25zLCBvYmosIHBlcm1pc3Npb25zLCByZWYsIHJlZjE7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgc3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHVzZXJJZCA9IE1ldGVvci51c2VySWQoKTtcbiAgICB9XG4gIH1cbiAgb2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBpZiAoIW9iaikge1xuICAgIHJldHVybjtcbiAgfVxuICBwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gIGRpc2FibGVkX2FjdGlvbnMgPSBwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zO1xuICBhY3Rpb25zID0gXy5zb3J0QnkoXy52YWx1ZXMob2JqLmFjdGlvbnMpLCAnc29ydCcpO1xuICBpZiAoXy5oYXMob2JqLCAnYWxsb3dfY3VzdG9tQWN0aW9ucycpKSB7XG4gICAgYWN0aW9ucyA9IF8uZmlsdGVyKGFjdGlvbnMsIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgcmV0dXJuIF8uaW5jbHVkZShvYmouYWxsb3dfY3VzdG9tQWN0aW9ucywgYWN0aW9uLm5hbWUpIHx8IF8uaW5jbHVkZShfLmtleXMoQ3JlYXRvci5nZXRPYmplY3QoJ2Jhc2UnKS5hY3Rpb25zKSB8fCB7fSwgYWN0aW9uLm5hbWUpO1xuICAgIH0pO1xuICB9XG4gIGlmIChfLmhhcyhvYmosICdleGNsdWRlX2FjdGlvbnMnKSkge1xuICAgIGFjdGlvbnMgPSBfLmZpbHRlcihhY3Rpb25zLCBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgIHJldHVybiAhXy5pbmNsdWRlKG9iai5leGNsdWRlX2FjdGlvbnMsIGFjdGlvbi5uYW1lKTtcbiAgICB9KTtcbiAgfVxuICBfLmVhY2goYWN0aW9ucywgZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSAmJiBbXCJyZWNvcmRcIiwgXCJyZWNvcmRfb25seVwiXS5pbmRleE9mKGFjdGlvbi5vbikgPiAtMSAmJiBhY3Rpb24ubmFtZSAhPT0gJ3N0YW5kYXJkX2VkaXQnKSB7XG4gICAgICBpZiAoYWN0aW9uLm9uID09PSBcInJlY29yZF9vbmx5XCIpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5vbiA9ICdyZWNvcmRfb25seV9tb3JlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ub24gPSAncmVjb3JkX21vcmUnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkgJiYgW1wiY21zX2ZpbGVzXCIsIFwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIl0uaW5kZXhPZihvYmplY3RfbmFtZSkgPiAtMSkge1xuICAgIGlmICgocmVmID0gYWN0aW9ucy5maW5kKGZ1bmN0aW9uKG4pIHtcbiAgICAgIHJldHVybiBuLm5hbWUgPT09IFwic3RhbmRhcmRfZWRpdFwiO1xuICAgIH0pKSAhPSBudWxsKSB7XG4gICAgICByZWYub24gPSBcInJlY29yZF9tb3JlXCI7XG4gICAgfVxuICAgIGlmICgocmVmMSA9IGFjdGlvbnMuZmluZChmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gbi5uYW1lID09PSBcImRvd25sb2FkXCI7XG4gICAgfSkpICE9IG51bGwpIHtcbiAgICAgIHJlZjEub24gPSBcInJlY29yZFwiO1xuICAgIH1cbiAgfVxuICBhY3Rpb25zID0gXy5maWx0ZXIoYWN0aW9ucywgZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgcmV0dXJuIF8uaW5kZXhPZihkaXNhYmxlZF9hY3Rpb25zLCBhY3Rpb24ubmFtZSkgPCAwO1xuICB9KTtcbiAgcmV0dXJuIGFjdGlvbnM7XG59O1xuXG4v6L+U5Zue5b2T5YmN55So5oi35pyJ5p2D6ZmQ6K6/6Zeu55qE5omA5pyJbGlzdF92aWV377yM5YyF5ous5YiG5Lqr55qE77yM55So5oi36Ieq5a6a5LmJ6Z2e5YiG5Lqr55qE77yI6Zmk6Z2eb3duZXLlj5jkuobvvInvvIzku6Xlj4rpu5jorqTnmoTlhbbku5bop4blm77ms6jmhI9DcmVhdG9yLmdldFBlcm1pc3Npb25z5Ye95pWw5Lit5piv5LiN5Lya5pyJ55So5oi36Ieq5a6a5LmJ6Z2e5YiG5Lqr55qE6KeG5Zu+55qE77yM5omA5LulQ3JlYXRvci5nZXRQZXJtaXNzaW9uc+WHveaVsOS4reaLv+WIsOeahOe7k+aenOS4jeWFqO+8jOW5tuS4jeaYr+W9k+WJjeeUqOaIt+iDveeci+WIsOaJgOacieinhuWbvi87XG5cbkNyZWF0b3IuZ2V0TGlzdFZpZXdzID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkge1xuICB2YXIgZGlzYWJsZWRfbGlzdF92aWV3cywgaXNNb2JpbGUsIGxpc3RWaWV3cywgbGlzdF92aWV3cywgb2JqZWN0LCByZWY7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgc3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHVzZXJJZCA9IE1ldGVvci51c2VySWQoKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpc2FibGVkX2xpc3Rfdmlld3MgPSAoKHJlZiA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkpICE9IG51bGwgPyByZWYuZGlzYWJsZWRfbGlzdF92aWV3cyA6IHZvaWQgMCkgfHwgW107XG4gIGxpc3Rfdmlld3MgPSBbXTtcbiAgaXNNb2JpbGUgPSBTdGVlZG9zLmlzTW9iaWxlKCk7XG4gIF8uZWFjaChvYmplY3QubGlzdF92aWV3cywgZnVuY3Rpb24oaXRlbSwgaXRlbV9uYW1lKSB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZSA9IGl0ZW1fbmFtZTtcbiAgfSk7XG4gIGxpc3RWaWV3cyA9IF8uc29ydEJ5KF8udmFsdWVzKG9iamVjdC5saXN0X3ZpZXdzKSwgJ3NvcnRfbm8nKTtcbiAgXy5lYWNoKGxpc3RWaWV3cywgZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBpc0Rpc2FibGVkO1xuICAgIGlmIChpc01vYmlsZSAmJiBpdGVtLnR5cGUgPT09IFwiY2FsZW5kYXJcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXRlbS5uYW1lICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgaXNEaXNhYmxlZCA9IF8uaW5kZXhPZihkaXNhYmxlZF9saXN0X3ZpZXdzLCBpdGVtLm5hbWUpID4gLTEgfHwgKGl0ZW0uX2lkICYmIF8uaW5kZXhPZihkaXNhYmxlZF9saXN0X3ZpZXdzLCBpdGVtLl9pZCkgPiAtMSk7XG4gICAgICBpZiAoIWlzRGlzYWJsZWQgfHwgaXRlbS5vd25lciA9PT0gdXNlcklkKSB7XG4gICAgICAgIHJldHVybiBsaXN0X3ZpZXdzLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpc3Rfdmlld3M7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkcyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpIHtcbiAgdmFyIGZpZWxkc05hbWUsIHJlZiwgdW5yZWFkYWJsZV9maWVsZHM7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgc3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHVzZXJJZCA9IE1ldGVvci51c2VySWQoKTtcbiAgICB9XG4gIH1cbiAgZmllbGRzTmFtZSA9IENyZWF0b3IuZ2V0T2JqZWN0RmllbGRzTmFtZShvYmplY3RfbmFtZSk7XG4gIHVucmVhZGFibGVfZmllbGRzID0gKHJlZiA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkpICE9IG51bGwgPyByZWYudW5yZWFkYWJsZV9maWVsZHMgOiB2b2lkIDA7XG4gIHJldHVybiBfLmRpZmZlcmVuY2UoZmllbGRzTmFtZSwgdW5yZWFkYWJsZV9maWVsZHMpO1xufTtcblxuQ3JlYXRvci5pc2xvYWRpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICFDcmVhdG9yLmJvb3RzdHJhcExvYWRlZC5nZXQoKTtcbn07XG5cbkNyZWF0b3IuY29udmVydFNwZWNpYWxDaGFyYWN0ZXIgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW1xcXlxcJFxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXHxcXFtcXF1cXHtcXH1dKS9nLCBcIlxcXFwkMVwiKTtcbn07XG5cbkNyZWF0b3IuZ2V0RGlzYWJsZWRGaWVsZHMgPSBmdW5jdGlvbihzY2hlbWEpIHtcbiAgdmFyIGZpZWxkcztcbiAgZmllbGRzID0gXy5tYXAoc2NoZW1hLCBmdW5jdGlvbihmaWVsZCwgZmllbGROYW1lKSB7XG4gICAgcmV0dXJuIGZpZWxkLmF1dG9mb3JtICYmIGZpZWxkLmF1dG9mb3JtLmRpc2FibGVkICYmICFmaWVsZC5hdXRvZm9ybS5vbWl0ICYmIGZpZWxkTmFtZTtcbiAgfSk7XG4gIGZpZWxkcyA9IF8uY29tcGFjdChmaWVsZHMpO1xuICByZXR1cm4gZmllbGRzO1xufTtcblxuQ3JlYXRvci5nZXRIaWRkZW5GaWVsZHMgPSBmdW5jdGlvbihzY2hlbWEpIHtcbiAgdmFyIGZpZWxkcztcbiAgZmllbGRzID0gXy5tYXAoc2NoZW1hLCBmdW5jdGlvbihmaWVsZCwgZmllbGROYW1lKSB7XG4gICAgcmV0dXJuIGZpZWxkLmF1dG9mb3JtICYmIGZpZWxkLmF1dG9mb3JtLnR5cGUgPT09IFwiaGlkZGVuXCIgJiYgIWZpZWxkLmF1dG9mb3JtLm9taXQgJiYgZmllbGROYW1lO1xuICB9KTtcbiAgZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcyk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkc1dpdGhOb0dyb3VwID0gZnVuY3Rpb24oc2NoZW1hKSB7XG4gIHZhciBmaWVsZHM7XG4gIGZpZWxkcyA9IF8ubWFwKHNjaGVtYSwgZnVuY3Rpb24oZmllbGQsIGZpZWxkTmFtZSkge1xuICAgIHJldHVybiAoIWZpZWxkLmF1dG9mb3JtIHx8ICFmaWVsZC5hdXRvZm9ybS5ncm91cCB8fCBmaWVsZC5hdXRvZm9ybS5ncm91cCA9PT0gXCItXCIpICYmICghZmllbGQuYXV0b2Zvcm0gfHwgZmllbGQuYXV0b2Zvcm0udHlwZSAhPT0gXCJoaWRkZW5cIikgJiYgZmllbGROYW1lO1xuICB9KTtcbiAgZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcyk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5DcmVhdG9yLmdldFNvcnRlZEZpZWxkR3JvdXBOYW1lcyA9IGZ1bmN0aW9uKHNjaGVtYSkge1xuICB2YXIgbmFtZXM7XG4gIG5hbWVzID0gXy5tYXAoc2NoZW1hLCBmdW5jdGlvbihmaWVsZCkge1xuICAgIHJldHVybiBmaWVsZC5hdXRvZm9ybSAmJiBmaWVsZC5hdXRvZm9ybS5ncm91cCAhPT0gXCItXCIgJiYgZmllbGQuYXV0b2Zvcm0uZ3JvdXA7XG4gIH0pO1xuICBuYW1lcyA9IF8uY29tcGFjdChuYW1lcyk7XG4gIG5hbWVzID0gXy51bmlxdWUobmFtZXMpO1xuICByZXR1cm4gbmFtZXM7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkc0Zvckdyb3VwID0gZnVuY3Rpb24oc2NoZW1hLCBncm91cE5hbWUpIHtcbiAgdmFyIGZpZWxkcztcbiAgZmllbGRzID0gXy5tYXAoc2NoZW1hLCBmdW5jdGlvbihmaWVsZCwgZmllbGROYW1lKSB7XG4gICAgcmV0dXJuIGZpZWxkLmF1dG9mb3JtICYmIGZpZWxkLmF1dG9mb3JtLmdyb3VwID09PSBncm91cE5hbWUgJiYgZmllbGQuYXV0b2Zvcm0udHlwZSAhPT0gXCJoaWRkZW5cIiAmJiBmaWVsZE5hbWU7XG4gIH0pO1xuICBmaWVsZHMgPSBfLmNvbXBhY3QoZmllbGRzKTtcbiAgcmV0dXJuIGZpZWxkcztcbn07XG5cbkNyZWF0b3IuZ2V0U3lzdGVtQmFzZUZpZWxkcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gW1wiY3JlYXRlZFwiLCBcImNyZWF0ZWRfYnlcIiwgXCJtb2RpZmllZFwiLCBcIm1vZGlmaWVkX2J5XCJdO1xufTtcblxuQ3JlYXRvci5nZXRGaWVsZHNXaXRob3V0U3lzdGVtQmFzZSA9IGZ1bmN0aW9uKGtleXMpIHtcbiAgcmV0dXJuIF8uZGlmZmVyZW5jZShrZXlzLCBDcmVhdG9yLmdldFN5c3RlbUJhc2VGaWVsZHMoKSk7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkc1dpdGhvdXRPbWl0ID0gZnVuY3Rpb24oc2NoZW1hLCBrZXlzKSB7XG4gIGtleXMgPSBfLm1hcChrZXlzLCBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgZmllbGQsIHJlZjtcbiAgICBmaWVsZCA9IF8ucGljayhzY2hlbWEsIGtleSk7XG4gICAgaWYgKChyZWYgPSBmaWVsZFtrZXldLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmLm9taXQgOiB2b2lkIDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0pO1xuICBrZXlzID0gXy5jb21wYWN0KGtleXMpO1xuICByZXR1cm4ga2V5cztcbn07XG5cbkNyZWF0b3IuZ2V0RmllbGRzSW5GaXJzdExldmVsID0gZnVuY3Rpb24oZmlyc3RMZXZlbEtleXMsIGtleXMpIHtcbiAga2V5cyA9IF8ubWFwKGtleXMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChfLmluZGV4T2YoZmlyc3RMZXZlbEtleXMsIGtleSkgPiAtMSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIGtleXMgPSBfLmNvbXBhY3Qoa2V5cyk7XG4gIHJldHVybiBrZXlzO1xufTtcblxuQ3JlYXRvci5nZXRGaWVsZHNGb3JSZW9yZGVyID0gZnVuY3Rpb24oc2NoZW1hLCBrZXlzLCBpc1NpbmdsZSkge1xuICB2YXIgX2tleXMsIGNoaWxkS2V5cywgZmllbGRzLCBpLCBpc193aWRlXzEsIGlzX3dpZGVfMiwgc2NfMSwgc2NfMjtcbiAgZmllbGRzID0gW107XG4gIGkgPSAwO1xuICBfa2V5cyA9IF8uZmlsdGVyKGtleXMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiAha2V5LmVuZHNXaXRoKCdfZW5kTGluZScpO1xuICB9KTtcbiAgd2hpbGUgKGkgPCBfa2V5cy5sZW5ndGgpIHtcbiAgICBzY18xID0gXy5waWNrKHNjaGVtYSwgX2tleXNbaV0pO1xuICAgIHNjXzIgPSBfLnBpY2soc2NoZW1hLCBfa2V5c1tpICsgMV0pO1xuICAgIGlzX3dpZGVfMSA9IGZhbHNlO1xuICAgIGlzX3dpZGVfMiA9IGZhbHNlO1xuICAgIF8uZWFjaChzY18xLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIHJlZiwgcmVmMTtcbiAgICAgIGlmICgoKHJlZiA9IHZhbHVlLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmLmlzX3dpZGUgOiB2b2lkIDApIHx8ICgocmVmMSA9IHZhbHVlLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmMS50eXBlIDogdm9pZCAwKSA9PT0gXCJ0YWJsZVwiKSB7XG4gICAgICAgIHJldHVybiBpc193aWRlXzEgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF8uZWFjaChzY18yLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIHJlZiwgcmVmMTtcbiAgICAgIGlmICgoKHJlZiA9IHZhbHVlLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmLmlzX3dpZGUgOiB2b2lkIDApIHx8ICgocmVmMSA9IHZhbHVlLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmMS50eXBlIDogdm9pZCAwKSA9PT0gXCJ0YWJsZVwiKSB7XG4gICAgICAgIHJldHVybiBpc193aWRlXzIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgIGlzX3dpZGVfMSA9IHRydWU7XG4gICAgICBpc193aWRlXzIgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNTaW5nbGUpIHtcbiAgICAgIGZpZWxkcy5wdXNoKF9rZXlzLnNsaWNlKGksIGkgKyAxKSk7XG4gICAgICBpICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc193aWRlXzEpIHtcbiAgICAgICAgZmllbGRzLnB1c2goX2tleXMuc2xpY2UoaSwgaSArIDEpKTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfSBlbHNlIGlmICghaXNfd2lkZV8xICYmIGlzX3dpZGVfMikge1xuICAgICAgICBjaGlsZEtleXMgPSBfa2V5cy5zbGljZShpLCBpICsgMSk7XG4gICAgICAgIGNoaWxkS2V5cy5wdXNoKHZvaWQgMCk7XG4gICAgICAgIGZpZWxkcy5wdXNoKGNoaWxkS2V5cyk7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzX3dpZGVfMSAmJiAhaXNfd2lkZV8yKSB7XG4gICAgICAgIGNoaWxkS2V5cyA9IF9rZXlzLnNsaWNlKGksIGkgKyAxKTtcbiAgICAgICAgaWYgKF9rZXlzW2kgKyAxXSkge1xuICAgICAgICAgIGNoaWxkS2V5cy5wdXNoKF9rZXlzW2kgKyAxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRLZXlzLnB1c2godm9pZCAwKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHMucHVzaChjaGlsZEtleXMpO1xuICAgICAgICBpICs9IDI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5DcmVhdG9yLmlzRmlsdGVyVmFsdWVFbXB0eSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcInVuZGVmaW5lZFwiIHx8IHYgPT09IG51bGwgfHwgTnVtYmVyLmlzTmFOKHYpIHx8IHYubGVuZ3RoID09PSAwO1xufTtcblxuQ3JlYXRvci5nZXRGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24ob2JqZWN0RmllbGRzLCBrZXkpIHtcbiAgdmFyIHJlZiwgcmVzdWx0O1xuICBpZiAob2JqZWN0RmllbGRzICYmIGtleSkge1xuICAgIHJlc3VsdCA9IChyZWYgPSBvYmplY3RGaWVsZHNba2V5XSkgIT0gbnVsbCA/IHJlZi50eXBlIDogdm9pZCAwO1xuICAgIGlmIChbXCJmb3JtdWxhXCIsIFwic3VtbWFyeVwiXS5pbmRleE9mKHJlc3VsdCkgPiAtMSkge1xuICAgICAgcmVzdWx0ID0gb2JqZWN0RmllbGRzW2tleV0uZGF0YV90eXBlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBDcmVhdG9yLmdldEFsbFJlbGF0ZWRPYmplY3RzID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgICB2YXIgcmVsYXRlZF9vYmplY3RfbmFtZXM7XG4gICAgcmVsYXRlZF9vYmplY3RfbmFtZXMgPSBbXTtcbiAgICBfLmVhY2goQ3JlYXRvci5PYmplY3RzLCBmdW5jdGlvbihyZWxhdGVkX29iamVjdCwgcmVsYXRlZF9vYmplY3RfbmFtZSkge1xuICAgICAgcmV0dXJuIF8uZWFjaChyZWxhdGVkX29iamVjdC5maWVsZHMsIGZ1bmN0aW9uKHJlbGF0ZWRfZmllbGQsIHJlbGF0ZWRfZmllbGRfbmFtZSkge1xuICAgICAgICBpZiAocmVsYXRlZF9maWVsZC50eXBlID09PSBcIm1hc3Rlcl9kZXRhaWxcIiAmJiByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byAmJiByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byA9PT0gb2JqZWN0X25hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RfbmFtZXMucHVzaChyZWxhdGVkX29iamVjdF9uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKS5lbmFibGVfZmlsZXMpIHtcbiAgICAgIHJlbGF0ZWRfb2JqZWN0X25hbWVzLnB1c2goXCJjbXNfZmlsZXNcIik7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGVkX29iamVjdF9uYW1lcztcbiAgfTtcbn1cblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBTdGVlZG9zLmZvcm1hdEluZGV4ID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgaW5kZXhOYW1lLCBpc2RvY3VtZW50REIsIG9iamVjdCwgcmVmLCByZWYxLCByZWYyO1xuICAgIG9iamVjdCA9IHtcbiAgICAgIGJhY2tncm91bmQ6IHRydWVcbiAgICB9O1xuICAgIGlzZG9jdW1lbnREQiA9ICgocmVmID0gTWV0ZW9yLnNldHRpbmdzKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGF0YXNvdXJjZXMpICE9IG51bGwgPyAocmVmMiA9IHJlZjFbXCJkZWZhdWx0XCJdKSAhPSBudWxsID8gcmVmMi5kb2N1bWVudERCIDogdm9pZCAwIDogdm9pZCAwIDogdm9pZCAwKSB8fCBmYWxzZTtcbiAgICBpZiAoaXNkb2N1bWVudERCKSB7XG4gICAgICBpZiAoYXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICBpbmRleE5hbWUgPSBhcnJheS5qb2luKFwiLlwiKTtcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBpbmRleE5hbWU7XG4gICAgICAgIGlmIChpbmRleE5hbWUubGVuZ3RoID4gNTIpIHtcbiAgICAgICAgICBvYmplY3QubmFtZSA9IGluZGV4TmFtZS5zdWJzdHJpbmcoMCwgNTIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG59XG4iLCJDcmVhdG9yLmFwcHNCeU5hbWUgPSB7fVxuXG4iLCJNZXRlb3IubWV0aG9kc1xuXHRcIm9iamVjdF9yZWNlbnRfdmlld2VkXCI6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzcGFjZV9pZCktPlxuXHRcdGlmICF0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIG51bGxcblxuXHRcdGlmIG9iamVjdF9uYW1lID09IFwib2JqZWN0X3JlY2VudF92aWV3ZWRcIlxuXHRcdFx0cmV0dXJuXG5cdFx0aWYgb2JqZWN0X25hbWUgYW5kIHJlY29yZF9pZFxuXHRcdFx0aWYgIXNwYWNlX2lkXG5cdFx0XHRcdGRvYyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSkuZmluZE9uZSh7X2lkOiByZWNvcmRfaWR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSlcblx0XHRcdFx0c3BhY2VfaWQgPSBkb2M/LnNwYWNlXG5cblx0XHRcdGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9iamVjdF9yZWNlbnRfdmlld2VkXCIpXG5cdFx0XHRmaWx0ZXJzID0geyBvd25lcjogdGhpcy51c2VySWQsIHNwYWNlOiBzcGFjZV9pZCwgJ3JlY29yZC5vJzogb2JqZWN0X25hbWUsICdyZWNvcmQuaWRzJzogW3JlY29yZF9pZF19XG5cdFx0XHRjdXJyZW50X3JlY2VudF92aWV3ZWQgPSBjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQuZmluZE9uZShmaWx0ZXJzKVxuXHRcdFx0aWYgY3VycmVudF9yZWNlbnRfdmlld2VkXG5cdFx0XHRcdGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZC51cGRhdGUoXG5cdFx0XHRcdFx0Y3VycmVudF9yZWNlbnRfdmlld2VkLl9pZCxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHQkaW5jOiB7XG5cdFx0XHRcdFx0XHRcdGNvdW50OiAxXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0JHNldDoge1xuXHRcdFx0XHRcdFx0XHRtb2RpZmllZDogbmV3IERhdGUoKVxuXHRcdFx0XHRcdFx0XHRtb2RpZmllZF9ieTogdGhpcy51c2VySWRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLmluc2VydChcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRfaWQ6IGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZC5fbWFrZU5ld0lEKClcblx0XHRcdFx0XHRcdG93bmVyOiB0aGlzLnVzZXJJZFxuXHRcdFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkXG5cdFx0XHRcdFx0XHRyZWNvcmQ6IHtvOiBvYmplY3RfbmFtZSwgaWRzOiBbcmVjb3JkX2lkXX1cblx0XHRcdFx0XHRcdGNvdW50OiAxXG5cdFx0XHRcdFx0XHRjcmVhdGVkOiBuZXcgRGF0ZSgpXG5cdFx0XHRcdFx0XHRjcmVhdGVkX2J5OiB0aGlzLnVzZXJJZFxuXHRcdFx0XHRcdFx0bW9kaWZpZWQ6IG5ldyBEYXRlKClcblx0XHRcdFx0XHRcdG1vZGlmaWVkX2J5OiB0aGlzLnVzZXJJZFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dmFsaWRhdGU6IGZhbHNlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHRyZXR1cm4iLCJNZXRlb3IubWV0aG9kcyh7XG4gIFwib2JqZWN0X3JlY2VudF92aWV3ZWRcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgc3BhY2VfaWQpIHtcbiAgICB2YXIgY29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLCBjdXJyZW50X3JlY2VudF92aWV3ZWQsIGRvYywgZmlsdGVycztcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKG9iamVjdF9uYW1lID09PSBcIm9iamVjdF9yZWNlbnRfdmlld2VkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9iamVjdF9uYW1lICYmIHJlY29yZF9pZCkge1xuICAgICAgaWYgKCFzcGFjZV9pZCkge1xuICAgICAgICBkb2MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0X25hbWUpLmZpbmRPbmUoe1xuICAgICAgICAgIF9pZDogcmVjb3JkX2lkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHNwYWNlOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3BhY2VfaWQgPSBkb2MgIT0gbnVsbCA/IGRvYy5zcGFjZSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9iamVjdF9yZWNlbnRfdmlld2VkXCIpO1xuICAgICAgZmlsdGVycyA9IHtcbiAgICAgICAgb3duZXI6IHRoaXMudXNlcklkLFxuICAgICAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgICAgICdyZWNvcmQubyc6IG9iamVjdF9uYW1lLFxuICAgICAgICAncmVjb3JkLmlkcyc6IFtyZWNvcmRfaWRdXG4gICAgICB9O1xuICAgICAgY3VycmVudF9yZWNlbnRfdmlld2VkID0gY29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLmZpbmRPbmUoZmlsdGVycyk7XG4gICAgICBpZiAoY3VycmVudF9yZWNlbnRfdmlld2VkKSB7XG4gICAgICAgIGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZC51cGRhdGUoY3VycmVudF9yZWNlbnRfdmlld2VkLl9pZCwge1xuICAgICAgICAgICRpbmM6IHtcbiAgICAgICAgICAgIGNvdW50OiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICBtb2RpZmllZDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIG1vZGlmaWVkX2J5OiB0aGlzLnVzZXJJZFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQuaW5zZXJ0KHtcbiAgICAgICAgICBfaWQ6IGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZC5fbWFrZU5ld0lEKCksXG4gICAgICAgICAgb3duZXI6IHRoaXMudXNlcklkLFxuICAgICAgICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICAgICAgICByZWNvcmQ6IHtcbiAgICAgICAgICAgIG86IG9iamVjdF9uYW1lLFxuICAgICAgICAgICAgaWRzOiBbcmVjb3JkX2lkXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcbiAgICAgICAgICBjcmVhdGVkX2J5OiB0aGlzLnVzZXJJZCxcbiAgICAgICAgICBtb2RpZmllZDogbmV3IERhdGUoKSxcbiAgICAgICAgICBtb2RpZmllZF9ieTogdGhpcy51c2VySWRcbiAgICAgICAgfSwge1xuICAgICAgICAgIHZhbGlkYXRlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuIiwicmVjZW50X2FnZ3JlZ2F0ZSA9IChjcmVhdGVkX2J5LCBzcGFjZUlkLCBfcmVjb3JkcywgY2FsbGJhY2spLT5cblx0Q3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3RfcmVjZW50X3ZpZXdlZC5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKFtcblx0XHR7JG1hdGNoOiB7Y3JlYXRlZF9ieTogY3JlYXRlZF9ieSwgc3BhY2U6IHNwYWNlSWR9fSxcblx0XHR7JGdyb3VwOiB7X2lkOiB7b2JqZWN0X25hbWU6IFwiJHJlY29yZC5vXCIsIHJlY29yZF9pZDogXCIkcmVjb3JkLmlkc1wiLCBzcGFjZTogXCIkc3BhY2VcIn0sIG1heENyZWF0ZWQ6IHskbWF4OiBcIiRjcmVhdGVkXCJ9fX0sXG5cdFx0eyRzb3J0OiB7bWF4Q3JlYXRlZDogLTF9fSxcblx0XHR7JGxpbWl0OiAxMH1cblx0XSkudG9BcnJheSAoZXJyLCBkYXRhKS0+XG5cdFx0aWYgZXJyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyKVxuXG5cdFx0ZGF0YS5mb3JFYWNoIChkb2MpIC0+XG5cdFx0XHRfcmVjb3Jkcy5wdXNoIGRvYy5faWRcblxuXHRcdGlmIGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaylcblx0XHRcdGNhbGxiYWNrKClcblxuXHRcdHJldHVyblxuXG5hc3luY19yZWNlbnRfYWdncmVnYXRlID0gTWV0ZW9yLndyYXBBc3luYyhyZWNlbnRfYWdncmVnYXRlKVxuXG5zZWFyY2hfb2JqZWN0ID0gKHNwYWNlLCBvYmplY3RfbmFtZSx1c2VySWQsIHNlYXJjaFRleHQpLT5cblx0ZGF0YSA9IG5ldyBBcnJheSgpXG5cblx0aWYgc2VhcmNoVGV4dFxuXG5cdFx0X29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXG5cdFx0X29iamVjdF9jb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKVxuXHRcdF9vYmplY3RfbmFtZV9rZXkgPSBfb2JqZWN0Py5OQU1FX0ZJRUxEX0tFWVxuXHRcdGlmIF9vYmplY3QgJiYgX29iamVjdF9jb2xsZWN0aW9uICYmIF9vYmplY3RfbmFtZV9rZXlcblx0XHRcdHF1ZXJ5ID0ge31cblx0XHRcdHNlYXJjaF9LZXl3b3JkcyA9IHNlYXJjaFRleHQuc3BsaXQoXCIgXCIpXG5cdFx0XHRxdWVyeV9hbmQgPSBbXVxuXHRcdFx0c2VhcmNoX0tleXdvcmRzLmZvckVhY2ggKGtleXdvcmQpLT5cblx0XHRcdFx0c3VicXVlcnkgPSB7fVxuXHRcdFx0XHRzdWJxdWVyeVtfb2JqZWN0X25hbWVfa2V5XSA9IHskcmVnZXg6IGtleXdvcmQudHJpbSgpfVxuXHRcdFx0XHRxdWVyeV9hbmQucHVzaCBzdWJxdWVyeVxuXG5cdFx0XHRxdWVyeS4kYW5kID0gcXVlcnlfYW5kXG5cdFx0XHRxdWVyeS5zcGFjZSA9IHskaW46IFtzcGFjZV19XG5cblx0XHRcdGZpZWxkcyA9IHtfaWQ6IDF9XG5cdFx0XHRmaWVsZHNbX29iamVjdF9uYW1lX2tleV0gPSAxXG5cblx0XHRcdHJlY29yZHMgPSBfb2JqZWN0X2NvbGxlY3Rpb24uZmluZChxdWVyeSwge2ZpZWxkczogZmllbGRzLCBzb3J0OiB7bW9kaWZpZWQ6IDF9LCBsaW1pdDogNX0pXG5cblx0XHRcdHJlY29yZHMuZm9yRWFjaCAocmVjb3JkKS0+XG5cdFx0XHRcdGRhdGEucHVzaCB7X2lkOiByZWNvcmQuX2lkLCBfbmFtZTogcmVjb3JkW19vYmplY3RfbmFtZV9rZXldLCBfb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lfVxuXHRcblx0cmV0dXJuIGRhdGFcblxuTWV0ZW9yLm1ldGhvZHNcblx0J29iamVjdF9yZWNlbnRfcmVjb3JkJzogKHNwYWNlSWQpLT5cblx0XHRkYXRhID0gbmV3IEFycmF5KClcblx0XHRyZWNvcmRzID0gbmV3IEFycmF5KClcblx0XHRhc3luY19yZWNlbnRfYWdncmVnYXRlKHRoaXMudXNlcklkLCBzcGFjZUlkLCByZWNvcmRzKVxuXHRcdHJlY29yZHMuZm9yRWFjaCAoaXRlbSktPlxuXHRcdFx0cmVjb3JkX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KGl0ZW0ub2JqZWN0X25hbWUsIGl0ZW0uc3BhY2UpXG5cblx0XHRcdGlmICFyZWNvcmRfb2JqZWN0XG5cdFx0XHRcdHJldHVyblxuXG5cdFx0XHRyZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oaXRlbS5vYmplY3RfbmFtZSwgaXRlbS5zcGFjZSlcblxuXHRcdFx0aWYgcmVjb3JkX29iamVjdCAmJiByZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb25cblx0XHRcdFx0ZmllbGRzID0ge19pZDogMX1cblxuXHRcdFx0XHRmaWVsZHNbcmVjb3JkX29iamVjdC5OQU1FX0ZJRUxEX0tFWV0gPSAxXG5cblx0XHRcdFx0cmVjb3JkID0gcmVjb3JkX29iamVjdF9jb2xsZWN0aW9uLmZpbmRPbmUoaXRlbS5yZWNvcmRfaWRbMF0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRcdGlmIHJlY29yZFxuXHRcdFx0XHRcdGRhdGEucHVzaCB7X2lkOiByZWNvcmQuX2lkLCBfbmFtZTogcmVjb3JkW3JlY29yZF9vYmplY3QuTkFNRV9GSUVMRF9LRVldLCBfb2JqZWN0X25hbWU6IGl0ZW0ub2JqZWN0X25hbWV9XG5cblx0XHRyZXR1cm4gZGF0YVxuXG5cdCdvYmplY3RfcmVjb3JkX3NlYXJjaCc6IChvcHRpb25zKS0+XG5cdFx0c2VsZiA9IHRoaXNcblxuXHRcdGRhdGEgPSBuZXcgQXJyYXkoKVxuXG5cdFx0c2VhcmNoVGV4dCA9IG9wdGlvbnMuc2VhcmNoVGV4dFxuXHRcdHNwYWNlID0gb3B0aW9ucy5zcGFjZVxuXG5cdFx0Xy5mb3JFYWNoIENyZWF0b3Iub2JqZWN0c0J5TmFtZSwgKF9vYmplY3QsIG5hbWUpLT5cblx0XHRcdGlmIF9vYmplY3QuZW5hYmxlX3NlYXJjaFxuXHRcdFx0XHRvYmplY3RfcmVjb3JkID0gc2VhcmNoX29iamVjdChzcGFjZSwgX29iamVjdC5uYW1lLCBzZWxmLnVzZXJJZCwgc2VhcmNoVGV4dClcblx0XHRcdFx0ZGF0YSA9IGRhdGEuY29uY2F0KG9iamVjdF9yZWNvcmQpXG5cblx0XHRyZXR1cm4gZGF0YVxuIiwidmFyIGFzeW5jX3JlY2VudF9hZ2dyZWdhdGUsIHJlY2VudF9hZ2dyZWdhdGUsIHNlYXJjaF9vYmplY3Q7XG5cbnJlY2VudF9hZ2dyZWdhdGUgPSBmdW5jdGlvbihjcmVhdGVkX2J5LCBzcGFjZUlkLCBfcmVjb3JkcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X3JlY2VudF92aWV3ZWQucmF3Q29sbGVjdGlvbigpLmFnZ3JlZ2F0ZShbXG4gICAge1xuICAgICAgJG1hdGNoOiB7XG4gICAgICAgIGNyZWF0ZWRfYnk6IGNyZWF0ZWRfYnksXG4gICAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgJGdyb3VwOiB7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgIG9iamVjdF9uYW1lOiBcIiRyZWNvcmQub1wiLFxuICAgICAgICAgIHJlY29yZF9pZDogXCIkcmVjb3JkLmlkc1wiLFxuICAgICAgICAgIHNwYWNlOiBcIiRzcGFjZVwiXG4gICAgICAgIH0sXG4gICAgICAgIG1heENyZWF0ZWQ6IHtcbiAgICAgICAgICAkbWF4OiBcIiRjcmVhdGVkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgICRzb3J0OiB7XG4gICAgICAgIG1heENyZWF0ZWQ6IC0xXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgJGxpbWl0OiAxMFxuICAgIH1cbiAgXSkudG9BcnJheShmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGRvYykge1xuICAgICAgcmV0dXJuIF9yZWNvcmRzLnB1c2goZG9jLl9pZCk7XG4gICAgfSk7XG4gICAgaWYgKGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmFzeW5jX3JlY2VudF9hZ2dyZWdhdGUgPSBNZXRlb3Iud3JhcEFzeW5jKHJlY2VudF9hZ2dyZWdhdGUpO1xuXG5zZWFyY2hfb2JqZWN0ID0gZnVuY3Rpb24oc3BhY2UsIG9iamVjdF9uYW1lLCB1c2VySWQsIHNlYXJjaFRleHQpIHtcbiAgdmFyIF9vYmplY3QsIF9vYmplY3RfY29sbGVjdGlvbiwgX29iamVjdF9uYW1lX2tleSwgZGF0YSwgZmllbGRzLCBxdWVyeSwgcXVlcnlfYW5kLCByZWNvcmRzLCBzZWFyY2hfS2V5d29yZHM7XG4gIGRhdGEgPSBuZXcgQXJyYXkoKTtcbiAgaWYgKHNlYXJjaFRleHQpIHtcbiAgICBfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICAgIF9vYmplY3RfY29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSk7XG4gICAgX29iamVjdF9uYW1lX2tleSA9IF9vYmplY3QgIT0gbnVsbCA/IF9vYmplY3QuTkFNRV9GSUVMRF9LRVkgOiB2b2lkIDA7XG4gICAgaWYgKF9vYmplY3QgJiYgX29iamVjdF9jb2xsZWN0aW9uICYmIF9vYmplY3RfbmFtZV9rZXkpIHtcbiAgICAgIHF1ZXJ5ID0ge307XG4gICAgICBzZWFyY2hfS2V5d29yZHMgPSBzZWFyY2hUZXh0LnNwbGl0KFwiIFwiKTtcbiAgICAgIHF1ZXJ5X2FuZCA9IFtdO1xuICAgICAgc2VhcmNoX0tleXdvcmRzLmZvckVhY2goZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgICB2YXIgc3VicXVlcnk7XG4gICAgICAgIHN1YnF1ZXJ5ID0ge307XG4gICAgICAgIHN1YnF1ZXJ5W19vYmplY3RfbmFtZV9rZXldID0ge1xuICAgICAgICAgICRyZWdleDoga2V5d29yZC50cmltKClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5X2FuZC5wdXNoKHN1YnF1ZXJ5KTtcbiAgICAgIH0pO1xuICAgICAgcXVlcnkuJGFuZCA9IHF1ZXJ5X2FuZDtcbiAgICAgIHF1ZXJ5LnNwYWNlID0ge1xuICAgICAgICAkaW46IFtzcGFjZV1cbiAgICAgIH07XG4gICAgICBmaWVsZHMgPSB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfTtcbiAgICAgIGZpZWxkc1tfb2JqZWN0X25hbWVfa2V5XSA9IDE7XG4gICAgICByZWNvcmRzID0gX29iamVjdF9jb2xsZWN0aW9uLmZpbmQocXVlcnksIHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMsXG4gICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICBtb2RpZmllZDogMVxuICAgICAgICB9LFxuICAgICAgICBsaW1pdDogNVxuICAgICAgfSk7XG4gICAgICByZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnB1c2goe1xuICAgICAgICAgIF9pZDogcmVjb3JkLl9pZCxcbiAgICAgICAgICBfbmFtZTogcmVjb3JkW19vYmplY3RfbmFtZV9rZXldLFxuICAgICAgICAgIF9vYmplY3RfbmFtZTogb2JqZWN0X25hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5NZXRlb3IubWV0aG9kcyh7XG4gICdvYmplY3RfcmVjZW50X3JlY29yZCc6IGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgICB2YXIgZGF0YSwgcmVjb3JkcztcbiAgICBkYXRhID0gbmV3IEFycmF5KCk7XG4gICAgcmVjb3JkcyA9IG5ldyBBcnJheSgpO1xuICAgIGFzeW5jX3JlY2VudF9hZ2dyZWdhdGUodGhpcy51c2VySWQsIHNwYWNlSWQsIHJlY29yZHMpO1xuICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICB2YXIgZmllbGRzLCByZWNvcmQsIHJlY29yZF9vYmplY3QsIHJlY29yZF9vYmplY3RfY29sbGVjdGlvbjtcbiAgICAgIHJlY29yZF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChpdGVtLm9iamVjdF9uYW1lLCBpdGVtLnNwYWNlKTtcbiAgICAgIGlmICghcmVjb3JkX29iamVjdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oaXRlbS5vYmplY3RfbmFtZSwgaXRlbS5zcGFjZSk7XG4gICAgICBpZiAocmVjb3JkX29iamVjdCAmJiByZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24pIHtcbiAgICAgICAgZmllbGRzID0ge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9O1xuICAgICAgICBmaWVsZHNbcmVjb3JkX29iamVjdC5OQU1FX0ZJRUxEX0tFWV0gPSAxO1xuICAgICAgICByZWNvcmQgPSByZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24uZmluZE9uZShpdGVtLnJlY29yZF9pZFswXSwge1xuICAgICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEucHVzaCh7XG4gICAgICAgICAgICBfaWQ6IHJlY29yZC5faWQsXG4gICAgICAgICAgICBfbmFtZTogcmVjb3JkW3JlY29yZF9vYmplY3QuTkFNRV9GSUVMRF9LRVldLFxuICAgICAgICAgICAgX29iamVjdF9uYW1lOiBpdGVtLm9iamVjdF9uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfSxcbiAgJ29iamVjdF9yZWNvcmRfc2VhcmNoJzogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBkYXRhLCBzZWFyY2hUZXh0LCBzZWxmLCBzcGFjZTtcbiAgICBzZWxmID0gdGhpcztcbiAgICBkYXRhID0gbmV3IEFycmF5KCk7XG4gICAgc2VhcmNoVGV4dCA9IG9wdGlvbnMuc2VhcmNoVGV4dDtcbiAgICBzcGFjZSA9IG9wdGlvbnMuc3BhY2U7XG4gICAgXy5mb3JFYWNoKENyZWF0b3Iub2JqZWN0c0J5TmFtZSwgZnVuY3Rpb24oX29iamVjdCwgbmFtZSkge1xuICAgICAgdmFyIG9iamVjdF9yZWNvcmQ7XG4gICAgICBpZiAoX29iamVjdC5lbmFibGVfc2VhcmNoKSB7XG4gICAgICAgIG9iamVjdF9yZWNvcmQgPSBzZWFyY2hfb2JqZWN0KHNwYWNlLCBfb2JqZWN0Lm5hbWUsIHNlbGYudXNlcklkLCBzZWFyY2hUZXh0KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgPSBkYXRhLmNvbmNhdChvYmplY3RfcmVjb3JkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufSk7XG4iLCJNZXRlb3IubWV0aG9kc1xuICAgIHVwZGF0ZV9maWx0ZXJzOiAobGlzdHZpZXdfaWQsIGZpbHRlcnMsIGZpbHRlcl9zY29wZSwgZmlsdGVyX2xvZ2ljKS0+XG4gICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X2xpc3R2aWV3cy5kaXJlY3QudXBkYXRlKHtfaWQ6IGxpc3R2aWV3X2lkfSwgeyRzZXQ6IHtmaWx0ZXJzOiBmaWx0ZXJzLCBmaWx0ZXJfc2NvcGU6IGZpbHRlcl9zY29wZSwgZmlsdGVyX2xvZ2ljOiBmaWx0ZXJfbG9naWN9fSlcblxuICAgIHVwZGF0ZV9jb2x1bW5zOiAobGlzdHZpZXdfaWQsIGNvbHVtbnMpLT5cbiAgICAgICAgY2hlY2soY29sdW1ucywgQXJyYXkpXG4gICAgICAgIFxuICAgICAgICBpZiBjb2x1bW5zLmxlbmd0aCA8IDFcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IgNDAwLCBcIlNlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgdG8gZGlzcGxheVwiXG4gICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X2xpc3R2aWV3cy51cGRhdGUoe19pZDogbGlzdHZpZXdfaWR9LCB7JHNldDoge2NvbHVtbnM6IGNvbHVtbnN9fSlcbiIsIk1ldGVvci5tZXRob2RzKHtcbiAgdXBkYXRlX2ZpbHRlcnM6IGZ1bmN0aW9uKGxpc3R2aWV3X2lkLCBmaWx0ZXJzLCBmaWx0ZXJfc2NvcGUsIGZpbHRlcl9sb2dpYykge1xuICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLm9iamVjdF9saXN0dmlld3MuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICBfaWQ6IGxpc3R2aWV3X2lkXG4gICAgfSwge1xuICAgICAgJHNldDoge1xuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXJzLFxuICAgICAgICBmaWx0ZXJfc2NvcGU6IGZpbHRlcl9zY29wZSxcbiAgICAgICAgZmlsdGVyX2xvZ2ljOiBmaWx0ZXJfbG9naWNcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgdXBkYXRlX2NvbHVtbnM6IGZ1bmN0aW9uKGxpc3R2aWV3X2lkLCBjb2x1bW5zKSB7XG4gICAgY2hlY2soY29sdW1ucywgQXJyYXkpO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCBcIlNlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgdG8gZGlzcGxheVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X2xpc3R2aWV3cy51cGRhdGUoe1xuICAgICAgX2lkOiBsaXN0dmlld19pZFxuICAgIH0sIHtcbiAgICAgICRzZXQ6IHtcbiAgICAgICAgY29sdW1uczogY29sdW1uc1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG5cdCdyZXBvcnRfZGF0YSc6IChvcHRpb25zKS0+XG5cdFx0Y2hlY2sob3B0aW9ucywgT2JqZWN0KVxuXHRcdHNwYWNlID0gb3B0aW9ucy5zcGFjZVxuXHRcdGZpZWxkcyA9IG9wdGlvbnMuZmllbGRzXG5cdFx0b2JqZWN0X25hbWUgPSBvcHRpb25zLm9iamVjdF9uYW1lXG5cdFx0ZmlsdGVyX3Njb3BlID0gb3B0aW9ucy5maWx0ZXJfc2NvcGVcblx0XHRmaWx0ZXJzID0gb3B0aW9ucy5maWx0ZXJzXG5cdFx0ZmlsdGVyRmllbGRzID0ge31cblx0XHRjb21wb3VuZEZpZWxkcyA9IFtdXG5cdFx0b2JqZWN0RmllbGRzID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpPy5maWVsZHNcblx0XHRfLmVhY2ggZmllbGRzLCAoaXRlbSwgaW5kZXgpLT5cblx0XHRcdHNwbGl0cyA9IGl0ZW0uc3BsaXQoXCIuXCIpXG5cdFx0XHRuYW1lID0gc3BsaXRzWzBdXG5cdFx0XHRvYmplY3RGaWVsZCA9IG9iamVjdEZpZWxkc1tuYW1lXVxuXHRcdFx0aWYgc3BsaXRzLmxlbmd0aCA+IDEgYW5kIG9iamVjdEZpZWxkXG5cdFx0XHRcdGNoaWxkS2V5ID0gaXRlbS5yZXBsYWNlIG5hbWUgKyBcIi5cIiwgXCJcIlxuXHRcdFx0XHRjb21wb3VuZEZpZWxkcy5wdXNoKHtuYW1lOiBuYW1lLCBjaGlsZEtleTogY2hpbGRLZXksIGZpZWxkOiBvYmplY3RGaWVsZH0pXG5cdFx0XHRmaWx0ZXJGaWVsZHNbbmFtZV0gPSAxXG5cblx0XHRzZWxlY3RvciA9IHt9XG5cdFx0dXNlcklkID0gdGhpcy51c2VySWRcblx0XHRzZWxlY3Rvci5zcGFjZSA9IHNwYWNlXG5cdFx0aWYgZmlsdGVyX3Njb3BlID09IFwic3BhY2V4XCJcblx0XHRcdHNlbGVjdG9yLnNwYWNlID0gXG5cdFx0XHRcdCRpbjogW251bGwsc3BhY2VdXG5cdFx0ZWxzZSBpZiBmaWx0ZXJfc2NvcGUgPT0gXCJtaW5lXCJcblx0XHRcdHNlbGVjdG9yLm93bmVyID0gdXNlcklkXG5cblx0XHRpZiBDcmVhdG9yLmlzQ29tbW9uU3BhY2Uoc3BhY2UpICYmIENyZWF0b3IuaXNTcGFjZUFkbWluKHNwYWNlLCBAdXNlcklkKVxuXHRcdFx0ZGVsZXRlIHNlbGVjdG9yLnNwYWNlXG5cblx0XHRpZiBmaWx0ZXJzIGFuZCBmaWx0ZXJzLmxlbmd0aCA+IDBcblx0XHRcdHNlbGVjdG9yW1wiJGFuZFwiXSA9IGZpbHRlcnNcblxuXHRcdGN1cnNvciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSkuZmluZChzZWxlY3Rvciwge2ZpZWxkczogZmlsdGVyRmllbGRzLCBza2lwOiAwLCBsaW1pdDogMTAwMDB9KVxuI1x0XHRpZiBjdXJzb3IuY291bnQoKSA+IDEwMDAwXG4jXHRcdFx0cmV0dXJuIFtdXG5cdFx0cmVzdWx0ID0gY3Vyc29yLmZldGNoKClcblx0XHRpZiBjb21wb3VuZEZpZWxkcy5sZW5ndGhcblx0XHRcdHJlc3VsdCA9IHJlc3VsdC5tYXAgKGl0ZW0saW5kZXgpLT5cblx0XHRcdFx0Xy5lYWNoIGNvbXBvdW5kRmllbGRzLCAoY29tcG91bmRGaWVsZEl0ZW0sIGluZGV4KS0+XG5cdFx0XHRcdFx0aXRlbUtleSA9IGNvbXBvdW5kRmllbGRJdGVtLm5hbWUgKyBcIiolKlwiICsgY29tcG91bmRGaWVsZEl0ZW0uY2hpbGRLZXkucmVwbGFjZSgvXFwuL2csIFwiKiUqXCIpXG5cdFx0XHRcdFx0aXRlbVZhbHVlID0gaXRlbVtjb21wb3VuZEZpZWxkSXRlbS5uYW1lXVxuXHRcdFx0XHRcdHR5cGUgPSBjb21wb3VuZEZpZWxkSXRlbS5maWVsZC50eXBlXG5cdFx0XHRcdFx0aWYgW1wibG9va3VwXCIsIFwibWFzdGVyX2RldGFpbFwiXS5pbmRleE9mKHR5cGUpID4gLTFcblx0XHRcdFx0XHRcdHJlZmVyZW5jZV90byA9IGNvbXBvdW5kRmllbGRJdGVtLmZpZWxkLnJlZmVyZW5jZV90b1xuXHRcdFx0XHRcdFx0Y29tcG91bmRGaWx0ZXJGaWVsZHMgPSB7fVxuXHRcdFx0XHRcdFx0Y29tcG91bmRGaWx0ZXJGaWVsZHNbY29tcG91bmRGaWVsZEl0ZW0uY2hpbGRLZXldID0gMVxuXHRcdFx0XHRcdFx0cmVmZXJlbmNlSXRlbSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWZlcmVuY2VfdG8pLmZpbmRPbmUge19pZDogaXRlbVZhbHVlfSwgZmllbGRzOiBjb21wb3VuZEZpbHRlckZpZWxkc1xuXHRcdFx0XHRcdFx0aWYgcmVmZXJlbmNlSXRlbVxuXHRcdFx0XHRcdFx0XHRpdGVtW2l0ZW1LZXldID0gcmVmZXJlbmNlSXRlbVtjb21wb3VuZEZpZWxkSXRlbS5jaGlsZEtleV1cblx0XHRcdFx0XHRlbHNlIGlmIHR5cGUgPT0gXCJzZWxlY3RcIlxuXHRcdFx0XHRcdFx0b3B0aW9ucyA9IGNvbXBvdW5kRmllbGRJdGVtLmZpZWxkLm9wdGlvbnNcblx0XHRcdFx0XHRcdGl0ZW1baXRlbUtleV0gPSBfLmZpbmRXaGVyZShvcHRpb25zLCB7dmFsdWU6IGl0ZW1WYWx1ZX0pPy5sYWJlbCBvciBpdGVtVmFsdWVcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpdGVtW2l0ZW1LZXldID0gaXRlbVZhbHVlXG5cdFx0XHRcdFx0dW5sZXNzIGl0ZW1baXRlbUtleV1cblx0XHRcdFx0XHRcdGl0ZW1baXRlbUtleV0gPSBcIi0tXCJcblx0XHRcdFx0cmV0dXJuIGl0ZW1cblx0XHRcdHJldHVybiByZXN1bHRcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gcmVzdWx0XG5cbiIsIk1ldGVvci5tZXRob2RzKHtcbiAgJ3JlcG9ydF9kYXRhJzogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBjb21wb3VuZEZpZWxkcywgY3Vyc29yLCBmaWVsZHMsIGZpbHRlckZpZWxkcywgZmlsdGVyX3Njb3BlLCBmaWx0ZXJzLCBvYmplY3RGaWVsZHMsIG9iamVjdF9uYW1lLCByZWYsIHJlc3VsdCwgc2VsZWN0b3IsIHNwYWNlLCB1c2VySWQ7XG4gICAgY2hlY2sob3B0aW9ucywgT2JqZWN0KTtcbiAgICBzcGFjZSA9IG9wdGlvbnMuc3BhY2U7XG4gICAgZmllbGRzID0gb3B0aW9ucy5maWVsZHM7XG4gICAgb2JqZWN0X25hbWUgPSBvcHRpb25zLm9iamVjdF9uYW1lO1xuICAgIGZpbHRlcl9zY29wZSA9IG9wdGlvbnMuZmlsdGVyX3Njb3BlO1xuICAgIGZpbHRlcnMgPSBvcHRpb25zLmZpbHRlcnM7XG4gICAgZmlsdGVyRmllbGRzID0ge307XG4gICAgY29tcG91bmRGaWVsZHMgPSBbXTtcbiAgICBvYmplY3RGaWVsZHMgPSAocmVmID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpKSAhPSBudWxsID8gcmVmLmZpZWxkcyA6IHZvaWQgMDtcbiAgICBfLmVhY2goZmllbGRzLCBmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgdmFyIGNoaWxkS2V5LCBuYW1lLCBvYmplY3RGaWVsZCwgc3BsaXRzO1xuICAgICAgc3BsaXRzID0gaXRlbS5zcGxpdChcIi5cIik7XG4gICAgICBuYW1lID0gc3BsaXRzWzBdO1xuICAgICAgb2JqZWN0RmllbGQgPSBvYmplY3RGaWVsZHNbbmFtZV07XG4gICAgICBpZiAoc3BsaXRzLmxlbmd0aCA+IDEgJiYgb2JqZWN0RmllbGQpIHtcbiAgICAgICAgY2hpbGRLZXkgPSBpdGVtLnJlcGxhY2UobmFtZSArIFwiLlwiLCBcIlwiKTtcbiAgICAgICAgY29tcG91bmRGaWVsZHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICBjaGlsZEtleTogY2hpbGRLZXksXG4gICAgICAgICAgZmllbGQ6IG9iamVjdEZpZWxkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbHRlckZpZWxkc1tuYW1lXSA9IDE7XG4gICAgfSk7XG4gICAgc2VsZWN0b3IgPSB7fTtcbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICBzZWxlY3Rvci5zcGFjZSA9IHNwYWNlO1xuICAgIGlmIChmaWx0ZXJfc2NvcGUgPT09IFwic3BhY2V4XCIpIHtcbiAgICAgIHNlbGVjdG9yLnNwYWNlID0ge1xuICAgICAgICAkaW46IFtudWxsLCBzcGFjZV1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJfc2NvcGUgPT09IFwibWluZVwiKSB7XG4gICAgICBzZWxlY3Rvci5vd25lciA9IHVzZXJJZDtcbiAgICB9XG4gICAgaWYgKENyZWF0b3IuaXNDb21tb25TcGFjZShzcGFjZSkgJiYgQ3JlYXRvci5pc1NwYWNlQWRtaW4oc3BhY2UsIHRoaXMudXNlcklkKSkge1xuICAgICAgZGVsZXRlIHNlbGVjdG9yLnNwYWNlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlbGVjdG9yW1wiJGFuZFwiXSA9IGZpbHRlcnM7XG4gICAgfVxuICAgIGN1cnNvciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSkuZmluZChzZWxlY3Rvciwge1xuICAgICAgZmllbGRzOiBmaWx0ZXJGaWVsZHMsXG4gICAgICBza2lwOiAwLFxuICAgICAgbGltaXQ6IDEwMDAwXG4gICAgfSk7XG4gICAgcmVzdWx0ID0gY3Vyc29yLmZldGNoKCk7XG4gICAgaWYgKGNvbXBvdW5kRmllbGRzLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICBfLmVhY2goY29tcG91bmRGaWVsZHMsIGZ1bmN0aW9uKGNvbXBvdW5kRmllbGRJdGVtLCBpbmRleCkge1xuICAgICAgICAgIHZhciBjb21wb3VuZEZpbHRlckZpZWxkcywgaXRlbUtleSwgaXRlbVZhbHVlLCByZWYxLCByZWZlcmVuY2VJdGVtLCByZWZlcmVuY2VfdG8sIHR5cGU7XG4gICAgICAgICAgaXRlbUtleSA9IGNvbXBvdW5kRmllbGRJdGVtLm5hbWUgKyBcIiolKlwiICsgY29tcG91bmRGaWVsZEl0ZW0uY2hpbGRLZXkucmVwbGFjZSgvXFwuL2csIFwiKiUqXCIpO1xuICAgICAgICAgIGl0ZW1WYWx1ZSA9IGl0ZW1bY29tcG91bmRGaWVsZEl0ZW0ubmFtZV07XG4gICAgICAgICAgdHlwZSA9IGNvbXBvdW5kRmllbGRJdGVtLmZpZWxkLnR5cGU7XG4gICAgICAgICAgaWYgKFtcImxvb2t1cFwiLCBcIm1hc3Rlcl9kZXRhaWxcIl0uaW5kZXhPZih0eXBlKSA+IC0xKSB7XG4gICAgICAgICAgICByZWZlcmVuY2VfdG8gPSBjb21wb3VuZEZpZWxkSXRlbS5maWVsZC5yZWZlcmVuY2VfdG87XG4gICAgICAgICAgICBjb21wb3VuZEZpbHRlckZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgY29tcG91bmRGaWx0ZXJGaWVsZHNbY29tcG91bmRGaWVsZEl0ZW0uY2hpbGRLZXldID0gMTtcbiAgICAgICAgICAgIHJlZmVyZW5jZUl0ZW0gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVmZXJlbmNlX3RvKS5maW5kT25lKHtcbiAgICAgICAgICAgICAgX2lkOiBpdGVtVmFsdWVcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZmllbGRzOiBjb21wb3VuZEZpbHRlckZpZWxkc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlSXRlbSkge1xuICAgICAgICAgICAgICBpdGVtW2l0ZW1LZXldID0gcmVmZXJlbmNlSXRlbVtjb21wb3VuZEZpZWxkSXRlbS5jaGlsZEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gY29tcG91bmRGaWVsZEl0ZW0uZmllbGQub3B0aW9ucztcbiAgICAgICAgICAgIGl0ZW1baXRlbUtleV0gPSAoKHJlZjEgPSBfLmZpbmRXaGVyZShvcHRpb25zLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtVmFsdWVcbiAgICAgICAgICAgIH0pKSAhPSBudWxsID8gcmVmMS5sYWJlbCA6IHZvaWQgMCkgfHwgaXRlbVZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtW2l0ZW1LZXldID0gaXRlbVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWl0ZW1baXRlbUtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtW2l0ZW1LZXldID0gXCItLVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufSk7XG4iLCIjIyNcbiAgICB0eXBlOiBcInVzZXJcIlxuICAgIG9iamVjdF9uYW1lOiBcIm9iamVjdF9saXN0dmlld3NcIlxuICAgIHJlY29yZF9pZDogXCJ7b2JqZWN0X25hbWV9LHtsaXN0dmlld19pZH1cIlxuICAgIHNldHRpbmdzOlxuICAgICAgICBjb2x1bW5fd2lkdGg6IHsgZmllbGRfYTogMTAwLCBmaWVsZF8yOiAxNTAgfVxuICAgICAgICBzb3J0OiBbW1wiZmllbGRfYVwiLCBcImRlc2NcIl1dXG4gICAgb3duZXI6IHt1c2VySWR9XG4jIyNcblxuTWV0ZW9yLm1ldGhvZHNcbiAgICBcInRhYnVsYXJfc29ydF9zZXR0aW5nc1wiOiAob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgc29ydCktPlxuICAgICAgICB1c2VySWQgPSB0aGlzLnVzZXJJZFxuICAgICAgICBzZXR0aW5nID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5maW5kT25lKHtvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsIHJlY29yZF9pZDogXCJvYmplY3RfbGlzdHZpZXdzXCIsIG93bmVyOiB1c2VySWR9KVxuICAgICAgICBpZiBzZXR0aW5nXG4gICAgICAgICAgICBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLnVwZGF0ZSh7X2lkOiBzZXR0aW5nLl9pZH0sIHskc2V0OiB7XCJzZXR0aW5ncy4je2xpc3Rfdmlld19pZH0uc29ydFwiOiBzb3J0fX0pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvYyA9IFxuICAgICAgICAgICAgICAgIHR5cGU6IFwidXNlclwiXG4gICAgICAgICAgICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lXG4gICAgICAgICAgICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIlxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fVxuICAgICAgICAgICAgICAgIG93bmVyOiB1c2VySWRcblxuICAgICAgICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0gPSB7fVxuICAgICAgICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0uc29ydCA9IHNvcnRcblxuICAgICAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5pbnNlcnQoZG9jKVxuXG4gICAgXCJ0YWJ1bGFyX2NvbHVtbl93aWR0aF9zZXR0aW5nc1wiOiAob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgY29sdW1uX3dpZHRoKS0+XG4gICAgICAgIHVzZXJJZCA9IHRoaXMudXNlcklkXG4gICAgICAgIHNldHRpbmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmRPbmUoe29iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIiwgb3duZXI6IHVzZXJJZH0pXG4gICAgICAgIGlmIHNldHRpbmdcbiAgICAgICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MudXBkYXRlKHtfaWQ6IHNldHRpbmcuX2lkfSwgeyRzZXQ6IHtcInNldHRpbmdzLiN7bGlzdF92aWV3X2lkfS5jb2x1bW5fd2lkdGhcIjogY29sdW1uX3dpZHRofX0pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvYyA9IFxuICAgICAgICAgICAgICAgIHR5cGU6IFwidXNlclwiXG4gICAgICAgICAgICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lXG4gICAgICAgICAgICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIlxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fVxuICAgICAgICAgICAgICAgIG93bmVyOiB1c2VySWRcblxuICAgICAgICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0gPSB7fVxuICAgICAgICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0uY29sdW1uX3dpZHRoID0gY29sdW1uX3dpZHRoXG5cbiAgICAgICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuaW5zZXJ0KGRvYylcblxuICAgIFwiZ3JpZF9zZXR0aW5nc1wiOiAob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgY29sdW1uX3dpZHRoLCBzb3J0KS0+XG4gICAgICAgIHVzZXJJZCA9IHRoaXMudXNlcklkXG4gICAgICAgIHNldHRpbmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmRPbmUoe29iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgcmVjb3JkX2lkOiBcIm9iamVjdF9ncmlkdmlld3NcIiwgb3duZXI6IHVzZXJJZH0pXG4gICAgICAgIGlmIHNldHRpbmdcbiAgICAgICAgICAgICMg5q+P5qyh6YO95by65Yi25pS55Y+YX2lkX2FjdGlvbnPliJfnmoTlrr3luqbvvIzku6Xop6PlhrPlvZPnlKjmiLflj6rmlLnlj5jlrZfmrrXmrKHluo/ogIzmsqHmnInmlLnlj5jku7vkvZXlrZfmrrXlrr3luqbml7bvvIzliY3nq6/msqHmnInorqLpmIXliLDlrZfmrrXmrKHluo/lj5jmm7TnmoTmlbDmja7nmoTpl67pophcbiAgICAgICAgICAgIGNvbHVtbl93aWR0aC5faWRfYWN0aW9ucyA9IGlmIHNldHRpbmcuc2V0dGluZ3NbXCIje2xpc3Rfdmlld19pZH1cIl0/LmNvbHVtbl93aWR0aD8uX2lkX2FjdGlvbnMgPT0gNDYgdGhlbiA0NyBlbHNlIDQ2XG4gICAgICAgICAgICBpZiBzb3J0XG4gICAgICAgICAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy51cGRhdGUoe19pZDogc2V0dGluZy5faWR9LCB7JHNldDoge1wic2V0dGluZ3MuI3tsaXN0X3ZpZXdfaWR9LnNvcnRcIjogc29ydCwgXCJzZXR0aW5ncy4je2xpc3Rfdmlld19pZH0uY29sdW1uX3dpZHRoXCI6IGNvbHVtbl93aWR0aH19KVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MudXBkYXRlKHtfaWQ6IHNldHRpbmcuX2lkfSwgeyRzZXQ6IHtcInNldHRpbmdzLiN7bGlzdF92aWV3X2lkfS5jb2x1bW5fd2lkdGhcIjogY29sdW1uX3dpZHRofX0pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvYyA9XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ1c2VyXCJcbiAgICAgICAgICAgICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWVcbiAgICAgICAgICAgICAgICByZWNvcmRfaWQ6IFwib2JqZWN0X2dyaWR2aWV3c1wiXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9XG4gICAgICAgICAgICAgICAgb3duZXI6IHVzZXJJZFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXSA9IHt9XG4gICAgICAgICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXS5jb2x1bW5fd2lkdGggPSBjb2x1bW5fd2lkdGhcbiAgICAgICAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdLnNvcnQgPSBzb3J0XG5cbiAgICAgICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuaW5zZXJ0KGRvYykiLCJcbi8qXG4gICAgdHlwZTogXCJ1c2VyXCJcbiAgICBvYmplY3RfbmFtZTogXCJvYmplY3RfbGlzdHZpZXdzXCJcbiAgICByZWNvcmRfaWQ6IFwie29iamVjdF9uYW1lfSx7bGlzdHZpZXdfaWR9XCJcbiAgICBzZXR0aW5nczpcbiAgICAgICAgY29sdW1uX3dpZHRoOiB7IGZpZWxkX2E6IDEwMCwgZmllbGRfMjogMTUwIH1cbiAgICAgICAgc29ydDogW1tcImZpZWxkX2FcIiwgXCJkZXNjXCJdXVxuICAgIG93bmVyOiB7dXNlcklkfVxuICovXG5NZXRlb3IubWV0aG9kcyh7XG4gIFwidGFidWxhcl9zb3J0X3NldHRpbmdzXCI6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQsIHNvcnQpIHtcbiAgICB2YXIgZG9jLCBvYmosIHNldHRpbmcsIHVzZXJJZDtcbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICBzZXR0aW5nID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5maW5kT25lKHtcbiAgICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICAgIHJlY29yZF9pZDogXCJvYmplY3RfbGlzdHZpZXdzXCIsXG4gICAgICBvd25lcjogdXNlcklkXG4gICAgfSk7XG4gICAgaWYgKHNldHRpbmcpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIF9pZDogc2V0dGluZy5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgJHNldDogKFxuICAgICAgICAgIG9iaiA9IHt9LFxuICAgICAgICAgIG9ialtcInNldHRpbmdzLlwiICsgbGlzdF92aWV3X2lkICsgXCIuc29ydFwiXSA9IHNvcnQsXG4gICAgICAgICAgb2JqXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MgPSB7XG4gICAgICAgIHR5cGU6IFwidXNlclwiLFxuICAgICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG4gICAgICAgIHJlY29yZF9pZDogXCJvYmplY3RfbGlzdHZpZXdzXCIsXG4gICAgICAgIHNldHRpbmdzOiB7fSxcbiAgICAgICAgb3duZXI6IHVzZXJJZFxuICAgICAgfTtcbiAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdID0ge307XG4gICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXS5zb3J0ID0gc29ydDtcbiAgICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmluc2VydChkb2MpO1xuICAgIH1cbiAgfSxcbiAgXCJ0YWJ1bGFyX2NvbHVtbl93aWR0aF9zZXR0aW5nc1wiOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBjb2x1bW5fd2lkdGgpIHtcbiAgICB2YXIgZG9jLCBvYmosIHNldHRpbmcsIHVzZXJJZDtcbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICBzZXR0aW5nID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5maW5kT25lKHtcbiAgICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICAgIHJlY29yZF9pZDogXCJvYmplY3RfbGlzdHZpZXdzXCIsXG4gICAgICBvd25lcjogdXNlcklkXG4gICAgfSk7XG4gICAgaWYgKHNldHRpbmcpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgIF9pZDogc2V0dGluZy5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgJHNldDogKFxuICAgICAgICAgIG9iaiA9IHt9LFxuICAgICAgICAgIG9ialtcInNldHRpbmdzLlwiICsgbGlzdF92aWV3X2lkICsgXCIuY29sdW1uX3dpZHRoXCJdID0gY29sdW1uX3dpZHRoLFxuICAgICAgICAgIG9ialxuICAgICAgICApXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jID0ge1xuICAgICAgICB0eXBlOiBcInVzZXJcIixcbiAgICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgICByZWNvcmRfaWQ6IFwib2JqZWN0X2xpc3R2aWV3c1wiLFxuICAgICAgICBzZXR0aW5nczoge30sXG4gICAgICAgIG93bmVyOiB1c2VySWRcbiAgICAgIH07XG4gICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXSA9IHt9O1xuICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0uY29sdW1uX3dpZHRoID0gY29sdW1uX3dpZHRoO1xuICAgICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuaW5zZXJ0KGRvYyk7XG4gICAgfVxuICB9LFxuICBcImdyaWRfc2V0dGluZ3NcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgY29sdW1uX3dpZHRoLCBzb3J0KSB7XG4gICAgdmFyIGRvYywgb2JqLCBvYmoxLCByZWYsIHJlZjEsIHNldHRpbmcsIHVzZXJJZDtcbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICBzZXR0aW5nID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5maW5kT25lKHtcbiAgICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICAgIHJlY29yZF9pZDogXCJvYmplY3RfZ3JpZHZpZXdzXCIsXG4gICAgICBvd25lcjogdXNlcklkXG4gICAgfSk7XG4gICAgaWYgKHNldHRpbmcpIHtcbiAgICAgIGNvbHVtbl93aWR0aC5faWRfYWN0aW9ucyA9ICgocmVmID0gc2V0dGluZy5zZXR0aW5nc1tcIlwiICsgbGlzdF92aWV3X2lkXSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmNvbHVtbl93aWR0aCkgIT0gbnVsbCA/IHJlZjEuX2lkX2FjdGlvbnMgOiB2b2lkIDAgOiB2b2lkIDApID09PSA0NiA/IDQ3IDogNDY7XG4gICAgICBpZiAoc29ydCkge1xuICAgICAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy51cGRhdGUoe1xuICAgICAgICAgIF9pZDogc2V0dGluZy5faWRcbiAgICAgICAgfSwge1xuICAgICAgICAgICRzZXQ6IChcbiAgICAgICAgICAgIG9iaiA9IHt9LFxuICAgICAgICAgICAgb2JqW1wic2V0dGluZ3MuXCIgKyBsaXN0X3ZpZXdfaWQgKyBcIi5zb3J0XCJdID0gc29ydCxcbiAgICAgICAgICAgIG9ialtcInNldHRpbmdzLlwiICsgbGlzdF92aWV3X2lkICsgXCIuY29sdW1uX3dpZHRoXCJdID0gY29sdW1uX3dpZHRoLFxuICAgICAgICAgICAgb2JqXG4gICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgICAgX2lkOiBzZXR0aW5nLl9pZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHNldDogKFxuICAgICAgICAgICAgb2JqMSA9IHt9LFxuICAgICAgICAgICAgb2JqMVtcInNldHRpbmdzLlwiICsgbGlzdF92aWV3X2lkICsgXCIuY29sdW1uX3dpZHRoXCJdID0gY29sdW1uX3dpZHRoLFxuICAgICAgICAgICAgb2JqMVxuICAgICAgICAgIClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYyA9IHtcbiAgICAgICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9ncmlkdmlld3NcIixcbiAgICAgICAgc2V0dGluZ3M6IHt9LFxuICAgICAgICBvd25lcjogdXNlcklkXG4gICAgICB9O1xuICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0gPSB7fTtcbiAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdLmNvbHVtbl93aWR0aCA9IGNvbHVtbl93aWR0aDtcbiAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdLnNvcnQgPSBzb3J0O1xuICAgICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuaW5zZXJ0KGRvYyk7XG4gICAgfVxuICB9XG59KTtcbiIsInhtbDJqcyA9IHJlcXVpcmUgJ3htbDJqcydcbmZzID0gcmVxdWlyZSAnZnMnXG5wYXRoID0gcmVxdWlyZSAncGF0aCdcbm1rZGlycCA9IHJlcXVpcmUgJ21rZGlycCdcblxubG9nZ2VyID0gbmV3IExvZ2dlciAnRXhwb3J0X1RPX1hNTCdcblxuX3dyaXRlWG1sRmlsZSA9IChqc29uT2JqLG9iak5hbWUpIC0+XG5cdCMg6L2seG1sXG5cdGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoKVxuXHR4bWwgPSBidWlsZGVyLmJ1aWxkT2JqZWN0IGpzb25PYmpcblxuXHQjIOi9rOS4umJ1ZmZlclxuXHRzdHJlYW0gPSBuZXcgQnVmZmVyIHhtbFxuXG5cdCMg5qC55o2u5b2T5aSp5pe26Ze055qE5bm05pyI5pel5L2c5Li65a2Y5YKo6Lev5b6EXG5cdG5vdyA9IG5ldyBEYXRlXG5cdHllYXIgPSBub3cuZ2V0RnVsbFllYXIoKVxuXHRtb250aCA9IG5vdy5nZXRNb250aCgpICsgMVxuXHRkYXkgPSBub3cuZ2V0RGF0ZSgpXG5cblx0IyDmlofku7bot6/lvoRcblx0ZmlsZVBhdGggPSBwYXRoLmpvaW4oX19tZXRlb3JfYm9vdHN0cmFwX18uc2VydmVyRGlyLCcuLi8uLi8uLi9leHBvcnQvJyArIHllYXIgKyAnLycgKyBtb250aCArICcvJyArIGRheSArICcvJyArIG9iak5hbWUgKVxuXHRmaWxlTmFtZSA9IGpzb25PYmo/Ll9pZCArIFwiLnhtbFwiXG5cdGZpbGVBZGRyZXNzID0gcGF0aC5qb2luIGZpbGVQYXRoLCBmaWxlTmFtZVxuXG5cdGlmICFmcy5leGlzdHNTeW5jIGZpbGVQYXRoXG5cdFx0bWtkaXJwLnN5bmMgZmlsZVBhdGhcblxuXHQjIOWGmeWFpeaWh+S7tlxuXHRmcy53cml0ZUZpbGUgZmlsZUFkZHJlc3MsIHN0cmVhbSwgKGVycikgLT5cblx0XHRpZiBlcnJcblx0XHRcdGxvZ2dlci5lcnJvciBcIiN7anNvbk9iai5faWR95YaZ5YWleG1s5paH5Lu25aSx6LSlXCIsZXJyXG5cdFxuXHRyZXR1cm4gZmlsZVBhdGhcblxuXG4jIOaVtOeQhkZpZWxkc+eahGpzb27mlbDmja5cbl9taXhGaWVsZHNEYXRhID0gKG9iaixvYmpOYW1lKSAtPlxuXHQjIOWIneWni+WMluWvueixoeaVsOaNrlxuXHRqc29uT2JqID0ge31cblx0IyDojrflj5ZmaWVsZHNcblx0b2JqRmllbGRzID0gQ3JlYXRvcj8uZ2V0T2JqZWN0KG9iak5hbWUpPy5maWVsZHNcblxuXHRtaXhEZWZhdWx0ID0gKGZpZWxkX25hbWUpLT5cblx0XHRqc29uT2JqW2ZpZWxkX25hbWVdID0gb2JqW2ZpZWxkX25hbWVdIHx8IFwiXCJcblxuXHRtaXhEYXRlID0gKGZpZWxkX25hbWUsdHlwZSktPlxuXHRcdGRhdGUgPSBvYmpbZmllbGRfbmFtZV1cblx0XHRpZiB0eXBlID09IFwiZGF0ZVwiXG5cdFx0XHRmb3JtYXQgPSBcIllZWVktTU0tRERcIlxuXHRcdGVsc2Vcblx0XHRcdGZvcm1hdCA9IFwiWVlZWS1NTS1ERCBISDptbTpzc1wiXG5cdFx0aWYgZGF0ZT8gYW5kIGZvcm1hdD9cblx0XHRcdGRhdGVTdHIgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KGZvcm1hdClcblx0XHRqc29uT2JqW2ZpZWxkX25hbWVdID0gZGF0ZVN0ciB8fCBcIlwiXG5cblx0bWl4Qm9vbCA9IChmaWVsZF9uYW1lKS0+XG5cdFx0aWYgb2JqW2ZpZWxkX25hbWVdID09IHRydWVcblx0XHRcdGpzb25PYmpbZmllbGRfbmFtZV0gPSBcIuaYr1wiXG5cdFx0ZWxzZSBpZiBvYmpbZmllbGRfbmFtZV0gPT0gZmFsc2Vcblx0XHRcdGpzb25PYmpbZmllbGRfbmFtZV0gPSBcIuWQplwiXG5cdFx0ZWxzZVxuXHRcdFx0anNvbk9ialtmaWVsZF9uYW1lXSA9IFwiXCJcblxuXHQjIOW+queOr+avj+S4qmZpZWxkcyzlubbliKTmlq3lj5blgLxcblx0Xy5lYWNoIG9iakZpZWxkcywgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG5cdFx0c3dpdGNoIGZpZWxkPy50eXBlXG5cdFx0XHR3aGVuIFwiZGF0ZVwiLFwiZGF0ZXRpbWVcIiB0aGVuIG1peERhdGUgZmllbGRfbmFtZSxmaWVsZC50eXBlXG5cdFx0XHR3aGVuIFwiYm9vbGVhblwiIHRoZW4gbWl4Qm9vbCBmaWVsZF9uYW1lXG5cdFx0XHRlbHNlIG1peERlZmF1bHQgZmllbGRfbmFtZVxuXG5cdHJldHVybiBqc29uT2JqXG5cbiMg6I635Y+W5a2Q6KGo5pW055CG5pWw5o2uXG5fbWl4UmVsYXRlZERhdGEgPSAob2JqLG9iak5hbWUpIC0+XG5cdCMg5Yid5aeL5YyW5a+56LGh5pWw5o2uXG5cdHJlbGF0ZWRfb2JqZWN0cyA9IHt9XG5cblx0IyDojrflj5bnm7jlhbPooahcblx0cmVsYXRlZE9iak5hbWVzID0gQ3JlYXRvcj8uZ2V0QWxsUmVsYXRlZE9iamVjdHMgb2JqTmFtZVxuXG5cdCMg5b6q546v55u45YWz6KGoXG5cdHJlbGF0ZWRPYmpOYW1lcy5mb3JFYWNoIChyZWxhdGVkT2JqTmFtZSkgLT5cblx0XHQjIOavj+S4quihqOWumuS5ieS4gOS4quWvueixoeaVsOe7hFxuXHRcdHJlbGF0ZWRUYWJsZURhdGEgPSBbXVxuXG5cdFx0IyAq6K6+572u5YWz6IGU5pCc57Si5p+l6K+i55qE5a2X5q61XG5cdFx0IyDpmYTku7bnmoTlhbPogZTmkJzntKLlrZfmrrXmmK/lrprmrbvnmoRcblx0XHRpZiByZWxhdGVkT2JqTmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0XHRyZWxhdGVkX2ZpZWxkX25hbWUgPSBcInBhcmVudC5pZHNcIlxuXHRcdGVsc2Vcblx0XHRcdCMg6I635Y+WZmllbGRzXG5cdFx0XHRmaWVsZHMgPSBDcmVhdG9yPy5PYmplY3RzW3JlbGF0ZWRPYmpOYW1lXT8uZmllbGRzXG5cdFx0XHQjIOW+queOr+avj+S4qmZpZWxkLOaJvuWHunJlZmVyZW5jZV90b+eahOWFs+iBlOWtl+autVxuXHRcdFx0cmVsYXRlZF9maWVsZF9uYW1lID0gXCJcIlxuXHRcdFx0Xy5lYWNoIGZpZWxkcywgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG5cdFx0XHRcdGlmIGZpZWxkPy5yZWZlcmVuY2VfdG8gPT0gb2JqTmFtZVxuXHRcdFx0XHRcdHJlbGF0ZWRfZmllbGRfbmFtZSA9IGZpZWxkX25hbWVcblxuXHRcdCMg5qC55o2u5om+5Ye655qE5YWz6IGU5a2X5q6177yM5p+l5a2Q6KGo5pWw5o2uXG5cdFx0aWYgcmVsYXRlZF9maWVsZF9uYW1lXG5cdFx0XHRyZWxhdGVkQ29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWxhdGVkT2JqTmFtZSlcblx0XHRcdCMg6I635Y+W5Yiw5omA5pyJ55qE5pWw5o2uXG5cdFx0XHRyZWxhdGVkUmVjb3JkTGlzdCA9IHJlbGF0ZWRDb2xsZWN0aW9uLmZpbmQoe1wiI3tyZWxhdGVkX2ZpZWxkX25hbWV9XCI6b2JqLl9pZH0pLmZldGNoKClcblx0XHRcdCMg5b6q546v5q+P5LiA5p2h5pWw5o2uXG5cdFx0XHRyZWxhdGVkUmVjb3JkTGlzdC5mb3JFYWNoIChyZWxhdGVkT2JqKS0+XG5cdFx0XHRcdCMg5pW05ZCIZmllbGRz5pWw5o2uXG5cdFx0XHRcdGZpZWxkc0RhdGEgPSBfbWl4RmllbGRzRGF0YSByZWxhdGVkT2JqLHJlbGF0ZWRPYmpOYW1lXG5cdFx0XHRcdCMg5oqK5LiA5p2h6K6w5b2V5o+S5YWl5Yiw5a+56LGh5pWw57uE5LitXG5cdFx0XHRcdHJlbGF0ZWRUYWJsZURhdGEucHVzaCBmaWVsZHNEYXRhXG5cblx0XHQjIOaKiuS4gOS4quWtkOihqOeahOaJgOacieaVsOaNruaPkuWFpeWIsHJlbGF0ZWRfb2JqZWN0c+S4re+8jOWGjeW+queOr+S4i+S4gOS4qlxuXHRcdHJlbGF0ZWRfb2JqZWN0c1tyZWxhdGVkT2JqTmFtZV0gPSByZWxhdGVkVGFibGVEYXRhXG5cblx0cmV0dXJuIHJlbGF0ZWRfb2JqZWN0c1xuXG4jIENyZWF0b3IuRXhwb3J0MnhtbCgpXG5DcmVhdG9yLkV4cG9ydDJ4bWwgPSAob2JqTmFtZSwgcmVjb3JkTGlzdCkgLT5cblx0bG9nZ2VyLmluZm8gXCJSdW4gQ3JlYXRvci5FeHBvcnQyeG1sXCJcblxuXHRjb25zb2xlLnRpbWUgXCJDcmVhdG9yLkV4cG9ydDJ4bWxcIlxuXG5cdCMg5rWL6K+V5pWw5o2uXG5cdCMgb2JqTmFtZSA9IFwiYXJjaGl2ZV9yZWNvcmRzXCJcblxuXHQjIOafpeaJvuWvueixoeaVsOaNrlxuXHRjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iak5hbWUpXG5cdCMg5rWL6K+V5pWw5o2uXG5cdHJlY29yZExpc3QgPSBjb2xsZWN0aW9uLmZpbmQoe30pLmZldGNoKClcblxuXHRyZWNvcmRMaXN0LmZvckVhY2ggKHJlY29yZE9iaiktPlxuXHRcdGpzb25PYmogPSB7fVxuXHRcdGpzb25PYmouX2lkID0gcmVjb3JkT2JqLl9pZFxuXG5cdFx0IyDmlbTnkIbkuLvooajnmoRGaWVsZHPmlbDmja5cblx0XHRmaWVsZHNEYXRhID0gX21peEZpZWxkc0RhdGEgcmVjb3JkT2JqLG9iak5hbWVcblx0XHRqc29uT2JqW29iak5hbWVdID0gZmllbGRzRGF0YVxuXG5cdFx0IyDmlbTnkIbnm7jlhbPooajmlbDmja5cblx0XHRyZWxhdGVkX29iamVjdHMgPSBfbWl4UmVsYXRlZERhdGEgcmVjb3JkT2JqLG9iak5hbWVcblxuXHRcdGpzb25PYmpbXCJyZWxhdGVkX29iamVjdHNcIl0gPSByZWxhdGVkX29iamVjdHNcblxuXHRcdCMg6L2s5Li6eG1s5L+d5a2Y5paH5Lu2XG5cdFx0ZmlsZVBhdGggPSBfd3JpdGVYbWxGaWxlIGpzb25PYmosb2JqTmFtZVxuXG5cdGNvbnNvbGUudGltZUVuZCBcIkNyZWF0b3IuRXhwb3J0MnhtbFwiXG5cdHJldHVybiBmaWxlUGF0aCIsInZhciBfbWl4RmllbGRzRGF0YSwgX21peFJlbGF0ZWREYXRhLCBfd3JpdGVYbWxGaWxlLCBmcywgbG9nZ2VyLCBta2RpcnAsIHBhdGgsIHhtbDJqcztcblxueG1sMmpzID0gcmVxdWlyZSgneG1sMmpzJyk7XG5cbmZzID0gcmVxdWlyZSgnZnMnKTtcblxucGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxubWtkaXJwID0gcmVxdWlyZSgnbWtkaXJwJyk7XG5cbmxvZ2dlciA9IG5ldyBMb2dnZXIoJ0V4cG9ydF9UT19YTUwnKTtcblxuX3dyaXRlWG1sRmlsZSA9IGZ1bmN0aW9uKGpzb25PYmosIG9iak5hbWUpIHtcbiAgdmFyIGJ1aWxkZXIsIGRheSwgZmlsZUFkZHJlc3MsIGZpbGVOYW1lLCBmaWxlUGF0aCwgbW9udGgsIG5vdywgc3RyZWFtLCB4bWwsIHllYXI7XG4gIGJ1aWxkZXIgPSBuZXcgeG1sMmpzLkJ1aWxkZXIoKTtcbiAgeG1sID0gYnVpbGRlci5idWlsZE9iamVjdChqc29uT2JqKTtcbiAgc3RyZWFtID0gbmV3IEJ1ZmZlcih4bWwpO1xuICBub3cgPSBuZXcgRGF0ZTtcbiAgeWVhciA9IG5vdy5nZXRGdWxsWWVhcigpO1xuICBtb250aCA9IG5vdy5nZXRNb250aCgpICsgMTtcbiAgZGF5ID0gbm93LmdldERhdGUoKTtcbiAgZmlsZVBhdGggPSBwYXRoLmpvaW4oX19tZXRlb3JfYm9vdHN0cmFwX18uc2VydmVyRGlyLCAnLi4vLi4vLi4vZXhwb3J0LycgKyB5ZWFyICsgJy8nICsgbW9udGggKyAnLycgKyBkYXkgKyAnLycgKyBvYmpOYW1lKTtcbiAgZmlsZU5hbWUgPSAoanNvbk9iaiAhPSBudWxsID8ganNvbk9iai5faWQgOiB2b2lkIDApICsgXCIueG1sXCI7XG4gIGZpbGVBZGRyZXNzID0gcGF0aC5qb2luKGZpbGVQYXRoLCBmaWxlTmFtZSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBta2RpcnAuc3luYyhmaWxlUGF0aCk7XG4gIH1cbiAgZnMud3JpdGVGaWxlKGZpbGVBZGRyZXNzLCBzdHJlYW0sIGZ1bmN0aW9uKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoanNvbk9iai5faWQgKyBcIuWGmeWFpXhtbOaWh+S7tuWksei0pVwiLCBlcnIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aDtcbn07XG5cbl9taXhGaWVsZHNEYXRhID0gZnVuY3Rpb24ob2JqLCBvYmpOYW1lKSB7XG4gIHZhciBqc29uT2JqLCBtaXhCb29sLCBtaXhEYXRlLCBtaXhEZWZhdWx0LCBvYmpGaWVsZHMsIHJlZjtcbiAganNvbk9iaiA9IHt9O1xuICBvYmpGaWVsZHMgPSB0eXBlb2YgQ3JlYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDcmVhdG9yICE9PSBudWxsID8gKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iak5hbWUpKSAhPSBudWxsID8gcmVmLmZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgbWl4RGVmYXVsdCA9IGZ1bmN0aW9uKGZpZWxkX25hbWUpIHtcbiAgICByZXR1cm4ganNvbk9ialtmaWVsZF9uYW1lXSA9IG9ialtmaWVsZF9uYW1lXSB8fCBcIlwiO1xuICB9O1xuICBtaXhEYXRlID0gZnVuY3Rpb24oZmllbGRfbmFtZSwgdHlwZSkge1xuICAgIHZhciBkYXRlLCBkYXRlU3RyLCBmb3JtYXQ7XG4gICAgZGF0ZSA9IG9ialtmaWVsZF9uYW1lXTtcbiAgICBpZiAodHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIGZvcm1hdCA9IFwiWVlZWS1NTS1ERFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtYXQgPSBcIllZWVktTU0tREQgSEg6bW06c3NcIjtcbiAgICB9XG4gICAgaWYgKChkYXRlICE9IG51bGwpICYmIChmb3JtYXQgIT0gbnVsbCkpIHtcbiAgICAgIGRhdGVTdHIgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KGZvcm1hdCk7XG4gICAgfVxuICAgIHJldHVybiBqc29uT2JqW2ZpZWxkX25hbWVdID0gZGF0ZVN0ciB8fCBcIlwiO1xuICB9O1xuICBtaXhCb29sID0gZnVuY3Rpb24oZmllbGRfbmFtZSkge1xuICAgIGlmIChvYmpbZmllbGRfbmFtZV0gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBqc29uT2JqW2ZpZWxkX25hbWVdID0gXCLmmK9cIjtcbiAgICB9IGVsc2UgaWYgKG9ialtmaWVsZF9uYW1lXSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBqc29uT2JqW2ZpZWxkX25hbWVdID0gXCLlkKZcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGpzb25PYmpbZmllbGRfbmFtZV0gPSBcIlwiO1xuICAgIH1cbiAgfTtcbiAgXy5lYWNoKG9iakZpZWxkcywgZnVuY3Rpb24oZmllbGQsIGZpZWxkX25hbWUpIHtcbiAgICBzd2l0Y2ggKGZpZWxkICE9IG51bGwgPyBmaWVsZC50eXBlIDogdm9pZCAwKSB7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIHJldHVybiBtaXhEYXRlKGZpZWxkX25hbWUsIGZpZWxkLnR5cGUpO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIG1peEJvb2woZmllbGRfbmFtZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbWl4RGVmYXVsdChmaWVsZF9uYW1lKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ganNvbk9iajtcbn07XG5cbl9taXhSZWxhdGVkRGF0YSA9IGZ1bmN0aW9uKG9iaiwgb2JqTmFtZSkge1xuICB2YXIgcmVsYXRlZE9iak5hbWVzLCByZWxhdGVkX29iamVjdHM7XG4gIHJlbGF0ZWRfb2JqZWN0cyA9IHt9O1xuICByZWxhdGVkT2JqTmFtZXMgPSB0eXBlb2YgQ3JlYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDcmVhdG9yICE9PSBudWxsID8gQ3JlYXRvci5nZXRBbGxSZWxhdGVkT2JqZWN0cyhvYmpOYW1lKSA6IHZvaWQgMDtcbiAgcmVsYXRlZE9iak5hbWVzLmZvckVhY2goZnVuY3Rpb24ocmVsYXRlZE9iak5hbWUpIHtcbiAgICB2YXIgZmllbGRzLCBvYmoxLCByZWYsIHJlbGF0ZWRDb2xsZWN0aW9uLCByZWxhdGVkUmVjb3JkTGlzdCwgcmVsYXRlZFRhYmxlRGF0YSwgcmVsYXRlZF9maWVsZF9uYW1lO1xuICAgIHJlbGF0ZWRUYWJsZURhdGEgPSBbXTtcbiAgICBpZiAocmVsYXRlZE9iak5hbWUgPT09IFwiY21zX2ZpbGVzXCIpIHtcbiAgICAgIHJlbGF0ZWRfZmllbGRfbmFtZSA9IFwicGFyZW50Lmlkc1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZHMgPSB0eXBlb2YgQ3JlYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDcmVhdG9yICE9PSBudWxsID8gKHJlZiA9IENyZWF0b3IuT2JqZWN0c1tyZWxhdGVkT2JqTmFtZV0pICE9IG51bGwgPyByZWYuZmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgcmVsYXRlZF9maWVsZF9uYW1lID0gXCJcIjtcbiAgICAgIF8uZWFjaChmaWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZF9uYW1lKSB7XG4gICAgICAgIGlmICgoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnJlZmVyZW5jZV90byA6IHZvaWQgMCkgPT09IG9iak5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcmVsYXRlZF9maWVsZF9uYW1lID0gZmllbGRfbmFtZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChyZWxhdGVkX2ZpZWxkX25hbWUpIHtcbiAgICAgIHJlbGF0ZWRDb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlbGF0ZWRPYmpOYW1lKTtcbiAgICAgIHJlbGF0ZWRSZWNvcmRMaXN0ID0gcmVsYXRlZENvbGxlY3Rpb24uZmluZCgoXG4gICAgICAgIG9iajEgPSB7fSxcbiAgICAgICAgb2JqMVtcIlwiICsgcmVsYXRlZF9maWVsZF9uYW1lXSA9IG9iai5faWQsXG4gICAgICAgIG9iajFcbiAgICAgICkpLmZldGNoKCk7XG4gICAgICByZWxhdGVkUmVjb3JkTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHJlbGF0ZWRPYmopIHtcbiAgICAgICAgdmFyIGZpZWxkc0RhdGE7XG4gICAgICAgIGZpZWxkc0RhdGEgPSBfbWl4RmllbGRzRGF0YShyZWxhdGVkT2JqLCByZWxhdGVkT2JqTmFtZSk7XG4gICAgICAgIHJldHVybiByZWxhdGVkVGFibGVEYXRhLnB1c2goZmllbGRzRGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0c1tyZWxhdGVkT2JqTmFtZV0gPSByZWxhdGVkVGFibGVEYXRhO1xuICB9KTtcbiAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0cztcbn07XG5cbkNyZWF0b3IuRXhwb3J0MnhtbCA9IGZ1bmN0aW9uKG9iak5hbWUsIHJlY29yZExpc3QpIHtcbiAgdmFyIGNvbGxlY3Rpb247XG4gIGxvZ2dlci5pbmZvKFwiUnVuIENyZWF0b3IuRXhwb3J0MnhtbFwiKTtcbiAgY29uc29sZS50aW1lKFwiQ3JlYXRvci5FeHBvcnQyeG1sXCIpO1xuICBjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iak5hbWUpO1xuICByZWNvcmRMaXN0ID0gY29sbGVjdGlvbi5maW5kKHt9KS5mZXRjaCgpO1xuICByZWNvcmRMaXN0LmZvckVhY2goZnVuY3Rpb24ocmVjb3JkT2JqKSB7XG4gICAgdmFyIGZpZWxkc0RhdGEsIGZpbGVQYXRoLCBqc29uT2JqLCByZWxhdGVkX29iamVjdHM7XG4gICAganNvbk9iaiA9IHt9O1xuICAgIGpzb25PYmouX2lkID0gcmVjb3JkT2JqLl9pZDtcbiAgICBmaWVsZHNEYXRhID0gX21peEZpZWxkc0RhdGEocmVjb3JkT2JqLCBvYmpOYW1lKTtcbiAgICBqc29uT2JqW29iak5hbWVdID0gZmllbGRzRGF0YTtcbiAgICByZWxhdGVkX29iamVjdHMgPSBfbWl4UmVsYXRlZERhdGEocmVjb3JkT2JqLCBvYmpOYW1lKTtcbiAgICBqc29uT2JqW1wicmVsYXRlZF9vYmplY3RzXCJdID0gcmVsYXRlZF9vYmplY3RzO1xuICAgIHJldHVybiBmaWxlUGF0aCA9IF93cml0ZVhtbEZpbGUoanNvbk9iaiwgb2JqTmFtZSk7XG4gIH0pO1xuICBjb25zb2xlLnRpbWVFbmQoXCJDcmVhdG9yLkV4cG9ydDJ4bWxcIik7XG4gIHJldHVybiBmaWxlUGF0aDtcbn07XG4iLCJNZXRlb3IubWV0aG9kcyBcblx0cmVsYXRlZF9vYmplY3RzX3JlY29yZHM6IChvYmplY3RfbmFtZSwgcmVsYXRlZF9vYmplY3RfbmFtZSwgcmVsYXRlZF9maWVsZF9uYW1lLCByZWNvcmRfaWQsIHNwYWNlSWQpLT5cblx0XHR1c2VySWQgPSB0aGlzLnVzZXJJZFxuXHRcdGlmIHJlbGF0ZWRfb2JqZWN0X25hbWUgPT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiXG5cdFx0XHRzZWxlY3RvciA9IHtcIm1ldGFkYXRhLnNwYWNlXCI6IHNwYWNlSWR9XG5cdFx0ZWxzZVxuXHRcdFx0c2VsZWN0b3IgPSB7c3BhY2U6IHNwYWNlSWR9XG5cdFx0XG5cdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0XHQjIOmZhOS7tueahOWFs+iBlOaQnOe0ouadoeS7tuaYr+Wumuatu+eahFxuXHRcdFx0c2VsZWN0b3JbXCJwYXJlbnQub1wiXSA9IG9iamVjdF9uYW1lXG5cdFx0XHRzZWxlY3RvcltcInBhcmVudC5pZHNcIl0gPSBbcmVjb3JkX2lkXVxuXHRcdGVsc2Vcblx0XHRcdHNlbGVjdG9yW3JlbGF0ZWRfZmllbGRfbmFtZV0gPSByZWNvcmRfaWRcblxuXHRcdHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhyZWxhdGVkX29iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdFx0aWYgIXBlcm1pc3Npb25zLnZpZXdBbGxSZWNvcmRzIGFuZCBwZXJtaXNzaW9ucy5hbGxvd1JlYWRcblx0XHRcdHNlbGVjdG9yLm93bmVyID0gdXNlcklkXG5cdFx0XG5cdFx0cmVsYXRlZF9yZWNvcmRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlbGF0ZWRfb2JqZWN0X25hbWUpLmZpbmQoc2VsZWN0b3IpXG5cdFx0cmV0dXJuIHJlbGF0ZWRfcmVjb3Jkcy5jb3VudCgpIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICByZWxhdGVkX29iamVjdHNfcmVjb3JkczogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlbGF0ZWRfb2JqZWN0X25hbWUsIHJlbGF0ZWRfZmllbGRfbmFtZSwgcmVjb3JkX2lkLCBzcGFjZUlkKSB7XG4gICAgdmFyIHBlcm1pc3Npb25zLCByZWxhdGVkX3JlY29yZHMsIHNlbGVjdG9yLCB1c2VySWQ7XG4gICAgdXNlcklkID0gdGhpcy51c2VySWQ7XG4gICAgaWYgKHJlbGF0ZWRfb2JqZWN0X25hbWUgPT09IFwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIikge1xuICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgIFwibWV0YWRhdGEuc3BhY2VcIjogc3BhY2VJZFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocmVsYXRlZF9vYmplY3RfbmFtZSA9PT0gXCJjbXNfZmlsZXNcIikge1xuICAgICAgc2VsZWN0b3JbXCJwYXJlbnQub1wiXSA9IG9iamVjdF9uYW1lO1xuICAgICAgc2VsZWN0b3JbXCJwYXJlbnQuaWRzXCJdID0gW3JlY29yZF9pZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdG9yW3JlbGF0ZWRfZmllbGRfbmFtZV0gPSByZWNvcmRfaWQ7XG4gICAgfVxuICAgIHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhyZWxhdGVkX29iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpO1xuICAgIGlmICghcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgJiYgcGVybWlzc2lvbnMuYWxsb3dSZWFkKSB7XG4gICAgICBzZWxlY3Rvci5vd25lciA9IHVzZXJJZDtcbiAgICB9XG4gICAgcmVsYXRlZF9yZWNvcmRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlbGF0ZWRfb2JqZWN0X25hbWUpLmZpbmQoc2VsZWN0b3IpO1xuICAgIHJldHVybiByZWxhdGVkX3JlY29yZHMuY291bnQoKTtcbiAgfVxufSk7XG4iLCJNZXRlb3IubWV0aG9kc1xuXHRnZXRQZW5kaW5nU3BhY2VJbmZvOiAoaW52aXRlcklkLCBzcGFjZUlkKS0+XG5cdFx0aW52aXRlck5hbWUgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6IGludml0ZXJJZH0pLm5hbWVcblx0XHRzcGFjZU5hbWUgPSBkYi5zcGFjZXMuZmluZE9uZSh7X2lkOiBzcGFjZUlkfSkubmFtZVxuXG5cdFx0cmV0dXJuIHtpbnZpdGVyOiBpbnZpdGVyTmFtZSwgc3BhY2U6IHNwYWNlTmFtZX1cblxuXHRyZWZ1c2VKb2luU3BhY2U6IChfaWQpLT5cblx0XHRkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtfaWQ6IF9pZH0seyRzZXQ6IHtpbnZpdGVfc3RhdGU6IFwicmVmdXNlZFwifX0pXG5cblx0YWNjZXB0Sm9pblNwYWNlOiAoX2lkKS0+XG5cdFx0ZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7X2lkOiBfaWR9LHskc2V0OiB7aW52aXRlX3N0YXRlOiBcImFjY2VwdGVkXCIsIHVzZXJfYWNjZXB0ZWQ6IHRydWV9fSlcblxuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICBnZXRQZW5kaW5nU3BhY2VJbmZvOiBmdW5jdGlvbihpbnZpdGVySWQsIHNwYWNlSWQpIHtcbiAgICB2YXIgaW52aXRlck5hbWUsIHNwYWNlTmFtZTtcbiAgICBpbnZpdGVyTmFtZSA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnZpdGVySWRcbiAgICB9KS5uYW1lO1xuICAgIHNwYWNlTmFtZSA9IGRiLnNwYWNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogc3BhY2VJZFxuICAgIH0pLm5hbWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGludml0ZXI6IGludml0ZXJOYW1lLFxuICAgICAgc3BhY2U6IHNwYWNlTmFtZVxuICAgIH07XG4gIH0sXG4gIHJlZnVzZUpvaW5TcGFjZTogZnVuY3Rpb24oX2lkKSB7XG4gICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgX2lkOiBfaWRcbiAgICB9LCB7XG4gICAgICAkc2V0OiB7XG4gICAgICAgIGludml0ZV9zdGF0ZTogXCJyZWZ1c2VkXCJcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgYWNjZXB0Sm9pblNwYWNlOiBmdW5jdGlvbihfaWQpIHtcbiAgICByZXR1cm4gZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICBfaWQ6IF9pZFxuICAgIH0sIHtcbiAgICAgICRzZXQ6IHtcbiAgICAgICAgaW52aXRlX3N0YXRlOiBcImFjY2VwdGVkXCIsXG4gICAgICAgIHVzZXJfYWNjZXB0ZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG4iLCJNZXRlb3IucHVibGlzaCBcImNyZWF0b3Jfb2JqZWN0X3JlY29yZFwiLCAob2JqZWN0X25hbWUsIGlkLCBzcGFjZV9pZCktPlxuXHRjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lLCBzcGFjZV9pZClcblx0aWYgY29sbGVjdGlvblxuXHRcdHJldHVybiBjb2xsZWN0aW9uLmZpbmQoe19pZDogaWR9KVxuXG4iLCJNZXRlb3IucHVibGlzaChcImNyZWF0b3Jfb2JqZWN0X3JlY29yZFwiLCBmdW5jdGlvbihvYmplY3RfbmFtZSwgaWQsIHNwYWNlX2lkKSB7XG4gIHZhciBjb2xsZWN0aW9uO1xuICBjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lLCBzcGFjZV9pZCk7XG4gIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uZmluZCh7XG4gICAgICBfaWQ6IGlkXG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgXCJzdGVlZG9zX29iamVjdF90YWJ1bGFyXCIsICh0YWJsZU5hbWUsIGlkcywgZmllbGRzLCBzcGFjZUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuXG5cdF9vYmplY3RfbmFtZSA9IHRhYmxlTmFtZS5yZXBsYWNlKFwiY3JlYXRvcl9cIixcIlwiKVxuXHRfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QoX29iamVjdF9uYW1lLCBzcGFjZUlkKVxuXG5cdGlmIHNwYWNlSWRcblx0XHRfb2JqZWN0X25hbWUgPSBDcmVhdG9yLmdldE9iamVjdE5hbWUoX29iamVjdClcblxuXHRvYmplY3RfY29sbGVjaXRvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihfb2JqZWN0X25hbWUpXG5cblxuXHRfZmllbGRzID0gX29iamVjdD8uZmllbGRzXG5cdGlmICFfZmllbGRzIHx8ICFvYmplY3RfY29sbGVjaXRvblxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZWZlcmVuY2VfZmllbGRzID0gXy5maWx0ZXIgX2ZpZWxkcywgKGYpLT5cblx0XHRyZXR1cm4gXy5pc0Z1bmN0aW9uKGYucmVmZXJlbmNlX3RvKSB8fCAhXy5pc0VtcHR5KGYucmVmZXJlbmNlX3RvKVxuXG5cdHNlbGYgPSB0aGlzXG5cblx0c2VsZi51bmJsb2NrKCk7XG5cblx0aWYgcmVmZXJlbmNlX2ZpZWxkcy5sZW5ndGggPiAwXG5cdFx0ZGF0YSA9IHtcblx0XHRcdGZpbmQ6ICgpLT5cblx0XHRcdFx0c2VsZi51bmJsb2NrKCk7XG5cdFx0XHRcdGZpZWxkX2tleXMgPSB7fVxuXHRcdFx0XHRfLmVhY2ggXy5rZXlzKGZpZWxkcyksIChmKS0+XG5cdFx0XHRcdFx0dW5sZXNzIC9cXHcrKFxcLlxcJCl7MX1cXHc/Ly50ZXN0KGYpXG5cdFx0XHRcdFx0XHRmaWVsZF9rZXlzW2ZdID0gMVxuXHRcdFx0XHRcblx0XHRcdFx0cmV0dXJuIG9iamVjdF9jb2xsZWNpdG9uLmZpbmQoe19pZDogeyRpbjogaWRzfX0sIHtmaWVsZHM6IGZpZWxkX2tleXN9KTtcblx0XHR9XG5cblx0XHRkYXRhLmNoaWxkcmVuID0gW11cblxuXHRcdGtleXMgPSBfLmtleXMoZmllbGRzKVxuXG5cdFx0aWYga2V5cy5sZW5ndGggPCAxXG5cdFx0XHRrZXlzID0gXy5rZXlzKF9maWVsZHMpXG5cblx0XHRfa2V5cyA9IFtdXG5cblx0XHRrZXlzLmZvckVhY2ggKGtleSktPlxuXHRcdFx0aWYgX29iamVjdC5zY2hlbWEuX29iamVjdEtleXNba2V5ICsgJy4nXVxuXHRcdFx0XHRfa2V5cyA9IF9rZXlzLmNvbmNhdChfLm1hcChfb2JqZWN0LnNjaGVtYS5fb2JqZWN0S2V5c1trZXkgKyAnLiddLCAoayktPlxuXHRcdFx0XHRcdHJldHVybiBrZXkgKyAnLicgKyBrXG5cdFx0XHRcdCkpXG5cdFx0XHRfa2V5cy5wdXNoKGtleSlcblxuXHRcdF9rZXlzLmZvckVhY2ggKGtleSktPlxuXHRcdFx0cmVmZXJlbmNlX2ZpZWxkID0gX2ZpZWxkc1trZXldXG5cblx0XHRcdGlmIHJlZmVyZW5jZV9maWVsZCAmJiAoXy5pc0Z1bmN0aW9uKHJlZmVyZW5jZV9maWVsZC5yZWZlcmVuY2VfdG8pIHx8ICFfLmlzRW1wdHkocmVmZXJlbmNlX2ZpZWxkLnJlZmVyZW5jZV90bykpICAjIGFuZCBDcmVhdG9yLkNvbGxlY3Rpb25zW3JlZmVyZW5jZV9maWVsZC5yZWZlcmVuY2VfdG9dXG5cdFx0XHRcdGRhdGEuY2hpbGRyZW4ucHVzaCB7XG5cdFx0XHRcdFx0ZmluZDogKHBhcmVudCkgLT5cblx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHRzZWxmLnVuYmxvY2soKTtcblxuXHRcdFx0XHRcdFx0XHRxdWVyeSA9IHt9XG5cblx0XHRcdFx0XHRcdFx0IyDooajmoLzlrZDlrZfmrrXnibnmrorlpITnkIZcblx0XHRcdFx0XHRcdFx0aWYgL1xcdysoXFwuXFwkXFwuKXsxfVxcdysvLnRlc3Qoa2V5KVxuXHRcdFx0XHRcdFx0XHRcdHBfayA9IGtleS5yZXBsYWNlKC8oXFx3KylcXC5cXCRcXC5cXHcrL2lnLCBcIiQxXCIpXG5cdFx0XHRcdFx0XHRcdFx0c19rID0ga2V5LnJlcGxhY2UoL1xcdytcXC5cXCRcXC4oXFx3KykvaWcsIFwiJDFcIilcblx0XHRcdFx0XHRcdFx0XHRyZWZlcmVuY2VfaWRzID0gcGFyZW50W3Bfa10uZ2V0UHJvcGVydHkoc19rKVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlX2lkcyA9IGtleS5zcGxpdCgnLicpLnJlZHVjZSAobywgeCkgLT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0bz9beF1cblx0XHRcdFx0XHRcdFx0XHQsIHBhcmVudFxuXG5cdFx0XHRcdFx0XHRcdHJlZmVyZW5jZV90byA9IHJlZmVyZW5jZV9maWVsZC5yZWZlcmVuY2VfdG9cblxuXHRcdFx0XHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24ocmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdFx0XHRcdHJlZmVyZW5jZV90byA9IHJlZmVyZW5jZV90bygpXG5cblx0XHRcdFx0XHRcdFx0aWYgXy5pc0FycmF5KHJlZmVyZW5jZV90bylcblx0XHRcdFx0XHRcdFx0XHRpZiBfLmlzT2JqZWN0KHJlZmVyZW5jZV9pZHMpICYmICFfLmlzQXJyYXkocmVmZXJlbmNlX2lkcylcblx0XHRcdFx0XHRcdFx0XHRcdHJlZmVyZW5jZV90byA9IHJlZmVyZW5jZV9pZHMub1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlX2lkcyA9IHJlZmVyZW5jZV9pZHMuaWRzIHx8IFtdXG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFtdXG5cblx0XHRcdFx0XHRcdFx0aWYgXy5pc0FycmF5KHJlZmVyZW5jZV9pZHMpXG5cdFx0XHRcdFx0XHRcdFx0cXVlcnkuX2lkID0geyRpbjogcmVmZXJlbmNlX2lkc31cblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdHF1ZXJ5Ll9pZCA9IHJlZmVyZW5jZV9pZHNcblxuXHRcdFx0XHRcdFx0XHRyZWZlcmVuY2VfdG9fb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QocmVmZXJlbmNlX3RvLCBzcGFjZUlkKVxuXG5cdFx0XHRcdFx0XHRcdG5hbWVfZmllbGRfa2V5ID0gcmVmZXJlbmNlX3RvX29iamVjdC5OQU1FX0ZJRUxEX0tFWVxuXG5cdFx0XHRcdFx0XHRcdGNoaWxkcmVuX2ZpZWxkcyA9IHtfaWQ6IDEsIHNwYWNlOiAxfVxuXG5cdFx0XHRcdFx0XHRcdGlmIG5hbWVfZmllbGRfa2V5XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRyZW5fZmllbGRzW25hbWVfZmllbGRfa2V5XSA9IDFcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlZmVyZW5jZV90bywgc3BhY2VJZCkuZmluZChxdWVyeSwge1xuXHRcdFx0XHRcdFx0XHRcdGZpZWxkczogY2hpbGRyZW5fZmllbGRzXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhyZWZlcmVuY2VfdG8sIHBhcmVudCwgZSlcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFtdXG5cdFx0XHRcdH1cblxuXHRcdHJldHVybiBkYXRhXG5cdGVsc2Vcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmluZDogKCktPlxuXHRcdFx0XHRzZWxmLnVuYmxvY2soKTtcblx0XHRcdFx0cmV0dXJuIG9iamVjdF9jb2xsZWNpdG9uLmZpbmQoe19pZDogeyRpbjogaWRzfX0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0fTtcblxuIiwiTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUoXCJzdGVlZG9zX29iamVjdF90YWJ1bGFyXCIsIGZ1bmN0aW9uKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMsIHNwYWNlSWQpIHtcbiAgdmFyIF9maWVsZHMsIF9rZXlzLCBfb2JqZWN0LCBfb2JqZWN0X25hbWUsIGRhdGEsIGtleXMsIG9iamVjdF9jb2xsZWNpdG9uLCByZWZlcmVuY2VfZmllbGRzLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICBfb2JqZWN0X25hbWUgPSB0YWJsZU5hbWUucmVwbGFjZShcImNyZWF0b3JfXCIsIFwiXCIpO1xuICBfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QoX29iamVjdF9uYW1lLCBzcGFjZUlkKTtcbiAgaWYgKHNwYWNlSWQpIHtcbiAgICBfb2JqZWN0X25hbWUgPSBDcmVhdG9yLmdldE9iamVjdE5hbWUoX29iamVjdCk7XG4gIH1cbiAgb2JqZWN0X2NvbGxlY2l0b24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oX29iamVjdF9uYW1lKTtcbiAgX2ZpZWxkcyA9IF9vYmplY3QgIT0gbnVsbCA/IF9vYmplY3QuZmllbGRzIDogdm9pZCAwO1xuICBpZiAoIV9maWVsZHMgfHwgIW9iamVjdF9jb2xsZWNpdG9uKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZWZlcmVuY2VfZmllbGRzID0gXy5maWx0ZXIoX2ZpZWxkcywgZnVuY3Rpb24oZikge1xuICAgIHJldHVybiBfLmlzRnVuY3Rpb24oZi5yZWZlcmVuY2VfdG8pIHx8ICFfLmlzRW1wdHkoZi5yZWZlcmVuY2VfdG8pO1xuICB9KTtcbiAgc2VsZiA9IHRoaXM7XG4gIHNlbGYudW5ibG9jaygpO1xuICBpZiAocmVmZXJlbmNlX2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgZGF0YSA9IHtcbiAgICAgIGZpbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmllbGRfa2V5cztcbiAgICAgICAgc2VsZi51bmJsb2NrKCk7XG4gICAgICAgIGZpZWxkX2tleXMgPSB7fTtcbiAgICAgICAgXy5lYWNoKF8ua2V5cyhmaWVsZHMpLCBmdW5jdGlvbihmKSB7XG4gICAgICAgICAgaWYgKCEvXFx3KyhcXC5cXCQpezF9XFx3Py8udGVzdChmKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkX2tleXNbZl0gPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmplY3RfY29sbGVjaXRvbi5maW5kKHtcbiAgICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAgICRpbjogaWRzXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiBmaWVsZF9rZXlzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgZGF0YS5jaGlsZHJlbiA9IFtdO1xuICAgIGtleXMgPSBfLmtleXMoZmllbGRzKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPCAxKSB7XG4gICAgICBrZXlzID0gXy5rZXlzKF9maWVsZHMpO1xuICAgIH1cbiAgICBfa2V5cyA9IFtdO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGlmIChfb2JqZWN0LnNjaGVtYS5fb2JqZWN0S2V5c1trZXkgKyAnLiddKSB7XG4gICAgICAgIF9rZXlzID0gX2tleXMuY29uY2F0KF8ubWFwKF9vYmplY3Quc2NoZW1hLl9vYmplY3RLZXlzW2tleSArICcuJ10sIGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICByZXR1cm4ga2V5ICsgJy4nICsgaztcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9rZXlzLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBfa2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIHJlZmVyZW5jZV9maWVsZDtcbiAgICAgIHJlZmVyZW5jZV9maWVsZCA9IF9maWVsZHNba2V5XTtcbiAgICAgIGlmIChyZWZlcmVuY2VfZmllbGQgJiYgKF8uaXNGdW5jdGlvbihyZWZlcmVuY2VfZmllbGQucmVmZXJlbmNlX3RvKSB8fCAhXy5pc0VtcHR5KHJlZmVyZW5jZV9maWVsZC5yZWZlcmVuY2VfdG8pKSkge1xuICAgICAgICByZXR1cm4gZGF0YS5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICBmaW5kOiBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbl9maWVsZHMsIGUsIG5hbWVfZmllbGRfa2V5LCBwX2ssIHF1ZXJ5LCByZWZlcmVuY2VfaWRzLCByZWZlcmVuY2VfdG8sIHJlZmVyZW5jZV90b19vYmplY3QsIHNfaztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHNlbGYudW5ibG9jaygpO1xuICAgICAgICAgICAgICBxdWVyeSA9IHt9O1xuICAgICAgICAgICAgICBpZiAoL1xcdysoXFwuXFwkXFwuKXsxfVxcdysvLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgIHBfayA9IGtleS5yZXBsYWNlKC8oXFx3KylcXC5cXCRcXC5cXHcrL2lnLCBcIiQxXCIpO1xuICAgICAgICAgICAgICAgIHNfayA9IGtleS5yZXBsYWNlKC9cXHcrXFwuXFwkXFwuKFxcdyspL2lnLCBcIiQxXCIpO1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pZHMgPSBwYXJlbnRbcF9rXS5nZXRQcm9wZXJ0eShzX2spO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pZHMgPSBrZXkuc3BsaXQoJy4nKS5yZWR1Y2UoZnVuY3Rpb24obywgeCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG8gIT0gbnVsbCA/IG9beF0gOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgfSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWZlcmVuY2VfdG8gPSByZWZlcmVuY2VfZmllbGQucmVmZXJlbmNlX3RvO1xuICAgICAgICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHJlZmVyZW5jZV90bykpIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VfdG8gPSByZWZlcmVuY2VfdG8oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXy5pc0FycmF5KHJlZmVyZW5jZV90bykpIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChyZWZlcmVuY2VfaWRzKSAmJiAhXy5pc0FycmF5KHJlZmVyZW5jZV9pZHMpKSB7XG4gICAgICAgICAgICAgICAgICByZWZlcmVuY2VfdG8gPSByZWZlcmVuY2VfaWRzLm87XG4gICAgICAgICAgICAgICAgICByZWZlcmVuY2VfaWRzID0gcmVmZXJlbmNlX2lkcy5pZHMgfHwgW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKF8uaXNBcnJheShyZWZlcmVuY2VfaWRzKSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5Ll9pZCA9IHtcbiAgICAgICAgICAgICAgICAgICRpbjogcmVmZXJlbmNlX2lkc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVlcnkuX2lkID0gcmVmZXJlbmNlX2lkcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWZlcmVuY2VfdG9fb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QocmVmZXJlbmNlX3RvLCBzcGFjZUlkKTtcbiAgICAgICAgICAgICAgbmFtZV9maWVsZF9rZXkgPSByZWZlcmVuY2VfdG9fb2JqZWN0Lk5BTUVfRklFTERfS0VZO1xuICAgICAgICAgICAgICBjaGlsZHJlbl9maWVsZHMgPSB7XG4gICAgICAgICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgICAgICAgIHNwYWNlOiAxXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChuYW1lX2ZpZWxkX2tleSkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuX2ZpZWxkc1tuYW1lX2ZpZWxkX2tleV0gPSAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVmZXJlbmNlX3RvLCBzcGFjZUlkKS5maW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgZmllbGRzOiBjaGlsZHJlbl9maWVsZHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlZmVyZW5jZV90bywgcGFyZW50LCBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLnVuYmxvY2soKTtcbiAgICAgICAgcmV0dXJuIG9iamVjdF9jb2xsZWNpdG9uLmZpbmQoe1xuICAgICAgICAgIF9pZDoge1xuICAgICAgICAgICAgJGluOiBpZHNcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoIFwib2JqZWN0X2xpc3R2aWV3c1wiLCAob2JqZWN0X25hbWUsIHNwYWNlSWQpLT5cbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZFxuICAgIHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvYmplY3RfbGlzdHZpZXdzXCIpLmZpbmQoe29iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgc3BhY2U6IHNwYWNlSWQgLFwiJG9yXCI6W3tvd25lcjogdXNlcklkfSwge3NoYXJlZDogdHJ1ZX1dfSkiLCJNZXRlb3IucHVibGlzaCBcInVzZXJfdGFidWxhcl9zZXR0aW5nc1wiLCAob2JqZWN0X25hbWUpLT5cbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZFxuICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmQoe29iamVjdF9uYW1lOiB7JGluOiBvYmplY3RfbmFtZX0sIHJlY29yZF9pZDogeyRpbjogW1wib2JqZWN0X2xpc3R2aWV3c1wiLCBcIm9iamVjdF9ncmlkdmlld3NcIl19LCBvd25lcjogdXNlcklkfSlcbiIsIk1ldGVvci5wdWJsaXNoIFwicmVsYXRlZF9vYmplY3RzX3JlY29yZHNcIiwgKG9iamVjdF9uYW1lLCByZWxhdGVkX29iamVjdF9uYW1lLCByZWxhdGVkX2ZpZWxkX25hbWUsIHJlY29yZF9pZCwgc3BhY2VJZCktPlxuXHR1c2VySWQgPSB0aGlzLnVzZXJJZFxuXHRpZiByZWxhdGVkX29iamVjdF9uYW1lID09IFwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIlxuXHRcdHNlbGVjdG9yID0ge1wibWV0YWRhdGEuc3BhY2VcIjogc3BhY2VJZH1cblx0ZWxzZVxuXHRcdHNlbGVjdG9yID0ge3NwYWNlOiBzcGFjZUlkfVxuXHRcblx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0IyDpmYTku7bnmoTlhbPogZTmkJzntKLmnaHku7bmmK/lrprmrbvnmoRcblx0XHRzZWxlY3RvcltcInBhcmVudC5vXCJdID0gb2JqZWN0X25hbWVcblx0XHRzZWxlY3RvcltcInBhcmVudC5pZHNcIl0gPSBbcmVjb3JkX2lkXVxuXHRlbHNlXG5cdFx0c2VsZWN0b3JbcmVsYXRlZF9maWVsZF9uYW1lXSA9IHJlY29yZF9pZFxuXG5cdHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhyZWxhdGVkX29iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdGlmICFwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyBhbmQgcGVybWlzc2lvbnMuYWxsb3dSZWFkXG5cdFx0c2VsZWN0b3Iub3duZXIgPSB1c2VySWRcblx0XG5cdHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVsYXRlZF9vYmplY3RfbmFtZSkuZmluZChzZWxlY3RvcikiLCJNZXRlb3IucHVibGlzaChcInJlbGF0ZWRfb2JqZWN0c19yZWNvcmRzXCIsIGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWxhdGVkX29iamVjdF9uYW1lLCByZWxhdGVkX2ZpZWxkX25hbWUsIHJlY29yZF9pZCwgc3BhY2VJZCkge1xuICB2YXIgcGVybWlzc2lvbnMsIHNlbGVjdG9yLCB1c2VySWQ7XG4gIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICBpZiAocmVsYXRlZF9vYmplY3RfbmFtZSA9PT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiKSB7XG4gICAgc2VsZWN0b3IgPSB7XG4gICAgICBcIm1ldGFkYXRhLnNwYWNlXCI6IHNwYWNlSWRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdG9yID0ge1xuICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICB9O1xuICB9XG4gIGlmIChyZWxhdGVkX29iamVjdF9uYW1lID09PSBcImNtc19maWxlc1wiKSB7XG4gICAgc2VsZWN0b3JbXCJwYXJlbnQub1wiXSA9IG9iamVjdF9uYW1lO1xuICAgIHNlbGVjdG9yW1wicGFyZW50Lmlkc1wiXSA9IFtyZWNvcmRfaWRdO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdG9yW3JlbGF0ZWRfZmllbGRfbmFtZV0gPSByZWNvcmRfaWQ7XG4gIH1cbiAgcGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gIGlmICghcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgJiYgcGVybWlzc2lvbnMuYWxsb3dSZWFkKSB7XG4gICAgc2VsZWN0b3Iub3duZXIgPSB1c2VySWQ7XG4gIH1cbiAgcmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWxhdGVkX29iamVjdF9uYW1lKS5maW5kKHNlbGVjdG9yKTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ3NwYWNlX3VzZXJfaW5mbycsIChzcGFjZUlkLCB1c2VySWQpLT5cblx0cmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmQoe3NwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWR9KSIsIlxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cblx0TWV0ZW9yLnB1Ymxpc2ggJ2NvbnRhY3RzX3ZpZXdfbGltaXRzJywgKHNwYWNlSWQpLT5cblxuXHRcdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdFx0dW5sZXNzIHNwYWNlSWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRcdHNlbGVjdG9yID1cblx0XHRcdHNwYWNlOiBzcGFjZUlkXG5cdFx0XHRrZXk6ICdjb250YWN0c192aWV3X2xpbWl0cydcblxuXHRcdHJldHVybiBkYi5zcGFjZV9zZXR0aW5ncy5maW5kKHNlbGVjdG9yKSIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLnB1Ymxpc2goJ2NvbnRhY3RzX3ZpZXdfbGltaXRzJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICAgIHZhciBzZWxlY3RvcjtcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICAgIH1cbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gICAgfVxuICAgIHNlbGVjdG9yID0ge1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBrZXk6ICdjb250YWN0c192aWV3X2xpbWl0cydcbiAgICB9O1xuICAgIHJldHVybiBkYi5zcGFjZV9zZXR0aW5ncy5maW5kKHNlbGVjdG9yKTtcbiAgfSk7XG59XG4iLCJcbmlmIE1ldGVvci5pc1NlcnZlclxuXG5cdE1ldGVvci5wdWJsaXNoICdjb250YWN0c19ub19mb3JjZV9waG9uZV91c2VycycsIChzcGFjZUlkKS0+XG5cblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0XHRzZWxlY3RvciA9XG5cdFx0XHRzcGFjZTogc3BhY2VJZFxuXHRcdFx0a2V5OiAnY29udGFjdHNfbm9fZm9yY2VfcGhvbmVfdXNlcnMnXG5cblx0XHRyZXR1cm4gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZChzZWxlY3RvcikiLCJpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5wdWJsaXNoKCdjb250YWN0c19ub19mb3JjZV9waG9uZV91c2VycycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgICB2YXIgc2VsZWN0b3I7XG4gICAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgICB9XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICAgIH1cbiAgICBzZWxlY3RvciA9IHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAga2V5OiAnY29udGFjdHNfbm9fZm9yY2VfcGhvbmVfdXNlcnMnXG4gICAgfTtcbiAgICByZXR1cm4gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZChzZWxlY3Rvcik7XG4gIH0pO1xufVxuIiwiaWYgTWV0ZW9yLmlzU2VydmVyXG5cdE1ldGVvci5wdWJsaXNoICdzcGFjZV9uZWVkX3RvX2NvbmZpcm0nLCAoKS0+XG5cdFx0dXNlcklkID0gdGhpcy51c2VySWRcblx0XHRyZXR1cm4gZGIuc3BhY2VfdXNlcnMuZmluZCh7dXNlcjogdXNlcklkLCBpbnZpdGVfc3RhdGU6IFwicGVuZGluZ1wifSkiLCJpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5wdWJsaXNoKCdzcGFjZV9uZWVkX3RvX2NvbmZpcm0nLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgdXNlcklkO1xuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICAgIHJldHVybiBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgIGludml0ZV9zdGF0ZTogXCJwZW5kaW5nXCJcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJwZXJtaXNzaW9uTWFuYWdlckZvckluaXRBcHByb3ZhbCA9IHt9XG5cbnBlcm1pc3Npb25NYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZsb3dQZXJtaXNzaW9ucyA9IChmbG93X2lkLCB1c2VyX2lkKSAtPlxuXHQjIOagueaNrjpmbG93X2lk5p+l5Yiw5a+55bqU55qEZmxvd1xuXHRmbG93ID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGbG93KGZsb3dfaWQpXG5cdHNwYWNlX2lkID0gZmxvdy5zcGFjZVxuXHQjIOagueaNrnNwYWNlX2lk5ZKMOnVzZXJfaWTliLBvcmdhbml6YXRpb25z6KGo5Lit5p+l5Yiw55So5oi35omA5bGe5omA5pyJ55qEb3JnX2lk77yI5YyF5ous5LiK57qn57uESUTvvIlcblx0b3JnX2lkcyA9IG5ldyBBcnJheVxuXHRvcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcblx0XHRzcGFjZTogc3BhY2VfaWQsIHVzZXJzOiB1c2VyX2lkIH0sIHsgZmllbGRzOiB7IHBhcmVudHM6IDEgfSB9KS5mZXRjaCgpXG5cdF8uZWFjaChvcmdhbml6YXRpb25zLCAob3JnKSAtPlxuXHRcdG9yZ19pZHMucHVzaChvcmcuX2lkKVxuXHRcdGlmIG9yZy5wYXJlbnRzXG5cdFx0XHRfLmVhY2gob3JnLnBhcmVudHMsIChwYXJlbnRfaWQpIC0+XG5cdFx0XHRcdG9yZ19pZHMucHVzaChwYXJlbnRfaWQpXG5cdFx0XHQpXG5cdClcblx0b3JnX2lkcyA9IF8udW5pcShvcmdfaWRzKVxuXHRteV9wZXJtaXNzaW9ucyA9IG5ldyBBcnJheVxuXHRpZiBmbG93LnBlcm1zXG5cdFx0IyDliKTmlq1mbG93LnBlcm1zLnVzZXJzX2Nhbl9hZG1pbuS4reaYr+WQpuWMheWQq+W9k+WJjeeUqOaIt++8jFxuXHRcdCMg5oiW6ICFZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZGTmmK/lkKbljIXlkKs05q2l5b6X5Yiw55qEb3JnX2lk5pWw57uE5Lit55qE5Lu75L2V5LiA5Liq77yMXG5cdFx0IyDoi6XmmK/vvIzliJnlnKjov5Tlm57nmoTmlbDnu4TkuK3liqDkuIphZGRcblx0XHRpZiBmbG93LnBlcm1zLnVzZXJzX2Nhbl9hZGRcblx0XHRcdHVzZXJzX2Nhbl9hZGQgPSBmbG93LnBlcm1zLnVzZXJzX2Nhbl9hZGRcblx0XHRcdGlmIHVzZXJzX2Nhbl9hZGQuaW5jbHVkZXModXNlcl9pZClcblx0XHRcdFx0bXlfcGVybWlzc2lvbnMucHVzaChcImFkZFwiKVxuXG5cdFx0aWYgZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZGRcblx0XHRcdG9yZ3NfY2FuX2FkZCA9IGZsb3cucGVybXMub3Jnc19jYW5fYWRkXG5cdFx0XHRfLmVhY2gob3JnX2lkcywgKG9yZ19pZCkgLT5cblx0XHRcdFx0aWYgb3Jnc19jYW5fYWRkLmluY2x1ZGVzKG9yZ19pZClcblx0XHRcdFx0XHRteV9wZXJtaXNzaW9ucy5wdXNoKFwiYWRkXCIpXG5cdFx0XHQpXG5cdFx0IyDliKTmlq1mbG93LnBlcm1zLnVzZXJzX2Nhbl9tb25pdG9y5Lit5piv5ZCm5YyF5ZCr5b2T5YmN55So5oi377yMXG5cdFx0IyDmiJbogIVmbG93LnBlcm1zLm9yZ3NfY2FuX21vbml0b3LmmK/lkKbljIXlkKs05q2l5b6X5Yiw55qEb3JnX2lk5pWw57uE5Lit55qE5Lu75L2V5LiA5Liq77yMXG5cdFx0IyDoi6XmmK/vvIzliJnlnKjov5Tlm57nmoTmlbDnu4TkuK3liqDkuIptb25pdG9yXG5cdFx0aWYgZmxvdy5wZXJtcy51c2Vyc19jYW5fbW9uaXRvclxuXHRcdFx0dXNlcnNfY2FuX21vbml0b3IgPSBmbG93LnBlcm1zLnVzZXJzX2Nhbl9tb25pdG9yXG5cdFx0XHRpZiB1c2Vyc19jYW5fbW9uaXRvci5pbmNsdWRlcyh1c2VyX2lkKVxuXHRcdFx0XHRteV9wZXJtaXNzaW9ucy5wdXNoKFwibW9uaXRvclwiKVxuXG5cdFx0aWYgZmxvdy5wZXJtcy5vcmdzX2Nhbl9tb25pdG9yXG5cdFx0XHRvcmdzX2Nhbl9tb25pdG9yID0gZmxvdy5wZXJtcy5vcmdzX2Nhbl9tb25pdG9yXG5cdFx0XHRfLmVhY2gob3JnX2lkcywgKG9yZ19pZCkgLT5cblx0XHRcdFx0aWYgb3Jnc19jYW5fbW9uaXRvci5pbmNsdWRlcyhvcmdfaWQpXG5cdFx0XHRcdFx0bXlfcGVybWlzc2lvbnMucHVzaChcIm1vbml0b3JcIilcblx0XHRcdClcblx0XHQjIOWIpOaWrWZsb3cucGVybXMudXNlcnNfY2FuX2FkbWlu5Lit5piv5ZCm5YyF5ZCr5b2T5YmN55So5oi377yMXG5cdFx0IyDmiJbogIVmbG93LnBlcm1zLm9yZ3NfY2FuX2FkbWlu5piv5ZCm5YyF5ZCrNOatpeW+l+WIsOeahG9yZ19pZOaVsOe7hOS4reeahOS7u+S9leS4gOS4qu+8jFxuXHRcdCMg6Iul5piv77yM5YiZ5Zyo6L+U5Zue55qE5pWw57uE5Lit5Yqg5LiKYWRtaW5cblx0XHRpZiBmbG93LnBlcm1zLnVzZXJzX2Nhbl9hZG1pblxuXHRcdFx0dXNlcnNfY2FuX2FkbWluID0gZmxvdy5wZXJtcy51c2Vyc19jYW5fYWRtaW5cblx0XHRcdGlmIHVzZXJzX2Nhbl9hZG1pbi5pbmNsdWRlcyh1c2VyX2lkKVxuXHRcdFx0XHRteV9wZXJtaXNzaW9ucy5wdXNoKFwiYWRtaW5cIilcblxuXHRcdGlmIGZsb3cucGVybXMub3Jnc19jYW5fYWRtaW5cblx0XHRcdG9yZ3NfY2FuX2FkbWluID0gZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZG1pblxuXHRcdFx0Xy5lYWNoKG9yZ19pZHMsIChvcmdfaWQpIC0+XG5cdFx0XHRcdGlmIG9yZ3NfY2FuX2FkbWluLmluY2x1ZGVzKG9yZ19pZClcblx0XHRcdFx0XHRteV9wZXJtaXNzaW9ucy5wdXNoKFwiYWRtaW5cIilcblx0XHRcdClcblxuXHRteV9wZXJtaXNzaW9ucyA9IF8udW5pcShteV9wZXJtaXNzaW9ucylcblx0cmV0dXJuIG15X3Blcm1pc3Npb25zIiwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5wZXJtaXNzaW9uTWFuYWdlckZvckluaXRBcHByb3ZhbCA9IHt9O1xuXG5wZXJtaXNzaW9uTWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGbG93UGVybWlzc2lvbnMgPSBmdW5jdGlvbihmbG93X2lkLCB1c2VyX2lkKSB7XG4gIHZhciBmbG93LCBteV9wZXJtaXNzaW9ucywgb3JnX2lkcywgb3JnYW5pemF0aW9ucywgb3Jnc19jYW5fYWRkLCBvcmdzX2Nhbl9hZG1pbiwgb3Jnc19jYW5fbW9uaXRvciwgc3BhY2VfaWQsIHVzZXJzX2Nhbl9hZGQsIHVzZXJzX2Nhbl9hZG1pbiwgdXNlcnNfY2FuX21vbml0b3I7XG4gIGZsb3cgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZsb3coZmxvd19pZCk7XG4gIHNwYWNlX2lkID0gZmxvdy5zcGFjZTtcbiAgb3JnX2lkcyA9IG5ldyBBcnJheTtcbiAgb3JnYW5pemF0aW9ucyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIHVzZXJzOiB1c2VyX2lkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHBhcmVudHM6IDFcbiAgICB9XG4gIH0pLmZldGNoKCk7XG4gIF8uZWFjaChvcmdhbml6YXRpb25zLCBmdW5jdGlvbihvcmcpIHtcbiAgICBvcmdfaWRzLnB1c2gob3JnLl9pZCk7XG4gICAgaWYgKG9yZy5wYXJlbnRzKSB7XG4gICAgICByZXR1cm4gXy5lYWNoKG9yZy5wYXJlbnRzLCBmdW5jdGlvbihwYXJlbnRfaWQpIHtcbiAgICAgICAgcmV0dXJuIG9yZ19pZHMucHVzaChwYXJlbnRfaWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgb3JnX2lkcyA9IF8udW5pcShvcmdfaWRzKTtcbiAgbXlfcGVybWlzc2lvbnMgPSBuZXcgQXJyYXk7XG4gIGlmIChmbG93LnBlcm1zKSB7XG4gICAgaWYgKGZsb3cucGVybXMudXNlcnNfY2FuX2FkZCkge1xuICAgICAgdXNlcnNfY2FuX2FkZCA9IGZsb3cucGVybXMudXNlcnNfY2FuX2FkZDtcbiAgICAgIGlmICh1c2Vyc19jYW5fYWRkLmluY2x1ZGVzKHVzZXJfaWQpKSB7XG4gICAgICAgIG15X3Blcm1pc3Npb25zLnB1c2goXCJhZGRcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbG93LnBlcm1zLm9yZ3NfY2FuX2FkZCkge1xuICAgICAgb3Jnc19jYW5fYWRkID0gZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZGQ7XG4gICAgICBfLmVhY2gob3JnX2lkcywgZnVuY3Rpb24ob3JnX2lkKSB7XG4gICAgICAgIGlmIChvcmdzX2Nhbl9hZGQuaW5jbHVkZXMob3JnX2lkKSkge1xuICAgICAgICAgIHJldHVybiBteV9wZXJtaXNzaW9ucy5wdXNoKFwiYWRkXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZsb3cucGVybXMudXNlcnNfY2FuX21vbml0b3IpIHtcbiAgICAgIHVzZXJzX2Nhbl9tb25pdG9yID0gZmxvdy5wZXJtcy51c2Vyc19jYW5fbW9uaXRvcjtcbiAgICAgIGlmICh1c2Vyc19jYW5fbW9uaXRvci5pbmNsdWRlcyh1c2VyX2lkKSkge1xuICAgICAgICBteV9wZXJtaXNzaW9ucy5wdXNoKFwibW9uaXRvclwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZsb3cucGVybXMub3Jnc19jYW5fbW9uaXRvcikge1xuICAgICAgb3Jnc19jYW5fbW9uaXRvciA9IGZsb3cucGVybXMub3Jnc19jYW5fbW9uaXRvcjtcbiAgICAgIF8uZWFjaChvcmdfaWRzLCBmdW5jdGlvbihvcmdfaWQpIHtcbiAgICAgICAgaWYgKG9yZ3NfY2FuX21vbml0b3IuaW5jbHVkZXMob3JnX2lkKSkge1xuICAgICAgICAgIHJldHVybiBteV9wZXJtaXNzaW9ucy5wdXNoKFwibW9uaXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmbG93LnBlcm1zLnVzZXJzX2Nhbl9hZG1pbikge1xuICAgICAgdXNlcnNfY2FuX2FkbWluID0gZmxvdy5wZXJtcy51c2Vyc19jYW5fYWRtaW47XG4gICAgICBpZiAodXNlcnNfY2FuX2FkbWluLmluY2x1ZGVzKHVzZXJfaWQpKSB7XG4gICAgICAgIG15X3Blcm1pc3Npb25zLnB1c2goXCJhZG1pblwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZsb3cucGVybXMub3Jnc19jYW5fYWRtaW4pIHtcbiAgICAgIG9yZ3NfY2FuX2FkbWluID0gZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZG1pbjtcbiAgICAgIF8uZWFjaChvcmdfaWRzLCBmdW5jdGlvbihvcmdfaWQpIHtcbiAgICAgICAgaWYgKG9yZ3NfY2FuX2FkbWluLmluY2x1ZGVzKG9yZ19pZCkpIHtcbiAgICAgICAgICByZXR1cm4gbXlfcGVybWlzc2lvbnMucHVzaChcImFkbWluXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgbXlfcGVybWlzc2lvbnMgPSBfLnVuaXEobXlfcGVybWlzc2lvbnMpO1xuICByZXR1cm4gbXlfcGVybWlzc2lvbnM7XG59O1xuIiwiIyDlj5HotbflrqHmiblcbl9ldmFsID0gcmVxdWlyZSgnZXZhbCcpXG5vYmplY3RxbCA9IHJlcXVpcmUoJ0BzdGVlZG9zL29iamVjdHFsJyk7XG5cbmdldE9iamVjdENvbmZpZyA9IChvYmplY3RBcGlOYW1lKSAtPlxuXHRyZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLnRvQ29uZmlnKClcblxuZ2V0T2JqZWN0TmFtZUZpZWxkS2V5ID0gKG9iamVjdEFwaU5hbWUpIC0+XG5cdHJldHVybiBvYmplY3RxbC5nZXRPYmplY3Qob2JqZWN0QXBpTmFtZSkuTkFNRV9GSUVMRF9LRVlcblxuZ2V0UmVsYXRlZHMgPSAob2JqZWN0QXBpTmFtZSkgLT5cblx0cmV0dXJuIE1ldGVvci53cmFwQXN5bmMoKG9iamVjdEFwaU5hbWUsIGNiKSAtPlxuXHRcdG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS5nZXRSZWxhdGVkcygpLnRoZW4gKHJlc29sdmUsIHJlamVjdCkgLT5cblx0XHRcdGNiKHJlamVjdCwgcmVzb2x2ZSlcblx0XHQpKG9iamVjdEFwaU5hbWUpXG5cbm9iamVjdEZpbmRPbmUgPSAob2JqZWN0QXBpTmFtZSwgcXVlcnkpIC0+XG5cdHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKChvYmplY3RBcGlOYW1lLCBxdWVyeSwgY2IpIC0+XG5cdFx0cXVlcnkudG9wID0gMVxuXHRcdG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS5maW5kKHF1ZXJ5KS50aGVuIChyZXNvbHZlLCByZWplY3QpIC0+XG5cdFx0XHRpZiAocmVzb2x2ZSAmJiByZXNvbHZlLmxlbmd0aCA+IDApXG5cdFx0XHRcdGNiKHJlamVjdCwgcmVzb2x2ZVswXSlcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2IocmVqZWN0LCBudWxsKVxuXHRcdCkob2JqZWN0QXBpTmFtZSwgcXVlcnkpXG5cbm9iamVjdEZpbmQgPSAob2JqZWN0QXBpTmFtZSwgcXVlcnkpIC0+XG5cdHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKChvYmplY3RBcGlOYW1lLCBxdWVyeSwgY2IpIC0+XG5cdFx0b2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLmZpbmQocXVlcnkpLnRoZW4gKHJlc29sdmUsIHJlamVjdCkgLT5cblx0XHRcdGNiKHJlamVjdCwgcmVzb2x2ZSlcblx0XHQpKG9iamVjdEFwaU5hbWUsIHF1ZXJ5KVxuXG5vYmplY3RVcGRhdGUgPSAob2JqZWN0QXBpTmFtZSwgaWQsIGRhdGEpIC0+XG5cdHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKChvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSwgY2IpIC0+XG5cdFx0b2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLnVwZGF0ZShpZCwgZGF0YSkudGhlbiAocmVzb2x2ZSwgcmVqZWN0KSAtPlxuXHRcdFx0Y2IocmVqZWN0LCByZXNvbHZlKVxuXHRcdCkob2JqZWN0QXBpTmFtZSwgaWQsIGRhdGEpXG5cbmdldFJlbGF0ZWRPYmplY3RGaWVsZENvZGUgPSAgKHJlbGF0ZWRPYmplY3RzS2V5cywga2V5KSAtPlxuXHRyZXR1cm4gXy5maW5kIHJlbGF0ZWRPYmplY3RzS2V5cywgIChyZWxhdGVkT2JqZWN0c0tleSkgLT5cblx0XHRyZXR1cm4ga2V5LnN0YXJ0c1dpdGgocmVsYXRlZE9iamVjdHNLZXkgKyAnLicpXG5cbmdldEZvcm1UYWJsZUZpZWxkQ29kZSA9IChmb3JtVGFibGVGaWVsZHNDb2RlLCBrZXkpIC0+XG5cdHJldHVybiBfLmZpbmQgZm9ybVRhYmxlRmllbGRzQ29kZSwgIChmb3JtVGFibGVGaWVsZENvZGUpIC0+XG5cdFx0cmV0dXJuIGtleS5zdGFydHNXaXRoKGZvcm1UYWJsZUZpZWxkQ29kZSArICcuJylcblxuZ2V0Rm9ybVRhYmxlRmllbGQgPSAoZm9ybVRhYmxlRmllbGRzLCBrZXkpIC0+XG5cdHJldHVybiBfLmZpbmQgZm9ybVRhYmxlRmllbGRzLCAgKGYpIC0+XG5cdFx0cmV0dXJuIGYuY29kZSA9PSBrZXlcblxuZ2V0Rm9ybUZpZWxkID0gKGZvcm1GaWVsZHMsIGtleSkgLT5cblx0ZmYgPSBudWxsXG5cdF8uZm9yRWFjaCBmb3JtRmllbGRzLCAoZikgLT5cblx0XHRpZiBmZlxuXHRcdFx0cmV0dXJuXG5cdFx0aWYgZi50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0ZmYgPSBfLmZpbmQgZi5maWVsZHMsICAoc2YpIC0+XG5cdFx0XHRcdHJldHVybiBzZi5jb2RlID09IGtleVxuXHRcdGVsc2UgaWYgZi5jb2RlID09IGtleVxuXHRcdFx0ZmYgPSBmXG5cblx0cmV0dXJuIGZmXG5cbmdldEZvcm1UYWJsZVN1YkZpZWxkID0gKHRhYmxlRmllbGQsIHN1YkZpZWxkQ29kZSkgLT5cblx0cmV0dXJuIF8uZmluZCB0YWJsZUZpZWxkLmZpZWxkcywgIChmKSAtPlxuXHRcdHJldHVybiBmLmNvZGUgPT0gc3ViRmllbGRDb2RlXG5cbmdldEZpZWxkT2RhdGFWYWx1ZSA9IChvYmpOYW1lLCBpZCwgcmVmZXJlbmNlVG9GaWVsZE5hbWUpIC0+XG5cdCMgb2JqID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iak5hbWUpXG5cdG9iaiA9IG9iamVjdHFsLmdldE9iamVjdChvYmpOYW1lKVxuXHRuYW1lS2V5ID0gZ2V0T2JqZWN0TmFtZUZpZWxkS2V5KG9iak5hbWUpXG5cdGlmICFvYmpcblx0XHRyZXR1cm5cblx0aWYgXy5pc1N0cmluZyBpZFxuXHRcdCMgX3JlY29yZCA9IG9iai5maW5kT25lKGlkKVxuXHRcdF9yZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iak5hbWUsIHsgZmlsdGVyczogW1tyZWZlcmVuY2VUb0ZpZWxkTmFtZSwgJz0nLCBpZF1dfSlcblx0XHRpZiBfcmVjb3JkXG5cdFx0XHRfcmVjb3JkWydAbGFiZWwnXSA9IF9yZWNvcmRbbmFtZUtleV1cblx0XHRcdHJldHVybiBfcmVjb3JkXG5cdGVsc2UgaWYgXy5pc0FycmF5IGlkXG5cdFx0X3JlY29yZHMgPSBbXVxuXHRcdCMgb2JqLmZpbmQoeyBfaWQ6IHsgJGluOiBpZCB9IH0pXG5cdFx0b2JqZWN0RmluZChvYmpOYW1lLCB7IGZpbHRlcnM6IFtbcmVmZXJlbmNlVG9GaWVsZE5hbWUsICdpbicsIGlkXV19KS5mb3JFYWNoIChfcmVjb3JkKSAtPlxuXHRcdFx0X3JlY29yZFsnQGxhYmVsJ10gPSBfcmVjb3JkW25hbWVLZXldXG5cdFx0XHRfcmVjb3Jkcy5wdXNoIF9yZWNvcmRcblx0XHRpZiAhXy5pc0VtcHR5IF9yZWNvcmRzXG5cdFx0XHRyZXR1cm4gX3JlY29yZHNcblx0cmV0dXJuXG5cbmdldFNlbGVjdFVzZXJWYWx1ZSA9ICh1c2VySWQsIHNwYWNlSWQpIC0+XG5cdHN1ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdzcGFjZV91c2VycycpLmZpbmRPbmUoeyBzcGFjZTogc3BhY2VJZCwgdXNlcjogdXNlcklkIH0pXG5cdHN1LmlkID0gdXNlcklkXG5cdHJldHVybiBzdVxuXG5nZXRTZWxlY3RVc2VyVmFsdWVzID0gKHVzZXJJZHMsIHNwYWNlSWQpIC0+XG5cdHN1cyA9IFtdXG5cdGlmIF8uaXNBcnJheSB1c2VySWRzXG5cdFx0Xy5lYWNoIHVzZXJJZHMsICh1c2VySWQpIC0+XG5cdFx0XHRzdSA9IGdldFNlbGVjdFVzZXJWYWx1ZSh1c2VySWQsIHNwYWNlSWQpXG5cdFx0XHRpZiBzdVxuXHRcdFx0XHRzdXMucHVzaChzdSlcblx0cmV0dXJuIHN1c1xuXG5nZXRTZWxlY3RPcmdWYWx1ZSA9IChvcmdJZCwgc3BhY2VJZCkgLT5cblx0b3JnID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdvcmdhbml6YXRpb25zJykuZmluZE9uZShvcmdJZCwgeyBmaWVsZHM6IHsgX2lkOiAxLCBuYW1lOiAxLCBmdWxsbmFtZTogMSB9IH0pXG5cdG9yZy5pZCA9IG9yZ0lkXG5cdHJldHVybiBvcmdcblxuZ2V0U2VsZWN0T3JnVmFsdWVzID0gKG9yZ0lkcywgc3BhY2VJZCkgLT5cblx0b3JncyA9IFtdXG5cdGlmIF8uaXNBcnJheSBvcmdJZHNcblx0XHRfLmVhY2ggb3JnSWRzLCAob3JnSWQpIC0+XG5cdFx0XHRvcmcgPSBnZXRTZWxlY3RPcmdWYWx1ZShvcmdJZCwgc3BhY2VJZClcblx0XHRcdGlmIG9yZ1xuXHRcdFx0XHRvcmdzLnB1c2gob3JnKVxuXHRyZXR1cm4gb3Jnc1xuXG5nZXRGaWxlRmllbGRWYWx1ZSA9IChyZWNvcmRGaWVsZElkLCBmVHlwZSktPlxuXHRpZiBfLmlzRW1wdHkocmVjb3JkRmllbGRJZClcblx0XHRyZXR1cm4gXG5cdGlmIGZUeXBlID09ICdpbWFnZSdcblx0XHRjb2xsZWN0aW9uID0gJ2ltYWdlcydcblx0ZWxzZSBpZiBmVHlwZSA9PSAnZmlsZSdcblx0XHRjb2xsZWN0aW9uID0gJ2ZpbGVzJ1xuXHRpZiBfLmlzU3RyaW5nKHJlY29yZEZpZWxkSWQpXG5cdFx0cXVlcnkgPSB7X2lkOiB7JGluOiBbcmVjb3JkRmllbGRJZF19fVxuXHRlbHNlXG5cdFx0cXVlcnkgPSB7X2lkOiB7JGluOiByZWNvcmRGaWVsZElkfX1cblx0ZmlsZXMgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wiY2ZzLiN7Y29sbGVjdGlvbn0uZmlsZXJlY29yZFwiXS5maW5kKHF1ZXJ5KTtcblx0dmFsdWUgPSBbXVxuXHRmaWxlcy5mb3JFYWNoIChmKSAtPlxuXHRcdG5ld0ZpbGUgPSBuZXcgRlMuRmlsZSgpXG5cdFx0bmV3RmlsZS5hdHRhY2hEYXRhIGYuY3JlYXRlUmVhZFN0cmVhbSgnZmlsZXMnKSwge1xuXHRcdFx0XHR0eXBlOiBmLm9yaWdpbmFsLnR5cGVcblx0XHR9LCAoZXJyKSAtPlxuXHRcdFx0aWYgKGVycilcblx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnIuZXJyb3IsIGVyci5yZWFzb24pXG5cblx0XHRcdG5ld0ZpbGUubmFtZShmLm5hbWUoKSlcblx0XHRcdG5ld0ZpbGUuc2l6ZShmLnNpemUoKSlcblx0XHRcdG1ldGFkYXRhID0ge1xuXHRcdFx0XHRvd25lcjogZi5tZXRhZGF0YS5vd25lclxuXHRcdFx0fVxuXHRcdFx0bmV3RmlsZS5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuXHRcdFx0bmV3RmlsZS5faWQgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLmluc3RhbmNlcy5fbWFrZU5ld0lEKCk7XG5cdFx0XHRjZnNbY29sbGVjdGlvbl0uaW5zZXJ0KG5ld0ZpbGUpO1xuXHRcdFx0dmFsdWUucHVzaChuZXdGaWxlLl9pZClcblx0aWYgdmFsdWUubGVuZ3RoID4gMFxuXHRcdGlmIF8uaXNTdHJpbmcocmVjb3JkRmllbGRJZClcblx0XHRcdHJldHVybiB2YWx1ZVswXVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB2YWx1ZTtcblxuZ2V0SW5zdGFuY2VGaWVsZFZhbHVlID0gKG9iakZpZWxkLCBmb3JtRmllbGQsIHJlY29yZCwgb2JqZWN0X2ZpZWxkLCBzcGFjZUlkLCByZWNvcmRGaWVsZFZhbHVlLCBlbmFibGVBbWlzZm9ybSkgLT5cblxuXHRpZiBlbmFibGVBbWlzZm9ybSAmJiBmb3JtRmllbGQuc3RlZWRvc19maWVsZFxuXHRcdHJldHVybiByZWNvcmRGaWVsZFZhbHVlXG5cblx0cmVjb3JkRmllbGRWYWx1ZSA9IHJlY29yZFtvYmpGaWVsZC5uYW1lXVxuXHR2YWx1ZVxuXHQjIGxvb2t1cOOAgW1hc3Rlcl9kZXRhaWzlrZfmrrXlkIzmraXliLBvZGF0YeWtl+autVxuXHRpZiBmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgZm9ybUZpZWxkLnR5cGUgPT0gJ29kYXRhJyAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmpGaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0cmVmZXJlbmNlVG9GaWVsZE5hbWUgPSBvYmpGaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCdcblx0XHRyZWZlcmVuY2VUb09iamVjdE5hbWUgPSBvYmpGaWVsZC5yZWZlcmVuY2VfdG9cblx0XHRvZGF0YUZpZWxkVmFsdWVcblx0XHRpZiBvYmpGaWVsZC5tdWx0aXBsZSAmJiBmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdG9kYXRhRmllbGRWYWx1ZSA9IGdldEZpZWxkT2RhdGFWYWx1ZShyZWZlcmVuY2VUb09iamVjdE5hbWUsIHJlY29yZEZpZWxkVmFsdWUsIHJlZmVyZW5jZVRvRmllbGROYW1lKVxuXHRcdGVsc2UgaWYgIW9iakZpZWxkLm11bHRpcGxlICYmICFmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdG9kYXRhRmllbGRWYWx1ZSA9IGdldEZpZWxkT2RhdGFWYWx1ZShyZWZlcmVuY2VUb09iamVjdE5hbWUsIHJlY29yZEZpZWxkVmFsdWUsIHJlZmVyZW5jZVRvRmllbGROYW1lKVxuXHRcdHZhbHVlID0gb2RhdGFGaWVsZFZhbHVlXG5cdGVsc2UgaWYgZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIFsndXNlcicsICdncm91cCddLmluY2x1ZGVzKGZvcm1GaWVsZC50eXBlKSAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqRmllbGQudHlwZSkgJiYgKFsndXNlcnMnLCAnb3JnYW5pemF0aW9ucyddLmluY2x1ZGVzKG9iakZpZWxkLnJlZmVyZW5jZV90bykgfHwgKCdzcGFjZV91c2VycycgPT0gb2JqRmllbGQucmVmZXJlbmNlX3RvICYmICd1c2VyJyA9PSBvYmpGaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQpIClcblx0XHRpZiAhXy5pc0VtcHR5KHJlY29yZEZpZWxkVmFsdWUpXG5cdFx0XHRzZWxlY3RGaWVsZFZhbHVlXG5cdFx0XHRpZiBmb3JtRmllbGQudHlwZSA9PSAndXNlcidcblx0XHRcdFx0aWYgb2JqRmllbGQubXVsdGlwbGUgJiYgZm9ybUZpZWxkLmlzX211bHRpc2VsZWN0XG5cdFx0XHRcdFx0c2VsZWN0RmllbGRWYWx1ZSA9IGdldFNlbGVjdFVzZXJWYWx1ZXMocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZClcblx0XHRcdFx0ZWxzZSBpZiAhb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RVc2VyVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZClcblx0XHRcdGVsc2UgaWYgZm9ybUZpZWxkLnR5cGUgPT0gJ2dyb3VwJ1xuXHRcdFx0XHRpZiBvYmpGaWVsZC5tdWx0aXBsZSAmJiBmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0XHRzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0T3JnVmFsdWVzKHJlY29yZEZpZWxkVmFsdWUsIHNwYWNlSWQpXG5cdFx0XHRcdGVsc2UgaWYgIW9iakZpZWxkLm11bHRpcGxlICYmICFmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0XHRzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0T3JnVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZClcblx0XHRcdGlmIHNlbGVjdEZpZWxkVmFsdWVcblx0XHRcdFx0dmFsdWUgPSBzZWxlY3RGaWVsZFZhbHVlXG5cdGVsc2UgaWYgZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIGZvcm1GaWVsZC50eXBlID09ICdkYXRlJyAmJiByZWNvcmRGaWVsZFZhbHVlXG5cdFx0dmFsdWUgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmZvcm1hdERhdGUocmVjb3JkRmllbGRWYWx1ZSkgIyBEYXRl6L2sU3RyaW5nXG5cdGVsc2UgaWYgZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIHJlY29yZEZpZWxkVmFsdWUgJiYgKGZvcm1GaWVsZC50eXBlID09ICdpbWFnZScgfHwgZm9ybUZpZWxkLnR5cGUgPT0gJ2ZpbGUnKVxuXHRcdHZhbHVlID0gZ2V0RmlsZUZpZWxkVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgZm9ybUZpZWxkLnR5cGUpXG5cdGVsc2UgaWYgZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIHJlY29yZEZpZWxkVmFsdWUgJiYgZm9ybUZpZWxkLnR5cGUgPT0gJ2xvb2t1cCcgJiYgWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKG9iakZpZWxkLnR5cGUpICYmIF8uaXNTdHJpbmcob2JqRmllbGQucmVmZXJlbmNlX3RvKVxuXHRcdHZhbHVlID0gcmVjb3JkRmllbGRWYWx1ZVxuXHRlbHNlIGlmIGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiByZWNvcmRGaWVsZFZhbHVlICYmIChmb3JtRmllbGQudHlwZSA9PSAnbXVsdGlTZWxlY3QnKVxuXHRcdHZhbHVlID0gcmVjb3JkRmllbGRWYWx1ZS5qb2luKCcsJylcblx0ZWxzZSBpZiByZWNvcmQuaGFzT3duUHJvcGVydHkob2JqZWN0X2ZpZWxkKVxuXHRcdHZhbHVlID0gcmVjb3JkRmllbGRWYWx1ZVxuXHRcblx0cmV0dXJuIHZhbHVlXG5cbiMgcmVxdWlyZWREZXRhaWxz57uT5p6EW1wi5a2Q6KGo5ZCNLuWtkOihqOS4rW1hc3Rlcl9kZXRhaWzlrZfmrrXlkI1cIiwgLi4uXVxuY2hlY2tSZXF1aXJlZERldGFpbHMgPSAocmVxdWlyZWREZXRhaWxzLCBtYXN0ZXJSZWNvcmQpIC0+XG5cdGlmICFfLmlzRW1wdHkgcmVxdWlyZWREZXRhaWxzXG5cdFx0IyDmo4Dmn6XlrZDooajlv4XloavvvIzljbPlrZDooajlv4XpobvmnInorrDlvZVcblx0XHRyZXF1aXJlZERldGFpbHMuZm9yRWFjaCAocmQpIC0+XG5cdFx0XHRzdWJUYWJsZU5hbWUgPSByZC5zcGxpdCgnLicpWzBdXG5cdFx0XHRzdWJUYWJsZU1hc3RlckZpZWxkID0gcmQuc3BsaXQoJy4nKVsxXVxuXHRcdFx0c3ViT2JqQ29uZmlnID0gZ2V0T2JqZWN0Q29uZmlnIHN1YlRhYmxlTmFtZVxuXHRcdFx0bWFzdGVyRmllbGQgPSBzdWJPYmpDb25maWcuZmllbGRzW3N1YlRhYmxlTWFzdGVyRmllbGRdXG5cdFx0XHRyZWZJZCA9IG1hc3RlckZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJ1xuXHRcdFx0bWFzdGVyRmllbGRWYWx1ZSA9IG1hc3RlclJlY29yZFtyZWZJZF1cblx0XHRcdCMg5p+l6K+i5a2Q6KGo6K6w5b2VXG5cdFx0XHRzdWJUYWJsZVJlY29yZCA9IG9iamVjdEZpbmRPbmUoc3ViVGFibGVOYW1lLCB7IGZpbHRlcnM6IFtbc3ViVGFibGVNYXN0ZXJGaWVsZCwgJz0nLCBtYXN0ZXJGaWVsZFZhbHVlXV0sIGZpZWxkczogW3N1YlRhYmxlTWFzdGVyRmllbGRdIH0pXG5cdFx0XHRpZiAhc3ViVGFibGVSZWNvcmRcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yIFwi6K+35YWI5paw5aKeI3tzdWJPYmpDb25maWcubGFiZWx9XCJcblx0XHRyZXR1cm5cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbCA9IHt9XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY2hlY2tfYXV0aG9yaXphdGlvbiA9IChyZXEpIC0+XG5cdHF1ZXJ5ID0gcmVxLnF1ZXJ5XG5cdHVzZXJJZCA9IHF1ZXJ5W1wiWC1Vc2VyLUlkXCJdXG5cdGF1dGhUb2tlbiA9IHF1ZXJ5W1wiWC1BdXRoLVRva2VuXCJdXG5cblx0aWYgbm90IHVzZXJJZCBvciBub3QgYXV0aFRva2VuXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvciA0MDEsICdVbmF1dGhvcml6ZWQnXG5cblx0aGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYXV0aFRva2VuKVxuXHR1c2VyID0gTWV0ZW9yLnVzZXJzLmZpbmRPbmVcblx0XHRfaWQ6IHVzZXJJZCxcblx0XHRcInNlcnZpY2VzLnJlc3VtZS5sb2dpblRva2Vucy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuXG5cdGlmIG5vdCB1c2VyXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvciA0MDEsICdVbmF1dGhvcml6ZWQnXG5cblx0cmV0dXJuIHVzZXJcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZSA9IChzcGFjZV9pZCkgLT5cblx0c3BhY2UgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNwYWNlcy5maW5kT25lKHNwYWNlX2lkKVxuXHRpZiBub3Qgc3BhY2Vcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcInNwYWNlX2lk5pyJ6K+v5oiW5q2kc3BhY2Xlt7Lnu4/ooqvliKDpmaRcIilcblx0cmV0dXJuIHNwYWNlXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0RmxvdyA9IChmbG93X2lkKSAtPlxuXHRmbG93ID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5mbG93cy5maW5kT25lKGZsb3dfaWQpXG5cdGlmIG5vdCBmbG93XG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCJpZOacieivr+aIluatpOa1geeoi+W3sue7j+iiq+WIoOmZpFwiKVxuXHRyZXR1cm4gZmxvd1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlciA9IChzcGFjZV9pZCwgdXNlcl9pZCkgLT5cblx0c3BhY2VfdXNlciA9IENyZWF0b3IuQ29sbGVjdGlvbnMuc3BhY2VfdXNlcnMuZmluZE9uZSh7IHNwYWNlOiBzcGFjZV9pZCwgdXNlcjogdXNlcl9pZCB9KVxuXHRpZiBub3Qgc3BhY2VfdXNlclxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwidXNlcl9pZOWvueW6lOeahOeUqOaIt+S4jeWxnuS6juW9k+WJjXNwYWNlXCIpXG5cdHJldHVybiBzcGFjZV91c2VyXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2VVc2VyT3JnSW5mbyA9IChzcGFjZV91c2VyKSAtPlxuXHRpbmZvID0gbmV3IE9iamVjdFxuXHRpbmZvLm9yZ2FuaXphdGlvbiA9IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uXG5cdG9yZyA9IENyZWF0b3IuQ29sbGVjdGlvbnMub3JnYW5pemF0aW9ucy5maW5kT25lKHNwYWNlX3VzZXIub3JnYW5pemF0aW9uLCB7IGZpZWxkczogeyBuYW1lOiAxICwgZnVsbG5hbWU6IDEgfSB9KVxuXHRpbmZvLm9yZ2FuaXphdGlvbl9uYW1lID0gb3JnLm5hbWVcblx0aW5mby5vcmdhbml6YXRpb25fZnVsbG5hbWUgPSBvcmcuZnVsbG5hbWVcblx0cmV0dXJuIGluZm9cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pc0Zsb3dFbmFibGVkID0gKGZsb3cpIC0+XG5cdGlmIGZsb3cuc3RhdGUgaXNudCBcImVuYWJsZWRcIlxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5rWB56iL5pyq5ZCv55SoLOaTjeS9nOWksei0pVwiKVxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd1NwYWNlTWF0Y2hlZCA9IChmbG93LCBzcGFjZV9pZCkgLT5cblx0aWYgZmxvdy5zcGFjZSBpc250IHNwYWNlX2lkXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLmtYHnqIvlkozlt6XkvZzljLpJROS4jeWMuemFjVwiKVxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZvcm0gPSAoZm9ybV9pZCkgLT5cblx0Zm9ybSA9IENyZWF0b3IuQ29sbGVjdGlvbnMuZm9ybXMuZmluZE9uZShmb3JtX2lkKVxuXHRpZiBub3QgZm9ybVxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsICfooajljZVJROacieivr+aIluatpOihqOWNleW3sue7j+iiq+WIoOmZpCcpXG5cblx0cmV0dXJuIGZvcm1cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRDYXRlZ29yeSA9IChjYXRlZ29yeV9pZCkgLT5cblx0cmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuY2F0ZWdvcmllcy5maW5kT25lKGNhdGVnb3J5X2lkKVxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrU3luY0RpcmVjdGlvbiA9IChvYmplY3RfbmFtZSwgZmxvd19pZCkgLT5cblx0b3cgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLm9iamVjdF93b3JrZmxvd3MuZmluZE9uZSh7XG5cdFx0b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuXHRcdGZsb3dfaWQ6IGZsb3dfaWRcblx0fSlcblx0aWYgIW93XG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgJ+acquaJvuWIsOWvueixoea1geeoi+aYoOWwhOiusOW9leOAgicpXG5cdHN5bmNEaXJlY3Rpb24gPSBvdy5zeW5jX2RpcmVjdGlvbiB8fCAnYm90aCdcblx0aWYgIVsnYm90aCcsICdvYmpfdG9faW5zJ10uaW5jbHVkZXMoc3luY0RpcmVjdGlvbilcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCAn5LiN5pSv5oyB55qE5ZCM5q2l5pa55ZCR44CCJylcblxuXHRyZXR1cm4gXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY3JlYXRlX2luc3RhbmNlID0gKGluc3RhbmNlX2Zyb21fY2xpZW50LCB1c2VyX2luZm8pIC0+XG5cdGNoZWNrIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdLCBTdHJpbmdcblx0Y2hlY2sgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJzcGFjZVwiXSwgU3RyaW5nXG5cdGNoZWNrIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiZmxvd1wiXSwgU3RyaW5nXG5cdGNoZWNrIGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXSwgW3tvOiBTdHJpbmcsIGlkczogW1N0cmluZ119XVxuXG5cdCMg5qCh6aqM5ZCM5q2l5pa55ZCRXG5cdHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY2hlY2tTeW5jRGlyZWN0aW9uKGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXVswXS5vLCBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImZsb3dcIl0pXG5cblx0IyDmoKHpqozmmK/lkKZyZWNvcmTlt7Lnu4/lj5HotbfnmoTnlLPor7fov5jlnKjlrqHmibnkuK1cblx0dXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jaGVja0lzSW5BcHByb3ZhbChpbnN0YW5jZV9mcm9tX2NsaWVudFtcInJlY29yZF9pZHNcIl1bMF0sIGluc3RhbmNlX2Zyb21fY2xpZW50W1wic3BhY2VcIl0pXG5cblx0c3BhY2VfaWQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInNwYWNlXCJdXG5cdGZsb3dfaWQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImZsb3dcIl1cblx0dXNlcl9pZCA9IHVzZXJfaW5mby5faWRcblx0IyDojrflj5bliY3lj7DmiYDkvKDnmoR0cmFjZVxuXHR0cmFjZV9mcm9tX2NsaWVudCA9IG51bGxcblx0IyDojrflj5bliY3lj7DmiYDkvKDnmoRhcHByb3ZlXG5cdGFwcHJvdmVfZnJvbV9jbGllbnQgPSBudWxsXG5cdGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1widHJhY2VzXCJdIGFuZCBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInRyYWNlc1wiXVswXVxuXHRcdHRyYWNlX2Zyb21fY2xpZW50ID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJ0cmFjZXNcIl1bMF1cblx0XHRpZiB0cmFjZV9mcm9tX2NsaWVudFtcImFwcHJvdmVzXCJdIGFuZCB0cmFjZV9mcm9tX2NsaWVudFtcImFwcHJvdmVzXCJdWzBdXG5cdFx0XHRhcHByb3ZlX2Zyb21fY2xpZW50ID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJ0cmFjZXNcIl1bMF1bXCJhcHByb3Zlc1wiXVswXVxuXG5cdCMg6I635Y+W5LiA5Liqc3BhY2Vcblx0c3BhY2UgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlKHNwYWNlX2lkKVxuXHQjIOiOt+WPluS4gOS4qmZsb3dcblx0ZmxvdyA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0RmxvdyhmbG93X2lkKVxuXHQjIOiOt+WPluS4gOS4qnNwYWNl5LiL55qE5LiA5LiqdXNlclxuXHRzcGFjZV91c2VyID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZVVzZXIoc3BhY2VfaWQsIHVzZXJfaWQpXG5cdCMg6I635Y+Wc3BhY2VfdXNlcuaJgOWcqOeahOmDqOmXqOS/oeaBr1xuXHRzcGFjZV91c2VyX29yZ19pbmZvID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZVVzZXJPcmdJbmZvKHNwYWNlX3VzZXIpXG5cdCMg5Yik5pat5LiA5LiqZmxvd+aYr+WQpuS4uuWQr+eUqOeKtuaAgVxuXHR1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd0VuYWJsZWQoZmxvdylcblx0IyDliKTmlq3kuIDkuKpmbG935ZKMc3BhY2VfaWTmmK/lkKbljLnphY1cblx0dXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pc0Zsb3dTcGFjZU1hdGNoZWQoZmxvdywgc3BhY2VfaWQpXG5cblx0Zm9ybSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Rm9ybShmbG93LmZvcm0pXG5cblx0cGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uTWFuYWdlci5nZXRGbG93UGVybWlzc2lvbnMoZmxvd19pZCwgdXNlcl9pZClcblxuXHRpZiBub3QgcGVybWlzc2lvbnMuaW5jbHVkZXMoXCJhZGRcIilcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcIuW9k+WJjeeUqOaIt+ayoeacieatpOa1geeoi+eahOaWsOW7uuadg+mZkFwiKVxuXG5cdG5vdyA9IG5ldyBEYXRlXG5cdGluc19vYmogPSB7fVxuXHRpbnNfb2JqLl9pZCA9IENyZWF0b3IuQ29sbGVjdGlvbnMuaW5zdGFuY2VzLl9tYWtlTmV3SUQoKVxuXHRpbnNfb2JqLnNwYWNlID0gc3BhY2VfaWRcblx0aW5zX29iai5mbG93ID0gZmxvd19pZFxuXHRpbnNfb2JqLmZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudC5faWRcblx0aW5zX29iai5mb3JtID0gZmxvdy5mb3JtXG5cdGluc19vYmouZm9ybV92ZXJzaW9uID0gZmxvdy5jdXJyZW50LmZvcm1fdmVyc2lvblxuXHRpbnNfb2JqLm5hbWUgPSBmbG93Lm5hbWVcblx0aW5zX29iai5zdWJtaXR0ZXIgPSB1c2VyX2lkXG5cdGluc19vYmouc3VibWl0dGVyX25hbWUgPSB1c2VyX2luZm8ubmFtZVxuXHRpbnNfb2JqLmFwcGxpY2FudCA9IGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdIHRoZW4gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0gZWxzZSB1c2VyX2lkXG5cdGluc19vYmouYXBwbGljYW50X25hbWUgPSBpZiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9uYW1lXCJdIHRoZW4gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfbmFtZVwiXSBlbHNlIHVzZXJfaW5mby5uYW1lXG5cdGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbiA9IGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvblwiXSB0aGVuIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvblwiXSBlbHNlIHNwYWNlX3VzZXIub3JnYW5pemF0aW9uXG5cdGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lID0gaWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiXSBlbHNlIHNwYWNlX3VzZXJfb3JnX2luZm8ub3JnYW5pemF0aW9uX25hbWVcblx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gaWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lXCJdIHRoZW4gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lXCJdIGVsc2UgIHNwYWNlX3VzZXJfb3JnX2luZm8ub3JnYW5pemF0aW9uX2Z1bGxuYW1lXG5cdGluc19vYmouYXBwbGljYW50X2NvbXBhbnkgPSBpZiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9jb21wYW55XCJdIHRoZW4gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfY29tcGFueVwiXSBlbHNlIHNwYWNlX3VzZXIuY29tcGFueV9pZFxuXHRpbnNfb2JqLnN0YXRlID0gJ2RyYWZ0J1xuXHRpbnNfb2JqLmNvZGUgPSAnJ1xuXHRpbnNfb2JqLmlzX2FyY2hpdmVkID0gZmFsc2Vcblx0aW5zX29iai5pc19kZWxldGVkID0gZmFsc2Vcblx0aW5zX29iai5jcmVhdGVkID0gbm93XG5cdGluc19vYmouY3JlYXRlZF9ieSA9IHVzZXJfaWRcblx0aW5zX29iai5tb2RpZmllZCA9IG5vd1xuXHRpbnNfb2JqLm1vZGlmaWVkX2J5ID0gdXNlcl9pZFxuXG5cdGluc19vYmoucmVjb3JkX2lkcyA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXVxuXG5cdGlmIHNwYWNlX3VzZXIuY29tcGFueV9pZFxuXHRcdGluc19vYmouY29tcGFueV9pZCA9IHNwYWNlX3VzZXIuY29tcGFueV9pZFxuXG5cdCMg5paw5bu6VHJhY2Vcblx0dHJhY2Vfb2JqID0ge31cblx0dHJhY2Vfb2JqLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHJcblx0dHJhY2Vfb2JqLmluc3RhbmNlID0gaW5zX29iai5faWRcblx0dHJhY2Vfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2Vcblx0IyDlvZPliY3mnIDmlrDniYhmbG935Lit5byA5aeL6IqC54K5XG5cdHN0YXJ0X3N0ZXAgPSBfLmZpbmQoZmxvdy5jdXJyZW50LnN0ZXBzLCAoc3RlcCkgLT5cblx0XHRyZXR1cm4gc3RlcC5zdGVwX3R5cGUgaXMgJ3N0YXJ0J1xuXHQpXG5cdHRyYWNlX29iai5zdGVwID0gc3RhcnRfc3RlcC5faWRcblx0dHJhY2Vfb2JqLm5hbWUgPSBzdGFydF9zdGVwLm5hbWVcblxuXHR0cmFjZV9vYmouc3RhcnRfZGF0ZSA9IG5vd1xuXHQjIOaWsOW7ukFwcHJvdmVcblx0YXBwcl9vYmogPSB7fVxuXHRhcHByX29iai5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyXG5cdGFwcHJfb2JqLmluc3RhbmNlID0gaW5zX29iai5faWRcblx0YXBwcl9vYmoudHJhY2UgPSB0cmFjZV9vYmouX2lkXG5cdGFwcHJfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2Vcblx0YXBwcl9vYmoudXNlciA9IGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdIHRoZW4gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0gZWxzZSB1c2VyX2lkXG5cdGFwcHJfb2JqLnVzZXJfbmFtZSA9IGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X25hbWVcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9uYW1lXCJdIGVsc2UgdXNlcl9pbmZvLm5hbWVcblx0YXBwcl9vYmouaGFuZGxlciA9IHVzZXJfaWRcblx0YXBwcl9vYmouaGFuZGxlcl9uYW1lID0gdXNlcl9pbmZvLm5hbWVcblx0YXBwcl9vYmouaGFuZGxlcl9vcmdhbml6YXRpb24gPSBzcGFjZV91c2VyLm9yZ2FuaXphdGlvblxuXHRhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lID0gc3BhY2VfdXNlcl9vcmdfaW5mby5uYW1lXG5cdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gc3BhY2VfdXNlcl9vcmdfaW5mby5mdWxsbmFtZVxuXHRhcHByX29iai50eXBlID0gJ2RyYWZ0J1xuXHRhcHByX29iai5zdGFydF9kYXRlID0gbm93XG5cdGFwcHJfb2JqLnJlYWRfZGF0ZSA9IG5vd1xuXHRhcHByX29iai5pc19yZWFkID0gdHJ1ZVxuXHRhcHByX29iai5pc19lcnJvciA9IGZhbHNlXG5cdGFwcHJfb2JqLmRlc2NyaXB0aW9uID0gJydcblx0cmVsYXRlZFRhYmxlc0luZm8gPSB7fVxuXHRhcHByX29iai52YWx1ZXMgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlVmFsdWVzKGluc19vYmoucmVjb3JkX2lkc1swXSwgZmxvd19pZCwgc3BhY2VfaWQsIGZvcm0uY3VycmVudC5maWVsZHMsIHJlbGF0ZWRUYWJsZXNJbmZvKVxuXG5cdHRyYWNlX29iai5hcHByb3ZlcyA9IFthcHByX29ial1cblx0aW5zX29iai50cmFjZXMgPSBbdHJhY2Vfb2JqXVxuXG5cdGluc19vYmoudmFsdWVzID0gYXBwcl9vYmoudmFsdWVzXG5cblx0aW5zX29iai5pbmJveF91c2VycyA9IGluc3RhbmNlX2Zyb21fY2xpZW50LmluYm94X3VzZXJzIHx8IFtdXG5cblx0aW5zX29iai5jdXJyZW50X3N0ZXBfbmFtZSA9IHN0YXJ0X3N0ZXAubmFtZVxuXG5cdGlmIGZsb3cuYXV0b19yZW1pbmQgaXMgdHJ1ZVxuXHRcdGluc19vYmouYXV0b19yZW1pbmQgPSB0cnVlXG5cblx0IyDmlrDlu7rnlLPor7fljZXml7bvvIxpbnN0YW5jZXPorrDlvZXmtYHnqIvlkI3np7DjgIHmtYHnqIvliIbnsbvlkI3np7AgIzEzMTNcblx0aW5zX29iai5mbG93X25hbWUgPSBmbG93Lm5hbWVcblx0aWYgZm9ybS5jYXRlZ29yeVxuXHRcdGNhdGVnb3J5ID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRDYXRlZ29yeShmb3JtLmNhdGVnb3J5KVxuXHRcdGlmIGNhdGVnb3J5XG5cdFx0XHRpbnNfb2JqLmNhdGVnb3J5X25hbWUgPSBjYXRlZ29yeS5uYW1lXG5cdFx0XHRpbnNfb2JqLmNhdGVnb3J5ID0gY2F0ZWdvcnkuX2lkXG5cblx0bmV3X2luc19pZCA9IENyZWF0b3IuQ29sbGVjdGlvbnMuaW5zdGFuY2VzLmluc2VydChpbnNfb2JqKVxuXG5cdHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVSZWNvcmRJbnN0YW5jZUluZm8oaW5zX29iai5yZWNvcmRfaWRzWzBdLCBuZXdfaW5zX2lkLCBzcGFjZV9pZClcblxuXHQjIHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVSZWxhdGVkUmVjb3JkSW5zdGFuY2VJbmZvKHJlbGF0ZWRUYWJsZXNJbmZvLCBuZXdfaW5zX2lkLCBzcGFjZV9pZClcblxuXHR1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlQXR0YWNoKGluc19vYmoucmVjb3JkX2lkc1swXSwgc3BhY2VfaWQsIGluc19vYmouX2lkLCBhcHByX29iai5faWQpXG5cblx0cmV0dXJuIG5ld19pbnNfaWRcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVZhbHVlcyA9IChyZWNvcmRJZHMsIGZsb3dJZCwgc3BhY2VJZCwgZmllbGRzLCByZWxhdGVkVGFibGVzSW5mbykgLT5cblx0ZmllbGRDb2RlcyA9IFtdXG5cdF8uZWFjaCBmaWVsZHMsIChmKSAtPlxuXHRcdGlmIGYudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdF8uZWFjaCBmLmZpZWxkcywgKGZmKSAtPlxuXHRcdFx0XHRmaWVsZENvZGVzLnB1c2ggZmYuY29kZVxuXHRcdGVsc2Vcblx0XHRcdGZpZWxkQ29kZXMucHVzaCBmLmNvZGVcblxuXHR2YWx1ZXMgPSB7fVxuXHRvYmplY3ROYW1lID0gcmVjb3JkSWRzLm9cblx0b2JqZWN0ID0gZ2V0T2JqZWN0Q29uZmlnKG9iamVjdE5hbWUpXG5cdHJlY29yZElkID0gcmVjb3JkSWRzLmlkc1swXVxuXHRvdyA9IENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X3dvcmtmbG93cy5maW5kT25lKHtcblx0XHRvYmplY3RfbmFtZTogb2JqZWN0TmFtZSxcblx0XHRmbG93X2lkOiBmbG93SWRcblx0fSlcblx0IyByZWNvcmQgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0TmFtZSwgc3BhY2VJZCkuZmluZE9uZShyZWNvcmRJZClcblx0cmVjb3JkID0gb2JqZWN0RmluZE9uZShvYmplY3ROYW1lLCB7IGZpbHRlcnM6IFtbJ19pZCcsICc9JywgcmVjb3JkSWRdXX0pXG5cdGZsb3cgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Zsb3dzJykuZmluZE9uZShmbG93SWQsIHsgZmllbGRzOiB7IGZvcm06IDEsIGVuYWJsZUFtaXNmb3JtOiAxIH0gfSlcblx0ZW5hYmxlQW1pc2Zvcm0gPSBmbG93LmVuYWJsZV9hbWlzZm9ybVxuXHRpZiBvdyBhbmQgcmVjb3JkXG5cdFx0cmVxdWlyZWREZXRhaWxzID0gb3cucmVxdWlyZWRfZGV0YWlscyB8fCBbXVxuXHRcdGNoZWNrUmVxdWlyZWREZXRhaWxzKHJlcXVpcmVkRGV0YWlscywgcmVjb3JkKVxuXG5cdFx0Zm9ybSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcImZvcm1zXCIpLmZpbmRPbmUoZmxvdy5mb3JtKVxuXHRcdGZvcm1GaWVsZHMgPSBmb3JtLmN1cnJlbnQuZmllbGRzIHx8IFtdXG5cdFx0cmVsYXRlZE9iamVjdHMgPSBnZXRSZWxhdGVkcyhvYmplY3ROYW1lKVxuXHRcdHJlbGF0ZWRPYmplY3RzS2V5cyA9IF8ucGx1Y2socmVsYXRlZE9iamVjdHMsICdvYmplY3RfbmFtZScpXG5cdFx0Zm9ybVRhYmxlRmllbGRzID0gXy5maWx0ZXIgZm9ybUZpZWxkcywgKGZvcm1GaWVsZCkgLT5cblx0XHRcdHJldHVybiBmb3JtRmllbGQudHlwZSA9PSAndGFibGUnXG5cdFx0Zm9ybVRhYmxlRmllbGRzQ29kZSA9IF8ucGx1Y2soZm9ybVRhYmxlRmllbGRzLCAnY29kZScpXG5cblx0XHQjIHN0ZWVkb3MgZmllbGQg5Lit5a6a5LmJ55qEZ3JpZOOAgXRhYmxl57G75Z6L5a2X5q61XG5cdFx0dGFibGVGaWVsZENvZGVzID0gW11cblx0XHR0YWJsZUZpZWxkTWFwID0gW11cblx0XHQjIOebuOWFs+ihqFxuXHRcdHRhYmxlVG9SZWxhdGVkTWFwID0ge31cblxuXHRcdCMgZmllbGRfbWFwOiDku47lj7DotKbliLDlrqHmibnljZXnmoTlrZfmrrXlkIzmraXmmKDlsITop4TliJlcblx0XHRvdy5maWVsZF9tYXA/LmZvckVhY2ggKGZtKSAtPlxuXHRcdFx0b2JqZWN0X2ZpZWxkID0gZm0ub2JqZWN0X2ZpZWxkXG5cdFx0XHR3b3JrZmxvd19maWVsZCA9IGZtLndvcmtmbG93X2ZpZWxkXG5cdFx0XHRpZiAhb2JqZWN0X2ZpZWxkIHx8ICF3b3JrZmxvd19maWVsZFxuXHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ+acquaJvuWIsOWtl+aute+8jOivt+ajgOafpeWvueixoea1geeoi+aYoOWwhOWtl+autemFjee9ricpXG5cdFx0XHRyZWxhdGVkT2JqZWN0RmllbGRDb2RlID0gZ2V0UmVsYXRlZE9iamVjdEZpZWxkQ29kZShyZWxhdGVkT2JqZWN0c0tleXMsIG9iamVjdF9maWVsZClcblx0XHRcdGZvcm1UYWJsZUZpZWxkQ29kZSA9IGdldEZvcm1UYWJsZUZpZWxkQ29kZShmb3JtVGFibGVGaWVsZHNDb2RlLCB3b3JrZmxvd19maWVsZClcblx0XHRcdG9iakZpZWxkID0gb2JqZWN0LmZpZWxkc1tvYmplY3RfZmllbGRdXG5cdFx0XHRmb3JtRmllbGQgPSBnZXRGb3JtRmllbGQoZm9ybUZpZWxkcywgd29ya2Zsb3dfZmllbGQpXG5cdFx0XHRyZWNvcmRGaWVsZFZhbHVlID0gcmVjb3JkW29iamVjdF9maWVsZF1cblx0XHRcdCMg5aSE55CG5a2Q6KGo5a2X5q61XG5cdFx0XHRpZiByZWxhdGVkT2JqZWN0RmllbGRDb2RlXG5cdFx0XHRcdFxuXHRcdFx0XHRvVGFibGVDb2RlID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJylbMF1cblx0XHRcdFx0b1RhYmxlRmllbGRDb2RlID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJylbMV1cblx0XHRcdFx0dGFibGVUb1JlbGF0ZWRNYXBLZXkgPSBvVGFibGVDb2RlXG5cdFx0XHRcdGlmICF0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV1cblx0XHRcdFx0XHR0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV0gPSB7fVxuXG5cdFx0XHRcdGlmIGZvcm1UYWJsZUZpZWxkQ29kZVxuXHRcdFx0XHRcdHdUYWJsZUNvZGUgPSB3b3JrZmxvd19maWVsZC5zcGxpdCgnLicpWzBdXG5cdFx0XHRcdFx0dGFibGVUb1JlbGF0ZWRNYXBbdGFibGVUb1JlbGF0ZWRNYXBLZXldWydfRlJPTV9UQUJMRV9DT0RFJ10gPSB3VGFibGVDb2RlXG5cblx0XHRcdFx0dGFibGVUb1JlbGF0ZWRNYXBbdGFibGVUb1JlbGF0ZWRNYXBLZXldW29UYWJsZUZpZWxkQ29kZV0gPSB3b3JrZmxvd19maWVsZFxuXHRcdFx0IyDliKTmlq3mmK/lkKbmmK/ooajmoLzlrZfmrrUob2JqZWN0IGZpZWxkIOeahCBncmlk44CBdGFibGUpXG5cdFx0XHRlbHNlIGlmIHdvcmtmbG93X2ZpZWxkLmluZGV4T2YoJy4nKSA+IDAgYW5kIG9iamVjdF9maWVsZC5pbmRleE9mKCcuJC4nKSA+IDBcblx0XHRcdFx0d1RhYmxlQ29kZSA9IHdvcmtmbG93X2ZpZWxkLnNwbGl0KCcuJylbMF1cblx0XHRcdFx0b1RhYmxlQ29kZSA9IG9iamVjdF9maWVsZC5zcGxpdCgnLiQuJylbMF0gIHJlZjEudGFibGUxLiQubmFtZVxuXHRcdFx0XHRpZiByZWNvcmQuaGFzT3duUHJvcGVydHkob1RhYmxlQ29kZSkgYW5kIF8uaXNBcnJheShyZWNvcmRbb1RhYmxlQ29kZV0pXG5cdFx0XHRcdFx0dGFibGVGaWVsZENvZGVzLnB1c2goSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdFx0d29ya2Zsb3dfdGFibGVfZmllbGRfY29kZTogd1RhYmxlQ29kZSxcblx0XHRcdFx0XHRcdG9iamVjdF90YWJsZV9maWVsZF9jb2RlOiBvVGFibGVDb2RlXG5cdFx0XHRcdFx0fSkpXG5cdFx0XHRcdFx0dGFibGVGaWVsZE1hcC5wdXNoKGZtKVxuXHRcdFx0XHRlbHNlIGlmIG9UYWJsZUNvZGUuaW5kZXhPZignLicpID4gMCAjIOivtOaYjuaYr+WFs+iBlOihqOeahGdyaWTlrZfmrrVcblx0XHRcdFx0XHRvVGFibGVDb2RlUmVmZXJlbmNlRmllbGRDb2RlID0gb1RhYmxlQ29kZS5zcGxpdCgnLicpWzBdO1xuXHRcdFx0XHRcdGdyaWRDb2RlID0gb1RhYmxlQ29kZS5zcGxpdCgnLicpWzFdO1xuXHRcdFx0XHRcdG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZCA9IG9iamVjdC5maWVsZHNbb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkQ29kZV07XG5cdFx0XHRcdFx0aWYgb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkICYmIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQucmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdFx0aWYgcmVjb3JkW29UYWJsZUNvZGVdXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdHJlZmVyZW5jZVRvRmllbGROYW1lID0gb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJztcblx0XHRcdFx0XHRcdHJlZmVyZW5jZVRvT2JqZWN0TmFtZSA9IG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZC5yZWZlcmVuY2VfdG87XG5cdFx0XHRcdFx0XHRyZWZlcmVuY2VUb0ZpZWxkVmFsdWUgPSByZWNvcmRbb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLm5hbWVdO1xuXHRcdFx0XHRcdFx0IyDmraTlpITlgJ/liqlnZXRGaWVsZE9kYXRhVmFsdWXlh73mlbDnmoTog73lipssIOiOt+WPluWFs+iBlOihqChsb29rdXAp55qE6K6w5b2VLiDmraTlpITmnKrmnKrogIPomZFsb29rdXDljZXpgInnmoTmg4XlhrUuIOatpOWkhOiOt+WPluWFs+ezu+aVsOaNrueahOaJgOacieWtl+autSwg5Lqk55Sx5LiL5pa555qE6KGo5qC85pWw5o2u5ZCM5q2l57uf5LiA5pW055CG5pWw5o2uXG5cdFx0XHRcdFx0XHRyZWZlcmVuY2VUb0RvYyA9IGdldEZpZWxkT2RhdGFWYWx1ZShyZWZlcmVuY2VUb09iamVjdE5hbWUsIHJlZmVyZW5jZVRvRmllbGRWYWx1ZSwgcmVmZXJlbmNlVG9GaWVsZE5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgcmVmZXJlbmNlVG9Eb2NbZ3JpZENvZGVdXG5cdFx0XHRcdFx0XHRcdHJlY29yZFtvVGFibGVDb2RlXSA9IHJlZmVyZW5jZVRvRG9jW2dyaWRDb2RlXTtcblx0XHRcdFx0XHRcdFx0dGFibGVGaWVsZENvZGVzLnB1c2goSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdFx0XHRcdHdvcmtmbG93X3RhYmxlX2ZpZWxkX2NvZGU6IHdUYWJsZUNvZGUsXG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGU6IG9UYWJsZUNvZGVcblx0XHRcdFx0XHRcdFx0fSkpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGFibGVGaWVsZE1hcC5wdXNoKGZtKTtcblxuXHRcdFx0IyDlpITnkIZsb29rdXDjgIFtYXN0ZXJfZGV0YWls57G75Z6L5a2X5q61XG5cdFx0XHRlbHNlIGlmIG9iamVjdF9maWVsZC5pbmRleE9mKCcuJykgPiAwIGFuZCBvYmplY3RfZmllbGQuaW5kZXhPZignLiQuJykgPT0gLTFcblx0XHRcdFx0b2JqZWN0RmllbGROYW1lID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJylbMF1cblx0XHRcdFx0bG9va3VwRmllbGROYW1lID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJylbMV1cblx0XHRcdFx0aWYgb2JqZWN0XG5cdFx0XHRcdFx0b2JqZWN0RmllbGQgPSBvYmplY3QuZmllbGRzW29iamVjdEZpZWxkTmFtZV1cblx0XHRcdFx0XHRpZiBvYmplY3RGaWVsZCAmJiBmb3JtRmllbGQgJiYgWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKG9iamVjdEZpZWxkLnR5cGUpICYmIF8uaXNTdHJpbmcob2JqZWN0RmllbGQucmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdFx0bG9va3VwT2JqZWN0UmVjb3JkID0gb2JqZWN0RmluZE9uZShvYmplY3RGaWVsZC5yZWZlcmVuY2VfdG8sIHsgZmlsdGVyczogW1snX2lkJywgJz0nLCByZWNvcmRbb2JqZWN0RmllbGROYW1lXV1dLCBmaWVsZHM6IFtsb29rdXBGaWVsZE5hbWVdIH0pXG5cdFx0XHRcdFx0XHRpZiAhbG9va3VwT2JqZWN0UmVjb3JkXG5cdFx0XHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRcdFx0b2JqZWN0RmllbGRPYmplY3ROYW1lID0gb2JqZWN0RmllbGQucmVmZXJlbmNlX3RvXG5cdFx0XHRcdFx0XHRsb29rdXBGaWVsZE9iaiA9IGdldE9iamVjdENvbmZpZyhvYmplY3RGaWVsZE9iamVjdE5hbWUpXG5cdFx0XHRcdFx0XHRvYmplY3RMb29rdXBGaWVsZCA9IGxvb2t1cEZpZWxkT2JqLmZpZWxkc1tsb29rdXBGaWVsZE5hbWVdXG5cblx0XHRcdFx0XHRcdHZhbHVlc1t3b3JrZmxvd19maWVsZF0gPSBnZXRJbnN0YW5jZUZpZWxkVmFsdWUob2JqZWN0TG9va3VwRmllbGQsIGZvcm1GaWVsZCwgbG9va3VwT2JqZWN0UmVjb3JkLCBsb29rdXBGaWVsZE5hbWUsIHNwYWNlSWQsIHJlY29yZFtsb29rdXBGaWVsZE5hbWVdLCBlbmFibGVBbWlzZm9ybSlcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWVzW3dvcmtmbG93X2ZpZWxkXSA9IGdldEluc3RhbmNlRmllbGRWYWx1ZShvYmpGaWVsZCwgZm9ybUZpZWxkLCByZWNvcmQsIG9iamVjdF9maWVsZCwgc3BhY2VJZCwgcmVjb3JkW29iamVjdF9maWVsZF0sIGVuYWJsZUFtaXNmb3JtKVxuXG5cdFx0IyDooajmoLzlrZfmrrVcblx0XHRfLnVuaXEodGFibGVGaWVsZENvZGVzKS5mb3JFYWNoICh0ZmMpIC0+XG5cdFx0XHRjID0gSlNPTi5wYXJzZSh0ZmMpXG5cdFx0XHR2YWx1ZXNbYy53b3JrZmxvd190YWJsZV9maWVsZF9jb2RlXSA9IFtdXG5cdFx0XHRyZWNvcmRbYy5vYmplY3RfdGFibGVfZmllbGRfY29kZV0uZm9yRWFjaCAodHIpIC0+XG5cdFx0XHRcdG5ld1RyID0ge31cblx0XHRcdFx0Xy5lYWNoIHRyLCAodGRWYWx1ZSwgaykgLT5cblx0XHRcdFx0XHR0YWJsZUZpZWxkTWFwLmZvckVhY2ggKHRmbSkgLT5cblx0XHRcdFx0XHRcdGlmIHRmbS5vYmplY3RfZmllbGQgaXMgKGMub2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGUgKyAnLiQuJyArIGspXG5cdFx0XHRcdFx0XHRcdHdUZENvZGUgPSB0Zm0ud29ya2Zsb3dfZmllbGQuc3BsaXQoJy4nKVsxXVxuXHRcdFx0XHRcdFx0XHRuZXdUclt3VGRDb2RlXSA9IHRkVmFsdWVcblx0XHRcdFx0aWYgbm90IF8uaXNFbXB0eShuZXdUcilcblx0XHRcdFx0XHR2YWx1ZXNbYy53b3JrZmxvd190YWJsZV9maWVsZF9jb2RlXS5wdXNoKG5ld1RyKVxuXG5cdFx0IyDlkIzmraXlrZDooajmlbDmja7oh7PooajljZXooajmoLxcblx0XHRfLmVhY2ggdGFibGVUb1JlbGF0ZWRNYXAsICAobWFwLCBrZXkpIC0+XG5cdFx0XHR0YWJsZUNvZGUgPSBtYXAuX0ZST01fVEFCTEVfQ09ERVxuXHRcdFx0Zm9ybVRhYmxlRmllbGQgPSBnZXRGb3JtVGFibGVGaWVsZChmb3JtVGFibGVGaWVsZHMsIHRhYmxlQ29kZSlcblx0XHRcdGlmICF0YWJsZUNvZGVcblx0XHRcdFx0Y29uc29sZS53YXJuKCd0YWJsZVRvUmVsYXRlZDogWycgKyBrZXkgKyAnXSBtaXNzaW5nIGNvcnJlc3BvbmRpbmcgdGFibGUuJylcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmVsYXRlZE9iamVjdE5hbWUgPSBrZXlcblx0XHRcdFx0dGFibGVWYWx1ZXMgPSBbXVxuXHRcdFx0XHRyZWxhdGVkVGFibGVJdGVtcyA9IFtdXG5cdFx0XHRcdHJlbGF0ZWRPYmplY3QgPSBnZXRPYmplY3RDb25maWcocmVsYXRlZE9iamVjdE5hbWUpXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZCA9IF8uZmluZCByZWxhdGVkT2JqZWN0LmZpZWxkcywgKGYpIC0+XG5cdFx0XHRcdFx0cmV0dXJuIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhmLnR5cGUpICYmIGYucmVmZXJlbmNlX3RvID09IG9iamVjdE5hbWVcblxuXHRcdFx0XHRyZWxhdGVkRmllbGROYW1lID0gcmVsYXRlZEZpZWxkLm5hbWVcblxuXHRcdFx0XHRyZWxhdGVkUmVjb3JkcyA9IG9iamVjdEZpbmQocmVsYXRlZE9iamVjdE5hbWUsIHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRbcmVsYXRlZEZpZWxkTmFtZSwgJz0nLCByZWNvcmRJZF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pXG5cblx0XHRcdFx0cmVsYXRlZFJlY29yZHMuZm9yRWFjaCAocmVsYXRlZFJlY29yZCkgLT5cblx0XHRcdFx0XHR0YWJsZVZhbHVlSXRlbSA9IHt9XG5cdFx0XHRcdFx0Xy5lYWNoIG1hcCwgKHZhbHVlS2V5LCBmaWVsZEtleSkgLT5cblx0XHRcdFx0XHRcdGlmIGZpZWxkS2V5ICE9ICdfRlJPTV9UQUJMRV9DT0RFJ1xuXHRcdFx0XHRcdFx0XHR0YWJsZUZpZWxkVmFsdWVcblx0XHRcdFx0XHRcdFx0Zm9ybUZpZWxkS2V5XG5cdFx0XHRcdFx0XHRcdGlmIHZhbHVlS2V5LnN0YXJ0c1dpdGgodGFibGVDb2RlICsgJy4nKVxuXHRcdFx0XHRcdFx0XHRcdGZvcm1GaWVsZEtleSA9ICh2YWx1ZUtleS5zcGxpdChcIi5cIilbMV0pXG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRmb3JtRmllbGRLZXkgPSB2YWx1ZUtleVxuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Zm9ybUZpZWxkID0gZ2V0Rm9ybVRhYmxlU3ViRmllbGQoZm9ybVRhYmxlRmllbGQsIGZvcm1GaWVsZEtleSlcblx0XHRcdFx0XHRcdFx0cmVsYXRlZE9iamVjdEZpZWxkID0gcmVsYXRlZE9iamVjdC5maWVsZHNbZmllbGRLZXldXG5cdFx0XHRcdFx0XHRcdGlmICFmb3JtRmllbGQgfHwgIXJlbGF0ZWRPYmplY3RGaWVsZFxuXHRcdFx0XHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRcdFx0XHR0YWJsZUZpZWxkVmFsdWUgPSBnZXRJbnN0YW5jZUZpZWxkVmFsdWUocmVsYXRlZE9iamVjdEZpZWxkLCBmb3JtRmllbGQsIHJlbGF0ZWRSZWNvcmQsIGZpZWxkS2V5LCBzcGFjZUlkLCByZWxhdGVkUmVjb3JkW2ZpZWxkS2V5XSwgZW5hYmxlQW1pc2Zvcm0pXG5cdFx0XHRcdFx0XHRcdHRhYmxlVmFsdWVJdGVtW2Zvcm1GaWVsZEtleV0gPSB0YWJsZUZpZWxkVmFsdWVcblx0XHRcdFx0XHRpZiAhXy5pc0VtcHR5KHRhYmxlVmFsdWVJdGVtKVxuXHRcdFx0XHRcdFx0dGFibGVWYWx1ZUl0ZW0uX2lkID0gcmVsYXRlZFJlY29yZC5faWRcblx0XHRcdFx0XHRcdHRhYmxlVmFsdWVzLnB1c2godGFibGVWYWx1ZUl0ZW0pXG5cdFx0XHRcdFx0XHRyZWxhdGVkVGFibGVJdGVtcy5wdXNoKHsgX3RhYmxlOiB7IF9pZDogcmVsYXRlZFJlY29yZC5faWQsIF9jb2RlOiB0YWJsZUNvZGUgfSB9IClcblxuXHRcdFx0XHR2YWx1ZXNbdGFibGVDb2RlXSA9IHRhYmxlVmFsdWVzXG5cdFx0XHRcdHJlbGF0ZWRUYWJsZXNJbmZvW3JlbGF0ZWRPYmplY3ROYW1lXSA9IHJlbGF0ZWRUYWJsZUl0ZW1zXG5cblx0XHQjIOWmguaenOmFjee9ruS6huiEmuacrOWImeaJp+ihjOiEmuacrFxuXHRcdGlmIG93LmZpZWxkX21hcF9zY3JpcHRcblx0XHRcdF8uZXh0ZW5kKHZhbHVlcywgdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5ldmFsRmllbGRNYXBTY3JpcHQob3cuZmllbGRfbWFwX3NjcmlwdCwgb2JqZWN0TmFtZSwgc3BhY2VJZCwgcmVjb3JkSWQpKVxuXG5cdCMg6L+H5ruk5o6JdmFsdWVz5Lit55qE6Z2e5rOVa2V5XG5cdGZpbHRlclZhbHVlcyA9IHt9XG5cdF8uZWFjaCBfLmtleXModmFsdWVzKSwgKGspIC0+XG5cdFx0aWYgZmllbGRDb2Rlcy5pbmNsdWRlcyhrKVxuXHRcdFx0ZmlsdGVyVmFsdWVzW2tdID0gdmFsdWVzW2tdXG5cblx0cmV0dXJuIGZpbHRlclZhbHVlc1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmV2YWxGaWVsZE1hcFNjcmlwdCA9IChmaWVsZF9tYXBfc2NyaXB0LCBvYmplY3ROYW1lLCBzcGFjZUlkLCBvYmplY3RJZCkgLT5cblx0IyByZWNvcmQgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0TmFtZSwgc3BhY2VJZCkuZmluZE9uZShvYmplY3RJZClcblx0cmVjb3JkID0gb2JqZWN0RmluZE9uZShvYmplY3ROYW1lLCB7IGZpbHRlcnM6IFtbJ19pZCcsICc9Jywgb2JqZWN0SWRdXSB9KVxuXHRzY3JpcHQgPSBcIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlY29yZCkgeyBcIiArIGZpZWxkX21hcF9zY3JpcHQgKyBcIiB9XCJcblx0ZnVuYyA9IF9ldmFsKHNjcmlwdCwgXCJmaWVsZF9tYXBfc2NyaXB0XCIpXG5cdHZhbHVlcyA9IGZ1bmMocmVjb3JkKVxuXHRpZiBfLmlzT2JqZWN0IHZhbHVlc1xuXHRcdHJldHVybiB2YWx1ZXNcblx0ZWxzZVxuXHRcdGNvbnNvbGUuZXJyb3IgXCJldmFsRmllbGRNYXBTY3JpcHQ6IOiEmuacrOi/lOWbnuWAvOexu+Wei+S4jeaYr+WvueixoVwiXG5cdHJldHVybiB7fVxuXG5cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZUF0dGFjaCA9IChyZWNvcmRJZHMsIHNwYWNlSWQsIGluc0lkLCBhcHByb3ZlSWQpIC0+XG5cblx0Q3JlYXRvci5Db2xsZWN0aW9uc1snY21zX2ZpbGVzJ10uZmluZCh7XG5cdFx0c3BhY2U6IHNwYWNlSWQsXG5cdFx0cGFyZW50OiByZWNvcmRJZHNcblx0fSkuZm9yRWFjaCAoY2YpIC0+XG5cdFx0Xy5lYWNoIGNmLnZlcnNpb25zLCAodmVyc2lvbklkLCBpZHgpIC0+XG5cdFx0XHRmID0gQ3JlYXRvci5Db2xsZWN0aW9uc1snY2ZzLmZpbGVzLmZpbGVyZWNvcmQnXS5maW5kT25lKHZlcnNpb25JZClcblx0XHRcdG5ld0ZpbGUgPSBuZXcgRlMuRmlsZSgpXG5cblx0XHRcdG5ld0ZpbGUuYXR0YWNoRGF0YSBmLmNyZWF0ZVJlYWRTdHJlYW0oJ2ZpbGVzJyksIHtcblx0XHRcdFx0XHR0eXBlOiBmLm9yaWdpbmFsLnR5cGVcblx0XHRcdH0sIChlcnIpIC0+XG5cdFx0XHRcdGlmIChlcnIpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnIuZXJyb3IsIGVyci5yZWFzb24pXG5cblx0XHRcdFx0bmV3RmlsZS5uYW1lKGYubmFtZSgpKVxuXHRcdFx0XHRuZXdGaWxlLnNpemUoZi5zaXplKCkpXG5cdFx0XHRcdG1ldGFkYXRhID0ge1xuXHRcdFx0XHRcdG93bmVyOiBmLm1ldGFkYXRhLm93bmVyLFxuXHRcdFx0XHRcdG93bmVyX25hbWU6IGYubWV0YWRhdGEub3duZXJfbmFtZSxcblx0XHRcdFx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRcdFx0XHRpbnN0YW5jZTogaW5zSWQsXG5cdFx0XHRcdFx0YXBwcm92ZTogYXBwcm92ZUlkXG5cdFx0XHRcdFx0cGFyZW50OiBjZi5faWRcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIGlkeCBpcyAwXG5cdFx0XHRcdFx0bWV0YWRhdGEuY3VycmVudCA9IHRydWVcblxuXHRcdFx0XHRuZXdGaWxlLm1ldGFkYXRhID0gbWV0YWRhdGFcblx0XHRcdFx0Y2ZzLmluc3RhbmNlcy5pbnNlcnQobmV3RmlsZSlcblxuXHRyZXR1cm5cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlY29yZEluc3RhbmNlSW5mbyA9IChyZWNvcmRJZHMsIGluc0lkLCBzcGFjZUlkKSAtPlxuXHQjIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWNvcmRJZHMubywgc3BhY2VJZCkudXBkYXRlKHJlY29yZElkcy5pZHNbMF0sIHtcblx0IyBcdCRwdXNoOiB7XG5cdCMgXHRcdGluc3RhbmNlczoge1xuXHQjIFx0XHRcdCRlYWNoOiBbe1xuXHQjIFx0XHRcdFx0X2lkOiBpbnNJZCxcblx0IyBcdFx0XHRcdHN0YXRlOiAnZHJhZnQnXG5cdCMgXHRcdFx0fV0sXG5cdCMgXHRcdFx0JHBvc2l0aW9uOiAwXG5cdCMgXHRcdH1cblx0IyBcdH0sXG5cdCMgXHQkc2V0OiB7XG5cdCMgXHRcdGxvY2tlZDogdHJ1ZVxuXHQjIFx0XHRpbnN0YW5jZV9zdGF0ZTogJ2RyYWZ0J1xuXHQjIFx0fVxuXHQjIH0pXG5cdG9iamVjdFVwZGF0ZShyZWNvcmRJZHMubywgcmVjb3JkSWRzLmlkc1swXSwge1xuXHRcdGluc3RhbmNlczogW3tcblx0XHRcdF9pZDogaW5zSWQsXG5cdFx0XHRzdGF0ZTogJ2RyYWZ0J1xuXHRcdH1dLFxuXHRcdGxvY2tlZDogdHJ1ZSxcblx0XHRpbnN0YW5jZV9zdGF0ZTogJ2RyYWZ0J1xuXHR9KVxuXG5cdHJldHVyblxuXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVSZWxhdGVkUmVjb3JkSW5zdGFuY2VJbmZvID0gKHJlbGF0ZWRUYWJsZXNJbmZvLCBpbnNJZCwgc3BhY2VJZCkgLT5cblx0Xy5lYWNoIHJlbGF0ZWRUYWJsZXNJbmZvLCAodGFibGVJdGVtcywgcmVsYXRlZE9iamVjdE5hbWUpIC0+XG5cdFx0cmVsYXRlZENvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVsYXRlZE9iamVjdE5hbWUsIHNwYWNlSWQpXG5cdFx0Xy5lYWNoIHRhYmxlSXRlbXMsIChpdGVtKSAtPlxuXHRcdFx0cmVsYXRlZENvbGxlY3Rpb24uZGlyZWN0LnVwZGF0ZShpdGVtLl90YWJsZS5faWQsIHtcblx0XHRcdFx0JHNldDoge1xuXHRcdFx0XHRcdGluc3RhbmNlczogW3tcblx0XHRcdFx0XHRcdF9pZDogaW5zSWQsXG5cdFx0XHRcdFx0XHRzdGF0ZTogJ2RyYWZ0J1xuXHRcdFx0XHRcdH1dLFxuXHRcdFx0XHRcdF90YWJsZTogaXRlbS5fdGFibGVcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHRyZXR1cm5cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jaGVja0lzSW5BcHByb3ZhbCA9IChyZWNvcmRJZHMsIHNwYWNlSWQpIC0+XG5cdCMgcmVjb3JkID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlY29yZElkcy5vLCBzcGFjZUlkKS5maW5kT25lKHtcblx0IyBcdF9pZDogcmVjb3JkSWRzLmlkc1swXSwgaW5zdGFuY2VzOiB7ICRleGlzdHM6IHRydWUgfVxuXHQjIH0sIHsgZmllbGRzOiB7IGluc3RhbmNlczogMSB9IH0pXG5cdHJlY29yZCA9IG9iamVjdEZpbmRPbmUocmVjb3JkSWRzLm8sIHsgZmlsdGVyczogW1snX2lkJywgJz0nLCByZWNvcmRJZHMuaWRzWzBdXV0sIGZpZWxkczogWydpbnN0YW5jZXMnXSB9KVxuXG5cdGlmIHJlY29yZCBhbmQgcmVjb3JkLmluc3RhbmNlcyBhbmQgcmVjb3JkLmluc3RhbmNlc1swXS5zdGF0ZSBpc250ICdjb21wbGV0ZWQnIGFuZCBDcmVhdG9yLkNvbGxlY3Rpb25zLmluc3RhbmNlcy5maW5kKHJlY29yZC5pbnN0YW5jZXNbMF0uX2lkKS5jb3VudCgpID4gMFxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5q2k6K6w5b2V5bey5Y+R6LW35rWB56iL5q2j5Zyo5a6h5om55Lit77yM5b6F5a6h5om557uT5p2f5pa55Y+v5Y+R6LW35LiL5LiA5qyh5a6h5om577yBXCIpXG5cblx0cmV0dXJuXG5cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5mb3JtYXREYXRlID0gKGRhdGUpIC0+XG5cdHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSIsInZhciBfZXZhbCwgY2hlY2tSZXF1aXJlZERldGFpbHMsIGdldEZpZWxkT2RhdGFWYWx1ZSwgZ2V0RmlsZUZpZWxkVmFsdWUsIGdldEZvcm1GaWVsZCwgZ2V0Rm9ybVRhYmxlRmllbGQsIGdldEZvcm1UYWJsZUZpZWxkQ29kZSwgZ2V0Rm9ybVRhYmxlU3ViRmllbGQsIGdldEluc3RhbmNlRmllbGRWYWx1ZSwgZ2V0T2JqZWN0Q29uZmlnLCBnZXRPYmplY3ROYW1lRmllbGRLZXksIGdldFJlbGF0ZWRPYmplY3RGaWVsZENvZGUsIGdldFJlbGF0ZWRzLCBnZXRTZWxlY3RPcmdWYWx1ZSwgZ2V0U2VsZWN0T3JnVmFsdWVzLCBnZXRTZWxlY3RVc2VyVmFsdWUsIGdldFNlbGVjdFVzZXJWYWx1ZXMsIG9iamVjdEZpbmQsIG9iamVjdEZpbmRPbmUsIG9iamVjdFVwZGF0ZSwgb2JqZWN0cWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbl9ldmFsID0gcmVxdWlyZSgnZXZhbCcpO1xuXG5vYmplY3RxbCA9IHJlcXVpcmUoJ0BzdGVlZG9zL29iamVjdHFsJyk7XG5cbmdldE9iamVjdENvbmZpZyA9IGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUpIHtcbiAgcmV0dXJuIG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS50b0NvbmZpZygpO1xufTtcblxuZ2V0T2JqZWN0TmFtZUZpZWxkS2V5ID0gZnVuY3Rpb24ob2JqZWN0QXBpTmFtZSkge1xuICByZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLk5BTUVfRklFTERfS0VZO1xufTtcblxuZ2V0UmVsYXRlZHMgPSBmdW5jdGlvbihvYmplY3RBcGlOYW1lKSB7XG4gIHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUsIGNiKSB7XG4gICAgcmV0dXJuIG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS5nZXRSZWxhdGVkcygpLnRoZW4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICByZXR1cm4gY2IocmVqZWN0LCByZXNvbHZlKTtcbiAgICB9KTtcbiAgfSkob2JqZWN0QXBpTmFtZSk7XG59O1xuXG5vYmplY3RGaW5kT25lID0gZnVuY3Rpb24ob2JqZWN0QXBpTmFtZSwgcXVlcnkpIHtcbiAgcmV0dXJuIE1ldGVvci53cmFwQXN5bmMoZnVuY3Rpb24ob2JqZWN0QXBpTmFtZSwgcXVlcnksIGNiKSB7XG4gICAgcXVlcnkudG9wID0gMTtcbiAgICByZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLmZpbmQocXVlcnkpLnRoZW4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAocmVzb2x2ZSAmJiByZXNvbHZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKHJlamVjdCwgcmVzb2x2ZVswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2IocmVqZWN0LCBudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkob2JqZWN0QXBpTmFtZSwgcXVlcnkpO1xufTtcblxub2JqZWN0RmluZCA9IGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUsIHF1ZXJ5KSB7XG4gIHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUsIHF1ZXJ5LCBjYikge1xuICAgIHJldHVybiBvYmplY3RxbC5nZXRPYmplY3Qob2JqZWN0QXBpTmFtZSkuZmluZChxdWVyeSkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJldHVybiBjYihyZWplY3QsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9KShvYmplY3RBcGlOYW1lLCBxdWVyeSk7XG59O1xuXG5vYmplY3RVcGRhdGUgPSBmdW5jdGlvbihvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSkge1xuICByZXR1cm4gTWV0ZW9yLndyYXBBc3luYyhmdW5jdGlvbihvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSwgY2IpIHtcbiAgICByZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLnVwZGF0ZShpZCwgZGF0YSkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJldHVybiBjYihyZWplY3QsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9KShvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSk7XG59O1xuXG5nZXRSZWxhdGVkT2JqZWN0RmllbGRDb2RlID0gZnVuY3Rpb24ocmVsYXRlZE9iamVjdHNLZXlzLCBrZXkpIHtcbiAgcmV0dXJuIF8uZmluZChyZWxhdGVkT2JqZWN0c0tleXMsIGZ1bmN0aW9uKHJlbGF0ZWRPYmplY3RzS2V5KSB7XG4gICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKHJlbGF0ZWRPYmplY3RzS2V5ICsgJy4nKTtcbiAgfSk7XG59O1xuXG5nZXRGb3JtVGFibGVGaWVsZENvZGUgPSBmdW5jdGlvbihmb3JtVGFibGVGaWVsZHNDb2RlLCBrZXkpIHtcbiAgcmV0dXJuIF8uZmluZChmb3JtVGFibGVGaWVsZHNDb2RlLCBmdW5jdGlvbihmb3JtVGFibGVGaWVsZENvZGUpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoZm9ybVRhYmxlRmllbGRDb2RlICsgJy4nKTtcbiAgfSk7XG59O1xuXG5nZXRGb3JtVGFibGVGaWVsZCA9IGZ1bmN0aW9uKGZvcm1UYWJsZUZpZWxkcywga2V5KSB7XG4gIHJldHVybiBfLmZpbmQoZm9ybVRhYmxlRmllbGRzLCBmdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuIGYuY29kZSA9PT0ga2V5O1xuICB9KTtcbn07XG5cbmdldEZvcm1GaWVsZCA9IGZ1bmN0aW9uKGZvcm1GaWVsZHMsIGtleSkge1xuICB2YXIgZmY7XG4gIGZmID0gbnVsbDtcbiAgXy5mb3JFYWNoKGZvcm1GaWVsZHMsIGZ1bmN0aW9uKGYpIHtcbiAgICBpZiAoZmYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGYudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmYgPSBfLmZpbmQoZi5maWVsZHMsIGZ1bmN0aW9uKHNmKSB7XG4gICAgICAgIHJldHVybiBzZi5jb2RlID09PSBrZXk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGYuY29kZSA9PT0ga2V5KSB7XG4gICAgICByZXR1cm4gZmYgPSBmO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmZjtcbn07XG5cbmdldEZvcm1UYWJsZVN1YkZpZWxkID0gZnVuY3Rpb24odGFibGVGaWVsZCwgc3ViRmllbGRDb2RlKSB7XG4gIHJldHVybiBfLmZpbmQodGFibGVGaWVsZC5maWVsZHMsIGZ1bmN0aW9uKGYpIHtcbiAgICByZXR1cm4gZi5jb2RlID09PSBzdWJGaWVsZENvZGU7XG4gIH0pO1xufTtcblxuZ2V0RmllbGRPZGF0YVZhbHVlID0gZnVuY3Rpb24ob2JqTmFtZSwgaWQsIHJlZmVyZW5jZVRvRmllbGROYW1lKSB7XG4gIHZhciBfcmVjb3JkLCBfcmVjb3JkcywgbmFtZUtleSwgb2JqO1xuICBvYmogPSBvYmplY3RxbC5nZXRPYmplY3Qob2JqTmFtZSk7XG4gIG5hbWVLZXkgPSBnZXRPYmplY3ROYW1lRmllbGRLZXkob2JqTmFtZSk7XG4gIGlmICghb2JqKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKGlkKSkge1xuICAgIF9yZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iak5hbWUsIHtcbiAgICAgIGZpbHRlcnM6IFtbcmVmZXJlbmNlVG9GaWVsZE5hbWUsICc9JywgaWRdXVxuICAgIH0pO1xuICAgIGlmIChfcmVjb3JkKSB7XG4gICAgICBfcmVjb3JkWydAbGFiZWwnXSA9IF9yZWNvcmRbbmFtZUtleV07XG4gICAgICByZXR1cm4gX3JlY29yZDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXy5pc0FycmF5KGlkKSkge1xuICAgIF9yZWNvcmRzID0gW107XG4gICAgb2JqZWN0RmluZChvYmpOYW1lLCB7XG4gICAgICBmaWx0ZXJzOiBbW3JlZmVyZW5jZVRvRmllbGROYW1lLCAnaW4nLCBpZF1dXG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbihfcmVjb3JkKSB7XG4gICAgICBfcmVjb3JkWydAbGFiZWwnXSA9IF9yZWNvcmRbbmFtZUtleV07XG4gICAgICByZXR1cm4gX3JlY29yZHMucHVzaChfcmVjb3JkKTtcbiAgICB9KTtcbiAgICBpZiAoIV8uaXNFbXB0eShfcmVjb3JkcykpIHtcbiAgICAgIHJldHVybiBfcmVjb3JkcztcbiAgICB9XG4gIH1cbn07XG5cbmdldFNlbGVjdFVzZXJWYWx1ZSA9IGZ1bmN0aW9uKHVzZXJJZCwgc3BhY2VJZCkge1xuICB2YXIgc3U7XG4gIHN1ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdzcGFjZV91c2VycycpLmZpbmRPbmUoe1xuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIHVzZXI6IHVzZXJJZFxuICB9KTtcbiAgc3UuaWQgPSB1c2VySWQ7XG4gIHJldHVybiBzdTtcbn07XG5cbmdldFNlbGVjdFVzZXJWYWx1ZXMgPSBmdW5jdGlvbih1c2VySWRzLCBzcGFjZUlkKSB7XG4gIHZhciBzdXM7XG4gIHN1cyA9IFtdO1xuICBpZiAoXy5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgXy5lYWNoKHVzZXJJZHMsIGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgdmFyIHN1O1xuICAgICAgc3UgPSBnZXRTZWxlY3RVc2VyVmFsdWUodXNlcklkLCBzcGFjZUlkKTtcbiAgICAgIGlmIChzdSkge1xuICAgICAgICByZXR1cm4gc3VzLnB1c2goc3UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdXM7XG59O1xuXG5nZXRTZWxlY3RPcmdWYWx1ZSA9IGZ1bmN0aW9uKG9yZ0lkLCBzcGFjZUlkKSB7XG4gIHZhciBvcmc7XG4gIG9yZyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignb3JnYW5pemF0aW9ucycpLmZpbmRPbmUob3JnSWQsIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIG5hbWU6IDEsXG4gICAgICBmdWxsbmFtZTogMVxuICAgIH1cbiAgfSk7XG4gIG9yZy5pZCA9IG9yZ0lkO1xuICByZXR1cm4gb3JnO1xufTtcblxuZ2V0U2VsZWN0T3JnVmFsdWVzID0gZnVuY3Rpb24ob3JnSWRzLCBzcGFjZUlkKSB7XG4gIHZhciBvcmdzO1xuICBvcmdzID0gW107XG4gIGlmIChfLmlzQXJyYXkob3JnSWRzKSkge1xuICAgIF8uZWFjaChvcmdJZHMsIGZ1bmN0aW9uKG9yZ0lkKSB7XG4gICAgICB2YXIgb3JnO1xuICAgICAgb3JnID0gZ2V0U2VsZWN0T3JnVmFsdWUob3JnSWQsIHNwYWNlSWQpO1xuICAgICAgaWYgKG9yZykge1xuICAgICAgICByZXR1cm4gb3Jncy5wdXNoKG9yZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9yZ3M7XG59O1xuXG5nZXRGaWxlRmllbGRWYWx1ZSA9IGZ1bmN0aW9uKHJlY29yZEZpZWxkSWQsIGZUeXBlKSB7XG4gIHZhciBjb2xsZWN0aW9uLCBmaWxlcywgcXVlcnksIHZhbHVlO1xuICBpZiAoXy5pc0VtcHR5KHJlY29yZEZpZWxkSWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmVHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIGNvbGxlY3Rpb24gPSAnaW1hZ2VzJztcbiAgfSBlbHNlIGlmIChmVHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgY29sbGVjdGlvbiA9ICdmaWxlcyc7XG4gIH1cbiAgaWYgKF8uaXNTdHJpbmcocmVjb3JkRmllbGRJZCkpIHtcbiAgICBxdWVyeSA9IHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IFtyZWNvcmRGaWVsZElkXVxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkgPSB7XG4gICAgICBfaWQ6IHtcbiAgICAgICAgJGluOiByZWNvcmRGaWVsZElkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmaWxlcyA9IENyZWF0b3IuQ29sbGVjdGlvbnNbXCJjZnMuXCIgKyBjb2xsZWN0aW9uICsgXCIuZmlsZXJlY29yZFwiXS5maW5kKHF1ZXJ5KTtcbiAgdmFsdWUgPSBbXTtcbiAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgdmFyIG5ld0ZpbGU7XG4gICAgbmV3RmlsZSA9IG5ldyBGUy5GaWxlKCk7XG4gICAgcmV0dXJuIG5ld0ZpbGUuYXR0YWNoRGF0YShmLmNyZWF0ZVJlYWRTdHJlYW0oJ2ZpbGVzJyksIHtcbiAgICAgIHR5cGU6IGYub3JpZ2luYWwudHlwZVxuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgdmFyIG1ldGFkYXRhO1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVyci5lcnJvciwgZXJyLnJlYXNvbik7XG4gICAgICB9XG4gICAgICBuZXdGaWxlLm5hbWUoZi5uYW1lKCkpO1xuICAgICAgbmV3RmlsZS5zaXplKGYuc2l6ZSgpKTtcbiAgICAgIG1ldGFkYXRhID0ge1xuICAgICAgICBvd25lcjogZi5tZXRhZGF0YS5vd25lclxuICAgICAgfTtcbiAgICAgIG5ld0ZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgIG5ld0ZpbGUuX2lkID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5pbnN0YW5jZXMuX21ha2VOZXdJRCgpO1xuICAgICAgY2ZzW2NvbGxlY3Rpb25dLmluc2VydChuZXdGaWxlKTtcbiAgICAgIHJldHVybiB2YWx1ZS5wdXNoKG5ld0ZpbGUuX2lkKTtcbiAgICB9KTtcbiAgfSk7XG4gIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgaWYgKF8uaXNTdHJpbmcocmVjb3JkRmllbGRJZCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufTtcblxuZ2V0SW5zdGFuY2VGaWVsZFZhbHVlID0gZnVuY3Rpb24ob2JqRmllbGQsIGZvcm1GaWVsZCwgcmVjb3JkLCBvYmplY3RfZmllbGQsIHNwYWNlSWQsIHJlY29yZEZpZWxkVmFsdWUsIGVuYWJsZUFtaXNmb3JtKSB7XG4gIHZhciBvZGF0YUZpZWxkVmFsdWUsIHJlZmVyZW5jZVRvRmllbGROYW1lLCByZWZlcmVuY2VUb09iamVjdE5hbWUsIHNlbGVjdEZpZWxkVmFsdWUsIHZhbHVlO1xuICBpZiAoZW5hYmxlQW1pc2Zvcm0gJiYgZm9ybUZpZWxkLnN0ZWVkb3NfZmllbGQpIHtcbiAgICByZXR1cm4gcmVjb3JkRmllbGRWYWx1ZTtcbiAgfVxuICByZWNvcmRGaWVsZFZhbHVlID0gcmVjb3JkW29iakZpZWxkLm5hbWVdO1xuICB2YWx1ZTtcbiAgaWYgKGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiBmb3JtRmllbGQudHlwZSA9PT0gJ29kYXRhJyAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmpGaWVsZC5yZWZlcmVuY2VfdG8pKSB7XG4gICAgcmVmZXJlbmNlVG9GaWVsZE5hbWUgPSBvYmpGaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCc7XG4gICAgcmVmZXJlbmNlVG9PYmplY3ROYW1lID0gb2JqRmllbGQucmVmZXJlbmNlX3RvO1xuICAgIG9kYXRhRmllbGRWYWx1ZTtcbiAgICBpZiAob2JqRmllbGQubXVsdGlwbGUgJiYgZm9ybUZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICBvZGF0YUZpZWxkVmFsdWUgPSBnZXRGaWVsZE9kYXRhVmFsdWUocmVmZXJlbmNlVG9PYmplY3ROYW1lLCByZWNvcmRGaWVsZFZhbHVlLCByZWZlcmVuY2VUb0ZpZWxkTmFtZSk7XG4gICAgfSBlbHNlIGlmICghb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgb2RhdGFGaWVsZFZhbHVlID0gZ2V0RmllbGRPZGF0YVZhbHVlKHJlZmVyZW5jZVRvT2JqZWN0TmFtZSwgcmVjb3JkRmllbGRWYWx1ZSwgcmVmZXJlbmNlVG9GaWVsZE5hbWUpO1xuICAgIH1cbiAgICB2YWx1ZSA9IG9kYXRhRmllbGRWYWx1ZTtcbiAgfSBlbHNlIGlmIChmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgWyd1c2VyJywgJ2dyb3VwJ10uaW5jbHVkZXMoZm9ybUZpZWxkLnR5cGUpICYmIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhvYmpGaWVsZC50eXBlKSAmJiAoWyd1c2VycycsICdvcmdhbml6YXRpb25zJ10uaW5jbHVkZXMob2JqRmllbGQucmVmZXJlbmNlX3RvKSB8fCAoJ3NwYWNlX3VzZXJzJyA9PT0gb2JqRmllbGQucmVmZXJlbmNlX3RvICYmICd1c2VyJyA9PT0gb2JqRmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkKSkpIHtcbiAgICBpZiAoIV8uaXNFbXB0eShyZWNvcmRGaWVsZFZhbHVlKSkge1xuICAgICAgc2VsZWN0RmllbGRWYWx1ZTtcbiAgICAgIGlmIChmb3JtRmllbGQudHlwZSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGlmIChvYmpGaWVsZC5tdWx0aXBsZSAmJiBmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICBzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0VXNlclZhbHVlcyhyZWNvcmRGaWVsZFZhbHVlLCBzcGFjZUlkKTtcbiAgICAgICAgfSBlbHNlIGlmICghb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgIHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RVc2VyVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgaWYgKG9iakZpZWxkLm11bHRpcGxlICYmIGZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgIHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RPcmdWYWx1ZXMocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9iakZpZWxkLm11bHRpcGxlICYmICFmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICBzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0T3JnVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RGaWVsZFZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gc2VsZWN0RmllbGRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIGZvcm1GaWVsZC50eXBlID09PSAnZGF0ZScgJiYgcmVjb3JkRmllbGRWYWx1ZSkge1xuICAgIHZhbHVlID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5mb3JtYXREYXRlKHJlY29yZEZpZWxkVmFsdWUpO1xuICB9IGVsc2UgaWYgKGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiByZWNvcmRGaWVsZFZhbHVlICYmIChmb3JtRmllbGQudHlwZSA9PT0gJ2ltYWdlJyB8fCBmb3JtRmllbGQudHlwZSA9PT0gJ2ZpbGUnKSkge1xuICAgIHZhbHVlID0gZ2V0RmlsZUZpZWxkVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgZm9ybUZpZWxkLnR5cGUpO1xuICB9IGVsc2UgaWYgKGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiByZWNvcmRGaWVsZFZhbHVlICYmIGZvcm1GaWVsZC50eXBlID09PSAnbG9va3VwJyAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmpGaWVsZC5yZWZlcmVuY2VfdG8pKSB7XG4gICAgdmFsdWUgPSByZWNvcmRGaWVsZFZhbHVlO1xuICB9IGVsc2UgaWYgKGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiByZWNvcmRGaWVsZFZhbHVlICYmIChmb3JtRmllbGQudHlwZSA9PT0gJ211bHRpU2VsZWN0JykpIHtcbiAgICB2YWx1ZSA9IHJlY29yZEZpZWxkVmFsdWUuam9pbignLCcpO1xuICB9IGVsc2UgaWYgKHJlY29yZC5oYXNPd25Qcm9wZXJ0eShvYmplY3RfZmllbGQpKSB7XG4gICAgdmFsdWUgPSByZWNvcmRGaWVsZFZhbHVlO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmNoZWNrUmVxdWlyZWREZXRhaWxzID0gZnVuY3Rpb24ocmVxdWlyZWREZXRhaWxzLCBtYXN0ZXJSZWNvcmQpIHtcbiAgaWYgKCFfLmlzRW1wdHkocmVxdWlyZWREZXRhaWxzKSkge1xuICAgIHJlcXVpcmVkRGV0YWlscy5mb3JFYWNoKGZ1bmN0aW9uKHJkKSB7XG4gICAgICB2YXIgbWFzdGVyRmllbGQsIG1hc3RlckZpZWxkVmFsdWUsIHJlZklkLCBzdWJPYmpDb25maWcsIHN1YlRhYmxlTWFzdGVyRmllbGQsIHN1YlRhYmxlTmFtZSwgc3ViVGFibGVSZWNvcmQ7XG4gICAgICBzdWJUYWJsZU5hbWUgPSByZC5zcGxpdCgnLicpWzBdO1xuICAgICAgc3ViVGFibGVNYXN0ZXJGaWVsZCA9IHJkLnNwbGl0KCcuJylbMV07XG4gICAgICBzdWJPYmpDb25maWcgPSBnZXRPYmplY3RDb25maWcoc3ViVGFibGVOYW1lKTtcbiAgICAgIG1hc3RlckZpZWxkID0gc3ViT2JqQ29uZmlnLmZpZWxkc1tzdWJUYWJsZU1hc3RlckZpZWxkXTtcbiAgICAgIHJlZklkID0gbWFzdGVyRmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkIHx8ICdfaWQnO1xuICAgICAgbWFzdGVyRmllbGRWYWx1ZSA9IG1hc3RlclJlY29yZFtyZWZJZF07XG4gICAgICBzdWJUYWJsZVJlY29yZCA9IG9iamVjdEZpbmRPbmUoc3ViVGFibGVOYW1lLCB7XG4gICAgICAgIGZpbHRlcnM6IFtbc3ViVGFibGVNYXN0ZXJGaWVsZCwgJz0nLCBtYXN0ZXJGaWVsZFZhbHVlXV0sXG4gICAgICAgIGZpZWxkczogW3N1YlRhYmxlTWFzdGVyRmllbGRdXG4gICAgICB9KTtcbiAgICAgIGlmICghc3ViVGFibGVSZWNvcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi6K+35YWI5paw5aKeXCIgKyBzdWJPYmpDb25maWcubGFiZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsID0ge307XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY2hlY2tfYXV0aG9yaXphdGlvbiA9IGZ1bmN0aW9uKHJlcSkge1xuICB2YXIgYXV0aFRva2VuLCBoYXNoZWRUb2tlbiwgcXVlcnksIHVzZXIsIHVzZXJJZDtcbiAgcXVlcnkgPSByZXEucXVlcnk7XG4gIHVzZXJJZCA9IHF1ZXJ5W1wiWC1Vc2VyLUlkXCJdO1xuICBhdXRoVG9rZW4gPSBxdWVyeVtcIlgtQXV0aC1Ub2tlblwiXTtcbiAgaWYgKCF1c2VySWQgfHwgIWF1dGhUb2tlbikge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAxLCAnVW5hdXRob3JpemVkJyk7XG4gIH1cbiAgaGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYXV0aFRva2VuKTtcbiAgdXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtcbiAgICBfaWQ6IHVzZXJJZCxcbiAgICBcInNlcnZpY2VzLnJlc3VtZS5sb2dpblRva2Vucy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuICB9KTtcbiAgaWYgKCF1c2VyKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDEsICdVbmF1dGhvcml6ZWQnKTtcbiAgfVxuICByZXR1cm4gdXNlcjtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2UgPSBmdW5jdGlvbihzcGFjZV9pZCkge1xuICB2YXIgc3BhY2U7XG4gIHNwYWNlID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zcGFjZXMuZmluZE9uZShzcGFjZV9pZCk7XG4gIGlmICghc3BhY2UpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcInNwYWNlX2lk5pyJ6K+v5oiW5q2kc3BhY2Xlt7Lnu4/ooqvliKDpmaRcIik7XG4gIH1cbiAgcmV0dXJuIHNwYWNlO1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGbG93ID0gZnVuY3Rpb24oZmxvd19pZCkge1xuICB2YXIgZmxvdztcbiAgZmxvdyA9IENyZWF0b3IuQ29sbGVjdGlvbnMuZmxvd3MuZmluZE9uZShmbG93X2lkKTtcbiAgaWYgKCFmbG93KSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCJpZOacieivr+aIluatpOa1geeoi+W3sue7j+iiq+WIoOmZpFwiKTtcbiAgfVxuICByZXR1cm4gZmxvdztcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2VVc2VyID0gZnVuY3Rpb24oc3BhY2VfaWQsIHVzZXJfaWQpIHtcbiAgdmFyIHNwYWNlX3VzZXI7XG4gIHNwYWNlX3VzZXIgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICB1c2VyOiB1c2VyX2lkXG4gIH0pO1xuICBpZiAoIXNwYWNlX3VzZXIpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcInVzZXJfaWTlr7nlupTnmoTnlKjmiLfkuI3lsZ7kuo7lvZPliY1zcGFjZVwiKTtcbiAgfVxuICByZXR1cm4gc3BhY2VfdXNlcjtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2VVc2VyT3JnSW5mbyA9IGZ1bmN0aW9uKHNwYWNlX3VzZXIpIHtcbiAgdmFyIGluZm8sIG9yZztcbiAgaW5mbyA9IG5ldyBPYmplY3Q7XG4gIGluZm8ub3JnYW5pemF0aW9uID0gc3BhY2VfdXNlci5vcmdhbml6YXRpb247XG4gIG9yZyA9IENyZWF0b3IuQ29sbGVjdGlvbnMub3JnYW5pemF0aW9ucy5maW5kT25lKHNwYWNlX3VzZXIub3JnYW5pemF0aW9uLCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgZnVsbG5hbWU6IDFcbiAgICB9XG4gIH0pO1xuICBpbmZvLm9yZ2FuaXphdGlvbl9uYW1lID0gb3JnLm5hbWU7XG4gIGluZm8ub3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gb3JnLmZ1bGxuYW1lO1xuICByZXR1cm4gaW5mbztcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaXNGbG93RW5hYmxlZCA9IGZ1bmN0aW9uKGZsb3cpIHtcbiAgaWYgKGZsb3cuc3RhdGUgIT09IFwiZW5hYmxlZFwiKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLmtYHnqIvmnKrlkK/nlKgs5pON5L2c5aSx6LSlXCIpO1xuICB9XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd1NwYWNlTWF0Y2hlZCA9IGZ1bmN0aW9uKGZsb3csIHNwYWNlX2lkKSB7XG4gIGlmIChmbG93LnNwYWNlICE9PSBzcGFjZV9pZCkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5rWB56iL5ZKM5bel5L2c5Yy6SUTkuI3ljLnphY1cIik7XG4gIH1cbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Rm9ybSA9IGZ1bmN0aW9uKGZvcm1faWQpIHtcbiAgdmFyIGZvcm07XG4gIGZvcm0gPSBDcmVhdG9yLkNvbGxlY3Rpb25zLmZvcm1zLmZpbmRPbmUoZm9ybV9pZCk7XG4gIGlmICghZm9ybSkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsICfooajljZVJROacieivr+aIluatpOihqOWNleW3sue7j+iiq+WIoOmZpCcpO1xuICB9XG4gIHJldHVybiBmb3JtO1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRDYXRlZ29yeSA9IGZ1bmN0aW9uKGNhdGVnb3J5X2lkKSB7XG4gIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLmNhdGVnb3JpZXMuZmluZE9uZShjYXRlZ29yeV9pZCk7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrU3luY0RpcmVjdGlvbiA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBmbG93X2lkKSB7XG4gIHZhciBvdywgc3luY0RpcmVjdGlvbjtcbiAgb3cgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLm9iamVjdF93b3JrZmxvd3MuZmluZE9uZSh7XG4gICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgIGZsb3dfaWQ6IGZsb3dfaWRcbiAgfSk7XG4gIGlmICghb3cpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCAn5pyq5om+5Yiw5a+56LGh5rWB56iL5pig5bCE6K6w5b2V44CCJyk7XG4gIH1cbiAgc3luY0RpcmVjdGlvbiA9IG93LnN5bmNfZGlyZWN0aW9uIHx8ICdib3RoJztcbiAgaWYgKCFbJ2JvdGgnLCAnb2JqX3RvX2lucyddLmluY2x1ZGVzKHN5bmNEaXJlY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgJ+S4jeaUr+aMgeeahOWQjOatpeaWueWQkeOAgicpO1xuICB9XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNyZWF0ZV9pbnN0YW5jZSA9IGZ1bmN0aW9uKGluc3RhbmNlX2Zyb21fY2xpZW50LCB1c2VyX2luZm8pIHtcbiAgdmFyIGFwcHJfb2JqLCBhcHByb3ZlX2Zyb21fY2xpZW50LCBjYXRlZ29yeSwgZmxvdywgZmxvd19pZCwgZm9ybSwgaW5zX29iaiwgbmV3X2luc19pZCwgbm93LCBwZXJtaXNzaW9ucywgcmVsYXRlZFRhYmxlc0luZm8sIHNwYWNlLCBzcGFjZV9pZCwgc3BhY2VfdXNlciwgc3BhY2VfdXNlcl9vcmdfaW5mbywgc3RhcnRfc3RlcCwgdHJhY2VfZnJvbV9jbGllbnQsIHRyYWNlX29iaiwgdXNlcl9pZDtcbiAgY2hlY2soaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0sIFN0cmluZyk7XG4gIGNoZWNrKGluc3RhbmNlX2Zyb21fY2xpZW50W1wic3BhY2VcIl0sIFN0cmluZyk7XG4gIGNoZWNrKGluc3RhbmNlX2Zyb21fY2xpZW50W1wiZmxvd1wiXSwgU3RyaW5nKTtcbiAgY2hlY2soaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJyZWNvcmRfaWRzXCJdLCBbXG4gICAge1xuICAgICAgbzogU3RyaW5nLFxuICAgICAgaWRzOiBbU3RyaW5nXVxuICAgIH1cbiAgXSk7XG4gIHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY2hlY2tTeW5jRGlyZWN0aW9uKGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXVswXS5vLCBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImZsb3dcIl0pO1xuICB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrSXNJbkFwcHJvdmFsKGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXVswXSwgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJzcGFjZVwiXSk7XG4gIHNwYWNlX2lkID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJzcGFjZVwiXTtcbiAgZmxvd19pZCA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiZmxvd1wiXTtcbiAgdXNlcl9pZCA9IHVzZXJfaW5mby5faWQ7XG4gIHRyYWNlX2Zyb21fY2xpZW50ID0gbnVsbDtcbiAgYXBwcm92ZV9mcm9tX2NsaWVudCA9IG51bGw7XG4gIGlmIChpbnN0YW5jZV9mcm9tX2NsaWVudFtcInRyYWNlc1wiXSAmJiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInRyYWNlc1wiXVswXSkge1xuICAgIHRyYWNlX2Zyb21fY2xpZW50ID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJ0cmFjZXNcIl1bMF07XG4gICAgaWYgKHRyYWNlX2Zyb21fY2xpZW50W1wiYXBwcm92ZXNcIl0gJiYgdHJhY2VfZnJvbV9jbGllbnRbXCJhcHByb3Zlc1wiXVswXSkge1xuICAgICAgYXBwcm92ZV9mcm9tX2NsaWVudCA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1widHJhY2VzXCJdWzBdW1wiYXBwcm92ZXNcIl1bMF07XG4gICAgfVxuICB9XG4gIHNwYWNlID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZShzcGFjZV9pZCk7XG4gIGZsb3cgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZsb3coZmxvd19pZCk7XG4gIHNwYWNlX3VzZXIgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlcihzcGFjZV9pZCwgdXNlcl9pZCk7XG4gIHNwYWNlX3VzZXJfb3JnX2luZm8gPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlck9yZ0luZm8oc3BhY2VfdXNlcik7XG4gIHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaXNGbG93RW5hYmxlZChmbG93KTtcbiAgdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pc0Zsb3dTcGFjZU1hdGNoZWQoZmxvdywgc3BhY2VfaWQpO1xuICBmb3JtID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGb3JtKGZsb3cuZm9ybSk7XG4gIHBlcm1pc3Npb25zID0gcGVybWlzc2lvbk1hbmFnZXIuZ2V0Rmxvd1Blcm1pc3Npb25zKGZsb3dfaWQsIHVzZXJfaWQpO1xuICBpZiAoIXBlcm1pc3Npb25zLmluY2x1ZGVzKFwiYWRkXCIpKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLlvZPliY3nlKjmiLfmsqHmnInmraTmtYHnqIvnmoTmlrDlu7rmnYPpmZBcIik7XG4gIH1cbiAgbm93ID0gbmV3IERhdGU7XG4gIGluc19vYmogPSB7fTtcbiAgaW5zX29iai5faWQgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLmluc3RhbmNlcy5fbWFrZU5ld0lEKCk7XG4gIGluc19vYmouc3BhY2UgPSBzcGFjZV9pZDtcbiAgaW5zX29iai5mbG93ID0gZmxvd19pZDtcbiAgaW5zX29iai5mbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnQuX2lkO1xuICBpbnNfb2JqLmZvcm0gPSBmbG93LmZvcm07XG4gIGluc19vYmouZm9ybV92ZXJzaW9uID0gZmxvdy5jdXJyZW50LmZvcm1fdmVyc2lvbjtcbiAgaW5zX29iai5uYW1lID0gZmxvdy5uYW1lO1xuICBpbnNfb2JqLnN1Ym1pdHRlciA9IHVzZXJfaWQ7XG4gIGluc19vYmouc3VibWl0dGVyX25hbWUgPSB1c2VyX2luZm8ubmFtZTtcbiAgaW5zX29iai5hcHBsaWNhbnQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudFwiXSA/IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdIDogdXNlcl9pZDtcbiAgaW5zX29iai5hcHBsaWNhbnRfbmFtZSA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X25hbWVcIl0gPyBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9uYW1lXCJdIDogdXNlcl9pbmZvLm5hbWU7XG4gIGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbiA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvblwiXSA/IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvblwiXSA6IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uO1xuICBpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZSA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCJdID8gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIl0gOiBzcGFjZV91c2VyX29yZ19pbmZvLm9yZ2FuaXphdGlvbl9uYW1lO1xuICBpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWUgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWVcIl0gPyBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWVcIl0gOiBzcGFjZV91c2VyX29yZ19pbmZvLm9yZ2FuaXphdGlvbl9mdWxsbmFtZTtcbiAgaW5zX29iai5hcHBsaWNhbnRfY29tcGFueSA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X2NvbXBhbnlcIl0gPyBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9jb21wYW55XCJdIDogc3BhY2VfdXNlci5jb21wYW55X2lkO1xuICBpbnNfb2JqLnN0YXRlID0gJ2RyYWZ0JztcbiAgaW5zX29iai5jb2RlID0gJyc7XG4gIGluc19vYmouaXNfYXJjaGl2ZWQgPSBmYWxzZTtcbiAgaW5zX29iai5pc19kZWxldGVkID0gZmFsc2U7XG4gIGluc19vYmouY3JlYXRlZCA9IG5vdztcbiAgaW5zX29iai5jcmVhdGVkX2J5ID0gdXNlcl9pZDtcbiAgaW5zX29iai5tb2RpZmllZCA9IG5vdztcbiAgaW5zX29iai5tb2RpZmllZF9ieSA9IHVzZXJfaWQ7XG4gIGluc19vYmoucmVjb3JkX2lkcyA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXTtcbiAgaWYgKHNwYWNlX3VzZXIuY29tcGFueV9pZCkge1xuICAgIGluc19vYmouY29tcGFueV9pZCA9IHNwYWNlX3VzZXIuY29tcGFueV9pZDtcbiAgfVxuICB0cmFjZV9vYmogPSB7fTtcbiAgdHJhY2Vfb2JqLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHI7XG4gIHRyYWNlX29iai5pbnN0YW5jZSA9IGluc19vYmouX2lkO1xuICB0cmFjZV9vYmouaXNfZmluaXNoZWQgPSBmYWxzZTtcbiAgc3RhcnRfc3RlcCA9IF8uZmluZChmbG93LmN1cnJlbnQuc3RlcHMsIGZ1bmN0aW9uKHN0ZXApIHtcbiAgICByZXR1cm4gc3RlcC5zdGVwX3R5cGUgPT09ICdzdGFydCc7XG4gIH0pO1xuICB0cmFjZV9vYmouc3RlcCA9IHN0YXJ0X3N0ZXAuX2lkO1xuICB0cmFjZV9vYmoubmFtZSA9IHN0YXJ0X3N0ZXAubmFtZTtcbiAgdHJhY2Vfb2JqLnN0YXJ0X2RhdGUgPSBub3c7XG4gIGFwcHJfb2JqID0ge307XG4gIGFwcHJfb2JqLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHI7XG4gIGFwcHJfb2JqLmluc3RhbmNlID0gaW5zX29iai5faWQ7XG4gIGFwcHJfb2JqLnRyYWNlID0gdHJhY2Vfb2JqLl9pZDtcbiAgYXBwcl9vYmouaXNfZmluaXNoZWQgPSBmYWxzZTtcbiAgYXBwcl9vYmoudXNlciA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdID8gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0gOiB1c2VyX2lkO1xuICBhcHByX29iai51c2VyX25hbWUgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9uYW1lXCJdID8gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfbmFtZVwiXSA6IHVzZXJfaW5mby5uYW1lO1xuICBhcHByX29iai5oYW5kbGVyID0gdXNlcl9pZDtcbiAgYXBwcl9vYmouaGFuZGxlcl9uYW1lID0gdXNlcl9pbmZvLm5hbWU7XG4gIGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uID0gc3BhY2VfdXNlci5vcmdhbml6YXRpb247XG4gIGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUgPSBzcGFjZV91c2VyX29yZ19pbmZvLm5hbWU7XG4gIGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gc3BhY2VfdXNlcl9vcmdfaW5mby5mdWxsbmFtZTtcbiAgYXBwcl9vYmoudHlwZSA9ICdkcmFmdCc7XG4gIGFwcHJfb2JqLnN0YXJ0X2RhdGUgPSBub3c7XG4gIGFwcHJfb2JqLnJlYWRfZGF0ZSA9IG5vdztcbiAgYXBwcl9vYmouaXNfcmVhZCA9IHRydWU7XG4gIGFwcHJfb2JqLmlzX2Vycm9yID0gZmFsc2U7XG4gIGFwcHJfb2JqLmRlc2NyaXB0aW9uID0gJyc7XG4gIHJlbGF0ZWRUYWJsZXNJbmZvID0ge307XG4gIGFwcHJfb2JqLnZhbHVlcyA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVWYWx1ZXMoaW5zX29iai5yZWNvcmRfaWRzWzBdLCBmbG93X2lkLCBzcGFjZV9pZCwgZm9ybS5jdXJyZW50LmZpZWxkcywgcmVsYXRlZFRhYmxlc0luZm8pO1xuICB0cmFjZV9vYmouYXBwcm92ZXMgPSBbYXBwcl9vYmpdO1xuICBpbnNfb2JqLnRyYWNlcyA9IFt0cmFjZV9vYmpdO1xuICBpbnNfb2JqLnZhbHVlcyA9IGFwcHJfb2JqLnZhbHVlcztcbiAgaW5zX29iai5pbmJveF91c2VycyA9IGluc3RhbmNlX2Zyb21fY2xpZW50LmluYm94X3VzZXJzIHx8IFtdO1xuICBpbnNfb2JqLmN1cnJlbnRfc3RlcF9uYW1lID0gc3RhcnRfc3RlcC5uYW1lO1xuICBpZiAoZmxvdy5hdXRvX3JlbWluZCA9PT0gdHJ1ZSkge1xuICAgIGluc19vYmouYXV0b19yZW1pbmQgPSB0cnVlO1xuICB9XG4gIGluc19vYmouZmxvd19uYW1lID0gZmxvdy5uYW1lO1xuICBpZiAoZm9ybS5jYXRlZ29yeSkge1xuICAgIGNhdGVnb3J5ID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRDYXRlZ29yeShmb3JtLmNhdGVnb3J5KTtcbiAgICBpZiAoY2F0ZWdvcnkpIHtcbiAgICAgIGluc19vYmouY2F0ZWdvcnlfbmFtZSA9IGNhdGVnb3J5Lm5hbWU7XG4gICAgICBpbnNfb2JqLmNhdGVnb3J5ID0gY2F0ZWdvcnkuX2lkO1xuICAgIH1cbiAgfVxuICBuZXdfaW5zX2lkID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5pbnN0YW5jZXMuaW5zZXJ0KGluc19vYmopO1xuICB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlUmVjb3JkSW5zdGFuY2VJbmZvKGluc19vYmoucmVjb3JkX2lkc1swXSwgbmV3X2luc19pZCwgc3BhY2VfaWQpO1xuICB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlQXR0YWNoKGluc19vYmoucmVjb3JkX2lkc1swXSwgc3BhY2VfaWQsIGluc19vYmouX2lkLCBhcHByX29iai5faWQpO1xuICByZXR1cm4gbmV3X2luc19pZDtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVWYWx1ZXMgPSBmdW5jdGlvbihyZWNvcmRJZHMsIGZsb3dJZCwgc3BhY2VJZCwgZmllbGRzLCByZWxhdGVkVGFibGVzSW5mbykge1xuICB2YXIgZW5hYmxlQW1pc2Zvcm0sIGZpZWxkQ29kZXMsIGZpbHRlclZhbHVlcywgZmxvdywgZm9ybSwgZm9ybUZpZWxkcywgZm9ybVRhYmxlRmllbGRzLCBmb3JtVGFibGVGaWVsZHNDb2RlLCBvYmplY3QsIG9iamVjdE5hbWUsIG93LCByZWNvcmQsIHJlY29yZElkLCByZWYsIHJlbGF0ZWRPYmplY3RzLCByZWxhdGVkT2JqZWN0c0tleXMsIHJlcXVpcmVkRGV0YWlscywgdGFibGVGaWVsZENvZGVzLCB0YWJsZUZpZWxkTWFwLCB0YWJsZVRvUmVsYXRlZE1hcCwgdmFsdWVzO1xuICBmaWVsZENvZGVzID0gW107XG4gIF8uZWFjaChmaWVsZHMsIGZ1bmN0aW9uKGYpIHtcbiAgICBpZiAoZi50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgIHJldHVybiBfLmVhY2goZi5maWVsZHMsIGZ1bmN0aW9uKGZmKSB7XG4gICAgICAgIHJldHVybiBmaWVsZENvZGVzLnB1c2goZmYuY29kZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpZWxkQ29kZXMucHVzaChmLmNvZGUpO1xuICAgIH1cbiAgfSk7XG4gIHZhbHVlcyA9IHt9O1xuICBvYmplY3ROYW1lID0gcmVjb3JkSWRzLm87XG4gIG9iamVjdCA9IGdldE9iamVjdENvbmZpZyhvYmplY3ROYW1lKTtcbiAgcmVjb3JkSWQgPSByZWNvcmRJZHMuaWRzWzBdO1xuICBvdyA9IENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X3dvcmtmbG93cy5maW5kT25lKHtcbiAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZSxcbiAgICBmbG93X2lkOiBmbG93SWRcbiAgfSk7XG4gIHJlY29yZCA9IG9iamVjdEZpbmRPbmUob2JqZWN0TmFtZSwge1xuICAgIGZpbHRlcnM6IFtbJ19pZCcsICc9JywgcmVjb3JkSWRdXVxuICB9KTtcbiAgZmxvdyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignZmxvd3MnKS5maW5kT25lKGZsb3dJZCwge1xuICAgIGZpZWxkczoge1xuICAgICAgZm9ybTogMSxcbiAgICAgIGVuYWJsZUFtaXNmb3JtOiAxXG4gICAgfVxuICB9KTtcbiAgZW5hYmxlQW1pc2Zvcm0gPSBmbG93LmVuYWJsZV9hbWlzZm9ybTtcbiAgaWYgKG93ICYmIHJlY29yZCkge1xuICAgIHJlcXVpcmVkRGV0YWlscyA9IG93LnJlcXVpcmVkX2RldGFpbHMgfHwgW107XG4gICAgY2hlY2tSZXF1aXJlZERldGFpbHMocmVxdWlyZWREZXRhaWxzLCByZWNvcmQpO1xuICAgIGZvcm0gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJmb3Jtc1wiKS5maW5kT25lKGZsb3cuZm9ybSk7XG4gICAgZm9ybUZpZWxkcyA9IGZvcm0uY3VycmVudC5maWVsZHMgfHwgW107XG4gICAgcmVsYXRlZE9iamVjdHMgPSBnZXRSZWxhdGVkcyhvYmplY3ROYW1lKTtcbiAgICByZWxhdGVkT2JqZWN0c0tleXMgPSBfLnBsdWNrKHJlbGF0ZWRPYmplY3RzLCAnb2JqZWN0X25hbWUnKTtcbiAgICBmb3JtVGFibGVGaWVsZHMgPSBfLmZpbHRlcihmb3JtRmllbGRzLCBmdW5jdGlvbihmb3JtRmllbGQpIHtcbiAgICAgIHJldHVybiBmb3JtRmllbGQudHlwZSA9PT0gJ3RhYmxlJztcbiAgICB9KTtcbiAgICBmb3JtVGFibGVGaWVsZHNDb2RlID0gXy5wbHVjayhmb3JtVGFibGVGaWVsZHMsICdjb2RlJyk7XG4gICAgdGFibGVGaWVsZENvZGVzID0gW107XG4gICAgdGFibGVGaWVsZE1hcCA9IFtdO1xuICAgIHRhYmxlVG9SZWxhdGVkTWFwID0ge307XG4gICAgaWYgKChyZWYgPSBvdy5maWVsZF9tYXApICE9IG51bGwpIHtcbiAgICAgIHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGZtKSB7XG4gICAgICAgIHZhciBmb3JtRmllbGQsIGZvcm1UYWJsZUZpZWxkQ29kZSwgZ3JpZENvZGUsIGxvb2t1cEZpZWxkTmFtZSwgbG9va3VwRmllbGRPYmosIGxvb2t1cE9iamVjdFJlY29yZCwgb1RhYmxlQ29kZSwgb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLCBvVGFibGVDb2RlUmVmZXJlbmNlRmllbGRDb2RlLCBvVGFibGVGaWVsZENvZGUsIG9iakZpZWxkLCBvYmplY3RGaWVsZCwgb2JqZWN0RmllbGROYW1lLCBvYmplY3RGaWVsZE9iamVjdE5hbWUsIG9iamVjdExvb2t1cEZpZWxkLCBvYmplY3RfZmllbGQsIHJlY29yZEZpZWxkVmFsdWUsIHJlZmVyZW5jZVRvRG9jLCByZWZlcmVuY2VUb0ZpZWxkTmFtZSwgcmVmZXJlbmNlVG9GaWVsZFZhbHVlLCByZWZlcmVuY2VUb09iamVjdE5hbWUsIHJlbGF0ZWRPYmplY3RGaWVsZENvZGUsIHRhYmxlVG9SZWxhdGVkTWFwS2V5LCB3VGFibGVDb2RlLCB3b3JrZmxvd19maWVsZDtcbiAgICAgICAgb2JqZWN0X2ZpZWxkID0gZm0ub2JqZWN0X2ZpZWxkO1xuICAgICAgICB3b3JrZmxvd19maWVsZCA9IGZtLndvcmtmbG93X2ZpZWxkO1xuICAgICAgICBpZiAoIW9iamVjdF9maWVsZCB8fCAhd29ya2Zsb3dfZmllbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ+acquaJvuWIsOWtl+aute+8jOivt+ajgOafpeWvueixoea1geeoi+aYoOWwhOWtl+autemFjee9ricpO1xuICAgICAgICB9XG4gICAgICAgIHJlbGF0ZWRPYmplY3RGaWVsZENvZGUgPSBnZXRSZWxhdGVkT2JqZWN0RmllbGRDb2RlKHJlbGF0ZWRPYmplY3RzS2V5cywgb2JqZWN0X2ZpZWxkKTtcbiAgICAgICAgZm9ybVRhYmxlRmllbGRDb2RlID0gZ2V0Rm9ybVRhYmxlRmllbGRDb2RlKGZvcm1UYWJsZUZpZWxkc0NvZGUsIHdvcmtmbG93X2ZpZWxkKTtcbiAgICAgICAgb2JqRmllbGQgPSBvYmplY3QuZmllbGRzW29iamVjdF9maWVsZF07XG4gICAgICAgIGZvcm1GaWVsZCA9IGdldEZvcm1GaWVsZChmb3JtRmllbGRzLCB3b3JrZmxvd19maWVsZCk7XG4gICAgICAgIHJlY29yZEZpZWxkVmFsdWUgPSByZWNvcmRbb2JqZWN0X2ZpZWxkXTtcbiAgICAgICAgaWYgKHJlbGF0ZWRPYmplY3RGaWVsZENvZGUpIHtcbiAgICAgICAgICBvVGFibGVDb2RlID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgb1RhYmxlRmllbGRDb2RlID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJylbMV07XG4gICAgICAgICAgdGFibGVUb1JlbGF0ZWRNYXBLZXkgPSBvVGFibGVDb2RlO1xuICAgICAgICAgIGlmICghdGFibGVUb1JlbGF0ZWRNYXBbdGFibGVUb1JlbGF0ZWRNYXBLZXldKSB7XG4gICAgICAgICAgICB0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZvcm1UYWJsZUZpZWxkQ29kZSkge1xuICAgICAgICAgICAgd1RhYmxlQ29kZSA9IHdvcmtmbG93X2ZpZWxkLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICB0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV1bJ19GUk9NX1RBQkxFX0NPREUnXSA9IHdUYWJsZUNvZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV1bb1RhYmxlRmllbGRDb2RlXSA9IHdvcmtmbG93X2ZpZWxkO1xuICAgICAgICB9IGVsc2UgaWYgKHdvcmtmbG93X2ZpZWxkLmluZGV4T2YoJy4nKSA+IDAgJiYgb2JqZWN0X2ZpZWxkLmluZGV4T2YoJy4kLicpID4gMCkge1xuICAgICAgICAgIHdUYWJsZUNvZGUgPSB3b3JrZmxvd19maWVsZC5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgIG9UYWJsZUNvZGUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4kLicpWzBdKHJlZjEudGFibGUxLiQubmFtZSk7XG4gICAgICAgICAgaWYgKHJlY29yZC5oYXNPd25Qcm9wZXJ0eShvVGFibGVDb2RlKSAmJiBfLmlzQXJyYXkocmVjb3JkW29UYWJsZUNvZGVdKSkge1xuICAgICAgICAgICAgdGFibGVGaWVsZENvZGVzLnB1c2goSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB3b3JrZmxvd190YWJsZV9maWVsZF9jb2RlOiB3VGFibGVDb2RlLFxuICAgICAgICAgICAgICBvYmplY3RfdGFibGVfZmllbGRfY29kZTogb1RhYmxlQ29kZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRhYmxlRmllbGRNYXAucHVzaChmbSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChvVGFibGVDb2RlLmluZGV4T2YoJy4nKSA+IDApIHtcbiAgICAgICAgICAgIG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZENvZGUgPSBvVGFibGVDb2RlLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICBncmlkQ29kZSA9IG9UYWJsZUNvZGUuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgIG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZCA9IG9iamVjdC5maWVsZHNbb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkQ29kZV07XG4gICAgICAgICAgICBpZiAob1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkICYmIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQucmVmZXJlbmNlX3RvKSkge1xuICAgICAgICAgICAgICBpZiAocmVjb3JkW29UYWJsZUNvZGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlZmVyZW5jZVRvRmllbGROYW1lID0gb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJztcbiAgICAgICAgICAgICAgcmVmZXJlbmNlVG9PYmplY3ROYW1lID0gb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLnJlZmVyZW5jZV90bztcbiAgICAgICAgICAgICAgcmVmZXJlbmNlVG9GaWVsZFZhbHVlID0gcmVjb3JkW29UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZC5uYW1lXTtcbiAgICAgICAgICAgICAgcmVmZXJlbmNlVG9Eb2MgPSBnZXRGaWVsZE9kYXRhVmFsdWUocmVmZXJlbmNlVG9PYmplY3ROYW1lLCByZWZlcmVuY2VUb0ZpZWxkVmFsdWUsIHJlZmVyZW5jZVRvRmllbGROYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVRvRG9jW2dyaWRDb2RlXSkge1xuICAgICAgICAgICAgICAgIHJlY29yZFtvVGFibGVDb2RlXSA9IHJlZmVyZW5jZVRvRG9jW2dyaWRDb2RlXTtcbiAgICAgICAgICAgICAgICB0YWJsZUZpZWxkQ29kZXMucHVzaChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd190YWJsZV9maWVsZF9jb2RlOiB3VGFibGVDb2RlLFxuICAgICAgICAgICAgICAgICAgb2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGU6IG9UYWJsZUNvZGVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlRmllbGRNYXAucHVzaChmbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0X2ZpZWxkLmluZGV4T2YoJy4nKSA+IDAgJiYgb2JqZWN0X2ZpZWxkLmluZGV4T2YoJy4kLicpID09PSAtMSkge1xuICAgICAgICAgIG9iamVjdEZpZWxkTmFtZSA9IG9iamVjdF9maWVsZC5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgIGxvb2t1cEZpZWxkTmFtZSA9IG9iamVjdF9maWVsZC5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgIGlmIChvYmplY3QpIHtcbiAgICAgICAgICAgIG9iamVjdEZpZWxkID0gb2JqZWN0LmZpZWxkc1tvYmplY3RGaWVsZE5hbWVdO1xuICAgICAgICAgICAgaWYgKG9iamVjdEZpZWxkICYmIGZvcm1GaWVsZCAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqZWN0RmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmplY3RGaWVsZC5yZWZlcmVuY2VfdG8pKSB7XG4gICAgICAgICAgICAgIGxvb2t1cE9iamVjdFJlY29yZCA9IG9iamVjdEZpbmRPbmUob2JqZWN0RmllbGQucmVmZXJlbmNlX3RvLCB7XG4gICAgICAgICAgICAgICAgZmlsdGVyczogW1snX2lkJywgJz0nLCByZWNvcmRbb2JqZWN0RmllbGROYW1lXV1dLFxuICAgICAgICAgICAgICAgIGZpZWxkczogW2xvb2t1cEZpZWxkTmFtZV1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICghbG9va3VwT2JqZWN0UmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG9iamVjdEZpZWxkT2JqZWN0TmFtZSA9IG9iamVjdEZpZWxkLnJlZmVyZW5jZV90bztcbiAgICAgICAgICAgICAgbG9va3VwRmllbGRPYmogPSBnZXRPYmplY3RDb25maWcob2JqZWN0RmllbGRPYmplY3ROYW1lKTtcbiAgICAgICAgICAgICAgb2JqZWN0TG9va3VwRmllbGQgPSBsb29rdXBGaWVsZE9iai5maWVsZHNbbG9va3VwRmllbGROYW1lXTtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1t3b3JrZmxvd19maWVsZF0gPSBnZXRJbnN0YW5jZUZpZWxkVmFsdWUob2JqZWN0TG9va3VwRmllbGQsIGZvcm1GaWVsZCwgbG9va3VwT2JqZWN0UmVjb3JkLCBsb29rdXBGaWVsZE5hbWUsIHNwYWNlSWQsIHJlY29yZFtsb29rdXBGaWVsZE5hbWVdLCBlbmFibGVBbWlzZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2YWx1ZXNbd29ya2Zsb3dfZmllbGRdID0gZ2V0SW5zdGFuY2VGaWVsZFZhbHVlKG9iakZpZWxkLCBmb3JtRmllbGQsIHJlY29yZCwgb2JqZWN0X2ZpZWxkLCBzcGFjZUlkLCByZWNvcmRbb2JqZWN0X2ZpZWxkXSwgZW5hYmxlQW1pc2Zvcm0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXy51bmlxKHRhYmxlRmllbGRDb2RlcykuZm9yRWFjaChmdW5jdGlvbih0ZmMpIHtcbiAgICAgIHZhciBjO1xuICAgICAgYyA9IEpTT04ucGFyc2UodGZjKTtcbiAgICAgIHZhbHVlc1tjLndvcmtmbG93X3RhYmxlX2ZpZWxkX2NvZGVdID0gW107XG4gICAgICByZXR1cm4gcmVjb3JkW2Mub2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGVdLmZvckVhY2goZnVuY3Rpb24odHIpIHtcbiAgICAgICAgdmFyIG5ld1RyO1xuICAgICAgICBuZXdUciA9IHt9O1xuICAgICAgICBfLmVhY2godHIsIGZ1bmN0aW9uKHRkVmFsdWUsIGspIHtcbiAgICAgICAgICByZXR1cm4gdGFibGVGaWVsZE1hcC5mb3JFYWNoKGZ1bmN0aW9uKHRmbSkge1xuICAgICAgICAgICAgdmFyIHdUZENvZGU7XG4gICAgICAgICAgICBpZiAodGZtLm9iamVjdF9maWVsZCA9PT0gKGMub2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGUgKyAnLiQuJyArIGspKSB7XG4gICAgICAgICAgICAgIHdUZENvZGUgPSB0Zm0ud29ya2Zsb3dfZmllbGQuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld1RyW3dUZENvZGVdID0gdGRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghXy5pc0VtcHR5KG5ld1RyKSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZXNbYy53b3JrZmxvd190YWJsZV9maWVsZF9jb2RlXS5wdXNoKG5ld1RyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgXy5lYWNoKHRhYmxlVG9SZWxhdGVkTWFwLCBmdW5jdGlvbihtYXAsIGtleSkge1xuICAgICAgdmFyIGZvcm1UYWJsZUZpZWxkLCByZWxhdGVkRmllbGQsIHJlbGF0ZWRGaWVsZE5hbWUsIHJlbGF0ZWRPYmplY3QsIHJlbGF0ZWRPYmplY3ROYW1lLCByZWxhdGVkUmVjb3JkcywgcmVsYXRlZFRhYmxlSXRlbXMsIHRhYmxlQ29kZSwgdGFibGVWYWx1ZXM7XG4gICAgICB0YWJsZUNvZGUgPSBtYXAuX0ZST01fVEFCTEVfQ09ERTtcbiAgICAgIGZvcm1UYWJsZUZpZWxkID0gZ2V0Rm9ybVRhYmxlRmllbGQoZm9ybVRhYmxlRmllbGRzLCB0YWJsZUNvZGUpO1xuICAgICAgaWYgKCF0YWJsZUNvZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybigndGFibGVUb1JlbGF0ZWQ6IFsnICsga2V5ICsgJ10gbWlzc2luZyBjb3JyZXNwb25kaW5nIHRhYmxlLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVsYXRlZE9iamVjdE5hbWUgPSBrZXk7XG4gICAgICAgIHRhYmxlVmFsdWVzID0gW107XG4gICAgICAgIHJlbGF0ZWRUYWJsZUl0ZW1zID0gW107XG4gICAgICAgIHJlbGF0ZWRPYmplY3QgPSBnZXRPYmplY3RDb25maWcocmVsYXRlZE9iamVjdE5hbWUpO1xuICAgICAgICByZWxhdGVkRmllbGQgPSBfLmZpbmQocmVsYXRlZE9iamVjdC5maWVsZHMsIGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICByZXR1cm4gWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKGYudHlwZSkgJiYgZi5yZWZlcmVuY2VfdG8gPT09IG9iamVjdE5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZWxhdGVkRmllbGROYW1lID0gcmVsYXRlZEZpZWxkLm5hbWU7XG4gICAgICAgIHJlbGF0ZWRSZWNvcmRzID0gb2JqZWN0RmluZChyZWxhdGVkT2JqZWN0TmFtZSwge1xuICAgICAgICAgIGZpbHRlcnM6IFtbcmVsYXRlZEZpZWxkTmFtZSwgJz0nLCByZWNvcmRJZF1dXG4gICAgICAgIH0pO1xuICAgICAgICByZWxhdGVkUmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlbGF0ZWRSZWNvcmQpIHtcbiAgICAgICAgICB2YXIgdGFibGVWYWx1ZUl0ZW07XG4gICAgICAgICAgdGFibGVWYWx1ZUl0ZW0gPSB7fTtcbiAgICAgICAgICBfLmVhY2gobWFwLCBmdW5jdGlvbih2YWx1ZUtleSwgZmllbGRLZXkpIHtcbiAgICAgICAgICAgIHZhciBmb3JtRmllbGQsIGZvcm1GaWVsZEtleSwgcmVsYXRlZE9iamVjdEZpZWxkLCB0YWJsZUZpZWxkVmFsdWU7XG4gICAgICAgICAgICBpZiAoZmllbGRLZXkgIT09ICdfRlJPTV9UQUJMRV9DT0RFJykge1xuICAgICAgICAgICAgICB0YWJsZUZpZWxkVmFsdWU7XG4gICAgICAgICAgICAgIGZvcm1GaWVsZEtleTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlS2V5LnN0YXJ0c1dpdGgodGFibGVDb2RlICsgJy4nKSkge1xuICAgICAgICAgICAgICAgIGZvcm1GaWVsZEtleSA9ICh2YWx1ZUtleS5zcGxpdChcIi5cIilbMV0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1GaWVsZEtleSA9IHZhbHVlS2V5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvcm1GaWVsZCA9IGdldEZvcm1UYWJsZVN1YkZpZWxkKGZvcm1UYWJsZUZpZWxkLCBmb3JtRmllbGRLZXkpO1xuICAgICAgICAgICAgICByZWxhdGVkT2JqZWN0RmllbGQgPSByZWxhdGVkT2JqZWN0LmZpZWxkc1tmaWVsZEtleV07XG4gICAgICAgICAgICAgIGlmICghZm9ybUZpZWxkIHx8ICFyZWxhdGVkT2JqZWN0RmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGFibGVGaWVsZFZhbHVlID0gZ2V0SW5zdGFuY2VGaWVsZFZhbHVlKHJlbGF0ZWRPYmplY3RGaWVsZCwgZm9ybUZpZWxkLCByZWxhdGVkUmVjb3JkLCBmaWVsZEtleSwgc3BhY2VJZCwgcmVsYXRlZFJlY29yZFtmaWVsZEtleV0sIGVuYWJsZUFtaXNmb3JtKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlVmFsdWVJdGVtW2Zvcm1GaWVsZEtleV0gPSB0YWJsZUZpZWxkVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFfLmlzRW1wdHkodGFibGVWYWx1ZUl0ZW0pKSB7XG4gICAgICAgICAgICB0YWJsZVZhbHVlSXRlbS5faWQgPSByZWxhdGVkUmVjb3JkLl9pZDtcbiAgICAgICAgICAgIHRhYmxlVmFsdWVzLnB1c2godGFibGVWYWx1ZUl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0ZWRUYWJsZUl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICBfdGFibGU6IHtcbiAgICAgICAgICAgICAgICBfaWQ6IHJlbGF0ZWRSZWNvcmQuX2lkLFxuICAgICAgICAgICAgICAgIF9jb2RlOiB0YWJsZUNvZGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFsdWVzW3RhYmxlQ29kZV0gPSB0YWJsZVZhbHVlcztcbiAgICAgICAgcmV0dXJuIHJlbGF0ZWRUYWJsZXNJbmZvW3JlbGF0ZWRPYmplY3ROYW1lXSA9IHJlbGF0ZWRUYWJsZUl0ZW1zO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChvdy5maWVsZF9tYXBfc2NyaXB0KSB7XG4gICAgICBfLmV4dGVuZCh2YWx1ZXMsIHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZXZhbEZpZWxkTWFwU2NyaXB0KG93LmZpZWxkX21hcF9zY3JpcHQsIG9iamVjdE5hbWUsIHNwYWNlSWQsIHJlY29yZElkKSk7XG4gICAgfVxuICB9XG4gIGZpbHRlclZhbHVlcyA9IHt9O1xuICBfLmVhY2goXy5rZXlzKHZhbHVlcyksIGZ1bmN0aW9uKGspIHtcbiAgICBpZiAoZmllbGRDb2Rlcy5pbmNsdWRlcyhrKSkge1xuICAgICAgcmV0dXJuIGZpbHRlclZhbHVlc1trXSA9IHZhbHVlc1trXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmlsdGVyVmFsdWVzO1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5ldmFsRmllbGRNYXBTY3JpcHQgPSBmdW5jdGlvbihmaWVsZF9tYXBfc2NyaXB0LCBvYmplY3ROYW1lLCBzcGFjZUlkLCBvYmplY3RJZCkge1xuICB2YXIgZnVuYywgcmVjb3JkLCBzY3JpcHQsIHZhbHVlcztcbiAgcmVjb3JkID0gb2JqZWN0RmluZE9uZShvYmplY3ROYW1lLCB7XG4gICAgZmlsdGVyczogW1snX2lkJywgJz0nLCBvYmplY3RJZF1dXG4gIH0pO1xuICBzY3JpcHQgPSBcIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlY29yZCkgeyBcIiArIGZpZWxkX21hcF9zY3JpcHQgKyBcIiB9XCI7XG4gIGZ1bmMgPSBfZXZhbChzY3JpcHQsIFwiZmllbGRfbWFwX3NjcmlwdFwiKTtcbiAgdmFsdWVzID0gZnVuYyhyZWNvcmQpO1xuICBpZiAoXy5pc09iamVjdCh2YWx1ZXMpKSB7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKFwiZXZhbEZpZWxkTWFwU2NyaXB0OiDohJrmnKzov5Tlm57lgLznsbvlnovkuI3mmK/lr7nosaFcIik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZUF0dGFjaCA9IGZ1bmN0aW9uKHJlY29yZElkcywgc3BhY2VJZCwgaW5zSWQsIGFwcHJvdmVJZCkge1xuICBDcmVhdG9yLkNvbGxlY3Rpb25zWydjbXNfZmlsZXMnXS5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZCxcbiAgICBwYXJlbnQ6IHJlY29yZElkc1xuICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGNmKSB7XG4gICAgcmV0dXJuIF8uZWFjaChjZi52ZXJzaW9ucywgZnVuY3Rpb24odmVyc2lvbklkLCBpZHgpIHtcbiAgICAgIHZhciBmLCBuZXdGaWxlO1xuICAgICAgZiA9IENyZWF0b3IuQ29sbGVjdGlvbnNbJ2Nmcy5maWxlcy5maWxlcmVjb3JkJ10uZmluZE9uZSh2ZXJzaW9uSWQpO1xuICAgICAgbmV3RmlsZSA9IG5ldyBGUy5GaWxlKCk7XG4gICAgICByZXR1cm4gbmV3RmlsZS5hdHRhY2hEYXRhKGYuY3JlYXRlUmVhZFN0cmVhbSgnZmlsZXMnKSwge1xuICAgICAgICB0eXBlOiBmLm9yaWdpbmFsLnR5cGVcbiAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICB2YXIgbWV0YWRhdGE7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVyci5lcnJvciwgZXJyLnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RmlsZS5uYW1lKGYubmFtZSgpKTtcbiAgICAgICAgbmV3RmlsZS5zaXplKGYuc2l6ZSgpKTtcbiAgICAgICAgbWV0YWRhdGEgPSB7XG4gICAgICAgICAgb3duZXI6IGYubWV0YWRhdGEub3duZXIsXG4gICAgICAgICAgb3duZXJfbmFtZTogZi5tZXRhZGF0YS5vd25lcl9uYW1lLFxuICAgICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAgIGluc3RhbmNlOiBpbnNJZCxcbiAgICAgICAgICBhcHByb3ZlOiBhcHByb3ZlSWQsXG4gICAgICAgICAgcGFyZW50OiBjZi5faWRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgIG1ldGFkYXRhLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5ld0ZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgICAgcmV0dXJuIGNmcy5pbnN0YW5jZXMuaW5zZXJ0KG5ld0ZpbGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlY29yZEluc3RhbmNlSW5mbyA9IGZ1bmN0aW9uKHJlY29yZElkcywgaW5zSWQsIHNwYWNlSWQpIHtcbiAgb2JqZWN0VXBkYXRlKHJlY29yZElkcy5vLCByZWNvcmRJZHMuaWRzWzBdLCB7XG4gICAgaW5zdGFuY2VzOiBbXG4gICAgICB7XG4gICAgICAgIF9pZDogaW5zSWQsXG4gICAgICAgIHN0YXRlOiAnZHJhZnQnXG4gICAgICB9XG4gICAgXSxcbiAgICBsb2NrZWQ6IHRydWUsXG4gICAgaW5zdGFuY2Vfc3RhdGU6ICdkcmFmdCdcbiAgfSk7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlUmVsYXRlZFJlY29yZEluc3RhbmNlSW5mbyA9IGZ1bmN0aW9uKHJlbGF0ZWRUYWJsZXNJbmZvLCBpbnNJZCwgc3BhY2VJZCkge1xuICBfLmVhY2gocmVsYXRlZFRhYmxlc0luZm8sIGZ1bmN0aW9uKHRhYmxlSXRlbXMsIHJlbGF0ZWRPYmplY3ROYW1lKSB7XG4gICAgdmFyIHJlbGF0ZWRDb2xsZWN0aW9uO1xuICAgIHJlbGF0ZWRDb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlbGF0ZWRPYmplY3ROYW1lLCBzcGFjZUlkKTtcbiAgICByZXR1cm4gXy5lYWNoKHRhYmxlSXRlbXMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIHJldHVybiByZWxhdGVkQ29sbGVjdGlvbi5kaXJlY3QudXBkYXRlKGl0ZW0uX3RhYmxlLl9pZCwge1xuICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgaW5zdGFuY2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIF9pZDogaW5zSWQsXG4gICAgICAgICAgICAgIHN0YXRlOiAnZHJhZnQnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBfdGFibGU6IGl0ZW0uX3RhYmxlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY2hlY2tJc0luQXBwcm92YWwgPSBmdW5jdGlvbihyZWNvcmRJZHMsIHNwYWNlSWQpIHtcbiAgdmFyIHJlY29yZDtcbiAgcmVjb3JkID0gb2JqZWN0RmluZE9uZShyZWNvcmRJZHMubywge1xuICAgIGZpbHRlcnM6IFtbJ19pZCcsICc9JywgcmVjb3JkSWRzLmlkc1swXV1dLFxuICAgIGZpZWxkczogWydpbnN0YW5jZXMnXVxuICB9KTtcbiAgaWYgKHJlY29yZCAmJiByZWNvcmQuaW5zdGFuY2VzICYmIHJlY29yZC5pbnN0YW5jZXNbMF0uc3RhdGUgIT09ICdjb21wbGV0ZWQnICYmIENyZWF0b3IuQ29sbGVjdGlvbnMuaW5zdGFuY2VzLmZpbmQocmVjb3JkLmluc3RhbmNlc1swXS5faWQpLmNvdW50KCkgPiAwKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLmraTorrDlvZXlt7Llj5HotbfmtYHnqIvmraPlnKjlrqHmibnkuK3vvIzlvoXlrqHmibnnu5PmnZ/mlrnlj6/lj5HotbfkuIvkuIDmrKHlrqHmibnvvIFcIik7XG4gIH1cbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xufTtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpjcmVhdG9yL2NoZWNrTnBtLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3IvY29yZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3IvbGliL2FwcHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL21ldGhvZHMvb2JqZWN0X3JlY2VudF92aWV3ZWQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9vYmplY3RfcmVjZW50X3ZpZXdlZC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbWV0aG9kcy9vYmplY3RfcmVjZW50X3JlY29yZC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF9yZWNlbnRfcmVjb3JkLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9tZXRob2RzL29iamVjdF9saXN0dmlld3Nfb3B0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF9saXN0dmlld3Nfb3B0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbWV0aG9kcy9yZXBvcnRfZGF0YS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3JlcG9ydF9kYXRhLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9tZXRob2RzL3VzZXJfdGFidWxhcl9zZXR0aW5ncy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3VzZXJfdGFidWxhcl9zZXR0aW5ncy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbWV0aG9kcy9vYmplY3RfZXhwb3J0MnhtbC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF9leHBvcnQyeG1sLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9tZXRob2RzL3JlbGF0ZWRfb2JqZWN0c19yZWNvcmRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvcmVsYXRlZF9vYmplY3RzX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL21ldGhvZHMvcGVuZGluZ19zcGFjZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3BlbmRpbmdfc3BhY2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9vYmplY3QuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL29iamVjdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvcHVibGljYXRpb25zL29iamVjdF90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9vYmplY3RfdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvcHVibGljYXRpb25zL29iamVjdF9saXN0dmlld3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX3RhYnVsYXJfc2V0dGluZ3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9yZWxhdGVkX29iamVjdHNfcmVjb3Jkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvcmVsYXRlZF9vYmplY3RzX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9zcGFjZV91c2VyX2luZm8uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9jb250YWN0c192aWV3X2xpbWl0cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvY29udGFjdHNfdmlld19saW1pdHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9jb250YWN0c19ub19mb3JjZV9waG9uZV91c2Vycy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvY29udGFjdHNfbm9fZm9yY2VfcGhvbmVfdXNlcnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2NyZWF0b3Ivc2VydmVyL3B1YmxpY2F0aW9ucy9zcGFjZV9uZWVkX3RvX2NvbmZpcm0uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL3NwYWNlX25lZWRfdG9fY29uZmlybS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfY3JlYXRvci9zZXJ2ZXIvbGliL3Blcm1pc3Npb25fbWFuYWdlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9saWIvcGVybWlzc2lvbl9tYW5hZ2VyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19jcmVhdG9yL3NlcnZlci9saWIvdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9saWIvdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jb2ZmZWUiXSwibmFtZXMiOlsiY2hlY2tOcG1WZXJzaW9ucyIsIm1vZHVsZSIsImxpbmsiLCJ2IiwiYnVzYm95IiwiTWV0ZW9yIiwic2V0dGluZ3MiLCJjZnMiLCJhbGl5dW4iLCJDcmVhdG9yIiwiZ2V0U2NoZW1hIiwib2JqZWN0X25hbWUiLCJyZWYiLCJnZXRPYmplY3QiLCJzY2hlbWEiLCJnZXRPYmplY3RIb21lQ29tcG9uZW50IiwiZ2V0T2JqZWN0VXJsIiwicmVjb3JkX2lkIiwiYXBwX2lkIiwibGlzdF92aWV3IiwibGlzdF92aWV3X2lkIiwiU2Vzc2lvbiIsImdldCIsImdldExpc3RWaWV3IiwiX2lkIiwiZ2V0UmVsYXRpdmVVcmwiLCJnZXRPYmplY3RBYnNvbHV0ZVVybCIsIlN0ZWVkb3MiLCJhYnNvbHV0ZVVybCIsImdldE9iamVjdFJvdXRlclVybCIsImdldExpc3RWaWV3VXJsIiwidXJsIiwiZ2V0TGlzdFZpZXdSZWxhdGl2ZVVybCIsImdldFN3aXRjaExpc3RVcmwiLCJnZXRSZWxhdGVkT2JqZWN0VXJsIiwicmVsYXRlZF9vYmplY3RfbmFtZSIsInJlbGF0ZWRfZmllbGRfbmFtZSIsImdldE9iamVjdExvb2t1cEZpZWxkT3B0aW9ucyIsImlzX2RlZXAiLCJpc19za2lwX2hpZGUiLCJpc19yZWxhdGVkIiwiX29iamVjdCIsIl9vcHRpb25zIiwiZmllbGRzIiwiaWNvbiIsInJlbGF0ZWRPYmplY3RzIiwiXyIsImZvckVhY2giLCJmIiwiayIsImhpZGRlbiIsInR5cGUiLCJwdXNoIiwibGFiZWwiLCJ2YWx1ZSIsInJfb2JqZWN0IiwicmVmZXJlbmNlX3RvIiwiaXNTdHJpbmciLCJmMiIsImsyIiwiZ2V0UmVsYXRlZE9iamVjdHMiLCJlYWNoIiwiX3RoaXMiLCJfcmVsYXRlZE9iamVjdCIsInJlbGF0ZWRPYmplY3QiLCJyZWxhdGVkT3B0aW9ucyIsInJlbGF0ZWRPcHRpb24iLCJmb3JlaWduX2tleSIsIm5hbWUiLCJnZXRPYmplY3RGaWx0ZXJGaWVsZE9wdGlvbnMiLCJwZXJtaXNzaW9uX2ZpZWxkcyIsImdldEZpZWxkcyIsImluY2x1ZGUiLCJ0ZXN0IiwiaW5kZXhPZiIsImdldE9iamVjdEZpZWxkT3B0aW9ucyIsImdldEZpbHRlcnNXaXRoRmlsdGVyRmllbGRzIiwiZmlsdGVycyIsImZpbHRlcl9maWVsZHMiLCJsZW5ndGgiLCJuIiwiZmllbGQiLCJyZXF1aXJlZCIsImZpbmRXaGVyZSIsImlzX2RlZmF1bHQiLCJpc19yZXF1aXJlZCIsImZpbHRlckl0ZW0iLCJtYXRjaEZpZWxkIiwiZmluZCIsImdldE9iamVjdFJlY29yZCIsInNlbGVjdF9maWVsZHMiLCJleHBhbmQiLCJjb2xsZWN0aW9uIiwib2JqIiwicmVjb3JkIiwicmVmMSIsInJlZjIiLCJpc0NsaWVudCIsIlRlbXBsYXRlIiwiaW5zdGFuY2UiLCJvZGF0YSIsImRhdGFiYXNlX25hbWUiLCJnZXRDb2xsZWN0aW9uIiwiZmluZE9uZSIsImdldE9iamVjdFJlY29yZE5hbWUiLCJuYW1lX2ZpZWxkX2tleSIsIk5BTUVfRklFTERfS0VZIiwiZ2V0QXBwIiwiYXBwTWVudXMiLCJjdXJyZW50QXBwIiwibWVudUl0ZW0iLCJpZCIsImdldEFwcERhc2hib2FyZCIsImFwcCIsImRhc2hib2FyZCIsIkRhc2hib2FyZHMiLCJhcHBzIiwiZ2V0QXBwRGFzaGJvYXJkQ29tcG9uZW50IiwiZ2V0QXBwT2JqZWN0TmFtZXMiLCJhcHBPYmplY3RzIiwiaXNNb2JpbGUiLCJvYmplY3RzIiwibW9iaWxlX29iamVjdHMiLCJwZXJtaXNzaW9ucyIsImFsbG93UmVhZCIsImdldFVybFdpdGhUb2tlbiIsImV4cHJlc3Npb25Gb3JtRGF0YSIsImhhc1F1ZXJ5U3ltYm9sIiwibGlua1N0ciIsInBhcmFtcyIsInNwYWNlSWQiLCJ1c2VySWQiLCJnZXRVc2VyQ29tcGFueUlkcyIsIkFjY291bnRzIiwiX3N0b3JlZExvZ2luVG9rZW4iLCJpc0V4cHJlc3Npb24iLCJwYXJzZVNpbmdsZUV4cHJlc3Npb24iLCJVU0VSX0NPTlRFWFQiLCIkIiwicGFyYW0iLCJnZXRBcHBNZW51IiwibWVudV9pZCIsIm1lbnVzIiwiZ2V0QXBwTWVudXMiLCJtZW51IiwiZ2V0QXBwTWVudVVybEZvckludGVybmV0IiwicGF0aCIsImdldEFwcE1lbnVVcmwiLCJ0YXJnZXQiLCJjdXJlbnRBcHBNZW51cyIsImNoaWxkcmVuIiwibG9hZEFwcHNNZW51cyIsImRhdGEiLCJvcHRpb25zIiwibW9iaWxlIiwic3VjY2VzcyIsInNldCIsImF1dGhSZXF1ZXN0IiwiY3JlYXRvckFwcHNTZWxlY3RvciIsImFzc2lnbmVkX2FwcHMiLCJhZG1pbkFwcCIsImNyZWF0b3JBcHBzIiwic29ydGVkQXBwcyIsImtleSIsImlzX2NyZWF0b3IiLCJ2aXNpYmxlIiwic29ydEJ5IiwidmFsdWVzIiwiYWRtaW4iLCJ2aXNpYmxlQXBwc1NlbGVjdG9yIiwiaW5jbHVkZUFkbWluIiwiZ2V0VmlzaWJsZUFwcHMiLCJjaGFuZ2VBcHAiLCJfc3ViQXBwIiwiT2JqZWN0IiwiYXNzaWduIiwiQXBwcyIsImdldFZpc2libGVBcHBzT2JqZWN0cyIsInZpc2libGVPYmplY3ROYW1lcyIsImZsYXR0ZW4iLCJwbHVjayIsImZpbHRlciIsIk9iamVjdHMiLCJzb3J0Iiwic29ydGluZ01ldGhvZCIsImJpbmQiLCJ1bmlxIiwiZ2V0QXBwc09iamVjdHMiLCJ0ZW1wT2JqZWN0cyIsImNvbmNhdCIsInZhbGlkYXRlRmlsdGVycyIsImxvZ2ljIiwiZSIsImVycm9yTXNnIiwiZmlsdGVyX2l0ZW1zIiwiZmlsdGVyX2xlbmd0aCIsImZsYWciLCJpbmRleCIsIndvcmQiLCJtYXAiLCJpc0VtcHR5IiwiY29tcGFjdCIsInJlcGxhY2UiLCJtYXRjaCIsImkiLCJpbmNsdWRlcyIsInciLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJ0b2FzdHIiLCJmb3JtYXRGaWx0ZXJzVG9Nb25nbyIsInNlbGVjdG9yIiwiQXJyYXkiLCJvcGVyYXRpb24iLCJvcHRpb24iLCJyZWciLCJzdWJfc2VsZWN0b3IiLCJldmFsdWF0ZUZvcm11bGEiLCJSZWdFeHAiLCJpc0JldHdlZW5GaWx0ZXJPcGVyYXRpb24iLCJnZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXMiLCJmb3JtYXRGaWx0ZXJzVG9EZXYiLCJsb2dpY1RlbXBGaWx0ZXJzIiwiaXNfbG9naWNfb3IiLCJwb3AiLCJTdGVlZG9zRmlsdGVycyIsImZvcm1hdExvZ2ljRmlsdGVyc1RvRGV2IiwiZmlsdGVyX2xvZ2ljIiwiZm9ybWF0X2xvZ2ljIiwieCIsIl9mIiwiaXNBcnJheSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZWxhdGVkX29iamVjdF9uYW1lcyIsInJlbGF0ZWRfb2JqZWN0cyIsInVucmVsYXRlZF9vYmplY3RzIiwiZ2V0T2JqZWN0UmVsYXRlZHMiLCJfY29sbGVjdGlvbl9uYW1lIiwiZ2V0UGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwicmVsYXRlZF9vYmplY3QiLCJpc0FjdGl2ZSIsImFsbG93UmVhZEZpbGVzIiwiZ2V0UmVsYXRlZE9iamVjdE5hbWVzIiwiZ2V0UmVsYXRlZE9iamVjdExpc3RBY3Rpb25zIiwicmVsYXRlZE9iamVjdE5hbWUiLCJhY3Rpb25zIiwiZ2V0QWN0aW9ucyIsImFjdGlvbiIsIm9uIiwiZGlzYWJsZWRfYWN0aW9ucyIsImhhcyIsImFsbG93X2N1c3RvbUFjdGlvbnMiLCJrZXlzIiwiZXhjbHVkZV9hY3Rpb25zIiwiZ2V0TGlzdFZpZXdzIiwiZGlzYWJsZWRfbGlzdF92aWV3cyIsImxpc3RWaWV3cyIsImxpc3Rfdmlld3MiLCJvYmplY3QiLCJpdGVtIiwiaXRlbV9uYW1lIiwiaXNEaXNhYmxlZCIsIm93bmVyIiwiZmllbGRzTmFtZSIsInVucmVhZGFibGVfZmllbGRzIiwiZ2V0T2JqZWN0RmllbGRzTmFtZSIsImlzbG9hZGluZyIsImJvb3RzdHJhcExvYWRlZCIsImNvbnZlcnRTcGVjaWFsQ2hhcmFjdGVyIiwic3RyIiwiZ2V0RGlzYWJsZWRGaWVsZHMiLCJmaWVsZE5hbWUiLCJhdXRvZm9ybSIsImRpc2FibGVkIiwib21pdCIsImdldEhpZGRlbkZpZWxkcyIsImdldEZpZWxkc1dpdGhOb0dyb3VwIiwiZ3JvdXAiLCJnZXRTb3J0ZWRGaWVsZEdyb3VwTmFtZXMiLCJuYW1lcyIsInVuaXF1ZSIsImdldEZpZWxkc0Zvckdyb3VwIiwiZ3JvdXBOYW1lIiwiZ2V0U3lzdGVtQmFzZUZpZWxkcyIsImdldEZpZWxkc1dpdGhvdXRTeXN0ZW1CYXNlIiwiZ2V0RmllbGRzV2l0aG91dE9taXQiLCJwaWNrIiwiZ2V0RmllbGRzSW5GaXJzdExldmVsIiwiZmlyc3RMZXZlbEtleXMiLCJnZXRGaWVsZHNGb3JSZW9yZGVyIiwiaXNTaW5nbGUiLCJfa2V5cyIsImNoaWxkS2V5cyIsImlzX3dpZGVfMSIsImlzX3dpZGVfMiIsInNjXzEiLCJzY18yIiwiZW5kc1dpdGgiLCJpc193aWRlIiwic2xpY2UiLCJpc0ZpbHRlclZhbHVlRW1wdHkiLCJOdW1iZXIiLCJpc05hTiIsImdldEZpZWxkRGF0YVR5cGUiLCJvYmplY3RGaWVsZHMiLCJyZXN1bHQiLCJkYXRhX3R5cGUiLCJpc1NlcnZlciIsImdldEFsbFJlbGF0ZWRPYmplY3RzIiwicmVsYXRlZF9maWVsZCIsImVuYWJsZV9maWxlcyIsImZvcm1hdEluZGV4IiwiYXJyYXkiLCJpbmRleE5hbWUiLCJpc2RvY3VtZW50REIiLCJiYWNrZ3JvdW5kIiwiZGF0YXNvdXJjZXMiLCJkb2N1bWVudERCIiwiam9pbiIsInN1YnN0cmluZyIsImFwcHNCeU5hbWUiLCJtZXRob2RzIiwic3BhY2VfaWQiLCJjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQiLCJjdXJyZW50X3JlY2VudF92aWV3ZWQiLCJkb2MiLCJzcGFjZSIsInVwZGF0ZSIsIiRpbmMiLCJjb3VudCIsIiRzZXQiLCJtb2RpZmllZCIsIkRhdGUiLCJtb2RpZmllZF9ieSIsImluc2VydCIsIl9tYWtlTmV3SUQiLCJvIiwiaWRzIiwiY3JlYXRlZCIsImNyZWF0ZWRfYnkiLCJ2YWxpZGF0ZSIsImFzeW5jX3JlY2VudF9hZ2dyZWdhdGUiLCJyZWNlbnRfYWdncmVnYXRlIiwic2VhcmNoX29iamVjdCIsIl9yZWNvcmRzIiwiY2FsbGJhY2siLCJDb2xsZWN0aW9ucyIsIm9iamVjdF9yZWNlbnRfdmlld2VkIiwicmF3Q29sbGVjdGlvbiIsImFnZ3JlZ2F0ZSIsIiRtYXRjaCIsIiRncm91cCIsIm1heENyZWF0ZWQiLCIkbWF4IiwiJHNvcnQiLCIkbGltaXQiLCJ0b0FycmF5IiwiZXJyIiwiRXJyb3IiLCJpc0Z1bmN0aW9uIiwid3JhcEFzeW5jIiwic2VhcmNoVGV4dCIsIl9vYmplY3RfY29sbGVjdGlvbiIsIl9vYmplY3RfbmFtZV9rZXkiLCJxdWVyeSIsInF1ZXJ5X2FuZCIsInJlY29yZHMiLCJzZWFyY2hfS2V5d29yZHMiLCJzcGxpdCIsImtleXdvcmQiLCJzdWJxdWVyeSIsIiRyZWdleCIsInRyaW0iLCIkYW5kIiwiJGluIiwibGltaXQiLCJfbmFtZSIsIl9vYmplY3RfbmFtZSIsInJlY29yZF9vYmplY3QiLCJyZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24iLCJzZWxmIiwib2JqZWN0c0J5TmFtZSIsIm9iamVjdF9yZWNvcmQiLCJlbmFibGVfc2VhcmNoIiwidXBkYXRlX2ZpbHRlcnMiLCJsaXN0dmlld19pZCIsImZpbHRlcl9zY29wZSIsIm9iamVjdF9saXN0dmlld3MiLCJkaXJlY3QiLCJ1cGRhdGVfY29sdW1ucyIsImNvbHVtbnMiLCJjaGVjayIsImNvbXBvdW5kRmllbGRzIiwiY3Vyc29yIiwiZmlsdGVyRmllbGRzIiwiY2hpbGRLZXkiLCJvYmplY3RGaWVsZCIsInNwbGl0cyIsImlzQ29tbW9uU3BhY2UiLCJpc1NwYWNlQWRtaW4iLCJza2lwIiwiZmV0Y2giLCJjb21wb3VuZEZpZWxkSXRlbSIsImNvbXBvdW5kRmlsdGVyRmllbGRzIiwiaXRlbUtleSIsIml0ZW1WYWx1ZSIsInJlZmVyZW5jZUl0ZW0iLCJzZXR0aW5nIiwiY29sdW1uX3dpZHRoIiwib2JqMSIsIl9pZF9hY3Rpb25zIiwiX21peEZpZWxkc0RhdGEiLCJfbWl4UmVsYXRlZERhdGEiLCJfd3JpdGVYbWxGaWxlIiwiZnMiLCJsb2dnZXIiLCJta2RpcnAiLCJ4bWwyanMiLCJyZXF1aXJlIiwiTG9nZ2VyIiwianNvbk9iaiIsIm9iak5hbWUiLCJidWlsZGVyIiwiZGF5IiwiZmlsZUFkZHJlc3MiLCJmaWxlTmFtZSIsImZpbGVQYXRoIiwibW9udGgiLCJub3ciLCJzdHJlYW0iLCJ4bWwiLCJ5ZWFyIiwiQnVpbGRlciIsImJ1aWxkT2JqZWN0IiwiQnVmZmVyIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJfX21ldGVvcl9ib290c3RyYXBfXyIsInNlcnZlckRpciIsImV4aXN0c1N5bmMiLCJzeW5jIiwid3JpdGVGaWxlIiwibWl4Qm9vbCIsIm1peERhdGUiLCJtaXhEZWZhdWx0Iiwib2JqRmllbGRzIiwiZmllbGRfbmFtZSIsImRhdGUiLCJkYXRlU3RyIiwiZm9ybWF0IiwibW9tZW50IiwicmVsYXRlZE9iak5hbWVzIiwicmVsYXRlZE9iak5hbWUiLCJyZWxhdGVkQ29sbGVjdGlvbiIsInJlbGF0ZWRSZWNvcmRMaXN0IiwicmVsYXRlZFRhYmxlRGF0YSIsInJlbGF0ZWRPYmoiLCJmaWVsZHNEYXRhIiwiRXhwb3J0MnhtbCIsInJlY29yZExpc3QiLCJpbmZvIiwidGltZSIsInJlY29yZE9iaiIsInRpbWVFbmQiLCJyZWxhdGVkX29iamVjdHNfcmVjb3JkcyIsInJlbGF0ZWRfcmVjb3JkcyIsInZpZXdBbGxSZWNvcmRzIiwiZ2V0UGVuZGluZ1NwYWNlSW5mbyIsImludml0ZXJJZCIsImludml0ZXJOYW1lIiwic3BhY2VOYW1lIiwiZGIiLCJ1c2VycyIsInNwYWNlcyIsImludml0ZXIiLCJyZWZ1c2VKb2luU3BhY2UiLCJzcGFjZV91c2VycyIsImludml0ZV9zdGF0ZSIsImFjY2VwdEpvaW5TcGFjZSIsInVzZXJfYWNjZXB0ZWQiLCJwdWJsaXNoIiwicHVibGlzaENvbXBvc2l0ZSIsInRhYmxlTmFtZSIsIl9maWVsZHMiLCJvYmplY3RfY29sbGVjaXRvbiIsInJlZmVyZW5jZV9maWVsZHMiLCJyZWFkeSIsIlN0cmluZyIsIk1hdGNoIiwiT3B0aW9uYWwiLCJnZXRPYmplY3ROYW1lIiwidW5ibG9jayIsImZpZWxkX2tleXMiLCJfb2JqZWN0S2V5cyIsInJlZmVyZW5jZV9maWVsZCIsInBhcmVudCIsImNoaWxkcmVuX2ZpZWxkcyIsInBfayIsInJlZmVyZW5jZV9pZHMiLCJyZWZlcmVuY2VfdG9fb2JqZWN0Iiwic19rIiwiZ2V0UHJvcGVydHkiLCJyZWR1Y2UiLCJpc09iamVjdCIsInNoYXJlZCIsInVzZXIiLCJzcGFjZV9zZXR0aW5ncyIsInBlcm1pc3Npb25NYW5hZ2VyRm9ySW5pdEFwcHJvdmFsIiwiZ2V0Rmxvd1Blcm1pc3Npb25zIiwiZmxvd19pZCIsInVzZXJfaWQiLCJmbG93IiwibXlfcGVybWlzc2lvbnMiLCJvcmdfaWRzIiwib3JnYW5pemF0aW9ucyIsIm9yZ3NfY2FuX2FkZCIsIm9yZ3NfY2FuX2FkbWluIiwib3Jnc19jYW5fbW9uaXRvciIsInVzZXJzX2Nhbl9hZGQiLCJ1c2Vyc19jYW5fYWRtaW4iLCJ1c2Vyc19jYW5fbW9uaXRvciIsInV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwiLCJnZXRGbG93IiwicGFyZW50cyIsIm9yZyIsInBhcmVudF9pZCIsInBlcm1zIiwib3JnX2lkIiwiX2V2YWwiLCJjaGVja1JlcXVpcmVkRGV0YWlscyIsImdldEZpZWxkT2RhdGFWYWx1ZSIsImdldEZpbGVGaWVsZFZhbHVlIiwiZ2V0Rm9ybUZpZWxkIiwiZ2V0Rm9ybVRhYmxlRmllbGQiLCJnZXRGb3JtVGFibGVGaWVsZENvZGUiLCJnZXRGb3JtVGFibGVTdWJGaWVsZCIsImdldEluc3RhbmNlRmllbGRWYWx1ZSIsImdldE9iamVjdENvbmZpZyIsImdldE9iamVjdE5hbWVGaWVsZEtleSIsImdldFJlbGF0ZWRPYmplY3RGaWVsZENvZGUiLCJnZXRSZWxhdGVkcyIsImdldFNlbGVjdE9yZ1ZhbHVlIiwiZ2V0U2VsZWN0T3JnVmFsdWVzIiwiZ2V0U2VsZWN0VXNlclZhbHVlIiwiZ2V0U2VsZWN0VXNlclZhbHVlcyIsIm9iamVjdEZpbmQiLCJvYmplY3RGaW5kT25lIiwib2JqZWN0VXBkYXRlIiwib2JqZWN0cWwiLCJvYmplY3RBcGlOYW1lIiwidG9Db25maWciLCJjYiIsInRoZW4iLCJyZXNvbHZlIiwicmVqZWN0IiwidG9wIiwicmVsYXRlZE9iamVjdHNLZXlzIiwicmVsYXRlZE9iamVjdHNLZXkiLCJzdGFydHNXaXRoIiwiZm9ybVRhYmxlRmllbGRzQ29kZSIsImZvcm1UYWJsZUZpZWxkQ29kZSIsImZvcm1UYWJsZUZpZWxkcyIsImNvZGUiLCJmb3JtRmllbGRzIiwiZmYiLCJzZiIsInRhYmxlRmllbGQiLCJzdWJGaWVsZENvZGUiLCJyZWZlcmVuY2VUb0ZpZWxkTmFtZSIsIl9yZWNvcmQiLCJuYW1lS2V5Iiwic3UiLCJ1c2VySWRzIiwic3VzIiwib3JnSWQiLCJmdWxsbmFtZSIsIm9yZ0lkcyIsIm9yZ3MiLCJyZWNvcmRGaWVsZElkIiwiZlR5cGUiLCJmaWxlcyIsIm5ld0ZpbGUiLCJGUyIsIkZpbGUiLCJhdHRhY2hEYXRhIiwiY3JlYXRlUmVhZFN0cmVhbSIsIm9yaWdpbmFsIiwibWV0YWRhdGEiLCJyZWFzb24iLCJzaXplIiwiaW5zdGFuY2VzIiwib2JqRmllbGQiLCJmb3JtRmllbGQiLCJvYmplY3RfZmllbGQiLCJyZWNvcmRGaWVsZFZhbHVlIiwiZW5hYmxlQW1pc2Zvcm0iLCJvZGF0YUZpZWxkVmFsdWUiLCJyZWZlcmVuY2VUb09iamVjdE5hbWUiLCJzZWxlY3RGaWVsZFZhbHVlIiwic3RlZWRvc19maWVsZCIsInJlZmVyZW5jZV90b19maWVsZCIsIm11bHRpcGxlIiwiaXNfbXVsdGlzZWxlY3QiLCJmb3JtYXREYXRlIiwiZm9ybWF0VGltZSIsImhhc093blByb3BlcnR5IiwicmVxdWlyZWREZXRhaWxzIiwibWFzdGVyUmVjb3JkIiwicmQiLCJtYXN0ZXJGaWVsZCIsIm1hc3RlckZpZWxkVmFsdWUiLCJyZWZJZCIsInN1Yk9iakNvbmZpZyIsInN1YlRhYmxlTWFzdGVyRmllbGQiLCJzdWJUYWJsZU5hbWUiLCJzdWJUYWJsZVJlY29yZCIsImNoZWNrX2F1dGhvcml6YXRpb24iLCJyZXEiLCJhdXRoVG9rZW4iLCJoYXNoZWRUb2tlbiIsIl9oYXNoTG9naW5Ub2tlbiIsImdldFNwYWNlIiwiZmxvd3MiLCJnZXRTcGFjZVVzZXIiLCJzcGFjZV91c2VyIiwiZ2V0U3BhY2VVc2VyT3JnSW5mbyIsIm9yZ2FuaXphdGlvbiIsIm9yZ2FuaXphdGlvbl9uYW1lIiwib3JnYW5pemF0aW9uX2Z1bGxuYW1lIiwiaXNGbG93RW5hYmxlZCIsInN0YXRlIiwiaXNGbG93U3BhY2VNYXRjaGVkIiwiZ2V0Rm9ybSIsImZvcm1faWQiLCJmb3JtIiwiZm9ybXMiLCJnZXRDYXRlZ29yeSIsImNhdGVnb3J5X2lkIiwiY2F0ZWdvcmllcyIsImNoZWNrU3luY0RpcmVjdGlvbiIsIm93Iiwic3luY0RpcmVjdGlvbiIsIm9iamVjdF93b3JrZmxvd3MiLCJzeW5jX2RpcmVjdGlvbiIsImNyZWF0ZV9pbnN0YW5jZSIsImluc3RhbmNlX2Zyb21fY2xpZW50IiwidXNlcl9pbmZvIiwiYXBwcl9vYmoiLCJhcHByb3ZlX2Zyb21fY2xpZW50IiwiY2F0ZWdvcnkiLCJpbnNfb2JqIiwibmV3X2luc19pZCIsInJlbGF0ZWRUYWJsZXNJbmZvIiwic3BhY2VfdXNlcl9vcmdfaW5mbyIsInN0YXJ0X3N0ZXAiLCJ0cmFjZV9mcm9tX2NsaWVudCIsInRyYWNlX29iaiIsImNoZWNrSXNJbkFwcHJvdmFsIiwicGVybWlzc2lvbk1hbmFnZXIiLCJmbG93X3ZlcnNpb24iLCJjdXJyZW50IiwiZm9ybV92ZXJzaW9uIiwic3VibWl0dGVyIiwic3VibWl0dGVyX25hbWUiLCJhcHBsaWNhbnQiLCJhcHBsaWNhbnRfbmFtZSIsImFwcGxpY2FudF9vcmdhbml6YXRpb24iLCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWUiLCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lIiwiYXBwbGljYW50X2NvbXBhbnkiLCJjb21wYW55X2lkIiwiaXNfYXJjaGl2ZWQiLCJpc19kZWxldGVkIiwicmVjb3JkX2lkcyIsIk1vbmdvIiwiT2JqZWN0SUQiLCJfc3RyIiwiaXNfZmluaXNoZWQiLCJzdGVwcyIsInN0ZXAiLCJzdGVwX3R5cGUiLCJzdGFydF9kYXRlIiwidHJhY2UiLCJ1c2VyX25hbWUiLCJoYW5kbGVyIiwiaGFuZGxlcl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb24iLCJoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUiLCJyZWFkX2RhdGUiLCJpc19yZWFkIiwiaXNfZXJyb3IiLCJkZXNjcmlwdGlvbiIsImluaXRpYXRlVmFsdWVzIiwiYXBwcm92ZXMiLCJ0cmFjZXMiLCJpbmJveF91c2VycyIsImN1cnJlbnRfc3RlcF9uYW1lIiwiYXV0b19yZW1pbmQiLCJmbG93X25hbWUiLCJjYXRlZ29yeV9uYW1lIiwiaW5pdGlhdGVSZWNvcmRJbnN0YW5jZUluZm8iLCJpbml0aWF0ZUF0dGFjaCIsInJlY29yZElkcyIsImZsb3dJZCIsImZpZWxkQ29kZXMiLCJmaWx0ZXJWYWx1ZXMiLCJvYmplY3ROYW1lIiwicmVjb3JkSWQiLCJ0YWJsZUZpZWxkQ29kZXMiLCJ0YWJsZUZpZWxkTWFwIiwidGFibGVUb1JlbGF0ZWRNYXAiLCJlbmFibGVfYW1pc2Zvcm0iLCJyZXF1aXJlZF9kZXRhaWxzIiwiZmllbGRfbWFwIiwiZm0iLCJncmlkQ29kZSIsImxvb2t1cEZpZWxkTmFtZSIsImxvb2t1cEZpZWxkT2JqIiwibG9va3VwT2JqZWN0UmVjb3JkIiwib1RhYmxlQ29kZSIsIm9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZCIsIm9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZENvZGUiLCJvVGFibGVGaWVsZENvZGUiLCJvYmplY3RGaWVsZE5hbWUiLCJvYmplY3RGaWVsZE9iamVjdE5hbWUiLCJvYmplY3RMb29rdXBGaWVsZCIsInJlZmVyZW5jZVRvRG9jIiwicmVmZXJlbmNlVG9GaWVsZFZhbHVlIiwicmVsYXRlZE9iamVjdEZpZWxkQ29kZSIsInRhYmxlVG9SZWxhdGVkTWFwS2V5Iiwid1RhYmxlQ29kZSIsIndvcmtmbG93X2ZpZWxkIiwidGFibGUxIiwid29ya2Zsb3dfdGFibGVfZmllbGRfY29kZSIsIm9iamVjdF90YWJsZV9maWVsZF9jb2RlIiwidGZjIiwiYyIsInBhcnNlIiwidHIiLCJuZXdUciIsInRkVmFsdWUiLCJ0Zm0iLCJ3VGRDb2RlIiwiZm9ybVRhYmxlRmllbGQiLCJyZWxhdGVkRmllbGQiLCJyZWxhdGVkRmllbGROYW1lIiwicmVsYXRlZFJlY29yZHMiLCJyZWxhdGVkVGFibGVJdGVtcyIsInRhYmxlQ29kZSIsInRhYmxlVmFsdWVzIiwiX0ZST01fVEFCTEVfQ09ERSIsIndhcm4iLCJyZWxhdGVkUmVjb3JkIiwidGFibGVWYWx1ZUl0ZW0iLCJ2YWx1ZUtleSIsImZpZWxkS2V5IiwiZm9ybUZpZWxkS2V5IiwicmVsYXRlZE9iamVjdEZpZWxkIiwidGFibGVGaWVsZFZhbHVlIiwiX3RhYmxlIiwiX2NvZGUiLCJmaWVsZF9tYXBfc2NyaXB0IiwiZXh0ZW5kIiwiZXZhbEZpZWxkTWFwU2NyaXB0Iiwib2JqZWN0SWQiLCJmdW5jIiwic2NyaXB0IiwiaW5zSWQiLCJhcHByb3ZlSWQiLCJjZiIsInZlcnNpb25zIiwidmVyc2lvbklkIiwiaWR4Iiwib3duZXJfbmFtZSIsImFwcHJvdmUiLCJsb2NrZWQiLCJpbnN0YW5jZV9zdGF0ZSIsImluaXRpYXRlUmVsYXRlZFJlY29yZEluc3RhbmNlSW5mbyIsInRhYmxlSXRlbXMiLCJ1dGNPZmZzZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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dG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Y2hlY2tOcG1WZXJzaW9uc1xufSBmcm9tICdtZXRlb3IvdG1lYXNkYXk6Y2hlY2stbnBtLXZlcnNpb25zJztcbmNoZWNrTnBtVmVyc2lvbnMoe1xuXHRidXNib3k6IFwiXjAuMi4xM1wiLFxuXHRcInhtbDJqc1wiOiBcIl4wLjQuMTlcIixcbn0sICdzdGVlZG9zOmNyZWF0b3InKTtcblxuaWYgKE1ldGVvci5zZXR0aW5ncyAmJiBNZXRlb3Iuc2V0dGluZ3MuY2ZzICYmIE1ldGVvci5zZXR0aW5ncy5jZnMuYWxpeXVuKSB7XG5cdGNoZWNrTnBtVmVyc2lvbnMoe1xuXHRcdFwiYWxpeXVuLXNka1wiOiBcIl4xLjExLjEyXCJcblx0fSwgJ3N0ZWVkb3M6Y3JlYXRvcicpO1xufSIsIlxuXHQjIENyZWF0b3IuaW5pdEFwcHMoKVxuXG5cbiMgQ3JlYXRvci5pbml0QXBwcyA9ICgpLT5cbiMgXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcbiMgXHRcdF8uZWFjaCBDcmVhdG9yLkFwcHMsIChhcHAsIGFwcF9pZCktPlxuIyBcdFx0XHRkYl9hcHAgPSBkYi5hcHBzLmZpbmRPbmUoYXBwX2lkKVxuIyBcdFx0XHRpZiAhZGJfYXBwXG4jIFx0XHRcdFx0YXBwLl9pZCA9IGFwcF9pZFxuIyBcdFx0XHRcdGRiLmFwcHMuaW5zZXJ0KGFwcClcbiMgZWxzZVxuIyBcdGFwcC5faWQgPSBhcHBfaWRcbiMgXHRkYi5hcHBzLnVwZGF0ZSh7X2lkOiBhcHBfaWR9LCBhcHApXG5cbkNyZWF0b3IuZ2V0U2NoZW1hID0gKG9iamVjdF9uYW1lKS0+XG5cdHJldHVybiBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk/LnNjaGVtYVxuXG5DcmVhdG9yLmdldE9iamVjdEhvbWVDb21wb25lbnQgPSAob2JqZWN0X25hbWUpLT5cblx0IyBpZiBNZXRlb3IuaXNDbGllbnRcblx0IyBcdHJldHVybiBCdWlsZGVyQ3JlYXRvci5wbHVnaW5Db21wb25lbnRTZWxlY3RvcihCdWlsZGVyQ3JlYXRvci5zdG9yZS5nZXRTdGF0ZSgpLCBcIk9iamVjdEhvbWVcIiwgb2JqZWN0X25hbWUpXG5cdHJldHVybiBmYWxzZTtcblxuQ3JlYXRvci5nZXRPYmplY3RVcmwgPSAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSAtPlxuXHRpZiAhYXBwX2lkXG5cdFx0YXBwX2lkID0gU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIilcblx0aWYgIW9iamVjdF9uYW1lXG5cdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cblx0bGlzdF92aWV3ID0gQ3JlYXRvci5nZXRMaXN0VmlldyhvYmplY3RfbmFtZSwgbnVsbClcblx0bGlzdF92aWV3X2lkID0gbGlzdF92aWV3Py5faWRcblxuXHRpZiByZWNvcmRfaWRcblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvdmlldy9cIiArIHJlY29yZF9pZClcblx0ZWxzZVxuXHRcdGlmIENyZWF0b3IuZ2V0T2JqZWN0SG9tZUNvbXBvbmVudChvYmplY3RfbmFtZSlcblx0XHRcdHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUpXG5cdFx0ZWxzZVxuXHRcdFx0aWYgbGlzdF92aWV3X2lkXG5cdFx0XHRcdHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lKVxuXG5DcmVhdG9yLmdldE9iamVjdEFic29sdXRlVXJsID0gKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkgLT5cblx0aWYgIWFwcF9pZFxuXHRcdGFwcF9pZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpXG5cdGlmICFvYmplY3RfbmFtZVxuXHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdGxpc3RfdmlldyA9IENyZWF0b3IuZ2V0TGlzdFZpZXcob2JqZWN0X25hbWUsIG51bGwpXG5cdGxpc3Rfdmlld19pZCA9IGxpc3Rfdmlldz8uX2lkXG5cblx0aWYgcmVjb3JkX2lkXG5cdFx0cmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL3ZpZXcvXCIgKyByZWNvcmRfaWQsIHRydWUpXG5cdGVsc2Vcblx0XHRyZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvZ3JpZC9cIiArIGxpc3Rfdmlld19pZCwgdHJ1ZSlcblxuQ3JlYXRvci5nZXRPYmplY3RSb3V0ZXJVcmwgPSAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSAtPlxuXHRpZiAhYXBwX2lkXG5cdFx0YXBwX2lkID0gU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIilcblx0aWYgIW9iamVjdF9uYW1lXG5cdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cblx0bGlzdF92aWV3ID0gQ3JlYXRvci5nZXRMaXN0VmlldyhvYmplY3RfbmFtZSwgbnVsbClcblx0bGlzdF92aWV3X2lkID0gbGlzdF92aWV3Py5faWRcblxuXHRpZiByZWNvcmRfaWRcblx0XHRyZXR1cm4gXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL3ZpZXcvXCIgKyByZWNvcmRfaWRcblx0ZWxzZVxuXHRcdHJldHVybiBcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvZ3JpZC9cIiArIGxpc3Rfdmlld19pZFxuXG5DcmVhdG9yLmdldExpc3RWaWV3VXJsID0gKG9iamVjdF9uYW1lLCBhcHBfaWQsIGxpc3Rfdmlld19pZCkgLT5cblx0dXJsID0gQ3JlYXRvci5nZXRMaXN0Vmlld1JlbGF0aXZlVXJsKG9iamVjdF9uYW1lLCBhcHBfaWQsIGxpc3Rfdmlld19pZClcblx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwodXJsKVxuXG5DcmVhdG9yLmdldExpc3RWaWV3UmVsYXRpdmVVcmwgPSAob2JqZWN0X25hbWUsIGFwcF9pZCwgbGlzdF92aWV3X2lkKSAtPlxuXHRyZXR1cm4gXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL2dyaWQvXCIgKyBsaXN0X3ZpZXdfaWRcblxuQ3JlYXRvci5nZXRTd2l0Y2hMaXN0VXJsID0gKG9iamVjdF9uYW1lLCBhcHBfaWQsIGxpc3Rfdmlld19pZCkgLT5cblx0aWYgbGlzdF92aWV3X2lkXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL1wiICsgbGlzdF92aWV3X2lkICsgXCIvbGlzdFwiKVxuXHRlbHNlXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL2xpc3Qvc3dpdGNoXCIpXG5cbkNyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdFVybCA9IChvYmplY3RfbmFtZSwgYXBwX2lkLCByZWNvcmRfaWQsIHJlbGF0ZWRfb2JqZWN0X25hbWUsIHJlbGF0ZWRfZmllbGRfbmFtZSkgLT5cblx0aWYgcmVsYXRlZF9maWVsZF9uYW1lXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0UmVsYXRpdmVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL1wiICsgcmVjb3JkX2lkICsgXCIvXCIgKyByZWxhdGVkX29iamVjdF9uYW1lICsgXCIvZ3JpZD9yZWxhdGVkX2ZpZWxkX25hbWU9XCIgKyByZWxhdGVkX2ZpZWxkX25hbWUpXG5cdGVsc2Vcblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvXCIgKyByZWNvcmRfaWQgKyBcIi9cIiArIHJlbGF0ZWRfb2JqZWN0X25hbWUgKyBcIi9ncmlkXCIpXG5cbkNyZWF0b3IuZ2V0T2JqZWN0TG9va3VwRmllbGRPcHRpb25zID0gKG9iamVjdF9uYW1lLCBpc19kZWVwLCBpc19za2lwX2hpZGUsIGlzX3JlbGF0ZWQpLT5cblx0X29wdGlvbnMgPSBbXVxuXHR1bmxlc3Mgb2JqZWN0X25hbWVcblx0XHRyZXR1cm4gX29wdGlvbnNcblx0X29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRmaWVsZHMgPSBfb2JqZWN0Py5maWVsZHNcblx0aWNvbiA9IF9vYmplY3Q/Lmljb25cblx0Xy5mb3JFYWNoIGZpZWxkcywgKGYsIGspLT5cblx0XHRpZiBpc19za2lwX2hpZGUgYW5kIGYuaGlkZGVuXG5cdFx0XHRyZXR1cm5cblx0XHRpZiBmLnR5cGUgPT0gXCJzZWxlY3RcIlxuXHRcdFx0X29wdGlvbnMucHVzaCB7bGFiZWw6IFwiI3tmLmxhYmVsIHx8IGt9XCIsIHZhbHVlOiBcIiN7a31cIiwgaWNvbjogaWNvbn1cblx0XHRlbHNlXG5cdFx0XHRfb3B0aW9ucy5wdXNoIHtsYWJlbDogZi5sYWJlbCB8fCBrLCB2YWx1ZTogaywgaWNvbjogaWNvbn1cblx0aWYgaXNfZGVlcFxuXHRcdF8uZm9yRWFjaCBmaWVsZHMsIChmLCBrKS0+XG5cdFx0XHRpZiBpc19za2lwX2hpZGUgYW5kIGYuaGlkZGVuXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0aWYgKGYudHlwZSA9PSBcImxvb2t1cFwiIHx8IGYudHlwZSA9PSBcIm1hc3Rlcl9kZXRhaWxcIikgJiYgZi5yZWZlcmVuY2VfdG8gJiYgXy5pc1N0cmluZyhmLnJlZmVyZW5jZV90bylcblx0XHRcdFx0IyDkuI3mlK/mjIFmLnJlZmVyZW5jZV90b+S4umZ1bmN0aW9u55qE5oOF5Ya177yM5pyJ6ZyA5rGC5YaN6K+0XG5cdFx0XHRcdHJfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QoZi5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdGlmIHJfb2JqZWN0XG5cdFx0XHRcdFx0Xy5mb3JFYWNoIHJfb2JqZWN0LmZpZWxkcywgKGYyLCBrMiktPlxuXHRcdFx0XHRcdFx0X29wdGlvbnMucHVzaCB7bGFiZWw6IFwiI3tmLmxhYmVsIHx8IGt9PT4je2YyLmxhYmVsIHx8IGsyfVwiLCB2YWx1ZTogXCIje2t9LiN7azJ9XCIsIGljb246IHJfb2JqZWN0Py5pY29ufVxuXHRpZiBpc19yZWxhdGVkXG5cdFx0cmVsYXRlZE9iamVjdHMgPSBDcmVhdG9yLmdldFJlbGF0ZWRPYmplY3RzKG9iamVjdF9uYW1lKVxuXHRcdF8uZWFjaCByZWxhdGVkT2JqZWN0cywgKF9yZWxhdGVkT2JqZWN0KT0+XG5cdFx0XHRyZWxhdGVkT3B0aW9ucyA9IENyZWF0b3IuZ2V0T2JqZWN0TG9va3VwRmllbGRPcHRpb25zKF9yZWxhdGVkT2JqZWN0Lm9iamVjdF9uYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlKVxuXHRcdFx0cmVsYXRlZE9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KF9yZWxhdGVkT2JqZWN0Lm9iamVjdF9uYW1lKVxuXHRcdFx0Xy5lYWNoIHJlbGF0ZWRPcHRpb25zLCAocmVsYXRlZE9wdGlvbiktPlxuXHRcdFx0XHRpZiBfcmVsYXRlZE9iamVjdC5mb3JlaWduX2tleSAhPSByZWxhdGVkT3B0aW9uLnZhbHVlXG5cdFx0XHRcdFx0X29wdGlvbnMucHVzaCB7bGFiZWw6IFwiI3tyZWxhdGVkT2JqZWN0LmxhYmVsIHx8IHJlbGF0ZWRPYmplY3QubmFtZX09PiN7cmVsYXRlZE9wdGlvbi5sYWJlbH1cIiwgdmFsdWU6IFwiI3tyZWxhdGVkT2JqZWN0Lm5hbWV9LiN7cmVsYXRlZE9wdGlvbi52YWx1ZX1cIiwgaWNvbjogcmVsYXRlZE9iamVjdD8uaWNvbn1cblx0cmV0dXJuIF9vcHRpb25zXG5cbiMg57uf5LiA5Li65a+56LGhb2JqZWN0X25hbWXmj5Dkvpvlj6/nlKjkuo7ov4fomZHlmajov4fomZHlrZfmrrVcbkNyZWF0b3IuZ2V0T2JqZWN0RmlsdGVyRmllbGRPcHRpb25zID0gKG9iamVjdF9uYW1lKS0+XG5cdF9vcHRpb25zID0gW11cblx0dW5sZXNzIG9iamVjdF9uYW1lXG5cdFx0cmV0dXJuIF9vcHRpb25zXG5cdF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0ZmllbGRzID0gX29iamVjdD8uZmllbGRzXG5cdHBlcm1pc3Npb25fZmllbGRzID0gQ3JlYXRvci5nZXRGaWVsZHMob2JqZWN0X25hbWUpXG5cdGljb24gPSBfb2JqZWN0Py5pY29uXG5cdF8uZm9yRWFjaCBmaWVsZHMsIChmLCBrKS0+XG5cdFx0IyBoaWRkZW4sZ3JpZOetieexu+Wei+eahOWtl+aute+8jOS4jemcgOimgei/h+a7pFxuXHRcdGlmICFfLmluY2x1ZGUoW1wiZ3JpZFwiLFwib2JqZWN0XCIsIFwiW09iamVjdF1cIiwgXCJbb2JqZWN0XVwiLCBcIk9iamVjdFwiLCBcImF2YXRhclwiLCBcImltYWdlXCIsIFwibWFya2Rvd25cIiwgXCJodG1sXCJdLCBmLnR5cGUpIGFuZCAhZi5oaWRkZW5cblx0XHRcdCMgZmlsdGVycy4kLmZpZWxk5Y+KZmxvdy5jdXJyZW50562J5a2Q5a2X5q615Lmf5LiN6ZyA6KaB6L+H5rukXG5cdFx0XHRpZiAhL1xcdytcXC4vLnRlc3QoaykgYW5kIF8uaW5kZXhPZihwZXJtaXNzaW9uX2ZpZWxkcywgaykgPiAtMVxuXHRcdFx0XHRfb3B0aW9ucy5wdXNoIHtsYWJlbDogZi5sYWJlbCB8fCBrLCB2YWx1ZTogaywgaWNvbjogaWNvbn1cblxuXHRyZXR1cm4gX29wdGlvbnNcblxuQ3JlYXRvci5nZXRPYmplY3RGaWVsZE9wdGlvbnMgPSAob2JqZWN0X25hbWUpLT5cblx0X29wdGlvbnMgPSBbXVxuXHR1bmxlc3Mgb2JqZWN0X25hbWVcblx0XHRyZXR1cm4gX29wdGlvbnNcblx0X29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRmaWVsZHMgPSBfb2JqZWN0Py5maWVsZHNcblx0cGVybWlzc2lvbl9maWVsZHMgPSBDcmVhdG9yLmdldEZpZWxkcyhvYmplY3RfbmFtZSlcblx0aWNvbiA9IF9vYmplY3Q/Lmljb25cblx0Xy5mb3JFYWNoIGZpZWxkcywgKGYsIGspLT5cblx0XHRpZiAhXy5pbmNsdWRlKFtcImdyaWRcIixcIm9iamVjdFwiLCBcIltPYmplY3RdXCIsIFwiW29iamVjdF1cIiwgXCJPYmplY3RcIiwgXCJtYXJrZG93blwiLCBcImh0bWxcIl0sIGYudHlwZSlcblx0XHRcdGlmICEvXFx3K1xcLi8udGVzdChrKSBhbmQgXy5pbmRleE9mKHBlcm1pc3Npb25fZmllbGRzLCBrKSA+IC0xXG5cdFx0XHRcdF9vcHRpb25zLnB1c2gge2xhYmVsOiBmLmxhYmVsIHx8IGssIHZhbHVlOiBrLCBpY29uOiBpY29ufVxuXHRyZXR1cm4gX29wdGlvbnNcblxuIyMjXG5maWx0ZXJzOiDopoHovazmjaLnmoRmaWx0ZXJzXG5maWVsZHM6IOWvueixoeWtl+autVxuZmlsdGVyX2ZpZWxkczog6buY6K6k6L+H5ruk5a2X5q6177yM5pSv5oyB5a2X56ym5Liy5pWw57uE5ZKM5a+56LGh5pWw57uE5Lik56eN5qC85byP77yM5aaCOlsnZmlsZWRfbmFtZTEnLCdmaWxlZF9uYW1lMiddLFt7ZmllbGQ6J2ZpbGVkX25hbWUxJyxyZXF1aXJlZDp0cnVlfV1cbuWkhOeQhumAu+i+kTog5oqKZmlsdGVyc+S4reWtmOWcqOS6jmZpbHRlcl9maWVsZHPnmoTov4fmu6TmnaHku7blop7liqDmr4/pobnnmoRpc19kZWZhdWx044CBaXNfcmVxdWlyZWTlsZ7mgKfvvIzkuI3lrZjlnKjkuo5maWx0ZXJfZmllbGRz55qE6L+H5ruk5p2h5Lu25a+55bqU55qE56e76Zmk5q+P6aG555qE55u45YWz5bGe5oCnXG7ov5Tlm57nu5Pmnpw6IOWkhOeQhuWQjueahGZpbHRlcnNcbiMjI1xuQ3JlYXRvci5nZXRGaWx0ZXJzV2l0aEZpbHRlckZpZWxkcyA9IChmaWx0ZXJzLCBmaWVsZHMsIGZpbHRlcl9maWVsZHMpLT5cblx0dW5sZXNzIGZpbHRlcnNcblx0XHRmaWx0ZXJzID0gW11cblx0dW5sZXNzIGZpbHRlcl9maWVsZHNcblx0XHRmaWx0ZXJfZmllbGRzID0gW11cblx0aWYgZmlsdGVyX2ZpZWxkcz8ubGVuZ3RoXG5cdFx0ZmlsdGVyX2ZpZWxkcy5mb3JFYWNoIChuKS0+XG5cdFx0XHRpZiBfLmlzU3RyaW5nKG4pXG5cdFx0XHRcdG4gPSBcblx0XHRcdFx0XHRmaWVsZDogbixcblx0XHRcdFx0XHRyZXF1aXJlZDogZmFsc2Vcblx0XHRcdGlmIGZpZWxkc1tuLmZpZWxkXSBhbmQgIV8uZmluZFdoZXJlKGZpbHRlcnMse2ZpZWxkOm4uZmllbGR9KVxuXHRcdFx0XHRmaWx0ZXJzLnB1c2hcblx0XHRcdFx0XHRmaWVsZDogbi5maWVsZCxcblx0XHRcdFx0XHRpc19kZWZhdWx0OiB0cnVlLFxuXHRcdFx0XHRcdGlzX3JlcXVpcmVkOiBuLnJlcXVpcmVkXG5cdGZpbHRlcnMuZm9yRWFjaCAoZmlsdGVySXRlbSktPlxuXHRcdG1hdGNoRmllbGQgPSBmaWx0ZXJfZmllbGRzLmZpbmQgKG4pLT4gcmV0dXJuIG4gPT0gZmlsdGVySXRlbS5maWVsZCBvciBuLmZpZWxkID09IGZpbHRlckl0ZW0uZmllbGRcblx0XHRpZiBfLmlzU3RyaW5nKG1hdGNoRmllbGQpXG5cdFx0XHRtYXRjaEZpZWxkID0gXG5cdFx0XHRcdGZpZWxkOiBtYXRjaEZpZWxkLFxuXHRcdFx0XHRyZXF1aXJlZDogZmFsc2Vcblx0XHRpZiBtYXRjaEZpZWxkXG5cdFx0XHRmaWx0ZXJJdGVtLmlzX2RlZmF1bHQgPSB0cnVlXG5cdFx0XHRmaWx0ZXJJdGVtLmlzX3JlcXVpcmVkID0gbWF0Y2hGaWVsZC5yZXF1aXJlZFxuXHRcdGVsc2Vcblx0XHRcdGRlbGV0ZSBmaWx0ZXJJdGVtLmlzX2RlZmF1bHRcblx0XHRcdGRlbGV0ZSBmaWx0ZXJJdGVtLmlzX3JlcXVpcmVkXG5cdHJldHVybiBmaWx0ZXJzXG5cbkNyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkID0gKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHNlbGVjdF9maWVsZHMsIGV4cGFuZCktPlxuXG5cdGlmICFvYmplY3RfbmFtZVxuXHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdGlmICFyZWNvcmRfaWRcblx0XHRyZWNvcmRfaWQgPSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKVxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiBvYmplY3RfbmFtZSA9PSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpICYmICByZWNvcmRfaWQgPT0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIilcblx0XHRcdGlmIFRlbXBsYXRlLmluc3RhbmNlKCk/LnJlY29yZFxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKT8ucmVjb3JkPy5nZXQoKVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBDcmVhdG9yLm9kYXRhLmdldChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzZWxlY3RfZmllbGRzLCBleHBhbmQpXG5cblx0b2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cblx0aWYgb2JqLmRhdGFiYXNlX25hbWUgPT0gXCJtZXRlb3JcIiB8fCAhb2JqLmRhdGFiYXNlX25hbWVcblx0XHRjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKVxuXHRcdGlmIGNvbGxlY3Rpb25cblx0XHRcdHJlY29yZCA9IGNvbGxlY3Rpb24uZmluZE9uZShyZWNvcmRfaWQpXG5cdFx0XHRyZXR1cm4gcmVjb3JkXG5cdGVsc2UgaWYgb2JqZWN0X25hbWUgJiYgcmVjb3JkX2lkXG5cdFx0cmV0dXJuIENyZWF0b3Iub2RhdGEuZ2V0KG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHNlbGVjdF9maWVsZHMsIGV4cGFuZClcblxuQ3JlYXRvci5nZXRPYmplY3RSZWNvcmROYW1lID0gKHJlY29yZCwgb2JqZWN0X25hbWUpLT5cblx0dW5sZXNzIHJlY29yZFxuXHRcdHJlY29yZCA9IENyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkKClcblx0aWYgcmVjb3JkXG5cdFx0IyDmmL7npLrnu4Tnu4fliJfooajml7bvvIznibnmrorlpITnkIZuYW1lX2ZpZWxkX2tleeS4um5hbWXlrZfmrrVcblx0XHRuYW1lX2ZpZWxkX2tleSA9IGlmIG9iamVjdF9uYW1lID09IFwib3JnYW5pemF0aW9uc1wiIHRoZW4gXCJuYW1lXCIgZWxzZSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk/Lk5BTUVfRklFTERfS0VZXG5cdFx0aWYgcmVjb3JkIGFuZCBuYW1lX2ZpZWxkX2tleVxuXHRcdFx0cmV0dXJuIHJlY29yZC5sYWJlbCB8fCByZWNvcmRbbmFtZV9maWVsZF9rZXldXG5cbkNyZWF0b3IuZ2V0QXBwID0gKGFwcF9pZCktPlxuXHRhcHBNZW51cyA9IFNlc3Npb24uZ2V0KFwiX2FwcF9tZW51c1wiKSB8fCBTZXNzaW9uLmdldChcImFwcF9tZW51c1wiKTtcblx0dW5sZXNzIGFwcE1lbnVzXG5cdFx0cmV0dXJuIHt9XG5cdGN1cnJlbnRBcHAgPSBhcHBNZW51cy5maW5kIChtZW51SXRlbSkgLT5cblx0XHRyZXR1cm4gbWVudUl0ZW0uaWQgPT0gYXBwX2lkXG5cdHJldHVybiBjdXJyZW50QXBwXG5cbkNyZWF0b3IuZ2V0QXBwRGFzaGJvYXJkID0gKGFwcF9pZCktPlxuXHRhcHAgPSBDcmVhdG9yLmdldEFwcChhcHBfaWQpXG5cdGlmICFhcHBcblx0XHRyZXR1cm5cblx0ZGFzaGJvYXJkID0gbnVsbFxuXHRfLmVhY2ggQ3JlYXRvci5EYXNoYm9hcmRzLCAodiwgayktPlxuXHRcdGlmIHYuYXBwcz8uaW5kZXhPZihhcHAuX2lkKSA+IC0xXG5cdFx0XHRkYXNoYm9hcmQgPSB2O1xuXHRyZXR1cm4gZGFzaGJvYXJkO1xuXG5DcmVhdG9yLmdldEFwcERhc2hib2FyZENvbXBvbmVudCA9IChhcHBfaWQpLT5cblx0YXBwID0gQ3JlYXRvci5nZXRBcHAoYXBwX2lkKVxuXHRpZiAhYXBwIHx8IHRydWVcblx0XHRyZXR1cm5cblx0IyByZXR1cm4gQnVpbGRlckNyZWF0b3IucGx1Z2luQ29tcG9uZW50U2VsZWN0b3IoQnVpbGRlckNyZWF0b3Iuc3RvcmUuZ2V0U3RhdGUoKSwgXCJEYXNoYm9hcmRcIiwgYXBwLl9pZCk7XG5cbkNyZWF0b3IuZ2V0QXBwT2JqZWN0TmFtZXMgPSAoYXBwX2lkKS0+XG5cdGFwcCA9IENyZWF0b3IuZ2V0QXBwKGFwcF9pZClcblx0aWYgIWFwcFxuXHRcdHJldHVyblxuXHRpc01vYmlsZSA9IFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRhcHBPYmplY3RzID0gaWYgaXNNb2JpbGUgdGhlbiBhcHAubW9iaWxlX29iamVjdHMgZWxzZSBhcHAub2JqZWN0c1xuXHRvYmplY3RzID0gW11cblx0aWYgYXBwXG5cdFx0Xy5lYWNoIGFwcE9iamVjdHMsICh2KS0+XG5cdFx0XHRvYmogPSBDcmVhdG9yLmdldE9iamVjdCh2KVxuXHRcdFx0aWYgb2JqPy5wZXJtaXNzaW9ucy5nZXQoKS5hbGxvd1JlYWRcblx0XHRcdFx0b2JqZWN0cy5wdXNoIHZcblx0cmV0dXJuIG9iamVjdHNcblxuQ3JlYXRvci5nZXRVcmxXaXRoVG9rZW4gPSAodXJsLCBleHByZXNzaW9uRm9ybURhdGEpIC0+XG5cdCMg57uZdXJs5pe25ou85o6l5b2T5YmN55So5oi3dG9rZW7nm7jlhbPkv6Hmga/nlKjkuo7nmbvlvZXpqozor4HvvIzmlK/mjIHphY3nva7ooajovr7lvI9cblx0cGFyYW1zID0ge307XG5cdHBhcmFtc1tcIlgtU3BhY2UtSWRcIl0gPSBTdGVlZG9zLnNwYWNlSWQoKVxuXHRwYXJhbXNbXCJYLVVzZXItSWRcIl0gPSBTdGVlZG9zLnVzZXJJZCgpO1xuXHRwYXJhbXNbXCJYLUNvbXBhbnktSWRzXCJdID0gU3RlZWRvcy5nZXRVc2VyQ29tcGFueUlkcygpO1xuXHRwYXJhbXNbXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuXHRpZiBTdGVlZG9zLmlzRXhwcmVzc2lvbih1cmwpXG5cdFx0dXJsID0gU3RlZWRvcy5wYXJzZVNpbmdsZUV4cHJlc3Npb24odXJsLCBleHByZXNzaW9uRm9ybURhdGEsIFwiI1wiLCBDcmVhdG9yLlVTRVJfQ09OVEVYVClcblx0IyDlpJbpg6jpk77mjqXlnLDlnYDkuK3lj6/og73kvJrluKbmnIkj5Y+377yM5q+U5aaCL2J1aWxkZXIvP3BfaWRzPTYxOTM4MzU0NWIyZTlhNzJlYzA1NThiMyMvcGFnZS9wdWJsaWMvdGVzdFxuXHQjIOatpOaXtnVybOS4reW3sue7j+WcqCPlj7fliY3pnaLlh7rnjrDkuobkuIDkuKo/5Y+377yM6L+Z5Liq6Zeu5Y+35LiN5Y+v5Lul6KKr6K+G5Yir5Li6dXJs5Y+C5pWw77yM5Y+q5pyJI+WPt+WQjumdoueahD/lj7fmiY3lupTor6Xooqvor4bliKvkuLp1cmzlj4LmlbBcblx0aGFzUXVlcnlTeW1ib2wgPSAvKFxcIy4rXFw/KXwoXFw/W14jXSokKS9nLnRlc3QodXJsKVxuXHRsaW5rU3RyID0gaWYgaGFzUXVlcnlTeW1ib2wgdGhlbiBcIiZcIiBlbHNlIFwiP1wiXG5cdHJldHVybiBcIiN7dXJsfSN7bGlua1N0cn0jeyQucGFyYW0ocGFyYW1zKX1cIlxuXG5DcmVhdG9yLmdldEFwcE1lbnUgPSAoYXBwX2lkLCBtZW51X2lkKS0+XG5cdG1lbnVzID0gQ3JlYXRvci5nZXRBcHBNZW51cyhhcHBfaWQpXG5cdHJldHVybiBtZW51cyAmJiBtZW51cy5maW5kIChtZW51KS0+IHJldHVybiBtZW51LmlkID09IG1lbnVfaWRcblxuQ3JlYXRvci5nZXRBcHBNZW51VXJsRm9ySW50ZXJuZXQgPSAobWVudSktPlxuXHQjIOW9k3RhYnPnsbvlnovkuLp1cmzml7bvvIzmjInlpJbpg6jpk77mjqXlpITnkIbvvIzmlK/mjIHphY3nva7ooajovr7lvI/lubbliqDkuIrnu5/kuIDnmoR1cmzlj4LmlbBcblx0cmV0dXJuIENyZWF0b3IuZ2V0VXJsV2l0aFRva2VuIG1lbnUucGF0aCwgbWVudVxuXG5DcmVhdG9yLmdldEFwcE1lbnVVcmwgPSAobWVudSktPlxuXHR1cmwgPSBtZW51LnBhdGhcblx0aWYgbWVudS50eXBlID09IFwidXJsXCJcblx0XHRpZiBtZW51LnRhcmdldFxuXHRcdFx0cmV0dXJuIENyZWF0b3IuZ2V0QXBwTWVudVVybEZvckludGVybmV0KG1lbnUpXG5cdFx0ZWxzZVxuXHRcdFx0IyDlnKhpZnJhbWXkuK3mmL7npLp1cmznlYzpnaJcblx0XHRcdHJldHVybiBcIi9hcHAvLS90YWJfaWZyYW1lLyN7bWVudS5pZH1cIlxuXHRlbHNlXG5cdFx0cmV0dXJuIG1lbnUucGF0aFxuXG5DcmVhdG9yLmdldEFwcE1lbnVzID0gKGFwcF9pZCktPlxuXHRhcHBNZW51cyA9IFNlc3Npb24uZ2V0KFwiX2FwcF9tZW51c1wiKSB8fCBTZXNzaW9uLmdldChcImFwcF9tZW51c1wiKTtcblx0dW5sZXNzIGFwcE1lbnVzXG5cdFx0cmV0dXJuIFtdXG5cdGN1cmVudEFwcE1lbnVzID0gYXBwTWVudXMuZmluZCAobWVudUl0ZW0pIC0+XG5cdFx0cmV0dXJuIG1lbnVJdGVtLmlkID09IGFwcF9pZFxuXHRpZiBjdXJlbnRBcHBNZW51c1xuXHRcdHJldHVybiBjdXJlbnRBcHBNZW51cy5jaGlsZHJlblxuXG5DcmVhdG9yLmxvYWRBcHBzTWVudXMgPSAoKS0+XG5cdGlzTW9iaWxlID0gU3RlZWRvcy5pc01vYmlsZSgpXG5cdGRhdGEgPSB7IH1cblx0aWYgaXNNb2JpbGVcblx0XHRkYXRhLm1vYmlsZSA9IGlzTW9iaWxlXG5cdG9wdGlvbnMgPSB7IFxuXHRcdHR5cGU6ICdnZXQnLCBcblx0XHRkYXRhOiBkYXRhLCBcblx0XHRzdWNjZXNzOiAoZGF0YSktPlxuXHRcdFx0U2Vzc2lvbi5zZXQoXCJhcHBfbWVudXNcIiwgZGF0YSk7XG5cdCB9XG5cdFN0ZWVkb3M/LmF1dGhSZXF1ZXN0IFwiL3NlcnZpY2UvYXBpL2FwcHMvbWVudXNcIiwgb3B0aW9uc1xuXG5DcmVhdG9yLmNyZWF0b3JBcHBzU2VsZWN0b3IgPSAoYXBwcywgYXNzaWduZWRfYXBwcykgLT5cblx0YWRtaW5BcHAgPSB1bmRlZmluZWRcblx0c29ydGVkQXBwcyA9IHVuZGVmaW5lZFxuXHRfLmVhY2ggYXBwcywgKGFwcCwga2V5KSAtPlxuXHRcdGlmICFhcHAuX2lkXG5cdFx0XHRhcHAuX2lkID0ga2V5XG5cdFx0aWYgYXBwLmlzX2NyZWF0b3Jcblx0XHRcdCMg5LiN6ZyA6KaBaXNTcGFjZUFkbWlu6YC76L6RXG5cdFx0XHQjIGlmIChpc1NwYWNlQWRtaW4pIHtcblx0XHRcdCNcdFx0IGFwcC52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdCMgfVxuXHRcdGVsc2Vcblx0XHRcdCMg6Z2eY3JlYXRvcuW6lOivpeS4gOW+i+S4jeaYvuekulxuXHRcdFx0YXBwLnZpc2libGUgPSBmYWxzZVxuXHRcdHJldHVyblxuXHRzb3J0ZWRBcHBzID0gXy5zb3J0QnkoXy52YWx1ZXMoYXBwcyksICdzb3J0Jylcblx0Y3JlYXRvckFwcHMgPSB7fVxuXHRhZG1pbkFwcCA9IHt9XG5cdCMg5oyJ6ZKuc29ydOaOkuW6j+asoeW6j+iuvue9rkNyZWF0b3IuQXBwc+WAvFxuXHRfLmVhY2ggc29ydGVkQXBwcywgKG4pIC0+XG5cdFx0aWYgbi5faWQgPT0gJ2FkbWluJ1xuXHRcdFx0YWRtaW5BcHAgPSBuXG5cdFx0ZWxzZVxuXHRcdFx0Y3JlYXRvckFwcHNbbi5faWRdID0gblxuXHQjIGFkbWlu6I+c5Y2V5pi+56S65Zyo5pyA5ZCOXG5cdGNyZWF0b3JBcHBzLmFkbWluID0gYWRtaW5BcHBcblx0aWYgYXNzaWduZWRfYXBwcy5sZW5ndGhcblx0XHRfLmVhY2ggY3JlYXRvckFwcHMsIChhcHAsIGtleSkgLT5cblx0XHRcdGlmIGFzc2lnbmVkX2FwcHMuaW5kZXhPZihrZXkpID4gLTFcblx0XHRcdFx0YXBwLnZpc2libGUgPSBhcHAuaXNfY3JlYXRvclxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhcHAudmlzaWJsZSA9IGZhbHNlXG5cdFx0XHRyZXR1cm5cblx0Y3JlYXRvckFwcHNcblxuQ3JlYXRvci52aXNpYmxlQXBwc1NlbGVjdG9yID0gKGNyZWF0b3JBcHBzLCBpbmNsdWRlQWRtaW4gPSB0cnVlKSAtPlxuXHRhcHBzID0gW11cblx0Xy5lYWNoIGNyZWF0b3JBcHBzLCAodiwgaykgLT5cblx0XHRpZiB2LnZpc2libGUgIT0gZmFsc2UgYW5kIHYuX2lkICE9ICdhZG1pbicgb3IgaW5jbHVkZUFkbWluIGFuZCB2Ll9pZCA9PSAnYWRtaW4nXG5cdFx0XHRhcHBzLnB1c2ggdlxuXHRcdHJldHVyblxuXHRhcHBzXG5cbkNyZWF0b3IuZ2V0VmlzaWJsZUFwcHMgPSAoaW5jbHVkZUFkbWluKS0+XG5cdGNoYW5nZUFwcCA9IENyZWF0b3IuX3N1YkFwcC5nZXQoKTtcblx0Y3JlYXRvckFwcHMgPSBPYmplY3QuYXNzaWduKHt9LCBDcmVhdG9yLkFwcHMsIHthcHBzOiBjaGFuZ2VBcHB9KTtcblx0cmV0dXJuIENyZWF0b3IudmlzaWJsZUFwcHNTZWxlY3RvcihjcmVhdG9yQXBwcywgaW5jbHVkZUFkbWluKVxuXG5DcmVhdG9yLmdldFZpc2libGVBcHBzT2JqZWN0cyA9ICgpLT5cblx0YXBwcyA9IENyZWF0b3IuZ2V0VmlzaWJsZUFwcHMoKVxuXHR2aXNpYmxlT2JqZWN0TmFtZXMgPSBfLmZsYXR0ZW4oXy5wbHVjayhhcHBzLCdvYmplY3RzJykpXG5cdG9iamVjdHMgPSBfLmZpbHRlciBDcmVhdG9yLk9iamVjdHMsIChvYmopLT5cblx0XHRpZiB2aXNpYmxlT2JqZWN0TmFtZXMuaW5kZXhPZihvYmoubmFtZSkgPCAwXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRvYmplY3RzID0gb2JqZWN0cy5zb3J0KENyZWF0b3Iuc29ydGluZ01ldGhvZC5iaW5kKHtrZXk6XCJsYWJlbFwifSkpXG5cdG9iamVjdHMgPSBfLnBsdWNrKG9iamVjdHMsJ25hbWUnKVxuXHRyZXR1cm4gXy51bmlxIG9iamVjdHNcblxuQ3JlYXRvci5nZXRBcHBzT2JqZWN0cyA9ICgpLT5cblx0b2JqZWN0cyA9IFtdXG5cdHRlbXBPYmplY3RzID0gW11cblx0Xy5mb3JFYWNoIENyZWF0b3IuQXBwcywgKGFwcCktPlxuXHRcdHRlbXBPYmplY3RzID0gXy5maWx0ZXIgYXBwLm9iamVjdHMsIChvYmopLT5cblx0XHRcdHJldHVybiAhb2JqLmhpZGRlblxuXHRcdG9iamVjdHMgPSBvYmplY3RzLmNvbmNhdCh0ZW1wT2JqZWN0cylcblx0cmV0dXJuIF8udW5pcSBvYmplY3RzXG5cbkNyZWF0b3IudmFsaWRhdGVGaWx0ZXJzID0gKGZpbHRlcnMsIGxvZ2ljKS0+XG5cdGZpbHRlcl9pdGVtcyA9IF8ubWFwIGZpbHRlcnMsIChvYmopIC0+XG5cdFx0aWYgXy5pc0VtcHR5KG9iailcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBvYmpcblx0ZmlsdGVyX2l0ZW1zID0gXy5jb21wYWN0KGZpbHRlcl9pdGVtcylcblx0ZXJyb3JNc2cgPSBcIlwiXG5cdGZpbHRlcl9sZW5ndGggPSBmaWx0ZXJfaXRlbXMubGVuZ3RoXG5cdGlmIGxvZ2ljXG5cdFx0IyDmoLzlvI/ljJZmaWx0ZXJcblx0XHRsb2dpYyA9IGxvZ2ljLnJlcGxhY2UoL1xcbi9nLCBcIlwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKVxuXG5cdFx0IyDliKTmlq3nibnmrorlrZfnrKZcblx0XHRpZiAvWy5fXFwtIStdKy9pZy50ZXN0KGxvZ2ljKVxuXHRcdFx0ZXJyb3JNc2cgPSBcIuWQq+acieeJueauiuWtl+espuOAglwiXG5cblx0XHRpZiAhZXJyb3JNc2dcblx0XHRcdGluZGV4ID0gbG9naWMubWF0Y2goL1xcZCsvaWcpXG5cdFx0XHRpZiAhaW5kZXhcblx0XHRcdFx0ZXJyb3JNc2cgPSBcIuacieS6m+etm+mAieadoeS7tui/m+ihjOS6huWumuS5ie+8jOS9huacquWcqOmrmOe6p+etm+mAieadoeS7tuS4reiiq+W8leeUqOOAglwiXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGluZGV4LmZvckVhY2ggKGkpLT5cblx0XHRcdFx0XHRpZiBpIDwgMSBvciBpID4gZmlsdGVyX2xlbmd0aFxuXHRcdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIuaCqOeahOetm+mAieadoeS7tuW8leeUqOS6huacquWumuS5ieeahOetm+mAieWZqO+8miN7aX3jgIJcIlxuXG5cdFx0XHRcdGZsYWcgPSAxXG5cdFx0XHRcdHdoaWxlIGZsYWcgPD0gZmlsdGVyX2xlbmd0aFxuXHRcdFx0XHRcdGlmICFpbmRleC5pbmNsdWRlcyhcIiN7ZmxhZ31cIilcblx0XHRcdFx0XHRcdGVycm9yTXNnID0gXCLmnInkupvnrZvpgInmnaHku7bov5vooYzkuoblrprkuYnvvIzkvYbmnKrlnKjpq5jnuqfnrZvpgInmnaHku7bkuK3ooqvlvJXnlKjjgIJcIlxuXHRcdFx0XHRcdGZsYWcrKztcblxuXHRcdGlmICFlcnJvck1zZ1xuXHRcdFx0IyDliKTmlq3mmK/lkKbmnInpnZ7ms5Xoi7HmloflrZfnrKZcblx0XHRcdHdvcmQgPSBsb2dpYy5tYXRjaCgvW2EtekEtWl0rL2lnKVxuXHRcdFx0aWYgd29yZFxuXHRcdFx0XHR3b3JkLmZvckVhY2ggKHcpLT5cblx0XHRcdFx0XHRpZiAhL14oYW5kfG9yKSQvaWcudGVzdCh3KVxuXHRcdFx0XHRcdFx0ZXJyb3JNc2cgPSBcIuajgOafpeaCqOeahOmrmOe6p+etm+mAieadoeS7tuS4reeahOaLvOWGmeOAglwiXG5cblx0XHRpZiAhZXJyb3JNc2dcblx0XHRcdCMg5Yik5pat5qC85byP5piv5ZCm5q2j56GuXG5cdFx0XHR0cnlcblx0XHRcdFx0Q3JlYXRvci5ldmFsKGxvZ2ljLnJlcGxhY2UoL2FuZC9pZywgXCImJlwiKS5yZXBsYWNlKC9vci9pZywgXCJ8fFwiKSlcblx0XHRcdGNhdGNoIGVcblx0XHRcdFx0ZXJyb3JNc2cgPSBcIuaCqOeahOetm+mAieWZqOS4reWQq+acieeJueauiuWtl+esplwiXG5cblx0XHRcdGlmIC8oQU5EKVteKCldKyhPUikvaWcudGVzdChsb2dpYykgfHwgIC8oT1IpW14oKV0rKEFORCkvaWcudGVzdChsb2dpYylcblx0XHRcdFx0ZXJyb3JNc2cgPSBcIuaCqOeahOetm+mAieWZqOW/hemhu+WcqOi/nue7reaAp+eahCBBTkQg5ZKMIE9SIOihqOi+vuW8j+WJjeWQjuS9v+eUqOaLrOWPt+OAglwiXG5cdGlmIGVycm9yTXNnXG5cdFx0Y29uc29sZS5sb2cgXCJlcnJvclwiLCBlcnJvck1zZ1xuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0dG9hc3RyLmVycm9yKGVycm9yTXNnKVxuXHRcdHJldHVybiBmYWxzZVxuXHRlbHNlXG5cdFx0cmV0dXJuIHRydWVcblxuIyBcIj1cIiwgXCI8PlwiLCBcIj5cIiwgXCI+PVwiLCBcIjxcIiwgXCI8PVwiLCBcInN0YXJ0c3dpdGhcIiwgXCJjb250YWluc1wiLCBcIm5vdGNvbnRhaW5zXCIuXG4jIyNcbm9wdGlvbnPlj4LmlbDvvJpcblx0ZXh0ZW5kLS0g5piv5ZCm6ZyA6KaB5oqK5b2T5YmN55So5oi35Z+65pys5L+h5oGv5Yqg5YWl5YWs5byP77yM5Y2z6K6p5YWs5byP5pSv5oyBQ3JlYXRvci5VU0VSX0NPTlRFWFTkuK3nmoTlgLzvvIzpu5jorqTkuLp0cnVlXG5cdHVzZXJJZC0tIOW9k+WJjeeZu+W9leeUqOaIt1xuXHRzcGFjZUlkLS0g5b2T5YmN5omA5Zyo5bel5L2c5Yy6XG5leHRlbmTkuLp0cnVl5pe277yM5ZCO56uv6ZyA6KaB6aKd5aSW5Lyg5YWldXNlcklk5Y+Kc3BhY2VJZOeUqOS6juaKk+WPlkNyZWF0b3IuVVNFUl9DT05URVhU5a+55bqU55qE5YC8XG4jIyNcbkNyZWF0b3IuZm9ybWF0RmlsdGVyc1RvTW9uZ28gPSAoZmlsdGVycywgb3B0aW9ucyktPlxuXHR1bmxlc3MgZmlsdGVycz8ubGVuZ3RoXG5cdFx0cmV0dXJuXG5cdCMg5b2TZmlsdGVyc+S4jeaYr1tBcnJheV3nsbvlnovogIzmmK9bT2JqZWN0Xeexu+Wei+aXtu+8jOi/m+ihjOagvOW8j+i9rOaNolxuXHR1bmxlc3MgZmlsdGVyc1swXSBpbnN0YW5jZW9mIEFycmF5XG5cdFx0ZmlsdGVycyA9IF8ubWFwIGZpbHRlcnMsIChvYmopLT5cblx0XHRcdHJldHVybiBbb2JqLmZpZWxkLCBvYmoub3BlcmF0aW9uLCBvYmoudmFsdWVdXG5cdHNlbGVjdG9yID0gW11cblx0Xy5lYWNoIGZpbHRlcnMsIChmaWx0ZXIpLT5cblx0XHRmaWVsZCA9IGZpbHRlclswXVxuXHRcdG9wdGlvbiA9IGZpbHRlclsxXVxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0dmFsdWUgPSBDcmVhdG9yLmV2YWx1YXRlRm9ybXVsYShmaWx0ZXJbMl0pXG5cdFx0ZWxzZVxuXHRcdFx0dmFsdWUgPSBDcmVhdG9yLmV2YWx1YXRlRm9ybXVsYShmaWx0ZXJbMl0sIG51bGwsIG9wdGlvbnMpXG5cdFx0c3ViX3NlbGVjdG9yID0ge31cblx0XHRzdWJfc2VsZWN0b3JbZmllbGRdID0ge31cblx0XHRpZiBvcHRpb24gPT0gXCI9XCJcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkZXFcIl0gPSB2YWx1ZVxuXHRcdGVsc2UgaWYgb3B0aW9uID09IFwiPD5cIlxuXHRcdFx0c3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRuZVwiXSA9IHZhbHVlXG5cdFx0ZWxzZSBpZiBvcHRpb24gPT0gXCI+XCJcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkZ3RcIl0gPSB2YWx1ZVxuXHRcdGVsc2UgaWYgb3B0aW9uID09IFwiPj1cIlxuXHRcdFx0c3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRndGVcIl0gPSB2YWx1ZVxuXHRcdGVsc2UgaWYgb3B0aW9uID09IFwiPFwiXG5cdFx0XHRzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGx0XCJdID0gdmFsdWVcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcIjw9XCJcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkbHRlXCJdID0gdmFsdWVcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcInN0YXJ0c3dpdGhcIlxuXHRcdFx0cmVnID0gbmV3IFJlZ0V4cChcIl5cIiArIHZhbHVlLCBcImlcIilcblx0XHRcdHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkcmVnZXhcIl0gPSByZWdcblx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcImNvbnRhaW5zXCJcblx0XHRcdHJlZyA9IG5ldyBSZWdFeHAodmFsdWUsIFwiaVwiKVxuXHRcdFx0c3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRyZWdleFwiXSA9IHJlZ1xuXHRcdGVsc2UgaWYgb3B0aW9uID09IFwibm90Y29udGFpbnNcIlxuXHRcdFx0cmVnID0gbmV3IFJlZ0V4cChcIl4oKD8hXCIgKyB2YWx1ZSArIFwiKS4pKiRcIiwgXCJpXCIpXG5cdFx0XHRzdWJfc2VsZWN0b3JbZmllbGRdW1wiJHJlZ2V4XCJdID0gcmVnXG5cdFx0c2VsZWN0b3IucHVzaCBzdWJfc2VsZWN0b3Jcblx0cmV0dXJuIHNlbGVjdG9yXG5cbkNyZWF0b3IuaXNCZXR3ZWVuRmlsdGVyT3BlcmF0aW9uID0gKG9wZXJhdGlvbiktPlxuXHRyZXR1cm4gb3BlcmF0aW9uID09IFwiYmV0d2VlblwiIG9yICEhQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXModHJ1ZSk/W29wZXJhdGlvbl1cblxuIyMjXG5vcHRpb25z5Y+C5pWw77yaXG5cdGV4dGVuZC0tIOaYr+WQpumcgOimgeaKiuW9k+WJjeeUqOaIt+WfuuacrOS/oeaBr+WKoOWFpeWFrOW8j++8jOWNs+iuqeWFrOW8j+aUr+aMgUNyZWF0b3IuVVNFUl9DT05URVhU5Lit55qE5YC877yM6buY6K6k5Li6dHJ1ZVxuXHR1c2VySWQtLSDlvZPliY3nmbvlvZXnlKjmiLdcblx0c3BhY2VJZC0tIOW9k+WJjeaJgOWcqOW3peS9nOWMulxuXHRleHRlbmTkuLp0cnVl5pe277yM5ZCO56uv6ZyA6KaB6aKd5aSW5Lyg5YWldXNlcklk5Y+Kc3BhY2VJZOeUqOS6juaKk+WPlkNyZWF0b3IuVVNFUl9DT05URVhU5a+55bqU55qE5YC8XG4jIyNcbkNyZWF0b3IuZm9ybWF0RmlsdGVyc1RvRGV2ID0gKGZpbHRlcnMsIG9iamVjdF9uYW1lLCBvcHRpb25zKS0+XG5cdHVubGVzcyBmaWx0ZXJzLmxlbmd0aFxuXHRcdHJldHVyblxuXHRpZiBvcHRpb25zPy5pc19sb2dpY19vclxuXHRcdCMg5aaC5p6caXNfbG9naWNfb3LkuLp0cnVl77yM5Li6ZmlsdGVyc+esrOS4gOWxguWFg+e0oOWinuWKoG9y6Ze06ZqUXG5cdFx0bG9naWNUZW1wRmlsdGVycyA9IFtdXG5cdFx0ZmlsdGVycy5mb3JFYWNoIChuKS0+XG5cdFx0XHRsb2dpY1RlbXBGaWx0ZXJzLnB1c2gobilcblx0XHRcdGxvZ2ljVGVtcEZpbHRlcnMucHVzaChcIm9yXCIpXG5cdFx0bG9naWNUZW1wRmlsdGVycy5wb3AoKVxuXHRcdGZpbHRlcnMgPSBsb2dpY1RlbXBGaWx0ZXJzXG5cdHNlbGVjdG9yID0gU3RlZWRvc0ZpbHRlcnMuZm9ybWF0RmlsdGVyc1RvRGV2KGZpbHRlcnMsIENyZWF0b3IuVVNFUl9DT05URVhUKVxuXHRyZXR1cm4gc2VsZWN0b3JcblxuIyMjXG5vcHRpb25z5Y+C5pWw77yaXG5cdGV4dGVuZC0tIOaYr+WQpumcgOimgeaKiuW9k+WJjeeUqOaIt+WfuuacrOS/oeaBr+WKoOWFpeWFrOW8j++8jOWNs+iuqeWFrOW8j+aUr+aMgUNyZWF0b3IuVVNFUl9DT05URVhU5Lit55qE5YC877yM6buY6K6k5Li6dHJ1ZVxuXHR1c2VySWQtLSDlvZPliY3nmbvlvZXnlKjmiLdcblx0c3BhY2VJZC0tIOW9k+WJjeaJgOWcqOW3peS9nOWMulxuZXh0ZW5k5Li6dHJ1ZeaXtu+8jOWQjuerr+mcgOimgemineWkluS8oOWFpXVzZXJJZOWPinNwYWNlSWTnlKjkuo7mipPlj5ZDcmVhdG9yLlVTRVJfQ09OVEVYVOWvueW6lOeahOWAvFxuIyMjXG5DcmVhdG9yLmZvcm1hdExvZ2ljRmlsdGVyc1RvRGV2ID0gKGZpbHRlcnMsIGZpbHRlcl9sb2dpYywgb3B0aW9ucyktPlxuXHRmb3JtYXRfbG9naWMgPSBmaWx0ZXJfbG9naWMucmVwbGFjZSgvXFwoXFxzKy9pZywgXCIoXCIpLnJlcGxhY2UoL1xccytcXCkvaWcsIFwiKVwiKS5yZXBsYWNlKC9cXCgvZywgXCJbXCIpLnJlcGxhY2UoL1xcKS9nLCBcIl1cIikucmVwbGFjZSgvXFxzKy9nLCBcIixcIikucmVwbGFjZSgvKGFuZHxvcikvaWcsIFwiJyQxJ1wiKVxuXHRmb3JtYXRfbG9naWMgPSBmb3JtYXRfbG9naWMucmVwbGFjZSgvKFxcZCkrL2lnLCAoeCktPlxuXHRcdF9mID0gZmlsdGVyc1t4LTFdXG5cdFx0ZmllbGQgPSBfZi5maWVsZFxuXHRcdG9wdGlvbiA9IF9mLm9wZXJhdGlvblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0dmFsdWUgPSBDcmVhdG9yLmV2YWx1YXRlRm9ybXVsYShfZi52YWx1ZSlcblx0XHRlbHNlXG5cdFx0XHR2YWx1ZSA9IENyZWF0b3IuZXZhbHVhdGVGb3JtdWxhKF9mLnZhbHVlLCBudWxsLCBvcHRpb25zKVxuXHRcdHN1Yl9zZWxlY3RvciA9IFtdXG5cdFx0aWYgXy5pc0FycmF5KHZhbHVlKSA9PSB0cnVlXG5cdFx0XHRpZiBvcHRpb24gPT0gXCI9XCJcblx0XHRcdFx0Xy5lYWNoIHZhbHVlLCAodiktPlxuXHRcdFx0XHRcdHN1Yl9zZWxlY3Rvci5wdXNoIFtmaWVsZCwgb3B0aW9uLCB2XSwgXCJvclwiXG5cdFx0XHRlbHNlIGlmIG9wdGlvbiA9PSBcIjw+XCJcblx0XHRcdFx0Xy5lYWNoIHZhbHVlLCAodiktPlxuXHRcdFx0XHRcdHN1Yl9zZWxlY3Rvci5wdXNoIFtmaWVsZCwgb3B0aW9uLCB2XSwgXCJhbmRcIlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRfLmVhY2ggdmFsdWUsICh2KS0+XG5cdFx0XHRcdFx0c3ViX3NlbGVjdG9yLnB1c2ggW2ZpZWxkLCBvcHRpb24sIHZdLCBcIm9yXCJcblx0XHRcdGlmIHN1Yl9zZWxlY3RvcltzdWJfc2VsZWN0b3IubGVuZ3RoIC0gMV0gPT0gXCJhbmRcIiB8fCBzdWJfc2VsZWN0b3Jbc3ViX3NlbGVjdG9yLmxlbmd0aCAtIDFdID09IFwib3JcIlxuXHRcdFx0XHRzdWJfc2VsZWN0b3IucG9wKClcblx0XHRlbHNlXG5cdFx0XHRzdWJfc2VsZWN0b3IgPSBbZmllbGQsIG9wdGlvbiwgdmFsdWVdXG5cdFx0IyBjb25zb2xlLmxvZyBcInN1Yl9zZWxlY3RvclwiLCBzdWJfc2VsZWN0b3Jcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3ViX3NlbGVjdG9yKVxuXHQpXG5cdGZvcm1hdF9sb2dpYyA9IFwiWyN7Zm9ybWF0X2xvZ2ljfV1cIlxuXHRyZXR1cm4gQ3JlYXRvci5ldmFsKGZvcm1hdF9sb2dpYylcblxuQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0cyA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKS0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdGlmICFvYmplY3RfbmFtZVxuXHRcdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcblx0XHRpZiAhdXNlcklkXG5cdFx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblxuXHRyZWxhdGVkX29iamVjdF9uYW1lcyA9IFtdXG5cdF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblxuXHRpZiAhX29iamVjdFxuXHRcdHJldHVybiByZWxhdGVkX29iamVjdF9uYW1lc1xuXG4jXHRyZWxhdGVkX29iamVjdF9uYW1lcyA9IF8ucGx1Y2soX29iamVjdC5yZWxhdGVkX29iamVjdHMsXCJvYmplY3RfbmFtZVwiKVxuXG5cdHJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0T2JqZWN0UmVsYXRlZHMoX29iamVjdC5fY29sbGVjdGlvbl9uYW1lKVxuXG5cdHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gXy5wbHVjayhyZWxhdGVkX29iamVjdHMsXCJvYmplY3RfbmFtZVwiKVxuXHRpZiByZWxhdGVkX29iamVjdF9uYW1lcz8ubGVuZ3RoID09IDBcblx0XHRyZXR1cm4gcmVsYXRlZF9vYmplY3RfbmFtZXNcblxuXHRwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZClcblx0dW5yZWxhdGVkX29iamVjdHMgPSBwZXJtaXNzaW9ucy51bnJlbGF0ZWRfb2JqZWN0c1xuXG5cdHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gXy5kaWZmZXJlbmNlIHJlbGF0ZWRfb2JqZWN0X25hbWVzLCB1bnJlbGF0ZWRfb2JqZWN0c1xuXHRyZXR1cm4gXy5maWx0ZXIgcmVsYXRlZF9vYmplY3RzLCAocmVsYXRlZF9vYmplY3QpLT5cblx0XHRyZWxhdGVkX29iamVjdF9uYW1lID0gcmVsYXRlZF9vYmplY3Qub2JqZWN0X25hbWVcblx0XHRpc0FjdGl2ZSA9IHJlbGF0ZWRfb2JqZWN0X25hbWVzLmluZGV4T2YocmVsYXRlZF9vYmplY3RfbmFtZSkgPiAtMVxuXHRcdCMgcmVsYXRlZF9vYmplY3RfbmFtZSA9IGlmIHJlbGF0ZWRfb2JqZWN0X25hbWUgPT0gXCJjZnNfZmlsZXNfZmlsZXJlY29yZFwiIHRoZW4gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiIGVsc2UgcmVsYXRlZF9vYmplY3RfbmFtZVxuXHRcdGFsbG93UmVhZCA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMocmVsYXRlZF9vYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKT8uYWxsb3dSZWFkXG5cdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0XHRhbGxvd1JlYWQgPSBhbGxvd1JlYWQgJiYgcGVybWlzc2lvbnMuYWxsb3dSZWFkRmlsZXNcblx0XHRyZXR1cm4gaXNBY3RpdmUgYW5kIGFsbG93UmVhZFxuXG5DcmVhdG9yLmdldFJlbGF0ZWRPYmplY3ROYW1lcyA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKS0+XG5cdHJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdHMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZClcblx0cmV0dXJuIF8ucGx1Y2socmVsYXRlZF9vYmplY3RzLFwib2JqZWN0X25hbWVcIilcblxuQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0TGlzdEFjdGlvbnMgPSAocmVsYXRlZE9iamVjdE5hbWUsIHNwYWNlSWQsIHVzZXJJZCktPlxuXHRhY3Rpb25zID0gQ3JlYXRvci5nZXRBY3Rpb25zKHJlbGF0ZWRPYmplY3ROYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdGFjdGlvbnMgPSBfLmZpbHRlciBhY3Rpb25zLCAoYWN0aW9uKS0+XG5cdFx0aWYgYWN0aW9uLm5hbWUgPT0gXCJzdGFuZGFyZF9mb2xsb3dcIlxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgYWN0aW9uLm5hbWUgPT0gXCJzdGFuZGFyZF9xdWVyeVwiXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRpZiBhY3Rpb24ub24gPT0gXCJsaXN0XCJcblx0XHRcdGlmIHR5cGVvZiBhY3Rpb24udmlzaWJsZSA9PSBcImZ1bmN0aW9uXCJcblx0XHRcdFx0cmV0dXJuIGFjdGlvbi52aXNpYmxlKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGFjdGlvbi52aXNpYmxlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdHJldHVybiBhY3Rpb25zXG5cbkNyZWF0b3IuZ2V0QWN0aW9ucyA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKS0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdGlmICFvYmplY3RfbmFtZVxuXHRcdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcblx0XHRpZiAhdXNlcklkXG5cdFx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblxuXHRvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblxuXHRpZiAhb2JqXG5cdFx0cmV0dXJuXG5cblx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdGRpc2FibGVkX2FjdGlvbnMgPSBwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zXG5cdGFjdGlvbnMgPSBfLnNvcnRCeShfLnZhbHVlcyhvYmouYWN0aW9ucykgLCAnc29ydCcpO1xuXG5cdGlmIF8uaGFzKG9iaiwgJ2FsbG93X2N1c3RvbUFjdGlvbnMnKVxuXHRcdGFjdGlvbnMgPSBfLmZpbHRlciBhY3Rpb25zLCAoYWN0aW9uKS0+XG5cdFx0XHRyZXR1cm4gXy5pbmNsdWRlKG9iai5hbGxvd19jdXN0b21BY3Rpb25zLCBhY3Rpb24ubmFtZSkgfHwgXy5pbmNsdWRlKF8ua2V5cyhDcmVhdG9yLmdldE9iamVjdCgnYmFzZScpLmFjdGlvbnMpIHx8IHt9LCBhY3Rpb24ubmFtZSlcblx0aWYgXy5oYXMob2JqLCAnZXhjbHVkZV9hY3Rpb25zJylcblx0XHRhY3Rpb25zID0gXy5maWx0ZXIgYWN0aW9ucywgKGFjdGlvbiktPlxuXHRcdFx0cmV0dXJuICFfLmluY2x1ZGUob2JqLmV4Y2x1ZGVfYWN0aW9ucywgYWN0aW9uLm5hbWUpXG5cblx0Xy5lYWNoIGFjdGlvbnMsIChhY3Rpb24pLT5cblx0XHQjIOaJi+acuuS4iuWPquaYvuekuue8lui+keaMiemSru+8jOWFtuS7lueahOaUvuWIsOaKmOWPoOS4i+aLieiPnOWNleS4rVxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSAmJiBbXCJyZWNvcmRcIiwgXCJyZWNvcmRfb25seVwiXS5pbmRleE9mKGFjdGlvbi5vbikgPiAtMSAmJiBhY3Rpb24ubmFtZSAhPSAnc3RhbmRhcmRfZWRpdCdcblx0XHRcdGlmIGFjdGlvbi5vbiA9PSBcInJlY29yZF9vbmx5XCJcblx0XHRcdFx0YWN0aW9uLm9uID0gJ3JlY29yZF9vbmx5X21vcmUnXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGFjdGlvbi5vbiA9ICdyZWNvcmRfbW9yZSdcblxuXHRpZiBTdGVlZG9zLmlzTW9iaWxlKCkgJiYgW1wiY21zX2ZpbGVzXCIsIFwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIl0uaW5kZXhPZihvYmplY3RfbmFtZSkgPiAtMVxuXHRcdCMg6ZmE5Lu254m55q6K5aSE55CG77yM5LiL6L295oyJ6ZKu5pS+5Zyo5Li76I+c5Y2V77yM57yW6L6R5oyJ6ZKu5pS+5Yiw5bqV5LiL5oqY5Y+g5LiL5ouJ6I+c5Y2V5LitXG5cdFx0YWN0aW9ucy5maW5kKChuKS0+IHJldHVybiBuLm5hbWUgPT0gXCJzdGFuZGFyZF9lZGl0XCIpPy5vbiA9IFwicmVjb3JkX21vcmVcIlxuXHRcdGFjdGlvbnMuZmluZCgobiktPiByZXR1cm4gbi5uYW1lID09IFwiZG93bmxvYWRcIik/Lm9uID0gXCJyZWNvcmRcIlxuXG5cdGFjdGlvbnMgPSBfLmZpbHRlciBhY3Rpb25zLCAoYWN0aW9uKS0+XG5cdFx0cmV0dXJuIF8uaW5kZXhPZihkaXNhYmxlZF9hY3Rpb25zLCBhY3Rpb24ubmFtZSkgPCAwXG5cblx0cmV0dXJuIGFjdGlvbnNcblxuLy8vXG5cdOi/lOWbnuW9k+WJjeeUqOaIt+acieadg+mZkOiuv+mXrueahOaJgOaciWxpc3Rfdmlld++8jOWMheaLrOWIhuS6q+eahO+8jOeUqOaIt+iHquWumuS5iemdnuWIhuS6q+eahO+8iOmZpOmdnm93bmVy5Y+Y5LqG77yJ77yM5Lul5Y+K6buY6K6k55qE5YW25LuW6KeG5Zu+XG5cdOazqOaEj0NyZWF0b3IuZ2V0UGVybWlzc2lvbnPlh73mlbDkuK3mmK/kuI3kvJrmnInnlKjmiLfoh6rlrprkuYnpnZ7liIbkuqvnmoTop4blm77nmoTvvIzmiYDku6VDcmVhdG9yLmdldFBlcm1pc3Npb25z5Ye95pWw5Lit5ou/5Yiw55qE57uT5p6c5LiN5YWo77yM5bm25LiN5piv5b2T5YmN55So5oi36IO955yL5Yiw5omA5pyJ6KeG5Zu+XG4vLy9cbkNyZWF0b3IuZ2V0TGlzdFZpZXdzID0gKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpLT5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgIW9iamVjdF9uYW1lXG5cdFx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRpZiAhc3BhY2VJZFxuXHRcdFx0c3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXHRcdGlmICF1c2VySWRcblx0XHRcdHVzZXJJZCA9IE1ldGVvci51c2VySWQoKVxuXHRcblx0dW5sZXNzIG9iamVjdF9uYW1lXG5cdFx0cmV0dXJuXG5cblx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cblx0aWYgIW9iamVjdFxuXHRcdHJldHVyblxuXG5cdGRpc2FibGVkX2xpc3Rfdmlld3MgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpPy5kaXNhYmxlZF9saXN0X3ZpZXdzIHx8IFtdXG5cblx0bGlzdF92aWV3cyA9IFtdXG5cblx0aXNNb2JpbGUgPSBTdGVlZG9zLmlzTW9iaWxlKClcblxuXHRfLmVhY2ggb2JqZWN0Lmxpc3Rfdmlld3MsIChpdGVtLCBpdGVtX25hbWUpLT5cblx0XHRpdGVtLm5hbWUgPSBpdGVtX25hbWVcblxuXHRsaXN0Vmlld3MgPSBfLnNvcnRCeShfLnZhbHVlcyhvYmplY3QubGlzdF92aWV3cykgLCAnc29ydF9ubycpO1xuXG5cdF8uZWFjaCBsaXN0Vmlld3MsIChpdGVtKS0+XG5cdFx0aWYgaXNNb2JpbGUgYW5kIGl0ZW0udHlwZSA9PSBcImNhbGVuZGFyXCJcblx0XHRcdCMg5omL5py65LiK5YWI5LiN5pi+56S65pel5Y6G6KeG5Zu+XG5cdFx0XHRyZXR1cm5cblx0XHRpZiBpdGVtLm5hbWUgICE9IFwiZGVmYXVsdFwiXG5cdFx0XHRpc0Rpc2FibGVkID0gXy5pbmRleE9mKGRpc2FibGVkX2xpc3Rfdmlld3MsIGl0ZW0ubmFtZSkgPiAtMSB8fCAoaXRlbS5faWQgJiYgXy5pbmRleE9mKGRpc2FibGVkX2xpc3Rfdmlld3MsIGl0ZW0uX2lkKSA+IC0xKVxuXHRcdFx0aWYgIWlzRGlzYWJsZWQgfHwgaXRlbS5vd25lciA9PSB1c2VySWRcblx0XHRcdFx0bGlzdF92aWV3cy5wdXNoIGl0ZW1cblx0cmV0dXJuIGxpc3Rfdmlld3NcblxuIyDliY3lj7DnkIborrrkuIrkuI3lupTor6XosIPnlKjor6Xlh73mlbDvvIzlm6DkuLrlrZfmrrXnmoTmnYPpmZDpg73lnKhDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSkuZmllbGRz55qE55u45YWz5bGe5oCn5Lit5pyJ5qCH6K+G5LqGXG5DcmVhdG9yLmdldEZpZWxkcyA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKS0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdGlmICFvYmplY3RfbmFtZVxuXHRcdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcblx0XHRpZiAhdXNlcklkXG5cdFx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblxuXHRmaWVsZHNOYW1lID0gQ3JlYXRvci5nZXRPYmplY3RGaWVsZHNOYW1lKG9iamVjdF9uYW1lKVxuXHR1bnJlYWRhYmxlX2ZpZWxkcyA9ICBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpPy51bnJlYWRhYmxlX2ZpZWxkc1xuXHRyZXR1cm4gXy5kaWZmZXJlbmNlKGZpZWxkc05hbWUsIHVucmVhZGFibGVfZmllbGRzKVxuXG5DcmVhdG9yLmlzbG9hZGluZyA9ICgpLT5cblx0cmV0dXJuICFDcmVhdG9yLmJvb3RzdHJhcExvYWRlZC5nZXQoKVxuXG5DcmVhdG9yLmNvbnZlcnRTcGVjaWFsQ2hhcmFjdGVyID0gKHN0ciktPlxuXHRyZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFxeXFwkXFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcfFxcW1xcXVxce1xcfV0pL2csIFwiXFxcXCQxXCIpXG5cbiMg6K6h566XZmllbGRz55u45YWz5Ye95pWwXG4jIFNUQVJUXG5DcmVhdG9yLmdldERpc2FibGVkRmllbGRzID0gKHNjaGVtYSktPlxuXHRmaWVsZHMgPSBfLm1hcChzY2hlbWEsIChmaWVsZCwgZmllbGROYW1lKSAtPlxuXHRcdHJldHVybiBmaWVsZC5hdXRvZm9ybSBhbmQgZmllbGQuYXV0b2Zvcm0uZGlzYWJsZWQgYW5kICFmaWVsZC5hdXRvZm9ybS5vbWl0IGFuZCBmaWVsZE5hbWVcblx0KVxuXHRmaWVsZHMgPSBfLmNvbXBhY3QoZmllbGRzKVxuXHRyZXR1cm4gZmllbGRzXG5cbkNyZWF0b3IuZ2V0SGlkZGVuRmllbGRzID0gKHNjaGVtYSktPlxuXHRmaWVsZHMgPSBfLm1hcChzY2hlbWEsIChmaWVsZCwgZmllbGROYW1lKSAtPlxuXHRcdHJldHVybiBmaWVsZC5hdXRvZm9ybSBhbmQgZmllbGQuYXV0b2Zvcm0udHlwZSA9PSBcImhpZGRlblwiIGFuZCAhZmllbGQuYXV0b2Zvcm0ub21pdCBhbmQgZmllbGROYW1lXG5cdClcblx0ZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcylcblx0cmV0dXJuIGZpZWxkc1xuXG5DcmVhdG9yLmdldEZpZWxkc1dpdGhOb0dyb3VwID0gKHNjaGVtYSktPlxuXHRmaWVsZHMgPSBfLm1hcChzY2hlbWEsIChmaWVsZCwgZmllbGROYW1lKSAtPlxuXHRcdHJldHVybiAoIWZpZWxkLmF1dG9mb3JtIG9yICFmaWVsZC5hdXRvZm9ybS5ncm91cCBvciBmaWVsZC5hdXRvZm9ybS5ncm91cCA9PSBcIi1cIikgYW5kICghZmllbGQuYXV0b2Zvcm0gb3IgZmllbGQuYXV0b2Zvcm0udHlwZSAhPSBcImhpZGRlblwiKSBhbmQgZmllbGROYW1lXG5cdClcblx0ZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcylcblx0cmV0dXJuIGZpZWxkc1xuXG5DcmVhdG9yLmdldFNvcnRlZEZpZWxkR3JvdXBOYW1lcyA9IChzY2hlbWEpLT5cblx0bmFtZXMgPSBfLm1hcChzY2hlbWEsIChmaWVsZCkgLT5cbiBcdFx0cmV0dXJuIGZpZWxkLmF1dG9mb3JtIGFuZCBmaWVsZC5hdXRvZm9ybS5ncm91cCAhPSBcIi1cIiBhbmQgZmllbGQuYXV0b2Zvcm0uZ3JvdXBcblx0KVxuXHRuYW1lcyA9IF8uY29tcGFjdChuYW1lcylcblx0bmFtZXMgPSBfLnVuaXF1ZShuYW1lcylcblx0cmV0dXJuIG5hbWVzXG5cbkNyZWF0b3IuZ2V0RmllbGRzRm9yR3JvdXAgPSAoc2NoZW1hLCBncm91cE5hbWUpIC0+XG4gIFx0ZmllbGRzID0gXy5tYXAoc2NoZW1hLCAoZmllbGQsIGZpZWxkTmFtZSkgLT5cbiAgICBcdHJldHVybiBmaWVsZC5hdXRvZm9ybSBhbmQgZmllbGQuYXV0b2Zvcm0uZ3JvdXAgPT0gZ3JvdXBOYW1lIGFuZCBmaWVsZC5hdXRvZm9ybS50eXBlICE9IFwiaGlkZGVuXCIgYW5kIGZpZWxkTmFtZVxuICBcdClcbiAgXHRmaWVsZHMgPSBfLmNvbXBhY3QoZmllbGRzKVxuICBcdHJldHVybiBmaWVsZHNcblxuQ3JlYXRvci5nZXRTeXN0ZW1CYXNlRmllbGRzID0gKCkgLT5cblx0cmV0dXJuIFtcImNyZWF0ZWRcIiwgXCJjcmVhdGVkX2J5XCIsIFwibW9kaWZpZWRcIiwgXCJtb2RpZmllZF9ieVwiXVxuXG5DcmVhdG9yLmdldEZpZWxkc1dpdGhvdXRTeXN0ZW1CYXNlID0gKGtleXMpIC0+XG5cdHJldHVybiBfLmRpZmZlcmVuY2Uoa2V5cywgQ3JlYXRvci5nZXRTeXN0ZW1CYXNlRmllbGRzKCkpO1xuXG5DcmVhdG9yLmdldEZpZWxkc1dpdGhvdXRPbWl0ID0gKHNjaGVtYSwga2V5cykgLT5cblx0a2V5cyA9IF8ubWFwKGtleXMsIChrZXkpIC0+XG5cdFx0ZmllbGQgPSBfLnBpY2soc2NoZW1hLCBrZXkpXG5cdFx0aWYgZmllbGRba2V5XS5hdXRvZm9ybT8ub21pdFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGtleVxuXHQpXG5cdGtleXMgPSBfLmNvbXBhY3Qoa2V5cylcblx0cmV0dXJuIGtleXNcblxuQ3JlYXRvci5nZXRGaWVsZHNJbkZpcnN0TGV2ZWwgPSAoZmlyc3RMZXZlbEtleXMsIGtleXMpIC0+XG5cdGtleXMgPSBfLm1hcChrZXlzLCAoa2V5KSAtPlxuXHRcdGlmIF8uaW5kZXhPZihmaXJzdExldmVsS2V5cywga2V5KSA+IC0xXG5cdFx0XHRyZXR1cm4ga2V5XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdClcblx0a2V5cyA9IF8uY29tcGFjdChrZXlzKVxuXHRyZXR1cm4ga2V5c1xuXG5DcmVhdG9yLmdldEZpZWxkc0ZvclJlb3JkZXIgPSAoc2NoZW1hLCBrZXlzLCBpc1NpbmdsZSkgLT5cblx0ZmllbGRzID0gW11cblx0aSA9IDBcblx0X2tleXMgPSBfLmZpbHRlcihrZXlzLCAoa2V5KS0+XG5cdFx0cmV0dXJuICFrZXkuZW5kc1dpdGgoJ19lbmRMaW5lJylcblx0KTtcblx0d2hpbGUgaSA8IF9rZXlzLmxlbmd0aFxuXHRcdHNjXzEgPSBfLnBpY2soc2NoZW1hLCBfa2V5c1tpXSlcblx0XHRzY18yID0gXy5waWNrKHNjaGVtYSwgX2tleXNbaSsxXSlcblxuXHRcdGlzX3dpZGVfMSA9IGZhbHNlXG5cdFx0aXNfd2lkZV8yID0gZmFsc2VcblxuI1x0XHRpc19yYW5nZV8xID0gZmFsc2VcbiNcdFx0aXNfcmFuZ2VfMiA9IGZhbHNlXG5cblx0XHRfLmVhY2ggc2NfMSwgKHZhbHVlKSAtPlxuXHRcdFx0aWYgdmFsdWUuYXV0b2Zvcm0/LmlzX3dpZGUgfHwgdmFsdWUuYXV0b2Zvcm0/LnR5cGUgPT0gXCJ0YWJsZVwiXG5cdFx0XHRcdGlzX3dpZGVfMSA9IHRydWVcblxuI1x0XHRcdGlmIHZhbHVlLmF1dG9mb3JtPy5pc19yYW5nZVxuI1x0XHRcdFx0aXNfcmFuZ2VfMSA9IHRydWVcblxuXHRcdF8uZWFjaCBzY18yLCAodmFsdWUpIC0+XG5cdFx0XHRpZiB2YWx1ZS5hdXRvZm9ybT8uaXNfd2lkZSB8fCB2YWx1ZS5hdXRvZm9ybT8udHlwZSA9PSBcInRhYmxlXCJcblx0XHRcdFx0aXNfd2lkZV8yID0gdHJ1ZVxuXG4jXHRcdFx0aWYgdmFsdWUuYXV0b2Zvcm0/LmlzX3JhbmdlXG4jXHRcdFx0XHRpc19yYW5nZV8yID0gdHJ1ZVxuXG5cdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRpc193aWRlXzEgPSB0cnVlXG5cdFx0XHRpc193aWRlXzIgPSB0cnVlXG5cblx0XHRpZiBpc1NpbmdsZVxuXHRcdFx0ZmllbGRzLnB1c2ggX2tleXMuc2xpY2UoaSwgaSsxKVxuXHRcdFx0aSArPSAxXG5cdFx0ZWxzZVxuI1x0XHRcdGlmICFpc19yYW5nZV8xICYmIGlzX3JhbmdlXzJcbiNcdFx0XHRcdGNoaWxkS2V5cyA9IF9rZXlzLnNsaWNlKGksIGkrMSlcbiNcdFx0XHRcdGNoaWxkS2V5cy5wdXNoIHVuZGVmaW5lZFxuI1x0XHRcdFx0ZmllbGRzLnB1c2ggY2hpbGRLZXlzXG4jXHRcdFx0XHRpICs9IDFcbiNcdFx0XHRlbHNlXG5cdFx0XHRpZiBpc193aWRlXzFcblx0XHRcdFx0ZmllbGRzLnB1c2ggX2tleXMuc2xpY2UoaSwgaSsxKVxuXHRcdFx0XHRpICs9IDFcblx0XHRcdGVsc2UgaWYgIWlzX3dpZGVfMSBhbmQgaXNfd2lkZV8yXG5cdFx0XHRcdGNoaWxkS2V5cyA9IF9rZXlzLnNsaWNlKGksIGkrMSlcblx0XHRcdFx0Y2hpbGRLZXlzLnB1c2ggdW5kZWZpbmVkXG5cdFx0XHRcdGZpZWxkcy5wdXNoIGNoaWxkS2V5c1xuXHRcdFx0XHRpICs9IDFcblx0XHRcdGVsc2UgaWYgIWlzX3dpZGVfMSBhbmQgIWlzX3dpZGVfMlxuXHRcdFx0XHRjaGlsZEtleXMgPSBfa2V5cy5zbGljZShpLCBpKzEpXG5cdFx0XHRcdGlmIF9rZXlzW2krMV1cblx0XHRcdFx0XHRjaGlsZEtleXMucHVzaCBfa2V5c1tpKzFdXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRjaGlsZEtleXMucHVzaCB1bmRlZmluZWRcblx0XHRcdFx0ZmllbGRzLnB1c2ggY2hpbGRLZXlzXG5cdFx0XHRcdGkgKz0gMlxuXG5cdHJldHVybiBmaWVsZHNcblxuQ3JlYXRvci5pc0ZpbHRlclZhbHVlRW1wdHkgPSAodikgLT5cblx0cmV0dXJuIHR5cGVvZiB2ID09IFwidW5kZWZpbmVkXCIgfHwgdiA9PSBudWxsIHx8IE51bWJlci5pc05hTih2KSB8fCB2Lmxlbmd0aCA9PSAwXG5cbkNyZWF0b3IuZ2V0RmllbGREYXRhVHlwZSA9IChvYmplY3RGaWVsZHMsIGtleSktPlxuXHRpZiBvYmplY3RGaWVsZHMgYW5kIGtleVxuXHRcdHJlc3VsdCA9IG9iamVjdEZpZWxkc1trZXldPy50eXBlXG5cdFx0aWYgW1wiZm9ybXVsYVwiLCBcInN1bW1hcnlcIl0uaW5kZXhPZihyZXN1bHQpID4gLTFcblx0XHRcdHJlc3VsdCA9IG9iamVjdEZpZWxkc1trZXldLmRhdGFfdHlwZVxuXHRcdCMgZWxzZSBpZiByZXN1bHQgPT0gXCJzZWxlY3RcIiBhbmQgb2JqZWN0RmllbGRzW2tleV0/LmRhdGFfdHlwZSBhbmQgb2JqZWN0RmllbGRzW2tleV0uZGF0YV90eXBlICE9IFwidGV4dFwiXG5cdFx0IyBcdHJlc3VsdCA9IG9iamVjdEZpZWxkc1trZXldLmRhdGFfdHlwZVxuXHRcdHJldHVybiByZXN1bHRcblx0ZWxzZVxuXHRcdHJldHVybiBcInRleHRcIlxuXG4jIEVORFxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0Q3JlYXRvci5nZXRBbGxSZWxhdGVkT2JqZWN0cyA9IChvYmplY3RfbmFtZSktPlxuXHRcdHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gW11cblx0XHRfLmVhY2ggQ3JlYXRvci5PYmplY3RzLCAocmVsYXRlZF9vYmplY3QsIHJlbGF0ZWRfb2JqZWN0X25hbWUpLT5cblx0XHRcdF8uZWFjaCByZWxhdGVkX29iamVjdC5maWVsZHMsIChyZWxhdGVkX2ZpZWxkLCByZWxhdGVkX2ZpZWxkX25hbWUpLT5cblx0XHRcdFx0aWYgcmVsYXRlZF9maWVsZC50eXBlID09IFwibWFzdGVyX2RldGFpbFwiIGFuZCByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byBhbmQgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gPT0gb2JqZWN0X25hbWVcblx0XHRcdFx0XHRyZWxhdGVkX29iamVjdF9uYW1lcy5wdXNoIHJlbGF0ZWRfb2JqZWN0X25hbWVcblxuXHRcdGlmIENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKS5lbmFibGVfZmlsZXNcblx0XHRcdHJlbGF0ZWRfb2JqZWN0X25hbWVzLnB1c2ggXCJjbXNfZmlsZXNcIlxuXG5cdFx0cmV0dXJuIHJlbGF0ZWRfb2JqZWN0X25hbWVzXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRTdGVlZG9zLmZvcm1hdEluZGV4ID0gKGFycmF5KSAtPlxuXHRcdG9iamVjdCA9IHtcbiAgICAgICAgXHRiYWNrZ3JvdW5kOiB0cnVlXG4gICAgXHR9O1xuXHRcdGlzZG9jdW1lbnREQiA9IE1ldGVvci5zZXR0aW5ncz8uZGF0YXNvdXJjZXM/LmRlZmF1bHQ/LmRvY3VtZW50REIgfHwgZmFsc2U7XG5cdFx0aWYgaXNkb2N1bWVudERCXG5cdFx0XHRpZiBhcnJheS5sZW5ndGggPiAwXG5cdFx0XHRcdGluZGV4TmFtZSA9IGFycmF5LmpvaW4oXCIuXCIpO1xuXHRcdFx0XHRvYmplY3QubmFtZSA9IGluZGV4TmFtZTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmIChpbmRleE5hbWUubGVuZ3RoID4gNTIpXG5cdFx0XHRcdFx0b2JqZWN0Lm5hbWUgPSBpbmRleE5hbWUuc3Vic3RyaW5nKDAsNTIpO1xuXG5cdFx0cmV0dXJuIG9iamVjdDsiLCJDcmVhdG9yLmdldFNjaGVtYSA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciByZWY7XG4gIHJldHVybiAocmVmID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpKSAhPSBudWxsID8gcmVmLnNjaGVtYSA6IHZvaWQgMDtcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0SG9tZUNvbXBvbmVudCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0VXJsID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSB7XG4gIHZhciBsaXN0X3ZpZXcsIGxpc3Rfdmlld19pZDtcbiAgaWYgKCFhcHBfaWQpIHtcbiAgICBhcHBfaWQgPSBTZXNzaW9uLmdldChcImFwcF9pZFwiKTtcbiAgfVxuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICB9XG4gIGxpc3RfdmlldyA9IENyZWF0b3IuZ2V0TGlzdFZpZXcob2JqZWN0X25hbWUsIG51bGwpO1xuICBsaXN0X3ZpZXdfaWQgPSBsaXN0X3ZpZXcgIT0gbnVsbCA/IGxpc3Rfdmlldy5faWQgOiB2b2lkIDA7XG4gIGlmIChyZWNvcmRfaWQpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvdmlldy9cIiArIHJlY29yZF9pZCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKENyZWF0b3IuZ2V0T2JqZWN0SG9tZUNvbXBvbmVudChvYmplY3RfbmFtZSkpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGlzdF92aWV3X2lkKSB7XG4gICAgICAgIHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuQ3JlYXRvci5nZXRPYmplY3RBYnNvbHV0ZVVybCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkge1xuICB2YXIgbGlzdF92aWV3LCBsaXN0X3ZpZXdfaWQ7XG4gIGlmICghYXBwX2lkKSB7XG4gICAgYXBwX2lkID0gU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIik7XG4gIH1cbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBsaXN0X3ZpZXcgPSBDcmVhdG9yLmdldExpc3RWaWV3KG9iamVjdF9uYW1lLCBudWxsKTtcbiAgbGlzdF92aWV3X2lkID0gbGlzdF92aWV3ICE9IG51bGwgPyBsaXN0X3ZpZXcuX2lkIDogdm9pZCAwO1xuICBpZiAocmVjb3JkX2lkKSB7XG4gICAgcmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL3ZpZXcvXCIgKyByZWNvcmRfaWQsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkLCB0cnVlKTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRPYmplY3RSb3V0ZXJVcmwgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpIHtcbiAgdmFyIGxpc3RfdmlldywgbGlzdF92aWV3X2lkO1xuICBpZiAoIWFwcF9pZCkge1xuICAgIGFwcF9pZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpO1xuICB9XG4gIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gIH1cbiAgbGlzdF92aWV3ID0gQ3JlYXRvci5nZXRMaXN0VmlldyhvYmplY3RfbmFtZSwgbnVsbCk7XG4gIGxpc3Rfdmlld19pZCA9IGxpc3RfdmlldyAhPSBudWxsID8gbGlzdF92aWV3Ll9pZCA6IHZvaWQgMDtcbiAgaWYgKHJlY29yZF9pZCkge1xuICAgIHJldHVybiBcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvdmlldy9cIiArIHJlY29yZF9pZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvYXBwL1wiICsgYXBwX2lkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL2dyaWQvXCIgKyBsaXN0X3ZpZXdfaWQ7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0TGlzdFZpZXdVcmwgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgYXBwX2lkLCBsaXN0X3ZpZXdfaWQpIHtcbiAgdmFyIHVybDtcbiAgdXJsID0gQ3JlYXRvci5nZXRMaXN0Vmlld1JlbGF0aXZlVXJsKG9iamVjdF9uYW1lLCBhcHBfaWQsIGxpc3Rfdmlld19pZCk7XG4gIHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKHVybCk7XG59O1xuXG5DcmVhdG9yLmdldExpc3RWaWV3UmVsYXRpdmVVcmwgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgYXBwX2lkLCBsaXN0X3ZpZXdfaWQpIHtcbiAgcmV0dXJuIFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkO1xufTtcblxuQ3JlYXRvci5nZXRTd2l0Y2hMaXN0VXJsID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGFwcF9pZCwgbGlzdF92aWV3X2lkKSB7XG4gIGlmIChsaXN0X3ZpZXdfaWQpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvXCIgKyBsaXN0X3ZpZXdfaWQgKyBcIi9saXN0XCIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9saXN0L3N3aXRjaFwiKTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0VXJsID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGFwcF9pZCwgcmVjb3JkX2lkLCByZWxhdGVkX29iamVjdF9uYW1lLCByZWxhdGVkX2ZpZWxkX25hbWUpIHtcbiAgaWYgKHJlbGF0ZWRfZmllbGRfbmFtZSkge1xuICAgIHJldHVybiBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiL2FwcC9cIiArIGFwcF9pZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9cIiArIHJlY29yZF9pZCArIFwiL1wiICsgcmVsYXRlZF9vYmplY3RfbmFtZSArIFwiL2dyaWQ/cmVsYXRlZF9maWVsZF9uYW1lPVwiICsgcmVsYXRlZF9maWVsZF9uYW1lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcIi9hcHAvXCIgKyBhcHBfaWQgKyBcIi9cIiArIG9iamVjdF9uYW1lICsgXCIvXCIgKyByZWNvcmRfaWQgKyBcIi9cIiArIHJlbGF0ZWRfb2JqZWN0X25hbWUgKyBcIi9ncmlkXCIpO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdExvb2t1cEZpZWxkT3B0aW9ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBpc19kZWVwLCBpc19za2lwX2hpZGUsIGlzX3JlbGF0ZWQpIHtcbiAgdmFyIF9vYmplY3QsIF9vcHRpb25zLCBmaWVsZHMsIGljb24sIHJlbGF0ZWRPYmplY3RzO1xuICBfb3B0aW9ucyA9IFtdO1xuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgcmV0dXJuIF9vcHRpb25zO1xuICB9XG4gIF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGZpZWxkcyA9IF9vYmplY3QgIT0gbnVsbCA/IF9vYmplY3QuZmllbGRzIDogdm9pZCAwO1xuICBpY29uID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5pY29uIDogdm9pZCAwO1xuICBfLmZvckVhY2goZmllbGRzLCBmdW5jdGlvbihmLCBrKSB7XG4gICAgaWYgKGlzX3NraXBfaGlkZSAmJiBmLmhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZi50eXBlID09PSBcInNlbGVjdFwiKSB7XG4gICAgICByZXR1cm4gX29wdGlvbnMucHVzaCh7XG4gICAgICAgIGxhYmVsOiBcIlwiICsgKGYubGFiZWwgfHwgayksXG4gICAgICAgIHZhbHVlOiBcIlwiICsgayxcbiAgICAgICAgaWNvbjogaWNvblxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IGYubGFiZWwgfHwgayxcbiAgICAgICAgdmFsdWU6IGssXG4gICAgICAgIGljb246IGljb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGlmIChpc19kZWVwKSB7XG4gICAgXy5mb3JFYWNoKGZpZWxkcywgZnVuY3Rpb24oZiwgaykge1xuICAgICAgdmFyIHJfb2JqZWN0O1xuICAgICAgaWYgKGlzX3NraXBfaGlkZSAmJiBmLmhpZGRlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoKGYudHlwZSA9PT0gXCJsb29rdXBcIiB8fCBmLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiKSAmJiBmLnJlZmVyZW5jZV90byAmJiBfLmlzU3RyaW5nKGYucmVmZXJlbmNlX3RvKSkge1xuICAgICAgICByX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KGYucmVmZXJlbmNlX3RvKTtcbiAgICAgICAgaWYgKHJfb2JqZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIF8uZm9yRWFjaChyX29iamVjdC5maWVsZHMsIGZ1bmN0aW9uKGYyLCBrMikge1xuICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogKGYubGFiZWwgfHwgaykgKyBcIj0+XCIgKyAoZjIubGFiZWwgfHwgazIpLFxuICAgICAgICAgICAgICB2YWx1ZTogayArIFwiLlwiICsgazIsXG4gICAgICAgICAgICAgIGljb246IHJfb2JqZWN0ICE9IG51bGwgPyByX29iamVjdC5pY29uIDogdm9pZCAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmIChpc19yZWxhdGVkKSB7XG4gICAgcmVsYXRlZE9iamVjdHMgPSBDcmVhdG9yLmdldFJlbGF0ZWRPYmplY3RzKG9iamVjdF9uYW1lKTtcbiAgICBfLmVhY2gocmVsYXRlZE9iamVjdHMsIChmdW5jdGlvbihfdGhpcykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKF9yZWxhdGVkT2JqZWN0KSB7XG4gICAgICAgIHZhciByZWxhdGVkT2JqZWN0LCByZWxhdGVkT3B0aW9ucztcbiAgICAgICAgcmVsYXRlZE9wdGlvbnMgPSBDcmVhdG9yLmdldE9iamVjdExvb2t1cEZpZWxkT3B0aW9ucyhfcmVsYXRlZE9iamVjdC5vYmplY3RfbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIHJlbGF0ZWRPYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChfcmVsYXRlZE9iamVjdC5vYmplY3RfbmFtZSk7XG4gICAgICAgIHJldHVybiBfLmVhY2gocmVsYXRlZE9wdGlvbnMsIGZ1bmN0aW9uKHJlbGF0ZWRPcHRpb24pIHtcbiAgICAgICAgICBpZiAoX3JlbGF0ZWRPYmplY3QuZm9yZWlnbl9rZXkgIT09IHJlbGF0ZWRPcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgbGFiZWw6IChyZWxhdGVkT2JqZWN0LmxhYmVsIHx8IHJlbGF0ZWRPYmplY3QubmFtZSkgKyBcIj0+XCIgKyByZWxhdGVkT3B0aW9uLmxhYmVsLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVsYXRlZE9iamVjdC5uYW1lICsgXCIuXCIgKyByZWxhdGVkT3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICBpY29uOiByZWxhdGVkT2JqZWN0ICE9IG51bGwgPyByZWxhdGVkT2JqZWN0Lmljb24gOiB2b2lkIDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pKHRoaXMpKTtcbiAgfVxuICByZXR1cm4gX29wdGlvbnM7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdEZpbHRlckZpZWxkT3B0aW9ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciBfb2JqZWN0LCBfb3B0aW9ucywgZmllbGRzLCBpY29uLCBwZXJtaXNzaW9uX2ZpZWxkcztcbiAgX29wdGlvbnMgPSBbXTtcbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIHJldHVybiBfb3B0aW9ucztcbiAgfVxuICBfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBmaWVsZHMgPSBfb2JqZWN0ICE9IG51bGwgPyBfb2JqZWN0LmZpZWxkcyA6IHZvaWQgMDtcbiAgcGVybWlzc2lvbl9maWVsZHMgPSBDcmVhdG9yLmdldEZpZWxkcyhvYmplY3RfbmFtZSk7XG4gIGljb24gPSBfb2JqZWN0ICE9IG51bGwgPyBfb2JqZWN0Lmljb24gOiB2b2lkIDA7XG4gIF8uZm9yRWFjaChmaWVsZHMsIGZ1bmN0aW9uKGYsIGspIHtcbiAgICBpZiAoIV8uaW5jbHVkZShbXCJncmlkXCIsIFwib2JqZWN0XCIsIFwiW09iamVjdF1cIiwgXCJbb2JqZWN0XVwiLCBcIk9iamVjdFwiLCBcImF2YXRhclwiLCBcImltYWdlXCIsIFwibWFya2Rvd25cIiwgXCJodG1sXCJdLCBmLnR5cGUpICYmICFmLmhpZGRlbikge1xuICAgICAgaWYgKCEvXFx3K1xcLi8udGVzdChrKSAmJiBfLmluZGV4T2YocGVybWlzc2lvbl9maWVsZHMsIGspID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiBmLmxhYmVsIHx8IGssXG4gICAgICAgICAgdmFsdWU6IGssXG4gICAgICAgICAgaWNvbjogaWNvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gX29wdGlvbnM7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdEZpZWxkT3B0aW9ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciBfb2JqZWN0LCBfb3B0aW9ucywgZmllbGRzLCBpY29uLCBwZXJtaXNzaW9uX2ZpZWxkcztcbiAgX29wdGlvbnMgPSBbXTtcbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIHJldHVybiBfb3B0aW9ucztcbiAgfVxuICBfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBmaWVsZHMgPSBfb2JqZWN0ICE9IG51bGwgPyBfb2JqZWN0LmZpZWxkcyA6IHZvaWQgMDtcbiAgcGVybWlzc2lvbl9maWVsZHMgPSBDcmVhdG9yLmdldEZpZWxkcyhvYmplY3RfbmFtZSk7XG4gIGljb24gPSBfb2JqZWN0ICE9IG51bGwgPyBfb2JqZWN0Lmljb24gOiB2b2lkIDA7XG4gIF8uZm9yRWFjaChmaWVsZHMsIGZ1bmN0aW9uKGYsIGspIHtcbiAgICBpZiAoIV8uaW5jbHVkZShbXCJncmlkXCIsIFwib2JqZWN0XCIsIFwiW09iamVjdF1cIiwgXCJbb2JqZWN0XVwiLCBcIk9iamVjdFwiLCBcIm1hcmtkb3duXCIsIFwiaHRtbFwiXSwgZi50eXBlKSkge1xuICAgICAgaWYgKCEvXFx3K1xcLi8udGVzdChrKSAmJiBfLmluZGV4T2YocGVybWlzc2lvbl9maWVsZHMsIGspID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiBmLmxhYmVsIHx8IGssXG4gICAgICAgICAgdmFsdWU6IGssXG4gICAgICAgICAgaWNvbjogaWNvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gX29wdGlvbnM7XG59O1xuXG5cbi8qXG5maWx0ZXJzOiDopoHovazmjaLnmoRmaWx0ZXJzXG5maWVsZHM6IOWvueixoeWtl+autVxuZmlsdGVyX2ZpZWxkczog6buY6K6k6L+H5ruk5a2X5q6177yM5pSv5oyB5a2X56ym5Liy5pWw57uE5ZKM5a+56LGh5pWw57uE5Lik56eN5qC85byP77yM5aaCOlsnZmlsZWRfbmFtZTEnLCdmaWxlZF9uYW1lMiddLFt7ZmllbGQ6J2ZpbGVkX25hbWUxJyxyZXF1aXJlZDp0cnVlfV1cbuWkhOeQhumAu+i+kTog5oqKZmlsdGVyc+S4reWtmOWcqOS6jmZpbHRlcl9maWVsZHPnmoTov4fmu6TmnaHku7blop7liqDmr4/pobnnmoRpc19kZWZhdWx044CBaXNfcmVxdWlyZWTlsZ7mgKfvvIzkuI3lrZjlnKjkuo5maWx0ZXJfZmllbGRz55qE6L+H5ruk5p2h5Lu25a+55bqU55qE56e76Zmk5q+P6aG555qE55u45YWz5bGe5oCnXG7ov5Tlm57nu5Pmnpw6IOWkhOeQhuWQjueahGZpbHRlcnNcbiAqL1xuXG5DcmVhdG9yLmdldEZpbHRlcnNXaXRoRmlsdGVyRmllbGRzID0gZnVuY3Rpb24oZmlsdGVycywgZmllbGRzLCBmaWx0ZXJfZmllbGRzKSB7XG4gIGlmICghZmlsdGVycykge1xuICAgIGZpbHRlcnMgPSBbXTtcbiAgfVxuICBpZiAoIWZpbHRlcl9maWVsZHMpIHtcbiAgICBmaWx0ZXJfZmllbGRzID0gW107XG4gIH1cbiAgaWYgKGZpbHRlcl9maWVsZHMgIT0gbnVsbCA/IGZpbHRlcl9maWVsZHMubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgZmlsdGVyX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG4pKSB7XG4gICAgICAgIG4gPSB7XG4gICAgICAgICAgZmllbGQ6IG4sXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZmllbGRzW24uZmllbGRdICYmICFfLmZpbmRXaGVyZShmaWx0ZXJzLCB7XG4gICAgICAgIGZpZWxkOiBuLmZpZWxkXG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm4gZmlsdGVycy5wdXNoKHtcbiAgICAgICAgICBmaWVsZDogbi5maWVsZCxcbiAgICAgICAgICBpc19kZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIGlzX3JlcXVpcmVkOiBuLnJlcXVpcmVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZpbHRlcnMuZm9yRWFjaChmdW5jdGlvbihmaWx0ZXJJdGVtKSB7XG4gICAgdmFyIG1hdGNoRmllbGQ7XG4gICAgbWF0Y2hGaWVsZCA9IGZpbHRlcl9maWVsZHMuZmluZChmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gbiA9PT0gZmlsdGVySXRlbS5maWVsZCB8fCBuLmZpZWxkID09PSBmaWx0ZXJJdGVtLmZpZWxkO1xuICAgIH0pO1xuICAgIGlmIChfLmlzU3RyaW5nKG1hdGNoRmllbGQpKSB7XG4gICAgICBtYXRjaEZpZWxkID0ge1xuICAgICAgICBmaWVsZDogbWF0Y2hGaWVsZCxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAobWF0Y2hGaWVsZCkge1xuICAgICAgZmlsdGVySXRlbS5pc19kZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmaWx0ZXJJdGVtLmlzX3JlcXVpcmVkID0gbWF0Y2hGaWVsZC5yZXF1aXJlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGZpbHRlckl0ZW0uaXNfZGVmYXVsdDtcbiAgICAgIHJldHVybiBkZWxldGUgZmlsdGVySXRlbS5pc19yZXF1aXJlZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmlsdGVycztcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgc2VsZWN0X2ZpZWxkcywgZXhwYW5kKSB7XG4gIHZhciBjb2xsZWN0aW9uLCBvYmosIHJlY29yZCwgcmVmLCByZWYxLCByZWYyO1xuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICB9XG4gIGlmICghcmVjb3JkX2lkKSB7XG4gICAgcmVjb3JkX2lkID0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIik7XG4gIH1cbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmIChvYmplY3RfbmFtZSA9PT0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKSAmJiByZWNvcmRfaWQgPT09IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpKSB7XG4gICAgICBpZiAoKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyByZWYucmVjb3JkIDogdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiAocmVmMSA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMiA9IHJlZjEucmVjb3JkKSAhPSBudWxsID8gcmVmMi5nZXQoKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIENyZWF0b3Iub2RhdGEuZ2V0KG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHNlbGVjdF9maWVsZHMsIGV4cGFuZCk7XG4gICAgfVxuICB9XG4gIG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgaWYgKG9iai5kYXRhYmFzZV9uYW1lID09PSBcIm1ldGVvclwiIHx8ICFvYmouZGF0YWJhc2VfbmFtZSkge1xuICAgIGNvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0X25hbWUpO1xuICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICByZWNvcmQgPSBjb2xsZWN0aW9uLmZpbmRPbmUocmVjb3JkX2lkKTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iamVjdF9uYW1lICYmIHJlY29yZF9pZCkge1xuICAgIHJldHVybiBDcmVhdG9yLm9kYXRhLmdldChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzZWxlY3RfZmllbGRzLCBleHBhbmQpO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdFJlY29yZE5hbWUgPSBmdW5jdGlvbihyZWNvcmQsIG9iamVjdF9uYW1lKSB7XG4gIHZhciBuYW1lX2ZpZWxkX2tleSwgcmVmO1xuICBpZiAoIXJlY29yZCkge1xuICAgIHJlY29yZCA9IENyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkKCk7XG4gIH1cbiAgaWYgKHJlY29yZCkge1xuICAgIG5hbWVfZmllbGRfa2V5ID0gb2JqZWN0X25hbWUgPT09IFwib3JnYW5pemF0aW9uc1wiID8gXCJuYW1lXCIgOiAocmVmID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpKSAhPSBudWxsID8gcmVmLk5BTUVfRklFTERfS0VZIDogdm9pZCAwO1xuICAgIGlmIChyZWNvcmQgJiYgbmFtZV9maWVsZF9rZXkpIHtcbiAgICAgIHJldHVybiByZWNvcmQubGFiZWwgfHwgcmVjb3JkW25hbWVfZmllbGRfa2V5XTtcbiAgICB9XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0QXBwID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gIHZhciBhcHBNZW51cywgY3VycmVudEFwcDtcbiAgYXBwTWVudXMgPSBTZXNzaW9uLmdldChcIl9hcHBfbWVudXNcIikgfHwgU2Vzc2lvbi5nZXQoXCJhcHBfbWVudXNcIik7XG4gIGlmICghYXBwTWVudXMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY3VycmVudEFwcCA9IGFwcE1lbnVzLmZpbmQoZnVuY3Rpb24obWVudUl0ZW0pIHtcbiAgICByZXR1cm4gbWVudUl0ZW0uaWQgPT09IGFwcF9pZDtcbiAgfSk7XG4gIHJldHVybiBjdXJyZW50QXBwO1xufTtcblxuQ3JlYXRvci5nZXRBcHBEYXNoYm9hcmQgPSBmdW5jdGlvbihhcHBfaWQpIHtcbiAgdmFyIGFwcCwgZGFzaGJvYXJkO1xuICBhcHAgPSBDcmVhdG9yLmdldEFwcChhcHBfaWQpO1xuICBpZiAoIWFwcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBkYXNoYm9hcmQgPSBudWxsO1xuICBfLmVhY2goQ3JlYXRvci5EYXNoYm9hcmRzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoKChyZWYgPSB2LmFwcHMpICE9IG51bGwgPyByZWYuaW5kZXhPZihhcHAuX2lkKSA6IHZvaWQgMCkgPiAtMSkge1xuICAgICAgcmV0dXJuIGRhc2hib2FyZCA9IHY7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRhc2hib2FyZDtcbn07XG5cbkNyZWF0b3IuZ2V0QXBwRGFzaGJvYXJkQ29tcG9uZW50ID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gIHZhciBhcHA7XG4gIGFwcCA9IENyZWF0b3IuZ2V0QXBwKGFwcF9pZCk7XG4gIGlmICghYXBwIHx8IHRydWUpIHtcblxuICB9XG59O1xuXG5DcmVhdG9yLmdldEFwcE9iamVjdE5hbWVzID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gIHZhciBhcHAsIGFwcE9iamVjdHMsIGlzTW9iaWxlLCBvYmplY3RzO1xuICBhcHAgPSBDcmVhdG9yLmdldEFwcChhcHBfaWQpO1xuICBpZiAoIWFwcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc01vYmlsZSA9IFN0ZWVkb3MuaXNNb2JpbGUoKTtcbiAgYXBwT2JqZWN0cyA9IGlzTW9iaWxlID8gYXBwLm1vYmlsZV9vYmplY3RzIDogYXBwLm9iamVjdHM7XG4gIG9iamVjdHMgPSBbXTtcbiAgaWYgKGFwcCkge1xuICAgIF8uZWFjaChhcHBPYmplY3RzLCBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgb2JqO1xuICAgICAgb2JqID0gQ3JlYXRvci5nZXRPYmplY3Qodik7XG4gICAgICBpZiAob2JqICE9IG51bGwgPyBvYmoucGVybWlzc2lvbnMuZ2V0KCkuYWxsb3dSZWFkIDogdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RzLnB1c2godik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHM7XG59O1xuXG5DcmVhdG9yLmdldFVybFdpdGhUb2tlbiA9IGZ1bmN0aW9uKHVybCwgZXhwcmVzc2lvbkZvcm1EYXRhKSB7XG4gIHZhciBoYXNRdWVyeVN5bWJvbCwgbGlua1N0ciwgcGFyYW1zO1xuICBwYXJhbXMgPSB7fTtcbiAgcGFyYW1zW1wiWC1TcGFjZS1JZFwiXSA9IFN0ZWVkb3Muc3BhY2VJZCgpO1xuICBwYXJhbXNbXCJYLVVzZXItSWRcIl0gPSBTdGVlZG9zLnVzZXJJZCgpO1xuICBwYXJhbXNbXCJYLUNvbXBhbnktSWRzXCJdID0gU3RlZWRvcy5nZXRVc2VyQ29tcGFueUlkcygpO1xuICBwYXJhbXNbXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuICBpZiAoU3RlZWRvcy5pc0V4cHJlc3Npb24odXJsKSkge1xuICAgIHVybCA9IFN0ZWVkb3MucGFyc2VTaW5nbGVFeHByZXNzaW9uKHVybCwgZXhwcmVzc2lvbkZvcm1EYXRhLCBcIiNcIiwgQ3JlYXRvci5VU0VSX0NPTlRFWFQpO1xuICB9XG4gIGhhc1F1ZXJ5U3ltYm9sID0gLyhcXCMuK1xcPyl8KFxcP1teI10qJCkvZy50ZXN0KHVybCk7XG4gIGxpbmtTdHIgPSBoYXNRdWVyeVN5bWJvbCA/IFwiJlwiIDogXCI/XCI7XG4gIHJldHVybiBcIlwiICsgdXJsICsgbGlua1N0ciArICgkLnBhcmFtKHBhcmFtcykpO1xufTtcblxuQ3JlYXRvci5nZXRBcHBNZW51ID0gZnVuY3Rpb24oYXBwX2lkLCBtZW51X2lkKSB7XG4gIHZhciBtZW51cztcbiAgbWVudXMgPSBDcmVhdG9yLmdldEFwcE1lbnVzKGFwcF9pZCk7XG4gIHJldHVybiBtZW51cyAmJiBtZW51cy5maW5kKGZ1bmN0aW9uKG1lbnUpIHtcbiAgICByZXR1cm4gbWVudS5pZCA9PT0gbWVudV9pZDtcbiAgfSk7XG59O1xuXG5DcmVhdG9yLmdldEFwcE1lbnVVcmxGb3JJbnRlcm5ldCA9IGZ1bmN0aW9uKG1lbnUpIHtcbiAgcmV0dXJuIENyZWF0b3IuZ2V0VXJsV2l0aFRva2VuKG1lbnUucGF0aCwgbWVudSk7XG59O1xuXG5DcmVhdG9yLmdldEFwcE1lbnVVcmwgPSBmdW5jdGlvbihtZW51KSB7XG4gIHZhciB1cmw7XG4gIHVybCA9IG1lbnUucGF0aDtcbiAgaWYgKG1lbnUudHlwZSA9PT0gXCJ1cmxcIikge1xuICAgIGlmIChtZW51LnRhcmdldCkge1xuICAgICAgcmV0dXJuIENyZWF0b3IuZ2V0QXBwTWVudVVybEZvckludGVybmV0KG1lbnUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCIvYXBwLy0vdGFiX2lmcmFtZS9cIiArIG1lbnUuaWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBtZW51LnBhdGg7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0QXBwTWVudXMgPSBmdW5jdGlvbihhcHBfaWQpIHtcbiAgdmFyIGFwcE1lbnVzLCBjdXJlbnRBcHBNZW51cztcbiAgYXBwTWVudXMgPSBTZXNzaW9uLmdldChcIl9hcHBfbWVudXNcIikgfHwgU2Vzc2lvbi5nZXQoXCJhcHBfbWVudXNcIik7XG4gIGlmICghYXBwTWVudXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY3VyZW50QXBwTWVudXMgPSBhcHBNZW51cy5maW5kKGZ1bmN0aW9uKG1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIG1lbnVJdGVtLmlkID09PSBhcHBfaWQ7XG4gIH0pO1xuICBpZiAoY3VyZW50QXBwTWVudXMpIHtcbiAgICByZXR1cm4gY3VyZW50QXBwTWVudXMuY2hpbGRyZW47XG4gIH1cbn07XG5cbkNyZWF0b3IubG9hZEFwcHNNZW51cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZGF0YSwgaXNNb2JpbGUsIG9wdGlvbnM7XG4gIGlzTW9iaWxlID0gU3RlZWRvcy5pc01vYmlsZSgpO1xuICBkYXRhID0ge307XG4gIGlmIChpc01vYmlsZSkge1xuICAgIGRhdGEubW9iaWxlID0gaXNNb2JpbGU7XG4gIH1cbiAgb3B0aW9ucyA9IHtcbiAgICB0eXBlOiAnZ2V0JyxcbiAgICBkYXRhOiBkYXRhLFxuICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHJldHVybiBTZXNzaW9uLnNldChcImFwcF9tZW51c1wiLCBkYXRhKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0eXBlb2YgU3RlZWRvcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTdGVlZG9zICE9PSBudWxsID8gU3RlZWRvcy5hdXRoUmVxdWVzdChcIi9zZXJ2aWNlL2FwaS9hcHBzL21lbnVzXCIsIG9wdGlvbnMpIDogdm9pZCAwO1xufTtcblxuQ3JlYXRvci5jcmVhdG9yQXBwc1NlbGVjdG9yID0gZnVuY3Rpb24oYXBwcywgYXNzaWduZWRfYXBwcykge1xuICB2YXIgYWRtaW5BcHAsIGNyZWF0b3JBcHBzLCBzb3J0ZWRBcHBzO1xuICBhZG1pbkFwcCA9IHZvaWQgMDtcbiAgc29ydGVkQXBwcyA9IHZvaWQgMDtcbiAgXy5lYWNoKGFwcHMsIGZ1bmN0aW9uKGFwcCwga2V5KSB7XG4gICAgaWYgKCFhcHAuX2lkKSB7XG4gICAgICBhcHAuX2lkID0ga2V5O1xuICAgIH1cbiAgICBpZiAoYXBwLmlzX2NyZWF0b3IpIHtcblxuICAgIH0gZWxzZSB7XG4gICAgICBhcHAudmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG4gIHNvcnRlZEFwcHMgPSBfLnNvcnRCeShfLnZhbHVlcyhhcHBzKSwgJ3NvcnQnKTtcbiAgY3JlYXRvckFwcHMgPSB7fTtcbiAgYWRtaW5BcHAgPSB7fTtcbiAgXy5lYWNoKHNvcnRlZEFwcHMsIGZ1bmN0aW9uKG4pIHtcbiAgICBpZiAobi5faWQgPT09ICdhZG1pbicpIHtcbiAgICAgIHJldHVybiBhZG1pbkFwcCA9IG47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjcmVhdG9yQXBwc1tuLl9pZF0gPSBuO1xuICAgIH1cbiAgfSk7XG4gIGNyZWF0b3JBcHBzLmFkbWluID0gYWRtaW5BcHA7XG4gIGlmIChhc3NpZ25lZF9hcHBzLmxlbmd0aCkge1xuICAgIF8uZWFjaChjcmVhdG9yQXBwcywgZnVuY3Rpb24oYXBwLCBrZXkpIHtcbiAgICAgIGlmIChhc3NpZ25lZF9hcHBzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgIGFwcC52aXNpYmxlID0gYXBwLmlzX2NyZWF0b3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHAudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBjcmVhdG9yQXBwcztcbn07XG5cbkNyZWF0b3IudmlzaWJsZUFwcHNTZWxlY3RvciA9IGZ1bmN0aW9uKGNyZWF0b3JBcHBzLCBpbmNsdWRlQWRtaW4pIHtcbiAgdmFyIGFwcHM7XG4gIGlmIChpbmNsdWRlQWRtaW4gPT0gbnVsbCkge1xuICAgIGluY2x1ZGVBZG1pbiA9IHRydWU7XG4gIH1cbiAgYXBwcyA9IFtdO1xuICBfLmVhY2goY3JlYXRvckFwcHMsIGZ1bmN0aW9uKHYsIGspIHtcbiAgICBpZiAodi52aXNpYmxlICE9PSBmYWxzZSAmJiB2Ll9pZCAhPT0gJ2FkbWluJyB8fCBpbmNsdWRlQWRtaW4gJiYgdi5faWQgPT09ICdhZG1pbicpIHtcbiAgICAgIGFwcHMucHVzaCh2KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYXBwcztcbn07XG5cbkNyZWF0b3IuZ2V0VmlzaWJsZUFwcHMgPSBmdW5jdGlvbihpbmNsdWRlQWRtaW4pIHtcbiAgdmFyIGNoYW5nZUFwcCwgY3JlYXRvckFwcHM7XG4gIGNoYW5nZUFwcCA9IENyZWF0b3IuX3N1YkFwcC5nZXQoKTtcbiAgY3JlYXRvckFwcHMgPSBPYmplY3QuYXNzaWduKHt9LCBDcmVhdG9yLkFwcHMsIHtcbiAgICBhcHBzOiBjaGFuZ2VBcHBcbiAgfSk7XG4gIHJldHVybiBDcmVhdG9yLnZpc2libGVBcHBzU2VsZWN0b3IoY3JlYXRvckFwcHMsIGluY2x1ZGVBZG1pbik7XG59O1xuXG5DcmVhdG9yLmdldFZpc2libGVBcHBzT2JqZWN0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXBwcywgb2JqZWN0cywgdmlzaWJsZU9iamVjdE5hbWVzO1xuICBhcHBzID0gQ3JlYXRvci5nZXRWaXNpYmxlQXBwcygpO1xuICB2aXNpYmxlT2JqZWN0TmFtZXMgPSBfLmZsYXR0ZW4oXy5wbHVjayhhcHBzLCAnb2JqZWN0cycpKTtcbiAgb2JqZWN0cyA9IF8uZmlsdGVyKENyZWF0b3IuT2JqZWN0cywgZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKHZpc2libGVPYmplY3ROYW1lcy5pbmRleE9mKG9iai5uYW1lKSA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbiAgb2JqZWN0cyA9IG9iamVjdHMuc29ydChDcmVhdG9yLnNvcnRpbmdNZXRob2QuYmluZCh7XG4gICAga2V5OiBcImxhYmVsXCJcbiAgfSkpO1xuICBvYmplY3RzID0gXy5wbHVjayhvYmplY3RzLCAnbmFtZScpO1xuICByZXR1cm4gXy51bmlxKG9iamVjdHMpO1xufTtcblxuQ3JlYXRvci5nZXRBcHBzT2JqZWN0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgb2JqZWN0cywgdGVtcE9iamVjdHM7XG4gIG9iamVjdHMgPSBbXTtcbiAgdGVtcE9iamVjdHMgPSBbXTtcbiAgXy5mb3JFYWNoKENyZWF0b3IuQXBwcywgZnVuY3Rpb24oYXBwKSB7XG4gICAgdGVtcE9iamVjdHMgPSBfLmZpbHRlcihhcHAub2JqZWN0cywgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gIW9iai5oaWRkZW47XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iamVjdHMgPSBvYmplY3RzLmNvbmNhdCh0ZW1wT2JqZWN0cyk7XG4gIH0pO1xuICByZXR1cm4gXy51bmlxKG9iamVjdHMpO1xufTtcblxuQ3JlYXRvci52YWxpZGF0ZUZpbHRlcnMgPSBmdW5jdGlvbihmaWx0ZXJzLCBsb2dpYykge1xuICB2YXIgZSwgZXJyb3JNc2csIGZpbHRlcl9pdGVtcywgZmlsdGVyX2xlbmd0aCwgZmxhZywgaW5kZXgsIHdvcmQ7XG4gIGZpbHRlcl9pdGVtcyA9IF8ubWFwKGZpbHRlcnMsIGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChfLmlzRW1wdHkob2JqKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfSk7XG4gIGZpbHRlcl9pdGVtcyA9IF8uY29tcGFjdChmaWx0ZXJfaXRlbXMpO1xuICBlcnJvck1zZyA9IFwiXCI7XG4gIGZpbHRlcl9sZW5ndGggPSBmaWx0ZXJfaXRlbXMubGVuZ3RoO1xuICBpZiAobG9naWMpIHtcbiAgICBsb2dpYyA9IGxvZ2ljLnJlcGxhY2UoL1xcbi9nLCBcIlwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcbiAgICBpZiAoL1suX1xcLSErXSsvaWcudGVzdChsb2dpYykpIHtcbiAgICAgIGVycm9yTXNnID0gXCLlkKvmnInnibnmrorlrZfnrKbjgIJcIjtcbiAgICB9XG4gICAgaWYgKCFlcnJvck1zZykge1xuICAgICAgaW5kZXggPSBsb2dpYy5tYXRjaCgvXFxkKy9pZyk7XG4gICAgICBpZiAoIWluZGV4KSB7XG4gICAgICAgIGVycm9yTXNnID0gXCLmnInkupvnrZvpgInmnaHku7bov5vooYzkuoblrprkuYnvvIzkvYbmnKrlnKjpq5jnuqfnrZvpgInmnaHku7bkuK3ooqvlvJXnlKjjgIJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4LmZvckVhY2goZnVuY3Rpb24oaSkge1xuICAgICAgICAgIGlmIChpIDwgMSB8fCBpID4gZmlsdGVyX2xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yTXNnID0gXCLmgqjnmoTnrZvpgInmnaHku7blvJXnlKjkuobmnKrlrprkuYnnmoTnrZvpgInlmajvvJpcIiArIGkgKyBcIuOAglwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZsYWcgPSAxO1xuICAgICAgICB3aGlsZSAoZmxhZyA8PSBmaWx0ZXJfbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCFpbmRleC5pbmNsdWRlcyhcIlwiICsgZmxhZykpIHtcbiAgICAgICAgICAgIGVycm9yTXNnID0gXCLmnInkupvnrZvpgInmnaHku7bov5vooYzkuoblrprkuYnvvIzkvYbmnKrlnKjpq5jnuqfnrZvpgInmnaHku7bkuK3ooqvlvJXnlKjjgIJcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxhZysrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZXJyb3JNc2cpIHtcbiAgICAgIHdvcmQgPSBsb2dpYy5tYXRjaCgvW2EtekEtWl0rL2lnKTtcbiAgICAgIGlmICh3b3JkKSB7XG4gICAgICAgIHdvcmQuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICAgICAgaWYgKCEvXihhbmR8b3IpJC9pZy50ZXN0KHcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JNc2cgPSBcIuajgOafpeaCqOeahOmrmOe6p+etm+mAieadoeS7tuS4reeahOaLvOWGmeOAglwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZXJyb3JNc2cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIENyZWF0b3JbXCJldmFsXCJdKGxvZ2ljLnJlcGxhY2UoL2FuZC9pZywgXCImJlwiKS5yZXBsYWNlKC9vci9pZywgXCJ8fFwiKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGVycm9yTXNnID0gXCLmgqjnmoTnrZvpgInlmajkuK3lkKvmnInnibnmrorlrZfnrKZcIjtcbiAgICAgIH1cbiAgICAgIGlmICgvKEFORClbXigpXSsoT1IpL2lnLnRlc3QobG9naWMpIHx8IC8oT1IpW14oKV0rKEFORCkvaWcudGVzdChsb2dpYykpIHtcbiAgICAgICAgZXJyb3JNc2cgPSBcIuaCqOeahOetm+mAieWZqOW/hemhu+WcqOi/nue7reaAp+eahCBBTkQg5ZKMIE9SIOihqOi+vuW8j+WJjeWQjuS9v+eUqOaLrOWPt+OAglwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZXJyb3JNc2cpIHtcbiAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yTXNnKTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICB0b2FzdHIuZXJyb3IoZXJyb3JNc2cpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cblxuLypcbm9wdGlvbnPlj4LmlbDvvJpcblx0ZXh0ZW5kLS0g5piv5ZCm6ZyA6KaB5oqK5b2T5YmN55So5oi35Z+65pys5L+h5oGv5Yqg5YWl5YWs5byP77yM5Y2z6K6p5YWs5byP5pSv5oyBQ3JlYXRvci5VU0VSX0NPTlRFWFTkuK3nmoTlgLzvvIzpu5jorqTkuLp0cnVlXG5cdHVzZXJJZC0tIOW9k+WJjeeZu+W9leeUqOaIt1xuXHRzcGFjZUlkLS0g5b2T5YmN5omA5Zyo5bel5L2c5Yy6XG5leHRlbmTkuLp0cnVl5pe277yM5ZCO56uv6ZyA6KaB6aKd5aSW5Lyg5YWldXNlcklk5Y+Kc3BhY2VJZOeUqOS6juaKk+WPlkNyZWF0b3IuVVNFUl9DT05URVhU5a+55bqU55qE5YC8XG4gKi9cblxuQ3JlYXRvci5mb3JtYXRGaWx0ZXJzVG9Nb25nbyA9IGZ1bmN0aW9uKGZpbHRlcnMsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGVjdG9yO1xuICBpZiAoIShmaWx0ZXJzICE9IG51bGwgPyBmaWx0ZXJzLmxlbmd0aCA6IHZvaWQgMCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCEoZmlsdGVyc1swXSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgIGZpbHRlcnMgPSBfLm1hcChmaWx0ZXJzLCBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBbb2JqLmZpZWxkLCBvYmoub3BlcmF0aW9uLCBvYmoudmFsdWVdO1xuICAgIH0pO1xuICB9XG4gIHNlbGVjdG9yID0gW107XG4gIF8uZWFjaChmaWx0ZXJzLCBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICB2YXIgZmllbGQsIG9wdGlvbiwgcmVnLCBzdWJfc2VsZWN0b3IsIHZhbHVlO1xuICAgIGZpZWxkID0gZmlsdGVyWzBdO1xuICAgIG9wdGlvbiA9IGZpbHRlclsxXTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICB2YWx1ZSA9IENyZWF0b3IuZXZhbHVhdGVGb3JtdWxhKGZpbHRlclsyXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoZmlsdGVyWzJdLCBudWxsLCBvcHRpb25zKTtcbiAgICB9XG4gICAgc3ViX3NlbGVjdG9yID0ge307XG4gICAgc3ViX3NlbGVjdG9yW2ZpZWxkXSA9IHt9O1xuICAgIGlmIChvcHRpb24gPT09IFwiPVwiKSB7XG4gICAgICBzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGVxXCJdID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb24gPT09IFwiPD5cIikge1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRuZVwiXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSBcIj5cIikge1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRndFwiXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSBcIj49XCIpIHtcbiAgICAgIHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkZ3RlXCJdID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb24gPT09IFwiPFwiKSB7XG4gICAgICBzdWJfc2VsZWN0b3JbZmllbGRdW1wiJGx0XCJdID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb24gPT09IFwiPD1cIikge1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRsdGVcIl0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbiA9PT0gXCJzdGFydHN3aXRoXCIpIHtcbiAgICAgIHJlZyA9IG5ldyBSZWdFeHAoXCJeXCIgKyB2YWx1ZSwgXCJpXCIpO1xuICAgICAgc3ViX3NlbGVjdG9yW2ZpZWxkXVtcIiRyZWdleFwiXSA9IHJlZztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbiA9PT0gXCJjb250YWluc1wiKSB7XG4gICAgICByZWcgPSBuZXcgUmVnRXhwKHZhbHVlLCBcImlcIik7XG4gICAgICBzdWJfc2VsZWN0b3JbZmllbGRdW1wiJHJlZ2V4XCJdID0gcmVnO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uID09PSBcIm5vdGNvbnRhaW5zXCIpIHtcbiAgICAgIHJlZyA9IG5ldyBSZWdFeHAoXCJeKCg/IVwiICsgdmFsdWUgKyBcIikuKSokXCIsIFwiaVwiKTtcbiAgICAgIHN1Yl9zZWxlY3RvcltmaWVsZF1bXCIkcmVnZXhcIl0gPSByZWc7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rvci5wdXNoKHN1Yl9zZWxlY3Rvcik7XG4gIH0pO1xuICByZXR1cm4gc2VsZWN0b3I7XG59O1xuXG5DcmVhdG9yLmlzQmV0d2VlbkZpbHRlck9wZXJhdGlvbiA9IGZ1bmN0aW9uKG9wZXJhdGlvbikge1xuICB2YXIgcmVmO1xuICByZXR1cm4gb3BlcmF0aW9uID09PSBcImJldHdlZW5cIiB8fCAhISgocmVmID0gQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXModHJ1ZSkpICE9IG51bGwgPyByZWZbb3BlcmF0aW9uXSA6IHZvaWQgMCk7XG59O1xuXG5cbi8qXG5vcHRpb25z5Y+C5pWw77yaXG5cdGV4dGVuZC0tIOaYr+WQpumcgOimgeaKiuW9k+WJjeeUqOaIt+WfuuacrOS/oeaBr+WKoOWFpeWFrOW8j++8jOWNs+iuqeWFrOW8j+aUr+aMgUNyZWF0b3IuVVNFUl9DT05URVhU5Lit55qE5YC877yM6buY6K6k5Li6dHJ1ZVxuXHR1c2VySWQtLSDlvZPliY3nmbvlvZXnlKjmiLdcblx0c3BhY2VJZC0tIOW9k+WJjeaJgOWcqOW3peS9nOWMulxuXHRleHRlbmTkuLp0cnVl5pe277yM5ZCO56uv6ZyA6KaB6aKd5aSW5Lyg5YWldXNlcklk5Y+Kc3BhY2VJZOeUqOS6juaKk+WPlkNyZWF0b3IuVVNFUl9DT05URVhU5a+55bqU55qE5YC8XG4gKi9cblxuQ3JlYXRvci5mb3JtYXRGaWx0ZXJzVG9EZXYgPSBmdW5jdGlvbihmaWx0ZXJzLCBvYmplY3RfbmFtZSwgb3B0aW9ucykge1xuICB2YXIgbG9naWNUZW1wRmlsdGVycywgc2VsZWN0b3I7XG4gIGlmICghZmlsdGVycy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuaXNfbG9naWNfb3IgOiB2b2lkIDApIHtcbiAgICBsb2dpY1RlbXBGaWx0ZXJzID0gW107XG4gICAgZmlsdGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pIHtcbiAgICAgIGxvZ2ljVGVtcEZpbHRlcnMucHVzaChuKTtcbiAgICAgIHJldHVybiBsb2dpY1RlbXBGaWx0ZXJzLnB1c2goXCJvclwiKTtcbiAgICB9KTtcbiAgICBsb2dpY1RlbXBGaWx0ZXJzLnBvcCgpO1xuICAgIGZpbHRlcnMgPSBsb2dpY1RlbXBGaWx0ZXJzO1xuICB9XG4gIHNlbGVjdG9yID0gU3RlZWRvc0ZpbHRlcnMuZm9ybWF0RmlsdGVyc1RvRGV2KGZpbHRlcnMsIENyZWF0b3IuVVNFUl9DT05URVhUKTtcbiAgcmV0dXJuIHNlbGVjdG9yO1xufTtcblxuXG4vKlxub3B0aW9uc+WPguaVsO+8mlxuXHRleHRlbmQtLSDmmK/lkKbpnIDopoHmiorlvZPliY3nlKjmiLfln7rmnKzkv6Hmga/liqDlhaXlhazlvI/vvIzljbPorqnlhazlvI/mlK/mjIFDcmVhdG9yLlVTRVJfQ09OVEVYVOS4reeahOWAvO+8jOm7mOiupOS4unRydWVcblx0dXNlcklkLS0g5b2T5YmN55m75b2V55So5oi3XG5cdHNwYWNlSWQtLSDlvZPliY3miYDlnKjlt6XkvZzljLpcbmV4dGVuZOS4unRydWXml7bvvIzlkI7nq6/pnIDopoHpop3lpJbkvKDlhaV1c2VySWTlj4pzcGFjZUlk55So5LqO5oqT5Y+WQ3JlYXRvci5VU0VSX0NPTlRFWFTlr7nlupTnmoTlgLxcbiAqL1xuXG5DcmVhdG9yLmZvcm1hdExvZ2ljRmlsdGVyc1RvRGV2ID0gZnVuY3Rpb24oZmlsdGVycywgZmlsdGVyX2xvZ2ljLCBvcHRpb25zKSB7XG4gIHZhciBmb3JtYXRfbG9naWM7XG4gIGZvcm1hdF9sb2dpYyA9IGZpbHRlcl9sb2dpYy5yZXBsYWNlKC9cXChcXHMrL2lnLCBcIihcIikucmVwbGFjZSgvXFxzK1xcKS9pZywgXCIpXCIpLnJlcGxhY2UoL1xcKC9nLCBcIltcIikucmVwbGFjZSgvXFwpL2csIFwiXVwiKS5yZXBsYWNlKC9cXHMrL2csIFwiLFwiKS5yZXBsYWNlKC8oYW5kfG9yKS9pZywgXCInJDEnXCIpO1xuICBmb3JtYXRfbG9naWMgPSBmb3JtYXRfbG9naWMucmVwbGFjZSgvKFxcZCkrL2lnLCBmdW5jdGlvbih4KSB7XG4gICAgdmFyIF9mLCBmaWVsZCwgb3B0aW9uLCBzdWJfc2VsZWN0b3IsIHZhbHVlO1xuICAgIF9mID0gZmlsdGVyc1t4IC0gMV07XG4gICAgZmllbGQgPSBfZi5maWVsZDtcbiAgICBvcHRpb24gPSBfZi5vcGVyYXRpb247XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgdmFsdWUgPSBDcmVhdG9yLmV2YWx1YXRlRm9ybXVsYShfZi52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoX2YudmFsdWUsIG51bGwsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzdWJfc2VsZWN0b3IgPSBbXTtcbiAgICBpZiAoXy5pc0FycmF5KHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKG9wdGlvbiA9PT0gXCI9XCIpIHtcbiAgICAgICAgXy5lYWNoKHZhbHVlLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIHN1Yl9zZWxlY3Rvci5wdXNoKFtmaWVsZCwgb3B0aW9uLCB2XSwgXCJvclwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbiA9PT0gXCI8PlwiKSB7XG4gICAgICAgIF8uZWFjaCh2YWx1ZSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBzdWJfc2VsZWN0b3IucHVzaChbZmllbGQsIG9wdGlvbiwgdl0sIFwiYW5kXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF8uZWFjaCh2YWx1ZSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBzdWJfc2VsZWN0b3IucHVzaChbZmllbGQsIG9wdGlvbiwgdl0sIFwib3JcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHN1Yl9zZWxlY3RvcltzdWJfc2VsZWN0b3IubGVuZ3RoIC0gMV0gPT09IFwiYW5kXCIgfHwgc3ViX3NlbGVjdG9yW3N1Yl9zZWxlY3Rvci5sZW5ndGggLSAxXSA9PT0gXCJvclwiKSB7XG4gICAgICAgIHN1Yl9zZWxlY3Rvci5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3ViX3NlbGVjdG9yID0gW2ZpZWxkLCBvcHRpb24sIHZhbHVlXTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHN1Yl9zZWxlY3Rvcik7XG4gIH0pO1xuICBmb3JtYXRfbG9naWMgPSBcIltcIiArIGZvcm1hdF9sb2dpYyArIFwiXVwiO1xuICByZXR1cm4gQ3JlYXRvcltcImV2YWxcIl0oZm9ybWF0X2xvZ2ljKTtcbn07XG5cbkNyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdHMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSB7XG4gIHZhciBfb2JqZWN0LCBwZXJtaXNzaW9ucywgcmVsYXRlZF9vYmplY3RfbmFtZXMsIHJlbGF0ZWRfb2JqZWN0cywgdW5yZWxhdGVkX29iamVjdHM7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgc3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHVzZXJJZCA9IE1ldGVvci51c2VySWQoKTtcbiAgICB9XG4gIH1cbiAgcmVsYXRlZF9vYmplY3RfbmFtZXMgPSBbXTtcbiAgX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgaWYgKCFfb2JqZWN0KSB7XG4gICAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0X25hbWVzO1xuICB9XG4gIHJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0T2JqZWN0UmVsYXRlZHMoX29iamVjdC5fY29sbGVjdGlvbl9uYW1lKTtcbiAgcmVsYXRlZF9vYmplY3RfbmFtZXMgPSBfLnBsdWNrKHJlbGF0ZWRfb2JqZWN0cywgXCJvYmplY3RfbmFtZVwiKTtcbiAgaWYgKChyZWxhdGVkX29iamVjdF9uYW1lcyAhPSBudWxsID8gcmVsYXRlZF9vYmplY3RfbmFtZXMubGVuZ3RoIDogdm9pZCAwKSA9PT0gMCkge1xuICAgIHJldHVybiByZWxhdGVkX29iamVjdF9uYW1lcztcbiAgfVxuICBwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gIHVucmVsYXRlZF9vYmplY3RzID0gcGVybWlzc2lvbnMudW5yZWxhdGVkX29iamVjdHM7XG4gIHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gXy5kaWZmZXJlbmNlKHJlbGF0ZWRfb2JqZWN0X25hbWVzLCB1bnJlbGF0ZWRfb2JqZWN0cyk7XG4gIHJldHVybiBfLmZpbHRlcihyZWxhdGVkX29iamVjdHMsIGZ1bmN0aW9uKHJlbGF0ZWRfb2JqZWN0KSB7XG4gICAgdmFyIGFsbG93UmVhZCwgaXNBY3RpdmUsIHJlZiwgcmVsYXRlZF9vYmplY3RfbmFtZTtcbiAgICByZWxhdGVkX29iamVjdF9uYW1lID0gcmVsYXRlZF9vYmplY3Qub2JqZWN0X25hbWU7XG4gICAgaXNBY3RpdmUgPSByZWxhdGVkX29iamVjdF9uYW1lcy5pbmRleE9mKHJlbGF0ZWRfb2JqZWN0X25hbWUpID4gLTE7XG4gICAgYWxsb3dSZWFkID0gKHJlZiA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMocmVsYXRlZF9vYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSkgIT0gbnVsbCA/IHJlZi5hbGxvd1JlYWQgOiB2b2lkIDA7XG4gICAgaWYgKHJlbGF0ZWRfb2JqZWN0X25hbWUgPT09IFwiY21zX2ZpbGVzXCIpIHtcbiAgICAgIGFsbG93UmVhZCA9IGFsbG93UmVhZCAmJiBwZXJtaXNzaW9ucy5hbGxvd1JlYWRGaWxlcztcbiAgICB9XG4gICAgcmV0dXJuIGlzQWN0aXZlICYmIGFsbG93UmVhZDtcbiAgfSk7XG59O1xuXG5DcmVhdG9yLmdldFJlbGF0ZWRPYmplY3ROYW1lcyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpIHtcbiAgdmFyIHJlbGF0ZWRfb2JqZWN0cztcbiAgcmVsYXRlZF9vYmplY3RzID0gQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0cyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKTtcbiAgcmV0dXJuIF8ucGx1Y2socmVsYXRlZF9vYmplY3RzLCBcIm9iamVjdF9uYW1lXCIpO1xufTtcblxuQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0TGlzdEFjdGlvbnMgPSBmdW5jdGlvbihyZWxhdGVkT2JqZWN0TmFtZSwgc3BhY2VJZCwgdXNlcklkKSB7XG4gIHZhciBhY3Rpb25zO1xuICBhY3Rpb25zID0gQ3JlYXRvci5nZXRBY3Rpb25zKHJlbGF0ZWRPYmplY3ROYW1lLCBzcGFjZUlkLCB1c2VySWQpO1xuICBhY3Rpb25zID0gXy5maWx0ZXIoYWN0aW9ucywgZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKGFjdGlvbi5uYW1lID09PSBcInN0YW5kYXJkX2ZvbGxvd1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3Rpb24ubmFtZSA9PT0gXCJzdGFuZGFyZF9xdWVyeVwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3Rpb24ub24gPT09IFwibGlzdFwiKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbi52aXNpYmxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi52aXNpYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWN0aW9uLnZpc2libGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbkNyZWF0b3IuZ2V0QWN0aW9ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpIHtcbiAgdmFyIGFjdGlvbnMsIGRpc2FibGVkX2FjdGlvbnMsIG9iaiwgcGVybWlzc2lvbnMsIHJlZiwgcmVmMTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICB9XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgdXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIH1cbiAgfVxuICBvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGlmICghb2JqKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKTtcbiAgZGlzYWJsZWRfYWN0aW9ucyA9IHBlcm1pc3Npb25zLmRpc2FibGVkX2FjdGlvbnM7XG4gIGFjdGlvbnMgPSBfLnNvcnRCeShfLnZhbHVlcyhvYmouYWN0aW9ucyksICdzb3J0Jyk7XG4gIGlmIChfLmhhcyhvYmosICdhbGxvd19jdXN0b21BY3Rpb25zJykpIHtcbiAgICBhY3Rpb25zID0gXy5maWx0ZXIoYWN0aW9ucywgZnVuY3Rpb24oYWN0aW9uKSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlKG9iai5hbGxvd19jdXN0b21BY3Rpb25zLCBhY3Rpb24ubmFtZSkgfHwgXy5pbmNsdWRlKF8ua2V5cyhDcmVhdG9yLmdldE9iamVjdCgnYmFzZScpLmFjdGlvbnMpIHx8IHt9LCBhY3Rpb24ubmFtZSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKF8uaGFzKG9iaiwgJ2V4Y2x1ZGVfYWN0aW9ucycpKSB7XG4gICAgYWN0aW9ucyA9IF8uZmlsdGVyKGFjdGlvbnMsIGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgcmV0dXJuICFfLmluY2x1ZGUob2JqLmV4Y2x1ZGVfYWN0aW9ucywgYWN0aW9uLm5hbWUpO1xuICAgIH0pO1xuICB9XG4gIF8uZWFjaChhY3Rpb25zLCBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpICYmIFtcInJlY29yZFwiLCBcInJlY29yZF9vbmx5XCJdLmluZGV4T2YoYWN0aW9uLm9uKSA+IC0xICYmIGFjdGlvbi5uYW1lICE9PSAnc3RhbmRhcmRfZWRpdCcpIHtcbiAgICAgIGlmIChhY3Rpb24ub24gPT09IFwicmVjb3JkX29ubHlcIikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLm9uID0gJ3JlY29yZF9vbmx5X21vcmUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5vbiA9ICdyZWNvcmRfbW9yZSc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSAmJiBbXCJjbXNfZmlsZXNcIiwgXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiXS5pbmRleE9mKG9iamVjdF9uYW1lKSA+IC0xKSB7XG4gICAgaWYgKChyZWYgPSBhY3Rpb25zLmZpbmQoZnVuY3Rpb24obikge1xuICAgICAgcmV0dXJuIG4ubmFtZSA9PT0gXCJzdGFuZGFyZF9lZGl0XCI7XG4gICAgfSkpICE9IG51bGwpIHtcbiAgICAgIHJlZi5vbiA9IFwicmVjb3JkX21vcmVcIjtcbiAgICB9XG4gICAgaWYgKChyZWYxID0gYWN0aW9ucy5maW5kKGZ1bmN0aW9uKG4pIHtcbiAgICAgIHJldHVybiBuLm5hbWUgPT09IFwiZG93bmxvYWRcIjtcbiAgICB9KSkgIT0gbnVsbCkge1xuICAgICAgcmVmMS5vbiA9IFwicmVjb3JkXCI7XG4gICAgfVxuICB9XG4gIGFjdGlvbnMgPSBfLmZpbHRlcihhY3Rpb25zLCBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICByZXR1cm4gXy5pbmRleE9mKGRpc2FibGVkX2FjdGlvbnMsIGFjdGlvbi5uYW1lKSA8IDA7XG4gIH0pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbi/ov5Tlm57lvZPliY3nlKjmiLfmnInmnYPpmZDorr/pl67nmoTmiYDmnIlsaXN0X3ZpZXfvvIzljIXmi6zliIbkuqvnmoTvvIznlKjmiLfoh6rlrprkuYnpnZ7liIbkuqvnmoTvvIjpmaTpnZ5vd25lcuWPmOS6hu+8ie+8jOS7peWPium7mOiupOeahOWFtuS7luinhuWbvuazqOaEj0NyZWF0b3IuZ2V0UGVybWlzc2lvbnPlh73mlbDkuK3mmK/kuI3kvJrmnInnlKjmiLfoh6rlrprkuYnpnZ7liIbkuqvnmoTop4blm77nmoTvvIzmiYDku6VDcmVhdG9yLmdldFBlcm1pc3Npb25z5Ye95pWw5Lit5ou/5Yiw55qE57uT5p6c5LiN5YWo77yM5bm25LiN5piv5b2T5YmN55So5oi36IO955yL5Yiw5omA5pyJ6KeG5Zu+LztcblxuQ3JlYXRvci5nZXRMaXN0Vmlld3MgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSB7XG4gIHZhciBkaXNhYmxlZF9saXN0X3ZpZXdzLCBpc01vYmlsZSwgbGlzdFZpZXdzLCBsaXN0X3ZpZXdzLCBvYmplY3QsIHJlZjtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICB9XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgdXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIH1cbiAgfVxuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzYWJsZWRfbGlzdF92aWV3cyA9ICgocmVmID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSkgIT0gbnVsbCA/IHJlZi5kaXNhYmxlZF9saXN0X3ZpZXdzIDogdm9pZCAwKSB8fCBbXTtcbiAgbGlzdF92aWV3cyA9IFtdO1xuICBpc01vYmlsZSA9IFN0ZWVkb3MuaXNNb2JpbGUoKTtcbiAgXy5lYWNoKG9iamVjdC5saXN0X3ZpZXdzLCBmdW5jdGlvbihpdGVtLCBpdGVtX25hbWUpIHtcbiAgICByZXR1cm4gaXRlbS5uYW1lID0gaXRlbV9uYW1lO1xuICB9KTtcbiAgbGlzdFZpZXdzID0gXy5zb3J0QnkoXy52YWx1ZXMob2JqZWN0Lmxpc3Rfdmlld3MpLCAnc29ydF9ubycpO1xuICBfLmVhY2gobGlzdFZpZXdzLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgdmFyIGlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzTW9iaWxlICYmIGl0ZW0udHlwZSA9PT0gXCJjYWxlbmRhclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpdGVtLm5hbWUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICBpc0Rpc2FibGVkID0gXy5pbmRleE9mKGRpc2FibGVkX2xpc3Rfdmlld3MsIGl0ZW0ubmFtZSkgPiAtMSB8fCAoaXRlbS5faWQgJiYgXy5pbmRleE9mKGRpc2FibGVkX2xpc3Rfdmlld3MsIGl0ZW0uX2lkKSA+IC0xKTtcbiAgICAgIGlmICghaXNEaXNhYmxlZCB8fCBpdGVtLm93bmVyID09PSB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIGxpc3Rfdmlld3MucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGlzdF92aWV3cztcbn07XG5cbkNyZWF0b3IuZ2V0RmllbGRzID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkge1xuICB2YXIgZmllbGRzTmFtZSwgcmVmLCB1bnJlYWRhYmxlX2ZpZWxkcztcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICB9XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgdXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIH1cbiAgfVxuICBmaWVsZHNOYW1lID0gQ3JlYXRvci5nZXRPYmplY3RGaWVsZHNOYW1lKG9iamVjdF9uYW1lKTtcbiAgdW5yZWFkYWJsZV9maWVsZHMgPSAocmVmID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSkgIT0gbnVsbCA/IHJlZi51bnJlYWRhYmxlX2ZpZWxkcyA6IHZvaWQgMDtcbiAgcmV0dXJuIF8uZGlmZmVyZW5jZShmaWVsZHNOYW1lLCB1bnJlYWRhYmxlX2ZpZWxkcyk7XG59O1xuXG5DcmVhdG9yLmlzbG9hZGluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIUNyZWF0b3IuYm9vdHN0cmFwTG9hZGVkLmdldCgpO1xufTtcblxuQ3JlYXRvci5jb252ZXJ0U3BlY2lhbENoYXJhY3RlciA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFxeXFwkXFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcfFxcW1xcXVxce1xcfV0pL2csIFwiXFxcXCQxXCIpO1xufTtcblxuQ3JlYXRvci5nZXREaXNhYmxlZEZpZWxkcyA9IGZ1bmN0aW9uKHNjaGVtYSkge1xuICB2YXIgZmllbGRzO1xuICBmaWVsZHMgPSBfLm1hcChzY2hlbWEsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZE5hbWUpIHtcbiAgICByZXR1cm4gZmllbGQuYXV0b2Zvcm0gJiYgZmllbGQuYXV0b2Zvcm0uZGlzYWJsZWQgJiYgIWZpZWxkLmF1dG9mb3JtLm9taXQgJiYgZmllbGROYW1lO1xuICB9KTtcbiAgZmllbGRzID0gXy5jb21wYWN0KGZpZWxkcyk7XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5DcmVhdG9yLmdldEhpZGRlbkZpZWxkcyA9IGZ1bmN0aW9uKHNjaGVtYSkge1xuICB2YXIgZmllbGRzO1xuICBmaWVsZHMgPSBfLm1hcChzY2hlbWEsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZE5hbWUpIHtcbiAgICByZXR1cm4gZmllbGQuYXV0b2Zvcm0gJiYgZmllbGQuYXV0b2Zvcm0udHlwZSA9PT0gXCJoaWRkZW5cIiAmJiAhZmllbGQuYXV0b2Zvcm0ub21pdCAmJiBmaWVsZE5hbWU7XG4gIH0pO1xuICBmaWVsZHMgPSBfLmNvbXBhY3QoZmllbGRzKTtcbiAgcmV0dXJuIGZpZWxkcztcbn07XG5cbkNyZWF0b3IuZ2V0RmllbGRzV2l0aE5vR3JvdXAgPSBmdW5jdGlvbihzY2hlbWEpIHtcbiAgdmFyIGZpZWxkcztcbiAgZmllbGRzID0gXy5tYXAoc2NoZW1hLCBmdW5jdGlvbihmaWVsZCwgZmllbGROYW1lKSB7XG4gICAgcmV0dXJuICghZmllbGQuYXV0b2Zvcm0gfHwgIWZpZWxkLmF1dG9mb3JtLmdyb3VwIHx8IGZpZWxkLmF1dG9mb3JtLmdyb3VwID09PSBcIi1cIikgJiYgKCFmaWVsZC5hdXRvZm9ybSB8fCBmaWVsZC5hdXRvZm9ybS50eXBlICE9PSBcImhpZGRlblwiKSAmJiBmaWVsZE5hbWU7XG4gIH0pO1xuICBmaWVsZHMgPSBfLmNvbXBhY3QoZmllbGRzKTtcbiAgcmV0dXJuIGZpZWxkcztcbn07XG5cbkNyZWF0b3IuZ2V0U29ydGVkRmllbGRHcm91cE5hbWVzID0gZnVuY3Rpb24oc2NoZW1hKSB7XG4gIHZhciBuYW1lcztcbiAgbmFtZXMgPSBfLm1hcChzY2hlbWEsIGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgcmV0dXJuIGZpZWxkLmF1dG9mb3JtICYmIGZpZWxkLmF1dG9mb3JtLmdyb3VwICE9PSBcIi1cIiAmJiBmaWVsZC5hdXRvZm9ybS5ncm91cDtcbiAgfSk7XG4gIG5hbWVzID0gXy5jb21wYWN0KG5hbWVzKTtcbiAgbmFtZXMgPSBfLnVuaXF1ZShuYW1lcyk7XG4gIHJldHVybiBuYW1lcztcbn07XG5cbkNyZWF0b3IuZ2V0RmllbGRzRm9yR3JvdXAgPSBmdW5jdGlvbihzY2hlbWEsIGdyb3VwTmFtZSkge1xuICB2YXIgZmllbGRzO1xuICBmaWVsZHMgPSBfLm1hcChzY2hlbWEsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZE5hbWUpIHtcbiAgICByZXR1cm4gZmllbGQuYXV0b2Zvcm0gJiYgZmllbGQuYXV0b2Zvcm0uZ3JvdXAgPT09IGdyb3VwTmFtZSAmJiBmaWVsZC5hdXRvZm9ybS50eXBlICE9PSBcImhpZGRlblwiICYmIGZpZWxkTmFtZTtcbiAgfSk7XG4gIGZpZWxkcyA9IF8uY29tcGFjdChmaWVsZHMpO1xuICByZXR1cm4gZmllbGRzO1xufTtcblxuQ3JlYXRvci5nZXRTeXN0ZW1CYXNlRmllbGRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBbXCJjcmVhdGVkXCIsIFwiY3JlYXRlZF9ieVwiLCBcIm1vZGlmaWVkXCIsIFwibW9kaWZpZWRfYnlcIl07XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkc1dpdGhvdXRTeXN0ZW1CYXNlID0gZnVuY3Rpb24oa2V5cykge1xuICByZXR1cm4gXy5kaWZmZXJlbmNlKGtleXMsIENyZWF0b3IuZ2V0U3lzdGVtQmFzZUZpZWxkcygpKTtcbn07XG5cbkNyZWF0b3IuZ2V0RmllbGRzV2l0aG91dE9taXQgPSBmdW5jdGlvbihzY2hlbWEsIGtleXMpIHtcbiAga2V5cyA9IF8ubWFwKGtleXMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmaWVsZCwgcmVmO1xuICAgIGZpZWxkID0gXy5waWNrKHNjaGVtYSwga2V5KTtcbiAgICBpZiAoKHJlZiA9IGZpZWxkW2tleV0uYXV0b2Zvcm0pICE9IG51bGwgPyByZWYub21pdCA6IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfSk7XG4gIGtleXMgPSBfLmNvbXBhY3Qoa2V5cyk7XG4gIHJldHVybiBrZXlzO1xufTtcblxuQ3JlYXRvci5nZXRGaWVsZHNJbkZpcnN0TGV2ZWwgPSBmdW5jdGlvbihmaXJzdExldmVsS2V5cywga2V5cykge1xuICBrZXlzID0gXy5tYXAoa2V5cywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKF8uaW5kZXhPZihmaXJzdExldmVsS2V5cywga2V5KSA+IC0xKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAga2V5cyA9IF8uY29tcGFjdChrZXlzKTtcbiAgcmV0dXJuIGtleXM7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkc0ZvclJlb3JkZXIgPSBmdW5jdGlvbihzY2hlbWEsIGtleXMsIGlzU2luZ2xlKSB7XG4gIHZhciBfa2V5cywgY2hpbGRLZXlzLCBmaWVsZHMsIGksIGlzX3dpZGVfMSwgaXNfd2lkZV8yLCBzY18xLCBzY18yO1xuICBmaWVsZHMgPSBbXTtcbiAgaSA9IDA7XG4gIF9rZXlzID0gXy5maWx0ZXIoa2V5cywgZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuICFrZXkuZW5kc1dpdGgoJ19lbmRMaW5lJyk7XG4gIH0pO1xuICB3aGlsZSAoaSA8IF9rZXlzLmxlbmd0aCkge1xuICAgIHNjXzEgPSBfLnBpY2soc2NoZW1hLCBfa2V5c1tpXSk7XG4gICAgc2NfMiA9IF8ucGljayhzY2hlbWEsIF9rZXlzW2kgKyAxXSk7XG4gICAgaXNfd2lkZV8xID0gZmFsc2U7XG4gICAgaXNfd2lkZV8yID0gZmFsc2U7XG4gICAgXy5lYWNoKHNjXzEsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgcmVmLCByZWYxO1xuICAgICAgaWYgKCgocmVmID0gdmFsdWUuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYuaXNfd2lkZSA6IHZvaWQgMCkgfHwgKChyZWYxID0gdmFsdWUuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYxLnR5cGUgOiB2b2lkIDApID09PSBcInRhYmxlXCIpIHtcbiAgICAgICAgcmV0dXJuIGlzX3dpZGVfMSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXy5lYWNoKHNjXzIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgcmVmLCByZWYxO1xuICAgICAgaWYgKCgocmVmID0gdmFsdWUuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYuaXNfd2lkZSA6IHZvaWQgMCkgfHwgKChyZWYxID0gdmFsdWUuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYxLnR5cGUgOiB2b2lkIDApID09PSBcInRhYmxlXCIpIHtcbiAgICAgICAgcmV0dXJuIGlzX3dpZGVfMiA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgaXNfd2lkZV8xID0gdHJ1ZTtcbiAgICAgIGlzX3dpZGVfMiA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpc1NpbmdsZSkge1xuICAgICAgZmllbGRzLnB1c2goX2tleXMuc2xpY2UoaSwgaSArIDEpKTtcbiAgICAgIGkgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzX3dpZGVfMSkge1xuICAgICAgICBmaWVsZHMucHVzaChfa2V5cy5zbGljZShpLCBpICsgMSkpO1xuICAgICAgICBpICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKCFpc193aWRlXzEgJiYgaXNfd2lkZV8yKSB7XG4gICAgICAgIGNoaWxkS2V5cyA9IF9rZXlzLnNsaWNlKGksIGkgKyAxKTtcbiAgICAgICAgY2hpbGRLZXlzLnB1c2godm9pZCAwKTtcbiAgICAgICAgZmllbGRzLnB1c2goY2hpbGRLZXlzKTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfSBlbHNlIGlmICghaXNfd2lkZV8xICYmICFpc193aWRlXzIpIHtcbiAgICAgICAgY2hpbGRLZXlzID0gX2tleXMuc2xpY2UoaSwgaSArIDEpO1xuICAgICAgICBpZiAoX2tleXNbaSArIDFdKSB7XG4gICAgICAgICAgY2hpbGRLZXlzLnB1c2goX2tleXNbaSArIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZEtleXMucHVzaCh2b2lkIDApO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkcy5wdXNoKGNoaWxkS2V5cyk7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpZWxkcztcbn07XG5cbkNyZWF0b3IuaXNGaWx0ZXJWYWx1ZUVtcHR5ID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09IFwidW5kZWZpbmVkXCIgfHwgdiA9PT0gbnVsbCB8fCBOdW1iZXIuaXNOYU4odikgfHwgdi5sZW5ndGggPT09IDA7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkRGF0YVR5cGUgPSBmdW5jdGlvbihvYmplY3RGaWVsZHMsIGtleSkge1xuICB2YXIgcmVmLCByZXN1bHQ7XG4gIGlmIChvYmplY3RGaWVsZHMgJiYga2V5KSB7XG4gICAgcmVzdWx0ID0gKHJlZiA9IG9iamVjdEZpZWxkc1trZXldKSAhPSBudWxsID8gcmVmLnR5cGUgOiB2b2lkIDA7XG4gICAgaWYgKFtcImZvcm11bGFcIiwgXCJzdW1tYXJ5XCJdLmluZGV4T2YocmVzdWx0KSA+IC0xKSB7XG4gICAgICByZXN1bHQgPSBvYmplY3RGaWVsZHNba2V5XS5kYXRhX3R5cGU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIENyZWF0b3IuZ2V0QWxsUmVsYXRlZE9iamVjdHMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICAgIHZhciByZWxhdGVkX29iamVjdF9uYW1lcztcbiAgICByZWxhdGVkX29iamVjdF9uYW1lcyA9IFtdO1xuICAgIF8uZWFjaChDcmVhdG9yLk9iamVjdHMsIGZ1bmN0aW9uKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKSB7XG4gICAgICByZXR1cm4gXy5lYWNoKHJlbGF0ZWRfb2JqZWN0LmZpZWxkcywgZnVuY3Rpb24ocmVsYXRlZF9maWVsZCwgcmVsYXRlZF9maWVsZF9uYW1lKSB7XG4gICAgICAgIGlmIChyZWxhdGVkX2ZpZWxkLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiICYmIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvICYmIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvID09PSBvYmplY3RfbmFtZSkge1xuICAgICAgICAgIHJldHVybiByZWxhdGVkX29iamVjdF9uYW1lcy5wdXNoKHJlbGF0ZWRfb2JqZWN0X25hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpLmVuYWJsZV9maWxlcykge1xuICAgICAgcmVsYXRlZF9vYmplY3RfbmFtZXMucHVzaChcImNtc19maWxlc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0X25hbWVzO1xuICB9O1xufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIFN0ZWVkb3MuZm9ybWF0SW5kZXggPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBpbmRleE5hbWUsIGlzZG9jdW1lbnREQiwgb2JqZWN0LCByZWYsIHJlZjEsIHJlZjI7XG4gICAgb2JqZWN0ID0ge1xuICAgICAgYmFja2dyb3VuZDogdHJ1ZVxuICAgIH07XG4gICAgaXNkb2N1bWVudERCID0gKChyZWYgPSBNZXRlb3Iuc2V0dGluZ3MpICE9IG51bGwgPyAocmVmMSA9IHJlZi5kYXRhc291cmNlcykgIT0gbnVsbCA/IChyZWYyID0gcmVmMVtcImRlZmF1bHRcIl0pICE9IG51bGwgPyByZWYyLmRvY3VtZW50REIgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgIGlmIChpc2RvY3VtZW50REIpIHtcbiAgICAgIGlmIChhcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGluZGV4TmFtZSA9IGFycmF5LmpvaW4oXCIuXCIpO1xuICAgICAgICBvYmplY3QubmFtZSA9IGluZGV4TmFtZTtcbiAgICAgICAgaWYgKGluZGV4TmFtZS5sZW5ndGggPiA1Mikge1xuICAgICAgICAgIG9iamVjdC5uYW1lID0gaW5kZXhOYW1lLnN1YnN0cmluZygwLCA1Mik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cbiIsIkNyZWF0b3IuYXBwc0J5TmFtZSA9IHt9XG5cbiIsIk1ldGVvci5tZXRob2RzXG5cdFwib2JqZWN0X3JlY2VudF92aWV3ZWRcIjogKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHNwYWNlX2lkKS0+XG5cdFx0aWYgIXRoaXMudXNlcklkXG5cdFx0XHRyZXR1cm4gbnVsbFxuXG5cdFx0aWYgb2JqZWN0X25hbWUgPT0gXCJvYmplY3RfcmVjZW50X3ZpZXdlZFwiXG5cdFx0XHRyZXR1cm5cblx0XHRpZiBvYmplY3RfbmFtZSBhbmQgcmVjb3JkX2lkXG5cdFx0XHRpZiAhc3BhY2VfaWRcblx0XHRcdFx0ZG9jID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKS5maW5kT25lKHtfaWQ6IHJlY29yZF9pZH0sIHtmaWVsZHM6IHtzcGFjZTogMX19KVxuXHRcdFx0XHRzcGFjZV9pZCA9IGRvYz8uc3BhY2VcblxuXHRcdFx0Y29sbGVjdGlvbl9yZWNlbnRfdmlld2VkID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwib2JqZWN0X3JlY2VudF92aWV3ZWRcIilcblx0XHRcdGZpbHRlcnMgPSB7IG93bmVyOiB0aGlzLnVzZXJJZCwgc3BhY2U6IHNwYWNlX2lkLCAncmVjb3JkLm8nOiBvYmplY3RfbmFtZSwgJ3JlY29yZC5pZHMnOiBbcmVjb3JkX2lkXX1cblx0XHRcdGN1cnJlbnRfcmVjZW50X3ZpZXdlZCA9IGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZC5maW5kT25lKGZpbHRlcnMpXG5cdFx0XHRpZiBjdXJyZW50X3JlY2VudF92aWV3ZWRcblx0XHRcdFx0Y29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLnVwZGF0ZShcblx0XHRcdFx0XHRjdXJyZW50X3JlY2VudF92aWV3ZWQuX2lkLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdCRpbmM6IHtcblx0XHRcdFx0XHRcdFx0Y291bnQ6IDFcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQkc2V0OiB7XG5cdFx0XHRcdFx0XHRcdG1vZGlmaWVkOiBuZXcgRGF0ZSgpXG5cdFx0XHRcdFx0XHRcdG1vZGlmaWVkX2J5OiB0aGlzLnVzZXJJZFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQuaW5zZXJ0KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdF9pZDogY29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLl9tYWtlTmV3SUQoKVxuXHRcdFx0XHRcdFx0b3duZXI6IHRoaXMudXNlcklkXG5cdFx0XHRcdFx0XHRzcGFjZTogc3BhY2VfaWRcblx0XHRcdFx0XHRcdHJlY29yZDoge286IG9iamVjdF9uYW1lLCBpZHM6IFtyZWNvcmRfaWRdfVxuXHRcdFx0XHRcdFx0Y291bnQ6IDFcblx0XHRcdFx0XHRcdGNyZWF0ZWQ6IG5ldyBEYXRlKClcblx0XHRcdFx0XHRcdGNyZWF0ZWRfYnk6IHRoaXMudXNlcklkXG5cdFx0XHRcdFx0XHRtb2RpZmllZDogbmV3IERhdGUoKVxuXHRcdFx0XHRcdFx0bW9kaWZpZWRfYnk6IHRoaXMudXNlcklkXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR2YWxpZGF0ZTogZmFsc2Vcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdHJldHVybiIsIk1ldGVvci5tZXRob2RzKHtcbiAgXCJvYmplY3RfcmVjZW50X3ZpZXdlZFwiOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzcGFjZV9pZCkge1xuICAgIHZhciBjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQsIGN1cnJlbnRfcmVjZW50X3ZpZXdlZCwgZG9jLCBmaWx0ZXJzO1xuICAgIGlmICghdGhpcy51c2VySWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAob2JqZWN0X25hbWUgPT09IFwib2JqZWN0X3JlY2VudF92aWV3ZWRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob2JqZWN0X25hbWUgJiYgcmVjb3JkX2lkKSB7XG4gICAgICBpZiAoIXNwYWNlX2lkKSB7XG4gICAgICAgIGRvYyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSkuZmluZE9uZSh7XG4gICAgICAgICAgX2lkOiByZWNvcmRfaWRcbiAgICAgICAgfSwge1xuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgc3BhY2U6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzcGFjZV9pZCA9IGRvYyAhPSBudWxsID8gZG9jLnNwYWNlIDogdm9pZCAwO1xuICAgICAgfVxuICAgICAgY29sbGVjdGlvbl9yZWNlbnRfdmlld2VkID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwib2JqZWN0X3JlY2VudF92aWV3ZWRcIik7XG4gICAgICBmaWx0ZXJzID0ge1xuICAgICAgICBvd25lcjogdGhpcy51c2VySWQsXG4gICAgICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICAgICAgJ3JlY29yZC5vJzogb2JqZWN0X25hbWUsXG4gICAgICAgICdyZWNvcmQuaWRzJzogW3JlY29yZF9pZF1cbiAgICAgIH07XG4gICAgICBjdXJyZW50X3JlY2VudF92aWV3ZWQgPSBjb2xsZWN0aW9uX3JlY2VudF92aWV3ZWQuZmluZE9uZShmaWx0ZXJzKTtcbiAgICAgIGlmIChjdXJyZW50X3JlY2VudF92aWV3ZWQpIHtcbiAgICAgICAgY29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLnVwZGF0ZShjdXJyZW50X3JlY2VudF92aWV3ZWQuX2lkLCB7XG4gICAgICAgICAgJGluYzoge1xuICAgICAgICAgICAgY291bnQ6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgbW9kaWZpZWRfYnk6IHRoaXMudXNlcklkXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbGxlY3Rpb25fcmVjZW50X3ZpZXdlZC5pbnNlcnQoe1xuICAgICAgICAgIF9pZDogY29sbGVjdGlvbl9yZWNlbnRfdmlld2VkLl9tYWtlTmV3SUQoKSxcbiAgICAgICAgICBvd25lcjogdGhpcy51c2VySWQsXG4gICAgICAgICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgICAgICAgIHJlY29yZDoge1xuICAgICAgICAgICAgbzogb2JqZWN0X25hbWUsXG4gICAgICAgICAgICBpZHM6IFtyZWNvcmRfaWRdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGNyZWF0ZWRfYnk6IHRoaXMudXNlcklkLFxuICAgICAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG1vZGlmaWVkX2J5OiB0aGlzLnVzZXJJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgdmFsaWRhdGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG4iLCJyZWNlbnRfYWdncmVnYXRlID0gKGNyZWF0ZWRfYnksIHNwYWNlSWQsIF9yZWNvcmRzLCBjYWxsYmFjayktPlxuXHRDcmVhdG9yLkNvbGxlY3Rpb25zLm9iamVjdF9yZWNlbnRfdmlld2VkLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUoW1xuXHRcdHskbWF0Y2g6IHtjcmVhdGVkX2J5OiBjcmVhdGVkX2J5LCBzcGFjZTogc3BhY2VJZH19LFxuXHRcdHskZ3JvdXA6IHtfaWQ6IHtvYmplY3RfbmFtZTogXCIkcmVjb3JkLm9cIiwgcmVjb3JkX2lkOiBcIiRyZWNvcmQuaWRzXCIsIHNwYWNlOiBcIiRzcGFjZVwifSwgbWF4Q3JlYXRlZDogeyRtYXg6IFwiJGNyZWF0ZWRcIn19fSxcblx0XHR7JHNvcnQ6IHttYXhDcmVhdGVkOiAtMX19LFxuXHRcdHskbGltaXQ6IDEwfVxuXHRdKS50b0FycmF5IChlcnIsIGRhdGEpLT5cblx0XHRpZiBlcnJcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnIpXG5cblx0XHRkYXRhLmZvckVhY2ggKGRvYykgLT5cblx0XHRcdF9yZWNvcmRzLnB1c2ggZG9jLl9pZFxuXG5cdFx0aWYgY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKVxuXHRcdFx0Y2FsbGJhY2soKVxuXG5cdFx0cmV0dXJuXG5cbmFzeW5jX3JlY2VudF9hZ2dyZWdhdGUgPSBNZXRlb3Iud3JhcEFzeW5jKHJlY2VudF9hZ2dyZWdhdGUpXG5cbnNlYXJjaF9vYmplY3QgPSAoc3BhY2UsIG9iamVjdF9uYW1lLHVzZXJJZCwgc2VhcmNoVGV4dCktPlxuXHRkYXRhID0gbmV3IEFycmF5KClcblxuXHRpZiBzZWFyY2hUZXh0XG5cblx0XHRfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cblx0XHRfb2JqZWN0X2NvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0X25hbWUpXG5cdFx0X29iamVjdF9uYW1lX2tleSA9IF9vYmplY3Q/Lk5BTUVfRklFTERfS0VZXG5cdFx0aWYgX29iamVjdCAmJiBfb2JqZWN0X2NvbGxlY3Rpb24gJiYgX29iamVjdF9uYW1lX2tleVxuXHRcdFx0cXVlcnkgPSB7fVxuXHRcdFx0c2VhcmNoX0tleXdvcmRzID0gc2VhcmNoVGV4dC5zcGxpdChcIiBcIilcblx0XHRcdHF1ZXJ5X2FuZCA9IFtdXG5cdFx0XHRzZWFyY2hfS2V5d29yZHMuZm9yRWFjaCAoa2V5d29yZCktPlxuXHRcdFx0XHRzdWJxdWVyeSA9IHt9XG5cdFx0XHRcdHN1YnF1ZXJ5W19vYmplY3RfbmFtZV9rZXldID0geyRyZWdleDoga2V5d29yZC50cmltKCl9XG5cdFx0XHRcdHF1ZXJ5X2FuZC5wdXNoIHN1YnF1ZXJ5XG5cblx0XHRcdHF1ZXJ5LiRhbmQgPSBxdWVyeV9hbmRcblx0XHRcdHF1ZXJ5LnNwYWNlID0geyRpbjogW3NwYWNlXX1cblxuXHRcdFx0ZmllbGRzID0ge19pZDogMX1cblx0XHRcdGZpZWxkc1tfb2JqZWN0X25hbWVfa2V5XSA9IDFcblxuXHRcdFx0cmVjb3JkcyA9IF9vYmplY3RfY29sbGVjdGlvbi5maW5kKHF1ZXJ5LCB7ZmllbGRzOiBmaWVsZHMsIHNvcnQ6IHttb2RpZmllZDogMX0sIGxpbWl0OiA1fSlcblxuXHRcdFx0cmVjb3Jkcy5mb3JFYWNoIChyZWNvcmQpLT5cblx0XHRcdFx0ZGF0YS5wdXNoIHtfaWQ6IHJlY29yZC5faWQsIF9uYW1lOiByZWNvcmRbX29iamVjdF9uYW1lX2tleV0sIF9vYmplY3RfbmFtZTogb2JqZWN0X25hbWV9XG5cdFxuXHRyZXR1cm4gZGF0YVxuXG5NZXRlb3IubWV0aG9kc1xuXHQnb2JqZWN0X3JlY2VudF9yZWNvcmQnOiAoc3BhY2VJZCktPlxuXHRcdGRhdGEgPSBuZXcgQXJyYXkoKVxuXHRcdHJlY29yZHMgPSBuZXcgQXJyYXkoKVxuXHRcdGFzeW5jX3JlY2VudF9hZ2dyZWdhdGUodGhpcy51c2VySWQsIHNwYWNlSWQsIHJlY29yZHMpXG5cdFx0cmVjb3Jkcy5mb3JFYWNoIChpdGVtKS0+XG5cdFx0XHRyZWNvcmRfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QoaXRlbS5vYmplY3RfbmFtZSwgaXRlbS5zcGFjZSlcblxuXHRcdFx0aWYgIXJlY29yZF9vYmplY3Rcblx0XHRcdFx0cmV0dXJuXG5cblx0XHRcdHJlY29yZF9vYmplY3RfY29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihpdGVtLm9iamVjdF9uYW1lLCBpdGVtLnNwYWNlKVxuXG5cdFx0XHRpZiByZWNvcmRfb2JqZWN0ICYmIHJlY29yZF9vYmplY3RfY29sbGVjdGlvblxuXHRcdFx0XHRmaWVsZHMgPSB7X2lkOiAxfVxuXG5cdFx0XHRcdGZpZWxkc1tyZWNvcmRfb2JqZWN0Lk5BTUVfRklFTERfS0VZXSA9IDFcblxuXHRcdFx0XHRyZWNvcmQgPSByZWNvcmRfb2JqZWN0X2NvbGxlY3Rpb24uZmluZE9uZShpdGVtLnJlY29yZF9pZFswXSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdFx0aWYgcmVjb3JkXG5cdFx0XHRcdFx0ZGF0YS5wdXNoIHtfaWQ6IHJlY29yZC5faWQsIF9uYW1lOiByZWNvcmRbcmVjb3JkX29iamVjdC5OQU1FX0ZJRUxEX0tFWV0sIF9vYmplY3RfbmFtZTogaXRlbS5vYmplY3RfbmFtZX1cblxuXHRcdHJldHVybiBkYXRhXG5cblx0J29iamVjdF9yZWNvcmRfc2VhcmNoJzogKG9wdGlvbnMpLT5cblx0XHRzZWxmID0gdGhpc1xuXG5cdFx0ZGF0YSA9IG5ldyBBcnJheSgpXG5cblx0XHRzZWFyY2hUZXh0ID0gb3B0aW9ucy5zZWFyY2hUZXh0XG5cdFx0c3BhY2UgPSBvcHRpb25zLnNwYWNlXG5cblx0XHRfLmZvckVhY2ggQ3JlYXRvci5vYmplY3RzQnlOYW1lLCAoX29iamVjdCwgbmFtZSktPlxuXHRcdFx0aWYgX29iamVjdC5lbmFibGVfc2VhcmNoXG5cdFx0XHRcdG9iamVjdF9yZWNvcmQgPSBzZWFyY2hfb2JqZWN0KHNwYWNlLCBfb2JqZWN0Lm5hbWUsIHNlbGYudXNlcklkLCBzZWFyY2hUZXh0KVxuXHRcdFx0XHRkYXRhID0gZGF0YS5jb25jYXQob2JqZWN0X3JlY29yZClcblxuXHRcdHJldHVybiBkYXRhXG4iLCJ2YXIgYXN5bmNfcmVjZW50X2FnZ3JlZ2F0ZSwgcmVjZW50X2FnZ3JlZ2F0ZSwgc2VhcmNoX29iamVjdDtcblxucmVjZW50X2FnZ3JlZ2F0ZSA9IGZ1bmN0aW9uKGNyZWF0ZWRfYnksIHNwYWNlSWQsIF9yZWNvcmRzLCBjYWxsYmFjaykge1xuICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3RfcmVjZW50X3ZpZXdlZC5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKFtcbiAgICB7XG4gICAgICAkbWF0Y2g6IHtcbiAgICAgICAgY3JlYXRlZF9ieTogY3JlYXRlZF9ieSxcbiAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICAkZ3JvdXA6IHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgb2JqZWN0X25hbWU6IFwiJHJlY29yZC5vXCIsXG4gICAgICAgICAgcmVjb3JkX2lkOiBcIiRyZWNvcmQuaWRzXCIsXG4gICAgICAgICAgc3BhY2U6IFwiJHNwYWNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgbWF4Q3JlYXRlZDoge1xuICAgICAgICAgICRtYXg6IFwiJGNyZWF0ZWRcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgJHNvcnQ6IHtcbiAgICAgICAgbWF4Q3JlYXRlZDogLTFcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICAkbGltaXQ6IDEwXG4gICAgfVxuICBdKS50b0FycmF5KGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7XG4gICAgICByZXR1cm4gX3JlY29yZHMucHVzaChkb2MuX2lkKTtcbiAgICB9KTtcbiAgICBpZiAoY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xufTtcblxuYXN5bmNfcmVjZW50X2FnZ3JlZ2F0ZSA9IE1ldGVvci53cmFwQXN5bmMocmVjZW50X2FnZ3JlZ2F0ZSk7XG5cbnNlYXJjaF9vYmplY3QgPSBmdW5jdGlvbihzcGFjZSwgb2JqZWN0X25hbWUsIHVzZXJJZCwgc2VhcmNoVGV4dCkge1xuICB2YXIgX29iamVjdCwgX29iamVjdF9jb2xsZWN0aW9uLCBfb2JqZWN0X25hbWVfa2V5LCBkYXRhLCBmaWVsZHMsIHF1ZXJ5LCBxdWVyeV9hbmQsIHJlY29yZHMsIHNlYXJjaF9LZXl3b3JkcztcbiAgZGF0YSA9IG5ldyBBcnJheSgpO1xuICBpZiAoc2VhcmNoVGV4dCkge1xuICAgIF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gICAgX29iamVjdF9jb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKTtcbiAgICBfb2JqZWN0X25hbWVfa2V5ID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5OQU1FX0ZJRUxEX0tFWSA6IHZvaWQgMDtcbiAgICBpZiAoX29iamVjdCAmJiBfb2JqZWN0X2NvbGxlY3Rpb24gJiYgX29iamVjdF9uYW1lX2tleSkge1xuICAgICAgcXVlcnkgPSB7fTtcbiAgICAgIHNlYXJjaF9LZXl3b3JkcyA9IHNlYXJjaFRleHQuc3BsaXQoXCIgXCIpO1xuICAgICAgcXVlcnlfYW5kID0gW107XG4gICAgICBzZWFyY2hfS2V5d29yZHMuZm9yRWFjaChmdW5jdGlvbihrZXl3b3JkKSB7XG4gICAgICAgIHZhciBzdWJxdWVyeTtcbiAgICAgICAgc3VicXVlcnkgPSB7fTtcbiAgICAgICAgc3VicXVlcnlbX29iamVjdF9uYW1lX2tleV0gPSB7XG4gICAgICAgICAgJHJlZ2V4OiBrZXl3b3JkLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcXVlcnlfYW5kLnB1c2goc3VicXVlcnkpO1xuICAgICAgfSk7XG4gICAgICBxdWVyeS4kYW5kID0gcXVlcnlfYW5kO1xuICAgICAgcXVlcnkuc3BhY2UgPSB7XG4gICAgICAgICRpbjogW3NwYWNlXVxuICAgICAgfTtcbiAgICAgIGZpZWxkcyA9IHtcbiAgICAgICAgX2lkOiAxXG4gICAgICB9O1xuICAgICAgZmllbGRzW19vYmplY3RfbmFtZV9rZXldID0gMTtcbiAgICAgIHJlY29yZHMgPSBfb2JqZWN0X2NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIG1vZGlmaWVkOiAxXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiA1XG4gICAgICB9KTtcbiAgICAgIHJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEucHVzaCh7XG4gICAgICAgICAgX2lkOiByZWNvcmQuX2lkLFxuICAgICAgICAgIF9uYW1lOiByZWNvcmRbX29iamVjdF9uYW1lX2tleV0sXG4gICAgICAgICAgX29iamVjdF9uYW1lOiBvYmplY3RfbmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YTtcbn07XG5cbk1ldGVvci5tZXRob2RzKHtcbiAgJ29iamVjdF9yZWNlbnRfcmVjb3JkJzogZnVuY3Rpb24oc3BhY2VJZCkge1xuICAgIHZhciBkYXRhLCByZWNvcmRzO1xuICAgIGRhdGEgPSBuZXcgQXJyYXkoKTtcbiAgICByZWNvcmRzID0gbmV3IEFycmF5KCk7XG4gICAgYXN5bmNfcmVjZW50X2FnZ3JlZ2F0ZSh0aGlzLnVzZXJJZCwgc3BhY2VJZCwgcmVjb3Jkcyk7XG4gICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIHZhciBmaWVsZHMsIHJlY29yZCwgcmVjb3JkX29iamVjdCwgcmVjb3JkX29iamVjdF9jb2xsZWN0aW9uO1xuICAgICAgcmVjb3JkX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KGl0ZW0ub2JqZWN0X25hbWUsIGl0ZW0uc3BhY2UpO1xuICAgICAgaWYgKCFyZWNvcmRfb2JqZWN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlY29yZF9vYmplY3RfY29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihpdGVtLm9iamVjdF9uYW1lLCBpdGVtLnNwYWNlKTtcbiAgICAgIGlmIChyZWNvcmRfb2JqZWN0ICYmIHJlY29yZF9vYmplY3RfY29sbGVjdGlvbikge1xuICAgICAgICBmaWVsZHMgPSB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH07XG4gICAgICAgIGZpZWxkc1tyZWNvcmRfb2JqZWN0Lk5BTUVfRklFTERfS0VZXSA9IDE7XG4gICAgICAgIHJlY29yZCA9IHJlY29yZF9vYmplY3RfY29sbGVjdGlvbi5maW5kT25lKGl0ZW0ucmVjb3JkX2lkWzBdLCB7XG4gICAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5wdXNoKHtcbiAgICAgICAgICAgIF9pZDogcmVjb3JkLl9pZCxcbiAgICAgICAgICAgIF9uYW1lOiByZWNvcmRbcmVjb3JkX29iamVjdC5OQU1FX0ZJRUxEX0tFWV0sXG4gICAgICAgICAgICBfb2JqZWN0X25hbWU6IGl0ZW0ub2JqZWN0X25hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9LFxuICAnb2JqZWN0X3JlY29yZF9zZWFyY2gnOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIGRhdGEsIHNlYXJjaFRleHQsIHNlbGYsIHNwYWNlO1xuICAgIHNlbGYgPSB0aGlzO1xuICAgIGRhdGEgPSBuZXcgQXJyYXkoKTtcbiAgICBzZWFyY2hUZXh0ID0gb3B0aW9ucy5zZWFyY2hUZXh0O1xuICAgIHNwYWNlID0gb3B0aW9ucy5zcGFjZTtcbiAgICBfLmZvckVhY2goQ3JlYXRvci5vYmplY3RzQnlOYW1lLCBmdW5jdGlvbihfb2JqZWN0LCBuYW1lKSB7XG4gICAgICB2YXIgb2JqZWN0X3JlY29yZDtcbiAgICAgIGlmIChfb2JqZWN0LmVuYWJsZV9zZWFyY2gpIHtcbiAgICAgICAgb2JqZWN0X3JlY29yZCA9IHNlYXJjaF9vYmplY3Qoc3BhY2UsIF9vYmplY3QubmFtZSwgc2VsZi51c2VySWQsIHNlYXJjaFRleHQpO1xuICAgICAgICByZXR1cm4gZGF0YSA9IGRhdGEuY29uY2F0KG9iamVjdF9yZWNvcmQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG4gICAgdXBkYXRlX2ZpbHRlcnM6IChsaXN0dmlld19pZCwgZmlsdGVycywgZmlsdGVyX3Njb3BlLCBmaWx0ZXJfbG9naWMpLT5cbiAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3RfbGlzdHZpZXdzLmRpcmVjdC51cGRhdGUoe19pZDogbGlzdHZpZXdfaWR9LCB7JHNldDoge2ZpbHRlcnM6IGZpbHRlcnMsIGZpbHRlcl9zY29wZTogZmlsdGVyX3Njb3BlLCBmaWx0ZXJfbG9naWM6IGZpbHRlcl9sb2dpY319KVxuXG4gICAgdXBkYXRlX2NvbHVtbnM6IChsaXN0dmlld19pZCwgY29sdW1ucyktPlxuICAgICAgICBjaGVjayhjb2x1bW5zLCBBcnJheSlcbiAgICAgICAgXG4gICAgICAgIGlmIGNvbHVtbnMubGVuZ3RoIDwgMVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvciA0MDAsIFwiU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBkaXNwbGF5XCJcbiAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3RfbGlzdHZpZXdzLnVwZGF0ZSh7X2lkOiBsaXN0dmlld19pZH0sIHskc2V0OiB7Y29sdW1uczogY29sdW1uc319KVxuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICB1cGRhdGVfZmlsdGVyczogZnVuY3Rpb24obGlzdHZpZXdfaWQsIGZpbHRlcnMsIGZpbHRlcl9zY29wZSwgZmlsdGVyX2xvZ2ljKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X2xpc3R2aWV3cy5kaXJlY3QudXBkYXRlKHtcbiAgICAgIF9pZDogbGlzdHZpZXdfaWRcbiAgICB9LCB7XG4gICAgICAkc2V0OiB7XG4gICAgICAgIGZpbHRlcnM6IGZpbHRlcnMsXG4gICAgICAgIGZpbHRlcl9zY29wZTogZmlsdGVyX3Njb3BlLFxuICAgICAgICBmaWx0ZXJfbG9naWM6IGZpbHRlcl9sb2dpY1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICB1cGRhdGVfY29sdW1uczogZnVuY3Rpb24obGlzdHZpZXdfaWQsIGNvbHVtbnMpIHtcbiAgICBjaGVjayhjb2x1bW5zLCBBcnJheSk7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsIFwiU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBkaXNwbGF5XCIpO1xuICAgIH1cbiAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3RfbGlzdHZpZXdzLnVwZGF0ZSh7XG4gICAgICBfaWQ6IGxpc3R2aWV3X2lkXG4gICAgfSwge1xuICAgICAgJHNldDoge1xuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHNcblx0J3JlcG9ydF9kYXRhJzogKG9wdGlvbnMpLT5cblx0XHRjaGVjayhvcHRpb25zLCBPYmplY3QpXG5cdFx0c3BhY2UgPSBvcHRpb25zLnNwYWNlXG5cdFx0ZmllbGRzID0gb3B0aW9ucy5maWVsZHNcblx0XHRvYmplY3RfbmFtZSA9IG9wdGlvbnMub2JqZWN0X25hbWVcblx0XHRmaWx0ZXJfc2NvcGUgPSBvcHRpb25zLmZpbHRlcl9zY29wZVxuXHRcdGZpbHRlcnMgPSBvcHRpb25zLmZpbHRlcnNcblx0XHRmaWx0ZXJGaWVsZHMgPSB7fVxuXHRcdGNvbXBvdW5kRmllbGRzID0gW11cblx0XHRvYmplY3RGaWVsZHMgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk/LmZpZWxkc1xuXHRcdF8uZWFjaCBmaWVsZHMsIChpdGVtLCBpbmRleCktPlxuXHRcdFx0c3BsaXRzID0gaXRlbS5zcGxpdChcIi5cIilcblx0XHRcdG5hbWUgPSBzcGxpdHNbMF1cblx0XHRcdG9iamVjdEZpZWxkID0gb2JqZWN0RmllbGRzW25hbWVdXG5cdFx0XHRpZiBzcGxpdHMubGVuZ3RoID4gMSBhbmQgb2JqZWN0RmllbGRcblx0XHRcdFx0Y2hpbGRLZXkgPSBpdGVtLnJlcGxhY2UgbmFtZSArIFwiLlwiLCBcIlwiXG5cdFx0XHRcdGNvbXBvdW5kRmllbGRzLnB1c2goe25hbWU6IG5hbWUsIGNoaWxkS2V5OiBjaGlsZEtleSwgZmllbGQ6IG9iamVjdEZpZWxkfSlcblx0XHRcdGZpbHRlckZpZWxkc1tuYW1lXSA9IDFcblxuXHRcdHNlbGVjdG9yID0ge31cblx0XHR1c2VySWQgPSB0aGlzLnVzZXJJZFxuXHRcdHNlbGVjdG9yLnNwYWNlID0gc3BhY2Vcblx0XHRpZiBmaWx0ZXJfc2NvcGUgPT0gXCJzcGFjZXhcIlxuXHRcdFx0c2VsZWN0b3Iuc3BhY2UgPSBcblx0XHRcdFx0JGluOiBbbnVsbCxzcGFjZV1cblx0XHRlbHNlIGlmIGZpbHRlcl9zY29wZSA9PSBcIm1pbmVcIlxuXHRcdFx0c2VsZWN0b3Iub3duZXIgPSB1c2VySWRcblxuXHRcdGlmIENyZWF0b3IuaXNDb21tb25TcGFjZShzcGFjZSkgJiYgQ3JlYXRvci5pc1NwYWNlQWRtaW4oc3BhY2UsIEB1c2VySWQpXG5cdFx0XHRkZWxldGUgc2VsZWN0b3Iuc3BhY2VcblxuXHRcdGlmIGZpbHRlcnMgYW5kIGZpbHRlcnMubGVuZ3RoID4gMFxuXHRcdFx0c2VsZWN0b3JbXCIkYW5kXCJdID0gZmlsdGVyc1xuXG5cdFx0Y3Vyc29yID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKS5maW5kKHNlbGVjdG9yLCB7ZmllbGRzOiBmaWx0ZXJGaWVsZHMsIHNraXA6IDAsIGxpbWl0OiAxMDAwMH0pXG4jXHRcdGlmIGN1cnNvci5jb3VudCgpID4gMTAwMDBcbiNcdFx0XHRyZXR1cm4gW11cblx0XHRyZXN1bHQgPSBjdXJzb3IuZmV0Y2goKVxuXHRcdGlmIGNvbXBvdW5kRmllbGRzLmxlbmd0aFxuXHRcdFx0cmVzdWx0ID0gcmVzdWx0Lm1hcCAoaXRlbSxpbmRleCktPlxuXHRcdFx0XHRfLmVhY2ggY29tcG91bmRGaWVsZHMsIChjb21wb3VuZEZpZWxkSXRlbSwgaW5kZXgpLT5cblx0XHRcdFx0XHRpdGVtS2V5ID0gY29tcG91bmRGaWVsZEl0ZW0ubmFtZSArIFwiKiUqXCIgKyBjb21wb3VuZEZpZWxkSXRlbS5jaGlsZEtleS5yZXBsYWNlKC9cXC4vZywgXCIqJSpcIilcblx0XHRcdFx0XHRpdGVtVmFsdWUgPSBpdGVtW2NvbXBvdW5kRmllbGRJdGVtLm5hbWVdXG5cdFx0XHRcdFx0dHlwZSA9IGNvbXBvdW5kRmllbGRJdGVtLmZpZWxkLnR5cGVcblx0XHRcdFx0XHRpZiBbXCJsb29rdXBcIiwgXCJtYXN0ZXJfZGV0YWlsXCJdLmluZGV4T2YodHlwZSkgPiAtMVxuXHRcdFx0XHRcdFx0cmVmZXJlbmNlX3RvID0gY29tcG91bmRGaWVsZEl0ZW0uZmllbGQucmVmZXJlbmNlX3RvXG5cdFx0XHRcdFx0XHRjb21wb3VuZEZpbHRlckZpZWxkcyA9IHt9XG5cdFx0XHRcdFx0XHRjb21wb3VuZEZpbHRlckZpZWxkc1tjb21wb3VuZEZpZWxkSXRlbS5jaGlsZEtleV0gPSAxXG5cdFx0XHRcdFx0XHRyZWZlcmVuY2VJdGVtID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlZmVyZW5jZV90bykuZmluZE9uZSB7X2lkOiBpdGVtVmFsdWV9LCBmaWVsZHM6IGNvbXBvdW5kRmlsdGVyRmllbGRzXG5cdFx0XHRcdFx0XHRpZiByZWZlcmVuY2VJdGVtXG5cdFx0XHRcdFx0XHRcdGl0ZW1baXRlbUtleV0gPSByZWZlcmVuY2VJdGVtW2NvbXBvdW5kRmllbGRJdGVtLmNoaWxkS2V5XVxuXHRcdFx0XHRcdGVsc2UgaWYgdHlwZSA9PSBcInNlbGVjdFwiXG5cdFx0XHRcdFx0XHRvcHRpb25zID0gY29tcG91bmRGaWVsZEl0ZW0uZmllbGQub3B0aW9uc1xuXHRcdFx0XHRcdFx0aXRlbVtpdGVtS2V5XSA9IF8uZmluZFdoZXJlKG9wdGlvbnMsIHt2YWx1ZTogaXRlbVZhbHVlfSk/LmxhYmVsIG9yIGl0ZW1WYWx1ZVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGl0ZW1baXRlbUtleV0gPSBpdGVtVmFsdWVcblx0XHRcdFx0XHR1bmxlc3MgaXRlbVtpdGVtS2V5XVxuXHRcdFx0XHRcdFx0aXRlbVtpdGVtS2V5XSA9IFwiLS1cIlxuXHRcdFx0XHRyZXR1cm4gaXRlbVxuXHRcdFx0cmV0dXJuIHJlc3VsdFxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiByZXN1bHRcblxuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICAncmVwb3J0X2RhdGEnOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIGNvbXBvdW5kRmllbGRzLCBjdXJzb3IsIGZpZWxkcywgZmlsdGVyRmllbGRzLCBmaWx0ZXJfc2NvcGUsIGZpbHRlcnMsIG9iamVjdEZpZWxkcywgb2JqZWN0X25hbWUsIHJlZiwgcmVzdWx0LCBzZWxlY3Rvciwgc3BhY2UsIHVzZXJJZDtcbiAgICBjaGVjayhvcHRpb25zLCBPYmplY3QpO1xuICAgIHNwYWNlID0gb3B0aW9ucy5zcGFjZTtcbiAgICBmaWVsZHMgPSBvcHRpb25zLmZpZWxkcztcbiAgICBvYmplY3RfbmFtZSA9IG9wdGlvbnMub2JqZWN0X25hbWU7XG4gICAgZmlsdGVyX3Njb3BlID0gb3B0aW9ucy5maWx0ZXJfc2NvcGU7XG4gICAgZmlsdGVycyA9IG9wdGlvbnMuZmlsdGVycztcbiAgICBmaWx0ZXJGaWVsZHMgPSB7fTtcbiAgICBjb21wb3VuZEZpZWxkcyA9IFtdO1xuICAgIG9iamVjdEZpZWxkcyA9IChyZWYgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSkpICE9IG51bGwgPyByZWYuZmllbGRzIDogdm9pZCAwO1xuICAgIF8uZWFjaChmaWVsZHMsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICB2YXIgY2hpbGRLZXksIG5hbWUsIG9iamVjdEZpZWxkLCBzcGxpdHM7XG4gICAgICBzcGxpdHMgPSBpdGVtLnNwbGl0KFwiLlwiKTtcbiAgICAgIG5hbWUgPSBzcGxpdHNbMF07XG4gICAgICBvYmplY3RGaWVsZCA9IG9iamVjdEZpZWxkc1tuYW1lXTtcbiAgICAgIGlmIChzcGxpdHMubGVuZ3RoID4gMSAmJiBvYmplY3RGaWVsZCkge1xuICAgICAgICBjaGlsZEtleSA9IGl0ZW0ucmVwbGFjZShuYW1lICsgXCIuXCIsIFwiXCIpO1xuICAgICAgICBjb21wb3VuZEZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIGNoaWxkS2V5OiBjaGlsZEtleSxcbiAgICAgICAgICBmaWVsZDogb2JqZWN0RmllbGRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyRmllbGRzW25hbWVdID0gMTtcbiAgICB9KTtcbiAgICBzZWxlY3RvciA9IHt9O1xuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICAgIHNlbGVjdG9yLnNwYWNlID0gc3BhY2U7XG4gICAgaWYgKGZpbHRlcl9zY29wZSA9PT0gXCJzcGFjZXhcIikge1xuICAgICAgc2VsZWN0b3Iuc3BhY2UgPSB7XG4gICAgICAgICRpbjogW251bGwsIHNwYWNlXVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlcl9zY29wZSA9PT0gXCJtaW5lXCIpIHtcbiAgICAgIHNlbGVjdG9yLm93bmVyID0gdXNlcklkO1xuICAgIH1cbiAgICBpZiAoQ3JlYXRvci5pc0NvbW1vblNwYWNlKHNwYWNlKSAmJiBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZSwgdGhpcy51c2VySWQpKSB7XG4gICAgICBkZWxldGUgc2VsZWN0b3Iuc3BhY2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgc2VsZWN0b3JbXCIkYW5kXCJdID0gZmlsdGVycztcbiAgICB9XG4gICAgY3Vyc29yID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKS5maW5kKHNlbGVjdG9yLCB7XG4gICAgICBmaWVsZHM6IGZpbHRlckZpZWxkcyxcbiAgICAgIHNraXA6IDAsXG4gICAgICBsaW1pdDogMTAwMDBcbiAgICB9KTtcbiAgICByZXN1bHQgPSBjdXJzb3IuZmV0Y2goKTtcbiAgICBpZiAoY29tcG91bmRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIF8uZWFjaChjb21wb3VuZEZpZWxkcywgZnVuY3Rpb24oY29tcG91bmRGaWVsZEl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgdmFyIGNvbXBvdW5kRmlsdGVyRmllbGRzLCBpdGVtS2V5LCBpdGVtVmFsdWUsIHJlZjEsIHJlZmVyZW5jZUl0ZW0sIHJlZmVyZW5jZV90bywgdHlwZTtcbiAgICAgICAgICBpdGVtS2V5ID0gY29tcG91bmRGaWVsZEl0ZW0ubmFtZSArIFwiKiUqXCIgKyBjb21wb3VuZEZpZWxkSXRlbS5jaGlsZEtleS5yZXBsYWNlKC9cXC4vZywgXCIqJSpcIik7XG4gICAgICAgICAgaXRlbVZhbHVlID0gaXRlbVtjb21wb3VuZEZpZWxkSXRlbS5uYW1lXTtcbiAgICAgICAgICB0eXBlID0gY29tcG91bmRGaWVsZEl0ZW0uZmllbGQudHlwZTtcbiAgICAgICAgICBpZiAoW1wibG9va3VwXCIsIFwibWFzdGVyX2RldGFpbFwiXS5pbmRleE9mKHR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZV90byA9IGNvbXBvdW5kRmllbGRJdGVtLmZpZWxkLnJlZmVyZW5jZV90bztcbiAgICAgICAgICAgIGNvbXBvdW5kRmlsdGVyRmllbGRzID0ge307XG4gICAgICAgICAgICBjb21wb3VuZEZpbHRlckZpZWxkc1tjb21wb3VuZEZpZWxkSXRlbS5jaGlsZEtleV0gPSAxO1xuICAgICAgICAgICAgcmVmZXJlbmNlSXRlbSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWZlcmVuY2VfdG8pLmZpbmRPbmUoe1xuICAgICAgICAgICAgICBfaWQ6IGl0ZW1WYWx1ZVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBmaWVsZHM6IGNvbXBvdW5kRmlsdGVyRmllbGRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VJdGVtKSB7XG4gICAgICAgICAgICAgIGl0ZW1baXRlbUtleV0gPSByZWZlcmVuY2VJdGVtW2NvbXBvdW5kRmllbGRJdGVtLmNoaWxkS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjb21wb3VuZEZpZWxkSXRlbS5maWVsZC5vcHRpb25zO1xuICAgICAgICAgICAgaXRlbVtpdGVtS2V5XSA9ICgocmVmMSA9IF8uZmluZFdoZXJlKG9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1WYWx1ZVxuICAgICAgICAgICAgfSkpICE9IG51bGwgPyByZWYxLmxhYmVsIDogdm9pZCAwKSB8fCBpdGVtVmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1baXRlbUtleV0gPSBpdGVtVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXRlbVtpdGVtS2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1baXRlbUtleV0gPSBcIi0tXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG59KTtcbiIsIiMjI1xuICAgIHR5cGU6IFwidXNlclwiXG4gICAgb2JqZWN0X25hbWU6IFwib2JqZWN0X2xpc3R2aWV3c1wiXG4gICAgcmVjb3JkX2lkOiBcIntvYmplY3RfbmFtZX0se2xpc3R2aWV3X2lkfVwiXG4gICAgc2V0dGluZ3M6XG4gICAgICAgIGNvbHVtbl93aWR0aDogeyBmaWVsZF9hOiAxMDAsIGZpZWxkXzI6IDE1MCB9XG4gICAgICAgIHNvcnQ6IFtbXCJmaWVsZF9hXCIsIFwiZGVzY1wiXV1cbiAgICBvd25lcjoge3VzZXJJZH1cbiMjI1xuXG5NZXRlb3IubWV0aG9kc1xuICAgIFwidGFidWxhcl9zb3J0X3NldHRpbmdzXCI6IChvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBzb3J0KS0+XG4gICAgICAgIHVzZXJJZCA9IHRoaXMudXNlcklkXG4gICAgICAgIHNldHRpbmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmRPbmUoe29iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIiwgb3duZXI6IHVzZXJJZH0pXG4gICAgICAgIGlmIHNldHRpbmdcbiAgICAgICAgICAgIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MudXBkYXRlKHtfaWQ6IHNldHRpbmcuX2lkfSwgeyRzZXQ6IHtcInNldHRpbmdzLiN7bGlzdF92aWV3X2lkfS5zb3J0XCI6IHNvcnR9fSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jID0gXG4gICAgICAgICAgICAgICAgdHlwZTogXCJ1c2VyXCJcbiAgICAgICAgICAgICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWVcbiAgICAgICAgICAgICAgICByZWNvcmRfaWQ6IFwib2JqZWN0X2xpc3R2aWV3c1wiXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9XG4gICAgICAgICAgICAgICAgb3duZXI6IHVzZXJJZFxuXG4gICAgICAgICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXSA9IHt9XG4gICAgICAgICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXS5zb3J0ID0gc29ydFxuXG4gICAgICAgICAgICBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmluc2VydChkb2MpXG5cbiAgICBcInRhYnVsYXJfY29sdW1uX3dpZHRoX3NldHRpbmdzXCI6IChvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBjb2x1bW5fd2lkdGgpLT5cbiAgICAgICAgdXNlcklkID0gdGhpcy51c2VySWRcbiAgICAgICAgc2V0dGluZyA9IENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuZmluZE9uZSh7b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLCByZWNvcmRfaWQ6IFwib2JqZWN0X2xpc3R2aWV3c1wiLCBvd25lcjogdXNlcklkfSlcbiAgICAgICAgaWYgc2V0dGluZ1xuICAgICAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy51cGRhdGUoe19pZDogc2V0dGluZy5faWR9LCB7JHNldDoge1wic2V0dGluZ3MuI3tsaXN0X3ZpZXdfaWR9LmNvbHVtbl93aWR0aFwiOiBjb2x1bW5fd2lkdGh9fSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jID0gXG4gICAgICAgICAgICAgICAgdHlwZTogXCJ1c2VyXCJcbiAgICAgICAgICAgICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWVcbiAgICAgICAgICAgICAgICByZWNvcmRfaWQ6IFwib2JqZWN0X2xpc3R2aWV3c1wiXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9XG4gICAgICAgICAgICAgICAgb3duZXI6IHVzZXJJZFxuXG4gICAgICAgICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXSA9IHt9XG4gICAgICAgICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXS5jb2x1bW5fd2lkdGggPSBjb2x1bW5fd2lkdGhcblxuICAgICAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5pbnNlcnQoZG9jKVxuXG4gICAgXCJncmlkX3NldHRpbmdzXCI6IChvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBjb2x1bW5fd2lkdGgsIHNvcnQpLT5cbiAgICAgICAgdXNlcklkID0gdGhpcy51c2VySWRcbiAgICAgICAgc2V0dGluZyA9IENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuZmluZE9uZSh7b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLCByZWNvcmRfaWQ6IFwib2JqZWN0X2dyaWR2aWV3c1wiLCBvd25lcjogdXNlcklkfSlcbiAgICAgICAgaWYgc2V0dGluZ1xuICAgICAgICAgICAgIyDmr4/mrKHpg73lvLrliLbmlLnlj5hfaWRfYWN0aW9uc+WIl+eahOWuveW6pu+8jOS7peino+WGs+W9k+eUqOaIt+WPquaUueWPmOWtl+auteasoeW6j+iAjOayoeacieaUueWPmOS7u+S9leWtl+auteWuveW6puaXtu+8jOWJjeerr+ayoeacieiuoumYheWIsOWtl+auteasoeW6j+WPmOabtOeahOaVsOaNrueahOmXrumimFxuICAgICAgICAgICAgY29sdW1uX3dpZHRoLl9pZF9hY3Rpb25zID0gaWYgc2V0dGluZy5zZXR0aW5nc1tcIiN7bGlzdF92aWV3X2lkfVwiXT8uY29sdW1uX3dpZHRoPy5faWRfYWN0aW9ucyA9PSA0NiB0aGVuIDQ3IGVsc2UgNDZcbiAgICAgICAgICAgIGlmIHNvcnRcbiAgICAgICAgICAgICAgICBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLnVwZGF0ZSh7X2lkOiBzZXR0aW5nLl9pZH0sIHskc2V0OiB7XCJzZXR0aW5ncy4je2xpc3Rfdmlld19pZH0uc29ydFwiOiBzb3J0LCBcInNldHRpbmdzLiN7bGlzdF92aWV3X2lkfS5jb2x1bW5fd2lkdGhcIjogY29sdW1uX3dpZHRofX0pXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy51cGRhdGUoe19pZDogc2V0dGluZy5faWR9LCB7JHNldDoge1wic2V0dGluZ3MuI3tsaXN0X3ZpZXdfaWR9LmNvbHVtbl93aWR0aFwiOiBjb2x1bW5fd2lkdGh9fSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jID1cbiAgICAgICAgICAgICAgICB0eXBlOiBcInVzZXJcIlxuICAgICAgICAgICAgICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZVxuICAgICAgICAgICAgICAgIHJlY29yZF9pZDogXCJvYmplY3RfZ3JpZHZpZXdzXCJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczoge31cbiAgICAgICAgICAgICAgICBvd25lcjogdXNlcklkXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdID0ge31cbiAgICAgICAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdLmNvbHVtbl93aWR0aCA9IGNvbHVtbl93aWR0aFxuICAgICAgICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0uc29ydCA9IHNvcnRcblxuICAgICAgICAgICAgQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5pbnNlcnQoZG9jKSIsIlxuLypcbiAgICB0eXBlOiBcInVzZXJcIlxuICAgIG9iamVjdF9uYW1lOiBcIm9iamVjdF9saXN0dmlld3NcIlxuICAgIHJlY29yZF9pZDogXCJ7b2JqZWN0X25hbWV9LHtsaXN0dmlld19pZH1cIlxuICAgIHNldHRpbmdzOlxuICAgICAgICBjb2x1bW5fd2lkdGg6IHsgZmllbGRfYTogMTAwLCBmaWVsZF8yOiAxNTAgfVxuICAgICAgICBzb3J0OiBbW1wiZmllbGRfYVwiLCBcImRlc2NcIl1dXG4gICAgb3duZXI6IHt1c2VySWR9XG4gKi9cbk1ldGVvci5tZXRob2RzKHtcbiAgXCJ0YWJ1bGFyX3NvcnRfc2V0dGluZ3NcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgc29ydCkge1xuICAgIHZhciBkb2MsIG9iaiwgc2V0dGluZywgdXNlcklkO1xuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICAgIHNldHRpbmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmRPbmUoe1xuICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIixcbiAgICAgIG93bmVyOiB1c2VySWRcbiAgICB9KTtcbiAgICBpZiAoc2V0dGluZykge1xuICAgICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MudXBkYXRlKHtcbiAgICAgICAgX2lkOiBzZXR0aW5nLl9pZFxuICAgICAgfSwge1xuICAgICAgICAkc2V0OiAoXG4gICAgICAgICAgb2JqID0ge30sXG4gICAgICAgICAgb2JqW1wic2V0dGluZ3MuXCIgKyBsaXN0X3ZpZXdfaWQgKyBcIi5zb3J0XCJdID0gc29ydCxcbiAgICAgICAgICBvYmpcbiAgICAgICAgKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvYyA9IHtcbiAgICAgICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIixcbiAgICAgICAgc2V0dGluZ3M6IHt9LFxuICAgICAgICBvd25lcjogdXNlcklkXG4gICAgICB9O1xuICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0gPSB7fTtcbiAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdLnNvcnQgPSBzb3J0O1xuICAgICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuaW5zZXJ0KGRvYyk7XG4gICAgfVxuICB9LFxuICBcInRhYnVsYXJfY29sdW1uX3dpZHRoX3NldHRpbmdzXCI6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQsIGNvbHVtbl93aWR0aCkge1xuICAgIHZhciBkb2MsIG9iaiwgc2V0dGluZywgdXNlcklkO1xuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICAgIHNldHRpbmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmRPbmUoe1xuICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIixcbiAgICAgIG93bmVyOiB1c2VySWRcbiAgICB9KTtcbiAgICBpZiAoc2V0dGluZykge1xuICAgICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MudXBkYXRlKHtcbiAgICAgICAgX2lkOiBzZXR0aW5nLl9pZFxuICAgICAgfSwge1xuICAgICAgICAkc2V0OiAoXG4gICAgICAgICAgb2JqID0ge30sXG4gICAgICAgICAgb2JqW1wic2V0dGluZ3MuXCIgKyBsaXN0X3ZpZXdfaWQgKyBcIi5jb2x1bW5fd2lkdGhcIl0gPSBjb2x1bW5fd2lkdGgsXG4gICAgICAgICAgb2JqXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2MgPSB7XG4gICAgICAgIHR5cGU6IFwidXNlclwiLFxuICAgICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG4gICAgICAgIHJlY29yZF9pZDogXCJvYmplY3RfbGlzdHZpZXdzXCIsXG4gICAgICAgIHNldHRpbmdzOiB7fSxcbiAgICAgICAgb3duZXI6IHVzZXJJZFxuICAgICAgfTtcbiAgICAgIGRvYy5zZXR0aW5nc1tsaXN0X3ZpZXdfaWRdID0ge307XG4gICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXS5jb2x1bW5fd2lkdGggPSBjb2x1bW5fd2lkdGg7XG4gICAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5pbnNlcnQoZG9jKTtcbiAgICB9XG4gIH0sXG4gIFwiZ3JpZF9zZXR0aW5nc1wiOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBjb2x1bW5fd2lkdGgsIHNvcnQpIHtcbiAgICB2YXIgZG9jLCBvYmosIG9iajEsIHJlZiwgcmVmMSwgc2V0dGluZywgdXNlcklkO1xuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICAgIHNldHRpbmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLmZpbmRPbmUoe1xuICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgcmVjb3JkX2lkOiBcIm9iamVjdF9ncmlkdmlld3NcIixcbiAgICAgIG93bmVyOiB1c2VySWRcbiAgICB9KTtcbiAgICBpZiAoc2V0dGluZykge1xuICAgICAgY29sdW1uX3dpZHRoLl9pZF9hY3Rpb25zID0gKChyZWYgPSBzZXR0aW5nLnNldHRpbmdzW1wiXCIgKyBsaXN0X3ZpZXdfaWRdKSAhPSBudWxsID8gKHJlZjEgPSByZWYuY29sdW1uX3dpZHRoKSAhPSBudWxsID8gcmVmMS5faWRfYWN0aW9ucyA6IHZvaWQgMCA6IHZvaWQgMCkgPT09IDQ2ID8gNDcgOiA0NjtcbiAgICAgIGlmIChzb3J0KSB7XG4gICAgICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zLnNldHRpbmdzLnVwZGF0ZSh7XG4gICAgICAgICAgX2lkOiBzZXR0aW5nLl9pZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHNldDogKFxuICAgICAgICAgICAgb2JqID0ge30sXG4gICAgICAgICAgICBvYmpbXCJzZXR0aW5ncy5cIiArIGxpc3Rfdmlld19pZCArIFwiLnNvcnRcIl0gPSBzb3J0LFxuICAgICAgICAgICAgb2JqW1wic2V0dGluZ3MuXCIgKyBsaXN0X3ZpZXdfaWQgKyBcIi5jb2x1bW5fd2lkdGhcIl0gPSBjb2x1bW5fd2lkdGgsXG4gICAgICAgICAgICBvYmpcbiAgICAgICAgICApXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MudXBkYXRlKHtcbiAgICAgICAgICBfaWQ6IHNldHRpbmcuX2lkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAkc2V0OiAoXG4gICAgICAgICAgICBvYmoxID0ge30sXG4gICAgICAgICAgICBvYmoxW1wic2V0dGluZ3MuXCIgKyBsaXN0X3ZpZXdfaWQgKyBcIi5jb2x1bW5fd2lkdGhcIl0gPSBjb2x1bW5fd2lkdGgsXG4gICAgICAgICAgICBvYmoxXG4gICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZG9jID0ge1xuICAgICAgICB0eXBlOiBcInVzZXJcIixcbiAgICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgICByZWNvcmRfaWQ6IFwib2JqZWN0X2dyaWR2aWV3c1wiLFxuICAgICAgICBzZXR0aW5nczoge30sXG4gICAgICAgIG93bmVyOiB1c2VySWRcbiAgICAgIH07XG4gICAgICBkb2Muc2V0dGluZ3NbbGlzdF92aWV3X2lkXSA9IHt9O1xuICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0uY29sdW1uX3dpZHRoID0gY29sdW1uX3dpZHRoO1xuICAgICAgZG9jLnNldHRpbmdzW2xpc3Rfdmlld19pZF0uc29ydCA9IHNvcnQ7XG4gICAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5zZXR0aW5ncy5pbnNlcnQoZG9jKTtcbiAgICB9XG4gIH1cbn0pO1xuIiwieG1sMmpzID0gcmVxdWlyZSAneG1sMmpzJ1xuZnMgPSByZXF1aXJlICdmcydcbnBhdGggPSByZXF1aXJlICdwYXRoJ1xubWtkaXJwID0gcmVxdWlyZSAnbWtkaXJwJ1xuXG5sb2dnZXIgPSBuZXcgTG9nZ2VyICdFeHBvcnRfVE9fWE1MJ1xuXG5fd3JpdGVYbWxGaWxlID0gKGpzb25PYmosb2JqTmFtZSkgLT5cblx0IyDovax4bWxcblx0YnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcigpXG5cdHhtbCA9IGJ1aWxkZXIuYnVpbGRPYmplY3QganNvbk9ialxuXG5cdCMg6L2s5Li6YnVmZmVyXG5cdHN0cmVhbSA9IG5ldyBCdWZmZXIgeG1sXG5cblx0IyDmoLnmja7lvZPlpKnml7bpl7TnmoTlubTmnIjml6XkvZzkuLrlrZjlgqjot6/lvoRcblx0bm93ID0gbmV3IERhdGVcblx0eWVhciA9IG5vdy5nZXRGdWxsWWVhcigpXG5cdG1vbnRoID0gbm93LmdldE1vbnRoKCkgKyAxXG5cdGRheSA9IG5vdy5nZXREYXRlKClcblxuXHQjIOaWh+S7tui3r+W+hFxuXHRmaWxlUGF0aCA9IHBhdGguam9pbihfX21ldGVvcl9ib290c3RyYXBfXy5zZXJ2ZXJEaXIsJy4uLy4uLy4uL2V4cG9ydC8nICsgeWVhciArICcvJyArIG1vbnRoICsgJy8nICsgZGF5ICsgJy8nICsgb2JqTmFtZSApXG5cdGZpbGVOYW1lID0ganNvbk9iaj8uX2lkICsgXCIueG1sXCJcblx0ZmlsZUFkZHJlc3MgPSBwYXRoLmpvaW4gZmlsZVBhdGgsIGZpbGVOYW1lXG5cblx0aWYgIWZzLmV4aXN0c1N5bmMgZmlsZVBhdGhcblx0XHRta2RpcnAuc3luYyBmaWxlUGF0aFxuXG5cdCMg5YaZ5YWl5paH5Lu2XG5cdGZzLndyaXRlRmlsZSBmaWxlQWRkcmVzcywgc3RyZWFtLCAoZXJyKSAtPlxuXHRcdGlmIGVyclxuXHRcdFx0bG9nZ2VyLmVycm9yIFwiI3tqc29uT2JqLl9pZH3lhpnlhaV4bWzmlofku7blpLHotKVcIixlcnJcblx0XG5cdHJldHVybiBmaWxlUGF0aFxuXG5cbiMg5pW055CGRmllbGRz55qEanNvbuaVsOaNrlxuX21peEZpZWxkc0RhdGEgPSAob2JqLG9iak5hbWUpIC0+XG5cdCMg5Yid5aeL5YyW5a+56LGh5pWw5o2uXG5cdGpzb25PYmogPSB7fVxuXHQjIOiOt+WPlmZpZWxkc1xuXHRvYmpGaWVsZHMgPSBDcmVhdG9yPy5nZXRPYmplY3Qob2JqTmFtZSk/LmZpZWxkc1xuXG5cdG1peERlZmF1bHQgPSAoZmllbGRfbmFtZSktPlxuXHRcdGpzb25PYmpbZmllbGRfbmFtZV0gPSBvYmpbZmllbGRfbmFtZV0gfHwgXCJcIlxuXG5cdG1peERhdGUgPSAoZmllbGRfbmFtZSx0eXBlKS0+XG5cdFx0ZGF0ZSA9IG9ialtmaWVsZF9uYW1lXVxuXHRcdGlmIHR5cGUgPT0gXCJkYXRlXCJcblx0XHRcdGZvcm1hdCA9IFwiWVlZWS1NTS1ERFwiXG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybWF0ID0gXCJZWVlZLU1NLUREIEhIOm1tOnNzXCJcblx0XHRpZiBkYXRlPyBhbmQgZm9ybWF0P1xuXHRcdFx0ZGF0ZVN0ciA9IG1vbWVudChkYXRlKS5mb3JtYXQoZm9ybWF0KVxuXHRcdGpzb25PYmpbZmllbGRfbmFtZV0gPSBkYXRlU3RyIHx8IFwiXCJcblxuXHRtaXhCb29sID0gKGZpZWxkX25hbWUpLT5cblx0XHRpZiBvYmpbZmllbGRfbmFtZV0gPT0gdHJ1ZVxuXHRcdFx0anNvbk9ialtmaWVsZF9uYW1lXSA9IFwi5pivXCJcblx0XHRlbHNlIGlmIG9ialtmaWVsZF9uYW1lXSA9PSBmYWxzZVxuXHRcdFx0anNvbk9ialtmaWVsZF9uYW1lXSA9IFwi5ZCmXCJcblx0XHRlbHNlXG5cdFx0XHRqc29uT2JqW2ZpZWxkX25hbWVdID0gXCJcIlxuXG5cdCMg5b6q546v5q+P5LiqZmllbGRzLOW5tuWIpOaWreWPluWAvFxuXHRfLmVhY2ggb2JqRmllbGRzLCAoZmllbGQsIGZpZWxkX25hbWUpLT5cblx0XHRzd2l0Y2ggZmllbGQ/LnR5cGVcblx0XHRcdHdoZW4gXCJkYXRlXCIsXCJkYXRldGltZVwiIHRoZW4gbWl4RGF0ZSBmaWVsZF9uYW1lLGZpZWxkLnR5cGVcblx0XHRcdHdoZW4gXCJib29sZWFuXCIgdGhlbiBtaXhCb29sIGZpZWxkX25hbWVcblx0XHRcdGVsc2UgbWl4RGVmYXVsdCBmaWVsZF9uYW1lXG5cblx0cmV0dXJuIGpzb25PYmpcblxuIyDojrflj5blrZDooajmlbTnkIbmlbDmja5cbl9taXhSZWxhdGVkRGF0YSA9IChvYmosb2JqTmFtZSkgLT5cblx0IyDliJ3lp4vljJblr7nosaHmlbDmja5cblx0cmVsYXRlZF9vYmplY3RzID0ge31cblxuXHQjIOiOt+WPluebuOWFs+ihqFxuXHRyZWxhdGVkT2JqTmFtZXMgPSBDcmVhdG9yPy5nZXRBbGxSZWxhdGVkT2JqZWN0cyBvYmpOYW1lXG5cblx0IyDlvqrnjq/nm7jlhbPooahcblx0cmVsYXRlZE9iak5hbWVzLmZvckVhY2ggKHJlbGF0ZWRPYmpOYW1lKSAtPlxuXHRcdCMg5q+P5Liq6KGo5a6a5LmJ5LiA5Liq5a+56LGh5pWw57uEXG5cdFx0cmVsYXRlZFRhYmxlRGF0YSA9IFtdXG5cblx0XHQjICrorr7nva7lhbPogZTmkJzntKLmn6Xor6LnmoTlrZfmrrVcblx0XHQjIOmZhOS7tueahOWFs+iBlOaQnOe0ouWtl+auteaYr+Wumuatu+eahFxuXHRcdGlmIHJlbGF0ZWRPYmpOYW1lID09IFwiY21zX2ZpbGVzXCJcblx0XHRcdHJlbGF0ZWRfZmllbGRfbmFtZSA9IFwicGFyZW50Lmlkc1wiXG5cdFx0ZWxzZVxuXHRcdFx0IyDojrflj5ZmaWVsZHNcblx0XHRcdGZpZWxkcyA9IENyZWF0b3I/Lk9iamVjdHNbcmVsYXRlZE9iak5hbWVdPy5maWVsZHNcblx0XHRcdCMg5b6q546v5q+P5LiqZmllbGQs5om+5Ye6cmVmZXJlbmNlX3Rv55qE5YWz6IGU5a2X5q61XG5cdFx0XHRyZWxhdGVkX2ZpZWxkX25hbWUgPSBcIlwiXG5cdFx0XHRfLmVhY2ggZmllbGRzLCAoZmllbGQsIGZpZWxkX25hbWUpLT5cblx0XHRcdFx0aWYgZmllbGQ/LnJlZmVyZW5jZV90byA9PSBvYmpOYW1lXG5cdFx0XHRcdFx0cmVsYXRlZF9maWVsZF9uYW1lID0gZmllbGRfbmFtZVxuXG5cdFx0IyDmoLnmja7mib7lh7rnmoTlhbPogZTlrZfmrrXvvIzmn6XlrZDooajmlbDmja5cblx0XHRpZiByZWxhdGVkX2ZpZWxkX25hbWVcblx0XHRcdHJlbGF0ZWRDb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlbGF0ZWRPYmpOYW1lKVxuXHRcdFx0IyDojrflj5bliLDmiYDmnInnmoTmlbDmja5cblx0XHRcdHJlbGF0ZWRSZWNvcmRMaXN0ID0gcmVsYXRlZENvbGxlY3Rpb24uZmluZCh7XCIje3JlbGF0ZWRfZmllbGRfbmFtZX1cIjpvYmouX2lkfSkuZmV0Y2goKVxuXHRcdFx0IyDlvqrnjq/mr4/kuIDmnaHmlbDmja5cblx0XHRcdHJlbGF0ZWRSZWNvcmRMaXN0LmZvckVhY2ggKHJlbGF0ZWRPYmopLT5cblx0XHRcdFx0IyDmlbTlkIhmaWVsZHPmlbDmja5cblx0XHRcdFx0ZmllbGRzRGF0YSA9IF9taXhGaWVsZHNEYXRhIHJlbGF0ZWRPYmoscmVsYXRlZE9iak5hbWVcblx0XHRcdFx0IyDmiorkuIDmnaHorrDlvZXmj5LlhaXliLDlr7nosaHmlbDnu4TkuK1cblx0XHRcdFx0cmVsYXRlZFRhYmxlRGF0YS5wdXNoIGZpZWxkc0RhdGFcblxuXHRcdCMg5oqK5LiA5Liq5a2Q6KGo55qE5omA5pyJ5pWw5o2u5o+S5YWl5YiwcmVsYXRlZF9vYmplY3Rz5Lit77yM5YaN5b6q546v5LiL5LiA5LiqXG5cdFx0cmVsYXRlZF9vYmplY3RzW3JlbGF0ZWRPYmpOYW1lXSA9IHJlbGF0ZWRUYWJsZURhdGFcblxuXHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cbiMgQ3JlYXRvci5FeHBvcnQyeG1sKClcbkNyZWF0b3IuRXhwb3J0MnhtbCA9IChvYmpOYW1lLCByZWNvcmRMaXN0KSAtPlxuXHRsb2dnZXIuaW5mbyBcIlJ1biBDcmVhdG9yLkV4cG9ydDJ4bWxcIlxuXG5cdGNvbnNvbGUudGltZSBcIkNyZWF0b3IuRXhwb3J0MnhtbFwiXG5cblx0IyDmtYvor5XmlbDmja5cblx0IyBvYmpOYW1lID0gXCJhcmNoaXZlX3JlY29yZHNcIlxuXG5cdCMg5p+l5om+5a+56LGh5pWw5o2uXG5cdGNvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqTmFtZSlcblx0IyDmtYvor5XmlbDmja5cblx0cmVjb3JkTGlzdCA9IGNvbGxlY3Rpb24uZmluZCh7fSkuZmV0Y2goKVxuXG5cdHJlY29yZExpc3QuZm9yRWFjaCAocmVjb3JkT2JqKS0+XG5cdFx0anNvbk9iaiA9IHt9XG5cdFx0anNvbk9iai5faWQgPSByZWNvcmRPYmouX2lkXG5cblx0XHQjIOaVtOeQhuS4u+ihqOeahEZpZWxkc+aVsOaNrlxuXHRcdGZpZWxkc0RhdGEgPSBfbWl4RmllbGRzRGF0YSByZWNvcmRPYmosb2JqTmFtZVxuXHRcdGpzb25PYmpbb2JqTmFtZV0gPSBmaWVsZHNEYXRhXG5cblx0XHQjIOaVtOeQhuebuOWFs+ihqOaVsOaNrlxuXHRcdHJlbGF0ZWRfb2JqZWN0cyA9IF9taXhSZWxhdGVkRGF0YSByZWNvcmRPYmosb2JqTmFtZVxuXG5cdFx0anNvbk9ialtcInJlbGF0ZWRfb2JqZWN0c1wiXSA9IHJlbGF0ZWRfb2JqZWN0c1xuXG5cdFx0IyDovazkuLp4bWzkv53lrZjmlofku7Zcblx0XHRmaWxlUGF0aCA9IF93cml0ZVhtbEZpbGUganNvbk9iaixvYmpOYW1lXG5cblx0Y29uc29sZS50aW1lRW5kIFwiQ3JlYXRvci5FeHBvcnQyeG1sXCJcblx0cmV0dXJuIGZpbGVQYXRoIiwidmFyIF9taXhGaWVsZHNEYXRhLCBfbWl4UmVsYXRlZERhdGEsIF93cml0ZVhtbEZpbGUsIGZzLCBsb2dnZXIsIG1rZGlycCwgcGF0aCwgeG1sMmpzO1xuXG54bWwyanMgPSByZXF1aXJlKCd4bWwyanMnKTtcblxuZnMgPSByZXF1aXJlKCdmcycpO1xuXG5wYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG5ta2RpcnAgPSByZXF1aXJlKCdta2RpcnAnKTtcblxubG9nZ2VyID0gbmV3IExvZ2dlcignRXhwb3J0X1RPX1hNTCcpO1xuXG5fd3JpdGVYbWxGaWxlID0gZnVuY3Rpb24oanNvbk9iaiwgb2JqTmFtZSkge1xuICB2YXIgYnVpbGRlciwgZGF5LCBmaWxlQWRkcmVzcywgZmlsZU5hbWUsIGZpbGVQYXRoLCBtb250aCwgbm93LCBzdHJlYW0sIHhtbCwgeWVhcjtcbiAgYnVpbGRlciA9IG5ldyB4bWwyanMuQnVpbGRlcigpO1xuICB4bWwgPSBidWlsZGVyLmJ1aWxkT2JqZWN0KGpzb25PYmopO1xuICBzdHJlYW0gPSBuZXcgQnVmZmVyKHhtbCk7XG4gIG5vdyA9IG5ldyBEYXRlO1xuICB5ZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gIG1vbnRoID0gbm93LmdldE1vbnRoKCkgKyAxO1xuICBkYXkgPSBub3cuZ2V0RGF0ZSgpO1xuICBmaWxlUGF0aCA9IHBhdGguam9pbihfX21ldGVvcl9ib290c3RyYXBfXy5zZXJ2ZXJEaXIsICcuLi8uLi8uLi9leHBvcnQvJyArIHllYXIgKyAnLycgKyBtb250aCArICcvJyArIGRheSArICcvJyArIG9iak5hbWUpO1xuICBmaWxlTmFtZSA9IChqc29uT2JqICE9IG51bGwgPyBqc29uT2JqLl9pZCA6IHZvaWQgMCkgKyBcIi54bWxcIjtcbiAgZmlsZUFkZHJlc3MgPSBwYXRoLmpvaW4oZmlsZVBhdGgsIGZpbGVOYW1lKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIG1rZGlycC5zeW5jKGZpbGVQYXRoKTtcbiAgfVxuICBmcy53cml0ZUZpbGUoZmlsZUFkZHJlc3MsIHN0cmVhbSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIGxvZ2dlci5lcnJvcihqc29uT2JqLl9pZCArIFwi5YaZ5YWleG1s5paH5Lu25aSx6LSlXCIsIGVycik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufTtcblxuX21peEZpZWxkc0RhdGEgPSBmdW5jdGlvbihvYmosIG9iak5hbWUpIHtcbiAgdmFyIGpzb25PYmosIG1peEJvb2wsIG1peERhdGUsIG1peERlZmF1bHQsIG9iakZpZWxkcywgcmVmO1xuICBqc29uT2JqID0ge307XG4gIG9iakZpZWxkcyA9IHR5cGVvZiBDcmVhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIENyZWF0b3IgIT09IG51bGwgPyAocmVmID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqTmFtZSkpICE9IG51bGwgPyByZWYuZmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICBtaXhEZWZhdWx0ID0gZnVuY3Rpb24oZmllbGRfbmFtZSkge1xuICAgIHJldHVybiBqc29uT2JqW2ZpZWxkX25hbWVdID0gb2JqW2ZpZWxkX25hbWVdIHx8IFwiXCI7XG4gIH07XG4gIG1peERhdGUgPSBmdW5jdGlvbihmaWVsZF9uYW1lLCB0eXBlKSB7XG4gICAgdmFyIGRhdGUsIGRhdGVTdHIsIGZvcm1hdDtcbiAgICBkYXRlID0gb2JqW2ZpZWxkX25hbWVdO1xuICAgIGlmICh0eXBlID09PSBcImRhdGVcIikge1xuICAgICAgZm9ybWF0ID0gXCJZWVlZLU1NLUREXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdCA9IFwiWVlZWS1NTS1ERCBISDptbTpzc1wiO1xuICAgIH1cbiAgICBpZiAoKGRhdGUgIT0gbnVsbCkgJiYgKGZvcm1hdCAhPSBudWxsKSkge1xuICAgICAgZGF0ZVN0ciA9IG1vbWVudChkYXRlKS5mb3JtYXQoZm9ybWF0KTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb25PYmpbZmllbGRfbmFtZV0gPSBkYXRlU3RyIHx8IFwiXCI7XG4gIH07XG4gIG1peEJvb2wgPSBmdW5jdGlvbihmaWVsZF9uYW1lKSB7XG4gICAgaWYgKG9ialtmaWVsZF9uYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGpzb25PYmpbZmllbGRfbmFtZV0gPSBcIuaYr1wiO1xuICAgIH0gZWxzZSBpZiAob2JqW2ZpZWxkX25hbWVdID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGpzb25PYmpbZmllbGRfbmFtZV0gPSBcIuWQplwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ganNvbk9ialtmaWVsZF9uYW1lXSA9IFwiXCI7XG4gICAgfVxuICB9O1xuICBfLmVhY2gob2JqRmllbGRzLCBmdW5jdGlvbihmaWVsZCwgZmllbGRfbmFtZSkge1xuICAgIHN3aXRjaCAoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnR5cGUgOiB2b2lkIDApIHtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgcmV0dXJuIG1peERhdGUoZmllbGRfbmFtZSwgZmllbGQudHlwZSk7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gbWl4Qm9vbChmaWVsZF9uYW1lKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBtaXhEZWZhdWx0KGZpZWxkX25hbWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBqc29uT2JqO1xufTtcblxuX21peFJlbGF0ZWREYXRhID0gZnVuY3Rpb24ob2JqLCBvYmpOYW1lKSB7XG4gIHZhciByZWxhdGVkT2JqTmFtZXMsIHJlbGF0ZWRfb2JqZWN0cztcbiAgcmVsYXRlZF9vYmplY3RzID0ge307XG4gIHJlbGF0ZWRPYmpOYW1lcyA9IHR5cGVvZiBDcmVhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIENyZWF0b3IgIT09IG51bGwgPyBDcmVhdG9yLmdldEFsbFJlbGF0ZWRPYmplY3RzKG9iak5hbWUpIDogdm9pZCAwO1xuICByZWxhdGVkT2JqTmFtZXMuZm9yRWFjaChmdW5jdGlvbihyZWxhdGVkT2JqTmFtZSkge1xuICAgIHZhciBmaWVsZHMsIG9iajEsIHJlZiwgcmVsYXRlZENvbGxlY3Rpb24sIHJlbGF0ZWRSZWNvcmRMaXN0LCByZWxhdGVkVGFibGVEYXRhLCByZWxhdGVkX2ZpZWxkX25hbWU7XG4gICAgcmVsYXRlZFRhYmxlRGF0YSA9IFtdO1xuICAgIGlmIChyZWxhdGVkT2JqTmFtZSA9PT0gXCJjbXNfZmlsZXNcIikge1xuICAgICAgcmVsYXRlZF9maWVsZF9uYW1lID0gXCJwYXJlbnQuaWRzXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IHR5cGVvZiBDcmVhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIENyZWF0b3IgIT09IG51bGwgPyAocmVmID0gQ3JlYXRvci5PYmplY3RzW3JlbGF0ZWRPYmpOYW1lXSkgIT0gbnVsbCA/IHJlZi5maWVsZHMgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICByZWxhdGVkX2ZpZWxkX25hbWUgPSBcIlwiO1xuICAgICAgXy5lYWNoKGZpZWxkcywgZnVuY3Rpb24oZmllbGQsIGZpZWxkX25hbWUpIHtcbiAgICAgICAgaWYgKChmaWVsZCAhPSBudWxsID8gZmllbGQucmVmZXJlbmNlX3RvIDogdm9pZCAwKSA9PT0gb2JqTmFtZSkge1xuICAgICAgICAgIHJldHVybiByZWxhdGVkX2ZpZWxkX25hbWUgPSBmaWVsZF9uYW1lO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHJlbGF0ZWRfZmllbGRfbmFtZSkge1xuICAgICAgcmVsYXRlZENvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVsYXRlZE9iak5hbWUpO1xuICAgICAgcmVsYXRlZFJlY29yZExpc3QgPSByZWxhdGVkQ29sbGVjdGlvbi5maW5kKChcbiAgICAgICAgb2JqMSA9IHt9LFxuICAgICAgICBvYmoxW1wiXCIgKyByZWxhdGVkX2ZpZWxkX25hbWVdID0gb2JqLl9pZCxcbiAgICAgICAgb2JqMVxuICAgICAgKSkuZmV0Y2goKTtcbiAgICAgIHJlbGF0ZWRSZWNvcmRMaXN0LmZvckVhY2goZnVuY3Rpb24ocmVsYXRlZE9iaikge1xuICAgICAgICB2YXIgZmllbGRzRGF0YTtcbiAgICAgICAgZmllbGRzRGF0YSA9IF9taXhGaWVsZHNEYXRhKHJlbGF0ZWRPYmosIHJlbGF0ZWRPYmpOYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0ZWRUYWJsZURhdGEucHVzaChmaWVsZHNEYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RzW3JlbGF0ZWRPYmpOYW1lXSA9IHJlbGF0ZWRUYWJsZURhdGE7XG4gIH0pO1xuICByZXR1cm4gcmVsYXRlZF9vYmplY3RzO1xufTtcblxuQ3JlYXRvci5FeHBvcnQyeG1sID0gZnVuY3Rpb24ob2JqTmFtZSwgcmVjb3JkTGlzdCkge1xuICB2YXIgY29sbGVjdGlvbjtcbiAgbG9nZ2VyLmluZm8oXCJSdW4gQ3JlYXRvci5FeHBvcnQyeG1sXCIpO1xuICBjb25zb2xlLnRpbWUoXCJDcmVhdG9yLkV4cG9ydDJ4bWxcIik7XG4gIGNvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqTmFtZSk7XG4gIHJlY29yZExpc3QgPSBjb2xsZWN0aW9uLmZpbmQoe30pLmZldGNoKCk7XG4gIHJlY29yZExpc3QuZm9yRWFjaChmdW5jdGlvbihyZWNvcmRPYmopIHtcbiAgICB2YXIgZmllbGRzRGF0YSwgZmlsZVBhdGgsIGpzb25PYmosIHJlbGF0ZWRfb2JqZWN0cztcbiAgICBqc29uT2JqID0ge307XG4gICAganNvbk9iai5faWQgPSByZWNvcmRPYmouX2lkO1xuICAgIGZpZWxkc0RhdGEgPSBfbWl4RmllbGRzRGF0YShyZWNvcmRPYmosIG9iak5hbWUpO1xuICAgIGpzb25PYmpbb2JqTmFtZV0gPSBmaWVsZHNEYXRhO1xuICAgIHJlbGF0ZWRfb2JqZWN0cyA9IF9taXhSZWxhdGVkRGF0YShyZWNvcmRPYmosIG9iak5hbWUpO1xuICAgIGpzb25PYmpbXCJyZWxhdGVkX29iamVjdHNcIl0gPSByZWxhdGVkX29iamVjdHM7XG4gICAgcmV0dXJuIGZpbGVQYXRoID0gX3dyaXRlWG1sRmlsZShqc29uT2JqLCBvYmpOYW1lKTtcbiAgfSk7XG4gIGNvbnNvbGUudGltZUVuZChcIkNyZWF0b3IuRXhwb3J0MnhtbFwiKTtcbiAgcmV0dXJuIGZpbGVQYXRoO1xufTtcbiIsIk1ldGVvci5tZXRob2RzIFxuXHRyZWxhdGVkX29iamVjdHNfcmVjb3JkczogKG9iamVjdF9uYW1lLCByZWxhdGVkX29iamVjdF9uYW1lLCByZWxhdGVkX2ZpZWxkX25hbWUsIHJlY29yZF9pZCwgc3BhY2VJZCktPlxuXHRcdHVzZXJJZCA9IHRoaXMudXNlcklkXG5cdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCJcblx0XHRcdHNlbGVjdG9yID0ge1wibWV0YWRhdGEuc3BhY2VcIjogc3BhY2VJZH1cblx0XHRlbHNlXG5cdFx0XHRzZWxlY3RvciA9IHtzcGFjZTogc3BhY2VJZH1cblx0XHRcblx0XHRpZiByZWxhdGVkX29iamVjdF9uYW1lID09IFwiY21zX2ZpbGVzXCJcblx0XHRcdCMg6ZmE5Lu255qE5YWz6IGU5pCc57Si5p2h5Lu25piv5a6a5q2755qEXG5cdFx0XHRzZWxlY3RvcltcInBhcmVudC5vXCJdID0gb2JqZWN0X25hbWVcblx0XHRcdHNlbGVjdG9yW1wicGFyZW50Lmlkc1wiXSA9IFtyZWNvcmRfaWRdXG5cdFx0ZWxzZVxuXHRcdFx0c2VsZWN0b3JbcmVsYXRlZF9maWVsZF9uYW1lXSA9IHJlY29yZF9pZFxuXG5cdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZClcblx0XHRpZiAhcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgYW5kIHBlcm1pc3Npb25zLmFsbG93UmVhZFxuXHRcdFx0c2VsZWN0b3Iub3duZXIgPSB1c2VySWRcblx0XHRcblx0XHRyZWxhdGVkX3JlY29yZHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVsYXRlZF9vYmplY3RfbmFtZSkuZmluZChzZWxlY3Rvcilcblx0XHRyZXR1cm4gcmVsYXRlZF9yZWNvcmRzLmNvdW50KCkiLCJNZXRlb3IubWV0aG9kcyh7XG4gIHJlbGF0ZWRfb2JqZWN0c19yZWNvcmRzOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVsYXRlZF9vYmplY3RfbmFtZSwgcmVsYXRlZF9maWVsZF9uYW1lLCByZWNvcmRfaWQsIHNwYWNlSWQpIHtcbiAgICB2YXIgcGVybWlzc2lvbnMsIHJlbGF0ZWRfcmVjb3Jkcywgc2VsZWN0b3IsIHVzZXJJZDtcbiAgICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICBpZiAocmVsYXRlZF9vYmplY3RfbmFtZSA9PT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiKSB7XG4gICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgXCJtZXRhZGF0YS5zcGFjZVwiOiBzcGFjZUlkXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChyZWxhdGVkX29iamVjdF9uYW1lID09PSBcImNtc19maWxlc1wiKSB7XG4gICAgICBzZWxlY3RvcltcInBhcmVudC5vXCJdID0gb2JqZWN0X25hbWU7XG4gICAgICBzZWxlY3RvcltcInBhcmVudC5pZHNcIl0gPSBbcmVjb3JkX2lkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0b3JbcmVsYXRlZF9maWVsZF9uYW1lXSA9IHJlY29yZF9pZDtcbiAgICB9XG4gICAgcGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgaWYgKCFwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyAmJiBwZXJtaXNzaW9ucy5hbGxvd1JlYWQpIHtcbiAgICAgIHNlbGVjdG9yLm93bmVyID0gdXNlcklkO1xuICAgIH1cbiAgICByZWxhdGVkX3JlY29yZHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVsYXRlZF9vYmplY3RfbmFtZSkuZmluZChzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHJlbGF0ZWRfcmVjb3Jkcy5jb3VudCgpO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG5cdGdldFBlbmRpbmdTcGFjZUluZm86IChpbnZpdGVySWQsIHNwYWNlSWQpLT5cblx0XHRpbnZpdGVyTmFtZSA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogaW52aXRlcklkfSkubmFtZVxuXHRcdHNwYWNlTmFtZSA9IGRiLnNwYWNlcy5maW5kT25lKHtfaWQ6IHNwYWNlSWR9KS5uYW1lXG5cblx0XHRyZXR1cm4ge2ludml0ZXI6IGludml0ZXJOYW1lLCBzcGFjZTogc3BhY2VOYW1lfVxuXG5cdHJlZnVzZUpvaW5TcGFjZTogKF9pZCktPlxuXHRcdGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe19pZDogX2lkfSx7JHNldDoge2ludml0ZV9zdGF0ZTogXCJyZWZ1c2VkXCJ9fSlcblxuXHRhY2NlcHRKb2luU3BhY2U6IChfaWQpLT5cblx0XHRkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtfaWQ6IF9pZH0seyRzZXQ6IHtpbnZpdGVfc3RhdGU6IFwiYWNjZXB0ZWRcIiwgdXNlcl9hY2NlcHRlZDogdHJ1ZX19KVxuXG4iLCJNZXRlb3IubWV0aG9kcyh7XG4gIGdldFBlbmRpbmdTcGFjZUluZm86IGZ1bmN0aW9uKGludml0ZXJJZCwgc3BhY2VJZCkge1xuICAgIHZhciBpbnZpdGVyTmFtZSwgc3BhY2VOYW1lO1xuICAgIGludml0ZXJOYW1lID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGludml0ZXJJZFxuICAgIH0pLm5hbWU7XG4gICAgc3BhY2VOYW1lID0gZGIuc3BhY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBzcGFjZUlkXG4gICAgfSkubmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgaW52aXRlcjogaW52aXRlck5hbWUsXG4gICAgICBzcGFjZTogc3BhY2VOYW1lXG4gICAgfTtcbiAgfSxcbiAgcmVmdXNlSm9pblNwYWNlOiBmdW5jdGlvbihfaWQpIHtcbiAgICByZXR1cm4gZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICBfaWQ6IF9pZFxuICAgIH0sIHtcbiAgICAgICRzZXQ6IHtcbiAgICAgICAgaW52aXRlX3N0YXRlOiBcInJlZnVzZWRcIlxuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBhY2NlcHRKb2luU3BhY2U6IGZ1bmN0aW9uKF9pZCkge1xuICAgIHJldHVybiBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgIF9pZDogX2lkXG4gICAgfSwge1xuICAgICAgJHNldDoge1xuICAgICAgICBpbnZpdGVfc3RhdGU6IFwiYWNjZXB0ZWRcIixcbiAgICAgICAgdXNlcl9hY2NlcHRlZDogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoIFwiY3JlYXRvcl9vYmplY3RfcmVjb3JkXCIsIChvYmplY3RfbmFtZSwgaWQsIHNwYWNlX2lkKS0+XG5cdGNvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlX2lkKVxuXHRpZiBjb2xsZWN0aW9uXG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZmluZCh7X2lkOiBpZH0pXG5cbiIsIk1ldGVvci5wdWJsaXNoKFwiY3JlYXRvcl9vYmplY3RfcmVjb3JkXCIsIGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBpZCwgc3BhY2VfaWQpIHtcbiAgdmFyIGNvbGxlY3Rpb247XG4gIGNvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlX2lkKTtcbiAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5maW5kKHtcbiAgICAgIF9pZDogaWRcbiAgICB9KTtcbiAgfVxufSk7XG4iLCJNZXRlb3IucHVibGlzaENvbXBvc2l0ZSBcInN0ZWVkb3Nfb2JqZWN0X3RhYnVsYXJcIiwgKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMsIHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG5cblx0X29iamVjdF9uYW1lID0gdGFibGVOYW1lLnJlcGxhY2UoXCJjcmVhdG9yX1wiLFwiXCIpXG5cdF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChfb2JqZWN0X25hbWUsIHNwYWNlSWQpXG5cblx0aWYgc3BhY2VJZFxuXHRcdF9vYmplY3RfbmFtZSA9IENyZWF0b3IuZ2V0T2JqZWN0TmFtZShfb2JqZWN0KVxuXG5cdG9iamVjdF9jb2xsZWNpdG9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKF9vYmplY3RfbmFtZSlcblxuXG5cdF9maWVsZHMgPSBfb2JqZWN0Py5maWVsZHNcblx0aWYgIV9maWVsZHMgfHwgIW9iamVjdF9jb2xsZWNpdG9uXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJlZmVyZW5jZV9maWVsZHMgPSBfLmZpbHRlciBfZmllbGRzLCAoZiktPlxuXHRcdHJldHVybiBfLmlzRnVuY3Rpb24oZi5yZWZlcmVuY2VfdG8pIHx8ICFfLmlzRW1wdHkoZi5yZWZlcmVuY2VfdG8pXG5cblx0c2VsZiA9IHRoaXNcblxuXHRzZWxmLnVuYmxvY2soKTtcblxuXHRpZiByZWZlcmVuY2VfZmllbGRzLmxlbmd0aCA+IDBcblx0XHRkYXRhID0ge1xuXHRcdFx0ZmluZDogKCktPlxuXHRcdFx0XHRzZWxmLnVuYmxvY2soKTtcblx0XHRcdFx0ZmllbGRfa2V5cyA9IHt9XG5cdFx0XHRcdF8uZWFjaCBfLmtleXMoZmllbGRzKSwgKGYpLT5cblx0XHRcdFx0XHR1bmxlc3MgL1xcdysoXFwuXFwkKXsxfVxcdz8vLnRlc3QoZilcblx0XHRcdFx0XHRcdGZpZWxkX2tleXNbZl0gPSAxXG5cdFx0XHRcdFxuXHRcdFx0XHRyZXR1cm4gb2JqZWN0X2NvbGxlY2l0b24uZmluZCh7X2lkOiB7JGluOiBpZHN9fSwge2ZpZWxkczogZmllbGRfa2V5c30pO1xuXHRcdH1cblxuXHRcdGRhdGEuY2hpbGRyZW4gPSBbXVxuXG5cdFx0a2V5cyA9IF8ua2V5cyhmaWVsZHMpXG5cblx0XHRpZiBrZXlzLmxlbmd0aCA8IDFcblx0XHRcdGtleXMgPSBfLmtleXMoX2ZpZWxkcylcblxuXHRcdF9rZXlzID0gW11cblxuXHRcdGtleXMuZm9yRWFjaCAoa2V5KS0+XG5cdFx0XHRpZiBfb2JqZWN0LnNjaGVtYS5fb2JqZWN0S2V5c1trZXkgKyAnLiddXG5cdFx0XHRcdF9rZXlzID0gX2tleXMuY29uY2F0KF8ubWFwKF9vYmplY3Quc2NoZW1hLl9vYmplY3RLZXlzW2tleSArICcuJ10sIChrKS0+XG5cdFx0XHRcdFx0cmV0dXJuIGtleSArICcuJyArIGtcblx0XHRcdFx0KSlcblx0XHRcdF9rZXlzLnB1c2goa2V5KVxuXG5cdFx0X2tleXMuZm9yRWFjaCAoa2V5KS0+XG5cdFx0XHRyZWZlcmVuY2VfZmllbGQgPSBfZmllbGRzW2tleV1cblxuXHRcdFx0aWYgcmVmZXJlbmNlX2ZpZWxkICYmIChfLmlzRnVuY3Rpb24ocmVmZXJlbmNlX2ZpZWxkLnJlZmVyZW5jZV90bykgfHwgIV8uaXNFbXB0eShyZWZlcmVuY2VfZmllbGQucmVmZXJlbmNlX3RvKSkgICMgYW5kIENyZWF0b3IuQ29sbGVjdGlvbnNbcmVmZXJlbmNlX2ZpZWxkLnJlZmVyZW5jZV90b11cblx0XHRcdFx0ZGF0YS5jaGlsZHJlbi5wdXNoIHtcblx0XHRcdFx0XHRmaW5kOiAocGFyZW50KSAtPlxuXHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdHNlbGYudW5ibG9jaygpO1xuXG5cdFx0XHRcdFx0XHRcdHF1ZXJ5ID0ge31cblxuXHRcdFx0XHRcdFx0XHQjIOihqOagvOWtkOWtl+auteeJueauiuWkhOeQhlxuXHRcdFx0XHRcdFx0XHRpZiAvXFx3KyhcXC5cXCRcXC4pezF9XFx3Ky8udGVzdChrZXkpXG5cdFx0XHRcdFx0XHRcdFx0cF9rID0ga2V5LnJlcGxhY2UoLyhcXHcrKVxcLlxcJFxcLlxcdysvaWcsIFwiJDFcIilcblx0XHRcdFx0XHRcdFx0XHRzX2sgPSBrZXkucmVwbGFjZSgvXFx3K1xcLlxcJFxcLihcXHcrKS9pZywgXCIkMVwiKVxuXHRcdFx0XHRcdFx0XHRcdHJlZmVyZW5jZV9pZHMgPSBwYXJlbnRbcF9rXS5nZXRQcm9wZXJ0eShzX2spXG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRyZWZlcmVuY2VfaWRzID0ga2V5LnNwbGl0KCcuJykucmVkdWNlIChvLCB4KSAtPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvP1t4XVxuXHRcdFx0XHRcdFx0XHRcdCwgcGFyZW50XG5cblx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlX3RvID0gcmVmZXJlbmNlX2ZpZWxkLnJlZmVyZW5jZV90b1xuXG5cdFx0XHRcdFx0XHRcdGlmIF8uaXNGdW5jdGlvbihyZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlX3RvID0gcmVmZXJlbmNlX3RvKClcblxuXHRcdFx0XHRcdFx0XHRpZiBfLmlzQXJyYXkocmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdFx0XHRcdGlmIF8uaXNPYmplY3QocmVmZXJlbmNlX2lkcykgJiYgIV8uaXNBcnJheShyZWZlcmVuY2VfaWRzKVxuXHRcdFx0XHRcdFx0XHRcdFx0cmVmZXJlbmNlX3RvID0gcmVmZXJlbmNlX2lkcy5vXG5cdFx0XHRcdFx0XHRcdFx0XHRyZWZlcmVuY2VfaWRzID0gcmVmZXJlbmNlX2lkcy5pZHMgfHwgW11cblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gW11cblxuXHRcdFx0XHRcdFx0XHRpZiBfLmlzQXJyYXkocmVmZXJlbmNlX2lkcylcblx0XHRcdFx0XHRcdFx0XHRxdWVyeS5faWQgPSB7JGluOiByZWZlcmVuY2VfaWRzfVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0cXVlcnkuX2lkID0gcmVmZXJlbmNlX2lkc1xuXG5cdFx0XHRcdFx0XHRcdHJlZmVyZW5jZV90b19vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZWZlcmVuY2VfdG8sIHNwYWNlSWQpXG5cblx0XHRcdFx0XHRcdFx0bmFtZV9maWVsZF9rZXkgPSByZWZlcmVuY2VfdG9fb2JqZWN0Lk5BTUVfRklFTERfS0VZXG5cblx0XHRcdFx0XHRcdFx0Y2hpbGRyZW5fZmllbGRzID0ge19pZDogMSwgc3BhY2U6IDF9XG5cblx0XHRcdFx0XHRcdFx0aWYgbmFtZV9maWVsZF9rZXlcblx0XHRcdFx0XHRcdFx0XHRjaGlsZHJlbl9maWVsZHNbbmFtZV9maWVsZF9rZXldID0gMVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVmZXJlbmNlX3RvLCBzcGFjZUlkKS5maW5kKHF1ZXJ5LCB7XG5cdFx0XHRcdFx0XHRcdFx0ZmllbGRzOiBjaGlsZHJlbl9maWVsZHNcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHJlZmVyZW5jZV90bywgcGFyZW50LCBlKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gW11cblx0XHRcdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGFcblx0ZWxzZVxuXHRcdHJldHVybiB7XG5cdFx0XHRmaW5kOiAoKS0+XG5cdFx0XHRcdHNlbGYudW5ibG9jaygpO1xuXHRcdFx0XHRyZXR1cm4gb2JqZWN0X2NvbGxlY2l0b24uZmluZCh7X2lkOiB7JGluOiBpZHN9fSwge2ZpZWxkczogZmllbGRzfSlcblx0XHR9O1xuXG4iLCJNZXRlb3IucHVibGlzaENvbXBvc2l0ZShcInN0ZWVkb3Nfb2JqZWN0X3RhYnVsYXJcIiwgZnVuY3Rpb24odGFibGVOYW1lLCBpZHMsIGZpZWxkcywgc3BhY2VJZCkge1xuICB2YXIgX2ZpZWxkcywgX2tleXMsIF9vYmplY3QsIF9vYmplY3RfbmFtZSwgZGF0YSwga2V5cywgb2JqZWN0X2NvbGxlY2l0b24sIHJlZmVyZW5jZV9maWVsZHMsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIF9vYmplY3RfbmFtZSA9IHRhYmxlTmFtZS5yZXBsYWNlKFwiY3JlYXRvcl9cIiwgXCJcIik7XG4gIF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChfb2JqZWN0X25hbWUsIHNwYWNlSWQpO1xuICBpZiAoc3BhY2VJZCkge1xuICAgIF9vYmplY3RfbmFtZSA9IENyZWF0b3IuZ2V0T2JqZWN0TmFtZShfb2JqZWN0KTtcbiAgfVxuICBvYmplY3RfY29sbGVjaXRvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihfb2JqZWN0X25hbWUpO1xuICBfZmllbGRzID0gX29iamVjdCAhPSBudWxsID8gX29iamVjdC5maWVsZHMgOiB2b2lkIDA7XG4gIGlmICghX2ZpZWxkcyB8fCAhb2JqZWN0X2NvbGxlY2l0b24pIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJlZmVyZW5jZV9maWVsZHMgPSBfLmZpbHRlcihfZmllbGRzLCBmdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuIF8uaXNGdW5jdGlvbihmLnJlZmVyZW5jZV90bykgfHwgIV8uaXNFbXB0eShmLnJlZmVyZW5jZV90byk7XG4gIH0pO1xuICBzZWxmID0gdGhpcztcbiAgc2VsZi51bmJsb2NrKCk7XG4gIGlmIChyZWZlcmVuY2VfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICBkYXRhID0ge1xuICAgICAgZmluZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmaWVsZF9rZXlzO1xuICAgICAgICBzZWxmLnVuYmxvY2soKTtcbiAgICAgICAgZmllbGRfa2V5cyA9IHt9O1xuICAgICAgICBfLmVhY2goXy5rZXlzKGZpZWxkcyksIGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICBpZiAoIS9cXHcrKFxcLlxcJCl7MX1cXHc/Ly50ZXN0KGYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRfa2V5c1tmXSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9iamVjdF9jb2xsZWNpdG9uLmZpbmQoe1xuICAgICAgICAgIF9pZDoge1xuICAgICAgICAgICAgJGluOiBpZHNcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IGZpZWxkX2tleXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBkYXRhLmNoaWxkcmVuID0gW107XG4gICAga2V5cyA9IF8ua2V5cyhmaWVsZHMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA8IDEpIHtcbiAgICAgIGtleXMgPSBfLmtleXMoX2ZpZWxkcyk7XG4gICAgfVxuICAgIF9rZXlzID0gW107XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgaWYgKF9vYmplY3Quc2NoZW1hLl9vYmplY3RLZXlzW2tleSArICcuJ10pIHtcbiAgICAgICAgX2tleXMgPSBfa2V5cy5jb25jYXQoXy5tYXAoX29iamVjdC5zY2hlbWEuX29iamVjdEtleXNba2V5ICsgJy4nXSwgZnVuY3Rpb24oaykge1xuICAgICAgICAgIHJldHVybiBrZXkgKyAnLicgKyBrO1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2tleXMucHVzaChrZXkpO1xuICAgIH0pO1xuICAgIF9rZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgcmVmZXJlbmNlX2ZpZWxkO1xuICAgICAgcmVmZXJlbmNlX2ZpZWxkID0gX2ZpZWxkc1trZXldO1xuICAgICAgaWYgKHJlZmVyZW5jZV9maWVsZCAmJiAoXy5pc0Z1bmN0aW9uKHJlZmVyZW5jZV9maWVsZC5yZWZlcmVuY2VfdG8pIHx8ICFfLmlzRW1wdHkocmVmZXJlbmNlX2ZpZWxkLnJlZmVyZW5jZV90bykpKSB7XG4gICAgICAgIHJldHVybiBkYXRhLmNoaWxkcmVuLnB1c2goe1xuICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBhcmVudCkge1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuX2ZpZWxkcywgZSwgbmFtZV9maWVsZF9rZXksIHBfaywgcXVlcnksIHJlZmVyZW5jZV9pZHMsIHJlZmVyZW5jZV90bywgcmVmZXJlbmNlX3RvX29iamVjdCwgc19rO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc2VsZi51bmJsb2NrKCk7XG4gICAgICAgICAgICAgIHF1ZXJ5ID0ge307XG4gICAgICAgICAgICAgIGlmICgvXFx3KyhcXC5cXCRcXC4pezF9XFx3Ky8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgICAgcF9rID0ga2V5LnJlcGxhY2UoLyhcXHcrKVxcLlxcJFxcLlxcdysvaWcsIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgc19rID0ga2V5LnJlcGxhY2UoL1xcdytcXC5cXCRcXC4oXFx3KykvaWcsIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkcyA9IHBhcmVudFtwX2tdLmdldFByb3BlcnR5KHNfayk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlX2lkcyA9IGtleS5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbihvLCB4KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbyAhPSBudWxsID8gb1t4XSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB9LCBwYXJlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlZmVyZW5jZV90byA9IHJlZmVyZW5jZV9maWVsZC5yZWZlcmVuY2VfdG87XG4gICAgICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24ocmVmZXJlbmNlX3RvKSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZV90byA9IHJlZmVyZW5jZV90bygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChfLmlzQXJyYXkocmVmZXJlbmNlX3RvKSkge1xuICAgICAgICAgICAgICAgIGlmIChfLmlzT2JqZWN0KHJlZmVyZW5jZV9pZHMpICYmICFfLmlzQXJyYXkocmVmZXJlbmNlX2lkcykpIHtcbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZV90byA9IHJlZmVyZW5jZV9pZHMubztcbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZV9pZHMgPSByZWZlcmVuY2VfaWRzLmlkcyB8fCBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXy5pc0FycmF5KHJlZmVyZW5jZV9pZHMpKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkuX2lkID0ge1xuICAgICAgICAgICAgICAgICAgJGluOiByZWZlcmVuY2VfaWRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWVyeS5faWQgPSByZWZlcmVuY2VfaWRzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlZmVyZW5jZV90b19vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZWZlcmVuY2VfdG8sIHNwYWNlSWQpO1xuICAgICAgICAgICAgICBuYW1lX2ZpZWxkX2tleSA9IHJlZmVyZW5jZV90b19vYmplY3QuTkFNRV9GSUVMRF9LRVk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuX2ZpZWxkcyA9IHtcbiAgICAgICAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgICAgICAgc3BhY2U6IDFcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgaWYgKG5hbWVfZmllbGRfa2V5KSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5fZmllbGRzW25hbWVfZmllbGRfa2V5XSA9IDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWZlcmVuY2VfdG8sIHNwYWNlSWQpLmZpbmQocXVlcnksIHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGNoaWxkcmVuX2ZpZWxkc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVmZXJlbmNlX3RvLCBwYXJlbnQsIGUpO1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmluZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYudW5ibG9jaygpO1xuICAgICAgICByZXR1cm4gb2JqZWN0X2NvbGxlY2l0b24uZmluZCh7XG4gICAgICAgICAgX2lkOiB7XG4gICAgICAgICAgICAkaW46IGlkc1xuICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggXCJvYmplY3RfbGlzdHZpZXdzXCIsIChvYmplY3RfbmFtZSwgc3BhY2VJZCktPlxuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkXG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9iamVjdF9saXN0dmlld3NcIikuZmluZCh7b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLCBzcGFjZTogc3BhY2VJZCAsXCIkb3JcIjpbe293bmVyOiB1c2VySWR9LCB7c2hhcmVkOiB0cnVlfV19KSIsIk1ldGVvci5wdWJsaXNoIFwidXNlcl90YWJ1bGFyX3NldHRpbmdzXCIsIChvYmplY3RfbmFtZSktPlxuICAgIHVzZXJJZCA9IHRoaXMudXNlcklkXG4gICAgcmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnMuc2V0dGluZ3MuZmluZCh7b2JqZWN0X25hbWU6IHskaW46IG9iamVjdF9uYW1lfSwgcmVjb3JkX2lkOiB7JGluOiBbXCJvYmplY3RfbGlzdHZpZXdzXCIsIFwib2JqZWN0X2dyaWR2aWV3c1wiXX0sIG93bmVyOiB1c2VySWR9KVxuIiwiTWV0ZW9yLnB1Ymxpc2ggXCJyZWxhdGVkX29iamVjdHNfcmVjb3Jkc1wiLCAob2JqZWN0X25hbWUsIHJlbGF0ZWRfb2JqZWN0X25hbWUsIHJlbGF0ZWRfZmllbGRfbmFtZSwgcmVjb3JkX2lkLCBzcGFjZUlkKS0+XG5cdHVzZXJJZCA9IHRoaXMudXNlcklkXG5cdGlmIHJlbGF0ZWRfb2JqZWN0X25hbWUgPT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiXG5cdFx0c2VsZWN0b3IgPSB7XCJtZXRhZGF0YS5zcGFjZVwiOiBzcGFjZUlkfVxuXHRlbHNlXG5cdFx0c2VsZWN0b3IgPSB7c3BhY2U6IHNwYWNlSWR9XG5cdFxuXHRpZiByZWxhdGVkX29iamVjdF9uYW1lID09IFwiY21zX2ZpbGVzXCJcblx0XHQjIOmZhOS7tueahOWFs+iBlOaQnOe0ouadoeS7tuaYr+Wumuatu+eahFxuXHRcdHNlbGVjdG9yW1wicGFyZW50Lm9cIl0gPSBvYmplY3RfbmFtZVxuXHRcdHNlbGVjdG9yW1wicGFyZW50Lmlkc1wiXSA9IFtyZWNvcmRfaWRdXG5cdGVsc2Vcblx0XHRzZWxlY3RvcltyZWxhdGVkX2ZpZWxkX25hbWVdID0gcmVjb3JkX2lkXG5cblx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZClcblx0aWYgIXBlcm1pc3Npb25zLnZpZXdBbGxSZWNvcmRzIGFuZCBwZXJtaXNzaW9ucy5hbGxvd1JlYWRcblx0XHRzZWxlY3Rvci5vd25lciA9IHVzZXJJZFxuXHRcblx0cmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWxhdGVkX29iamVjdF9uYW1lKS5maW5kKHNlbGVjdG9yKSIsIk1ldGVvci5wdWJsaXNoKFwicmVsYXRlZF9vYmplY3RzX3JlY29yZHNcIiwgZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlbGF0ZWRfb2JqZWN0X25hbWUsIHJlbGF0ZWRfZmllbGRfbmFtZSwgcmVjb3JkX2lkLCBzcGFjZUlkKSB7XG4gIHZhciBwZXJtaXNzaW9ucywgc2VsZWN0b3IsIHVzZXJJZDtcbiAgdXNlcklkID0gdGhpcy51c2VySWQ7XG4gIGlmIChyZWxhdGVkX29iamVjdF9uYW1lID09PSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCIpIHtcbiAgICBzZWxlY3RvciA9IHtcbiAgICAgIFwibWV0YWRhdGEuc3BhY2VcIjogc3BhY2VJZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0b3IgPSB7XG4gICAgICBzcGFjZTogc3BhY2VJZFxuICAgIH07XG4gIH1cbiAgaWYgKHJlbGF0ZWRfb2JqZWN0X25hbWUgPT09IFwiY21zX2ZpbGVzXCIpIHtcbiAgICBzZWxlY3RvcltcInBhcmVudC5vXCJdID0gb2JqZWN0X25hbWU7XG4gICAgc2VsZWN0b3JbXCJwYXJlbnQuaWRzXCJdID0gW3JlY29yZF9pZF07XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0b3JbcmVsYXRlZF9maWVsZF9uYW1lXSA9IHJlY29yZF9pZDtcbiAgfVxuICBwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMocmVsYXRlZF9vYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKTtcbiAgaWYgKCFwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyAmJiBwZXJtaXNzaW9ucy5hbGxvd1JlYWQpIHtcbiAgICBzZWxlY3Rvci5vd25lciA9IHVzZXJJZDtcbiAgfVxuICByZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlbGF0ZWRfb2JqZWN0X25hbWUpLmZpbmQoc2VsZWN0b3IpO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnc3BhY2VfdXNlcl9pbmZvJywgKHNwYWNlSWQsIHVzZXJJZCktPlxuXHRyZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZCh7c3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZH0pIiwiXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblxuXHRNZXRlb3IucHVibGlzaCAnY29udGFjdHNfdmlld19saW1pdHMnLCAoc3BhY2VJZCktPlxuXG5cdFx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdFx0c2VsZWN0b3IgPVxuXHRcdFx0c3BhY2U6IHNwYWNlSWRcblx0XHRcdGtleTogJ2NvbnRhY3RzX3ZpZXdfbGltaXRzJ1xuXG5cdFx0cmV0dXJuIGRiLnNwYWNlX3NldHRpbmdzLmZpbmQoc2VsZWN0b3IpIiwiaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBNZXRlb3IucHVibGlzaCgnY29udGFjdHNfdmlld19saW1pdHMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gICAgdmFyIHNlbGVjdG9yO1xuICAgIGlmICghdGhpcy51c2VySWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gICAgfVxuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgICB9XG4gICAgc2VsZWN0b3IgPSB7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIGtleTogJ2NvbnRhY3RzX3ZpZXdfbGltaXRzJ1xuICAgIH07XG4gICAgcmV0dXJuIGRiLnNwYWNlX3NldHRpbmdzLmZpbmQoc2VsZWN0b3IpO1xuICB9KTtcbn1cbiIsIlxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cblx0TWV0ZW9yLnB1Ymxpc2ggJ2NvbnRhY3RzX25vX2ZvcmNlX3Bob25lX3VzZXJzJywgKHNwYWNlSWQpLT5cblxuXHRcdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdFx0dW5sZXNzIHNwYWNlSWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRcdHNlbGVjdG9yID1cblx0XHRcdHNwYWNlOiBzcGFjZUlkXG5cdFx0XHRrZXk6ICdjb250YWN0c19ub19mb3JjZV9waG9uZV91c2VycydcblxuXHRcdHJldHVybiBkYi5zcGFjZV9zZXR0aW5ncy5maW5kKHNlbGVjdG9yKSIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLnB1Ymxpc2goJ2NvbnRhY3RzX25vX2ZvcmNlX3Bob25lX3VzZXJzJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICAgIHZhciBzZWxlY3RvcjtcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICAgIH1cbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gICAgfVxuICAgIHNlbGVjdG9yID0ge1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBrZXk6ICdjb250YWN0c19ub19mb3JjZV9waG9uZV91c2VycydcbiAgICB9O1xuICAgIHJldHVybiBkYi5zcGFjZV9zZXR0aW5ncy5maW5kKHNlbGVjdG9yKTtcbiAgfSk7XG59XG4iLCJpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0TWV0ZW9yLnB1Ymxpc2ggJ3NwYWNlX25lZWRfdG9fY29uZmlybScsICgpLT5cblx0XHR1c2VySWQgPSB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiBkYi5zcGFjZV91c2Vycy5maW5kKHt1c2VyOiB1c2VySWQsIGludml0ZV9zdGF0ZTogXCJwZW5kaW5nXCJ9KSIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLnB1Ymxpc2goJ3NwYWNlX25lZWRfdG9fY29uZmlybScsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB1c2VySWQ7XG4gICAgdXNlcklkID0gdGhpcy51c2VySWQ7XG4gICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgaW52aXRlX3N0YXRlOiBcInBlbmRpbmdcIlxuICAgIH0pO1xuICB9KTtcbn1cbiIsInBlcm1pc3Npb25NYW5hZ2VyRm9ySW5pdEFwcHJvdmFsID0ge31cblxucGVybWlzc2lvbk1hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Rmxvd1Blcm1pc3Npb25zID0gKGZsb3dfaWQsIHVzZXJfaWQpIC0+XG5cdCMg5qC55o2uOmZsb3dfaWTmn6XliLDlr7nlupTnmoRmbG93XG5cdGZsb3cgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZsb3coZmxvd19pZClcblx0c3BhY2VfaWQgPSBmbG93LnNwYWNlXG5cdCMg5qC55o2uc3BhY2VfaWTlkow6dXNlcl9pZOWIsG9yZ2FuaXphdGlvbnPooajkuK3mn6XliLDnlKjmiLfmiYDlsZ7miYDmnInnmoRvcmdfaWTvvIjljIXmi6zkuIrnuqfnu4RJRO+8iVxuXHRvcmdfaWRzID0gbmV3IEFycmF5XG5cdG9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuXHRcdHNwYWNlOiBzcGFjZV9pZCwgdXNlcnM6IHVzZXJfaWQgfSwgeyBmaWVsZHM6IHsgcGFyZW50czogMSB9IH0pLmZldGNoKClcblx0Xy5lYWNoKG9yZ2FuaXphdGlvbnMsIChvcmcpIC0+XG5cdFx0b3JnX2lkcy5wdXNoKG9yZy5faWQpXG5cdFx0aWYgb3JnLnBhcmVudHNcblx0XHRcdF8uZWFjaChvcmcucGFyZW50cywgKHBhcmVudF9pZCkgLT5cblx0XHRcdFx0b3JnX2lkcy5wdXNoKHBhcmVudF9pZClcblx0XHRcdClcblx0KVxuXHRvcmdfaWRzID0gXy51bmlxKG9yZ19pZHMpXG5cdG15X3Blcm1pc3Npb25zID0gbmV3IEFycmF5XG5cdGlmIGZsb3cucGVybXNcblx0XHQjIOWIpOaWrWZsb3cucGVybXMudXNlcnNfY2FuX2FkbWlu5Lit5piv5ZCm5YyF5ZCr5b2T5YmN55So5oi377yMXG5cdFx0IyDmiJbogIVmbG93LnBlcm1zLm9yZ3NfY2FuX2FkZOaYr+WQpuWMheWQqzTmraXlvpfliLDnmoRvcmdfaWTmlbDnu4TkuK3nmoTku7vkvZXkuIDkuKrvvIxcblx0XHQjIOiLpeaYr++8jOWImeWcqOi/lOWbnueahOaVsOe7hOS4reWKoOS4imFkZFxuXHRcdGlmIGZsb3cucGVybXMudXNlcnNfY2FuX2FkZFxuXHRcdFx0dXNlcnNfY2FuX2FkZCA9IGZsb3cucGVybXMudXNlcnNfY2FuX2FkZFxuXHRcdFx0aWYgdXNlcnNfY2FuX2FkZC5pbmNsdWRlcyh1c2VyX2lkKVxuXHRcdFx0XHRteV9wZXJtaXNzaW9ucy5wdXNoKFwiYWRkXCIpXG5cblx0XHRpZiBmbG93LnBlcm1zLm9yZ3NfY2FuX2FkZFxuXHRcdFx0b3Jnc19jYW5fYWRkID0gZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZGRcblx0XHRcdF8uZWFjaChvcmdfaWRzLCAob3JnX2lkKSAtPlxuXHRcdFx0XHRpZiBvcmdzX2Nhbl9hZGQuaW5jbHVkZXMob3JnX2lkKVxuXHRcdFx0XHRcdG15X3Blcm1pc3Npb25zLnB1c2goXCJhZGRcIilcblx0XHRcdClcblx0XHQjIOWIpOaWrWZsb3cucGVybXMudXNlcnNfY2FuX21vbml0b3LkuK3mmK/lkKbljIXlkKvlvZPliY3nlKjmiLfvvIxcblx0XHQjIOaIluiAhWZsb3cucGVybXMub3Jnc19jYW5fbW9uaXRvcuaYr+WQpuWMheWQqzTmraXlvpfliLDnmoRvcmdfaWTmlbDnu4TkuK3nmoTku7vkvZXkuIDkuKrvvIxcblx0XHQjIOiLpeaYr++8jOWImeWcqOi/lOWbnueahOaVsOe7hOS4reWKoOS4im1vbml0b3Jcblx0XHRpZiBmbG93LnBlcm1zLnVzZXJzX2Nhbl9tb25pdG9yXG5cdFx0XHR1c2Vyc19jYW5fbW9uaXRvciA9IGZsb3cucGVybXMudXNlcnNfY2FuX21vbml0b3Jcblx0XHRcdGlmIHVzZXJzX2Nhbl9tb25pdG9yLmluY2x1ZGVzKHVzZXJfaWQpXG5cdFx0XHRcdG15X3Blcm1pc3Npb25zLnB1c2goXCJtb25pdG9yXCIpXG5cblx0XHRpZiBmbG93LnBlcm1zLm9yZ3NfY2FuX21vbml0b3Jcblx0XHRcdG9yZ3NfY2FuX21vbml0b3IgPSBmbG93LnBlcm1zLm9yZ3NfY2FuX21vbml0b3Jcblx0XHRcdF8uZWFjaChvcmdfaWRzLCAob3JnX2lkKSAtPlxuXHRcdFx0XHRpZiBvcmdzX2Nhbl9tb25pdG9yLmluY2x1ZGVzKG9yZ19pZClcblx0XHRcdFx0XHRteV9wZXJtaXNzaW9ucy5wdXNoKFwibW9uaXRvclwiKVxuXHRcdFx0KVxuXHRcdCMg5Yik5patZmxvdy5wZXJtcy51c2Vyc19jYW5fYWRtaW7kuK3mmK/lkKbljIXlkKvlvZPliY3nlKjmiLfvvIxcblx0XHQjIOaIluiAhWZsb3cucGVybXMub3Jnc19jYW5fYWRtaW7mmK/lkKbljIXlkKs05q2l5b6X5Yiw55qEb3JnX2lk5pWw57uE5Lit55qE5Lu75L2V5LiA5Liq77yMXG5cdFx0IyDoi6XmmK/vvIzliJnlnKjov5Tlm57nmoTmlbDnu4TkuK3liqDkuIphZG1pblxuXHRcdGlmIGZsb3cucGVybXMudXNlcnNfY2FuX2FkbWluXG5cdFx0XHR1c2Vyc19jYW5fYWRtaW4gPSBmbG93LnBlcm1zLnVzZXJzX2Nhbl9hZG1pblxuXHRcdFx0aWYgdXNlcnNfY2FuX2FkbWluLmluY2x1ZGVzKHVzZXJfaWQpXG5cdFx0XHRcdG15X3Blcm1pc3Npb25zLnB1c2goXCJhZG1pblwiKVxuXG5cdFx0aWYgZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZG1pblxuXHRcdFx0b3Jnc19jYW5fYWRtaW4gPSBmbG93LnBlcm1zLm9yZ3NfY2FuX2FkbWluXG5cdFx0XHRfLmVhY2gob3JnX2lkcywgKG9yZ19pZCkgLT5cblx0XHRcdFx0aWYgb3Jnc19jYW5fYWRtaW4uaW5jbHVkZXMob3JnX2lkKVxuXHRcdFx0XHRcdG15X3Blcm1pc3Npb25zLnB1c2goXCJhZG1pblwiKVxuXHRcdFx0KVxuXG5cdG15X3Blcm1pc3Npb25zID0gXy51bmlxKG15X3Blcm1pc3Npb25zKVxuXHRyZXR1cm4gbXlfcGVybWlzc2lvbnMiLCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbnBlcm1pc3Npb25NYW5hZ2VyRm9ySW5pdEFwcHJvdmFsID0ge307XG5cbnBlcm1pc3Npb25NYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZsb3dQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKGZsb3dfaWQsIHVzZXJfaWQpIHtcbiAgdmFyIGZsb3csIG15X3Blcm1pc3Npb25zLCBvcmdfaWRzLCBvcmdhbml6YXRpb25zLCBvcmdzX2Nhbl9hZGQsIG9yZ3NfY2FuX2FkbWluLCBvcmdzX2Nhbl9tb25pdG9yLCBzcGFjZV9pZCwgdXNlcnNfY2FuX2FkZCwgdXNlcnNfY2FuX2FkbWluLCB1c2Vyc19jYW5fbW9uaXRvcjtcbiAgZmxvdyA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0RmxvdyhmbG93X2lkKTtcbiAgc3BhY2VfaWQgPSBmbG93LnNwYWNlO1xuICBvcmdfaWRzID0gbmV3IEFycmF5O1xuICBvcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgdXNlcnM6IHVzZXJfaWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgcGFyZW50czogMVxuICAgIH1cbiAgfSkuZmV0Y2goKTtcbiAgXy5lYWNoKG9yZ2FuaXphdGlvbnMsIGZ1bmN0aW9uKG9yZykge1xuICAgIG9yZ19pZHMucHVzaChvcmcuX2lkKTtcbiAgICBpZiAob3JnLnBhcmVudHMpIHtcbiAgICAgIHJldHVybiBfLmVhY2gob3JnLnBhcmVudHMsIGZ1bmN0aW9uKHBhcmVudF9pZCkge1xuICAgICAgICByZXR1cm4gb3JnX2lkcy5wdXNoKHBhcmVudF9pZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICBvcmdfaWRzID0gXy51bmlxKG9yZ19pZHMpO1xuICBteV9wZXJtaXNzaW9ucyA9IG5ldyBBcnJheTtcbiAgaWYgKGZsb3cucGVybXMpIHtcbiAgICBpZiAoZmxvdy5wZXJtcy51c2Vyc19jYW5fYWRkKSB7XG4gICAgICB1c2Vyc19jYW5fYWRkID0gZmxvdy5wZXJtcy51c2Vyc19jYW5fYWRkO1xuICAgICAgaWYgKHVzZXJzX2Nhbl9hZGQuaW5jbHVkZXModXNlcl9pZCkpIHtcbiAgICAgICAgbXlfcGVybWlzc2lvbnMucHVzaChcImFkZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZsb3cucGVybXMub3Jnc19jYW5fYWRkKSB7XG4gICAgICBvcmdzX2Nhbl9hZGQgPSBmbG93LnBlcm1zLm9yZ3NfY2FuX2FkZDtcbiAgICAgIF8uZWFjaChvcmdfaWRzLCBmdW5jdGlvbihvcmdfaWQpIHtcbiAgICAgICAgaWYgKG9yZ3NfY2FuX2FkZC5pbmNsdWRlcyhvcmdfaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG15X3Blcm1pc3Npb25zLnB1c2goXCJhZGRcIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmxvdy5wZXJtcy51c2Vyc19jYW5fbW9uaXRvcikge1xuICAgICAgdXNlcnNfY2FuX21vbml0b3IgPSBmbG93LnBlcm1zLnVzZXJzX2Nhbl9tb25pdG9yO1xuICAgICAgaWYgKHVzZXJzX2Nhbl9tb25pdG9yLmluY2x1ZGVzKHVzZXJfaWQpKSB7XG4gICAgICAgIG15X3Blcm1pc3Npb25zLnB1c2goXCJtb25pdG9yXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmxvdy5wZXJtcy5vcmdzX2Nhbl9tb25pdG9yKSB7XG4gICAgICBvcmdzX2Nhbl9tb25pdG9yID0gZmxvdy5wZXJtcy5vcmdzX2Nhbl9tb25pdG9yO1xuICAgICAgXy5lYWNoKG9yZ19pZHMsIGZ1bmN0aW9uKG9yZ19pZCkge1xuICAgICAgICBpZiAob3Jnc19jYW5fbW9uaXRvci5pbmNsdWRlcyhvcmdfaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG15X3Blcm1pc3Npb25zLnB1c2goXCJtb25pdG9yXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZsb3cucGVybXMudXNlcnNfY2FuX2FkbWluKSB7XG4gICAgICB1c2Vyc19jYW5fYWRtaW4gPSBmbG93LnBlcm1zLnVzZXJzX2Nhbl9hZG1pbjtcbiAgICAgIGlmICh1c2Vyc19jYW5fYWRtaW4uaW5jbHVkZXModXNlcl9pZCkpIHtcbiAgICAgICAgbXlfcGVybWlzc2lvbnMucHVzaChcImFkbWluXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmxvdy5wZXJtcy5vcmdzX2Nhbl9hZG1pbikge1xuICAgICAgb3Jnc19jYW5fYWRtaW4gPSBmbG93LnBlcm1zLm9yZ3NfY2FuX2FkbWluO1xuICAgICAgXy5lYWNoKG9yZ19pZHMsIGZ1bmN0aW9uKG9yZ19pZCkge1xuICAgICAgICBpZiAob3Jnc19jYW5fYWRtaW4uaW5jbHVkZXMob3JnX2lkKSkge1xuICAgICAgICAgIHJldHVybiBteV9wZXJtaXNzaW9ucy5wdXNoKFwiYWRtaW5cIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBteV9wZXJtaXNzaW9ucyA9IF8udW5pcShteV9wZXJtaXNzaW9ucyk7XG4gIHJldHVybiBteV9wZXJtaXNzaW9ucztcbn07XG4iLCIjIOWPkei1t+WuoeaJuVxuX2V2YWwgPSByZXF1aXJlKCdldmFsJylcbm9iamVjdHFsID0gcmVxdWlyZSgnQHN0ZWVkb3Mvb2JqZWN0cWwnKTtcblxuZ2V0T2JqZWN0Q29uZmlnID0gKG9iamVjdEFwaU5hbWUpIC0+XG5cdHJldHVybiBvYmplY3RxbC5nZXRPYmplY3Qob2JqZWN0QXBpTmFtZSkudG9Db25maWcoKVxuXG5nZXRPYmplY3ROYW1lRmllbGRLZXkgPSAob2JqZWN0QXBpTmFtZSkgLT5cblx0cmV0dXJuIG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS5OQU1FX0ZJRUxEX0tFWVxuXG5nZXRSZWxhdGVkcyA9IChvYmplY3RBcGlOYW1lKSAtPlxuXHRyZXR1cm4gTWV0ZW9yLndyYXBBc3luYygob2JqZWN0QXBpTmFtZSwgY2IpIC0+XG5cdFx0b2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLmdldFJlbGF0ZWRzKCkudGhlbiAocmVzb2x2ZSwgcmVqZWN0KSAtPlxuXHRcdFx0Y2IocmVqZWN0LCByZXNvbHZlKVxuXHRcdCkob2JqZWN0QXBpTmFtZSlcblxub2JqZWN0RmluZE9uZSA9IChvYmplY3RBcGlOYW1lLCBxdWVyeSkgLT5cblx0cmV0dXJuIE1ldGVvci53cmFwQXN5bmMoKG9iamVjdEFwaU5hbWUsIHF1ZXJ5LCBjYikgLT5cblx0XHRxdWVyeS50b3AgPSAxXG5cdFx0b2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLmZpbmQocXVlcnkpLnRoZW4gKHJlc29sdmUsIHJlamVjdCkgLT5cblx0XHRcdGlmIChyZXNvbHZlICYmIHJlc29sdmUubGVuZ3RoID4gMClcblx0XHRcdFx0Y2IocmVqZWN0LCByZXNvbHZlWzBdKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjYihyZWplY3QsIG51bGwpXG5cdFx0KShvYmplY3RBcGlOYW1lLCBxdWVyeSlcblxub2JqZWN0RmluZCA9IChvYmplY3RBcGlOYW1lLCBxdWVyeSkgLT5cblx0cmV0dXJuIE1ldGVvci53cmFwQXN5bmMoKG9iamVjdEFwaU5hbWUsIHF1ZXJ5LCBjYikgLT5cblx0XHRvYmplY3RxbC5nZXRPYmplY3Qob2JqZWN0QXBpTmFtZSkuZmluZChxdWVyeSkudGhlbiAocmVzb2x2ZSwgcmVqZWN0KSAtPlxuXHRcdFx0Y2IocmVqZWN0LCByZXNvbHZlKVxuXHRcdCkob2JqZWN0QXBpTmFtZSwgcXVlcnkpXG5cbm9iamVjdFVwZGF0ZSA9IChvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSkgLT5cblx0cmV0dXJuIE1ldGVvci53cmFwQXN5bmMoKG9iamVjdEFwaU5hbWUsIGlkLCBkYXRhLCBjYikgLT5cblx0XHRvYmplY3RxbC5nZXRPYmplY3Qob2JqZWN0QXBpTmFtZSkudXBkYXRlKGlkLCBkYXRhKS50aGVuIChyZXNvbHZlLCByZWplY3QpIC0+XG5cdFx0XHRjYihyZWplY3QsIHJlc29sdmUpXG5cdFx0KShvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSlcblxuZ2V0UmVsYXRlZE9iamVjdEZpZWxkQ29kZSA9ICAocmVsYXRlZE9iamVjdHNLZXlzLCBrZXkpIC0+XG5cdHJldHVybiBfLmZpbmQgcmVsYXRlZE9iamVjdHNLZXlzLCAgKHJlbGF0ZWRPYmplY3RzS2V5KSAtPlxuXHRcdHJldHVybiBrZXkuc3RhcnRzV2l0aChyZWxhdGVkT2JqZWN0c0tleSArICcuJylcblxuZ2V0Rm9ybVRhYmxlRmllbGRDb2RlID0gKGZvcm1UYWJsZUZpZWxkc0NvZGUsIGtleSkgLT5cblx0cmV0dXJuIF8uZmluZCBmb3JtVGFibGVGaWVsZHNDb2RlLCAgKGZvcm1UYWJsZUZpZWxkQ29kZSkgLT5cblx0XHRyZXR1cm4ga2V5LnN0YXJ0c1dpdGgoZm9ybVRhYmxlRmllbGRDb2RlICsgJy4nKVxuXG5nZXRGb3JtVGFibGVGaWVsZCA9IChmb3JtVGFibGVGaWVsZHMsIGtleSkgLT5cblx0cmV0dXJuIF8uZmluZCBmb3JtVGFibGVGaWVsZHMsICAoZikgLT5cblx0XHRyZXR1cm4gZi5jb2RlID09IGtleVxuXG5nZXRGb3JtRmllbGQgPSAoZm9ybUZpZWxkcywga2V5KSAtPlxuXHRmZiA9IG51bGxcblx0Xy5mb3JFYWNoIGZvcm1GaWVsZHMsIChmKSAtPlxuXHRcdGlmIGZmXG5cdFx0XHRyZXR1cm5cblx0XHRpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRmZiA9IF8uZmluZCBmLmZpZWxkcywgIChzZikgLT5cblx0XHRcdFx0cmV0dXJuIHNmLmNvZGUgPT0ga2V5XG5cdFx0ZWxzZSBpZiBmLmNvZGUgPT0ga2V5XG5cdFx0XHRmZiA9IGZcblxuXHRyZXR1cm4gZmZcblxuZ2V0Rm9ybVRhYmxlU3ViRmllbGQgPSAodGFibGVGaWVsZCwgc3ViRmllbGRDb2RlKSAtPlxuXHRyZXR1cm4gXy5maW5kIHRhYmxlRmllbGQuZmllbGRzLCAgKGYpIC0+XG5cdFx0cmV0dXJuIGYuY29kZSA9PSBzdWJGaWVsZENvZGVcblxuZ2V0RmllbGRPZGF0YVZhbHVlID0gKG9iak5hbWUsIGlkLCByZWZlcmVuY2VUb0ZpZWxkTmFtZSkgLT5cblx0IyBvYmogPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqTmFtZSlcblx0b2JqID0gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iak5hbWUpXG5cdG5hbWVLZXkgPSBnZXRPYmplY3ROYW1lRmllbGRLZXkob2JqTmFtZSlcblx0aWYgIW9ialxuXHRcdHJldHVyblxuXHRpZiBfLmlzU3RyaW5nIGlkXG5cdFx0IyBfcmVjb3JkID0gb2JqLmZpbmRPbmUoaWQpXG5cdFx0X3JlY29yZCA9IG9iamVjdEZpbmRPbmUob2JqTmFtZSwgeyBmaWx0ZXJzOiBbW3JlZmVyZW5jZVRvRmllbGROYW1lLCAnPScsIGlkXV19KVxuXHRcdGlmIF9yZWNvcmRcblx0XHRcdF9yZWNvcmRbJ0BsYWJlbCddID0gX3JlY29yZFtuYW1lS2V5XVxuXHRcdFx0cmV0dXJuIF9yZWNvcmRcblx0ZWxzZSBpZiBfLmlzQXJyYXkgaWRcblx0XHRfcmVjb3JkcyA9IFtdXG5cdFx0IyBvYmouZmluZCh7IF9pZDogeyAkaW46IGlkIH0gfSlcblx0XHRvYmplY3RGaW5kKG9iak5hbWUsIHsgZmlsdGVyczogW1tyZWZlcmVuY2VUb0ZpZWxkTmFtZSwgJ2luJywgaWRdXX0pLmZvckVhY2ggKF9yZWNvcmQpIC0+XG5cdFx0XHRfcmVjb3JkWydAbGFiZWwnXSA9IF9yZWNvcmRbbmFtZUtleV1cblx0XHRcdF9yZWNvcmRzLnB1c2ggX3JlY29yZFxuXHRcdGlmICFfLmlzRW1wdHkgX3JlY29yZHNcblx0XHRcdHJldHVybiBfcmVjb3Jkc1xuXHRyZXR1cm5cblxuZ2V0U2VsZWN0VXNlclZhbHVlID0gKHVzZXJJZCwgc3BhY2VJZCkgLT5cblx0c3UgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ3NwYWNlX3VzZXJzJykuZmluZE9uZSh7IHNwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWQgfSlcblx0c3UuaWQgPSB1c2VySWRcblx0cmV0dXJuIHN1XG5cbmdldFNlbGVjdFVzZXJWYWx1ZXMgPSAodXNlcklkcywgc3BhY2VJZCkgLT5cblx0c3VzID0gW11cblx0aWYgXy5pc0FycmF5IHVzZXJJZHNcblx0XHRfLmVhY2ggdXNlcklkcywgKHVzZXJJZCkgLT5cblx0XHRcdHN1ID0gZ2V0U2VsZWN0VXNlclZhbHVlKHVzZXJJZCwgc3BhY2VJZClcblx0XHRcdGlmIHN1XG5cdFx0XHRcdHN1cy5wdXNoKHN1KVxuXHRyZXR1cm4gc3VzXG5cbmdldFNlbGVjdE9yZ1ZhbHVlID0gKG9yZ0lkLCBzcGFjZUlkKSAtPlxuXHRvcmcgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ29yZ2FuaXphdGlvbnMnKS5maW5kT25lKG9yZ0lkLCB7IGZpZWxkczogeyBfaWQ6IDEsIG5hbWU6IDEsIGZ1bGxuYW1lOiAxIH0gfSlcblx0b3JnLmlkID0gb3JnSWRcblx0cmV0dXJuIG9yZ1xuXG5nZXRTZWxlY3RPcmdWYWx1ZXMgPSAob3JnSWRzLCBzcGFjZUlkKSAtPlxuXHRvcmdzID0gW11cblx0aWYgXy5pc0FycmF5IG9yZ0lkc1xuXHRcdF8uZWFjaCBvcmdJZHMsIChvcmdJZCkgLT5cblx0XHRcdG9yZyA9IGdldFNlbGVjdE9yZ1ZhbHVlKG9yZ0lkLCBzcGFjZUlkKVxuXHRcdFx0aWYgb3JnXG5cdFx0XHRcdG9yZ3MucHVzaChvcmcpXG5cdHJldHVybiBvcmdzXG5cbmdldEZpbGVGaWVsZFZhbHVlID0gKHJlY29yZEZpZWxkSWQsIGZUeXBlKS0+XG5cdGlmIF8uaXNFbXB0eShyZWNvcmRGaWVsZElkKVxuXHRcdHJldHVybiBcblx0aWYgZlR5cGUgPT0gJ2ltYWdlJ1xuXHRcdGNvbGxlY3Rpb24gPSAnaW1hZ2VzJ1xuXHRlbHNlIGlmIGZUeXBlID09ICdmaWxlJ1xuXHRcdGNvbGxlY3Rpb24gPSAnZmlsZXMnXG5cdGlmIF8uaXNTdHJpbmcocmVjb3JkRmllbGRJZClcblx0XHRxdWVyeSA9IHtfaWQ6IHskaW46IFtyZWNvcmRGaWVsZElkXX19XG5cdGVsc2Vcblx0XHRxdWVyeSA9IHtfaWQ6IHskaW46IHJlY29yZEZpZWxkSWR9fVxuXHRmaWxlcyA9IENyZWF0b3IuQ29sbGVjdGlvbnNbXCJjZnMuI3tjb2xsZWN0aW9ufS5maWxlcmVjb3JkXCJdLmZpbmQocXVlcnkpO1xuXHR2YWx1ZSA9IFtdXG5cdGZpbGVzLmZvckVhY2ggKGYpIC0+XG5cdFx0bmV3RmlsZSA9IG5ldyBGUy5GaWxlKClcblx0XHRuZXdGaWxlLmF0dGFjaERhdGEgZi5jcmVhdGVSZWFkU3RyZWFtKCdmaWxlcycpLCB7XG5cdFx0XHRcdHR5cGU6IGYub3JpZ2luYWwudHlwZVxuXHRcdH0sIChlcnIpIC0+XG5cdFx0XHRpZiAoZXJyKVxuXHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVyci5lcnJvciwgZXJyLnJlYXNvbilcblxuXHRcdFx0bmV3RmlsZS5uYW1lKGYubmFtZSgpKVxuXHRcdFx0bmV3RmlsZS5zaXplKGYuc2l6ZSgpKVxuXHRcdFx0bWV0YWRhdGEgPSB7XG5cdFx0XHRcdG93bmVyOiBmLm1ldGFkYXRhLm93bmVyXG5cdFx0XHR9XG5cdFx0XHRuZXdGaWxlLm1ldGFkYXRhID0gbWV0YWRhdGE7XG5cdFx0XHRuZXdGaWxlLl9pZCA9IENyZWF0b3IuQ29sbGVjdGlvbnMuaW5zdGFuY2VzLl9tYWtlTmV3SUQoKTtcblx0XHRcdGNmc1tjb2xsZWN0aW9uXS5pbnNlcnQobmV3RmlsZSk7XG5cdFx0XHR2YWx1ZS5wdXNoKG5ld0ZpbGUuX2lkKVxuXHRpZiB2YWx1ZS5sZW5ndGggPiAwXG5cdFx0aWYgXy5pc1N0cmluZyhyZWNvcmRGaWVsZElkKVxuXHRcdFx0cmV0dXJuIHZhbHVlWzBdXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5nZXRJbnN0YW5jZUZpZWxkVmFsdWUgPSAob2JqRmllbGQsIGZvcm1GaWVsZCwgcmVjb3JkLCBvYmplY3RfZmllbGQsIHNwYWNlSWQsIHJlY29yZEZpZWxkVmFsdWUsIGVuYWJsZUFtaXNmb3JtKSAtPlxuXG5cdGlmIGVuYWJsZUFtaXNmb3JtICYmIGZvcm1GaWVsZC5zdGVlZG9zX2ZpZWxkXG5cdFx0cmV0dXJuIHJlY29yZEZpZWxkVmFsdWVcblxuXHRyZWNvcmRGaWVsZFZhbHVlID0gcmVjb3JkW29iakZpZWxkLm5hbWVdXG5cdHZhbHVlXG5cdCMgbG9va3Vw44CBbWFzdGVyX2RldGFpbOWtl+auteWQjOatpeWIsG9kYXRh5a2X5q61XG5cdGlmIGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiBmb3JtRmllbGQudHlwZSA9PSAnb2RhdGEnICYmIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhvYmpGaWVsZC50eXBlKSAmJiBfLmlzU3RyaW5nKG9iakZpZWxkLnJlZmVyZW5jZV90bylcblx0XHRyZWZlcmVuY2VUb0ZpZWxkTmFtZSA9IG9iakZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJ1xuXHRcdHJlZmVyZW5jZVRvT2JqZWN0TmFtZSA9IG9iakZpZWxkLnJlZmVyZW5jZV90b1xuXHRcdG9kYXRhRmllbGRWYWx1ZVxuXHRcdGlmIG9iakZpZWxkLm11bHRpcGxlICYmIGZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0b2RhdGFGaWVsZFZhbHVlID0gZ2V0RmllbGRPZGF0YVZhbHVlKHJlZmVyZW5jZVRvT2JqZWN0TmFtZSwgcmVjb3JkRmllbGRWYWx1ZSwgcmVmZXJlbmNlVG9GaWVsZE5hbWUpXG5cdFx0ZWxzZSBpZiAhb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0b2RhdGFGaWVsZFZhbHVlID0gZ2V0RmllbGRPZGF0YVZhbHVlKHJlZmVyZW5jZVRvT2JqZWN0TmFtZSwgcmVjb3JkRmllbGRWYWx1ZSwgcmVmZXJlbmNlVG9GaWVsZE5hbWUpXG5cdFx0dmFsdWUgPSBvZGF0YUZpZWxkVmFsdWVcblx0ZWxzZSBpZiBmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgWyd1c2VyJywgJ2dyb3VwJ10uaW5jbHVkZXMoZm9ybUZpZWxkLnR5cGUpICYmIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhvYmpGaWVsZC50eXBlKSAmJiAoWyd1c2VycycsICdvcmdhbml6YXRpb25zJ10uaW5jbHVkZXMob2JqRmllbGQucmVmZXJlbmNlX3RvKSB8fCAoJ3NwYWNlX3VzZXJzJyA9PSBvYmpGaWVsZC5yZWZlcmVuY2VfdG8gJiYgJ3VzZXInID09IG9iakZpZWxkLnJlZmVyZW5jZV90b19maWVsZCkgKVxuXHRcdGlmICFfLmlzRW1wdHkocmVjb3JkRmllbGRWYWx1ZSlcblx0XHRcdHNlbGVjdEZpZWxkVmFsdWVcblx0XHRcdGlmIGZvcm1GaWVsZC50eXBlID09ICd1c2VyJ1xuXHRcdFx0XHRpZiBvYmpGaWVsZC5tdWx0aXBsZSAmJiBmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0XHRzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0VXNlclZhbHVlcyhyZWNvcmRGaWVsZFZhbHVlLCBzcGFjZUlkKVxuXHRcdFx0XHRlbHNlIGlmICFvYmpGaWVsZC5tdWx0aXBsZSAmJiAhZm9ybUZpZWxkLmlzX211bHRpc2VsZWN0XG5cdFx0XHRcdFx0c2VsZWN0RmllbGRWYWx1ZSA9IGdldFNlbGVjdFVzZXJWYWx1ZShyZWNvcmRGaWVsZFZhbHVlLCBzcGFjZUlkKVxuXHRcdFx0ZWxzZSBpZiBmb3JtRmllbGQudHlwZSA9PSAnZ3JvdXAnXG5cdFx0XHRcdGlmIG9iakZpZWxkLm11bHRpcGxlICYmIGZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RPcmdWYWx1ZXMocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZClcblx0XHRcdFx0ZWxzZSBpZiAhb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RPcmdWYWx1ZShyZWNvcmRGaWVsZFZhbHVlLCBzcGFjZUlkKVxuXHRcdFx0aWYgc2VsZWN0RmllbGRWYWx1ZVxuXHRcdFx0XHR2YWx1ZSA9IHNlbGVjdEZpZWxkVmFsdWVcblx0ZWxzZSBpZiBmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgZm9ybUZpZWxkLnR5cGUgPT0gJ2RhdGUnICYmIHJlY29yZEZpZWxkVmFsdWVcblx0XHR2YWx1ZSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZm9ybWF0RGF0ZShyZWNvcmRGaWVsZFZhbHVlKSAjIERhdGXovaxTdHJpbmdcblx0ZWxzZSBpZiBmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgZm9ybUZpZWxkLnR5cGUgPT0gJ3RpbWUnICYmIHJlY29yZEZpZWxkVmFsdWVcblx0XHR2YWx1ZSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZm9ybWF0VGltZShyZWNvcmRGaWVsZFZhbHVlKSAjIFRpbWXovaxTdHJpbmdcblx0ZWxzZSBpZiBmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgcmVjb3JkRmllbGRWYWx1ZSAmJiAoZm9ybUZpZWxkLnR5cGUgPT0gJ2ltYWdlJyB8fCBmb3JtRmllbGQudHlwZSA9PSAnZmlsZScpXG5cdFx0dmFsdWUgPSBnZXRGaWxlRmllbGRWYWx1ZShyZWNvcmRGaWVsZFZhbHVlLCBmb3JtRmllbGQudHlwZSlcblx0ZWxzZSBpZiBmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgcmVjb3JkRmllbGRWYWx1ZSAmJiBmb3JtRmllbGQudHlwZSA9PSAnbG9va3VwJyAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmpGaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0dmFsdWUgPSByZWNvcmRGaWVsZFZhbHVlXG5cdGVsc2UgaWYgZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIHJlY29yZEZpZWxkVmFsdWUgJiYgKGZvcm1GaWVsZC50eXBlID09ICdtdWx0aVNlbGVjdCcpXG5cdFx0dmFsdWUgPSByZWNvcmRGaWVsZFZhbHVlLmpvaW4oJywnKVxuXHRlbHNlIGlmIHJlY29yZC5oYXNPd25Qcm9wZXJ0eShvYmplY3RfZmllbGQpXG5cdFx0dmFsdWUgPSByZWNvcmRGaWVsZFZhbHVlXG5cdFxuXHRyZXR1cm4gdmFsdWVcblxuIyByZXF1aXJlZERldGFpbHPnu5PmnoRbXCLlrZDooajlkI0u5a2Q6KGo5LitbWFzdGVyX2RldGFpbOWtl+auteWQjVwiLCAuLi5dXG5jaGVja1JlcXVpcmVkRGV0YWlscyA9IChyZXF1aXJlZERldGFpbHMsIG1hc3RlclJlY29yZCkgLT5cblx0aWYgIV8uaXNFbXB0eSByZXF1aXJlZERldGFpbHNcblx0XHQjIOajgOafpeWtkOihqOW/heWhq++8jOWNs+WtkOihqOW/hemhu+acieiusOW9lVxuXHRcdHJlcXVpcmVkRGV0YWlscy5mb3JFYWNoIChyZCkgLT5cblx0XHRcdHN1YlRhYmxlTmFtZSA9IHJkLnNwbGl0KCcuJylbMF1cblx0XHRcdHN1YlRhYmxlTWFzdGVyRmllbGQgPSByZC5zcGxpdCgnLicpWzFdXG5cdFx0XHRzdWJPYmpDb25maWcgPSBnZXRPYmplY3RDb25maWcgc3ViVGFibGVOYW1lXG5cdFx0XHRtYXN0ZXJGaWVsZCA9IHN1Yk9iakNvbmZpZy5maWVsZHNbc3ViVGFibGVNYXN0ZXJGaWVsZF1cblx0XHRcdHJlZklkID0gbWFzdGVyRmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkIHx8ICdfaWQnXG5cdFx0XHRtYXN0ZXJGaWVsZFZhbHVlID0gbWFzdGVyUmVjb3JkW3JlZklkXVxuXHRcdFx0IyDmn6Xor6LlrZDooajorrDlvZVcblx0XHRcdHN1YlRhYmxlUmVjb3JkID0gb2JqZWN0RmluZE9uZShzdWJUYWJsZU5hbWUsIHsgZmlsdGVyczogW1tzdWJUYWJsZU1hc3RlckZpZWxkLCAnPScsIG1hc3RlckZpZWxkVmFsdWVdXSwgZmllbGRzOiBbc3ViVGFibGVNYXN0ZXJGaWVsZF0gfSlcblx0XHRcdGlmICFzdWJUYWJsZVJlY29yZFxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IgXCLor7flhYjmlrDlop4je3N1Yk9iakNvbmZpZy5sYWJlbH1cIlxuXHRcdHJldHVyblxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsID0ge31cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jaGVja19hdXRob3JpemF0aW9uID0gKHJlcSkgLT5cblx0cXVlcnkgPSByZXEucXVlcnlcblx0dXNlcklkID0gcXVlcnlbXCJYLVVzZXItSWRcIl1cblx0YXV0aFRva2VuID0gcXVlcnlbXCJYLUF1dGgtVG9rZW5cIl1cblxuXHRpZiBub3QgdXNlcklkIG9yIG5vdCBhdXRoVG9rZW5cblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yIDQwMSwgJ1VuYXV0aG9yaXplZCdcblxuXHRoYXNoZWRUb2tlbiA9IEFjY291bnRzLl9oYXNoTG9naW5Ub2tlbihhdXRoVG9rZW4pXG5cdHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZVxuXHRcdF9pZDogdXNlcklkLFxuXHRcdFwic2VydmljZXMucmVzdW1lLmxvZ2luVG9rZW5zLmhhc2hlZFRva2VuXCI6IGhhc2hlZFRva2VuXG5cblx0aWYgbm90IHVzZXJcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yIDQwMSwgJ1VuYXV0aG9yaXplZCdcblxuXHRyZXR1cm4gdXNlclxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlID0gKHNwYWNlX2lkKSAtPlxuXHRzcGFjZSA9IENyZWF0b3IuQ29sbGVjdGlvbnMuc3BhY2VzLmZpbmRPbmUoc3BhY2VfaWQpXG5cdGlmIG5vdCBzcGFjZVxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwic3BhY2VfaWTmnInor6/miJbmraRzcGFjZeW3sue7j+iiq+WIoOmZpFwiKVxuXHRyZXR1cm4gc3BhY2VcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGbG93ID0gKGZsb3dfaWQpIC0+XG5cdGZsb3cgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLmZsb3dzLmZpbmRPbmUoZmxvd19pZClcblx0aWYgbm90IGZsb3dcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcImlk5pyJ6K+v5oiW5q2k5rWB56iL5bey57uP6KKr5Yig6ZmkXCIpXG5cdHJldHVybiBmbG93XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2VVc2VyID0gKHNwYWNlX2lkLCB1c2VyX2lkKSAtPlxuXHRzcGFjZV91c2VyID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zcGFjZV91c2Vycy5maW5kT25lKHsgc3BhY2U6IHNwYWNlX2lkLCB1c2VyOiB1c2VyX2lkIH0pXG5cdGlmIG5vdCBzcGFjZV91c2VyXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCJ1c2VyX2lk5a+55bqU55qE55So5oi35LiN5bGe5LqO5b2T5YmNc3BhY2VcIilcblx0cmV0dXJuIHNwYWNlX3VzZXJcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZVVzZXJPcmdJbmZvID0gKHNwYWNlX3VzZXIpIC0+XG5cdGluZm8gPSBuZXcgT2JqZWN0XG5cdGluZm8ub3JnYW5pemF0aW9uID0gc3BhY2VfdXNlci5vcmdhbml6YXRpb25cblx0b3JnID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5vcmdhbml6YXRpb25zLmZpbmRPbmUoc3BhY2VfdXNlci5vcmdhbml6YXRpb24sIHsgZmllbGRzOiB7IG5hbWU6IDEgLCBmdWxsbmFtZTogMSB9IH0pXG5cdGluZm8ub3JnYW5pemF0aW9uX25hbWUgPSBvcmcubmFtZVxuXHRpbmZvLm9yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IG9yZy5mdWxsbmFtZVxuXHRyZXR1cm4gaW5mb1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd0VuYWJsZWQgPSAoZmxvdykgLT5cblx0aWYgZmxvdy5zdGF0ZSBpc250IFwiZW5hYmxlZFwiXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLmtYHnqIvmnKrlkK/nlKgs5pON5L2c5aSx6LSlXCIpXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaXNGbG93U3BhY2VNYXRjaGVkID0gKGZsb3csIHNwYWNlX2lkKSAtPlxuXHRpZiBmbG93LnNwYWNlIGlzbnQgc3BhY2VfaWRcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcIua1geeoi+WSjOW3peS9nOWMuklE5LiN5Yy56YWNXCIpXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Rm9ybSA9IChmb3JtX2lkKSAtPlxuXHRmb3JtID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5mb3Jtcy5maW5kT25lKGZvcm1faWQpXG5cdGlmIG5vdCBmb3JtXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgJ+ihqOWNlUlE5pyJ6K+v5oiW5q2k6KGo5Y2V5bey57uP6KKr5Yig6ZmkJylcblxuXHRyZXR1cm4gZm9ybVxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldENhdGVnb3J5ID0gKGNhdGVnb3J5X2lkKSAtPlxuXHRyZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5jYXRlZ29yaWVzLmZpbmRPbmUoY2F0ZWdvcnlfaWQpXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuY2hlY2tTeW5jRGlyZWN0aW9uID0gKG9iamVjdF9uYW1lLCBmbG93X2lkKSAtPlxuXHRvdyA9IENyZWF0b3IuQ29sbGVjdGlvbnMub2JqZWN0X3dvcmtmbG93cy5maW5kT25lKHtcblx0XHRvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG5cdFx0Zmxvd19pZDogZmxvd19pZFxuXHR9KVxuXHRpZiAhb3dcblx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCAn5pyq5om+5Yiw5a+56LGh5rWB56iL5pig5bCE6K6w5b2V44CCJylcblx0c3luY0RpcmVjdGlvbiA9IG93LnN5bmNfZGlyZWN0aW9uIHx8ICdib3RoJ1xuXHRpZiAhWydib3RoJywgJ29ial90b19pbnMnXS5pbmNsdWRlcyhzeW5jRGlyZWN0aW9uKVxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsICfkuI3mlK/mjIHnmoTlkIzmraXmlrnlkJHjgIInKVxuXG5cdHJldHVybiBcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jcmVhdGVfaW5zdGFuY2UgPSAoaW5zdGFuY2VfZnJvbV9jbGllbnQsIHVzZXJfaW5mbykgLT5cblx0Y2hlY2sgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0sIFN0cmluZ1xuXHRjaGVjayBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInNwYWNlXCJdLCBTdHJpbmdcblx0Y2hlY2sgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJmbG93XCJdLCBTdHJpbmdcblx0Y2hlY2sgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJyZWNvcmRfaWRzXCJdLCBbe286IFN0cmluZywgaWRzOiBbU3RyaW5nXX1dXG5cblx0IyDmoKHpqozlkIzmraXmlrnlkJFcblx0dXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jaGVja1N5bmNEaXJlY3Rpb24oaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJyZWNvcmRfaWRzXCJdWzBdLm8sIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiZmxvd1wiXSlcblxuXHQjIOagoemqjOaYr+WQpnJlY29yZOW3sue7j+WPkei1t+eahOeUs+ivt+i/mOWcqOWuoeaJueS4rVxuXHR1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrSXNJbkFwcHJvdmFsKGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXVswXSwgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJzcGFjZVwiXSlcblxuXHRzcGFjZV9pZCA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wic3BhY2VcIl1cblx0Zmxvd19pZCA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiZmxvd1wiXVxuXHR1c2VyX2lkID0gdXNlcl9pbmZvLl9pZFxuXHQjIOiOt+WPluWJjeWPsOaJgOS8oOeahHRyYWNlXG5cdHRyYWNlX2Zyb21fY2xpZW50ID0gbnVsbFxuXHQjIOiOt+WPluWJjeWPsOaJgOS8oOeahGFwcHJvdmVcblx0YXBwcm92ZV9mcm9tX2NsaWVudCA9IG51bGxcblx0aWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJ0cmFjZXNcIl0gYW5kIGluc3RhbmNlX2Zyb21fY2xpZW50W1widHJhY2VzXCJdWzBdXG5cdFx0dHJhY2VfZnJvbV9jbGllbnQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInRyYWNlc1wiXVswXVxuXHRcdGlmIHRyYWNlX2Zyb21fY2xpZW50W1wiYXBwcm92ZXNcIl0gYW5kIHRyYWNlX2Zyb21fY2xpZW50W1wiYXBwcm92ZXNcIl1bMF1cblx0XHRcdGFwcHJvdmVfZnJvbV9jbGllbnQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInRyYWNlc1wiXVswXVtcImFwcHJvdmVzXCJdWzBdXG5cblx0IyDojrflj5bkuIDkuKpzcGFjZVxuXHRzcGFjZSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2Uoc3BhY2VfaWQpXG5cdCMg6I635Y+W5LiA5LiqZmxvd1xuXHRmbG93ID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGbG93KGZsb3dfaWQpXG5cdCMg6I635Y+W5LiA5Liqc3BhY2XkuIvnmoTkuIDkuKp1c2VyXG5cdHNwYWNlX3VzZXIgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlcihzcGFjZV9pZCwgdXNlcl9pZClcblx0IyDojrflj5ZzcGFjZV91c2Vy5omA5Zyo55qE6YOo6Zeo5L+h5oGvXG5cdHNwYWNlX3VzZXJfb3JnX2luZm8gPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlck9yZ0luZm8oc3BhY2VfdXNlcilcblx0IyDliKTmlq3kuIDkuKpmbG935piv5ZCm5Li65ZCv55So54q25oCBXG5cdHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaXNGbG93RW5hYmxlZChmbG93KVxuXHQjIOWIpOaWreS4gOS4qmZsb3flkoxzcGFjZV9pZOaYr+WQpuWMuemFjVxuXHR1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd1NwYWNlTWF0Y2hlZChmbG93LCBzcGFjZV9pZClcblxuXHRmb3JtID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGb3JtKGZsb3cuZm9ybSlcblxuXHRwZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25NYW5hZ2VyLmdldEZsb3dQZXJtaXNzaW9ucyhmbG93X2lkLCB1c2VyX2lkKVxuXG5cdGlmIG5vdCBwZXJtaXNzaW9ucy5pbmNsdWRlcyhcImFkZFwiKVxuXHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5b2T5YmN55So5oi35rKh5pyJ5q2k5rWB56iL55qE5paw5bu65p2D6ZmQXCIpXG5cblx0bm93ID0gbmV3IERhdGVcblx0aW5zX29iaiA9IHt9XG5cdGluc19vYmouX2lkID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5pbnN0YW5jZXMuX21ha2VOZXdJRCgpXG5cdGluc19vYmouc3BhY2UgPSBzcGFjZV9pZFxuXHRpbnNfb2JqLmZsb3cgPSBmbG93X2lkXG5cdGluc19vYmouZmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50Ll9pZFxuXHRpbnNfb2JqLmZvcm0gPSBmbG93LmZvcm1cblx0aW5zX29iai5mb3JtX3ZlcnNpb24gPSBmbG93LmN1cnJlbnQuZm9ybV92ZXJzaW9uXG5cdGluc19vYmoubmFtZSA9IGZsb3cubmFtZVxuXHRpbnNfb2JqLnN1Ym1pdHRlciA9IHVzZXJfaWRcblx0aW5zX29iai5zdWJtaXR0ZXJfbmFtZSA9IHVzZXJfaW5mby5uYW1lXG5cdGluc19vYmouYXBwbGljYW50ID0gaWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudFwiXSBlbHNlIHVzZXJfaWRcblx0aW5zX29iai5hcHBsaWNhbnRfbmFtZSA9IGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X25hbWVcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9uYW1lXCJdIGVsc2UgdXNlcl9pbmZvLm5hbWVcblx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uID0gaWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uXCJdIHRoZW4gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uXCJdIGVsc2Ugc3BhY2VfdXNlci5vcmdhbml6YXRpb25cblx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWUgPSBpZiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiXSB0aGVuIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCJdIGVsc2Ugc3BhY2VfdXNlcl9vcmdfaW5mby5vcmdhbml6YXRpb25fbmFtZVxuXHRpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWUgPSBpZiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWVcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fZnVsbG5hbWVcIl0gZWxzZSAgc3BhY2VfdXNlcl9vcmdfaW5mby5vcmdhbml6YXRpb25fZnVsbG5hbWVcblx0aW5zX29iai5hcHBsaWNhbnRfY29tcGFueSA9IGlmIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X2NvbXBhbnlcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9jb21wYW55XCJdIGVsc2Ugc3BhY2VfdXNlci5jb21wYW55X2lkXG5cdGluc19vYmouc3RhdGUgPSAnZHJhZnQnXG5cdGluc19vYmouY29kZSA9ICcnXG5cdGluc19vYmouaXNfYXJjaGl2ZWQgPSBmYWxzZVxuXHRpbnNfb2JqLmlzX2RlbGV0ZWQgPSBmYWxzZVxuXHRpbnNfb2JqLmNyZWF0ZWQgPSBub3dcblx0aW5zX29iai5jcmVhdGVkX2J5ID0gdXNlcl9pZFxuXHRpbnNfb2JqLm1vZGlmaWVkID0gbm93XG5cdGluc19vYmoubW9kaWZpZWRfYnkgPSB1c2VyX2lkXG5cblx0aW5zX29iai5yZWNvcmRfaWRzID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJyZWNvcmRfaWRzXCJdXG5cblx0aWYgc3BhY2VfdXNlci5jb21wYW55X2lkXG5cdFx0aW5zX29iai5jb21wYW55X2lkID0gc3BhY2VfdXNlci5jb21wYW55X2lkXG5cblx0IyDmlrDlu7pUcmFjZVxuXHR0cmFjZV9vYmogPSB7fVxuXHR0cmFjZV9vYmouX2lkID0gbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0clxuXHR0cmFjZV9vYmouaW5zdGFuY2UgPSBpbnNfb2JqLl9pZFxuXHR0cmFjZV9vYmouaXNfZmluaXNoZWQgPSBmYWxzZVxuXHQjIOW9k+WJjeacgOaWsOeJiGZsb3fkuK3lvIDlp4voioLngrlcblx0c3RhcnRfc3RlcCA9IF8uZmluZChmbG93LmN1cnJlbnQuc3RlcHMsIChzdGVwKSAtPlxuXHRcdHJldHVybiBzdGVwLnN0ZXBfdHlwZSBpcyAnc3RhcnQnXG5cdClcblx0dHJhY2Vfb2JqLnN0ZXAgPSBzdGFydF9zdGVwLl9pZFxuXHR0cmFjZV9vYmoubmFtZSA9IHN0YXJ0X3N0ZXAubmFtZVxuXG5cdHRyYWNlX29iai5zdGFydF9kYXRlID0gbm93XG5cdCMg5paw5bu6QXBwcm92ZVxuXHRhcHByX29iaiA9IHt9XG5cdGFwcHJfb2JqLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHJcblx0YXBwcl9vYmouaW5zdGFuY2UgPSBpbnNfb2JqLl9pZFxuXHRhcHByX29iai50cmFjZSA9IHRyYWNlX29iai5faWRcblx0YXBwcl9vYmouaXNfZmluaXNoZWQgPSBmYWxzZVxuXHRhcHByX29iai51c2VyID0gaWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0gdGhlbiBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudFwiXSBlbHNlIHVzZXJfaWRcblx0YXBwcl9vYmoudXNlcl9uYW1lID0gaWYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfbmFtZVwiXSB0aGVuIGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X25hbWVcIl0gZWxzZSB1c2VyX2luZm8ubmFtZVxuXHRhcHByX29iai5oYW5kbGVyID0gdXNlcl9pZFxuXHRhcHByX29iai5oYW5kbGVyX25hbWUgPSB1c2VyX2luZm8ubmFtZVxuXHRhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbiA9IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uXG5cdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUgPSBzcGFjZV91c2VyX29yZ19pbmZvLm5hbWVcblx0YXBwcl9vYmouaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUgPSBzcGFjZV91c2VyX29yZ19pbmZvLmZ1bGxuYW1lXG5cdGFwcHJfb2JqLnR5cGUgPSAnZHJhZnQnXG5cdGFwcHJfb2JqLnN0YXJ0X2RhdGUgPSBub3dcblx0YXBwcl9vYmoucmVhZF9kYXRlID0gbm93XG5cdGFwcHJfb2JqLmlzX3JlYWQgPSB0cnVlXG5cdGFwcHJfb2JqLmlzX2Vycm9yID0gZmFsc2Vcblx0YXBwcl9vYmouZGVzY3JpcHRpb24gPSAnJ1xuXHRyZWxhdGVkVGFibGVzSW5mbyA9IHt9XG5cdGFwcHJfb2JqLnZhbHVlcyA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVWYWx1ZXMoaW5zX29iai5yZWNvcmRfaWRzWzBdLCBmbG93X2lkLCBzcGFjZV9pZCwgZm9ybS5jdXJyZW50LmZpZWxkcywgcmVsYXRlZFRhYmxlc0luZm8pXG5cblx0dHJhY2Vfb2JqLmFwcHJvdmVzID0gW2FwcHJfb2JqXVxuXHRpbnNfb2JqLnRyYWNlcyA9IFt0cmFjZV9vYmpdXG5cblx0aW5zX29iai52YWx1ZXMgPSBhcHByX29iai52YWx1ZXNcblxuXHRpbnNfb2JqLmluYm94X3VzZXJzID0gaW5zdGFuY2VfZnJvbV9jbGllbnQuaW5ib3hfdXNlcnMgfHwgW11cblxuXHRpbnNfb2JqLmN1cnJlbnRfc3RlcF9uYW1lID0gc3RhcnRfc3RlcC5uYW1lXG5cblx0aWYgZmxvdy5hdXRvX3JlbWluZCBpcyB0cnVlXG5cdFx0aW5zX29iai5hdXRvX3JlbWluZCA9IHRydWVcblxuXHQjIOaWsOW7uueUs+ivt+WNleaXtu+8jGluc3RhbmNlc+iusOW9lea1geeoi+WQjeensOOAgea1geeoi+WIhuexu+WQjeensCAjMTMxM1xuXHRpbnNfb2JqLmZsb3dfbmFtZSA9IGZsb3cubmFtZVxuXHRpZiBmb3JtLmNhdGVnb3J5XG5cdFx0Y2F0ZWdvcnkgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldENhdGVnb3J5KGZvcm0uY2F0ZWdvcnkpXG5cdFx0aWYgY2F0ZWdvcnlcblx0XHRcdGluc19vYmouY2F0ZWdvcnlfbmFtZSA9IGNhdGVnb3J5Lm5hbWVcblx0XHRcdGluc19vYmouY2F0ZWdvcnkgPSBjYXRlZ29yeS5faWRcblxuXHRuZXdfaW5zX2lkID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5pbnN0YW5jZXMuaW5zZXJ0KGluc19vYmopXG5cblx0dXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlY29yZEluc3RhbmNlSW5mbyhpbnNfb2JqLnJlY29yZF9pZHNbMF0sIG5ld19pbnNfaWQsIHNwYWNlX2lkKVxuXG5cdCMgdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlbGF0ZWRSZWNvcmRJbnN0YW5jZUluZm8ocmVsYXRlZFRhYmxlc0luZm8sIG5ld19pbnNfaWQsIHNwYWNlX2lkKVxuXG5cdHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVBdHRhY2goaW5zX29iai5yZWNvcmRfaWRzWzBdLCBzcGFjZV9pZCwgaW5zX29iai5faWQsIGFwcHJfb2JqLl9pZClcblxuXHRyZXR1cm4gbmV3X2luc19pZFxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlVmFsdWVzID0gKHJlY29yZElkcywgZmxvd0lkLCBzcGFjZUlkLCBmaWVsZHMsIHJlbGF0ZWRUYWJsZXNJbmZvKSAtPlxuXHRmaWVsZENvZGVzID0gW11cblx0Xy5lYWNoIGZpZWxkcywgKGYpIC0+XG5cdFx0aWYgZi50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0Xy5lYWNoIGYuZmllbGRzLCAoZmYpIC0+XG5cdFx0XHRcdGZpZWxkQ29kZXMucHVzaCBmZi5jb2RlXG5cdFx0ZWxzZVxuXHRcdFx0ZmllbGRDb2Rlcy5wdXNoIGYuY29kZVxuXG5cdHZhbHVlcyA9IHt9XG5cdG9iamVjdE5hbWUgPSByZWNvcmRJZHMub1xuXHRvYmplY3QgPSBnZXRPYmplY3RDb25maWcob2JqZWN0TmFtZSlcblx0cmVjb3JkSWQgPSByZWNvcmRJZHMuaWRzWzBdXG5cdG93ID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3Rfd29ya2Zsb3dzLmZpbmRPbmUoe1xuXHRcdG9iamVjdF9uYW1lOiBvYmplY3ROYW1lLFxuXHRcdGZsb3dfaWQ6IGZsb3dJZFxuXHR9KVxuXHQjIHJlY29yZCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3ROYW1lLCBzcGFjZUlkKS5maW5kT25lKHJlY29yZElkKVxuXHRyZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iamVjdE5hbWUsIHsgZmlsdGVyczogW1snX2lkJywgJz0nLCByZWNvcmRJZF1dfSlcblx0ZmxvdyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignZmxvd3MnKS5maW5kT25lKGZsb3dJZCwgeyBmaWVsZHM6IHsgZm9ybTogMSwgZW5hYmxlQW1pc2Zvcm06IDEgfSB9KVxuXHRlbmFibGVBbWlzZm9ybSA9IGZsb3cuZW5hYmxlX2FtaXNmb3JtXG5cdGlmIG93IGFuZCByZWNvcmRcblx0XHRyZXF1aXJlZERldGFpbHMgPSBvdy5yZXF1aXJlZF9kZXRhaWxzIHx8IFtdXG5cdFx0Y2hlY2tSZXF1aXJlZERldGFpbHMocmVxdWlyZWREZXRhaWxzLCByZWNvcmQpXG5cblx0XHRmb3JtID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwiZm9ybXNcIikuZmluZE9uZShmbG93LmZvcm0pXG5cdFx0Zm9ybUZpZWxkcyA9IGZvcm0uY3VycmVudC5maWVsZHMgfHwgW11cblx0XHRyZWxhdGVkT2JqZWN0cyA9IGdldFJlbGF0ZWRzKG9iamVjdE5hbWUpXG5cdFx0cmVsYXRlZE9iamVjdHNLZXlzID0gXy5wbHVjayhyZWxhdGVkT2JqZWN0cywgJ29iamVjdF9uYW1lJylcblx0XHRmb3JtVGFibGVGaWVsZHMgPSBfLmZpbHRlciBmb3JtRmllbGRzLCAoZm9ybUZpZWxkKSAtPlxuXHRcdFx0cmV0dXJuIGZvcm1GaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRmb3JtVGFibGVGaWVsZHNDb2RlID0gXy5wbHVjayhmb3JtVGFibGVGaWVsZHMsICdjb2RlJylcblxuXHRcdCMgc3RlZWRvcyBmaWVsZCDkuK3lrprkuYnnmoRncmlk44CBdGFibGXnsbvlnovlrZfmrrVcblx0XHR0YWJsZUZpZWxkQ29kZXMgPSBbXVxuXHRcdHRhYmxlRmllbGRNYXAgPSBbXVxuXHRcdCMg55u45YWz6KGoXG5cdFx0dGFibGVUb1JlbGF0ZWRNYXAgPSB7fVxuXG5cdFx0IyBmaWVsZF9tYXA6IOS7juWPsOi0puWIsOWuoeaJueWNleeahOWtl+auteWQjOatpeaYoOWwhOinhOWImVxuXHRcdG93LmZpZWxkX21hcD8uZm9yRWFjaCAoZm0pIC0+XG5cdFx0XHRvYmplY3RfZmllbGQgPSBmbS5vYmplY3RfZmllbGRcblx0XHRcdHdvcmtmbG93X2ZpZWxkID0gZm0ud29ya2Zsb3dfZmllbGRcblx0XHRcdGlmICFvYmplY3RfZmllbGQgfHwgIXdvcmtmbG93X2ZpZWxkXG5cdFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCAn5pyq5om+5Yiw5a2X5q6177yM6K+35qOA5p+l5a+56LGh5rWB56iL5pig5bCE5a2X5q616YWN572uJylcblx0XHRcdHJlbGF0ZWRPYmplY3RGaWVsZENvZGUgPSBnZXRSZWxhdGVkT2JqZWN0RmllbGRDb2RlKHJlbGF0ZWRPYmplY3RzS2V5cywgb2JqZWN0X2ZpZWxkKVxuXHRcdFx0Zm9ybVRhYmxlRmllbGRDb2RlID0gZ2V0Rm9ybVRhYmxlRmllbGRDb2RlKGZvcm1UYWJsZUZpZWxkc0NvZGUsIHdvcmtmbG93X2ZpZWxkKVxuXHRcdFx0b2JqRmllbGQgPSBvYmplY3QuZmllbGRzW29iamVjdF9maWVsZF1cblx0XHRcdGZvcm1GaWVsZCA9IGdldEZvcm1GaWVsZChmb3JtRmllbGRzLCB3b3JrZmxvd19maWVsZClcblx0XHRcdHJlY29yZEZpZWxkVmFsdWUgPSByZWNvcmRbb2JqZWN0X2ZpZWxkXVxuXHRcdFx0IyDlpITnkIblrZDooajlrZfmrrVcblx0XHRcdGlmIHJlbGF0ZWRPYmplY3RGaWVsZENvZGVcblx0XHRcdFx0XG5cdFx0XHRcdG9UYWJsZUNvZGUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4nKVswXVxuXHRcdFx0XHRvVGFibGVGaWVsZENvZGUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4nKVsxXVxuXHRcdFx0XHR0YWJsZVRvUmVsYXRlZE1hcEtleSA9IG9UYWJsZUNvZGVcblx0XHRcdFx0aWYgIXRhYmxlVG9SZWxhdGVkTWFwW3RhYmxlVG9SZWxhdGVkTWFwS2V5XVxuXHRcdFx0XHRcdHRhYmxlVG9SZWxhdGVkTWFwW3RhYmxlVG9SZWxhdGVkTWFwS2V5XSA9IHt9XG5cblx0XHRcdFx0aWYgZm9ybVRhYmxlRmllbGRDb2RlXG5cdFx0XHRcdFx0d1RhYmxlQ29kZSA9IHdvcmtmbG93X2ZpZWxkLnNwbGl0KCcuJylbMF1cblx0XHRcdFx0XHR0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV1bJ19GUk9NX1RBQkxFX0NPREUnXSA9IHdUYWJsZUNvZGVcblxuXHRcdFx0XHR0YWJsZVRvUmVsYXRlZE1hcFt0YWJsZVRvUmVsYXRlZE1hcEtleV1bb1RhYmxlRmllbGRDb2RlXSA9IHdvcmtmbG93X2ZpZWxkXG5cdFx0XHQjIOWIpOaWreaYr+WQpuaYr+ihqOagvOWtl+autShvYmplY3QgZmllbGQg55qEIGdyaWTjgIF0YWJsZSlcblx0XHRcdGVsc2UgaWYgd29ya2Zsb3dfZmllbGQuaW5kZXhPZignLicpID4gMCBhbmQgb2JqZWN0X2ZpZWxkLmluZGV4T2YoJy4kLicpID4gMFxuXHRcdFx0XHR3VGFibGVDb2RlID0gd29ya2Zsb3dfZmllbGQuc3BsaXQoJy4nKVswXVxuXHRcdFx0XHRvVGFibGVDb2RlID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJC4nKVswXSAgcmVmMS50YWJsZTEuJC5uYW1lXG5cdFx0XHRcdGlmIHJlY29yZC5oYXNPd25Qcm9wZXJ0eShvVGFibGVDb2RlKSBhbmQgXy5pc0FycmF5KHJlY29yZFtvVGFibGVDb2RlXSlcblx0XHRcdFx0XHR0YWJsZUZpZWxkQ29kZXMucHVzaChKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0XHR3b3JrZmxvd190YWJsZV9maWVsZF9jb2RlOiB3VGFibGVDb2RlLFxuXHRcdFx0XHRcdFx0b2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGU6IG9UYWJsZUNvZGVcblx0XHRcdFx0XHR9KSlcblx0XHRcdFx0XHR0YWJsZUZpZWxkTWFwLnB1c2goZm0pXG5cdFx0XHRcdGVsc2UgaWYgb1RhYmxlQ29kZS5pbmRleE9mKCcuJykgPiAwICMg6K+05piO5piv5YWz6IGU6KGo55qEZ3JpZOWtl+autVxuXHRcdFx0XHRcdG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZENvZGUgPSBvVGFibGVDb2RlLnNwbGl0KCcuJylbMF07XG5cdFx0XHRcdFx0Z3JpZENvZGUgPSBvVGFibGVDb2RlLnNwbGl0KCcuJylbMV07XG5cdFx0XHRcdFx0b1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkID0gb2JqZWN0LmZpZWxkc1tvVGFibGVDb2RlUmVmZXJlbmNlRmllbGRDb2RlXTtcblx0XHRcdFx0XHRpZiBvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQgJiYgWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZC50eXBlKSAmJiBfLmlzU3RyaW5nKG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0XHRpZiByZWNvcmRbb1RhYmxlQ29kZV1cblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0cmVmZXJlbmNlVG9GaWVsZE5hbWUgPSBvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkIHx8ICdfaWQnO1xuXHRcdFx0XHRcdFx0cmVmZXJlbmNlVG9PYmplY3ROYW1lID0gb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLnJlZmVyZW5jZV90bztcblx0XHRcdFx0XHRcdHJlZmVyZW5jZVRvRmllbGRWYWx1ZSA9IHJlY29yZFtvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQubmFtZV07XG5cdFx0XHRcdFx0XHQjIOatpOWkhOWAn+WKqWdldEZpZWxkT2RhdGFWYWx1ZeWHveaVsOeahOiDveWKmywg6I635Y+W5YWz6IGU6KGoKGxvb2t1cCnnmoTorrDlvZUuIOatpOWkhOacquacquiAg+iZkWxvb2t1cOWNlemAieeahOaDheWGtS4g5q2k5aSE6I635Y+W5YWz57O75pWw5o2u55qE5omA5pyJ5a2X5q61LCDkuqTnlLHkuIvmlrnnmoTooajmoLzmlbDmja7lkIzmraXnu5/kuIDmlbTnkIbmlbDmja5cblx0XHRcdFx0XHRcdHJlZmVyZW5jZVRvRG9jID0gZ2V0RmllbGRPZGF0YVZhbHVlKHJlZmVyZW5jZVRvT2JqZWN0TmFtZSwgcmVmZXJlbmNlVG9GaWVsZFZhbHVlLCByZWZlcmVuY2VUb0ZpZWxkTmFtZSk7XG5cdFx0XHRcdFx0XHRpZiByZWZlcmVuY2VUb0RvY1tncmlkQ29kZV1cblx0XHRcdFx0XHRcdFx0cmVjb3JkW29UYWJsZUNvZGVdID0gcmVmZXJlbmNlVG9Eb2NbZ3JpZENvZGVdO1xuXHRcdFx0XHRcdFx0XHR0YWJsZUZpZWxkQ29kZXMucHVzaChKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0XHRcdFx0d29ya2Zsb3dfdGFibGVfZmllbGRfY29kZTogd1RhYmxlQ29kZSxcblx0XHRcdFx0XHRcdFx0XHRvYmplY3RfdGFibGVfZmllbGRfY29kZTogb1RhYmxlQ29kZVxuXHRcdFx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0YWJsZUZpZWxkTWFwLnB1c2goZm0pO1xuXG5cdFx0XHQjIOWkhOeQhmxvb2t1cOOAgW1hc3Rlcl9kZXRhaWznsbvlnovlrZfmrrVcblx0XHRcdGVsc2UgaWYgb2JqZWN0X2ZpZWxkLmluZGV4T2YoJy4nKSA+IDAgYW5kIG9iamVjdF9maWVsZC5pbmRleE9mKCcuJC4nKSA9PSAtMVxuXHRcdFx0XHRvYmplY3RGaWVsZE5hbWUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4nKVswXVxuXHRcdFx0XHRsb29rdXBGaWVsZE5hbWUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4nKVsxXVxuXHRcdFx0XHRpZiBvYmplY3Rcblx0XHRcdFx0XHRvYmplY3RGaWVsZCA9IG9iamVjdC5maWVsZHNbb2JqZWN0RmllbGROYW1lXVxuXHRcdFx0XHRcdGlmIG9iamVjdEZpZWxkICYmIGZvcm1GaWVsZCAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqZWN0RmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmplY3RGaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0XHRsb29rdXBPYmplY3RSZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iamVjdEZpZWxkLnJlZmVyZW5jZV90bywgeyBmaWx0ZXJzOiBbWydfaWQnLCAnPScsIHJlY29yZFtvYmplY3RGaWVsZE5hbWVdXV0sIGZpZWxkczogW2xvb2t1cEZpZWxkTmFtZV0gfSlcblx0XHRcdFx0XHRcdGlmICFsb29rdXBPYmplY3RSZWNvcmRcblx0XHRcdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdFx0XHRvYmplY3RGaWVsZE9iamVjdE5hbWUgPSBvYmplY3RGaWVsZC5yZWZlcmVuY2VfdG9cblx0XHRcdFx0XHRcdGxvb2t1cEZpZWxkT2JqID0gZ2V0T2JqZWN0Q29uZmlnKG9iamVjdEZpZWxkT2JqZWN0TmFtZSlcblx0XHRcdFx0XHRcdG9iamVjdExvb2t1cEZpZWxkID0gbG9va3VwRmllbGRPYmouZmllbGRzW2xvb2t1cEZpZWxkTmFtZV1cblxuXHRcdFx0XHRcdFx0dmFsdWVzW3dvcmtmbG93X2ZpZWxkXSA9IGdldEluc3RhbmNlRmllbGRWYWx1ZShvYmplY3RMb29rdXBGaWVsZCwgZm9ybUZpZWxkLCBsb29rdXBPYmplY3RSZWNvcmQsIGxvb2t1cEZpZWxkTmFtZSwgc3BhY2VJZCwgcmVjb3JkW2xvb2t1cEZpZWxkTmFtZV0sIGVuYWJsZUFtaXNmb3JtKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZXNbd29ya2Zsb3dfZmllbGRdID0gZ2V0SW5zdGFuY2VGaWVsZFZhbHVlKG9iakZpZWxkLCBmb3JtRmllbGQsIHJlY29yZCwgb2JqZWN0X2ZpZWxkLCBzcGFjZUlkLCByZWNvcmRbb2JqZWN0X2ZpZWxkXSwgZW5hYmxlQW1pc2Zvcm0pXG5cblx0XHQjIOihqOagvOWtl+autVxuXHRcdF8udW5pcSh0YWJsZUZpZWxkQ29kZXMpLmZvckVhY2ggKHRmYykgLT5cblx0XHRcdGMgPSBKU09OLnBhcnNlKHRmYylcblx0XHRcdHZhbHVlc1tjLndvcmtmbG93X3RhYmxlX2ZpZWxkX2NvZGVdID0gW11cblx0XHRcdHJlY29yZFtjLm9iamVjdF90YWJsZV9maWVsZF9jb2RlXS5mb3JFYWNoICh0cikgLT5cblx0XHRcdFx0bmV3VHIgPSB7fVxuXHRcdFx0XHRfLmVhY2ggdHIsICh0ZFZhbHVlLCBrKSAtPlxuXHRcdFx0XHRcdHRhYmxlRmllbGRNYXAuZm9yRWFjaCAodGZtKSAtPlxuXHRcdFx0XHRcdFx0aWYgdGZtLm9iamVjdF9maWVsZCBpcyAoYy5vYmplY3RfdGFibGVfZmllbGRfY29kZSArICcuJC4nICsgaylcblx0XHRcdFx0XHRcdFx0d1RkQ29kZSA9IHRmbS53b3JrZmxvd19maWVsZC5zcGxpdCgnLicpWzFdXG5cdFx0XHRcdFx0XHRcdG5ld1RyW3dUZENvZGVdID0gdGRWYWx1ZVxuXHRcdFx0XHRpZiBub3QgXy5pc0VtcHR5KG5ld1RyKVxuXHRcdFx0XHRcdHZhbHVlc1tjLndvcmtmbG93X3RhYmxlX2ZpZWxkX2NvZGVdLnB1c2gobmV3VHIpXG5cblx0XHQjIOWQjOatpeWtkOihqOaVsOaNruiHs+ihqOWNleihqOagvFxuXHRcdF8uZWFjaCB0YWJsZVRvUmVsYXRlZE1hcCwgIChtYXAsIGtleSkgLT5cblx0XHRcdHRhYmxlQ29kZSA9IG1hcC5fRlJPTV9UQUJMRV9DT0RFXG5cdFx0XHRmb3JtVGFibGVGaWVsZCA9IGdldEZvcm1UYWJsZUZpZWxkKGZvcm1UYWJsZUZpZWxkcywgdGFibGVDb2RlKVxuXHRcdFx0aWYgIXRhYmxlQ29kZVxuXHRcdFx0XHRjb25zb2xlLndhcm4oJ3RhYmxlVG9SZWxhdGVkOiBbJyArIGtleSArICddIG1pc3NpbmcgY29ycmVzcG9uZGluZyB0YWJsZS4nKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZWxhdGVkT2JqZWN0TmFtZSA9IGtleVxuXHRcdFx0XHR0YWJsZVZhbHVlcyA9IFtdXG5cdFx0XHRcdHJlbGF0ZWRUYWJsZUl0ZW1zID0gW11cblx0XHRcdFx0cmVsYXRlZE9iamVjdCA9IGdldE9iamVjdENvbmZpZyhyZWxhdGVkT2JqZWN0TmFtZSlcblx0XHRcdFx0cmVsYXRlZEZpZWxkID0gXy5maW5kIHJlbGF0ZWRPYmplY3QuZmllbGRzLCAoZikgLT5cblx0XHRcdFx0XHRyZXR1cm4gWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKGYudHlwZSkgJiYgZi5yZWZlcmVuY2VfdG8gPT0gb2JqZWN0TmFtZVxuXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZE5hbWUgPSByZWxhdGVkRmllbGQubmFtZVxuXG5cdFx0XHRcdHJlbGF0ZWRSZWNvcmRzID0gb2JqZWN0RmluZChyZWxhdGVkT2JqZWN0TmFtZSwge1xuXHRcdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRcdFtyZWxhdGVkRmllbGROYW1lLCAnPScsIHJlY29yZElkXVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSlcblxuXHRcdFx0XHRyZWxhdGVkUmVjb3Jkcy5mb3JFYWNoIChyZWxhdGVkUmVjb3JkKSAtPlxuXHRcdFx0XHRcdHRhYmxlVmFsdWVJdGVtID0ge31cblx0XHRcdFx0XHRfLmVhY2ggbWFwLCAodmFsdWVLZXksIGZpZWxkS2V5KSAtPlxuXHRcdFx0XHRcdFx0aWYgZmllbGRLZXkgIT0gJ19GUk9NX1RBQkxFX0NPREUnXG5cdFx0XHRcdFx0XHRcdHRhYmxlRmllbGRWYWx1ZVxuXHRcdFx0XHRcdFx0XHRmb3JtRmllbGRLZXlcblx0XHRcdFx0XHRcdFx0aWYgdmFsdWVLZXkuc3RhcnRzV2l0aCh0YWJsZUNvZGUgKyAnLicpXG5cdFx0XHRcdFx0XHRcdFx0Zm9ybUZpZWxkS2V5ID0gKHZhbHVlS2V5LnNwbGl0KFwiLlwiKVsxXSlcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGZvcm1GaWVsZEtleSA9IHZhbHVlS2V5XG5cdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRmb3JtRmllbGQgPSBnZXRGb3JtVGFibGVTdWJGaWVsZChmb3JtVGFibGVGaWVsZCwgZm9ybUZpZWxkS2V5KVxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkT2JqZWN0RmllbGQgPSByZWxhdGVkT2JqZWN0LmZpZWxkc1tmaWVsZEtleV1cblx0XHRcdFx0XHRcdFx0aWYgIWZvcm1GaWVsZCB8fCAhcmVsYXRlZE9iamVjdEZpZWxkXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdFx0XHRcdHRhYmxlRmllbGRWYWx1ZSA9IGdldEluc3RhbmNlRmllbGRWYWx1ZShyZWxhdGVkT2JqZWN0RmllbGQsIGZvcm1GaWVsZCwgcmVsYXRlZFJlY29yZCwgZmllbGRLZXksIHNwYWNlSWQsIHJlbGF0ZWRSZWNvcmRbZmllbGRLZXldLCBlbmFibGVBbWlzZm9ybSlcblx0XHRcdFx0XHRcdFx0dGFibGVWYWx1ZUl0ZW1bZm9ybUZpZWxkS2V5XSA9IHRhYmxlRmllbGRWYWx1ZVxuXHRcdFx0XHRcdGlmICFfLmlzRW1wdHkodGFibGVWYWx1ZUl0ZW0pXG5cdFx0XHRcdFx0XHR0YWJsZVZhbHVlSXRlbS5faWQgPSByZWxhdGVkUmVjb3JkLl9pZFxuXHRcdFx0XHRcdFx0dGFibGVWYWx1ZXMucHVzaCh0YWJsZVZhbHVlSXRlbSlcblx0XHRcdFx0XHRcdHJlbGF0ZWRUYWJsZUl0ZW1zLnB1c2goeyBfdGFibGU6IHsgX2lkOiByZWxhdGVkUmVjb3JkLl9pZCwgX2NvZGU6IHRhYmxlQ29kZSB9IH0gKVxuXG5cdFx0XHRcdHZhbHVlc1t0YWJsZUNvZGVdID0gdGFibGVWYWx1ZXNcblx0XHRcdFx0cmVsYXRlZFRhYmxlc0luZm9bcmVsYXRlZE9iamVjdE5hbWVdID0gcmVsYXRlZFRhYmxlSXRlbXNcblxuXHRcdCMg5aaC5p6c6YWN572u5LqG6ISa5pys5YiZ5omn6KGM6ISa5pysXG5cdFx0aWYgb3cuZmllbGRfbWFwX3NjcmlwdFxuXHRcdFx0Xy5leHRlbmQodmFsdWVzLCB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmV2YWxGaWVsZE1hcFNjcmlwdChvdy5maWVsZF9tYXBfc2NyaXB0LCBvYmplY3ROYW1lLCBzcGFjZUlkLCByZWNvcmRJZCkpXG5cblx0IyDov4fmu6Tmjol2YWx1ZXPkuK3nmoTpnZ7ms5VrZXlcblx0ZmlsdGVyVmFsdWVzID0ge31cblx0Xy5lYWNoIF8ua2V5cyh2YWx1ZXMpLCAoaykgLT5cblx0XHRpZiBmaWVsZENvZGVzLmluY2x1ZGVzKGspXG5cdFx0XHRmaWx0ZXJWYWx1ZXNba10gPSB2YWx1ZXNba11cblxuXHRyZXR1cm4gZmlsdGVyVmFsdWVzXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZXZhbEZpZWxkTWFwU2NyaXB0ID0gKGZpZWxkX21hcF9zY3JpcHQsIG9iamVjdE5hbWUsIHNwYWNlSWQsIG9iamVjdElkKSAtPlxuXHQjIHJlY29yZCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3ROYW1lLCBzcGFjZUlkKS5maW5kT25lKG9iamVjdElkKVxuXHRyZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iamVjdE5hbWUsIHsgZmlsdGVyczogW1snX2lkJywgJz0nLCBvYmplY3RJZF1dIH0pXG5cdHNjcmlwdCA9IFwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVjb3JkKSB7IFwiICsgZmllbGRfbWFwX3NjcmlwdCArIFwiIH1cIlxuXHRmdW5jID0gX2V2YWwoc2NyaXB0LCBcImZpZWxkX21hcF9zY3JpcHRcIilcblx0dmFsdWVzID0gZnVuYyhyZWNvcmQpXG5cdGlmIF8uaXNPYmplY3QgdmFsdWVzXG5cdFx0cmV0dXJuIHZhbHVlc1xuXHRlbHNlXG5cdFx0Y29uc29sZS5lcnJvciBcImV2YWxGaWVsZE1hcFNjcmlwdDog6ISa5pys6L+U5Zue5YC857G75Z6L5LiN5piv5a+56LGhXCJcblx0cmV0dXJuIHt9XG5cblxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlQXR0YWNoID0gKHJlY29yZElkcywgc3BhY2VJZCwgaW5zSWQsIGFwcHJvdmVJZCkgLT5cblxuXHRDcmVhdG9yLkNvbGxlY3Rpb25zWydjbXNfZmlsZXMnXS5maW5kKHtcblx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRwYXJlbnQ6IHJlY29yZElkc1xuXHR9KS5mb3JFYWNoIChjZikgLT5cblx0XHRfLmVhY2ggY2YudmVyc2lvbnMsICh2ZXJzaW9uSWQsIGlkeCkgLT5cblx0XHRcdGYgPSBDcmVhdG9yLkNvbGxlY3Rpb25zWydjZnMuZmlsZXMuZmlsZXJlY29yZCddLmZpbmRPbmUodmVyc2lvbklkKVxuXHRcdFx0bmV3RmlsZSA9IG5ldyBGUy5GaWxlKClcblxuXHRcdFx0bmV3RmlsZS5hdHRhY2hEYXRhIGYuY3JlYXRlUmVhZFN0cmVhbSgnZmlsZXMnKSwge1xuXHRcdFx0XHRcdHR5cGU6IGYub3JpZ2luYWwudHlwZVxuXHRcdFx0fSwgKGVycikgLT5cblx0XHRcdFx0aWYgKGVycilcblx0XHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVyci5lcnJvciwgZXJyLnJlYXNvbilcblxuXHRcdFx0XHRuZXdGaWxlLm5hbWUoZi5uYW1lKCkpXG5cdFx0XHRcdG5ld0ZpbGUuc2l6ZShmLnNpemUoKSlcblx0XHRcdFx0bWV0YWRhdGEgPSB7XG5cdFx0XHRcdFx0b3duZXI6IGYubWV0YWRhdGEub3duZXIsXG5cdFx0XHRcdFx0b3duZXJfbmFtZTogZi5tZXRhZGF0YS5vd25lcl9uYW1lLFxuXHRcdFx0XHRcdHNwYWNlOiBzcGFjZUlkLFxuXHRcdFx0XHRcdGluc3RhbmNlOiBpbnNJZCxcblx0XHRcdFx0XHRhcHByb3ZlOiBhcHByb3ZlSWRcblx0XHRcdFx0XHRwYXJlbnQ6IGNmLl9pZFxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgaWR4IGlzIDBcblx0XHRcdFx0XHRtZXRhZGF0YS5jdXJyZW50ID0gdHJ1ZVxuXG5cdFx0XHRcdG5ld0ZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YVxuXHRcdFx0XHRjZnMuaW5zdGFuY2VzLmluc2VydChuZXdGaWxlKVxuXG5cdHJldHVyblxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlUmVjb3JkSW5zdGFuY2VJbmZvID0gKHJlY29yZElkcywgaW5zSWQsIHNwYWNlSWQpIC0+XG5cdCMgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKHJlY29yZElkcy5vLCBzcGFjZUlkKS51cGRhdGUocmVjb3JkSWRzLmlkc1swXSwge1xuXHQjIFx0JHB1c2g6IHtcblx0IyBcdFx0aW5zdGFuY2VzOiB7XG5cdCMgXHRcdFx0JGVhY2g6IFt7XG5cdCMgXHRcdFx0XHRfaWQ6IGluc0lkLFxuXHQjIFx0XHRcdFx0c3RhdGU6ICdkcmFmdCdcblx0IyBcdFx0XHR9XSxcblx0IyBcdFx0XHQkcG9zaXRpb246IDBcblx0IyBcdFx0fVxuXHQjIFx0fSxcblx0IyBcdCRzZXQ6IHtcblx0IyBcdFx0bG9ja2VkOiB0cnVlXG5cdCMgXHRcdGluc3RhbmNlX3N0YXRlOiAnZHJhZnQnXG5cdCMgXHR9XG5cdCMgfSlcblx0b2JqZWN0VXBkYXRlKHJlY29yZElkcy5vLCByZWNvcmRJZHMuaWRzWzBdLCB7XG5cdFx0aW5zdGFuY2VzOiBbe1xuXHRcdFx0X2lkOiBpbnNJZCxcblx0XHRcdHN0YXRlOiAnZHJhZnQnXG5cdFx0fV0sXG5cdFx0bG9ja2VkOiB0cnVlLFxuXHRcdGluc3RhbmNlX3N0YXRlOiAnZHJhZnQnXG5cdH0pXG5cblx0cmV0dXJuXG5cblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlbGF0ZWRSZWNvcmRJbnN0YW5jZUluZm8gPSAocmVsYXRlZFRhYmxlc0luZm8sIGluc0lkLCBzcGFjZUlkKSAtPlxuXHRfLmVhY2ggcmVsYXRlZFRhYmxlc0luZm8sICh0YWJsZUl0ZW1zLCByZWxhdGVkT2JqZWN0TmFtZSkgLT5cblx0XHRyZWxhdGVkQ29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWxhdGVkT2JqZWN0TmFtZSwgc3BhY2VJZClcblx0XHRfLmVhY2ggdGFibGVJdGVtcywgKGl0ZW0pIC0+XG5cdFx0XHRyZWxhdGVkQ29sbGVjdGlvbi5kaXJlY3QudXBkYXRlKGl0ZW0uX3RhYmxlLl9pZCwge1xuXHRcdFx0XHQkc2V0OiB7XG5cdFx0XHRcdFx0aW5zdGFuY2VzOiBbe1xuXHRcdFx0XHRcdFx0X2lkOiBpbnNJZCxcblx0XHRcdFx0XHRcdHN0YXRlOiAnZHJhZnQnXG5cdFx0XHRcdFx0fV0sXG5cdFx0XHRcdFx0X3RhYmxlOiBpdGVtLl90YWJsZVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXG5cdHJldHVyblxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrSXNJbkFwcHJvdmFsID0gKHJlY29yZElkcywgc3BhY2VJZCkgLT5cblx0IyByZWNvcmQgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ocmVjb3JkSWRzLm8sIHNwYWNlSWQpLmZpbmRPbmUoe1xuXHQjIFx0X2lkOiByZWNvcmRJZHMuaWRzWzBdLCBpbnN0YW5jZXM6IHsgJGV4aXN0czogdHJ1ZSB9XG5cdCMgfSwgeyBmaWVsZHM6IHsgaW5zdGFuY2VzOiAxIH0gfSlcblx0cmVjb3JkID0gb2JqZWN0RmluZE9uZShyZWNvcmRJZHMubywgeyBmaWx0ZXJzOiBbWydfaWQnLCAnPScsIHJlY29yZElkcy5pZHNbMF1dXSwgZmllbGRzOiBbJ2luc3RhbmNlcyddIH0pXG5cblx0aWYgcmVjb3JkIGFuZCByZWNvcmQuaW5zdGFuY2VzIGFuZCByZWNvcmQuaW5zdGFuY2VzWzBdLnN0YXRlIGlzbnQgJ2NvbXBsZXRlZCcgYW5kIENyZWF0b3IuQ29sbGVjdGlvbnMuaW5zdGFuY2VzLmZpbmQocmVjb3JkLmluc3RhbmNlc1swXS5faWQpLmNvdW50KCkgPiAwXG5cdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLmraTorrDlvZXlt7Llj5HotbfmtYHnqIvmraPlnKjlrqHmibnkuK3vvIzlvoXlrqHmibnnu5PmnZ/mlrnlj6/lj5HotbfkuIvkuIDmrKHlrqHmibnvvIFcIilcblxuXHRyZXR1cm5cblxuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmZvcm1hdERhdGUgPSAoZGF0ZSkgLT5cblx0cmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZm9ybWF0VGltZSA9IChkYXRlKSAtPlxuXHRyZXR1cm4gbW9tZW50KGRhdGUpLnV0Y09mZnNldCgwKS5mb3JtYXQoXCIxOTcwLTAxLTAxVEhIOm1tOjAwLjAwMFtaXVwiKSIsInZhciBfZXZhbCwgY2hlY2tSZXF1aXJlZERldGFpbHMsIGdldEZpZWxkT2RhdGFWYWx1ZSwgZ2V0RmlsZUZpZWxkVmFsdWUsIGdldEZvcm1GaWVsZCwgZ2V0Rm9ybVRhYmxlRmllbGQsIGdldEZvcm1UYWJsZUZpZWxkQ29kZSwgZ2V0Rm9ybVRhYmxlU3ViRmllbGQsIGdldEluc3RhbmNlRmllbGRWYWx1ZSwgZ2V0T2JqZWN0Q29uZmlnLCBnZXRPYmplY3ROYW1lRmllbGRLZXksIGdldFJlbGF0ZWRPYmplY3RGaWVsZENvZGUsIGdldFJlbGF0ZWRzLCBnZXRTZWxlY3RPcmdWYWx1ZSwgZ2V0U2VsZWN0T3JnVmFsdWVzLCBnZXRTZWxlY3RVc2VyVmFsdWUsIGdldFNlbGVjdFVzZXJWYWx1ZXMsIG9iamVjdEZpbmQsIG9iamVjdEZpbmRPbmUsIG9iamVjdFVwZGF0ZSwgb2JqZWN0cWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbl9ldmFsID0gcmVxdWlyZSgnZXZhbCcpO1xuXG5vYmplY3RxbCA9IHJlcXVpcmUoJ0BzdGVlZG9zL29iamVjdHFsJyk7XG5cbmdldE9iamVjdENvbmZpZyA9IGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUpIHtcbiAgcmV0dXJuIG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS50b0NvbmZpZygpO1xufTtcblxuZ2V0T2JqZWN0TmFtZUZpZWxkS2V5ID0gZnVuY3Rpb24ob2JqZWN0QXBpTmFtZSkge1xuICByZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLk5BTUVfRklFTERfS0VZO1xufTtcblxuZ2V0UmVsYXRlZHMgPSBmdW5jdGlvbihvYmplY3RBcGlOYW1lKSB7XG4gIHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUsIGNiKSB7XG4gICAgcmV0dXJuIG9iamVjdHFsLmdldE9iamVjdChvYmplY3RBcGlOYW1lKS5nZXRSZWxhdGVkcygpLnRoZW4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICByZXR1cm4gY2IocmVqZWN0LCByZXNvbHZlKTtcbiAgICB9KTtcbiAgfSkob2JqZWN0QXBpTmFtZSk7XG59O1xuXG5vYmplY3RGaW5kT25lID0gZnVuY3Rpb24ob2JqZWN0QXBpTmFtZSwgcXVlcnkpIHtcbiAgcmV0dXJuIE1ldGVvci53cmFwQXN5bmMoZnVuY3Rpb24ob2JqZWN0QXBpTmFtZSwgcXVlcnksIGNiKSB7XG4gICAgcXVlcnkudG9wID0gMTtcbiAgICByZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLmZpbmQocXVlcnkpLnRoZW4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAocmVzb2x2ZSAmJiByZXNvbHZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKHJlamVjdCwgcmVzb2x2ZVswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2IocmVqZWN0LCBudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSkob2JqZWN0QXBpTmFtZSwgcXVlcnkpO1xufTtcblxub2JqZWN0RmluZCA9IGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUsIHF1ZXJ5KSB7XG4gIHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKG9iamVjdEFwaU5hbWUsIHF1ZXJ5LCBjYikge1xuICAgIHJldHVybiBvYmplY3RxbC5nZXRPYmplY3Qob2JqZWN0QXBpTmFtZSkuZmluZChxdWVyeSkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJldHVybiBjYihyZWplY3QsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9KShvYmplY3RBcGlOYW1lLCBxdWVyeSk7XG59O1xuXG5vYmplY3RVcGRhdGUgPSBmdW5jdGlvbihvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSkge1xuICByZXR1cm4gTWV0ZW9yLndyYXBBc3luYyhmdW5jdGlvbihvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSwgY2IpIHtcbiAgICByZXR1cm4gb2JqZWN0cWwuZ2V0T2JqZWN0KG9iamVjdEFwaU5hbWUpLnVwZGF0ZShpZCwgZGF0YSkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJldHVybiBjYihyZWplY3QsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9KShvYmplY3RBcGlOYW1lLCBpZCwgZGF0YSk7XG59O1xuXG5nZXRSZWxhdGVkT2JqZWN0RmllbGRDb2RlID0gZnVuY3Rpb24ocmVsYXRlZE9iamVjdHNLZXlzLCBrZXkpIHtcbiAgcmV0dXJuIF8uZmluZChyZWxhdGVkT2JqZWN0c0tleXMsIGZ1bmN0aW9uKHJlbGF0ZWRPYmplY3RzS2V5KSB7XG4gICAgcmV0dXJuIGtleS5zdGFydHNXaXRoKHJlbGF0ZWRPYmplY3RzS2V5ICsgJy4nKTtcbiAgfSk7XG59O1xuXG5nZXRGb3JtVGFibGVGaWVsZENvZGUgPSBmdW5jdGlvbihmb3JtVGFibGVGaWVsZHNDb2RlLCBrZXkpIHtcbiAgcmV0dXJuIF8uZmluZChmb3JtVGFibGVGaWVsZHNDb2RlLCBmdW5jdGlvbihmb3JtVGFibGVGaWVsZENvZGUpIHtcbiAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoZm9ybVRhYmxlRmllbGRDb2RlICsgJy4nKTtcbiAgfSk7XG59O1xuXG5nZXRGb3JtVGFibGVGaWVsZCA9IGZ1bmN0aW9uKGZvcm1UYWJsZUZpZWxkcywga2V5KSB7XG4gIHJldHVybiBfLmZpbmQoZm9ybVRhYmxlRmllbGRzLCBmdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuIGYuY29kZSA9PT0ga2V5O1xuICB9KTtcbn07XG5cbmdldEZvcm1GaWVsZCA9IGZ1bmN0aW9uKGZvcm1GaWVsZHMsIGtleSkge1xuICB2YXIgZmY7XG4gIGZmID0gbnVsbDtcbiAgXy5mb3JFYWNoKGZvcm1GaWVsZHMsIGZ1bmN0aW9uKGYpIHtcbiAgICBpZiAoZmYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGYudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmYgPSBfLmZpbmQoZi5maWVsZHMsIGZ1bmN0aW9uKHNmKSB7XG4gICAgICAgIHJldHVybiBzZi5jb2RlID09PSBrZXk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGYuY29kZSA9PT0ga2V5KSB7XG4gICAgICByZXR1cm4gZmYgPSBmO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmZjtcbn07XG5cbmdldEZvcm1UYWJsZVN1YkZpZWxkID0gZnVuY3Rpb24odGFibGVGaWVsZCwgc3ViRmllbGRDb2RlKSB7XG4gIHJldHVybiBfLmZpbmQodGFibGVGaWVsZC5maWVsZHMsIGZ1bmN0aW9uKGYpIHtcbiAgICByZXR1cm4gZi5jb2RlID09PSBzdWJGaWVsZENvZGU7XG4gIH0pO1xufTtcblxuZ2V0RmllbGRPZGF0YVZhbHVlID0gZnVuY3Rpb24ob2JqTmFtZSwgaWQsIHJlZmVyZW5jZVRvRmllbGROYW1lKSB7XG4gIHZhciBfcmVjb3JkLCBfcmVjb3JkcywgbmFtZUtleSwgb2JqO1xuICBvYmogPSBvYmplY3RxbC5nZXRPYmplY3Qob2JqTmFtZSk7XG4gIG5hbWVLZXkgPSBnZXRPYmplY3ROYW1lRmllbGRLZXkob2JqTmFtZSk7XG4gIGlmICghb2JqKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKGlkKSkge1xuICAgIF9yZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iak5hbWUsIHtcbiAgICAgIGZpbHRlcnM6IFtbcmVmZXJlbmNlVG9GaWVsZE5hbWUsICc9JywgaWRdXVxuICAgIH0pO1xuICAgIGlmIChfcmVjb3JkKSB7XG4gICAgICBfcmVjb3JkWydAbGFiZWwnXSA9IF9yZWNvcmRbbmFtZUtleV07XG4gICAgICByZXR1cm4gX3JlY29yZDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoXy5pc0FycmF5KGlkKSkge1xuICAgIF9yZWNvcmRzID0gW107XG4gICAgb2JqZWN0RmluZChvYmpOYW1lLCB7XG4gICAgICBmaWx0ZXJzOiBbW3JlZmVyZW5jZVRvRmllbGROYW1lLCAnaW4nLCBpZF1dXG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbihfcmVjb3JkKSB7XG4gICAgICBfcmVjb3JkWydAbGFiZWwnXSA9IF9yZWNvcmRbbmFtZUtleV07XG4gICAgICByZXR1cm4gX3JlY29yZHMucHVzaChfcmVjb3JkKTtcbiAgICB9KTtcbiAgICBpZiAoIV8uaXNFbXB0eShfcmVjb3JkcykpIHtcbiAgICAgIHJldHVybiBfcmVjb3JkcztcbiAgICB9XG4gIH1cbn07XG5cbmdldFNlbGVjdFVzZXJWYWx1ZSA9IGZ1bmN0aW9uKHVzZXJJZCwgc3BhY2VJZCkge1xuICB2YXIgc3U7XG4gIHN1ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdzcGFjZV91c2VycycpLmZpbmRPbmUoe1xuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIHVzZXI6IHVzZXJJZFxuICB9KTtcbiAgc3UuaWQgPSB1c2VySWQ7XG4gIHJldHVybiBzdTtcbn07XG5cbmdldFNlbGVjdFVzZXJWYWx1ZXMgPSBmdW5jdGlvbih1c2VySWRzLCBzcGFjZUlkKSB7XG4gIHZhciBzdXM7XG4gIHN1cyA9IFtdO1xuICBpZiAoXy5pc0FycmF5KHVzZXJJZHMpKSB7XG4gICAgXy5lYWNoKHVzZXJJZHMsIGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgICAgdmFyIHN1O1xuICAgICAgc3UgPSBnZXRTZWxlY3RVc2VyVmFsdWUodXNlcklkLCBzcGFjZUlkKTtcbiAgICAgIGlmIChzdSkge1xuICAgICAgICByZXR1cm4gc3VzLnB1c2goc3UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdXM7XG59O1xuXG5nZXRTZWxlY3RPcmdWYWx1ZSA9IGZ1bmN0aW9uKG9yZ0lkLCBzcGFjZUlkKSB7XG4gIHZhciBvcmc7XG4gIG9yZyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignb3JnYW5pemF0aW9ucycpLmZpbmRPbmUob3JnSWQsIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIG5hbWU6IDEsXG4gICAgICBmdWxsbmFtZTogMVxuICAgIH1cbiAgfSk7XG4gIG9yZy5pZCA9IG9yZ0lkO1xuICByZXR1cm4gb3JnO1xufTtcblxuZ2V0U2VsZWN0T3JnVmFsdWVzID0gZnVuY3Rpb24ob3JnSWRzLCBzcGFjZUlkKSB7XG4gIHZhciBvcmdzO1xuICBvcmdzID0gW107XG4gIGlmIChfLmlzQXJyYXkob3JnSWRzKSkge1xuICAgIF8uZWFjaChvcmdJZHMsIGZ1bmN0aW9uKG9yZ0lkKSB7XG4gICAgICB2YXIgb3JnO1xuICAgICAgb3JnID0gZ2V0U2VsZWN0T3JnVmFsdWUob3JnSWQsIHNwYWNlSWQpO1xuICAgICAgaWYgKG9yZykge1xuICAgICAgICByZXR1cm4gb3Jncy5wdXNoKG9yZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9yZ3M7XG59O1xuXG5nZXRGaWxlRmllbGRWYWx1ZSA9IGZ1bmN0aW9uKHJlY29yZEZpZWxkSWQsIGZUeXBlKSB7XG4gIHZhciBjb2xsZWN0aW9uLCBmaWxlcywgcXVlcnksIHZhbHVlO1xuICBpZiAoXy5pc0VtcHR5KHJlY29yZEZpZWxkSWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmVHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIGNvbGxlY3Rpb24gPSAnaW1hZ2VzJztcbiAgfSBlbHNlIGlmIChmVHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgY29sbGVjdGlvbiA9ICdmaWxlcyc7XG4gIH1cbiAgaWYgKF8uaXNTdHJpbmcocmVjb3JkRmllbGRJZCkpIHtcbiAgICBxdWVyeSA9IHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IFtyZWNvcmRGaWVsZElkXVxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkgPSB7XG4gICAgICBfaWQ6IHtcbiAgICAgICAgJGluOiByZWNvcmRGaWVsZElkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmaWxlcyA9IENyZWF0b3IuQ29sbGVjdGlvbnNbXCJjZnMuXCIgKyBjb2xsZWN0aW9uICsgXCIuZmlsZXJlY29yZFwiXS5maW5kKHF1ZXJ5KTtcbiAgdmFsdWUgPSBbXTtcbiAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgdmFyIG5ld0ZpbGU7XG4gICAgbmV3RmlsZSA9IG5ldyBGUy5GaWxlKCk7XG4gICAgcmV0dXJuIG5ld0ZpbGUuYXR0YWNoRGF0YShmLmNyZWF0ZVJlYWRTdHJlYW0oJ2ZpbGVzJyksIHtcbiAgICAgIHR5cGU6IGYub3JpZ2luYWwudHlwZVxuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgdmFyIG1ldGFkYXRhO1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVyci5lcnJvciwgZXJyLnJlYXNvbik7XG4gICAgICB9XG4gICAgICBuZXdGaWxlLm5hbWUoZi5uYW1lKCkpO1xuICAgICAgbmV3RmlsZS5zaXplKGYuc2l6ZSgpKTtcbiAgICAgIG1ldGFkYXRhID0ge1xuICAgICAgICBvd25lcjogZi5tZXRhZGF0YS5vd25lclxuICAgICAgfTtcbiAgICAgIG5ld0ZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICAgIG5ld0ZpbGUuX2lkID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5pbnN0YW5jZXMuX21ha2VOZXdJRCgpO1xuICAgICAgY2ZzW2NvbGxlY3Rpb25dLmluc2VydChuZXdGaWxlKTtcbiAgICAgIHJldHVybiB2YWx1ZS5wdXNoKG5ld0ZpbGUuX2lkKTtcbiAgICB9KTtcbiAgfSk7XG4gIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgaWYgKF8uaXNTdHJpbmcocmVjb3JkRmllbGRJZCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxufTtcblxuZ2V0SW5zdGFuY2VGaWVsZFZhbHVlID0gZnVuY3Rpb24ob2JqRmllbGQsIGZvcm1GaWVsZCwgcmVjb3JkLCBvYmplY3RfZmllbGQsIHNwYWNlSWQsIHJlY29yZEZpZWxkVmFsdWUsIGVuYWJsZUFtaXNmb3JtKSB7XG4gIHZhciBvZGF0YUZpZWxkVmFsdWUsIHJlZmVyZW5jZVRvRmllbGROYW1lLCByZWZlcmVuY2VUb09iamVjdE5hbWUsIHNlbGVjdEZpZWxkVmFsdWUsIHZhbHVlO1xuICBpZiAoZW5hYmxlQW1pc2Zvcm0gJiYgZm9ybUZpZWxkLnN0ZWVkb3NfZmllbGQpIHtcbiAgICByZXR1cm4gcmVjb3JkRmllbGRWYWx1ZTtcbiAgfVxuICByZWNvcmRGaWVsZFZhbHVlID0gcmVjb3JkW29iakZpZWxkLm5hbWVdO1xuICB2YWx1ZTtcbiAgaWYgKGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiBmb3JtRmllbGQudHlwZSA9PT0gJ29kYXRhJyAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob2JqRmllbGQudHlwZSkgJiYgXy5pc1N0cmluZyhvYmpGaWVsZC5yZWZlcmVuY2VfdG8pKSB7XG4gICAgcmVmZXJlbmNlVG9GaWVsZE5hbWUgPSBvYmpGaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCc7XG4gICAgcmVmZXJlbmNlVG9PYmplY3ROYW1lID0gb2JqRmllbGQucmVmZXJlbmNlX3RvO1xuICAgIG9kYXRhRmllbGRWYWx1ZTtcbiAgICBpZiAob2JqRmllbGQubXVsdGlwbGUgJiYgZm9ybUZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICBvZGF0YUZpZWxkVmFsdWUgPSBnZXRGaWVsZE9kYXRhVmFsdWUocmVmZXJlbmNlVG9PYmplY3ROYW1lLCByZWNvcmRGaWVsZFZhbHVlLCByZWZlcmVuY2VUb0ZpZWxkTmFtZSk7XG4gICAgfSBlbHNlIGlmICghb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgb2RhdGFGaWVsZFZhbHVlID0gZ2V0RmllbGRPZGF0YVZhbHVlKHJlZmVyZW5jZVRvT2JqZWN0TmFtZSwgcmVjb3JkRmllbGRWYWx1ZSwgcmVmZXJlbmNlVG9GaWVsZE5hbWUpO1xuICAgIH1cbiAgICB2YWx1ZSA9IG9kYXRhRmllbGRWYWx1ZTtcbiAgfSBlbHNlIGlmIChmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgWyd1c2VyJywgJ2dyb3VwJ10uaW5jbHVkZXMoZm9ybUZpZWxkLnR5cGUpICYmIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhvYmpGaWVsZC50eXBlKSAmJiAoWyd1c2VycycsICdvcmdhbml6YXRpb25zJ10uaW5jbHVkZXMob2JqRmllbGQucmVmZXJlbmNlX3RvKSB8fCAoJ3NwYWNlX3VzZXJzJyA9PT0gb2JqRmllbGQucmVmZXJlbmNlX3RvICYmICd1c2VyJyA9PT0gb2JqRmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkKSkpIHtcbiAgICBpZiAoIV8uaXNFbXB0eShyZWNvcmRGaWVsZFZhbHVlKSkge1xuICAgICAgc2VsZWN0RmllbGRWYWx1ZTtcbiAgICAgIGlmIChmb3JtRmllbGQudHlwZSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGlmIChvYmpGaWVsZC5tdWx0aXBsZSAmJiBmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICBzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0VXNlclZhbHVlcyhyZWNvcmRGaWVsZFZhbHVlLCBzcGFjZUlkKTtcbiAgICAgICAgfSBlbHNlIGlmICghb2JqRmllbGQubXVsdGlwbGUgJiYgIWZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgIHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RVc2VyVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLnR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgaWYgKG9iakZpZWxkLm11bHRpcGxlICYmIGZvcm1GaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgIHNlbGVjdEZpZWxkVmFsdWUgPSBnZXRTZWxlY3RPcmdWYWx1ZXMocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW9iakZpZWxkLm11bHRpcGxlICYmICFmb3JtRmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICBzZWxlY3RGaWVsZFZhbHVlID0gZ2V0U2VsZWN0T3JnVmFsdWUocmVjb3JkRmllbGRWYWx1ZSwgc3BhY2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RGaWVsZFZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gc2VsZWN0RmllbGRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoZm9ybUZpZWxkICYmIG9iakZpZWxkICYmIGZvcm1GaWVsZC50eXBlID09PSAnZGF0ZScgJiYgcmVjb3JkRmllbGRWYWx1ZSkge1xuICAgIHZhbHVlID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5mb3JtYXREYXRlKHJlY29yZEZpZWxkVmFsdWUpO1xuICB9IGVsc2UgaWYgKGZvcm1GaWVsZCAmJiBvYmpGaWVsZCAmJiBmb3JtRmllbGQudHlwZSA9PT0gJ3RpbWUnICYmIHJlY29yZEZpZWxkVmFsdWUpIHtcbiAgICB2YWx1ZSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZm9ybWF0VGltZShyZWNvcmRGaWVsZFZhbHVlKTtcbiAgfSBlbHNlIGlmIChmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgcmVjb3JkRmllbGRWYWx1ZSAmJiAoZm9ybUZpZWxkLnR5cGUgPT09ICdpbWFnZScgfHwgZm9ybUZpZWxkLnR5cGUgPT09ICdmaWxlJykpIHtcbiAgICB2YWx1ZSA9IGdldEZpbGVGaWVsZFZhbHVlKHJlY29yZEZpZWxkVmFsdWUsIGZvcm1GaWVsZC50eXBlKTtcbiAgfSBlbHNlIGlmIChmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgcmVjb3JkRmllbGRWYWx1ZSAmJiBmb3JtRmllbGQudHlwZSA9PT0gJ2xvb2t1cCcgJiYgWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKG9iakZpZWxkLnR5cGUpICYmIF8uaXNTdHJpbmcob2JqRmllbGQucmVmZXJlbmNlX3RvKSkge1xuICAgIHZhbHVlID0gcmVjb3JkRmllbGRWYWx1ZTtcbiAgfSBlbHNlIGlmIChmb3JtRmllbGQgJiYgb2JqRmllbGQgJiYgcmVjb3JkRmllbGRWYWx1ZSAmJiAoZm9ybUZpZWxkLnR5cGUgPT09ICdtdWx0aVNlbGVjdCcpKSB7XG4gICAgdmFsdWUgPSByZWNvcmRGaWVsZFZhbHVlLmpvaW4oJywnKTtcbiAgfSBlbHNlIGlmIChyZWNvcmQuaGFzT3duUHJvcGVydHkob2JqZWN0X2ZpZWxkKSkge1xuICAgIHZhbHVlID0gcmVjb3JkRmllbGRWYWx1ZTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5jaGVja1JlcXVpcmVkRGV0YWlscyA9IGZ1bmN0aW9uKHJlcXVpcmVkRGV0YWlscywgbWFzdGVyUmVjb3JkKSB7XG4gIGlmICghXy5pc0VtcHR5KHJlcXVpcmVkRGV0YWlscykpIHtcbiAgICByZXF1aXJlZERldGFpbHMuZm9yRWFjaChmdW5jdGlvbihyZCkge1xuICAgICAgdmFyIG1hc3RlckZpZWxkLCBtYXN0ZXJGaWVsZFZhbHVlLCByZWZJZCwgc3ViT2JqQ29uZmlnLCBzdWJUYWJsZU1hc3RlckZpZWxkLCBzdWJUYWJsZU5hbWUsIHN1YlRhYmxlUmVjb3JkO1xuICAgICAgc3ViVGFibGVOYW1lID0gcmQuc3BsaXQoJy4nKVswXTtcbiAgICAgIHN1YlRhYmxlTWFzdGVyRmllbGQgPSByZC5zcGxpdCgnLicpWzFdO1xuICAgICAgc3ViT2JqQ29uZmlnID0gZ2V0T2JqZWN0Q29uZmlnKHN1YlRhYmxlTmFtZSk7XG4gICAgICBtYXN0ZXJGaWVsZCA9IHN1Yk9iakNvbmZpZy5maWVsZHNbc3ViVGFibGVNYXN0ZXJGaWVsZF07XG4gICAgICByZWZJZCA9IG1hc3RlckZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJztcbiAgICAgIG1hc3RlckZpZWxkVmFsdWUgPSBtYXN0ZXJSZWNvcmRbcmVmSWRdO1xuICAgICAgc3ViVGFibGVSZWNvcmQgPSBvYmplY3RGaW5kT25lKHN1YlRhYmxlTmFtZSwge1xuICAgICAgICBmaWx0ZXJzOiBbW3N1YlRhYmxlTWFzdGVyRmllbGQsICc9JywgbWFzdGVyRmllbGRWYWx1ZV1dLFxuICAgICAgICBmaWVsZHM6IFtzdWJUYWJsZU1hc3RlckZpZWxkXVxuICAgICAgfSk7XG4gICAgICBpZiAoIXN1YlRhYmxlUmVjb3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIuivt+WFiOaWsOWinlwiICsgc3ViT2JqQ29uZmlnLmxhYmVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbCA9IHt9O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrX2F1dGhvcml6YXRpb24gPSBmdW5jdGlvbihyZXEpIHtcbiAgdmFyIGF1dGhUb2tlbiwgaGFzaGVkVG9rZW4sIHF1ZXJ5LCB1c2VyLCB1c2VySWQ7XG4gIHF1ZXJ5ID0gcmVxLnF1ZXJ5O1xuICB1c2VySWQgPSBxdWVyeVtcIlgtVXNlci1JZFwiXTtcbiAgYXV0aFRva2VuID0gcXVlcnlbXCJYLUF1dGgtVG9rZW5cIl07XG4gIGlmICghdXNlcklkIHx8ICFhdXRoVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMSwgJ1VuYXV0aG9yaXplZCcpO1xuICB9XG4gIGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbik7XG4gIHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZSh7XG4gICAgX2lkOiB1c2VySWQsXG4gICAgXCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cbiAgfSk7XG4gIGlmICghdXNlcikge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAxLCAnVW5hdXRob3JpemVkJyk7XG4gIH1cbiAgcmV0dXJuIHVzZXI7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlID0gZnVuY3Rpb24oc3BhY2VfaWQpIHtcbiAgdmFyIHNwYWNlO1xuICBzcGFjZSA9IENyZWF0b3IuQ29sbGVjdGlvbnMuc3BhY2VzLmZpbmRPbmUoc3BhY2VfaWQpO1xuICBpZiAoIXNwYWNlKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCJzcGFjZV9pZOacieivr+aIluatpHNwYWNl5bey57uP6KKr5Yig6ZmkXCIpO1xuICB9XG4gIHJldHVybiBzcGFjZTtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0RmxvdyA9IGZ1bmN0aW9uKGZsb3dfaWQpIHtcbiAgdmFyIGZsb3c7XG4gIGZsb3cgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLmZsb3dzLmZpbmRPbmUoZmxvd19pZCk7XG4gIGlmICghZmxvdykge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwiaWTmnInor6/miJbmraTmtYHnqIvlt7Lnu4/ooqvliKDpmaRcIik7XG4gIH1cbiAgcmV0dXJuIGZsb3c7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlciA9IGZ1bmN0aW9uKHNwYWNlX2lkLCB1c2VyX2lkKSB7XG4gIHZhciBzcGFjZV91c2VyO1xuICBzcGFjZV91c2VyID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgdXNlcjogdXNlcl9pZFxuICB9KTtcbiAgaWYgKCFzcGFjZV91c2VyKSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCJ1c2VyX2lk5a+55bqU55qE55So5oi35LiN5bGe5LqO5b2T5YmNc3BhY2VcIik7XG4gIH1cbiAgcmV0dXJuIHNwYWNlX3VzZXI7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldFNwYWNlVXNlck9yZ0luZm8gPSBmdW5jdGlvbihzcGFjZV91c2VyKSB7XG4gIHZhciBpbmZvLCBvcmc7XG4gIGluZm8gPSBuZXcgT2JqZWN0O1xuICBpbmZvLm9yZ2FuaXphdGlvbiA9IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uO1xuICBvcmcgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLm9yZ2FuaXphdGlvbnMuZmluZE9uZShzcGFjZV91c2VyLm9yZ2FuaXphdGlvbiwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGZ1bGxuYW1lOiAxXG4gICAgfVxuICB9KTtcbiAgaW5mby5vcmdhbml6YXRpb25fbmFtZSA9IG9yZy5uYW1lO1xuICBpbmZvLm9yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IG9yZy5mdWxsbmFtZTtcbiAgcmV0dXJuIGluZm87XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd0VuYWJsZWQgPSBmdW5jdGlvbihmbG93KSB7XG4gIGlmIChmbG93LnN0YXRlICE9PSBcImVuYWJsZWRcIikge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5rWB56iL5pyq5ZCv55SoLOaTjeS9nOWksei0pVwiKTtcbiAgfVxufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pc0Zsb3dTcGFjZU1hdGNoZWQgPSBmdW5jdGlvbihmbG93LCBzcGFjZV9pZCkge1xuICBpZiAoZmxvdy5zcGFjZSAhPT0gc3BhY2VfaWQpIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcIua1geeoi+WSjOW3peS9nOWMuklE5LiN5Yy56YWNXCIpO1xuICB9XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmdldEZvcm0gPSBmdW5jdGlvbihmb3JtX2lkKSB7XG4gIHZhciBmb3JtO1xuICBmb3JtID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5mb3Jtcy5maW5kT25lKGZvcm1faWQpO1xuICBpZiAoIWZvcm0pIHtcbiAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCAn6KGo5Y2VSUTmnInor6/miJbmraTooajljZXlt7Lnu4/ooqvliKDpmaQnKTtcbiAgfVxuICByZXR1cm4gZm9ybTtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Q2F0ZWdvcnkgPSBmdW5jdGlvbihjYXRlZ29yeV9pZCkge1xuICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9ucy5jYXRlZ29yaWVzLmZpbmRPbmUoY2F0ZWdvcnlfaWQpO1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jaGVja1N5bmNEaXJlY3Rpb24gPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgZmxvd19pZCkge1xuICB2YXIgb3csIHN5bmNEaXJlY3Rpb247XG4gIG93ID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5vYmplY3Rfd29ya2Zsb3dzLmZpbmRPbmUoe1xuICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICBmbG93X2lkOiBmbG93X2lkXG4gIH0pO1xuICBpZiAoIW93KSB7XG4gICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgJ+acquaJvuWIsOWvueixoea1geeoi+aYoOWwhOiusOW9leOAgicpO1xuICB9XG4gIHN5bmNEaXJlY3Rpb24gPSBvdy5zeW5jX2RpcmVjdGlvbiB8fCAnYm90aCc7XG4gIGlmICghWydib3RoJywgJ29ial90b19pbnMnXS5pbmNsdWRlcyhzeW5jRGlyZWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsICfkuI3mlK/mjIHnmoTlkIzmraXmlrnlkJHjgIInKTtcbiAgfVxufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jcmVhdGVfaW5zdGFuY2UgPSBmdW5jdGlvbihpbnN0YW5jZV9mcm9tX2NsaWVudCwgdXNlcl9pbmZvKSB7XG4gIHZhciBhcHByX29iaiwgYXBwcm92ZV9mcm9tX2NsaWVudCwgY2F0ZWdvcnksIGZsb3csIGZsb3dfaWQsIGZvcm0sIGluc19vYmosIG5ld19pbnNfaWQsIG5vdywgcGVybWlzc2lvbnMsIHJlbGF0ZWRUYWJsZXNJbmZvLCBzcGFjZSwgc3BhY2VfaWQsIHNwYWNlX3VzZXIsIHNwYWNlX3VzZXJfb3JnX2luZm8sIHN0YXJ0X3N0ZXAsIHRyYWNlX2Zyb21fY2xpZW50LCB0cmFjZV9vYmosIHVzZXJfaWQ7XG4gIGNoZWNrKGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdLCBTdHJpbmcpO1xuICBjaGVjayhpbnN0YW5jZV9mcm9tX2NsaWVudFtcInNwYWNlXCJdLCBTdHJpbmcpO1xuICBjaGVjayhpbnN0YW5jZV9mcm9tX2NsaWVudFtcImZsb3dcIl0sIFN0cmluZyk7XG4gIGNoZWNrKGluc3RhbmNlX2Zyb21fY2xpZW50W1wicmVjb3JkX2lkc1wiXSwgW1xuICAgIHtcbiAgICAgIG86IFN0cmluZyxcbiAgICAgIGlkczogW1N0cmluZ11cbiAgICB9XG4gIF0pO1xuICB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrU3luY0RpcmVjdGlvbihpbnN0YW5jZV9mcm9tX2NsaWVudFtcInJlY29yZF9pZHNcIl1bMF0ubywgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJmbG93XCJdKTtcbiAgdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5jaGVja0lzSW5BcHByb3ZhbChpbnN0YW5jZV9mcm9tX2NsaWVudFtcInJlY29yZF9pZHNcIl1bMF0sIGluc3RhbmNlX2Zyb21fY2xpZW50W1wic3BhY2VcIl0pO1xuICBzcGFjZV9pZCA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1wic3BhY2VcIl07XG4gIGZsb3dfaWQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImZsb3dcIl07XG4gIHVzZXJfaWQgPSB1c2VyX2luZm8uX2lkO1xuICB0cmFjZV9mcm9tX2NsaWVudCA9IG51bGw7XG4gIGFwcHJvdmVfZnJvbV9jbGllbnQgPSBudWxsO1xuICBpZiAoaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJ0cmFjZXNcIl0gJiYgaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJ0cmFjZXNcIl1bMF0pIHtcbiAgICB0cmFjZV9mcm9tX2NsaWVudCA9IGluc3RhbmNlX2Zyb21fY2xpZW50W1widHJhY2VzXCJdWzBdO1xuICAgIGlmICh0cmFjZV9mcm9tX2NsaWVudFtcImFwcHJvdmVzXCJdICYmIHRyYWNlX2Zyb21fY2xpZW50W1wiYXBwcm92ZXNcIl1bMF0pIHtcbiAgICAgIGFwcHJvdmVfZnJvbV9jbGllbnQgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInRyYWNlc1wiXVswXVtcImFwcHJvdmVzXCJdWzBdO1xuICAgIH1cbiAgfVxuICBzcGFjZSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0U3BhY2Uoc3BhY2VfaWQpO1xuICBmbG93ID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRGbG93KGZsb3dfaWQpO1xuICBzcGFjZV91c2VyID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZVVzZXIoc3BhY2VfaWQsIHVzZXJfaWQpO1xuICBzcGFjZV91c2VyX29yZ19pbmZvID0gdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5nZXRTcGFjZVVzZXJPcmdJbmZvKHNwYWNlX3VzZXIpO1xuICB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmlzRmxvd0VuYWJsZWQoZmxvdyk7XG4gIHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaXNGbG93U3BhY2VNYXRjaGVkKGZsb3csIHNwYWNlX2lkKTtcbiAgZm9ybSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Rm9ybShmbG93LmZvcm0pO1xuICBwZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25NYW5hZ2VyLmdldEZsb3dQZXJtaXNzaW9ucyhmbG93X2lkLCB1c2VyX2lkKTtcbiAgaWYgKCFwZXJtaXNzaW9ucy5pbmNsdWRlcyhcImFkZFwiKSkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5b2T5YmN55So5oi35rKh5pyJ5q2k5rWB56iL55qE5paw5bu65p2D6ZmQXCIpO1xuICB9XG4gIG5vdyA9IG5ldyBEYXRlO1xuICBpbnNfb2JqID0ge307XG4gIGluc19vYmouX2lkID0gQ3JlYXRvci5Db2xsZWN0aW9ucy5pbnN0YW5jZXMuX21ha2VOZXdJRCgpO1xuICBpbnNfb2JqLnNwYWNlID0gc3BhY2VfaWQ7XG4gIGluc19vYmouZmxvdyA9IGZsb3dfaWQ7XG4gIGluc19vYmouZmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50Ll9pZDtcbiAgaW5zX29iai5mb3JtID0gZmxvdy5mb3JtO1xuICBpbnNfb2JqLmZvcm1fdmVyc2lvbiA9IGZsb3cuY3VycmVudC5mb3JtX3ZlcnNpb247XG4gIGluc19vYmoubmFtZSA9IGZsb3cubmFtZTtcbiAgaW5zX29iai5zdWJtaXR0ZXIgPSB1c2VyX2lkO1xuICBpbnNfb2JqLnN1Ym1pdHRlcl9uYW1lID0gdXNlcl9pbmZvLm5hbWU7XG4gIGluc19vYmouYXBwbGljYW50ID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRcIl0gPyBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudFwiXSA6IHVzZXJfaWQ7XG4gIGluc19vYmouYXBwbGljYW50X25hbWUgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9uYW1lXCJdID8gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfbmFtZVwiXSA6IHVzZXJfaW5mby5uYW1lO1xuICBpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb24gPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25cIl0gPyBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25cIl0gOiBzcGFjZV91c2VyLm9yZ2FuaXphdGlvbjtcbiAgaW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWUgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiXSA/IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCJdIDogc3BhY2VfdXNlcl9vcmdfaW5mby5vcmdhbml6YXRpb25fbmFtZTtcbiAgaW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lXCJdID8gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lXCJdIDogc3BhY2VfdXNlcl9vcmdfaW5mby5vcmdhbml6YXRpb25fZnVsbG5hbWU7XG4gIGluc19vYmouYXBwbGljYW50X2NvbXBhbnkgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudF9jb21wYW55XCJdID8gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfY29tcGFueVwiXSA6IHNwYWNlX3VzZXIuY29tcGFueV9pZDtcbiAgaW5zX29iai5zdGF0ZSA9ICdkcmFmdCc7XG4gIGluc19vYmouY29kZSA9ICcnO1xuICBpbnNfb2JqLmlzX2FyY2hpdmVkID0gZmFsc2U7XG4gIGluc19vYmouaXNfZGVsZXRlZCA9IGZhbHNlO1xuICBpbnNfb2JqLmNyZWF0ZWQgPSBub3c7XG4gIGluc19vYmouY3JlYXRlZF9ieSA9IHVzZXJfaWQ7XG4gIGluc19vYmoubW9kaWZpZWQgPSBub3c7XG4gIGluc19vYmoubW9kaWZpZWRfYnkgPSB1c2VyX2lkO1xuICBpbnNfb2JqLnJlY29yZF9pZHMgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcInJlY29yZF9pZHNcIl07XG4gIGlmIChzcGFjZV91c2VyLmNvbXBhbnlfaWQpIHtcbiAgICBpbnNfb2JqLmNvbXBhbnlfaWQgPSBzcGFjZV91c2VyLmNvbXBhbnlfaWQ7XG4gIH1cbiAgdHJhY2Vfb2JqID0ge307XG4gIHRyYWNlX29iai5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyO1xuICB0cmFjZV9vYmouaW5zdGFuY2UgPSBpbnNfb2JqLl9pZDtcbiAgdHJhY2Vfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2U7XG4gIHN0YXJ0X3N0ZXAgPSBfLmZpbmQoZmxvdy5jdXJyZW50LnN0ZXBzLCBmdW5jdGlvbihzdGVwKSB7XG4gICAgcmV0dXJuIHN0ZXAuc3RlcF90eXBlID09PSAnc3RhcnQnO1xuICB9KTtcbiAgdHJhY2Vfb2JqLnN0ZXAgPSBzdGFydF9zdGVwLl9pZDtcbiAgdHJhY2Vfb2JqLm5hbWUgPSBzdGFydF9zdGVwLm5hbWU7XG4gIHRyYWNlX29iai5zdGFydF9kYXRlID0gbm93O1xuICBhcHByX29iaiA9IHt9O1xuICBhcHByX29iai5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyO1xuICBhcHByX29iai5pbnN0YW5jZSA9IGluc19vYmouX2lkO1xuICBhcHByX29iai50cmFjZSA9IHRyYWNlX29iai5faWQ7XG4gIGFwcHJfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2U7XG4gIGFwcHJfb2JqLnVzZXIgPSBpbnN0YW5jZV9mcm9tX2NsaWVudFtcImFwcGxpY2FudFwiXSA/IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50XCJdIDogdXNlcl9pZDtcbiAgYXBwcl9vYmoudXNlcl9uYW1lID0gaW5zdGFuY2VfZnJvbV9jbGllbnRbXCJhcHBsaWNhbnRfbmFtZVwiXSA/IGluc3RhbmNlX2Zyb21fY2xpZW50W1wiYXBwbGljYW50X25hbWVcIl0gOiB1c2VyX2luZm8ubmFtZTtcbiAgYXBwcl9vYmouaGFuZGxlciA9IHVzZXJfaWQ7XG4gIGFwcHJfb2JqLmhhbmRsZXJfbmFtZSA9IHVzZXJfaW5mby5uYW1lO1xuICBhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbiA9IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uO1xuICBhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lID0gc3BhY2VfdXNlcl9vcmdfaW5mby5uYW1lO1xuICBhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IHNwYWNlX3VzZXJfb3JnX2luZm8uZnVsbG5hbWU7XG4gIGFwcHJfb2JqLnR5cGUgPSAnZHJhZnQnO1xuICBhcHByX29iai5zdGFydF9kYXRlID0gbm93O1xuICBhcHByX29iai5yZWFkX2RhdGUgPSBub3c7XG4gIGFwcHJfb2JqLmlzX3JlYWQgPSB0cnVlO1xuICBhcHByX29iai5pc19lcnJvciA9IGZhbHNlO1xuICBhcHByX29iai5kZXNjcmlwdGlvbiA9ICcnO1xuICByZWxhdGVkVGFibGVzSW5mbyA9IHt9O1xuICBhcHByX29iai52YWx1ZXMgPSB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlVmFsdWVzKGluc19vYmoucmVjb3JkX2lkc1swXSwgZmxvd19pZCwgc3BhY2VfaWQsIGZvcm0uY3VycmVudC5maWVsZHMsIHJlbGF0ZWRUYWJsZXNJbmZvKTtcbiAgdHJhY2Vfb2JqLmFwcHJvdmVzID0gW2FwcHJfb2JqXTtcbiAgaW5zX29iai50cmFjZXMgPSBbdHJhY2Vfb2JqXTtcbiAgaW5zX29iai52YWx1ZXMgPSBhcHByX29iai52YWx1ZXM7XG4gIGluc19vYmouaW5ib3hfdXNlcnMgPSBpbnN0YW5jZV9mcm9tX2NsaWVudC5pbmJveF91c2VycyB8fCBbXTtcbiAgaW5zX29iai5jdXJyZW50X3N0ZXBfbmFtZSA9IHN0YXJ0X3N0ZXAubmFtZTtcbiAgaWYgKGZsb3cuYXV0b19yZW1pbmQgPT09IHRydWUpIHtcbiAgICBpbnNfb2JqLmF1dG9fcmVtaW5kID0gdHJ1ZTtcbiAgfVxuICBpbnNfb2JqLmZsb3dfbmFtZSA9IGZsb3cubmFtZTtcbiAgaWYgKGZvcm0uY2F0ZWdvcnkpIHtcbiAgICBjYXRlZ29yeSA9IHV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZ2V0Q2F0ZWdvcnkoZm9ybS5jYXRlZ29yeSk7XG4gICAgaWYgKGNhdGVnb3J5KSB7XG4gICAgICBpbnNfb2JqLmNhdGVnb3J5X25hbWUgPSBjYXRlZ29yeS5uYW1lO1xuICAgICAgaW5zX29iai5jYXRlZ29yeSA9IGNhdGVnb3J5Ll9pZDtcbiAgICB9XG4gIH1cbiAgbmV3X2luc19pZCA9IENyZWF0b3IuQ29sbGVjdGlvbnMuaW5zdGFuY2VzLmluc2VydChpbnNfb2JqKTtcbiAgdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlY29yZEluc3RhbmNlSW5mbyhpbnNfb2JqLnJlY29yZF9pZHNbMF0sIG5ld19pbnNfaWQsIHNwYWNlX2lkKTtcbiAgdXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZUF0dGFjaChpbnNfb2JqLnJlY29yZF9pZHNbMF0sIHNwYWNlX2lkLCBpbnNfb2JqLl9pZCwgYXBwcl9vYmouX2lkKTtcbiAgcmV0dXJuIG5ld19pbnNfaWQ7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmluaXRpYXRlVmFsdWVzID0gZnVuY3Rpb24ocmVjb3JkSWRzLCBmbG93SWQsIHNwYWNlSWQsIGZpZWxkcywgcmVsYXRlZFRhYmxlc0luZm8pIHtcbiAgdmFyIGVuYWJsZUFtaXNmb3JtLCBmaWVsZENvZGVzLCBmaWx0ZXJWYWx1ZXMsIGZsb3csIGZvcm0sIGZvcm1GaWVsZHMsIGZvcm1UYWJsZUZpZWxkcywgZm9ybVRhYmxlRmllbGRzQ29kZSwgb2JqZWN0LCBvYmplY3ROYW1lLCBvdywgcmVjb3JkLCByZWNvcmRJZCwgcmVmLCByZWxhdGVkT2JqZWN0cywgcmVsYXRlZE9iamVjdHNLZXlzLCByZXF1aXJlZERldGFpbHMsIHRhYmxlRmllbGRDb2RlcywgdGFibGVGaWVsZE1hcCwgdGFibGVUb1JlbGF0ZWRNYXAsIHZhbHVlcztcbiAgZmllbGRDb2RlcyA9IFtdO1xuICBfLmVhY2goZmllbGRzLCBmdW5jdGlvbihmKSB7XG4gICAgaWYgKGYudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gXy5lYWNoKGYuZmllbGRzLCBmdW5jdGlvbihmZikge1xuICAgICAgICByZXR1cm4gZmllbGRDb2Rlcy5wdXNoKGZmLmNvZGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZENvZGVzLnB1c2goZi5jb2RlKTtcbiAgICB9XG4gIH0pO1xuICB2YWx1ZXMgPSB7fTtcbiAgb2JqZWN0TmFtZSA9IHJlY29yZElkcy5vO1xuICBvYmplY3QgPSBnZXRPYmplY3RDb25maWcob2JqZWN0TmFtZSk7XG4gIHJlY29yZElkID0gcmVjb3JkSWRzLmlkc1swXTtcbiAgb3cgPSBDcmVhdG9yLkNvbGxlY3Rpb25zLm9iamVjdF93b3JrZmxvd3MuZmluZE9uZSh7XG4gICAgb2JqZWN0X25hbWU6IG9iamVjdE5hbWUsXG4gICAgZmxvd19pZDogZmxvd0lkXG4gIH0pO1xuICByZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iamVjdE5hbWUsIHtcbiAgICBmaWx0ZXJzOiBbWydfaWQnLCAnPScsIHJlY29yZElkXV1cbiAgfSk7XG4gIGZsb3cgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Zsb3dzJykuZmluZE9uZShmbG93SWQsIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGZvcm06IDEsXG4gICAgICBlbmFibGVBbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG4gIGVuYWJsZUFtaXNmb3JtID0gZmxvdy5lbmFibGVfYW1pc2Zvcm07XG4gIGlmIChvdyAmJiByZWNvcmQpIHtcbiAgICByZXF1aXJlZERldGFpbHMgPSBvdy5yZXF1aXJlZF9kZXRhaWxzIHx8IFtdO1xuICAgIGNoZWNrUmVxdWlyZWREZXRhaWxzKHJlcXVpcmVkRGV0YWlscywgcmVjb3JkKTtcbiAgICBmb3JtID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwiZm9ybXNcIikuZmluZE9uZShmbG93LmZvcm0pO1xuICAgIGZvcm1GaWVsZHMgPSBmb3JtLmN1cnJlbnQuZmllbGRzIHx8IFtdO1xuICAgIHJlbGF0ZWRPYmplY3RzID0gZ2V0UmVsYXRlZHMob2JqZWN0TmFtZSk7XG4gICAgcmVsYXRlZE9iamVjdHNLZXlzID0gXy5wbHVjayhyZWxhdGVkT2JqZWN0cywgJ29iamVjdF9uYW1lJyk7XG4gICAgZm9ybVRhYmxlRmllbGRzID0gXy5maWx0ZXIoZm9ybUZpZWxkcywgZnVuY3Rpb24oZm9ybUZpZWxkKSB7XG4gICAgICByZXR1cm4gZm9ybUZpZWxkLnR5cGUgPT09ICd0YWJsZSc7XG4gICAgfSk7XG4gICAgZm9ybVRhYmxlRmllbGRzQ29kZSA9IF8ucGx1Y2soZm9ybVRhYmxlRmllbGRzLCAnY29kZScpO1xuICAgIHRhYmxlRmllbGRDb2RlcyA9IFtdO1xuICAgIHRhYmxlRmllbGRNYXAgPSBbXTtcbiAgICB0YWJsZVRvUmVsYXRlZE1hcCA9IHt9O1xuICAgIGlmICgocmVmID0gb3cuZmllbGRfbWFwKSAhPSBudWxsKSB7XG4gICAgICByZWYuZm9yRWFjaChmdW5jdGlvbihmbSkge1xuICAgICAgICB2YXIgZm9ybUZpZWxkLCBmb3JtVGFibGVGaWVsZENvZGUsIGdyaWRDb2RlLCBsb29rdXBGaWVsZE5hbWUsIGxvb2t1cEZpZWxkT2JqLCBsb29rdXBPYmplY3RSZWNvcmQsIG9UYWJsZUNvZGUsIG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZCwgb1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkQ29kZSwgb1RhYmxlRmllbGRDb2RlLCBvYmpGaWVsZCwgb2JqZWN0RmllbGQsIG9iamVjdEZpZWxkTmFtZSwgb2JqZWN0RmllbGRPYmplY3ROYW1lLCBvYmplY3RMb29rdXBGaWVsZCwgb2JqZWN0X2ZpZWxkLCByZWNvcmRGaWVsZFZhbHVlLCByZWZlcmVuY2VUb0RvYywgcmVmZXJlbmNlVG9GaWVsZE5hbWUsIHJlZmVyZW5jZVRvRmllbGRWYWx1ZSwgcmVmZXJlbmNlVG9PYmplY3ROYW1lLCByZWxhdGVkT2JqZWN0RmllbGRDb2RlLCB0YWJsZVRvUmVsYXRlZE1hcEtleSwgd1RhYmxlQ29kZSwgd29ya2Zsb3dfZmllbGQ7XG4gICAgICAgIG9iamVjdF9maWVsZCA9IGZtLm9iamVjdF9maWVsZDtcbiAgICAgICAgd29ya2Zsb3dfZmllbGQgPSBmbS53b3JrZmxvd19maWVsZDtcbiAgICAgICAgaWYgKCFvYmplY3RfZmllbGQgfHwgIXdvcmtmbG93X2ZpZWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsICfmnKrmib7liLDlrZfmrrXvvIzor7fmo4Dmn6Xlr7nosaHmtYHnqIvmmKDlsITlrZfmrrXphY3nva4nKTtcbiAgICAgICAgfVxuICAgICAgICByZWxhdGVkT2JqZWN0RmllbGRDb2RlID0gZ2V0UmVsYXRlZE9iamVjdEZpZWxkQ29kZShyZWxhdGVkT2JqZWN0c0tleXMsIG9iamVjdF9maWVsZCk7XG4gICAgICAgIGZvcm1UYWJsZUZpZWxkQ29kZSA9IGdldEZvcm1UYWJsZUZpZWxkQ29kZShmb3JtVGFibGVGaWVsZHNDb2RlLCB3b3JrZmxvd19maWVsZCk7XG4gICAgICAgIG9iakZpZWxkID0gb2JqZWN0LmZpZWxkc1tvYmplY3RfZmllbGRdO1xuICAgICAgICBmb3JtRmllbGQgPSBnZXRGb3JtRmllbGQoZm9ybUZpZWxkcywgd29ya2Zsb3dfZmllbGQpO1xuICAgICAgICByZWNvcmRGaWVsZFZhbHVlID0gcmVjb3JkW29iamVjdF9maWVsZF07XG4gICAgICAgIGlmIChyZWxhdGVkT2JqZWN0RmllbGRDb2RlKSB7XG4gICAgICAgICAgb1RhYmxlQ29kZSA9IG9iamVjdF9maWVsZC5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgIG9UYWJsZUZpZWxkQ29kZSA9IG9iamVjdF9maWVsZC5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgIHRhYmxlVG9SZWxhdGVkTWFwS2V5ID0gb1RhYmxlQ29kZTtcbiAgICAgICAgICBpZiAoIXRhYmxlVG9SZWxhdGVkTWFwW3RhYmxlVG9SZWxhdGVkTWFwS2V5XSkge1xuICAgICAgICAgICAgdGFibGVUb1JlbGF0ZWRNYXBbdGFibGVUb1JlbGF0ZWRNYXBLZXldID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtVGFibGVGaWVsZENvZGUpIHtcbiAgICAgICAgICAgIHdUYWJsZUNvZGUgPSB3b3JrZmxvd19maWVsZC5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgICAgdGFibGVUb1JlbGF0ZWRNYXBbdGFibGVUb1JlbGF0ZWRNYXBLZXldWydfRlJPTV9UQUJMRV9DT0RFJ10gPSB3VGFibGVDb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGFibGVUb1JlbGF0ZWRNYXBbdGFibGVUb1JlbGF0ZWRNYXBLZXldW29UYWJsZUZpZWxkQ29kZV0gPSB3b3JrZmxvd19maWVsZDtcbiAgICAgICAgfSBlbHNlIGlmICh3b3JrZmxvd19maWVsZC5pbmRleE9mKCcuJykgPiAwICYmIG9iamVjdF9maWVsZC5pbmRleE9mKCcuJC4nKSA+IDApIHtcbiAgICAgICAgICB3VGFibGVDb2RlID0gd29ya2Zsb3dfZmllbGQuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgICBvVGFibGVDb2RlID0gb2JqZWN0X2ZpZWxkLnNwbGl0KCcuJC4nKVswXShyZWYxLnRhYmxlMS4kLm5hbWUpO1xuICAgICAgICAgIGlmIChyZWNvcmQuaGFzT3duUHJvcGVydHkob1RhYmxlQ29kZSkgJiYgXy5pc0FycmF5KHJlY29yZFtvVGFibGVDb2RlXSkpIHtcbiAgICAgICAgICAgIHRhYmxlRmllbGRDb2Rlcy5wdXNoKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dfdGFibGVfZmllbGRfY29kZTogd1RhYmxlQ29kZSxcbiAgICAgICAgICAgICAgb2JqZWN0X3RhYmxlX2ZpZWxkX2NvZGU6IG9UYWJsZUNvZGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB0YWJsZUZpZWxkTWFwLnB1c2goZm0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAob1RhYmxlQ29kZS5pbmRleE9mKCcuJykgPiAwKSB7XG4gICAgICAgICAgICBvVGFibGVDb2RlUmVmZXJlbmNlRmllbGRDb2RlID0gb1RhYmxlQ29kZS5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgICAgZ3JpZENvZGUgPSBvVGFibGVDb2RlLnNwbGl0KCcuJylbMV07XG4gICAgICAgICAgICBvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQgPSBvYmplY3QuZmllbGRzW29UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZENvZGVdO1xuICAgICAgICAgICAgaWYgKG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZCAmJiBbJ2xvb2t1cCcsICdtYXN0ZXJfZGV0YWlsJ10uaW5jbHVkZXMob1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLnR5cGUpICYmIF8uaXNTdHJpbmcob1RhYmxlQ29kZVJlZmVyZW5jZUZpZWxkLnJlZmVyZW5jZV90bykpIHtcbiAgICAgICAgICAgICAgaWYgKHJlY29yZFtvVGFibGVDb2RlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWZlcmVuY2VUb0ZpZWxkTmFtZSA9IG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCc7XG4gICAgICAgICAgICAgIHJlZmVyZW5jZVRvT2JqZWN0TmFtZSA9IG9UYWJsZUNvZGVSZWZlcmVuY2VGaWVsZC5yZWZlcmVuY2VfdG87XG4gICAgICAgICAgICAgIHJlZmVyZW5jZVRvRmllbGRWYWx1ZSA9IHJlY29yZFtvVGFibGVDb2RlUmVmZXJlbmNlRmllbGQubmFtZV07XG4gICAgICAgICAgICAgIHJlZmVyZW5jZVRvRG9jID0gZ2V0RmllbGRPZGF0YVZhbHVlKHJlZmVyZW5jZVRvT2JqZWN0TmFtZSwgcmVmZXJlbmNlVG9GaWVsZFZhbHVlLCByZWZlcmVuY2VUb0ZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VUb0RvY1tncmlkQ29kZV0pIHtcbiAgICAgICAgICAgICAgICByZWNvcmRbb1RhYmxlQ29kZV0gPSByZWZlcmVuY2VUb0RvY1tncmlkQ29kZV07XG4gICAgICAgICAgICAgICAgdGFibGVGaWVsZENvZGVzLnB1c2goSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dfdGFibGVfZmllbGRfY29kZTogd1RhYmxlQ29kZSxcbiAgICAgICAgICAgICAgICAgIG9iamVjdF90YWJsZV9maWVsZF9jb2RlOiBvVGFibGVDb2RlXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZUZpZWxkTWFwLnB1c2goZm0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9iamVjdF9maWVsZC5pbmRleE9mKCcuJykgPiAwICYmIG9iamVjdF9maWVsZC5pbmRleE9mKCcuJC4nKSA9PT0gLTEpIHtcbiAgICAgICAgICBvYmplY3RGaWVsZE5hbWUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgICBsb29rdXBGaWVsZE5hbWUgPSBvYmplY3RfZmllbGQuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICBpZiAob2JqZWN0KSB7XG4gICAgICAgICAgICBvYmplY3RGaWVsZCA9IG9iamVjdC5maWVsZHNbb2JqZWN0RmllbGROYW1lXTtcbiAgICAgICAgICAgIGlmIChvYmplY3RGaWVsZCAmJiBmb3JtRmllbGQgJiYgWydsb29rdXAnLCAnbWFzdGVyX2RldGFpbCddLmluY2x1ZGVzKG9iamVjdEZpZWxkLnR5cGUpICYmIF8uaXNTdHJpbmcob2JqZWN0RmllbGQucmVmZXJlbmNlX3RvKSkge1xuICAgICAgICAgICAgICBsb29rdXBPYmplY3RSZWNvcmQgPSBvYmplY3RGaW5kT25lKG9iamVjdEZpZWxkLnJlZmVyZW5jZV90bywge1xuICAgICAgICAgICAgICAgIGZpbHRlcnM6IFtbJ19pZCcsICc9JywgcmVjb3JkW29iamVjdEZpZWxkTmFtZV1dXSxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IFtsb29rdXBGaWVsZE5hbWVdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoIWxvb2t1cE9iamVjdFJlY29yZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvYmplY3RGaWVsZE9iamVjdE5hbWUgPSBvYmplY3RGaWVsZC5yZWZlcmVuY2VfdG87XG4gICAgICAgICAgICAgIGxvb2t1cEZpZWxkT2JqID0gZ2V0T2JqZWN0Q29uZmlnKG9iamVjdEZpZWxkT2JqZWN0TmFtZSk7XG4gICAgICAgICAgICAgIG9iamVjdExvb2t1cEZpZWxkID0gbG9va3VwRmllbGRPYmouZmllbGRzW2xvb2t1cEZpZWxkTmFtZV07XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbd29ya2Zsb3dfZmllbGRdID0gZ2V0SW5zdGFuY2VGaWVsZFZhbHVlKG9iamVjdExvb2t1cEZpZWxkLCBmb3JtRmllbGQsIGxvb2t1cE9iamVjdFJlY29yZCwgbG9va3VwRmllbGROYW1lLCBzcGFjZUlkLCByZWNvcmRbbG9va3VwRmllbGROYW1lXSwgZW5hYmxlQW1pc2Zvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzW3dvcmtmbG93X2ZpZWxkXSA9IGdldEluc3RhbmNlRmllbGRWYWx1ZShvYmpGaWVsZCwgZm9ybUZpZWxkLCByZWNvcmQsIG9iamVjdF9maWVsZCwgc3BhY2VJZCwgcmVjb3JkW29iamVjdF9maWVsZF0sIGVuYWJsZUFtaXNmb3JtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIF8udW5pcSh0YWJsZUZpZWxkQ29kZXMpLmZvckVhY2goZnVuY3Rpb24odGZjKSB7XG4gICAgICB2YXIgYztcbiAgICAgIGMgPSBKU09OLnBhcnNlKHRmYyk7XG4gICAgICB2YWx1ZXNbYy53b3JrZmxvd190YWJsZV9maWVsZF9jb2RlXSA9IFtdO1xuICAgICAgcmV0dXJuIHJlY29yZFtjLm9iamVjdF90YWJsZV9maWVsZF9jb2RlXS5mb3JFYWNoKGZ1bmN0aW9uKHRyKSB7XG4gICAgICAgIHZhciBuZXdUcjtcbiAgICAgICAgbmV3VHIgPSB7fTtcbiAgICAgICAgXy5lYWNoKHRyLCBmdW5jdGlvbih0ZFZhbHVlLCBrKSB7XG4gICAgICAgICAgcmV0dXJuIHRhYmxlRmllbGRNYXAuZm9yRWFjaChmdW5jdGlvbih0Zm0pIHtcbiAgICAgICAgICAgIHZhciB3VGRDb2RlO1xuICAgICAgICAgICAgaWYgKHRmbS5vYmplY3RfZmllbGQgPT09IChjLm9iamVjdF90YWJsZV9maWVsZF9jb2RlICsgJy4kLicgKyBrKSkge1xuICAgICAgICAgICAgICB3VGRDb2RlID0gdGZtLndvcmtmbG93X2ZpZWxkLnNwbGl0KCcuJylbMV07XG4gICAgICAgICAgICAgIHJldHVybiBuZXdUclt3VGRDb2RlXSA9IHRkVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIV8uaXNFbXB0eShuZXdUcikpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzW2Mud29ya2Zsb3dfdGFibGVfZmllbGRfY29kZV0ucHVzaChuZXdUcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIF8uZWFjaCh0YWJsZVRvUmVsYXRlZE1hcCwgZnVuY3Rpb24obWFwLCBrZXkpIHtcbiAgICAgIHZhciBmb3JtVGFibGVGaWVsZCwgcmVsYXRlZEZpZWxkLCByZWxhdGVkRmllbGROYW1lLCByZWxhdGVkT2JqZWN0LCByZWxhdGVkT2JqZWN0TmFtZSwgcmVsYXRlZFJlY29yZHMsIHJlbGF0ZWRUYWJsZUl0ZW1zLCB0YWJsZUNvZGUsIHRhYmxlVmFsdWVzO1xuICAgICAgdGFibGVDb2RlID0gbWFwLl9GUk9NX1RBQkxFX0NPREU7XG4gICAgICBmb3JtVGFibGVGaWVsZCA9IGdldEZvcm1UYWJsZUZpZWxkKGZvcm1UYWJsZUZpZWxkcywgdGFibGVDb2RlKTtcbiAgICAgIGlmICghdGFibGVDb2RlKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ3RhYmxlVG9SZWxhdGVkOiBbJyArIGtleSArICddIG1pc3NpbmcgY29ycmVzcG9uZGluZyB0YWJsZS4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbGF0ZWRPYmplY3ROYW1lID0ga2V5O1xuICAgICAgICB0YWJsZVZhbHVlcyA9IFtdO1xuICAgICAgICByZWxhdGVkVGFibGVJdGVtcyA9IFtdO1xuICAgICAgICByZWxhdGVkT2JqZWN0ID0gZ2V0T2JqZWN0Q29uZmlnKHJlbGF0ZWRPYmplY3ROYW1lKTtcbiAgICAgICAgcmVsYXRlZEZpZWxkID0gXy5maW5kKHJlbGF0ZWRPYmplY3QuZmllbGRzLCBmdW5jdGlvbihmKSB7XG4gICAgICAgICAgcmV0dXJuIFsnbG9va3VwJywgJ21hc3Rlcl9kZXRhaWwnXS5pbmNsdWRlcyhmLnR5cGUpICYmIGYucmVmZXJlbmNlX3RvID09PSBvYmplY3ROYW1lO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVsYXRlZEZpZWxkTmFtZSA9IHJlbGF0ZWRGaWVsZC5uYW1lO1xuICAgICAgICByZWxhdGVkUmVjb3JkcyA9IG9iamVjdEZpbmQocmVsYXRlZE9iamVjdE5hbWUsIHtcbiAgICAgICAgICBmaWx0ZXJzOiBbW3JlbGF0ZWRGaWVsZE5hbWUsICc9JywgcmVjb3JkSWRdXVxuICAgICAgICB9KTtcbiAgICAgICAgcmVsYXRlZFJlY29yZHMuZm9yRWFjaChmdW5jdGlvbihyZWxhdGVkUmVjb3JkKSB7XG4gICAgICAgICAgdmFyIHRhYmxlVmFsdWVJdGVtO1xuICAgICAgICAgIHRhYmxlVmFsdWVJdGVtID0ge307XG4gICAgICAgICAgXy5lYWNoKG1hcCwgZnVuY3Rpb24odmFsdWVLZXksIGZpZWxkS2V5KSB7XG4gICAgICAgICAgICB2YXIgZm9ybUZpZWxkLCBmb3JtRmllbGRLZXksIHJlbGF0ZWRPYmplY3RGaWVsZCwgdGFibGVGaWVsZFZhbHVlO1xuICAgICAgICAgICAgaWYgKGZpZWxkS2V5ICE9PSAnX0ZST01fVEFCTEVfQ09ERScpIHtcbiAgICAgICAgICAgICAgdGFibGVGaWVsZFZhbHVlO1xuICAgICAgICAgICAgICBmb3JtRmllbGRLZXk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZUtleS5zdGFydHNXaXRoKHRhYmxlQ29kZSArICcuJykpIHtcbiAgICAgICAgICAgICAgICBmb3JtRmllbGRLZXkgPSAodmFsdWVLZXkuc3BsaXQoXCIuXCIpWzFdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtRmllbGRLZXkgPSB2YWx1ZUtleTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3JtRmllbGQgPSBnZXRGb3JtVGFibGVTdWJGaWVsZChmb3JtVGFibGVGaWVsZCwgZm9ybUZpZWxkS2V5KTtcbiAgICAgICAgICAgICAgcmVsYXRlZE9iamVjdEZpZWxkID0gcmVsYXRlZE9iamVjdC5maWVsZHNbZmllbGRLZXldO1xuICAgICAgICAgICAgICBpZiAoIWZvcm1GaWVsZCB8fCAhcmVsYXRlZE9iamVjdEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhYmxlRmllbGRWYWx1ZSA9IGdldEluc3RhbmNlRmllbGRWYWx1ZShyZWxhdGVkT2JqZWN0RmllbGQsIGZvcm1GaWVsZCwgcmVsYXRlZFJlY29yZCwgZmllbGRLZXksIHNwYWNlSWQsIHJlbGF0ZWRSZWNvcmRbZmllbGRLZXldLCBlbmFibGVBbWlzZm9ybSk7XG4gICAgICAgICAgICAgIHJldHVybiB0YWJsZVZhbHVlSXRlbVtmb3JtRmllbGRLZXldID0gdGFibGVGaWVsZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghXy5pc0VtcHR5KHRhYmxlVmFsdWVJdGVtKSkge1xuICAgICAgICAgICAgdGFibGVWYWx1ZUl0ZW0uX2lkID0gcmVsYXRlZFJlY29yZC5faWQ7XG4gICAgICAgICAgICB0YWJsZVZhbHVlcy5wdXNoKHRhYmxlVmFsdWVJdGVtKTtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGVkVGFibGVJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgX3RhYmxlOiB7XG4gICAgICAgICAgICAgICAgX2lkOiByZWxhdGVkUmVjb3JkLl9pZCxcbiAgICAgICAgICAgICAgICBfY29kZTogdGFibGVDb2RlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlc1t0YWJsZUNvZGVdID0gdGFibGVWYWx1ZXM7XG4gICAgICAgIHJldHVybiByZWxhdGVkVGFibGVzSW5mb1tyZWxhdGVkT2JqZWN0TmFtZV0gPSByZWxhdGVkVGFibGVJdGVtcztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAob3cuZmllbGRfbWFwX3NjcmlwdCkge1xuICAgICAgXy5leHRlbmQodmFsdWVzLCB1dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmV2YWxGaWVsZE1hcFNjcmlwdChvdy5maWVsZF9tYXBfc2NyaXB0LCBvYmplY3ROYW1lLCBzcGFjZUlkLCByZWNvcmRJZCkpO1xuICAgIH1cbiAgfVxuICBmaWx0ZXJWYWx1ZXMgPSB7fTtcbiAgXy5lYWNoKF8ua2V5cyh2YWx1ZXMpLCBmdW5jdGlvbihrKSB7XG4gICAgaWYgKGZpZWxkQ29kZXMuaW5jbHVkZXMoaykpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJWYWx1ZXNba10gPSB2YWx1ZXNba107XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZpbHRlclZhbHVlcztcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZXZhbEZpZWxkTWFwU2NyaXB0ID0gZnVuY3Rpb24oZmllbGRfbWFwX3NjcmlwdCwgb2JqZWN0TmFtZSwgc3BhY2VJZCwgb2JqZWN0SWQpIHtcbiAgdmFyIGZ1bmMsIHJlY29yZCwgc2NyaXB0LCB2YWx1ZXM7XG4gIHJlY29yZCA9IG9iamVjdEZpbmRPbmUob2JqZWN0TmFtZSwge1xuICAgIGZpbHRlcnM6IFtbJ19pZCcsICc9Jywgb2JqZWN0SWRdXVxuICB9KTtcbiAgc2NyaXB0ID0gXCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZWNvcmQpIHsgXCIgKyBmaWVsZF9tYXBfc2NyaXB0ICsgXCIgfVwiO1xuICBmdW5jID0gX2V2YWwoc2NyaXB0LCBcImZpZWxkX21hcF9zY3JpcHRcIik7XG4gIHZhbHVlcyA9IGZ1bmMocmVjb3JkKTtcbiAgaWYgKF8uaXNPYmplY3QodmFsdWVzKSkge1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihcImV2YWxGaWVsZE1hcFNjcmlwdDog6ISa5pys6L+U5Zue5YC857G75Z6L5LiN5piv5a+56LGhXCIpO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVBdHRhY2ggPSBmdW5jdGlvbihyZWNvcmRJZHMsIHNwYWNlSWQsIGluc0lkLCBhcHByb3ZlSWQpIHtcbiAgQ3JlYXRvci5Db2xsZWN0aW9uc1snY21zX2ZpbGVzJ10uZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgcGFyZW50OiByZWNvcmRJZHNcbiAgfSkuZm9yRWFjaChmdW5jdGlvbihjZikge1xuICAgIHJldHVybiBfLmVhY2goY2YudmVyc2lvbnMsIGZ1bmN0aW9uKHZlcnNpb25JZCwgaWR4KSB7XG4gICAgICB2YXIgZiwgbmV3RmlsZTtcbiAgICAgIGYgPSBDcmVhdG9yLkNvbGxlY3Rpb25zWydjZnMuZmlsZXMuZmlsZXJlY29yZCddLmZpbmRPbmUodmVyc2lvbklkKTtcbiAgICAgIG5ld0ZpbGUgPSBuZXcgRlMuRmlsZSgpO1xuICAgICAgcmV0dXJuIG5ld0ZpbGUuYXR0YWNoRGF0YShmLmNyZWF0ZVJlYWRTdHJlYW0oJ2ZpbGVzJyksIHtcbiAgICAgICAgdHlwZTogZi5vcmlnaW5hbC50eXBlXG4gICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnIuZXJyb3IsIGVyci5yZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIG5ld0ZpbGUubmFtZShmLm5hbWUoKSk7XG4gICAgICAgIG5ld0ZpbGUuc2l6ZShmLnNpemUoKSk7XG4gICAgICAgIG1ldGFkYXRhID0ge1xuICAgICAgICAgIG93bmVyOiBmLm1ldGFkYXRhLm93bmVyLFxuICAgICAgICAgIG93bmVyX25hbWU6IGYubWV0YWRhdGEub3duZXJfbmFtZSxcbiAgICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgICBpbnN0YW5jZTogaW5zSWQsXG4gICAgICAgICAgYXBwcm92ZTogYXBwcm92ZUlkLFxuICAgICAgICAgIHBhcmVudDogY2YuX2lkXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICBtZXRhZGF0YS5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuZXdGaWxlLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgICAgIHJldHVybiBjZnMuaW5zdGFuY2VzLmluc2VydChuZXdGaWxlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuaW5pdGlhdGVSZWNvcmRJbnN0YW5jZUluZm8gPSBmdW5jdGlvbihyZWNvcmRJZHMsIGluc0lkLCBzcGFjZUlkKSB7XG4gIG9iamVjdFVwZGF0ZShyZWNvcmRJZHMubywgcmVjb3JkSWRzLmlkc1swXSwge1xuICAgIGluc3RhbmNlczogW1xuICAgICAge1xuICAgICAgICBfaWQ6IGluc0lkLFxuICAgICAgICBzdGF0ZTogJ2RyYWZ0J1xuICAgICAgfVxuICAgIF0sXG4gICAgbG9ja2VkOiB0cnVlLFxuICAgIGluc3RhbmNlX3N0YXRlOiAnZHJhZnQnXG4gIH0pO1xufTtcblxudXVmbG93TWFuYWdlckZvckluaXRBcHByb3ZhbC5pbml0aWF0ZVJlbGF0ZWRSZWNvcmRJbnN0YW5jZUluZm8gPSBmdW5jdGlvbihyZWxhdGVkVGFibGVzSW5mbywgaW5zSWQsIHNwYWNlSWQpIHtcbiAgXy5lYWNoKHJlbGF0ZWRUYWJsZXNJbmZvLCBmdW5jdGlvbih0YWJsZUl0ZW1zLCByZWxhdGVkT2JqZWN0TmFtZSkge1xuICAgIHZhciByZWxhdGVkQ29sbGVjdGlvbjtcbiAgICByZWxhdGVkQ29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihyZWxhdGVkT2JqZWN0TmFtZSwgc3BhY2VJZCk7XG4gICAgcmV0dXJuIF8uZWFjaCh0YWJsZUl0ZW1zLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICByZXR1cm4gcmVsYXRlZENvbGxlY3Rpb24uZGlyZWN0LnVwZGF0ZShpdGVtLl90YWJsZS5faWQsIHtcbiAgICAgICAgJHNldDoge1xuICAgICAgICAgIGluc3RhbmNlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfaWQ6IGluc0lkLFxuICAgICAgICAgICAgICBzdGF0ZTogJ2RyYWZ0J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgX3RhYmxlOiBpdGVtLl90YWJsZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmNoZWNrSXNJbkFwcHJvdmFsID0gZnVuY3Rpb24ocmVjb3JkSWRzLCBzcGFjZUlkKSB7XG4gIHZhciByZWNvcmQ7XG4gIHJlY29yZCA9IG9iamVjdEZpbmRPbmUocmVjb3JkSWRzLm8sIHtcbiAgICBmaWx0ZXJzOiBbWydfaWQnLCAnPScsIHJlY29yZElkcy5pZHNbMF1dXSxcbiAgICBmaWVsZHM6IFsnaW5zdGFuY2VzJ11cbiAgfSk7XG4gIGlmIChyZWNvcmQgJiYgcmVjb3JkLmluc3RhbmNlcyAmJiByZWNvcmQuaW5zdGFuY2VzWzBdLnN0YXRlICE9PSAnY29tcGxldGVkJyAmJiBDcmVhdG9yLkNvbGxlY3Rpb25zLmluc3RhbmNlcy5maW5kKHJlY29yZC5pbnN0YW5jZXNbMF0uX2lkKS5jb3VudCgpID4gMCkge1xuICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5q2k6K6w5b2V5bey5Y+R6LW35rWB56iL5q2j5Zyo5a6h5om55Lit77yM5b6F5a6h5om557uT5p2f5pa55Y+v5Y+R6LW35LiL5LiA5qyh5a6h5om577yBXCIpO1xuICB9XG59O1xuXG51dWZsb3dNYW5hZ2VyRm9ySW5pdEFwcHJvdmFsLmZvcm1hdERhdGUgPSBmdW5jdGlvbihkYXRlKSB7XG4gIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbn07XG5cbnV1Zmxvd01hbmFnZXJGb3JJbml0QXBwcm92YWwuZm9ybWF0VGltZSA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgcmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQoMCkuZm9ybWF0KFwiMTk3MC0wMS0wMVRISDptbTowMC4wMDBbWl1cIik7XG59O1xuIl19 diff --git a/server/bundle/programs/server/packages/steedos_creator.js.map b/server/bundle/programs/server/packages/steedos_creator.js.map index 30b0c02ceb..5dbea217c5 100644 --- a/server/bundle/programs/server/packages/steedos_creator.js.map +++ b/server/bundle/programs/server/packages/steedos_creator.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/steedos:creator/checkNpm.js","meteor://💻app/packages/steedos_creator/core.coffee","meteor://💻app/core.coffee","meteor://💻app/packages/steedos_creator/lib/apps.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_recent_viewed.coffee","meteor://💻app/server/methods/object_recent_viewed.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_recent_record.coffee","meteor://💻app/server/methods/object_recent_record.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_listviews_options.coffee","meteor://💻app/server/methods/object_listviews_options.coffee","meteor://💻app/packages/steedos_creator/server/methods/report_data.coffee","meteor://💻app/server/methods/report_data.coffee","meteor://💻app/packages/steedos_creator/server/methods/user_tabular_settings.coffee","meteor://💻app/server/methods/user_tabular_settings.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_export2xml.coffee","meteor://💻app/server/methods/object_export2xml.coffee","meteor://💻app/packages/steedos_creator/server/methods/related_objects_records.coffee","meteor://💻app/server/methods/related_objects_records.coffee","meteor://💻app/packages/steedos_creator/server/methods/pending_space.coffee","meteor://💻app/server/methods/pending_space.coffee","meteor://💻app/packages/steedos_creator/server/publications/object.coffee","meteor://💻app/server/publications/object.coffee","meteor://💻app/packages/steedos_creator/server/publications/object_tabular.coffee","meteor://💻app/server/publications/object_tabular.coffee","meteor://💻app/packages/steedos_creator/server/publications/object_listviews.coffee","meteor://💻app/packages/steedos_creator/server/publications/user_tabular_settings.coffee","meteor://💻app/packages/steedos_creator/server/publications/related_objects_records.coffee","meteor://💻app/server/publications/related_objects_records.coffee","meteor://💻app/packages/steedos_creator/server/publications/space_user_info.coffee","meteor://💻app/packages/steedos_creator/server/publications/contacts_view_limits.coffee","meteor://💻app/server/publications/contacts_view_limits.coffee","meteor://💻app/packages/steedos_creator/server/publications/contacts_no_force_phone_users.coffee","meteor://💻app/server/publications/contacts_no_force_phone_users.coffee","meteor://💻app/packages/steedos_creator/server/publications/space_need_to_confirm.coffee","meteor://💻app/server/publications/space_need_to_confirm.coffee","meteor://💻app/packages/steedos_creator/server/lib/permission_manager.coffee","meteor://💻app/server/lib/permission_manager.coffee","meteor://💻app/packages/steedos_creator/server/lib/uuflowManagerForInitApproval.coffee","meteor://💻app/server/lib/uuflowManagerForInitApproval.coffee"],"names":["checkNpmVersions","module","link","v","busboy","Meteor","settings","cfs","aliyun","Creator","getSchema","object_name","ref","getObject","schema","getObjectHomeComponent","getObjectUrl","record_id","app_id","list_view","list_view_id","Session","get","getListView","_id","getRelativeUrl","getObjectAbsoluteUrl","Steedos","absoluteUrl","getObjectRouterUrl","getListViewUrl","url","getListViewRelativeUrl","getSwitchListUrl","getRelatedObjectUrl","related_object_name","related_field_name","getObjectLookupFieldOptions","is_deep","is_skip_hide","is_related","_object","_options","fields","icon","relatedObjects","_","forEach","f","k","hidden","type","push","label","value","r_object","reference_to","isString","f2","k2","getRelatedObjects","each","_this","_relatedObject","relatedObject","relatedOptions","relatedOption","foreign_key","name","getObjectFilterFieldOptions","permission_fields","getFields","include","test","indexOf","getObjectFieldOptions","getFiltersWithFilterFields","filters","filter_fields","length","n","field","required","findWhere","is_default","is_required","filterItem","matchField","find","getObjectRecord","select_fields","expand","collection","obj","record","ref1","ref2","isClient","Template","instance","odata","database_name","getCollection","findOne","getObjectRecordName","name_field_key","NAME_FIELD_KEY","getApp","appMenus","currentApp","menuItem","id","getAppDashboard","app","dashboard","Dashboards","apps","getAppDashboardComponent","getAppObjectNames","appObjects","isMobile","objects","mobile_objects","permissions","allowRead","getUrlWithToken","expressionFormData","hasQuerySymbol","linkStr","params","spaceId","userId","getUserCompanyIds","Accounts","_storedLoginToken","isExpression","parseSingleExpression","USER_CONTEXT","$","param","getAppMenu","menu_id","menus","getAppMenus","menu","getAppMenuUrlForInternet","path","getAppMenuUrl","target","curentAppMenus","children","loadAppsMenus","data","options","mobile","success","set","authRequest","creatorAppsSelector","assigned_apps","adminApp","creatorApps","sortedApps","key","is_creator","visible","sortBy","values","admin","visibleAppsSelector","includeAdmin","getVisibleApps","changeApp","_subApp","Object","assign","Apps","getVisibleAppsObjects","visibleObjectNames","flatten","pluck","filter","Objects","sort","sortingMethod","bind","uniq","getAppsObjects","tempObjects","concat","validateFilters","logic","e","errorMsg","filter_items","filter_length","flag","index","word","map","isEmpty","compact","replace","match","i","includes","w","error","console","log","toastr","formatFiltersToMongo","selector","Array","operation","option","reg","sub_selector","evaluateFormula","RegExp","isBetweenFilterOperation","getBetweenTimeBuiltinValues","formatFiltersToDev","logicTempFilters","is_logic_or","pop","SteedosFilters","formatLogicFiltersToDev","filter_logic","format_logic","x","_f","isArray","JSON","stringify","related_object_names","related_objects","unrelated_objects","getObjectRelateds","_collection_name","getPermissions","difference","related_object","isActive","allowReadFiles","getRelatedObjectNames","getRelatedObjectListActions","relatedObjectName","actions","getActions","action","on","disabled_actions","has","allow_customActions","keys","exclude_actions","getListViews","disabled_list_views","listViews","list_views","object","item","item_name","isDisabled","owner","fieldsName","unreadable_fields","getObjectFieldsName","isloading","bootstrapLoaded","convertSpecialCharacter","str","getDisabledFields","fieldName","autoform","disabled","omit","getHiddenFields","getFieldsWithNoGroup","group","getSortedFieldGroupNames","names","unique","getFieldsForGroup","groupName","getSystemBaseFields","getFieldsWithoutSystemBase","getFieldsWithoutOmit","pick","getFieldsInFirstLevel","firstLevelKeys","getFieldsForReorder","isSingle","_keys","childKeys","is_wide_1","is_wide_2","sc_1","sc_2","endsWith","is_wide","slice","isFilterValueEmpty","Number","isNaN","getFieldDataType","objectFields","result","data_type","isServer","getAllRelatedObjects","related_field","enable_files","formatIndex","array","indexName","isdocumentDB","background","datasources","documentDB","join","substring","appsByName","methods","space_id","collection_recent_viewed","current_recent_viewed","doc","space","update","$inc","count","$set","modified","Date","modified_by","insert","_makeNewID","o","ids","created","created_by","validate","async_recent_aggregate","recent_aggregate","search_object","_records","callback","Collections","object_recent_viewed","rawCollection","aggregate","$match","$group","maxCreated","$max","$sort","$limit","toArray","err","Error","isFunction","wrapAsync","searchText","_object_collection","_object_name_key","query","query_and","records","search_Keywords","split","keyword","subquery","$regex","trim","$and","$in","limit","_name","_object_name","record_object","record_object_collection","self","objectsByName","object_record","enable_search","update_filters","listview_id","filter_scope","object_listviews","direct","update_columns","columns","check","compoundFields","cursor","filterFields","childKey","objectField","splits","isCommonSpace","isSpaceAdmin","skip","fetch","compoundFieldItem","compoundFilterFields","itemKey","itemValue","referenceItem","setting","column_width","obj1","_id_actions","_mixFieldsData","_mixRelatedData","_writeXmlFile","fs","logger","mkdirp","xml2js","require","Logger","jsonObj","objName","builder","day","fileAddress","fileName","filePath","month","now","stream","xml","year","Builder","buildObject","Buffer","getFullYear","getMonth","getDate","__meteor_bootstrap__","serverDir","existsSync","sync","writeFile","mixBool","mixDate","mixDefault","objFields","field_name","date","dateStr","format","moment","relatedObjNames","relatedObjName","relatedCollection","relatedRecordList","relatedTableData","relatedObj","fieldsData","Export2xml","recordList","info","time","recordObj","timeEnd","related_objects_records","related_records","viewAllRecords","getPendingSpaceInfo","inviterId","inviterName","spaceName","db","users","spaces","inviter","refuseJoinSpace","space_users","invite_state","acceptJoinSpace","user_accepted","publish","publishComposite","tableName","_fields","object_colleciton","reference_fields","ready","String","Match","Optional","getObjectName","unblock","field_keys","_objectKeys","reference_field","parent","children_fields","p_k","reference_ids","reference_to_object","s_k","getProperty","reduce","isObject","shared","user","space_settings","permissionManagerForInitApproval","getFlowPermissions","flow_id","user_id","flow","my_permissions","org_ids","organizations","orgs_can_add","orgs_can_admin","orgs_can_monitor","users_can_add","users_can_admin","users_can_monitor","uuflowManagerForInitApproval","getFlow","parents","org","parent_id","perms","org_id","_eval","checkRequiredDetails","getFieldOdataValue","getFileFieldValue","getFormField","getFormTableField","getFormTableFieldCode","getFormTableSubField","getInstanceFieldValue","getObjectConfig","getObjectNameFieldKey","getRelatedObjectFieldCode","getRelateds","getSelectOrgValue","getSelectOrgValues","getSelectUserValue","getSelectUserValues","objectFind","objectFindOne","objectUpdate","objectql","objectApiName","toConfig","cb","then","resolve","reject","top","relatedObjectsKeys","relatedObjectsKey","startsWith","formTableFieldsCode","formTableFieldCode","formTableFields","code","formFields","ff","sf","tableField","subFieldCode","referenceToFieldName","_record","nameKey","su","userIds","sus","orgId","fullname","orgIds","orgs","recordFieldId","fType","files","newFile","FS","File","attachData","createReadStream","original","metadata","reason","size","instances","objField","formField","object_field","recordFieldValue","enableAmisform","odataFieldValue","referenceToObjectName","selectFieldValue","steedos_field","reference_to_field","multiple","is_multiselect","formatDate","hasOwnProperty","requiredDetails","masterRecord","rd","masterField","masterFieldValue","refId","subObjConfig","subTableMasterField","subTableName","subTableRecord","check_authorization","req","authToken","hashedToken","_hashLoginToken","getSpace","flows","getSpaceUser","space_user","getSpaceUserOrgInfo","organization","organization_name","organization_fullname","isFlowEnabled","state","isFlowSpaceMatched","getForm","form_id","form","forms","getCategory","category_id","categories","checkSyncDirection","ow","syncDirection","object_workflows","sync_direction","create_instance","instance_from_client","user_info","appr_obj","approve_from_client","category","ins_obj","new_ins_id","relatedTablesInfo","space_user_org_info","start_step","trace_from_client","trace_obj","checkIsInApproval","permissionManager","flow_version","current","form_version","submitter","submitter_name","applicant","applicant_name","applicant_organization","applicant_organization_name","applicant_organization_fullname","applicant_company","company_id","is_archived","is_deleted","record_ids","Mongo","ObjectID","_str","is_finished","steps","step","step_type","start_date","trace","user_name","handler","handler_name","handler_organization","handler_organization_name","handler_organization_fullname","read_date","is_read","is_error","description","initiateValues","approves","traces","inbox_users","current_step_name","auto_remind","flow_name","category_name","initiateRecordInstanceInfo","initiateAttach","recordIds","flowId","fieldCodes","filterValues","objectName","recordId","tableFieldCodes","tableFieldMap","tableToRelatedMap","enable_amisform","required_details","field_map","fm","gridCode","lookupFieldName","lookupFieldObj","lookupObjectRecord","oTableCode","oTableCodeReferenceField","oTableCodeReferenceFieldCode","oTableFieldCode","objectFieldName","objectFieldObjectName","objectLookupField","referenceToDoc","referenceToFieldValue","relatedObjectFieldCode","tableToRelatedMapKey","wTableCode","workflow_field","table1","workflow_table_field_code","object_table_field_code","tfc","c","parse","tr","newTr","tdValue","tfm","wTdCode","formTableField","relatedField","relatedFieldName","relatedRecords","relatedTableItems","tableCode","tableValues","_FROM_TABLE_CODE","warn","relatedRecord","tableValueItem","valueKey","fieldKey","formFieldKey","relatedObjectField","tableFieldValue","_table","_code","field_map_script","extend","evalFieldMapScript","objectId","func","script","insId","approveId","cf","versions","versionId","idx","owner_name","approve","locked","instance_state","initiateRelatedRecordInstanceInfo","tableItems"],"mappings":"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","file":"/packages/steedos_creator.js","sourcesContent":["import {\n\tcheckNpmVersions\n} from 'meteor/tmeasday:check-npm-versions';\ncheckNpmVersions({\n\tbusboy: \"^0.2.13\",\n\t\"xml2js\": \"^0.4.19\",\n}, 'steedos:creator');\n\nif (Meteor.settings && Meteor.settings.cfs && Meteor.settings.cfs.aliyun) {\n\tcheckNpmVersions({\n\t\t\"aliyun-sdk\": \"^1.11.12\"\n\t}, 'steedos:creator');\n}","\n\t# Creator.initApps()\n\n\n# Creator.initApps = ()->\n# \tif Meteor.isServer\n# \t\t_.each Creator.Apps, (app, app_id)->\n# \t\t\tdb_app = db.apps.findOne(app_id)\n# \t\t\tif !db_app\n# \t\t\t\tapp._id = app_id\n# \t\t\t\tdb.apps.insert(app)\n# else\n# \tapp._id = app_id\n# \tdb.apps.update({_id: app_id}, app)\n\nCreator.getSchema = (object_name)->\n\treturn Creator.getObject(object_name)?.schema\n\nCreator.getObjectHomeComponent = (object_name)->\n\t# if Meteor.isClient\n\t# \treturn BuilderCreator.pluginComponentSelector(BuilderCreator.store.getState(), \"ObjectHome\", object_name)\n\treturn false;\n\nCreator.getObjectUrl = (object_name, record_id, app_id) ->\n\tif !app_id\n\t\tapp_id = Session.get(\"app_id\")\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tlist_view = Creator.getListView(object_name, null)\n\tlist_view_id = list_view?._id\n\n\tif record_id\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id)\n\telse\n\t\tif Creator.getObjectHomeComponent(object_name)\n\t\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name)\n\t\telse\n\t\t\tif list_view_id\n\t\t\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id)\n\t\t\telse\n\t\t\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name)\n\nCreator.getObjectAbsoluteUrl = (object_name, record_id, app_id) ->\n\tif !app_id\n\t\tapp_id = Session.get(\"app_id\")\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tlist_view = Creator.getListView(object_name, null)\n\tlist_view_id = list_view?._id\n\n\tif record_id\n\t\treturn Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id, true)\n\telse\n\t\treturn Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id, true)\n\nCreator.getObjectRouterUrl = (object_name, record_id, app_id) ->\n\tif !app_id\n\t\tapp_id = Session.get(\"app_id\")\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tlist_view = Creator.getListView(object_name, null)\n\tlist_view_id = list_view?._id\n\n\tif record_id\n\t\treturn \"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id\n\telse\n\t\treturn \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id\n\nCreator.getListViewUrl = (object_name, app_id, list_view_id) ->\n\turl = Creator.getListViewRelativeUrl(object_name, app_id, list_view_id)\n\treturn Creator.getRelativeUrl(url)\n\nCreator.getListViewRelativeUrl = (object_name, app_id, list_view_id) ->\n\treturn \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id\n\nCreator.getSwitchListUrl = (object_name, app_id, list_view_id) ->\n\tif list_view_id\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + list_view_id + \"/list\")\n\telse\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/list/switch\")\n\nCreator.getRelatedObjectUrl = (object_name, app_id, record_id, related_object_name, related_field_name) ->\n\tif related_field_name\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid?related_field_name=\" + related_field_name)\n\telse\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid\")\n\nCreator.getObjectLookupFieldOptions = (object_name, is_deep, is_skip_hide, is_related)->\n\t_options = []\n\tunless object_name\n\t\treturn _options\n\t_object = Creator.getObject(object_name)\n\tfields = _object?.fields\n\ticon = _object?.icon\n\t_.forEach fields, (f, k)->\n\t\tif is_skip_hide and f.hidden\n\t\t\treturn\n\t\tif f.type == \"select\"\n\t\t\t_options.push {label: \"#{f.label || k}\", value: \"#{k}\", icon: icon}\n\t\telse\n\t\t\t_options.push {label: f.label || k, value: k, icon: icon}\n\tif is_deep\n\t\t_.forEach fields, (f, k)->\n\t\t\tif is_skip_hide and f.hidden\n\t\t\t\treturn\n\t\t\tif (f.type == \"lookup\" || f.type == \"master_detail\") && f.reference_to && _.isString(f.reference_to)\n\t\t\t\t# 不支持f.reference_to为function的情况,有需求再说\n\t\t\t\tr_object = Creator.getObject(f.reference_to)\n\t\t\t\tif r_object\n\t\t\t\t\t_.forEach r_object.fields, (f2, k2)->\n\t\t\t\t\t\t_options.push {label: \"#{f.label || k}=>#{f2.label || k2}\", value: \"#{k}.#{k2}\", icon: r_object?.icon}\n\tif is_related\n\t\trelatedObjects = Creator.getRelatedObjects(object_name)\n\t\t_.each relatedObjects, (_relatedObject)=>\n\t\t\trelatedOptions = Creator.getObjectLookupFieldOptions(_relatedObject.object_name, false, false, false)\n\t\t\trelatedObject = Creator.getObject(_relatedObject.object_name)\n\t\t\t_.each relatedOptions, (relatedOption)->\n\t\t\t\tif _relatedObject.foreign_key != relatedOption.value\n\t\t\t\t\t_options.push {label: \"#{relatedObject.label || relatedObject.name}=>#{relatedOption.label}\", value: \"#{relatedObject.name}.#{relatedOption.value}\", icon: relatedObject?.icon}\n\treturn _options\n\n# 统一为对象object_name提供可用于过虑器过虑字段\nCreator.getObjectFilterFieldOptions = (object_name)->\n\t_options = []\n\tunless object_name\n\t\treturn _options\n\t_object = Creator.getObject(object_name)\n\tfields = _object?.fields\n\tpermission_fields = Creator.getFields(object_name)\n\ticon = _object?.icon\n\t_.forEach fields, (f, k)->\n\t\t# hidden,grid等类型的字段,不需要过滤\n\t\tif !_.include([\"grid\",\"object\", \"[Object]\", \"[object]\", \"Object\", \"avatar\", \"image\", \"markdown\", \"html\"], f.type) and !f.hidden\n\t\t\t# filters.$.field及flow.current等子字段也不需要过滤\n\t\t\tif !/\\w+\\./.test(k) and _.indexOf(permission_fields, k) > -1\n\t\t\t\t_options.push {label: f.label || k, value: k, icon: icon}\n\n\treturn _options\n\nCreator.getObjectFieldOptions = (object_name)->\n\t_options = []\n\tunless object_name\n\t\treturn _options\n\t_object = Creator.getObject(object_name)\n\tfields = _object?.fields\n\tpermission_fields = Creator.getFields(object_name)\n\ticon = _object?.icon\n\t_.forEach fields, (f, k)->\n\t\tif !_.include([\"grid\",\"object\", \"[Object]\", \"[object]\", \"Object\", \"markdown\", \"html\"], f.type)\n\t\t\tif !/\\w+\\./.test(k) and _.indexOf(permission_fields, k) > -1\n\t\t\t\t_options.push {label: f.label || k, value: k, icon: icon}\n\treturn _options\n\n###\nfilters: 要转换的filters\nfields: 对象字段\nfilter_fields: 默认过滤字段,支持字符串数组和对象数组两种格式,如:['filed_name1','filed_name2'],[{field:'filed_name1',required:true}]\n处理逻辑: 把filters中存在于filter_fields的过滤条件增加每项的is_default、is_required属性,不存在于filter_fields的过滤条件对应的移除每项的相关属性\n返回结果: 处理后的filters\n###\nCreator.getFiltersWithFilterFields = (filters, fields, filter_fields)->\n\tunless filters\n\t\tfilters = []\n\tunless filter_fields\n\t\tfilter_fields = []\n\tif filter_fields?.length\n\t\tfilter_fields.forEach (n)->\n\t\t\tif _.isString(n)\n\t\t\t\tn = \n\t\t\t\t\tfield: n,\n\t\t\t\t\trequired: false\n\t\t\tif fields[n.field] and !_.findWhere(filters,{field:n.field})\n\t\t\t\tfilters.push\n\t\t\t\t\tfield: n.field,\n\t\t\t\t\tis_default: true,\n\t\t\t\t\tis_required: n.required\n\tfilters.forEach (filterItem)->\n\t\tmatchField = filter_fields.find (n)-> return n == filterItem.field or n.field == filterItem.field\n\t\tif _.isString(matchField)\n\t\t\tmatchField = \n\t\t\t\tfield: matchField,\n\t\t\t\trequired: false\n\t\tif matchField\n\t\t\tfilterItem.is_default = true\n\t\t\tfilterItem.is_required = matchField.required\n\t\telse\n\t\t\tdelete filterItem.is_default\n\t\t\tdelete filterItem.is_required\n\treturn filters\n\nCreator.getObjectRecord = (object_name, record_id, select_fields, expand)->\n\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tif !record_id\n\t\trecord_id = Session.get(\"record_id\")\n\tif Meteor.isClient\n\t\tif object_name == Session.get(\"object_name\") && record_id == Session.get(\"record_id\")\n\t\t\tif Template.instance()?.record\n\t\t\t\treturn Template.instance()?.record?.get()\n\t\telse\n\t\t\treturn Creator.odata.get(object_name, record_id, select_fields, expand)\n\n\tobj = Creator.getObject(object_name)\n\n\tif obj.database_name == \"meteor\" || !obj.database_name\n\t\tcollection = Creator.getCollection(object_name)\n\t\tif collection\n\t\t\trecord = collection.findOne(record_id)\n\t\t\treturn record\n\telse if object_name && record_id\n\t\treturn Creator.odata.get(object_name, record_id, select_fields, expand)\n\nCreator.getObjectRecordName = (record, object_name)->\n\tunless record\n\t\trecord = Creator.getObjectRecord()\n\tif record\n\t\t# 显示组织列表时,特殊处理name_field_key为name字段\n\t\tname_field_key = if object_name == \"organizations\" then \"name\" else Creator.getObject(object_name)?.NAME_FIELD_KEY\n\t\tif record and name_field_key\n\t\t\treturn record.label || record[name_field_key]\n\nCreator.getApp = (app_id)->\n\tappMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n\tunless appMenus\n\t\treturn {}\n\tcurrentApp = appMenus.find (menuItem) ->\n\t\treturn menuItem.id == app_id\n\treturn currentApp\n\nCreator.getAppDashboard = (app_id)->\n\tapp = Creator.getApp(app_id)\n\tif !app\n\t\treturn\n\tdashboard = null\n\t_.each Creator.Dashboards, (v, k)->\n\t\tif v.apps?.indexOf(app._id) > -1\n\t\t\tdashboard = v;\n\treturn dashboard;\n\nCreator.getAppDashboardComponent = (app_id)->\n\tapp = Creator.getApp(app_id)\n\tif !app || true\n\t\treturn\n\t# return BuilderCreator.pluginComponentSelector(BuilderCreator.store.getState(), \"Dashboard\", app._id);\n\nCreator.getAppObjectNames = (app_id)->\n\tapp = Creator.getApp(app_id)\n\tif !app\n\t\treturn\n\tisMobile = Steedos.isMobile()\n\tappObjects = if isMobile then app.mobile_objects else app.objects\n\tobjects = []\n\tif app\n\t\t_.each appObjects, (v)->\n\t\t\tobj = Creator.getObject(v)\n\t\t\tif obj?.permissions.get().allowRead\n\t\t\t\tobjects.push v\n\treturn objects\n\nCreator.getUrlWithToken = (url, expressionFormData) ->\n\t# 给url时拼接当前用户token相关信息用于登录验证,支持配置表达式\n\tparams = {};\n\tparams[\"X-Space-Id\"] = Steedos.spaceId()\n\tparams[\"X-User-Id\"] = Steedos.userId();\n\tparams[\"X-Company-Ids\"] = Steedos.getUserCompanyIds();\n\tparams[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n\tif Steedos.isExpression(url)\n\t\turl = Steedos.parseSingleExpression(url, expressionFormData, \"#\", Creator.USER_CONTEXT)\n\t# 外部链接地址中可能会带有#号,比如/builder/?p_ids=619383545b2e9a72ec0558b3#/page/public/test\n\t# 此时url中已经在#号前面出现了一个?号,这个问号不可以被识别为url参数,只有#号后面的?号才应该被识别为url参数\n\thasQuerySymbol = /(\\#.+\\?)|(\\?[^#]*$)/g.test(url)\n\tlinkStr = if hasQuerySymbol then \"&\" else \"?\"\n\treturn \"#{url}#{linkStr}#{$.param(params)}\"\n\nCreator.getAppMenu = (app_id, menu_id)->\n\tmenus = Creator.getAppMenus(app_id)\n\treturn menus && menus.find (menu)-> return menu.id == menu_id\n\nCreator.getAppMenuUrlForInternet = (menu)->\n\t# 当tabs类型为url时,按外部链接处理,支持配置表达式并加上统一的url参数\n\treturn Creator.getUrlWithToken menu.path, menu\n\nCreator.getAppMenuUrl = (menu)->\n\turl = menu.path\n\tif menu.type == \"url\"\n\t\tif menu.target\n\t\t\treturn Creator.getAppMenuUrlForInternet(menu)\n\t\telse\n\t\t\t# 在iframe中显示url界面\n\t\t\treturn \"/app/-/tab_iframe/#{menu.id}\"\n\telse\n\t\treturn menu.path\n\nCreator.getAppMenus = (app_id)->\n\tappMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n\tunless appMenus\n\t\treturn []\n\tcurentAppMenus = appMenus.find (menuItem) ->\n\t\treturn menuItem.id == app_id\n\tif curentAppMenus\n\t\treturn curentAppMenus.children\n\nCreator.loadAppsMenus = ()->\n\tisMobile = Steedos.isMobile()\n\tdata = { }\n\tif isMobile\n\t\tdata.mobile = isMobile\n\toptions = { \n\t\ttype: 'get', \n\t\tdata: data, \n\t\tsuccess: (data)->\n\t\t\tSession.set(\"app_menus\", data);\n\t }\n\tSteedos?.authRequest \"/service/api/apps/menus\", options\n\nCreator.creatorAppsSelector = (apps, assigned_apps) ->\n\tadminApp = undefined\n\tsortedApps = undefined\n\t_.each apps, (app, key) ->\n\t\tif !app._id\n\t\t\tapp._id = key\n\t\tif app.is_creator\n\t\t\t# 不需要isSpaceAdmin逻辑\n\t\t\t# if (isSpaceAdmin) {\n\t\t\t#\t\t app.visible = true;\n\t\t\t# }\n\t\telse\n\t\t\t# 非creator应该一律不显示\n\t\t\tapp.visible = false\n\t\treturn\n\tsortedApps = _.sortBy(_.values(apps), 'sort')\n\tcreatorApps = {}\n\tadminApp = {}\n\t# 按钮sort排序次序设置Creator.Apps值\n\t_.each sortedApps, (n) ->\n\t\tif n._id == 'admin'\n\t\t\tadminApp = n\n\t\telse\n\t\t\tcreatorApps[n._id] = n\n\t# admin菜单显示在最后\n\tcreatorApps.admin = adminApp\n\tif assigned_apps.length\n\t\t_.each creatorApps, (app, key) ->\n\t\t\tif assigned_apps.indexOf(key) > -1\n\t\t\t\tapp.visible = app.is_creator\n\t\t\telse\n\t\t\t\tapp.visible = false\n\t\t\treturn\n\tcreatorApps\n\nCreator.visibleAppsSelector = (creatorApps, includeAdmin = true) ->\n\tapps = []\n\t_.each creatorApps, (v, k) ->\n\t\tif v.visible != false and v._id != 'admin' or includeAdmin and v._id == 'admin'\n\t\t\tapps.push v\n\t\treturn\n\tapps\n\nCreator.getVisibleApps = (includeAdmin)->\n\tchangeApp = Creator._subApp.get();\n\tcreatorApps = Object.assign({}, Creator.Apps, {apps: changeApp});\n\treturn Creator.visibleAppsSelector(creatorApps, includeAdmin)\n\nCreator.getVisibleAppsObjects = ()->\n\tapps = Creator.getVisibleApps()\n\tvisibleObjectNames = _.flatten(_.pluck(apps,'objects'))\n\tobjects = _.filter Creator.Objects, (obj)->\n\t\tif visibleObjectNames.indexOf(obj.name) < 0\n\t\t\treturn false\n\t\telse\n\t\t\treturn true\n\tobjects = objects.sort(Creator.sortingMethod.bind({key:\"label\"}))\n\tobjects = _.pluck(objects,'name')\n\treturn _.uniq objects\n\nCreator.getAppsObjects = ()->\n\tobjects = []\n\ttempObjects = []\n\t_.forEach Creator.Apps, (app)->\n\t\ttempObjects = _.filter app.objects, (obj)->\n\t\t\treturn !obj.hidden\n\t\tobjects = objects.concat(tempObjects)\n\treturn _.uniq objects\n\nCreator.validateFilters = (filters, logic)->\n\tfilter_items = _.map filters, (obj) ->\n\t\tif _.isEmpty(obj)\n\t\t\treturn false\n\t\telse\n\t\t\treturn obj\n\tfilter_items = _.compact(filter_items)\n\terrorMsg = \"\"\n\tfilter_length = filter_items.length\n\tif logic\n\t\t# 格式化filter\n\t\tlogic = logic.replace(/\\n/g, \"\").replace(/\\s+/g, \" \")\n\n\t\t# 判断特殊字符\n\t\tif /[._\\-!+]+/ig.test(logic)\n\t\t\terrorMsg = \"含有特殊字符。\"\n\n\t\tif !errorMsg\n\t\t\tindex = logic.match(/\\d+/ig)\n\t\t\tif !index\n\t\t\t\terrorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\"\n\t\t\telse\n\t\t\t\tindex.forEach (i)->\n\t\t\t\t\tif i < 1 or i > filter_length\n\t\t\t\t\t\terrorMsg = \"您的筛选条件引用了未定义的筛选器:#{i}。\"\n\n\t\t\t\tflag = 1\n\t\t\t\twhile flag <= filter_length\n\t\t\t\t\tif !index.includes(\"#{flag}\")\n\t\t\t\t\t\terrorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\"\n\t\t\t\t\tflag++;\n\n\t\tif !errorMsg\n\t\t\t# 判断是否有非法英文字符\n\t\t\tword = logic.match(/[a-zA-Z]+/ig)\n\t\t\tif word\n\t\t\t\tword.forEach (w)->\n\t\t\t\t\tif !/^(and|or)$/ig.test(w)\n\t\t\t\t\t\terrorMsg = \"检查您的高级筛选条件中的拼写。\"\n\n\t\tif !errorMsg\n\t\t\t# 判断格式是否正确\n\t\t\ttry\n\t\t\t\tCreator.eval(logic.replace(/and/ig, \"&&\").replace(/or/ig, \"||\"))\n\t\t\tcatch e\n\t\t\t\terrorMsg = \"您的筛选器中含有特殊字符\"\n\n\t\t\tif /(AND)[^()]+(OR)/ig.test(logic) || /(OR)[^()]+(AND)/ig.test(logic)\n\t\t\t\terrorMsg = \"您的筛选器必须在连续性的 AND 和 OR 表达式前后使用括号。\"\n\tif errorMsg\n\t\tconsole.log \"error\", errorMsg\n\t\tif Meteor.isClient\n\t\t\ttoastr.error(errorMsg)\n\t\treturn false\n\telse\n\t\treturn true\n\n# \"=\", \"<>\", \">\", \">=\", \"<\", \"<=\", \"startswith\", \"contains\", \"notcontains\".\n###\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n###\nCreator.formatFiltersToMongo = (filters, options)->\n\tunless filters?.length\n\t\treturn\n\t# 当filters不是[Array]类型而是[Object]类型时,进行格式转换\n\tunless filters[0] instanceof Array\n\t\tfilters = _.map filters, (obj)->\n\t\t\treturn [obj.field, obj.operation, obj.value]\n\tselector = []\n\t_.each filters, (filter)->\n\t\tfield = filter[0]\n\t\toption = filter[1]\n\t\tif Meteor.isClient\n\t\t\tvalue = Creator.evaluateFormula(filter[2])\n\t\telse\n\t\t\tvalue = Creator.evaluateFormula(filter[2], null, options)\n\t\tsub_selector = {}\n\t\tsub_selector[field] = {}\n\t\tif option == \"=\"\n\t\t\tsub_selector[field][\"$eq\"] = value\n\t\telse if option == \"<>\"\n\t\t\tsub_selector[field][\"$ne\"] = value\n\t\telse if option == \">\"\n\t\t\tsub_selector[field][\"$gt\"] = value\n\t\telse if option == \">=\"\n\t\t\tsub_selector[field][\"$gte\"] = value\n\t\telse if option == \"<\"\n\t\t\tsub_selector[field][\"$lt\"] = value\n\t\telse if option == \"<=\"\n\t\t\tsub_selector[field][\"$lte\"] = value\n\t\telse if option == \"startswith\"\n\t\t\treg = new RegExp(\"^\" + value, \"i\")\n\t\t\tsub_selector[field][\"$regex\"] = reg\n\t\telse if option == \"contains\"\n\t\t\treg = new RegExp(value, \"i\")\n\t\t\tsub_selector[field][\"$regex\"] = reg\n\t\telse if option == \"notcontains\"\n\t\t\treg = new RegExp(\"^((?!\" + value + \").)*$\", \"i\")\n\t\t\tsub_selector[field][\"$regex\"] = reg\n\t\tselector.push sub_selector\n\treturn selector\n\nCreator.isBetweenFilterOperation = (operation)->\n\treturn operation == \"between\" or !!Creator.getBetweenTimeBuiltinValues(true)?[operation]\n\n###\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\n\textend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n###\nCreator.formatFiltersToDev = (filters, object_name, options)->\n\tunless filters.length\n\t\treturn\n\tif options?.is_logic_or\n\t\t# 如果is_logic_or为true,为filters第一层元素增加or间隔\n\t\tlogicTempFilters = []\n\t\tfilters.forEach (n)->\n\t\t\tlogicTempFilters.push(n)\n\t\t\tlogicTempFilters.push(\"or\")\n\t\tlogicTempFilters.pop()\n\t\tfilters = logicTempFilters\n\tselector = SteedosFilters.formatFiltersToDev(filters, Creator.USER_CONTEXT)\n\treturn selector\n\n###\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n###\nCreator.formatLogicFiltersToDev = (filters, filter_logic, options)->\n\tformat_logic = filter_logic.replace(/\\(\\s+/ig, \"(\").replace(/\\s+\\)/ig, \")\").replace(/\\(/g, \"[\").replace(/\\)/g, \"]\").replace(/\\s+/g, \",\").replace(/(and|or)/ig, \"'$1'\")\n\tformat_logic = format_logic.replace(/(\\d)+/ig, (x)->\n\t\t_f = filters[x-1]\n\t\tfield = _f.field\n\t\toption = _f.operation\n\t\tif Meteor.isClient\n\t\t\tvalue = Creator.evaluateFormula(_f.value)\n\t\telse\n\t\t\tvalue = Creator.evaluateFormula(_f.value, null, options)\n\t\tsub_selector = []\n\t\tif _.isArray(value) == true\n\t\t\tif option == \"=\"\n\t\t\t\t_.each value, (v)->\n\t\t\t\t\tsub_selector.push [field, option, v], \"or\"\n\t\t\telse if option == \"<>\"\n\t\t\t\t_.each value, (v)->\n\t\t\t\t\tsub_selector.push [field, option, v], \"and\"\n\t\t\telse\n\t\t\t\t_.each value, (v)->\n\t\t\t\t\tsub_selector.push [field, option, v], \"or\"\n\t\t\tif sub_selector[sub_selector.length - 1] == \"and\" || sub_selector[sub_selector.length - 1] == \"or\"\n\t\t\t\tsub_selector.pop()\n\t\telse\n\t\t\tsub_selector = [field, option, value]\n\t\t# console.log \"sub_selector\", sub_selector\n\t\treturn JSON.stringify(sub_selector)\n\t)\n\tformat_logic = \"[#{format_logic}]\"\n\treturn Creator.eval(format_logic)\n\nCreator.getRelatedObjects = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\trelated_object_names = []\n\t_object = Creator.getObject(object_name)\n\n\tif !_object\n\t\treturn related_object_names\n\n#\trelated_object_names = _.pluck(_object.related_objects,\"object_name\")\n\n\trelated_objects = Creator.getObjectRelateds(_object._collection_name)\n\n\trelated_object_names = _.pluck(related_objects,\"object_name\")\n\tif related_object_names?.length == 0\n\t\treturn related_object_names\n\n\tpermissions = Creator.getPermissions(object_name, spaceId, userId)\n\tunrelated_objects = permissions.unrelated_objects\n\n\trelated_object_names = _.difference related_object_names, unrelated_objects\n\treturn _.filter related_objects, (related_object)->\n\t\trelated_object_name = related_object.object_name\n\t\tisActive = related_object_names.indexOf(related_object_name) > -1\n\t\t# related_object_name = if related_object_name == \"cfs_files_filerecord\" then \"cfs.files.filerecord\" else related_object_name\n\t\tallowRead = Creator.getPermissions(related_object_name, spaceId, userId)?.allowRead\n\t\tif related_object_name == \"cms_files\"\n\t\t\tallowRead = allowRead && permissions.allowReadFiles\n\t\treturn isActive and allowRead\n\nCreator.getRelatedObjectNames = (object_name, spaceId, userId)->\n\trelated_objects = Creator.getRelatedObjects(object_name, spaceId, userId)\n\treturn _.pluck(related_objects,\"object_name\")\n\nCreator.getRelatedObjectListActions = (relatedObjectName, spaceId, userId)->\n\tactions = Creator.getActions(relatedObjectName, spaceId, userId)\n\tactions = _.filter actions, (action)->\n\t\tif action.name == \"standard_follow\"\n\t\t\treturn false\n\t\tif action.name == \"standard_query\"\n\t\t\treturn false\n\t\tif action.on == \"list\"\n\t\t\tif typeof action.visible == \"function\"\n\t\t\t\treturn action.visible()\n\t\t\telse\n\t\t\t\treturn action.visible\n\t\telse\n\t\t\treturn false\n\treturn actions\n\nCreator.getActions = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\tobj = Creator.getObject(object_name)\n\n\tif !obj\n\t\treturn\n\n\tpermissions = Creator.getPermissions(object_name, spaceId, userId)\n\tdisabled_actions = permissions.disabled_actions\n\tactions = _.sortBy(_.values(obj.actions) , 'sort');\n\n\tif _.has(obj, 'allow_customActions')\n\t\tactions = _.filter actions, (action)->\n\t\t\treturn _.include(obj.allow_customActions, action.name) || _.include(_.keys(Creator.getObject('base').actions) || {}, action.name)\n\tif _.has(obj, 'exclude_actions')\n\t\tactions = _.filter actions, (action)->\n\t\t\treturn !_.include(obj.exclude_actions, action.name)\n\n\t_.each actions, (action)->\n\t\t# 手机上只显示编辑按钮,其他的放到折叠下拉菜单中\n\t\tif Steedos.isMobile() && [\"record\", \"record_only\"].indexOf(action.on) > -1 && action.name != 'standard_edit'\n\t\t\tif action.on == \"record_only\"\n\t\t\t\taction.on = 'record_only_more'\n\t\t\telse\n\t\t\t\taction.on = 'record_more'\n\n\tif Steedos.isMobile() && [\"cms_files\", \"cfs.files.filerecord\"].indexOf(object_name) > -1\n\t\t# 附件特殊处理,下载按钮放在主菜单,编辑按钮放到底下折叠下拉菜单中\n\t\tactions.find((n)-> return n.name == \"standard_edit\")?.on = \"record_more\"\n\t\tactions.find((n)-> return n.name == \"download\")?.on = \"record\"\n\n\tactions = _.filter actions, (action)->\n\t\treturn _.indexOf(disabled_actions, action.name) < 0\n\n\treturn actions\n\n///\n\t返回当前用户有权限访问的所有list_view,包括分享的,用户自定义非分享的(除非owner变了),以及默认的其他视图\n\t注意Creator.getPermissions函数中是不会有用户自定义非分享的视图的,所以Creator.getPermissions函数中拿到的结果不全,并不是当前用户能看到所有视图\n///\nCreator.getListViews = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\t\n\tunless object_name\n\t\treturn\n\n\tobject = Creator.getObject(object_name)\n\n\tif !object\n\t\treturn\n\n\tdisabled_list_views = Creator.getPermissions(object_name, spaceId, userId)?.disabled_list_views || []\n\n\tlist_views = []\n\n\tisMobile = Steedos.isMobile()\n\n\t_.each object.list_views, (item, item_name)->\n\t\titem.name = item_name\n\n\tlistViews = _.sortBy(_.values(object.list_views) , 'sort_no');\n\n\t_.each listViews, (item)->\n\t\tif isMobile and item.type == \"calendar\"\n\t\t\t# 手机上先不显示日历视图\n\t\t\treturn\n\t\tif item.name != \"default\"\n\t\t\tisDisabled = _.indexOf(disabled_list_views, item.name) > -1 || (item._id && _.indexOf(disabled_list_views, item._id) > -1)\n\t\t\tif !isDisabled || item.owner == userId\n\t\t\t\tlist_views.push item\n\treturn list_views\n\n# 前台理论上不应该调用该函数,因为字段的权限都在Creator.getObject(object_name).fields的相关属性中有标识了\nCreator.getFields = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\tfieldsName = Creator.getObjectFieldsName(object_name)\n\tunreadable_fields = Creator.getPermissions(object_name, spaceId, userId)?.unreadable_fields\n\treturn _.difference(fieldsName, unreadable_fields)\n\nCreator.isloading = ()->\n\treturn !Creator.bootstrapLoaded.get()\n\nCreator.convertSpecialCharacter = (str)->\n\treturn str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\")\n\n# 计算fields相关函数\n# START\nCreator.getDisabledFields = (schema)->\n\tfields = _.map(schema, (field, fieldName) ->\n\t\treturn field.autoform and field.autoform.disabled and !field.autoform.omit and fieldName\n\t)\n\tfields = _.compact(fields)\n\treturn fields\n\nCreator.getHiddenFields = (schema)->\n\tfields = _.map(schema, (field, fieldName) ->\n\t\treturn field.autoform and field.autoform.type == \"hidden\" and !field.autoform.omit and fieldName\n\t)\n\tfields = _.compact(fields)\n\treturn fields\n\nCreator.getFieldsWithNoGroup = (schema)->\n\tfields = _.map(schema, (field, fieldName) ->\n\t\treturn (!field.autoform or !field.autoform.group or field.autoform.group == \"-\") and (!field.autoform or field.autoform.type != \"hidden\") and fieldName\n\t)\n\tfields = _.compact(fields)\n\treturn fields\n\nCreator.getSortedFieldGroupNames = (schema)->\n\tnames = _.map(schema, (field) ->\n \t\treturn field.autoform and field.autoform.group != \"-\" and field.autoform.group\n\t)\n\tnames = _.compact(names)\n\tnames = _.unique(names)\n\treturn names\n\nCreator.getFieldsForGroup = (schema, groupName) ->\n \tfields = _.map(schema, (field, fieldName) ->\n \treturn field.autoform and field.autoform.group == groupName and field.autoform.type != \"hidden\" and fieldName\n \t)\n \tfields = _.compact(fields)\n \treturn fields\n\nCreator.getSystemBaseFields = () ->\n\treturn [\"created\", \"created_by\", \"modified\", \"modified_by\"]\n\nCreator.getFieldsWithoutSystemBase = (keys) ->\n\treturn _.difference(keys, Creator.getSystemBaseFields());\n\nCreator.getFieldsWithoutOmit = (schema, keys) ->\n\tkeys = _.map(keys, (key) ->\n\t\tfield = _.pick(schema, key)\n\t\tif field[key].autoform?.omit\n\t\t\treturn false\n\t\telse\n\t\t\treturn key\n\t)\n\tkeys = _.compact(keys)\n\treturn keys\n\nCreator.getFieldsInFirstLevel = (firstLevelKeys, keys) ->\n\tkeys = _.map(keys, (key) ->\n\t\tif _.indexOf(firstLevelKeys, key) > -1\n\t\t\treturn key\n\t\telse\n\t\t\treturn false\n\t)\n\tkeys = _.compact(keys)\n\treturn keys\n\nCreator.getFieldsForReorder = (schema, keys, isSingle) ->\n\tfields = []\n\ti = 0\n\t_keys = _.filter(keys, (key)->\n\t\treturn !key.endsWith('_endLine')\n\t);\n\twhile i < _keys.length\n\t\tsc_1 = _.pick(schema, _keys[i])\n\t\tsc_2 = _.pick(schema, _keys[i+1])\n\n\t\tis_wide_1 = false\n\t\tis_wide_2 = false\n\n#\t\tis_range_1 = false\n#\t\tis_range_2 = false\n\n\t\t_.each sc_1, (value) ->\n\t\t\tif value.autoform?.is_wide || value.autoform?.type == \"table\"\n\t\t\t\tis_wide_1 = true\n\n#\t\t\tif value.autoform?.is_range\n#\t\t\t\tis_range_1 = true\n\n\t\t_.each sc_2, (value) ->\n\t\t\tif value.autoform?.is_wide || value.autoform?.type == \"table\"\n\t\t\t\tis_wide_2 = true\n\n#\t\t\tif value.autoform?.is_range\n#\t\t\t\tis_range_2 = true\n\n\t\tif Steedos.isMobile()\n\t\t\tis_wide_1 = true\n\t\t\tis_wide_2 = true\n\n\t\tif isSingle\n\t\t\tfields.push _keys.slice(i, i+1)\n\t\t\ti += 1\n\t\telse\n#\t\t\tif !is_range_1 && is_range_2\n#\t\t\t\tchildKeys = _keys.slice(i, i+1)\n#\t\t\t\tchildKeys.push undefined\n#\t\t\t\tfields.push childKeys\n#\t\t\t\ti += 1\n#\t\t\telse\n\t\t\tif is_wide_1\n\t\t\t\tfields.push _keys.slice(i, i+1)\n\t\t\t\ti += 1\n\t\t\telse if !is_wide_1 and is_wide_2\n\t\t\t\tchildKeys = _keys.slice(i, i+1)\n\t\t\t\tchildKeys.push undefined\n\t\t\t\tfields.push childKeys\n\t\t\t\ti += 1\n\t\t\telse if !is_wide_1 and !is_wide_2\n\t\t\t\tchildKeys = _keys.slice(i, i+1)\n\t\t\t\tif _keys[i+1]\n\t\t\t\t\tchildKeys.push _keys[i+1]\n\t\t\t\telse\n\t\t\t\t\tchildKeys.push undefined\n\t\t\t\tfields.push childKeys\n\t\t\t\ti += 2\n\n\treturn fields\n\nCreator.isFilterValueEmpty = (v) ->\n\treturn typeof v == \"undefined\" || v == null || Number.isNaN(v) || v.length == 0\n\nCreator.getFieldDataType = (objectFields, key)->\n\tif objectFields and key\n\t\tresult = objectFields[key]?.type\n\t\tif [\"formula\", \"summary\"].indexOf(result) > -1\n\t\t\tresult = objectFields[key].data_type\n\t\t# else if result == \"select\" and objectFields[key]?.data_type and objectFields[key].data_type != \"text\"\n\t\t# \tresult = objectFields[key].data_type\n\t\treturn result\n\telse\n\t\treturn \"text\"\n\n# END\n\nif Meteor.isServer\n\tCreator.getAllRelatedObjects = (object_name)->\n\t\trelated_object_names = []\n\t\t_.each Creator.Objects, (related_object, related_object_name)->\n\t\t\t_.each related_object.fields, (related_field, related_field_name)->\n\t\t\t\tif related_field.type == \"master_detail\" and related_field.reference_to and related_field.reference_to == object_name\n\t\t\t\t\trelated_object_names.push related_object_name\n\n\t\tif Creator.getObject(object_name).enable_files\n\t\t\trelated_object_names.push \"cms_files\"\n\n\t\treturn related_object_names\n\nif Meteor.isServer\n\tSteedos.formatIndex = (array) ->\n\t\tobject = {\n \tbackground: true\n \t};\n\t\tisdocumentDB = Meteor.settings?.datasources?.default?.documentDB || false;\n\t\tif isdocumentDB\n\t\t\tif array.length > 0\n\t\t\t\tindexName = array.join(\".\");\n\t\t\t\tobject.name = indexName;\n\t\t\t\t\n\t\t\t\tif (indexName.length > 52)\n\t\t\t\t\tobject.name = indexName.substring(0,52);\n\n\t\treturn object;","Creator.getSchema = function(object_name) {\n var ref;\n return (ref = Creator.getObject(object_name)) != null ? ref.schema : void 0;\n};\n\nCreator.getObjectHomeComponent = function(object_name) {\n return false;\n};\n\nCreator.getObjectUrl = function(object_name, record_id, app_id) {\n var list_view, list_view_id;\n if (!app_id) {\n app_id = Session.get(\"app_id\");\n }\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n list_view = Creator.getListView(object_name, null);\n list_view_id = list_view != null ? list_view._id : void 0;\n if (record_id) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id);\n } else {\n if (Creator.getObjectHomeComponent(object_name)) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name);\n } else {\n if (list_view_id) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id);\n } else {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name);\n }\n }\n }\n};\n\nCreator.getObjectAbsoluteUrl = function(object_name, record_id, app_id) {\n var list_view, list_view_id;\n if (!app_id) {\n app_id = Session.get(\"app_id\");\n }\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n list_view = Creator.getListView(object_name, null);\n list_view_id = list_view != null ? list_view._id : void 0;\n if (record_id) {\n return Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id, true);\n } else {\n return Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id, true);\n }\n};\n\nCreator.getObjectRouterUrl = function(object_name, record_id, app_id) {\n var list_view, list_view_id;\n if (!app_id) {\n app_id = Session.get(\"app_id\");\n }\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n list_view = Creator.getListView(object_name, null);\n list_view_id = list_view != null ? list_view._id : void 0;\n if (record_id) {\n return \"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id;\n } else {\n return \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id;\n }\n};\n\nCreator.getListViewUrl = function(object_name, app_id, list_view_id) {\n var url;\n url = Creator.getListViewRelativeUrl(object_name, app_id, list_view_id);\n return Creator.getRelativeUrl(url);\n};\n\nCreator.getListViewRelativeUrl = function(object_name, app_id, list_view_id) {\n return \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id;\n};\n\nCreator.getSwitchListUrl = function(object_name, app_id, list_view_id) {\n if (list_view_id) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + list_view_id + \"/list\");\n } else {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/list/switch\");\n }\n};\n\nCreator.getRelatedObjectUrl = function(object_name, app_id, record_id, related_object_name, related_field_name) {\n if (related_field_name) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid?related_field_name=\" + related_field_name);\n } else {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid\");\n }\n};\n\nCreator.getObjectLookupFieldOptions = function(object_name, is_deep, is_skip_hide, is_related) {\n var _object, _options, fields, icon, relatedObjects;\n _options = [];\n if (!object_name) {\n return _options;\n }\n _object = Creator.getObject(object_name);\n fields = _object != null ? _object.fields : void 0;\n icon = _object != null ? _object.icon : void 0;\n _.forEach(fields, function(f, k) {\n if (is_skip_hide && f.hidden) {\n return;\n }\n if (f.type === \"select\") {\n return _options.push({\n label: \"\" + (f.label || k),\n value: \"\" + k,\n icon: icon\n });\n } else {\n return _options.push({\n label: f.label || k,\n value: k,\n icon: icon\n });\n }\n });\n if (is_deep) {\n _.forEach(fields, function(f, k) {\n var r_object;\n if (is_skip_hide && f.hidden) {\n return;\n }\n if ((f.type === \"lookup\" || f.type === \"master_detail\") && f.reference_to && _.isString(f.reference_to)) {\n r_object = Creator.getObject(f.reference_to);\n if (r_object) {\n return _.forEach(r_object.fields, function(f2, k2) {\n return _options.push({\n label: (f.label || k) + \"=>\" + (f2.label || k2),\n value: k + \".\" + k2,\n icon: r_object != null ? r_object.icon : void 0\n });\n });\n }\n }\n });\n }\n if (is_related) {\n relatedObjects = Creator.getRelatedObjects(object_name);\n _.each(relatedObjects, (function(_this) {\n return function(_relatedObject) {\n var relatedObject, relatedOptions;\n relatedOptions = Creator.getObjectLookupFieldOptions(_relatedObject.object_name, false, false, false);\n relatedObject = Creator.getObject(_relatedObject.object_name);\n return _.each(relatedOptions, function(relatedOption) {\n if (_relatedObject.foreign_key !== relatedOption.value) {\n return _options.push({\n label: (relatedObject.label || relatedObject.name) + \"=>\" + relatedOption.label,\n value: relatedObject.name + \".\" + relatedOption.value,\n icon: relatedObject != null ? relatedObject.icon : void 0\n });\n }\n });\n };\n })(this));\n }\n return _options;\n};\n\nCreator.getObjectFilterFieldOptions = function(object_name) {\n var _object, _options, fields, icon, permission_fields;\n _options = [];\n if (!object_name) {\n return _options;\n }\n _object = Creator.getObject(object_name);\n fields = _object != null ? _object.fields : void 0;\n permission_fields = Creator.getFields(object_name);\n icon = _object != null ? _object.icon : void 0;\n _.forEach(fields, function(f, k) {\n if (!_.include([\"grid\", \"object\", \"[Object]\", \"[object]\", \"Object\", \"avatar\", \"image\", \"markdown\", \"html\"], f.type) && !f.hidden) {\n if (!/\\w+\\./.test(k) && _.indexOf(permission_fields, k) > -1) {\n return _options.push({\n label: f.label || k,\n value: k,\n icon: icon\n });\n }\n }\n });\n return _options;\n};\n\nCreator.getObjectFieldOptions = function(object_name) {\n var _object, _options, fields, icon, permission_fields;\n _options = [];\n if (!object_name) {\n return _options;\n }\n _object = Creator.getObject(object_name);\n fields = _object != null ? _object.fields : void 0;\n permission_fields = Creator.getFields(object_name);\n icon = _object != null ? _object.icon : void 0;\n _.forEach(fields, function(f, k) {\n if (!_.include([\"grid\", \"object\", \"[Object]\", \"[object]\", \"Object\", \"markdown\", \"html\"], f.type)) {\n if (!/\\w+\\./.test(k) && _.indexOf(permission_fields, k) > -1) {\n return _options.push({\n label: f.label || k,\n value: k,\n icon: icon\n });\n }\n }\n });\n return _options;\n};\n\n\n/*\nfilters: 要转换的filters\nfields: 对象字段\nfilter_fields: 默认过滤字段,支持字符串数组和对象数组两种格式,如:['filed_name1','filed_name2'],[{field:'filed_name1',required:true}]\n处理逻辑: 把filters中存在于filter_fields的过滤条件增加每项的is_default、is_required属性,不存在于filter_fields的过滤条件对应的移除每项的相关属性\n返回结果: 处理后的filters\n */\n\nCreator.getFiltersWithFilterFields = function(filters, fields, filter_fields) {\n if (!filters) {\n filters = [];\n }\n if (!filter_fields) {\n filter_fields = [];\n }\n if (filter_fields != null ? filter_fields.length : void 0) {\n filter_fields.forEach(function(n) {\n if (_.isString(n)) {\n n = {\n field: n,\n required: false\n };\n }\n if (fields[n.field] && !_.findWhere(filters, {\n field: n.field\n })) {\n return filters.push({\n field: n.field,\n is_default: true,\n is_required: n.required\n });\n }\n });\n }\n filters.forEach(function(filterItem) {\n var matchField;\n matchField = filter_fields.find(function(n) {\n return n === filterItem.field || n.field === filterItem.field;\n });\n if (_.isString(matchField)) {\n matchField = {\n field: matchField,\n required: false\n };\n }\n if (matchField) {\n filterItem.is_default = true;\n return filterItem.is_required = matchField.required;\n } else {\n delete filterItem.is_default;\n return delete filterItem.is_required;\n }\n });\n return filters;\n};\n\nCreator.getObjectRecord = function(object_name, record_id, select_fields, expand) {\n var collection, obj, record, ref, ref1, ref2;\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!record_id) {\n record_id = Session.get(\"record_id\");\n }\n if (Meteor.isClient) {\n if (object_name === Session.get(\"object_name\") && record_id === Session.get(\"record_id\")) {\n if ((ref = Template.instance()) != null ? ref.record : void 0) {\n return (ref1 = Template.instance()) != null ? (ref2 = ref1.record) != null ? ref2.get() : void 0 : void 0;\n }\n } else {\n return Creator.odata.get(object_name, record_id, select_fields, expand);\n }\n }\n obj = Creator.getObject(object_name);\n if (obj.database_name === \"meteor\" || !obj.database_name) {\n collection = Creator.getCollection(object_name);\n if (collection) {\n record = collection.findOne(record_id);\n return record;\n }\n } else if (object_name && record_id) {\n return Creator.odata.get(object_name, record_id, select_fields, expand);\n }\n};\n\nCreator.getObjectRecordName = function(record, object_name) {\n var name_field_key, ref;\n if (!record) {\n record = Creator.getObjectRecord();\n }\n if (record) {\n name_field_key = object_name === \"organizations\" ? \"name\" : (ref = Creator.getObject(object_name)) != null ? ref.NAME_FIELD_KEY : void 0;\n if (record && name_field_key) {\n return record.label || record[name_field_key];\n }\n }\n};\n\nCreator.getApp = function(app_id) {\n var appMenus, currentApp;\n appMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n if (!appMenus) {\n return {};\n }\n currentApp = appMenus.find(function(menuItem) {\n return menuItem.id === app_id;\n });\n return currentApp;\n};\n\nCreator.getAppDashboard = function(app_id) {\n var app, dashboard;\n app = Creator.getApp(app_id);\n if (!app) {\n return;\n }\n dashboard = null;\n _.each(Creator.Dashboards, function(v, k) {\n var ref;\n if (((ref = v.apps) != null ? ref.indexOf(app._id) : void 0) > -1) {\n return dashboard = v;\n }\n });\n return dashboard;\n};\n\nCreator.getAppDashboardComponent = function(app_id) {\n var app;\n app = Creator.getApp(app_id);\n if (!app || true) {\n\n }\n};\n\nCreator.getAppObjectNames = function(app_id) {\n var app, appObjects, isMobile, objects;\n app = Creator.getApp(app_id);\n if (!app) {\n return;\n }\n isMobile = Steedos.isMobile();\n appObjects = isMobile ? app.mobile_objects : app.objects;\n objects = [];\n if (app) {\n _.each(appObjects, function(v) {\n var obj;\n obj = Creator.getObject(v);\n if (obj != null ? obj.permissions.get().allowRead : void 0) {\n return objects.push(v);\n }\n });\n }\n return objects;\n};\n\nCreator.getUrlWithToken = function(url, expressionFormData) {\n var hasQuerySymbol, linkStr, params;\n params = {};\n params[\"X-Space-Id\"] = Steedos.spaceId();\n params[\"X-User-Id\"] = Steedos.userId();\n params[\"X-Company-Ids\"] = Steedos.getUserCompanyIds();\n params[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n if (Steedos.isExpression(url)) {\n url = Steedos.parseSingleExpression(url, expressionFormData, \"#\", Creator.USER_CONTEXT);\n }\n hasQuerySymbol = /(\\#.+\\?)|(\\?[^#]*$)/g.test(url);\n linkStr = hasQuerySymbol ? \"&\" : \"?\";\n return \"\" + url + linkStr + ($.param(params));\n};\n\nCreator.getAppMenu = function(app_id, menu_id) {\n var menus;\n menus = Creator.getAppMenus(app_id);\n return menus && menus.find(function(menu) {\n return menu.id === menu_id;\n });\n};\n\nCreator.getAppMenuUrlForInternet = function(menu) {\n return Creator.getUrlWithToken(menu.path, menu);\n};\n\nCreator.getAppMenuUrl = function(menu) {\n var url;\n url = menu.path;\n if (menu.type === \"url\") {\n if (menu.target) {\n return Creator.getAppMenuUrlForInternet(menu);\n } else {\n return \"/app/-/tab_iframe/\" + menu.id;\n }\n } else {\n return menu.path;\n }\n};\n\nCreator.getAppMenus = function(app_id) {\n var appMenus, curentAppMenus;\n appMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n if (!appMenus) {\n return [];\n }\n curentAppMenus = appMenus.find(function(menuItem) {\n return menuItem.id === app_id;\n });\n if (curentAppMenus) {\n return curentAppMenus.children;\n }\n};\n\nCreator.loadAppsMenus = function() {\n var data, isMobile, options;\n isMobile = Steedos.isMobile();\n data = {};\n if (isMobile) {\n data.mobile = isMobile;\n }\n options = {\n type: 'get',\n data: data,\n success: function(data) {\n return Session.set(\"app_menus\", data);\n }\n };\n return typeof Steedos !== \"undefined\" && Steedos !== null ? Steedos.authRequest(\"/service/api/apps/menus\", options) : void 0;\n};\n\nCreator.creatorAppsSelector = function(apps, assigned_apps) {\n var adminApp, creatorApps, sortedApps;\n adminApp = void 0;\n sortedApps = void 0;\n _.each(apps, function(app, key) {\n if (!app._id) {\n app._id = key;\n }\n if (app.is_creator) {\n\n } else {\n app.visible = false;\n }\n });\n sortedApps = _.sortBy(_.values(apps), 'sort');\n creatorApps = {};\n adminApp = {};\n _.each(sortedApps, function(n) {\n if (n._id === 'admin') {\n return adminApp = n;\n } else {\n return creatorApps[n._id] = n;\n }\n });\n creatorApps.admin = adminApp;\n if (assigned_apps.length) {\n _.each(creatorApps, function(app, key) {\n if (assigned_apps.indexOf(key) > -1) {\n app.visible = app.is_creator;\n } else {\n app.visible = false;\n }\n });\n }\n return creatorApps;\n};\n\nCreator.visibleAppsSelector = function(creatorApps, includeAdmin) {\n var apps;\n if (includeAdmin == null) {\n includeAdmin = true;\n }\n apps = [];\n _.each(creatorApps, function(v, k) {\n if (v.visible !== false && v._id !== 'admin' || includeAdmin && v._id === 'admin') {\n apps.push(v);\n }\n });\n return apps;\n};\n\nCreator.getVisibleApps = function(includeAdmin) {\n var changeApp, creatorApps;\n changeApp = Creator._subApp.get();\n creatorApps = Object.assign({}, Creator.Apps, {\n apps: changeApp\n });\n return Creator.visibleAppsSelector(creatorApps, includeAdmin);\n};\n\nCreator.getVisibleAppsObjects = function() {\n var apps, objects, visibleObjectNames;\n apps = Creator.getVisibleApps();\n visibleObjectNames = _.flatten(_.pluck(apps, 'objects'));\n objects = _.filter(Creator.Objects, function(obj) {\n if (visibleObjectNames.indexOf(obj.name) < 0) {\n return false;\n } else {\n return true;\n }\n });\n objects = objects.sort(Creator.sortingMethod.bind({\n key: \"label\"\n }));\n objects = _.pluck(objects, 'name');\n return _.uniq(objects);\n};\n\nCreator.getAppsObjects = function() {\n var objects, tempObjects;\n objects = [];\n tempObjects = [];\n _.forEach(Creator.Apps, function(app) {\n tempObjects = _.filter(app.objects, function(obj) {\n return !obj.hidden;\n });\n return objects = objects.concat(tempObjects);\n });\n return _.uniq(objects);\n};\n\nCreator.validateFilters = function(filters, logic) {\n var e, errorMsg, filter_items, filter_length, flag, index, word;\n filter_items = _.map(filters, function(obj) {\n if (_.isEmpty(obj)) {\n return false;\n } else {\n return obj;\n }\n });\n filter_items = _.compact(filter_items);\n errorMsg = \"\";\n filter_length = filter_items.length;\n if (logic) {\n logic = logic.replace(/\\n/g, \"\").replace(/\\s+/g, \" \");\n if (/[._\\-!+]+/ig.test(logic)) {\n errorMsg = \"含有特殊字符。\";\n }\n if (!errorMsg) {\n index = logic.match(/\\d+/ig);\n if (!index) {\n errorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\";\n } else {\n index.forEach(function(i) {\n if (i < 1 || i > filter_length) {\n return errorMsg = \"您的筛选条件引用了未定义的筛选器:\" + i + \"。\";\n }\n });\n flag = 1;\n while (flag <= filter_length) {\n if (!index.includes(\"\" + flag)) {\n errorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\";\n }\n flag++;\n }\n }\n }\n if (!errorMsg) {\n word = logic.match(/[a-zA-Z]+/ig);\n if (word) {\n word.forEach(function(w) {\n if (!/^(and|or)$/ig.test(w)) {\n return errorMsg = \"检查您的高级筛选条件中的拼写。\";\n }\n });\n }\n }\n if (!errorMsg) {\n try {\n Creator[\"eval\"](logic.replace(/and/ig, \"&&\").replace(/or/ig, \"||\"));\n } catch (error) {\n e = error;\n errorMsg = \"您的筛选器中含有特殊字符\";\n }\n if (/(AND)[^()]+(OR)/ig.test(logic) || /(OR)[^()]+(AND)/ig.test(logic)) {\n errorMsg = \"您的筛选器必须在连续性的 AND 和 OR 表达式前后使用括号。\";\n }\n }\n }\n if (errorMsg) {\n console.log(\"error\", errorMsg);\n if (Meteor.isClient) {\n toastr.error(errorMsg);\n }\n return false;\n } else {\n return true;\n }\n};\n\n\n/*\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n */\n\nCreator.formatFiltersToMongo = function(filters, options) {\n var selector;\n if (!(filters != null ? filters.length : void 0)) {\n return;\n }\n if (!(filters[0] instanceof Array)) {\n filters = _.map(filters, function(obj) {\n return [obj.field, obj.operation, obj.value];\n });\n }\n selector = [];\n _.each(filters, function(filter) {\n var field, option, reg, sub_selector, value;\n field = filter[0];\n option = filter[1];\n if (Meteor.isClient) {\n value = Creator.evaluateFormula(filter[2]);\n } else {\n value = Creator.evaluateFormula(filter[2], null, options);\n }\n sub_selector = {};\n sub_selector[field] = {};\n if (option === \"=\") {\n sub_selector[field][\"$eq\"] = value;\n } else if (option === \"<>\") {\n sub_selector[field][\"$ne\"] = value;\n } else if (option === \">\") {\n sub_selector[field][\"$gt\"] = value;\n } else if (option === \">=\") {\n sub_selector[field][\"$gte\"] = value;\n } else if (option === \"<\") {\n sub_selector[field][\"$lt\"] = value;\n } else if (option === \"<=\") {\n sub_selector[field][\"$lte\"] = value;\n } else if (option === \"startswith\") {\n reg = new RegExp(\"^\" + value, \"i\");\n sub_selector[field][\"$regex\"] = reg;\n } else if (option === \"contains\") {\n reg = new RegExp(value, \"i\");\n sub_selector[field][\"$regex\"] = reg;\n } else if (option === \"notcontains\") {\n reg = new RegExp(\"^((?!\" + value + \").)*$\", \"i\");\n sub_selector[field][\"$regex\"] = reg;\n }\n return selector.push(sub_selector);\n });\n return selector;\n};\n\nCreator.isBetweenFilterOperation = function(operation) {\n var ref;\n return operation === \"between\" || !!((ref = Creator.getBetweenTimeBuiltinValues(true)) != null ? ref[operation] : void 0);\n};\n\n\n/*\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\n\textend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n */\n\nCreator.formatFiltersToDev = function(filters, object_name, options) {\n var logicTempFilters, selector;\n if (!filters.length) {\n return;\n }\n if (options != null ? options.is_logic_or : void 0) {\n logicTempFilters = [];\n filters.forEach(function(n) {\n logicTempFilters.push(n);\n return logicTempFilters.push(\"or\");\n });\n logicTempFilters.pop();\n filters = logicTempFilters;\n }\n selector = SteedosFilters.formatFiltersToDev(filters, Creator.USER_CONTEXT);\n return selector;\n};\n\n\n/*\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n */\n\nCreator.formatLogicFiltersToDev = function(filters, filter_logic, options) {\n var format_logic;\n format_logic = filter_logic.replace(/\\(\\s+/ig, \"(\").replace(/\\s+\\)/ig, \")\").replace(/\\(/g, \"[\").replace(/\\)/g, \"]\").replace(/\\s+/g, \",\").replace(/(and|or)/ig, \"'$1'\");\n format_logic = format_logic.replace(/(\\d)+/ig, function(x) {\n var _f, field, option, sub_selector, value;\n _f = filters[x - 1];\n field = _f.field;\n option = _f.operation;\n if (Meteor.isClient) {\n value = Creator.evaluateFormula(_f.value);\n } else {\n value = Creator.evaluateFormula(_f.value, null, options);\n }\n sub_selector = [];\n if (_.isArray(value) === true) {\n if (option === \"=\") {\n _.each(value, function(v) {\n return sub_selector.push([field, option, v], \"or\");\n });\n } else if (option === \"<>\") {\n _.each(value, function(v) {\n return sub_selector.push([field, option, v], \"and\");\n });\n } else {\n _.each(value, function(v) {\n return sub_selector.push([field, option, v], \"or\");\n });\n }\n if (sub_selector[sub_selector.length - 1] === \"and\" || sub_selector[sub_selector.length - 1] === \"or\") {\n sub_selector.pop();\n }\n } else {\n sub_selector = [field, option, value];\n }\n return JSON.stringify(sub_selector);\n });\n format_logic = \"[\" + format_logic + \"]\";\n return Creator[\"eval\"](format_logic);\n};\n\nCreator.getRelatedObjects = function(object_name, spaceId, userId) {\n var _object, permissions, related_object_names, related_objects, unrelated_objects;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n related_object_names = [];\n _object = Creator.getObject(object_name);\n if (!_object) {\n return related_object_names;\n }\n related_objects = Creator.getObjectRelateds(_object._collection_name);\n related_object_names = _.pluck(related_objects, \"object_name\");\n if ((related_object_names != null ? related_object_names.length : void 0) === 0) {\n return related_object_names;\n }\n permissions = Creator.getPermissions(object_name, spaceId, userId);\n unrelated_objects = permissions.unrelated_objects;\n related_object_names = _.difference(related_object_names, unrelated_objects);\n return _.filter(related_objects, function(related_object) {\n var allowRead, isActive, ref, related_object_name;\n related_object_name = related_object.object_name;\n isActive = related_object_names.indexOf(related_object_name) > -1;\n allowRead = (ref = Creator.getPermissions(related_object_name, spaceId, userId)) != null ? ref.allowRead : void 0;\n if (related_object_name === \"cms_files\") {\n allowRead = allowRead && permissions.allowReadFiles;\n }\n return isActive && allowRead;\n });\n};\n\nCreator.getRelatedObjectNames = function(object_name, spaceId, userId) {\n var related_objects;\n related_objects = Creator.getRelatedObjects(object_name, spaceId, userId);\n return _.pluck(related_objects, \"object_name\");\n};\n\nCreator.getRelatedObjectListActions = function(relatedObjectName, spaceId, userId) {\n var actions;\n actions = Creator.getActions(relatedObjectName, spaceId, userId);\n actions = _.filter(actions, function(action) {\n if (action.name === \"standard_follow\") {\n return false;\n }\n if (action.name === \"standard_query\") {\n return false;\n }\n if (action.on === \"list\") {\n if (typeof action.visible === \"function\") {\n return action.visible();\n } else {\n return action.visible;\n }\n } else {\n return false;\n }\n });\n return actions;\n};\n\nCreator.getActions = function(object_name, spaceId, userId) {\n var actions, disabled_actions, obj, permissions, ref, ref1;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n obj = Creator.getObject(object_name);\n if (!obj) {\n return;\n }\n permissions = Creator.getPermissions(object_name, spaceId, userId);\n disabled_actions = permissions.disabled_actions;\n actions = _.sortBy(_.values(obj.actions), 'sort');\n if (_.has(obj, 'allow_customActions')) {\n actions = _.filter(actions, function(action) {\n return _.include(obj.allow_customActions, action.name) || _.include(_.keys(Creator.getObject('base').actions) || {}, action.name);\n });\n }\n if (_.has(obj, 'exclude_actions')) {\n actions = _.filter(actions, function(action) {\n return !_.include(obj.exclude_actions, action.name);\n });\n }\n _.each(actions, function(action) {\n if (Steedos.isMobile() && [\"record\", \"record_only\"].indexOf(action.on) > -1 && action.name !== 'standard_edit') {\n if (action.on === \"record_only\") {\n return action.on = 'record_only_more';\n } else {\n return action.on = 'record_more';\n }\n }\n });\n if (Steedos.isMobile() && [\"cms_files\", \"cfs.files.filerecord\"].indexOf(object_name) > -1) {\n if ((ref = actions.find(function(n) {\n return n.name === \"standard_edit\";\n })) != null) {\n ref.on = \"record_more\";\n }\n if ((ref1 = actions.find(function(n) {\n return n.name === \"download\";\n })) != null) {\n ref1.on = \"record\";\n }\n }\n actions = _.filter(actions, function(action) {\n return _.indexOf(disabled_actions, action.name) < 0;\n });\n return actions;\n};\n\n/返回当前用户有权限访问的所有list_view,包括分享的,用户自定义非分享的(除非owner变了),以及默认的其他视图注意Creator.getPermissions函数中是不会有用户自定义非分享的视图的,所以Creator.getPermissions函数中拿到的结果不全,并不是当前用户能看到所有视图/;\n\nCreator.getListViews = function(object_name, spaceId, userId) {\n var disabled_list_views, isMobile, listViews, list_views, object, ref;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n if (!object_name) {\n return;\n }\n object = Creator.getObject(object_name);\n if (!object) {\n return;\n }\n disabled_list_views = ((ref = Creator.getPermissions(object_name, spaceId, userId)) != null ? ref.disabled_list_views : void 0) || [];\n list_views = [];\n isMobile = Steedos.isMobile();\n _.each(object.list_views, function(item, item_name) {\n return item.name = item_name;\n });\n listViews = _.sortBy(_.values(object.list_views), 'sort_no');\n _.each(listViews, function(item) {\n var isDisabled;\n if (isMobile && item.type === \"calendar\") {\n return;\n }\n if (item.name !== \"default\") {\n isDisabled = _.indexOf(disabled_list_views, item.name) > -1 || (item._id && _.indexOf(disabled_list_views, item._id) > -1);\n if (!isDisabled || item.owner === userId) {\n return list_views.push(item);\n }\n }\n });\n return list_views;\n};\n\nCreator.getFields = function(object_name, spaceId, userId) {\n var fieldsName, ref, unreadable_fields;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n fieldsName = Creator.getObjectFieldsName(object_name);\n unreadable_fields = (ref = Creator.getPermissions(object_name, spaceId, userId)) != null ? ref.unreadable_fields : void 0;\n return _.difference(fieldsName, unreadable_fields);\n};\n\nCreator.isloading = function() {\n return !Creator.bootstrapLoaded.get();\n};\n\nCreator.convertSpecialCharacter = function(str) {\n return str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\");\n};\n\nCreator.getDisabledFields = function(schema) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return field.autoform && field.autoform.disabled && !field.autoform.omit && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getHiddenFields = function(schema) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return field.autoform && field.autoform.type === \"hidden\" && !field.autoform.omit && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getFieldsWithNoGroup = function(schema) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return (!field.autoform || !field.autoform.group || field.autoform.group === \"-\") && (!field.autoform || field.autoform.type !== \"hidden\") && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getSortedFieldGroupNames = function(schema) {\n var names;\n names = _.map(schema, function(field) {\n return field.autoform && field.autoform.group !== \"-\" && field.autoform.group;\n });\n names = _.compact(names);\n names = _.unique(names);\n return names;\n};\n\nCreator.getFieldsForGroup = function(schema, groupName) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return field.autoform && field.autoform.group === groupName && field.autoform.type !== \"hidden\" && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getSystemBaseFields = function() {\n return [\"created\", \"created_by\", \"modified\", \"modified_by\"];\n};\n\nCreator.getFieldsWithoutSystemBase = function(keys) {\n return _.difference(keys, Creator.getSystemBaseFields());\n};\n\nCreator.getFieldsWithoutOmit = function(schema, keys) {\n keys = _.map(keys, function(key) {\n var field, ref;\n field = _.pick(schema, key);\n if ((ref = field[key].autoform) != null ? ref.omit : void 0) {\n return false;\n } else {\n return key;\n }\n });\n keys = _.compact(keys);\n return keys;\n};\n\nCreator.getFieldsInFirstLevel = function(firstLevelKeys, keys) {\n keys = _.map(keys, function(key) {\n if (_.indexOf(firstLevelKeys, key) > -1) {\n return key;\n } else {\n return false;\n }\n });\n keys = _.compact(keys);\n return keys;\n};\n\nCreator.getFieldsForReorder = function(schema, keys, isSingle) {\n var _keys, childKeys, fields, i, is_wide_1, is_wide_2, sc_1, sc_2;\n fields = [];\n i = 0;\n _keys = _.filter(keys, function(key) {\n return !key.endsWith('_endLine');\n });\n while (i < _keys.length) {\n sc_1 = _.pick(schema, _keys[i]);\n sc_2 = _.pick(schema, _keys[i + 1]);\n is_wide_1 = false;\n is_wide_2 = false;\n _.each(sc_1, function(value) {\n var ref, ref1;\n if (((ref = value.autoform) != null ? ref.is_wide : void 0) || ((ref1 = value.autoform) != null ? ref1.type : void 0) === \"table\") {\n return is_wide_1 = true;\n }\n });\n _.each(sc_2, function(value) {\n var ref, ref1;\n if (((ref = value.autoform) != null ? ref.is_wide : void 0) || ((ref1 = value.autoform) != null ? ref1.type : void 0) === \"table\") {\n return is_wide_2 = true;\n }\n });\n if (Steedos.isMobile()) {\n is_wide_1 = true;\n is_wide_2 = true;\n }\n if (isSingle) {\n fields.push(_keys.slice(i, i + 1));\n i += 1;\n } else {\n if (is_wide_1) {\n fields.push(_keys.slice(i, i + 1));\n i += 1;\n } else if (!is_wide_1 && is_wide_2) {\n childKeys = _keys.slice(i, i + 1);\n childKeys.push(void 0);\n fields.push(childKeys);\n i += 1;\n } else if (!is_wide_1 && !is_wide_2) {\n childKeys = _keys.slice(i, i + 1);\n if (_keys[i + 1]) {\n childKeys.push(_keys[i + 1]);\n } else {\n childKeys.push(void 0);\n }\n fields.push(childKeys);\n i += 2;\n }\n }\n }\n return fields;\n};\n\nCreator.isFilterValueEmpty = function(v) {\n return typeof v === \"undefined\" || v === null || Number.isNaN(v) || v.length === 0;\n};\n\nCreator.getFieldDataType = function(objectFields, key) {\n var ref, result;\n if (objectFields && key) {\n result = (ref = objectFields[key]) != null ? ref.type : void 0;\n if ([\"formula\", \"summary\"].indexOf(result) > -1) {\n result = objectFields[key].data_type;\n }\n return result;\n } else {\n return \"text\";\n }\n};\n\nif (Meteor.isServer) {\n Creator.getAllRelatedObjects = function(object_name) {\n var related_object_names;\n related_object_names = [];\n _.each(Creator.Objects, function(related_object, related_object_name) {\n return _.each(related_object.fields, function(related_field, related_field_name) {\n if (related_field.type === \"master_detail\" && related_field.reference_to && related_field.reference_to === object_name) {\n return related_object_names.push(related_object_name);\n }\n });\n });\n if (Creator.getObject(object_name).enable_files) {\n related_object_names.push(\"cms_files\");\n }\n return related_object_names;\n };\n}\n\nif (Meteor.isServer) {\n Steedos.formatIndex = function(array) {\n var indexName, isdocumentDB, object, ref, ref1, ref2;\n object = {\n background: true\n };\n isdocumentDB = ((ref = Meteor.settings) != null ? (ref1 = ref.datasources) != null ? (ref2 = ref1[\"default\"]) != null ? ref2.documentDB : void 0 : void 0 : void 0) || false;\n if (isdocumentDB) {\n if (array.length > 0) {\n indexName = array.join(\".\");\n object.name = indexName;\n if (indexName.length > 52) {\n object.name = indexName.substring(0, 52);\n }\n }\n }\n return object;\n };\n}\n","Creator.appsByName = {}\n\n","Meteor.methods\n\t\"object_recent_viewed\": (object_name, record_id, space_id)->\n\t\tif !this.userId\n\t\t\treturn null\n\n\t\tif object_name == \"object_recent_viewed\"\n\t\t\treturn\n\t\tif object_name and record_id\n\t\t\tif !space_id\n\t\t\t\tdoc = Creator.getCollection(object_name).findOne({_id: record_id}, {fields: {space: 1}})\n\t\t\t\tspace_id = doc?.space\n\n\t\t\tcollection_recent_viewed = Creator.getCollection(\"object_recent_viewed\")\n\t\t\tfilters = { owner: this.userId, space: space_id, 'record.o': object_name, 'record.ids': [record_id]}\n\t\t\tcurrent_recent_viewed = collection_recent_viewed.findOne(filters)\n\t\t\tif current_recent_viewed\n\t\t\t\tcollection_recent_viewed.update(\n\t\t\t\t\tcurrent_recent_viewed._id,\n\t\t\t\t\t{\n\t\t\t\t\t\t$inc: {\n\t\t\t\t\t\t\tcount: 1\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\t\tmodified_by: this.userId\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\telse\n\t\t\t\tcollection_recent_viewed.insert(\n\t\t\t\t\t{\n\t\t\t\t\t\t_id: collection_recent_viewed._makeNewID()\n\t\t\t\t\t\towner: this.userId\n\t\t\t\t\t\tspace: space_id\n\t\t\t\t\t\trecord: {o: object_name, ids: [record_id]}\n\t\t\t\t\t\tcount: 1\n\t\t\t\t\t\tcreated: new Date()\n\t\t\t\t\t\tcreated_by: this.userId\n\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\tmodified_by: this.userId\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvalidate: false\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\treturn","Meteor.methods({\n \"object_recent_viewed\": function(object_name, record_id, space_id) {\n var collection_recent_viewed, current_recent_viewed, doc, filters;\n if (!this.userId) {\n return null;\n }\n if (object_name === \"object_recent_viewed\") {\n return;\n }\n if (object_name && record_id) {\n if (!space_id) {\n doc = Creator.getCollection(object_name).findOne({\n _id: record_id\n }, {\n fields: {\n space: 1\n }\n });\n space_id = doc != null ? doc.space : void 0;\n }\n collection_recent_viewed = Creator.getCollection(\"object_recent_viewed\");\n filters = {\n owner: this.userId,\n space: space_id,\n 'record.o': object_name,\n 'record.ids': [record_id]\n };\n current_recent_viewed = collection_recent_viewed.findOne(filters);\n if (current_recent_viewed) {\n collection_recent_viewed.update(current_recent_viewed._id, {\n $inc: {\n count: 1\n },\n $set: {\n modified: new Date(),\n modified_by: this.userId\n }\n });\n } else {\n collection_recent_viewed.insert({\n _id: collection_recent_viewed._makeNewID(),\n owner: this.userId,\n space: space_id,\n record: {\n o: object_name,\n ids: [record_id]\n },\n count: 1,\n created: new Date(),\n created_by: this.userId,\n modified: new Date(),\n modified_by: this.userId\n }, {\n validate: false\n });\n }\n }\n }\n});\n","recent_aggregate = (created_by, spaceId, _records, callback)->\n\tCreator.Collections.object_recent_viewed.rawCollection().aggregate([\n\t\t{$match: {created_by: created_by, space: spaceId}},\n\t\t{$group: {_id: {object_name: \"$record.o\", record_id: \"$record.ids\", space: \"$space\"}, maxCreated: {$max: \"$created\"}}},\n\t\t{$sort: {maxCreated: -1}},\n\t\t{$limit: 10}\n\t]).toArray (err, data)->\n\t\tif err\n\t\t\tthrow new Error(err)\n\n\t\tdata.forEach (doc) ->\n\t\t\t_records.push doc._id\n\n\t\tif callback && _.isFunction(callback)\n\t\t\tcallback()\n\n\t\treturn\n\nasync_recent_aggregate = Meteor.wrapAsync(recent_aggregate)\n\nsearch_object = (space, object_name,userId, searchText)->\n\tdata = new Array()\n\n\tif searchText\n\n\t\t_object = Creator.getObject(object_name)\n\n\t\t_object_collection = Creator.getCollection(object_name)\n\t\t_object_name_key = _object?.NAME_FIELD_KEY\n\t\tif _object && _object_collection && _object_name_key\n\t\t\tquery = {}\n\t\t\tsearch_Keywords = searchText.split(\" \")\n\t\t\tquery_and = []\n\t\t\tsearch_Keywords.forEach (keyword)->\n\t\t\t\tsubquery = {}\n\t\t\t\tsubquery[_object_name_key] = {$regex: keyword.trim()}\n\t\t\t\tquery_and.push subquery\n\n\t\t\tquery.$and = query_and\n\t\t\tquery.space = {$in: [space]}\n\n\t\t\tfields = {_id: 1}\n\t\t\tfields[_object_name_key] = 1\n\n\t\t\trecords = _object_collection.find(query, {fields: fields, sort: {modified: 1}, limit: 5})\n\n\t\t\trecords.forEach (record)->\n\t\t\t\tdata.push {_id: record._id, _name: record[_object_name_key], _object_name: object_name}\n\t\n\treturn data\n\nMeteor.methods\n\t'object_recent_record': (spaceId)->\n\t\tdata = new Array()\n\t\trecords = new Array()\n\t\tasync_recent_aggregate(this.userId, spaceId, records)\n\t\trecords.forEach (item)->\n\t\t\trecord_object = Creator.getObject(item.object_name, item.space)\n\n\t\t\tif !record_object\n\t\t\t\treturn\n\n\t\t\trecord_object_collection = Creator.getCollection(item.object_name, item.space)\n\n\t\t\tif record_object && record_object_collection\n\t\t\t\tfields = {_id: 1}\n\n\t\t\t\tfields[record_object.NAME_FIELD_KEY] = 1\n\n\t\t\t\trecord = record_object_collection.findOne(item.record_id[0], {fields: fields})\n\t\t\t\tif record\n\t\t\t\t\tdata.push {_id: record._id, _name: record[record_object.NAME_FIELD_KEY], _object_name: item.object_name}\n\n\t\treturn data\n\n\t'object_record_search': (options)->\n\t\tself = this\n\n\t\tdata = new Array()\n\n\t\tsearchText = options.searchText\n\t\tspace = options.space\n\n\t\t_.forEach Creator.objectsByName, (_object, name)->\n\t\t\tif _object.enable_search\n\t\t\t\tobject_record = search_object(space, _object.name, self.userId, searchText)\n\t\t\t\tdata = data.concat(object_record)\n\n\t\treturn data\n","var async_recent_aggregate, recent_aggregate, search_object;\n\nrecent_aggregate = function(created_by, spaceId, _records, callback) {\n return Creator.Collections.object_recent_viewed.rawCollection().aggregate([\n {\n $match: {\n created_by: created_by,\n space: spaceId\n }\n }, {\n $group: {\n _id: {\n object_name: \"$record.o\",\n record_id: \"$record.ids\",\n space: \"$space\"\n },\n maxCreated: {\n $max: \"$created\"\n }\n }\n }, {\n $sort: {\n maxCreated: -1\n }\n }, {\n $limit: 10\n }\n ]).toArray(function(err, data) {\n if (err) {\n throw new Error(err);\n }\n data.forEach(function(doc) {\n return _records.push(doc._id);\n });\n if (callback && _.isFunction(callback)) {\n callback();\n }\n });\n};\n\nasync_recent_aggregate = Meteor.wrapAsync(recent_aggregate);\n\nsearch_object = function(space, object_name, userId, searchText) {\n var _object, _object_collection, _object_name_key, data, fields, query, query_and, records, search_Keywords;\n data = new Array();\n if (searchText) {\n _object = Creator.getObject(object_name);\n _object_collection = Creator.getCollection(object_name);\n _object_name_key = _object != null ? _object.NAME_FIELD_KEY : void 0;\n if (_object && _object_collection && _object_name_key) {\n query = {};\n search_Keywords = searchText.split(\" \");\n query_and = [];\n search_Keywords.forEach(function(keyword) {\n var subquery;\n subquery = {};\n subquery[_object_name_key] = {\n $regex: keyword.trim()\n };\n return query_and.push(subquery);\n });\n query.$and = query_and;\n query.space = {\n $in: [space]\n };\n fields = {\n _id: 1\n };\n fields[_object_name_key] = 1;\n records = _object_collection.find(query, {\n fields: fields,\n sort: {\n modified: 1\n },\n limit: 5\n });\n records.forEach(function(record) {\n return data.push({\n _id: record._id,\n _name: record[_object_name_key],\n _object_name: object_name\n });\n });\n }\n }\n return data;\n};\n\nMeteor.methods({\n 'object_recent_record': function(spaceId) {\n var data, records;\n data = new Array();\n records = new Array();\n async_recent_aggregate(this.userId, spaceId, records);\n records.forEach(function(item) {\n var fields, record, record_object, record_object_collection;\n record_object = Creator.getObject(item.object_name, item.space);\n if (!record_object) {\n return;\n }\n record_object_collection = Creator.getCollection(item.object_name, item.space);\n if (record_object && record_object_collection) {\n fields = {\n _id: 1\n };\n fields[record_object.NAME_FIELD_KEY] = 1;\n record = record_object_collection.findOne(item.record_id[0], {\n fields: fields\n });\n if (record) {\n return data.push({\n _id: record._id,\n _name: record[record_object.NAME_FIELD_KEY],\n _object_name: item.object_name\n });\n }\n }\n });\n return data;\n },\n 'object_record_search': function(options) {\n var data, searchText, self, space;\n self = this;\n data = new Array();\n searchText = options.searchText;\n space = options.space;\n _.forEach(Creator.objectsByName, function(_object, name) {\n var object_record;\n if (_object.enable_search) {\n object_record = search_object(space, _object.name, self.userId, searchText);\n return data = data.concat(object_record);\n }\n });\n return data;\n }\n});\n","Meteor.methods\n update_filters: (listview_id, filters, filter_scope, filter_logic)->\n Creator.Collections.object_listviews.direct.update({_id: listview_id}, {$set: {filters: filters, filter_scope: filter_scope, filter_logic: filter_logic}})\n\n update_columns: (listview_id, columns)->\n check(columns, Array)\n \n if columns.length < 1\n throw new Meteor.Error 400, \"Select at least one field to display\"\n Creator.Collections.object_listviews.update({_id: listview_id}, {$set: {columns: columns}})\n","Meteor.methods({\n update_filters: function(listview_id, filters, filter_scope, filter_logic) {\n return Creator.Collections.object_listviews.direct.update({\n _id: listview_id\n }, {\n $set: {\n filters: filters,\n filter_scope: filter_scope,\n filter_logic: filter_logic\n }\n });\n },\n update_columns: function(listview_id, columns) {\n check(columns, Array);\n if (columns.length < 1) {\n throw new Meteor.Error(400, \"Select at least one field to display\");\n }\n return Creator.Collections.object_listviews.update({\n _id: listview_id\n }, {\n $set: {\n columns: columns\n }\n });\n }\n});\n","Meteor.methods\n\t'report_data': (options)->\n\t\tcheck(options, Object)\n\t\tspace = options.space\n\t\tfields = options.fields\n\t\tobject_name = options.object_name\n\t\tfilter_scope = options.filter_scope\n\t\tfilters = options.filters\n\t\tfilterFields = {}\n\t\tcompoundFields = []\n\t\tobjectFields = Creator.getObject(object_name)?.fields\n\t\t_.each fields, (item, index)->\n\t\t\tsplits = item.split(\".\")\n\t\t\tname = splits[0]\n\t\t\tobjectField = objectFields[name]\n\t\t\tif splits.length > 1 and objectField\n\t\t\t\tchildKey = item.replace name + \".\", \"\"\n\t\t\t\tcompoundFields.push({name: name, childKey: childKey, field: objectField})\n\t\t\tfilterFields[name] = 1\n\n\t\tselector = {}\n\t\tuserId = this.userId\n\t\tselector.space = space\n\t\tif filter_scope == \"spacex\"\n\t\t\tselector.space = \n\t\t\t\t$in: [null,space]\n\t\telse if filter_scope == \"mine\"\n\t\t\tselector.owner = userId\n\n\t\tif Creator.isCommonSpace(space) && Creator.isSpaceAdmin(space, @userId)\n\t\t\tdelete selector.space\n\n\t\tif filters and filters.length > 0\n\t\t\tselector[\"$and\"] = filters\n\n\t\tcursor = Creator.getCollection(object_name).find(selector, {fields: filterFields, skip: 0, limit: 10000})\n#\t\tif cursor.count() > 10000\n#\t\t\treturn []\n\t\tresult = cursor.fetch()\n\t\tif compoundFields.length\n\t\t\tresult = result.map (item,index)->\n\t\t\t\t_.each compoundFields, (compoundFieldItem, index)->\n\t\t\t\t\titemKey = compoundFieldItem.name + \"*%*\" + compoundFieldItem.childKey.replace(/\\./g, \"*%*\")\n\t\t\t\t\titemValue = item[compoundFieldItem.name]\n\t\t\t\t\ttype = compoundFieldItem.field.type\n\t\t\t\t\tif [\"lookup\", \"master_detail\"].indexOf(type) > -1\n\t\t\t\t\t\treference_to = compoundFieldItem.field.reference_to\n\t\t\t\t\t\tcompoundFilterFields = {}\n\t\t\t\t\t\tcompoundFilterFields[compoundFieldItem.childKey] = 1\n\t\t\t\t\t\treferenceItem = Creator.getCollection(reference_to).findOne {_id: itemValue}, fields: compoundFilterFields\n\t\t\t\t\t\tif referenceItem\n\t\t\t\t\t\t\titem[itemKey] = referenceItem[compoundFieldItem.childKey]\n\t\t\t\t\telse if type == \"select\"\n\t\t\t\t\t\toptions = compoundFieldItem.field.options\n\t\t\t\t\t\titem[itemKey] = _.findWhere(options, {value: itemValue})?.label or itemValue\n\t\t\t\t\telse\n\t\t\t\t\t\titem[itemKey] = itemValue\n\t\t\t\t\tunless item[itemKey]\n\t\t\t\t\t\titem[itemKey] = \"--\"\n\t\t\t\treturn item\n\t\t\treturn result\n\t\telse\n\t\t\treturn result\n\n","Meteor.methods({\n 'report_data': function(options) {\n var compoundFields, cursor, fields, filterFields, filter_scope, filters, objectFields, object_name, ref, result, selector, space, userId;\n check(options, Object);\n space = options.space;\n fields = options.fields;\n object_name = options.object_name;\n filter_scope = options.filter_scope;\n filters = options.filters;\n filterFields = {};\n compoundFields = [];\n objectFields = (ref = Creator.getObject(object_name)) != null ? ref.fields : void 0;\n _.each(fields, function(item, index) {\n var childKey, name, objectField, splits;\n splits = item.split(\".\");\n name = splits[0];\n objectField = objectFields[name];\n if (splits.length > 1 && objectField) {\n childKey = item.replace(name + \".\", \"\");\n compoundFields.push({\n name: name,\n childKey: childKey,\n field: objectField\n });\n }\n return filterFields[name] = 1;\n });\n selector = {};\n userId = this.userId;\n selector.space = space;\n if (filter_scope === \"spacex\") {\n selector.space = {\n $in: [null, space]\n };\n } else if (filter_scope === \"mine\") {\n selector.owner = userId;\n }\n if (Creator.isCommonSpace(space) && Creator.isSpaceAdmin(space, this.userId)) {\n delete selector.space;\n }\n if (filters && filters.length > 0) {\n selector[\"$and\"] = filters;\n }\n cursor = Creator.getCollection(object_name).find(selector, {\n fields: filterFields,\n skip: 0,\n limit: 10000\n });\n result = cursor.fetch();\n if (compoundFields.length) {\n result = result.map(function(item, index) {\n _.each(compoundFields, function(compoundFieldItem, index) {\n var compoundFilterFields, itemKey, itemValue, ref1, referenceItem, reference_to, type;\n itemKey = compoundFieldItem.name + \"*%*\" + compoundFieldItem.childKey.replace(/\\./g, \"*%*\");\n itemValue = item[compoundFieldItem.name];\n type = compoundFieldItem.field.type;\n if ([\"lookup\", \"master_detail\"].indexOf(type) > -1) {\n reference_to = compoundFieldItem.field.reference_to;\n compoundFilterFields = {};\n compoundFilterFields[compoundFieldItem.childKey] = 1;\n referenceItem = Creator.getCollection(reference_to).findOne({\n _id: itemValue\n }, {\n fields: compoundFilterFields\n });\n if (referenceItem) {\n item[itemKey] = referenceItem[compoundFieldItem.childKey];\n }\n } else if (type === \"select\") {\n options = compoundFieldItem.field.options;\n item[itemKey] = ((ref1 = _.findWhere(options, {\n value: itemValue\n })) != null ? ref1.label : void 0) || itemValue;\n } else {\n item[itemKey] = itemValue;\n }\n if (!item[itemKey]) {\n return item[itemKey] = \"--\";\n }\n });\n return item;\n });\n return result;\n } else {\n return result;\n }\n }\n});\n","###\n type: \"user\"\n object_name: \"object_listviews\"\n record_id: \"{object_name},{listview_id}\"\n settings:\n column_width: { field_a: 100, field_2: 150 }\n sort: [[\"field_a\", \"desc\"]]\n owner: {userId}\n###\n\nMeteor.methods\n \"tabular_sort_settings\": (object_name, list_view_id, sort)->\n userId = this.userId\n setting = Creator.Collections.settings.findOne({object_name: object_name, record_id: \"object_listviews\", owner: userId})\n if setting\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.sort\": sort}})\n else\n doc = \n type: \"user\"\n object_name: object_name\n record_id: \"object_listviews\"\n settings: {}\n owner: userId\n\n doc.settings[list_view_id] = {}\n doc.settings[list_view_id].sort = sort\n\n Creator.Collections.settings.insert(doc)\n\n \"tabular_column_width_settings\": (object_name, list_view_id, column_width)->\n userId = this.userId\n setting = Creator.Collections.settings.findOne({object_name: object_name, record_id: \"object_listviews\", owner: userId})\n if setting\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.column_width\": column_width}})\n else\n doc = \n type: \"user\"\n object_name: object_name\n record_id: \"object_listviews\"\n settings: {}\n owner: userId\n\n doc.settings[list_view_id] = {}\n doc.settings[list_view_id].column_width = column_width\n\n Creator.Collections.settings.insert(doc)\n\n \"grid_settings\": (object_name, list_view_id, column_width, sort)->\n userId = this.userId\n setting = Creator.Collections.settings.findOne({object_name: object_name, record_id: \"object_gridviews\", owner: userId})\n if setting\n # 每次都强制改变_id_actions列的宽度,以解决当用户只改变字段次序而没有改变任何字段宽度时,前端没有订阅到字段次序变更的数据的问题\n column_width._id_actions = if setting.settings[\"#{list_view_id}\"]?.column_width?._id_actions == 46 then 47 else 46\n if sort\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.sort\": sort, \"settings.#{list_view_id}.column_width\": column_width}})\n else\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.column_width\": column_width}})\n else\n doc =\n type: \"user\"\n object_name: object_name\n record_id: \"object_gridviews\"\n settings: {}\n owner: userId\n \n doc.settings[list_view_id] = {}\n doc.settings[list_view_id].column_width = column_width\n doc.settings[list_view_id].sort = sort\n\n Creator.Collections.settings.insert(doc)","\n/*\n type: \"user\"\n object_name: \"object_listviews\"\n record_id: \"{object_name},{listview_id}\"\n settings:\n column_width: { field_a: 100, field_2: 150 }\n sort: [[\"field_a\", \"desc\"]]\n owner: {userId}\n */\nMeteor.methods({\n \"tabular_sort_settings\": function(object_name, list_view_id, sort) {\n var doc, obj, setting, userId;\n userId = this.userId;\n setting = Creator.Collections.settings.findOne({\n object_name: object_name,\n record_id: \"object_listviews\",\n owner: userId\n });\n if (setting) {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj = {},\n obj[\"settings.\" + list_view_id + \".sort\"] = sort,\n obj\n )\n });\n } else {\n doc = {\n type: \"user\",\n object_name: object_name,\n record_id: \"object_listviews\",\n settings: {},\n owner: userId\n };\n doc.settings[list_view_id] = {};\n doc.settings[list_view_id].sort = sort;\n return Creator.Collections.settings.insert(doc);\n }\n },\n \"tabular_column_width_settings\": function(object_name, list_view_id, column_width) {\n var doc, obj, setting, userId;\n userId = this.userId;\n setting = Creator.Collections.settings.findOne({\n object_name: object_name,\n record_id: \"object_listviews\",\n owner: userId\n });\n if (setting) {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj = {},\n obj[\"settings.\" + list_view_id + \".column_width\"] = column_width,\n obj\n )\n });\n } else {\n doc = {\n type: \"user\",\n object_name: object_name,\n record_id: \"object_listviews\",\n settings: {},\n owner: userId\n };\n doc.settings[list_view_id] = {};\n doc.settings[list_view_id].column_width = column_width;\n return Creator.Collections.settings.insert(doc);\n }\n },\n \"grid_settings\": function(object_name, list_view_id, column_width, sort) {\n var doc, obj, obj1, ref, ref1, setting, userId;\n userId = this.userId;\n setting = Creator.Collections.settings.findOne({\n object_name: object_name,\n record_id: \"object_gridviews\",\n owner: userId\n });\n if (setting) {\n column_width._id_actions = ((ref = setting.settings[\"\" + list_view_id]) != null ? (ref1 = ref.column_width) != null ? ref1._id_actions : void 0 : void 0) === 46 ? 47 : 46;\n if (sort) {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj = {},\n obj[\"settings.\" + list_view_id + \".sort\"] = sort,\n obj[\"settings.\" + list_view_id + \".column_width\"] = column_width,\n obj\n )\n });\n } else {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj1 = {},\n obj1[\"settings.\" + list_view_id + \".column_width\"] = column_width,\n obj1\n )\n });\n }\n } else {\n doc = {\n type: \"user\",\n object_name: object_name,\n record_id: \"object_gridviews\",\n settings: {},\n owner: userId\n };\n doc.settings[list_view_id] = {};\n doc.settings[list_view_id].column_width = column_width;\n doc.settings[list_view_id].sort = sort;\n return Creator.Collections.settings.insert(doc);\n }\n }\n});\n","xml2js = require 'xml2js'\nfs = require 'fs'\npath = require 'path'\nmkdirp = require 'mkdirp'\n\nlogger = new Logger 'Export_TO_XML'\n\n_writeXmlFile = (jsonObj,objName) ->\n\t# 转xml\n\tbuilder = new xml2js.Builder()\n\txml = builder.buildObject jsonObj\n\n\t# 转为buffer\n\tstream = new Buffer xml\n\n\t# 根据当天时间的年月日作为存储路径\n\tnow = new Date\n\tyear = now.getFullYear()\n\tmonth = now.getMonth() + 1\n\tday = now.getDate()\n\n\t# 文件路径\n\tfilePath = path.join(__meteor_bootstrap__.serverDir,'../../../export/' + year + '/' + month + '/' + day + '/' + objName )\n\tfileName = jsonObj?._id + \".xml\"\n\tfileAddress = path.join filePath, fileName\n\n\tif !fs.existsSync filePath\n\t\tmkdirp.sync filePath\n\n\t# 写入文件\n\tfs.writeFile fileAddress, stream, (err) ->\n\t\tif err\n\t\t\tlogger.error \"#{jsonObj._id}写入xml文件失败\",err\n\t\n\treturn filePath\n\n\n# 整理Fields的json数据\n_mixFieldsData = (obj,objName) ->\n\t# 初始化对象数据\n\tjsonObj = {}\n\t# 获取fields\n\tobjFields = Creator?.getObject(objName)?.fields\n\n\tmixDefault = (field_name)->\n\t\tjsonObj[field_name] = obj[field_name] || \"\"\n\n\tmixDate = (field_name,type)->\n\t\tdate = obj[field_name]\n\t\tif type == \"date\"\n\t\t\tformat = \"YYYY-MM-DD\"\n\t\telse\n\t\t\tformat = \"YYYY-MM-DD HH:mm:ss\"\n\t\tif date? and format?\n\t\t\tdateStr = moment(date).format(format)\n\t\tjsonObj[field_name] = dateStr || \"\"\n\n\tmixBool = (field_name)->\n\t\tif obj[field_name] == true\n\t\t\tjsonObj[field_name] = \"是\"\n\t\telse if obj[field_name] == false\n\t\t\tjsonObj[field_name] = \"否\"\n\t\telse\n\t\t\tjsonObj[field_name] = \"\"\n\n\t# 循环每个fields,并判断取值\n\t_.each objFields, (field, field_name)->\n\t\tswitch field?.type\n\t\t\twhen \"date\",\"datetime\" then mixDate field_name,field.type\n\t\t\twhen \"boolean\" then mixBool field_name\n\t\t\telse mixDefault field_name\n\n\treturn jsonObj\n\n# 获取子表整理数据\n_mixRelatedData = (obj,objName) ->\n\t# 初始化对象数据\n\trelated_objects = {}\n\n\t# 获取相关表\n\trelatedObjNames = Creator?.getAllRelatedObjects objName\n\n\t# 循环相关表\n\trelatedObjNames.forEach (relatedObjName) ->\n\t\t# 每个表定义一个对象数组\n\t\trelatedTableData = []\n\n\t\t# *设置关联搜索查询的字段\n\t\t# 附件的关联搜索字段是定死的\n\t\tif relatedObjName == \"cms_files\"\n\t\t\trelated_field_name = \"parent.ids\"\n\t\telse\n\t\t\t# 获取fields\n\t\t\tfields = Creator?.Objects[relatedObjName]?.fields\n\t\t\t# 循环每个field,找出reference_to的关联字段\n\t\t\trelated_field_name = \"\"\n\t\t\t_.each fields, (field, field_name)->\n\t\t\t\tif field?.reference_to == objName\n\t\t\t\t\trelated_field_name = field_name\n\n\t\t# 根据找出的关联字段,查子表数据\n\t\tif related_field_name\n\t\t\trelatedCollection = Creator.getCollection(relatedObjName)\n\t\t\t# 获取到所有的数据\n\t\t\trelatedRecordList = relatedCollection.find({\"#{related_field_name}\":obj._id}).fetch()\n\t\t\t# 循环每一条数据\n\t\t\trelatedRecordList.forEach (relatedObj)->\n\t\t\t\t# 整合fields数据\n\t\t\t\tfieldsData = _mixFieldsData relatedObj,relatedObjName\n\t\t\t\t# 把一条记录插入到对象数组中\n\t\t\t\trelatedTableData.push fieldsData\n\n\t\t# 把一个子表的所有数据插入到related_objects中,再循环下一个\n\t\trelated_objects[relatedObjName] = relatedTableData\n\n\treturn related_objects\n\n# Creator.Export2xml()\nCreator.Export2xml = (objName, recordList) ->\n\tlogger.info \"Run Creator.Export2xml\"\n\n\tconsole.time \"Creator.Export2xml\"\n\n\t# 测试数据\n\t# objName = \"archive_records\"\n\n\t# 查找对象数据\n\tcollection = Creator.getCollection(objName)\n\t# 测试数据\n\trecordList = collection.find({}).fetch()\n\n\trecordList.forEach (recordObj)->\n\t\tjsonObj = {}\n\t\tjsonObj._id = recordObj._id\n\n\t\t# 整理主表的Fields数据\n\t\tfieldsData = _mixFieldsData recordObj,objName\n\t\tjsonObj[objName] = fieldsData\n\n\t\t# 整理相关表数据\n\t\trelated_objects = _mixRelatedData recordObj,objName\n\n\t\tjsonObj[\"related_objects\"] = related_objects\n\n\t\t# 转为xml保存文件\n\t\tfilePath = _writeXmlFile jsonObj,objName\n\n\tconsole.timeEnd \"Creator.Export2xml\"\n\treturn filePath","var _mixFieldsData, _mixRelatedData, _writeXmlFile, fs, logger, mkdirp, path, xml2js;\n\nxml2js = require('xml2js');\n\nfs = require('fs');\n\npath = require('path');\n\nmkdirp = require('mkdirp');\n\nlogger = new Logger('Export_TO_XML');\n\n_writeXmlFile = function(jsonObj, objName) {\n var builder, day, fileAddress, fileName, filePath, month, now, stream, xml, year;\n builder = new xml2js.Builder();\n xml = builder.buildObject(jsonObj);\n stream = new Buffer(xml);\n now = new Date;\n year = now.getFullYear();\n month = now.getMonth() + 1;\n day = now.getDate();\n filePath = path.join(__meteor_bootstrap__.serverDir, '../../../export/' + year + '/' + month + '/' + day + '/' + objName);\n fileName = (jsonObj != null ? jsonObj._id : void 0) + \".xml\";\n fileAddress = path.join(filePath, fileName);\n if (!fs.existsSync(filePath)) {\n mkdirp.sync(filePath);\n }\n fs.writeFile(fileAddress, stream, function(err) {\n if (err) {\n return logger.error(jsonObj._id + \"写入xml文件失败\", err);\n }\n });\n return filePath;\n};\n\n_mixFieldsData = function(obj, objName) {\n var jsonObj, mixBool, mixDate, mixDefault, objFields, ref;\n jsonObj = {};\n objFields = typeof Creator !== \"undefined\" && Creator !== null ? (ref = Creator.getObject(objName)) != null ? ref.fields : void 0 : void 0;\n mixDefault = function(field_name) {\n return jsonObj[field_name] = obj[field_name] || \"\";\n };\n mixDate = function(field_name, type) {\n var date, dateStr, format;\n date = obj[field_name];\n if (type === \"date\") {\n format = \"YYYY-MM-DD\";\n } else {\n format = \"YYYY-MM-DD HH:mm:ss\";\n }\n if ((date != null) && (format != null)) {\n dateStr = moment(date).format(format);\n }\n return jsonObj[field_name] = dateStr || \"\";\n };\n mixBool = function(field_name) {\n if (obj[field_name] === true) {\n return jsonObj[field_name] = \"是\";\n } else if (obj[field_name] === false) {\n return jsonObj[field_name] = \"否\";\n } else {\n return jsonObj[field_name] = \"\";\n }\n };\n _.each(objFields, function(field, field_name) {\n switch (field != null ? field.type : void 0) {\n case \"date\":\n case \"datetime\":\n return mixDate(field_name, field.type);\n case \"boolean\":\n return mixBool(field_name);\n default:\n return mixDefault(field_name);\n }\n });\n return jsonObj;\n};\n\n_mixRelatedData = function(obj, objName) {\n var relatedObjNames, related_objects;\n related_objects = {};\n relatedObjNames = typeof Creator !== \"undefined\" && Creator !== null ? Creator.getAllRelatedObjects(objName) : void 0;\n relatedObjNames.forEach(function(relatedObjName) {\n var fields, obj1, ref, relatedCollection, relatedRecordList, relatedTableData, related_field_name;\n relatedTableData = [];\n if (relatedObjName === \"cms_files\") {\n related_field_name = \"parent.ids\";\n } else {\n fields = typeof Creator !== \"undefined\" && Creator !== null ? (ref = Creator.Objects[relatedObjName]) != null ? ref.fields : void 0 : void 0;\n related_field_name = \"\";\n _.each(fields, function(field, field_name) {\n if ((field != null ? field.reference_to : void 0) === objName) {\n return related_field_name = field_name;\n }\n });\n }\n if (related_field_name) {\n relatedCollection = Creator.getCollection(relatedObjName);\n relatedRecordList = relatedCollection.find((\n obj1 = {},\n obj1[\"\" + related_field_name] = obj._id,\n obj1\n )).fetch();\n relatedRecordList.forEach(function(relatedObj) {\n var fieldsData;\n fieldsData = _mixFieldsData(relatedObj, relatedObjName);\n return relatedTableData.push(fieldsData);\n });\n }\n return related_objects[relatedObjName] = relatedTableData;\n });\n return related_objects;\n};\n\nCreator.Export2xml = function(objName, recordList) {\n var collection;\n logger.info(\"Run Creator.Export2xml\");\n console.time(\"Creator.Export2xml\");\n collection = Creator.getCollection(objName);\n recordList = collection.find({}).fetch();\n recordList.forEach(function(recordObj) {\n var fieldsData, filePath, jsonObj, related_objects;\n jsonObj = {};\n jsonObj._id = recordObj._id;\n fieldsData = _mixFieldsData(recordObj, objName);\n jsonObj[objName] = fieldsData;\n related_objects = _mixRelatedData(recordObj, objName);\n jsonObj[\"related_objects\"] = related_objects;\n return filePath = _writeXmlFile(jsonObj, objName);\n });\n console.timeEnd(\"Creator.Export2xml\");\n return filePath;\n};\n","Meteor.methods \n\trelated_objects_records: (object_name, related_object_name, related_field_name, record_id, spaceId)->\n\t\tuserId = this.userId\n\t\tif related_object_name == \"cfs.files.filerecord\"\n\t\t\tselector = {\"metadata.space\": spaceId}\n\t\telse\n\t\t\tselector = {space: spaceId}\n\t\t\n\t\tif related_object_name == \"cms_files\"\n\t\t\t# 附件的关联搜索条件是定死的\n\t\t\tselector[\"parent.o\"] = object_name\n\t\t\tselector[\"parent.ids\"] = [record_id]\n\t\telse\n\t\t\tselector[related_field_name] = record_id\n\n\t\tpermissions = Creator.getPermissions(related_object_name, spaceId, userId)\n\t\tif !permissions.viewAllRecords and permissions.allowRead\n\t\t\tselector.owner = userId\n\t\t\n\t\trelated_records = Creator.getCollection(related_object_name).find(selector)\n\t\treturn related_records.count()","Meteor.methods({\n related_objects_records: function(object_name, related_object_name, related_field_name, record_id, spaceId) {\n var permissions, related_records, selector, userId;\n userId = this.userId;\n if (related_object_name === \"cfs.files.filerecord\") {\n selector = {\n \"metadata.space\": spaceId\n };\n } else {\n selector = {\n space: spaceId\n };\n }\n if (related_object_name === \"cms_files\") {\n selector[\"parent.o\"] = object_name;\n selector[\"parent.ids\"] = [record_id];\n } else {\n selector[related_field_name] = record_id;\n }\n permissions = Creator.getPermissions(related_object_name, spaceId, userId);\n if (!permissions.viewAllRecords && permissions.allowRead) {\n selector.owner = userId;\n }\n related_records = Creator.getCollection(related_object_name).find(selector);\n return related_records.count();\n }\n});\n","Meteor.methods\n\tgetPendingSpaceInfo: (inviterId, spaceId)->\n\t\tinviterName = db.users.findOne({_id: inviterId}).name\n\t\tspaceName = db.spaces.findOne({_id: spaceId}).name\n\n\t\treturn {inviter: inviterName, space: spaceName}\n\n\trefuseJoinSpace: (_id)->\n\t\tdb.space_users.direct.update({_id: _id},{$set: {invite_state: \"refused\"}})\n\n\tacceptJoinSpace: (_id)->\n\t\tdb.space_users.direct.update({_id: _id},{$set: {invite_state: \"accepted\", user_accepted: true}})\n\n","Meteor.methods({\n getPendingSpaceInfo: function(inviterId, spaceId) {\n var inviterName, spaceName;\n inviterName = db.users.findOne({\n _id: inviterId\n }).name;\n spaceName = db.spaces.findOne({\n _id: spaceId\n }).name;\n return {\n inviter: inviterName,\n space: spaceName\n };\n },\n refuseJoinSpace: function(_id) {\n return db.space_users.direct.update({\n _id: _id\n }, {\n $set: {\n invite_state: \"refused\"\n }\n });\n },\n acceptJoinSpace: function(_id) {\n return db.space_users.direct.update({\n _id: _id\n }, {\n $set: {\n invite_state: \"accepted\",\n user_accepted: true\n }\n });\n }\n});\n","Meteor.publish \"creator_object_record\", (object_name, id, space_id)->\n\tcollection = Creator.getCollection(object_name, space_id)\n\tif collection\n\t\treturn collection.find({_id: id})\n\n","Meteor.publish(\"creator_object_record\", function(object_name, id, space_id) {\n var collection;\n collection = Creator.getCollection(object_name, space_id);\n if (collection) {\n return collection.find({\n _id: id\n });\n }\n});\n","Meteor.publishComposite \"steedos_object_tabular\", (tableName, ids, fields, spaceId)->\n\tunless this.userId\n\t\treturn this.ready()\n\n\tcheck(tableName, String);\n\tcheck(ids, Array);\n\tcheck(fields, Match.Optional(Object));\n\n\t_object_name = tableName.replace(\"creator_\",\"\")\n\t_object = Creator.getObject(_object_name, spaceId)\n\n\tif spaceId\n\t\t_object_name = Creator.getObjectName(_object)\n\n\tobject_colleciton = Creator.getCollection(_object_name)\n\n\n\t_fields = _object?.fields\n\tif !_fields || !object_colleciton\n\t\treturn this.ready()\n\n\treference_fields = _.filter _fields, (f)->\n\t\treturn _.isFunction(f.reference_to) || !_.isEmpty(f.reference_to)\n\n\tself = this\n\n\tself.unblock();\n\n\tif reference_fields.length > 0\n\t\tdata = {\n\t\t\tfind: ()->\n\t\t\t\tself.unblock();\n\t\t\t\tfield_keys = {}\n\t\t\t\t_.each _.keys(fields), (f)->\n\t\t\t\t\tunless /\\w+(\\.\\$){1}\\w?/.test(f)\n\t\t\t\t\t\tfield_keys[f] = 1\n\t\t\t\t\n\t\t\t\treturn object_colleciton.find({_id: {$in: ids}}, {fields: field_keys});\n\t\t}\n\n\t\tdata.children = []\n\n\t\tkeys = _.keys(fields)\n\n\t\tif keys.length < 1\n\t\t\tkeys = _.keys(_fields)\n\n\t\t_keys = []\n\n\t\tkeys.forEach (key)->\n\t\t\tif _object.schema._objectKeys[key + '.']\n\t\t\t\t_keys = _keys.concat(_.map(_object.schema._objectKeys[key + '.'], (k)->\n\t\t\t\t\treturn key + '.' + k\n\t\t\t\t))\n\t\t\t_keys.push(key)\n\n\t\t_keys.forEach (key)->\n\t\t\treference_field = _fields[key]\n\n\t\t\tif reference_field && (_.isFunction(reference_field.reference_to) || !_.isEmpty(reference_field.reference_to)) # and Creator.Collections[reference_field.reference_to]\n\t\t\t\tdata.children.push {\n\t\t\t\t\tfind: (parent) ->\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t\tself.unblock();\n\n\t\t\t\t\t\t\tquery = {}\n\n\t\t\t\t\t\t\t# 表格子字段特殊处理\n\t\t\t\t\t\t\tif /\\w+(\\.\\$\\.){1}\\w+/.test(key)\n\t\t\t\t\t\t\t\tp_k = key.replace(/(\\w+)\\.\\$\\.\\w+/ig, \"$1\")\n\t\t\t\t\t\t\t\ts_k = key.replace(/\\w+\\.\\$\\.(\\w+)/ig, \"$1\")\n\t\t\t\t\t\t\t\treference_ids = parent[p_k].getProperty(s_k)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\treference_ids = key.split('.').reduce (o, x) ->\n\t\t\t\t\t\t\t\t\t\to?[x]\n\t\t\t\t\t\t\t\t, parent\n\n\t\t\t\t\t\t\treference_to = reference_field.reference_to\n\n\t\t\t\t\t\t\tif _.isFunction(reference_to)\n\t\t\t\t\t\t\t\treference_to = reference_to()\n\n\t\t\t\t\t\t\tif _.isArray(reference_to)\n\t\t\t\t\t\t\t\tif _.isObject(reference_ids) && !_.isArray(reference_ids)\n\t\t\t\t\t\t\t\t\treference_to = reference_ids.o\n\t\t\t\t\t\t\t\t\treference_ids = reference_ids.ids || []\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\treturn []\n\n\t\t\t\t\t\t\tif _.isArray(reference_ids)\n\t\t\t\t\t\t\t\tquery._id = {$in: reference_ids}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tquery._id = reference_ids\n\n\t\t\t\t\t\t\treference_to_object = Creator.getObject(reference_to, spaceId)\n\n\t\t\t\t\t\t\tname_field_key = reference_to_object.NAME_FIELD_KEY\n\n\t\t\t\t\t\t\tchildren_fields = {_id: 1, space: 1}\n\n\t\t\t\t\t\t\tif name_field_key\n\t\t\t\t\t\t\t\tchildren_fields[name_field_key] = 1\n\n\t\t\t\t\t\t\treturn Creator.getCollection(reference_to, spaceId).find(query, {\n\t\t\t\t\t\t\t\tfields: children_fields\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcatch e\n\t\t\t\t\t\t\tconsole.log(reference_to, parent, e)\n\t\t\t\t\t\t\treturn []\n\t\t\t\t}\n\n\t\treturn data\n\telse\n\t\treturn {\n\t\t\tfind: ()->\n\t\t\t\tself.unblock();\n\t\t\t\treturn object_colleciton.find({_id: {$in: ids}}, {fields: fields})\n\t\t};\n\n","Meteor.publishComposite(\"steedos_object_tabular\", function(tableName, ids, fields, spaceId) {\n var _fields, _keys, _object, _object_name, data, keys, object_colleciton, reference_fields, self;\n if (!this.userId) {\n return this.ready();\n }\n check(tableName, String);\n check(ids, Array);\n check(fields, Match.Optional(Object));\n _object_name = tableName.replace(\"creator_\", \"\");\n _object = Creator.getObject(_object_name, spaceId);\n if (spaceId) {\n _object_name = Creator.getObjectName(_object);\n }\n object_colleciton = Creator.getCollection(_object_name);\n _fields = _object != null ? _object.fields : void 0;\n if (!_fields || !object_colleciton) {\n return this.ready();\n }\n reference_fields = _.filter(_fields, function(f) {\n return _.isFunction(f.reference_to) || !_.isEmpty(f.reference_to);\n });\n self = this;\n self.unblock();\n if (reference_fields.length > 0) {\n data = {\n find: function() {\n var field_keys;\n self.unblock();\n field_keys = {};\n _.each(_.keys(fields), function(f) {\n if (!/\\w+(\\.\\$){1}\\w?/.test(f)) {\n return field_keys[f] = 1;\n }\n });\n return object_colleciton.find({\n _id: {\n $in: ids\n }\n }, {\n fields: field_keys\n });\n }\n };\n data.children = [];\n keys = _.keys(fields);\n if (keys.length < 1) {\n keys = _.keys(_fields);\n }\n _keys = [];\n keys.forEach(function(key) {\n if (_object.schema._objectKeys[key + '.']) {\n _keys = _keys.concat(_.map(_object.schema._objectKeys[key + '.'], function(k) {\n return key + '.' + k;\n }));\n }\n return _keys.push(key);\n });\n _keys.forEach(function(key) {\n var reference_field;\n reference_field = _fields[key];\n if (reference_field && (_.isFunction(reference_field.reference_to) || !_.isEmpty(reference_field.reference_to))) {\n return data.children.push({\n find: function(parent) {\n var children_fields, e, name_field_key, p_k, query, reference_ids, reference_to, reference_to_object, s_k;\n try {\n self.unblock();\n query = {};\n if (/\\w+(\\.\\$\\.){1}\\w+/.test(key)) {\n p_k = key.replace(/(\\w+)\\.\\$\\.\\w+/ig, \"$1\");\n s_k = key.replace(/\\w+\\.\\$\\.(\\w+)/ig, \"$1\");\n reference_ids = parent[p_k].getProperty(s_k);\n } else {\n reference_ids = key.split('.').reduce(function(o, x) {\n return o != null ? o[x] : void 0;\n }, parent);\n }\n reference_to = reference_field.reference_to;\n if (_.isFunction(reference_to)) {\n reference_to = reference_to();\n }\n if (_.isArray(reference_to)) {\n if (_.isObject(reference_ids) && !_.isArray(reference_ids)) {\n reference_to = reference_ids.o;\n reference_ids = reference_ids.ids || [];\n } else {\n return [];\n }\n }\n if (_.isArray(reference_ids)) {\n query._id = {\n $in: reference_ids\n };\n } else {\n query._id = reference_ids;\n }\n reference_to_object = Creator.getObject(reference_to, spaceId);\n name_field_key = reference_to_object.NAME_FIELD_KEY;\n children_fields = {\n _id: 1,\n space: 1\n };\n if (name_field_key) {\n children_fields[name_field_key] = 1;\n }\n return Creator.getCollection(reference_to, spaceId).find(query, {\n fields: children_fields\n });\n } catch (error) {\n e = error;\n console.log(reference_to, parent, e);\n return [];\n }\n }\n });\n }\n });\n return data;\n } else {\n return {\n find: function() {\n self.unblock();\n return object_colleciton.find({\n _id: {\n $in: ids\n }\n }, {\n fields: fields\n });\n }\n };\n }\n});\n","Meteor.publish \"object_listviews\", (object_name, spaceId)->\n userId = this.userId\n return Creator.getCollection(\"object_listviews\").find({object_name: object_name, space: spaceId ,\"$or\":[{owner: userId}, {shared: true}]})","Meteor.publish \"user_tabular_settings\", (object_name)->\n userId = this.userId\n return Creator.Collections.settings.find({object_name: {$in: object_name}, record_id: {$in: [\"object_listviews\", \"object_gridviews\"]}, owner: userId})\n","Meteor.publish \"related_objects_records\", (object_name, related_object_name, related_field_name, record_id, spaceId)->\n\tuserId = this.userId\n\tif related_object_name == \"cfs.files.filerecord\"\n\t\tselector = {\"metadata.space\": spaceId}\n\telse\n\t\tselector = {space: spaceId}\n\t\n\tif related_object_name == \"cms_files\"\n\t\t# 附件的关联搜索条件是定死的\n\t\tselector[\"parent.o\"] = object_name\n\t\tselector[\"parent.ids\"] = [record_id]\n\telse\n\t\tselector[related_field_name] = record_id\n\n\tpermissions = Creator.getPermissions(related_object_name, spaceId, userId)\n\tif !permissions.viewAllRecords and permissions.allowRead\n\t\tselector.owner = userId\n\t\n\treturn Creator.getCollection(related_object_name).find(selector)","Meteor.publish(\"related_objects_records\", function(object_name, related_object_name, related_field_name, record_id, spaceId) {\n var permissions, selector, userId;\n userId = this.userId;\n if (related_object_name === \"cfs.files.filerecord\") {\n selector = {\n \"metadata.space\": spaceId\n };\n } else {\n selector = {\n space: spaceId\n };\n }\n if (related_object_name === \"cms_files\") {\n selector[\"parent.o\"] = object_name;\n selector[\"parent.ids\"] = [record_id];\n } else {\n selector[related_field_name] = record_id;\n }\n permissions = Creator.getPermissions(related_object_name, spaceId, userId);\n if (!permissions.viewAllRecords && permissions.allowRead) {\n selector.owner = userId;\n }\n return Creator.getCollection(related_object_name).find(selector);\n});\n","Meteor.publish 'space_user_info', (spaceId, userId)->\n\treturn Creator.getCollection(\"space_users\").find({space: spaceId, user: userId})","\nif Meteor.isServer\n\n\tMeteor.publish 'contacts_view_limits', (spaceId)->\n\n\t\tunless this.userId\n\t\t\treturn this.ready()\n\n\t\tunless spaceId\n\t\t\treturn this.ready()\n\n\t\tselector =\n\t\t\tspace: spaceId\n\t\t\tkey: 'contacts_view_limits'\n\n\t\treturn db.space_settings.find(selector)","if (Meteor.isServer) {\n Meteor.publish('contacts_view_limits', function(spaceId) {\n var selector;\n if (!this.userId) {\n return this.ready();\n }\n if (!spaceId) {\n return this.ready();\n }\n selector = {\n space: spaceId,\n key: 'contacts_view_limits'\n };\n return db.space_settings.find(selector);\n });\n}\n","\nif Meteor.isServer\n\n\tMeteor.publish 'contacts_no_force_phone_users', (spaceId)->\n\n\t\tunless this.userId\n\t\t\treturn this.ready()\n\n\t\tunless spaceId\n\t\t\treturn this.ready()\n\n\t\tselector =\n\t\t\tspace: spaceId\n\t\t\tkey: 'contacts_no_force_phone_users'\n\n\t\treturn db.space_settings.find(selector)","if (Meteor.isServer) {\n Meteor.publish('contacts_no_force_phone_users', function(spaceId) {\n var selector;\n if (!this.userId) {\n return this.ready();\n }\n if (!spaceId) {\n return this.ready();\n }\n selector = {\n space: spaceId,\n key: 'contacts_no_force_phone_users'\n };\n return db.space_settings.find(selector);\n });\n}\n","if Meteor.isServer\n\tMeteor.publish 'space_need_to_confirm', ()->\n\t\tuserId = this.userId\n\t\treturn db.space_users.find({user: userId, invite_state: \"pending\"})","if (Meteor.isServer) {\n Meteor.publish('space_need_to_confirm', function() {\n var userId;\n userId = this.userId;\n return db.space_users.find({\n user: userId,\n invite_state: \"pending\"\n });\n });\n}\n","permissionManagerForInitApproval = {}\n\npermissionManagerForInitApproval.getFlowPermissions = (flow_id, user_id) ->\n\t# 根据:flow_id查到对应的flow\n\tflow = uuflowManagerForInitApproval.getFlow(flow_id)\n\tspace_id = flow.space\n\t# 根据space_id和:user_id到organizations表中查到用户所属所有的org_id(包括上级组ID)\n\torg_ids = new Array\n\torganizations = db.organizations.find({\n\t\tspace: space_id, users: user_id }, { fields: { parents: 1 } }).fetch()\n\t_.each(organizations, (org) ->\n\t\torg_ids.push(org._id)\n\t\tif org.parents\n\t\t\t_.each(org.parents, (parent_id) ->\n\t\t\t\torg_ids.push(parent_id)\n\t\t\t)\n\t)\n\torg_ids = _.uniq(org_ids)\n\tmy_permissions = new Array\n\tif flow.perms\n\t\t# 判断flow.perms.users_can_admin中是否包含当前用户,\n\t\t# 或者flow.perms.orgs_can_add是否包含4步得到的org_id数组中的任何一个,\n\t\t# 若是,则在返回的数组中加上add\n\t\tif flow.perms.users_can_add\n\t\t\tusers_can_add = flow.perms.users_can_add\n\t\t\tif users_can_add.includes(user_id)\n\t\t\t\tmy_permissions.push(\"add\")\n\n\t\tif flow.perms.orgs_can_add\n\t\t\torgs_can_add = flow.perms.orgs_can_add\n\t\t\t_.each(org_ids, (org_id) ->\n\t\t\t\tif orgs_can_add.includes(org_id)\n\t\t\t\t\tmy_permissions.push(\"add\")\n\t\t\t)\n\t\t# 判断flow.perms.users_can_monitor中是否包含当前用户,\n\t\t# 或者flow.perms.orgs_can_monitor是否包含4步得到的org_id数组中的任何一个,\n\t\t# 若是,则在返回的数组中加上monitor\n\t\tif flow.perms.users_can_monitor\n\t\t\tusers_can_monitor = flow.perms.users_can_monitor\n\t\t\tif users_can_monitor.includes(user_id)\n\t\t\t\tmy_permissions.push(\"monitor\")\n\n\t\tif flow.perms.orgs_can_monitor\n\t\t\torgs_can_monitor = flow.perms.orgs_can_monitor\n\t\t\t_.each(org_ids, (org_id) ->\n\t\t\t\tif orgs_can_monitor.includes(org_id)\n\t\t\t\t\tmy_permissions.push(\"monitor\")\n\t\t\t)\n\t\t# 判断flow.perms.users_can_admin中是否包含当前用户,\n\t\t# 或者flow.perms.orgs_can_admin是否包含4步得到的org_id数组中的任何一个,\n\t\t# 若是,则在返回的数组中加上admin\n\t\tif flow.perms.users_can_admin\n\t\t\tusers_can_admin = flow.perms.users_can_admin\n\t\t\tif users_can_admin.includes(user_id)\n\t\t\t\tmy_permissions.push(\"admin\")\n\n\t\tif flow.perms.orgs_can_admin\n\t\t\torgs_can_admin = flow.perms.orgs_can_admin\n\t\t\t_.each(org_ids, (org_id) ->\n\t\t\t\tif orgs_can_admin.includes(org_id)\n\t\t\t\t\tmy_permissions.push(\"admin\")\n\t\t\t)\n\n\tmy_permissions = _.uniq(my_permissions)\n\treturn my_permissions"," \n\npermissionManagerForInitApproval = {};\n\npermissionManagerForInitApproval.getFlowPermissions = function(flow_id, user_id) {\n var flow, my_permissions, org_ids, organizations, orgs_can_add, orgs_can_admin, orgs_can_monitor, space_id, users_can_add, users_can_admin, users_can_monitor;\n flow = uuflowManagerForInitApproval.getFlow(flow_id);\n space_id = flow.space;\n org_ids = new Array;\n organizations = db.organizations.find({\n space: space_id,\n users: user_id\n }, {\n fields: {\n parents: 1\n }\n }).fetch();\n _.each(organizations, function(org) {\n org_ids.push(org._id);\n if (org.parents) {\n return _.each(org.parents, function(parent_id) {\n return org_ids.push(parent_id);\n });\n }\n });\n org_ids = _.uniq(org_ids);\n my_permissions = new Array;\n if (flow.perms) {\n if (flow.perms.users_can_add) {\n users_can_add = flow.perms.users_can_add;\n if (users_can_add.includes(user_id)) {\n my_permissions.push(\"add\");\n }\n }\n if (flow.perms.orgs_can_add) {\n orgs_can_add = flow.perms.orgs_can_add;\n _.each(org_ids, function(org_id) {\n if (orgs_can_add.includes(org_id)) {\n return my_permissions.push(\"add\");\n }\n });\n }\n if (flow.perms.users_can_monitor) {\n users_can_monitor = flow.perms.users_can_monitor;\n if (users_can_monitor.includes(user_id)) {\n my_permissions.push(\"monitor\");\n }\n }\n if (flow.perms.orgs_can_monitor) {\n orgs_can_monitor = flow.perms.orgs_can_monitor;\n _.each(org_ids, function(org_id) {\n if (orgs_can_monitor.includes(org_id)) {\n return my_permissions.push(\"monitor\");\n }\n });\n }\n if (flow.perms.users_can_admin) {\n users_can_admin = flow.perms.users_can_admin;\n if (users_can_admin.includes(user_id)) {\n my_permissions.push(\"admin\");\n }\n }\n if (flow.perms.orgs_can_admin) {\n orgs_can_admin = flow.perms.orgs_can_admin;\n _.each(org_ids, function(org_id) {\n if (orgs_can_admin.includes(org_id)) {\n return my_permissions.push(\"admin\");\n }\n });\n }\n }\n my_permissions = _.uniq(my_permissions);\n return my_permissions;\n};\n","# 发起审批\n_eval = require('eval')\nobjectql = require('@steedos/objectql');\n\ngetObjectConfig = (objectApiName) ->\n\treturn objectql.getObject(objectApiName).toConfig()\n\ngetObjectNameFieldKey = (objectApiName) ->\n\treturn objectql.getObject(objectApiName).NAME_FIELD_KEY\n\ngetRelateds = (objectApiName) ->\n\treturn Meteor.wrapAsync((objectApiName, cb) ->\n\t\tobjectql.getObject(objectApiName).getRelateds().then (resolve, reject) ->\n\t\t\tcb(reject, resolve)\n\t\t)(objectApiName)\n\nobjectFindOne = (objectApiName, query) ->\n\treturn Meteor.wrapAsync((objectApiName, query, cb) ->\n\t\tquery.top = 1\n\t\tobjectql.getObject(objectApiName).find(query).then (resolve, reject) ->\n\t\t\tif (resolve && resolve.length > 0)\n\t\t\t\tcb(reject, resolve[0])\n\t\t\telse\n\t\t\t\tcb(reject, null)\n\t\t)(objectApiName, query)\n\nobjectFind = (objectApiName, query) ->\n\treturn Meteor.wrapAsync((objectApiName, query, cb) ->\n\t\tobjectql.getObject(objectApiName).find(query).then (resolve, reject) ->\n\t\t\tcb(reject, resolve)\n\t\t)(objectApiName, query)\n\nobjectUpdate = (objectApiName, id, data) ->\n\treturn Meteor.wrapAsync((objectApiName, id, data, cb) ->\n\t\tobjectql.getObject(objectApiName).update(id, data).then (resolve, reject) ->\n\t\t\tcb(reject, resolve)\n\t\t)(objectApiName, id, data)\n\ngetRelatedObjectFieldCode = (relatedObjectsKeys, key) ->\n\treturn _.find relatedObjectsKeys, (relatedObjectsKey) ->\n\t\treturn key.startsWith(relatedObjectsKey + '.')\n\ngetFormTableFieldCode = (formTableFieldsCode, key) ->\n\treturn _.find formTableFieldsCode, (formTableFieldCode) ->\n\t\treturn key.startsWith(formTableFieldCode + '.')\n\ngetFormTableField = (formTableFields, key) ->\n\treturn _.find formTableFields, (f) ->\n\t\treturn f.code == key\n\ngetFormField = (formFields, key) ->\n\tff = null\n\t_.forEach formFields, (f) ->\n\t\tif ff\n\t\t\treturn\n\t\tif f.type == 'section'\n\t\t\tff = _.find f.fields, (sf) ->\n\t\t\t\treturn sf.code == key\n\t\telse if f.code == key\n\t\t\tff = f\n\n\treturn ff\n\ngetFormTableSubField = (tableField, subFieldCode) ->\n\treturn _.find tableField.fields, (f) ->\n\t\treturn f.code == subFieldCode\n\ngetFieldOdataValue = (objName, id, referenceToFieldName) ->\n\t# obj = Creator.getCollection(objName)\n\tobj = objectql.getObject(objName)\n\tnameKey = getObjectNameFieldKey(objName)\n\tif !obj\n\t\treturn\n\tif _.isString id\n\t\t# _record = obj.findOne(id)\n\t\t_record = objectFindOne(objName, { filters: [[referenceToFieldName, '=', id]]})\n\t\tif _record\n\t\t\t_record['@label'] = _record[nameKey]\n\t\t\treturn _record\n\telse if _.isArray id\n\t\t_records = []\n\t\t# obj.find({ _id: { $in: id } })\n\t\tobjectFind(objName, { filters: [[referenceToFieldName, 'in', id]]}).forEach (_record) ->\n\t\t\t_record['@label'] = _record[nameKey]\n\t\t\t_records.push _record\n\t\tif !_.isEmpty _records\n\t\t\treturn _records\n\treturn\n\ngetSelectUserValue = (userId, spaceId) ->\n\tsu = Creator.getCollection('space_users').findOne({ space: spaceId, user: userId })\n\tsu.id = userId\n\treturn su\n\ngetSelectUserValues = (userIds, spaceId) ->\n\tsus = []\n\tif _.isArray userIds\n\t\t_.each userIds, (userId) ->\n\t\t\tsu = getSelectUserValue(userId, spaceId)\n\t\t\tif su\n\t\t\t\tsus.push(su)\n\treturn sus\n\ngetSelectOrgValue = (orgId, spaceId) ->\n\torg = Creator.getCollection('organizations').findOne(orgId, { fields: { _id: 1, name: 1, fullname: 1 } })\n\torg.id = orgId\n\treturn org\n\ngetSelectOrgValues = (orgIds, spaceId) ->\n\torgs = []\n\tif _.isArray orgIds\n\t\t_.each orgIds, (orgId) ->\n\t\t\torg = getSelectOrgValue(orgId, spaceId)\n\t\t\tif org\n\t\t\t\torgs.push(org)\n\treturn orgs\n\ngetFileFieldValue = (recordFieldId, fType)->\n\tif _.isEmpty(recordFieldId)\n\t\treturn \n\tif fType == 'image'\n\t\tcollection = 'images'\n\telse if fType == 'file'\n\t\tcollection = 'files'\n\tif _.isString(recordFieldId)\n\t\tquery = {_id: {$in: [recordFieldId]}}\n\telse\n\t\tquery = {_id: {$in: recordFieldId}}\n\tfiles = Creator.Collections[\"cfs.#{collection}.filerecord\"].find(query);\n\tvalue = []\n\tfiles.forEach (f) ->\n\t\tnewFile = new FS.File()\n\t\tnewFile.attachData f.createReadStream('files'), {\n\t\t\t\ttype: f.original.type\n\t\t}, (err) ->\n\t\t\tif (err)\n\t\t\t\tthrow new Meteor.Error(err.error, err.reason)\n\n\t\t\tnewFile.name(f.name())\n\t\t\tnewFile.size(f.size())\n\t\t\tmetadata = {\n\t\t\t\towner: f.metadata.owner\n\t\t\t}\n\t\t\tnewFile.metadata = metadata;\n\t\t\tnewFile._id = Creator.Collections.instances._makeNewID();\n\t\t\tcfs[collection].insert(newFile);\n\t\t\tvalue.push(newFile._id)\n\tif value.length > 0\n\t\tif _.isString(recordFieldId)\n\t\t\treturn value[0]\n\t\telse\n\t\t\treturn value;\n\ngetInstanceFieldValue = (objField, formField, record, object_field, spaceId, recordFieldValue, enableAmisform) ->\n\n\tif enableAmisform && formField.steedos_field\n\t\treturn recordFieldValue\n\n\trecordFieldValue = record[objField.name]\n\tvalue\n\t# lookup、master_detail字段同步到odata字段\n\tif formField && objField && formField.type == 'odata' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)\n\t\treferenceToFieldName = objField.reference_to_field || '_id'\n\t\treferenceToObjectName = objField.reference_to\n\t\todataFieldValue\n\t\tif objField.multiple && formField.is_multiselect\n\t\t\todataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName)\n\t\telse if !objField.multiple && !formField.is_multiselect\n\t\t\todataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName)\n\t\tvalue = odataFieldValue\n\telse if formField && objField && ['user', 'group'].includes(formField.type) && ['lookup', 'master_detail'].includes(objField.type) && (['users', 'organizations'].includes(objField.reference_to) || ('space_users' == objField.reference_to && 'user' == objField.reference_to_field) )\n\t\tif !_.isEmpty(recordFieldValue)\n\t\t\tselectFieldValue\n\t\t\tif formField.type == 'user'\n\t\t\t\tif objField.multiple && formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectUserValues(recordFieldValue, spaceId)\n\t\t\t\telse if !objField.multiple && !formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectUserValue(recordFieldValue, spaceId)\n\t\t\telse if formField.type == 'group'\n\t\t\t\tif objField.multiple && formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectOrgValues(recordFieldValue, spaceId)\n\t\t\t\telse if !objField.multiple && !formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectOrgValue(recordFieldValue, spaceId)\n\t\t\tif selectFieldValue\n\t\t\t\tvalue = selectFieldValue\n\telse if formField && objField && formField.type == 'date' && recordFieldValue\n\t\tvalue = uuflowManagerForInitApproval.formatDate(recordFieldValue) # Date转String\n\telse if formField && objField && recordFieldValue && (formField.type == 'image' || formField.type == 'file')\n\t\tvalue = getFileFieldValue(recordFieldValue, formField.type)\n\telse if formField && objField && recordFieldValue && formField.type == 'lookup' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)\n\t\tvalue = recordFieldValue\n\telse if formField && objField && recordFieldValue && (formField.type == 'multiSelect')\n\t\tvalue = recordFieldValue.join(',')\n\telse if record.hasOwnProperty(object_field)\n\t\tvalue = recordFieldValue\n\t\n\treturn value\n\n# requiredDetails结构[\"子表名.子表中master_detail字段名\", ...]\ncheckRequiredDetails = (requiredDetails, masterRecord) ->\n\tif !_.isEmpty requiredDetails\n\t\t# 检查子表必填,即子表必须有记录\n\t\trequiredDetails.forEach (rd) ->\n\t\t\tsubTableName = rd.split('.')[0]\n\t\t\tsubTableMasterField = rd.split('.')[1]\n\t\t\tsubObjConfig = getObjectConfig subTableName\n\t\t\tmasterField = subObjConfig.fields[subTableMasterField]\n\t\t\trefId = masterField.reference_to_field || '_id'\n\t\t\tmasterFieldValue = masterRecord[refId]\n\t\t\t# 查询子表记录\n\t\t\tsubTableRecord = objectFindOne(subTableName, { filters: [[subTableMasterField, '=', masterFieldValue]], fields: [subTableMasterField] })\n\t\t\tif !subTableRecord\n\t\t\t\tthrow new Error \"请先新增#{subObjConfig.label}\"\n\t\treturn\n\nuuflowManagerForInitApproval = {}\n\nuuflowManagerForInitApproval.check_authorization = (req) ->\n\tquery = req.query\n\tuserId = query[\"X-User-Id\"]\n\tauthToken = query[\"X-Auth-Token\"]\n\n\tif not userId or not authToken\n\t\tthrow new Meteor.Error 401, 'Unauthorized'\n\n\thashedToken = Accounts._hashLoginToken(authToken)\n\tuser = Meteor.users.findOne\n\t\t_id: userId,\n\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\n\tif not user\n\t\tthrow new Meteor.Error 401, 'Unauthorized'\n\n\treturn user\n\nuuflowManagerForInitApproval.getSpace = (space_id) ->\n\tspace = Creator.Collections.spaces.findOne(space_id)\n\tif not space\n\t\tthrow new Meteor.Error('error!', \"space_id有误或此space已经被删除\")\n\treturn space\n\nuuflowManagerForInitApproval.getFlow = (flow_id) ->\n\tflow = Creator.Collections.flows.findOne(flow_id)\n\tif not flow\n\t\tthrow new Meteor.Error('error!', \"id有误或此流程已经被删除\")\n\treturn flow\n\nuuflowManagerForInitApproval.getSpaceUser = (space_id, user_id) ->\n\tspace_user = Creator.Collections.space_users.findOne({ space: space_id, user: user_id })\n\tif not space_user\n\t\tthrow new Meteor.Error('error!', \"user_id对应的用户不属于当前space\")\n\treturn space_user\n\nuuflowManagerForInitApproval.getSpaceUserOrgInfo = (space_user) ->\n\tinfo = new Object\n\tinfo.organization = space_user.organization\n\torg = Creator.Collections.organizations.findOne(space_user.organization, { fields: { name: 1 , fullname: 1 } })\n\tinfo.organization_name = org.name\n\tinfo.organization_fullname = org.fullname\n\treturn info\n\nuuflowManagerForInitApproval.isFlowEnabled = (flow) ->\n\tif flow.state isnt \"enabled\"\n\t\tthrow new Meteor.Error('error!', \"流程未启用,操作失败\")\n\nuuflowManagerForInitApproval.isFlowSpaceMatched = (flow, space_id) ->\n\tif flow.space isnt space_id\n\t\tthrow new Meteor.Error('error!', \"流程和工作区ID不匹配\")\n\nuuflowManagerForInitApproval.getForm = (form_id) ->\n\tform = Creator.Collections.forms.findOne(form_id)\n\tif not form\n\t\tthrow new Meteor.Error('error!', '表单ID有误或此表单已经被删除')\n\n\treturn form\n\nuuflowManagerForInitApproval.getCategory = (category_id) ->\n\treturn Creator.Collections.categories.findOne(category_id)\n\nuuflowManagerForInitApproval.checkSyncDirection = (object_name, flow_id) ->\n\tow = Creator.Collections.object_workflows.findOne({\n\t\tobject_name: object_name,\n\t\tflow_id: flow_id\n\t})\n\tif !ow\n\t\tthrow new Meteor.Error('error!', '未找到对象流程映射记录。')\n\tsyncDirection = ow.sync_direction || 'both'\n\tif !['both', 'obj_to_ins'].includes(syncDirection)\n\t\tthrow new Meteor.Error('error!', '不支持的同步方向。')\n\n\treturn \n\nuuflowManagerForInitApproval.create_instance = (instance_from_client, user_info) ->\n\tcheck instance_from_client[\"applicant\"], String\n\tcheck instance_from_client[\"space\"], String\n\tcheck instance_from_client[\"flow\"], String\n\tcheck instance_from_client[\"record_ids\"], [{o: String, ids: [String]}]\n\n\t# 校验同步方向\n\tuuflowManagerForInitApproval.checkSyncDirection(instance_from_client[\"record_ids\"][0].o, instance_from_client[\"flow\"])\n\n\t# 校验是否record已经发起的申请还在审批中\n\tuuflowManagerForInitApproval.checkIsInApproval(instance_from_client[\"record_ids\"][0], instance_from_client[\"space\"])\n\n\tspace_id = instance_from_client[\"space\"]\n\tflow_id = instance_from_client[\"flow\"]\n\tuser_id = user_info._id\n\t# 获取前台所传的trace\n\ttrace_from_client = null\n\t# 获取前台所传的approve\n\tapprove_from_client = null\n\tif instance_from_client[\"traces\"] and instance_from_client[\"traces\"][0]\n\t\ttrace_from_client = instance_from_client[\"traces\"][0]\n\t\tif trace_from_client[\"approves\"] and trace_from_client[\"approves\"][0]\n\t\t\tapprove_from_client = instance_from_client[\"traces\"][0][\"approves\"][0]\n\n\t# 获取一个space\n\tspace = uuflowManagerForInitApproval.getSpace(space_id)\n\t# 获取一个flow\n\tflow = uuflowManagerForInitApproval.getFlow(flow_id)\n\t# 获取一个space下的一个user\n\tspace_user = uuflowManagerForInitApproval.getSpaceUser(space_id, user_id)\n\t# 获取space_user所在的部门信息\n\tspace_user_org_info = uuflowManagerForInitApproval.getSpaceUserOrgInfo(space_user)\n\t# 判断一个flow是否为启用状态\n\tuuflowManagerForInitApproval.isFlowEnabled(flow)\n\t# 判断一个flow和space_id是否匹配\n\tuuflowManagerForInitApproval.isFlowSpaceMatched(flow, space_id)\n\n\tform = uuflowManagerForInitApproval.getForm(flow.form)\n\n\tpermissions = permissionManager.getFlowPermissions(flow_id, user_id)\n\n\tif not permissions.includes(\"add\")\n\t\tthrow new Meteor.Error('error!', \"当前用户没有此流程的新建权限\")\n\n\tnow = new Date\n\tins_obj = {}\n\tins_obj._id = Creator.Collections.instances._makeNewID()\n\tins_obj.space = space_id\n\tins_obj.flow = flow_id\n\tins_obj.flow_version = flow.current._id\n\tins_obj.form = flow.form\n\tins_obj.form_version = flow.current.form_version\n\tins_obj.name = flow.name\n\tins_obj.submitter = user_id\n\tins_obj.submitter_name = user_info.name\n\tins_obj.applicant = if instance_from_client[\"applicant\"] then instance_from_client[\"applicant\"] else user_id\n\tins_obj.applicant_name = if instance_from_client[\"applicant_name\"] then instance_from_client[\"applicant_name\"] else user_info.name\n\tins_obj.applicant_organization = if instance_from_client[\"applicant_organization\"] then instance_from_client[\"applicant_organization\"] else space_user.organization\n\tins_obj.applicant_organization_name = if instance_from_client[\"applicant_organization_name\"] then instance_from_client[\"applicant_organization_name\"] else space_user_org_info.organization_name\n\tins_obj.applicant_organization_fullname = if instance_from_client[\"applicant_organization_fullname\"] then instance_from_client[\"applicant_organization_fullname\"] else space_user_org_info.organization_fullname\n\tins_obj.applicant_company = if instance_from_client[\"applicant_company\"] then instance_from_client[\"applicant_company\"] else space_user.company_id\n\tins_obj.state = 'draft'\n\tins_obj.code = ''\n\tins_obj.is_archived = false\n\tins_obj.is_deleted = false\n\tins_obj.created = now\n\tins_obj.created_by = user_id\n\tins_obj.modified = now\n\tins_obj.modified_by = user_id\n\n\tins_obj.record_ids = instance_from_client[\"record_ids\"]\n\n\tif space_user.company_id\n\t\tins_obj.company_id = space_user.company_id\n\n\t# 新建Trace\n\ttrace_obj = {}\n\ttrace_obj._id = new Mongo.ObjectID()._str\n\ttrace_obj.instance = ins_obj._id\n\ttrace_obj.is_finished = false\n\t# 当前最新版flow中开始节点\n\tstart_step = _.find(flow.current.steps, (step) ->\n\t\treturn step.step_type is 'start'\n\t)\n\ttrace_obj.step = start_step._id\n\ttrace_obj.name = start_step.name\n\n\ttrace_obj.start_date = now\n\t# 新建Approve\n\tappr_obj = {}\n\tappr_obj._id = new Mongo.ObjectID()._str\n\tappr_obj.instance = ins_obj._id\n\tappr_obj.trace = trace_obj._id\n\tappr_obj.is_finished = false\n\tappr_obj.user = if instance_from_client[\"applicant\"] then instance_from_client[\"applicant\"] else user_id\n\tappr_obj.user_name = if instance_from_client[\"applicant_name\"] then instance_from_client[\"applicant_name\"] else user_info.name\n\tappr_obj.handler = user_id\n\tappr_obj.handler_name = user_info.name\n\tappr_obj.handler_organization = space_user.organization\n\tappr_obj.handler_organization_name = space_user_org_info.name\n\tappr_obj.handler_organization_fullname = space_user_org_info.fullname\n\tappr_obj.type = 'draft'\n\tappr_obj.start_date = now\n\tappr_obj.read_date = now\n\tappr_obj.is_read = true\n\tappr_obj.is_error = false\n\tappr_obj.description = ''\n\trelatedTablesInfo = {}\n\tappr_obj.values = uuflowManagerForInitApproval.initiateValues(ins_obj.record_ids[0], flow_id, space_id, form.current.fields, relatedTablesInfo)\n\n\ttrace_obj.approves = [appr_obj]\n\tins_obj.traces = [trace_obj]\n\n\tins_obj.values = appr_obj.values\n\n\tins_obj.inbox_users = instance_from_client.inbox_users || []\n\n\tins_obj.current_step_name = start_step.name\n\n\tif flow.auto_remind is true\n\t\tins_obj.auto_remind = true\n\n\t# 新建申请单时,instances记录流程名称、流程分类名称 #1313\n\tins_obj.flow_name = flow.name\n\tif form.category\n\t\tcategory = uuflowManagerForInitApproval.getCategory(form.category)\n\t\tif category\n\t\t\tins_obj.category_name = category.name\n\t\t\tins_obj.category = category._id\n\n\tnew_ins_id = Creator.Collections.instances.insert(ins_obj)\n\n\tuuflowManagerForInitApproval.initiateRecordInstanceInfo(ins_obj.record_ids[0], new_ins_id, space_id)\n\n\t# uuflowManagerForInitApproval.initiateRelatedRecordInstanceInfo(relatedTablesInfo, new_ins_id, space_id)\n\n\tuuflowManagerForInitApproval.initiateAttach(ins_obj.record_ids[0], space_id, ins_obj._id, appr_obj._id)\n\n\treturn new_ins_id\n\nuuflowManagerForInitApproval.initiateValues = (recordIds, flowId, spaceId, fields, relatedTablesInfo) ->\n\tfieldCodes = []\n\t_.each fields, (f) ->\n\t\tif f.type == 'section'\n\t\t\t_.each f.fields, (ff) ->\n\t\t\t\tfieldCodes.push ff.code\n\t\telse\n\t\t\tfieldCodes.push f.code\n\n\tvalues = {}\n\tobjectName = recordIds.o\n\tobject = getObjectConfig(objectName)\n\trecordId = recordIds.ids[0]\n\tow = Creator.Collections.object_workflows.findOne({\n\t\tobject_name: objectName,\n\t\tflow_id: flowId\n\t})\n\t# record = Creator.getCollection(objectName, spaceId).findOne(recordId)\n\trecord = objectFindOne(objectName, { filters: [['_id', '=', recordId]]})\n\tflow = Creator.getCollection('flows').findOne(flowId, { fields: { form: 1, enableAmisform: 1 } })\n\tenableAmisform = flow.enable_amisform\n\tif ow and record\n\t\trequiredDetails = ow.required_details || []\n\t\tcheckRequiredDetails(requiredDetails, record)\n\n\t\tform = Creator.getCollection(\"forms\").findOne(flow.form)\n\t\tformFields = form.current.fields || []\n\t\trelatedObjects = getRelateds(objectName)\n\t\trelatedObjectsKeys = _.pluck(relatedObjects, 'object_name')\n\t\tformTableFields = _.filter formFields, (formField) ->\n\t\t\treturn formField.type == 'table'\n\t\tformTableFieldsCode = _.pluck(formTableFields, 'code')\n\n\t\t# steedos field 中定义的grid、table类型字段\n\t\ttableFieldCodes = []\n\t\ttableFieldMap = []\n\t\t# 相关表\n\t\ttableToRelatedMap = {}\n\n\t\t# field_map: 从台账到审批单的字段同步映射规则\n\t\tow.field_map?.forEach (fm) ->\n\t\t\tobject_field = fm.object_field\n\t\t\tworkflow_field = fm.workflow_field\n\t\t\tif !object_field || !workflow_field\n\t\t\t\tthrow new Meteor.Error(400, '未找到字段,请检查对象流程映射字段配置')\n\t\t\trelatedObjectFieldCode = getRelatedObjectFieldCode(relatedObjectsKeys, object_field)\n\t\t\tformTableFieldCode = getFormTableFieldCode(formTableFieldsCode, workflow_field)\n\t\t\tobjField = object.fields[object_field]\n\t\t\tformField = getFormField(formFields, workflow_field)\n\t\t\trecordFieldValue = record[object_field]\n\t\t\t# 处理子表字段\n\t\t\tif relatedObjectFieldCode\n\t\t\t\t\n\t\t\t\toTableCode = object_field.split('.')[0]\n\t\t\t\toTableFieldCode = object_field.split('.')[1]\n\t\t\t\ttableToRelatedMapKey = oTableCode\n\t\t\t\tif !tableToRelatedMap[tableToRelatedMapKey]\n\t\t\t\t\ttableToRelatedMap[tableToRelatedMapKey] = {}\n\n\t\t\t\tif formTableFieldCode\n\t\t\t\t\twTableCode = workflow_field.split('.')[0]\n\t\t\t\t\ttableToRelatedMap[tableToRelatedMapKey]['_FROM_TABLE_CODE'] = wTableCode\n\n\t\t\t\ttableToRelatedMap[tableToRelatedMapKey][oTableFieldCode] = workflow_field\n\t\t\t# 判断是否是表格字段(object field 的 grid、table)\n\t\t\telse if workflow_field.indexOf('.') > 0 and object_field.indexOf('.$.') > 0\n\t\t\t\twTableCode = workflow_field.split('.')[0]\n\t\t\t\toTableCode = object_field.split('.$.')[0] ref1.table1.$.name\n\t\t\t\tif record.hasOwnProperty(oTableCode) and _.isArray(record[oTableCode])\n\t\t\t\t\ttableFieldCodes.push(JSON.stringify({\n\t\t\t\t\t\tworkflow_table_field_code: wTableCode,\n\t\t\t\t\t\tobject_table_field_code: oTableCode\n\t\t\t\t\t}))\n\t\t\t\t\ttableFieldMap.push(fm)\n\t\t\t\telse if oTableCode.indexOf('.') > 0 # 说明是关联表的grid字段\n\t\t\t\t\toTableCodeReferenceFieldCode = oTableCode.split('.')[0];\n\t\t\t\t\tgridCode = oTableCode.split('.')[1];\n\t\t\t\t\toTableCodeReferenceField = object.fields[oTableCodeReferenceFieldCode];\n\t\t\t\t\tif oTableCodeReferenceField && ['lookup', 'master_detail'].includes(oTableCodeReferenceField.type) && _.isString(oTableCodeReferenceField.reference_to)\n\t\t\t\t\t\tif record[oTableCode]\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\treferenceToFieldName = oTableCodeReferenceField.reference_to_field || '_id';\n\t\t\t\t\t\treferenceToObjectName = oTableCodeReferenceField.reference_to;\n\t\t\t\t\t\treferenceToFieldValue = record[oTableCodeReferenceField.name];\n\t\t\t\t\t\t# 此处借助getFieldOdataValue函数的能力, 获取关联表(lookup)的记录. 此处未未考虑lookup单选的情况. 此处获取关系数据的所有字段, 交由下方的表格数据同步统一整理数据\n\t\t\t\t\t\treferenceToDoc = getFieldOdataValue(referenceToObjectName, referenceToFieldValue, referenceToFieldName);\n\t\t\t\t\t\tif referenceToDoc[gridCode]\n\t\t\t\t\t\t\trecord[oTableCode] = referenceToDoc[gridCode];\n\t\t\t\t\t\t\ttableFieldCodes.push(JSON.stringify({\n\t\t\t\t\t\t\t\tworkflow_table_field_code: wTableCode,\n\t\t\t\t\t\t\t\tobject_table_field_code: oTableCode\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\treturn tableFieldMap.push(fm);\n\n\t\t\t# 处理lookup、master_detail类型字段\n\t\t\telse if object_field.indexOf('.') > 0 and object_field.indexOf('.$.') == -1\n\t\t\t\tobjectFieldName = object_field.split('.')[0]\n\t\t\t\tlookupFieldName = object_field.split('.')[1]\n\t\t\t\tif object\n\t\t\t\t\tobjectField = object.fields[objectFieldName]\n\t\t\t\t\tif objectField && formField && ['lookup', 'master_detail'].includes(objectField.type) && _.isString(objectField.reference_to)\n\t\t\t\t\t\tlookupObjectRecord = objectFindOne(objectField.reference_to, { filters: [['_id', '=', record[objectFieldName]]], fields: [lookupFieldName] })\n\t\t\t\t\t\tif !lookupObjectRecord\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tobjectFieldObjectName = objectField.reference_to\n\t\t\t\t\t\tlookupFieldObj = getObjectConfig(objectFieldObjectName)\n\t\t\t\t\t\tobjectLookupField = lookupFieldObj.fields[lookupFieldName]\n\n\t\t\t\t\t\tvalues[workflow_field] = getInstanceFieldValue(objectLookupField, formField, lookupObjectRecord, lookupFieldName, spaceId, record[lookupFieldName], enableAmisform)\n\t\t\telse\n\t\t\t\tvalues[workflow_field] = getInstanceFieldValue(objField, formField, record, object_field, spaceId, record[object_field], enableAmisform)\n\n\t\t# 表格字段\n\t\t_.uniq(tableFieldCodes).forEach (tfc) ->\n\t\t\tc = JSON.parse(tfc)\n\t\t\tvalues[c.workflow_table_field_code] = []\n\t\t\trecord[c.object_table_field_code].forEach (tr) ->\n\t\t\t\tnewTr = {}\n\t\t\t\t_.each tr, (tdValue, k) ->\n\t\t\t\t\ttableFieldMap.forEach (tfm) ->\n\t\t\t\t\t\tif tfm.object_field is (c.object_table_field_code + '.$.' + k)\n\t\t\t\t\t\t\twTdCode = tfm.workflow_field.split('.')[1]\n\t\t\t\t\t\t\tnewTr[wTdCode] = tdValue\n\t\t\t\tif not _.isEmpty(newTr)\n\t\t\t\t\tvalues[c.workflow_table_field_code].push(newTr)\n\n\t\t# 同步子表数据至表单表格\n\t\t_.each tableToRelatedMap, (map, key) ->\n\t\t\ttableCode = map._FROM_TABLE_CODE\n\t\t\tformTableField = getFormTableField(formTableFields, tableCode)\n\t\t\tif !tableCode\n\t\t\t\tconsole.warn('tableToRelated: [' + key + '] missing corresponding table.')\n\t\t\telse\n\t\t\t\trelatedObjectName = key\n\t\t\t\ttableValues = []\n\t\t\t\trelatedTableItems = []\n\t\t\t\trelatedObject = getObjectConfig(relatedObjectName)\n\t\t\t\trelatedField = _.find relatedObject.fields, (f) ->\n\t\t\t\t\treturn ['lookup', 'master_detail'].includes(f.type) && f.reference_to == objectName\n\n\t\t\t\trelatedFieldName = relatedField.name\n\n\t\t\t\trelatedRecords = objectFind(relatedObjectName, {\n\t\t\t\t\tfilters: [\n\t\t\t\t\t\t[relatedFieldName, '=', recordId]\n\t\t\t\t\t]\n\t\t\t\t})\n\n\t\t\t\trelatedRecords.forEach (relatedRecord) ->\n\t\t\t\t\ttableValueItem = {}\n\t\t\t\t\t_.each map, (valueKey, fieldKey) ->\n\t\t\t\t\t\tif fieldKey != '_FROM_TABLE_CODE'\n\t\t\t\t\t\t\ttableFieldValue\n\t\t\t\t\t\t\tformFieldKey\n\t\t\t\t\t\t\tif valueKey.startsWith(tableCode + '.')\n\t\t\t\t\t\t\t\tformFieldKey = (valueKey.split(\".\")[1])\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tformFieldKey = valueKey\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tformField = getFormTableSubField(formTableField, formFieldKey)\n\t\t\t\t\t\t\trelatedObjectField = relatedObject.fields[fieldKey]\n\t\t\t\t\t\t\tif !formField || !relatedObjectField\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\ttableFieldValue = getInstanceFieldValue(relatedObjectField, formField, relatedRecord, fieldKey, spaceId, relatedRecord[fieldKey], enableAmisform)\n\t\t\t\t\t\t\ttableValueItem[formFieldKey] = tableFieldValue\n\t\t\t\t\tif !_.isEmpty(tableValueItem)\n\t\t\t\t\t\ttableValueItem._id = relatedRecord._id\n\t\t\t\t\t\ttableValues.push(tableValueItem)\n\t\t\t\t\t\trelatedTableItems.push({ _table: { _id: relatedRecord._id, _code: tableCode } } )\n\n\t\t\t\tvalues[tableCode] = tableValues\n\t\t\t\trelatedTablesInfo[relatedObjectName] = relatedTableItems\n\n\t\t# 如果配置了脚本则执行脚本\n\t\tif ow.field_map_script\n\t\t\t_.extend(values, uuflowManagerForInitApproval.evalFieldMapScript(ow.field_map_script, objectName, spaceId, recordId))\n\n\t# 过滤掉values中的非法key\n\tfilterValues = {}\n\t_.each _.keys(values), (k) ->\n\t\tif fieldCodes.includes(k)\n\t\t\tfilterValues[k] = values[k]\n\n\treturn filterValues\n\nuuflowManagerForInitApproval.evalFieldMapScript = (field_map_script, objectName, spaceId, objectId) ->\n\t# record = Creator.getCollection(objectName, spaceId).findOne(objectId)\n\trecord = objectFindOne(objectName, { filters: [['_id', '=', objectId]] })\n\tscript = \"module.exports = function (record) { \" + field_map_script + \" }\"\n\tfunc = _eval(script, \"field_map_script\")\n\tvalues = func(record)\n\tif _.isObject values\n\t\treturn values\n\telse\n\t\tconsole.error \"evalFieldMapScript: 脚本返回值类型不是对象\"\n\treturn {}\n\n\n\nuuflowManagerForInitApproval.initiateAttach = (recordIds, spaceId, insId, approveId) ->\n\n\tCreator.Collections['cms_files'].find({\n\t\tspace: spaceId,\n\t\tparent: recordIds\n\t}).forEach (cf) ->\n\t\t_.each cf.versions, (versionId, idx) ->\n\t\t\tf = Creator.Collections['cfs.files.filerecord'].findOne(versionId)\n\t\t\tnewFile = new FS.File()\n\n\t\t\tnewFile.attachData f.createReadStream('files'), {\n\t\t\t\t\ttype: f.original.type\n\t\t\t}, (err) ->\n\t\t\t\tif (err)\n\t\t\t\t\tthrow new Meteor.Error(err.error, err.reason)\n\n\t\t\t\tnewFile.name(f.name())\n\t\t\t\tnewFile.size(f.size())\n\t\t\t\tmetadata = {\n\t\t\t\t\towner: f.metadata.owner,\n\t\t\t\t\towner_name: f.metadata.owner_name,\n\t\t\t\t\tspace: spaceId,\n\t\t\t\t\tinstance: insId,\n\t\t\t\t\tapprove: approveId\n\t\t\t\t\tparent: cf._id\n\t\t\t\t}\n\n\t\t\t\tif idx is 0\n\t\t\t\t\tmetadata.current = true\n\n\t\t\t\tnewFile.metadata = metadata\n\t\t\t\tcfs.instances.insert(newFile)\n\n\treturn\n\nuuflowManagerForInitApproval.initiateRecordInstanceInfo = (recordIds, insId, spaceId) ->\n\t# Creator.getCollection(recordIds.o, spaceId).update(recordIds.ids[0], {\n\t# \t$push: {\n\t# \t\tinstances: {\n\t# \t\t\t$each: [{\n\t# \t\t\t\t_id: insId,\n\t# \t\t\t\tstate: 'draft'\n\t# \t\t\t}],\n\t# \t\t\t$position: 0\n\t# \t\t}\n\t# \t},\n\t# \t$set: {\n\t# \t\tlocked: true\n\t# \t\tinstance_state: 'draft'\n\t# \t}\n\t# })\n\tobjectUpdate(recordIds.o, recordIds.ids[0], {\n\t\tinstances: [{\n\t\t\t_id: insId,\n\t\t\tstate: 'draft'\n\t\t}],\n\t\tlocked: true,\n\t\tinstance_state: 'draft'\n\t})\n\n\treturn\n\n\nuuflowManagerForInitApproval.initiateRelatedRecordInstanceInfo = (relatedTablesInfo, insId, spaceId) ->\n\t_.each relatedTablesInfo, (tableItems, relatedObjectName) ->\n\t\trelatedCollection = Creator.getCollection(relatedObjectName, spaceId)\n\t\t_.each tableItems, (item) ->\n\t\t\trelatedCollection.direct.update(item._table._id, {\n\t\t\t\t$set: {\n\t\t\t\t\tinstances: [{\n\t\t\t\t\t\t_id: insId,\n\t\t\t\t\t\tstate: 'draft'\n\t\t\t\t\t}],\n\t\t\t\t\t_table: item._table\n\t\t\t\t}\n\t\t\t})\n\n\treturn\n\nuuflowManagerForInitApproval.checkIsInApproval = (recordIds, spaceId) ->\n\t# record = Creator.getCollection(recordIds.o, spaceId).findOne({\n\t# \t_id: recordIds.ids[0], instances: { $exists: true }\n\t# }, { fields: { instances: 1 } })\n\trecord = objectFindOne(recordIds.o, { filters: [['_id', '=', recordIds.ids[0]]], fields: ['instances'] })\n\n\tif record and record.instances and record.instances[0].state isnt 'completed' and Creator.Collections.instances.find(record.instances[0]._id).count() > 0\n\t\tthrow new Meteor.Error('error!', \"此记录已发起流程正在审批中,待审批结束方可发起下一次审批!\")\n\n\treturn\n\n\nuuflowManagerForInitApproval.formatDate = (date) ->\n\treturn moment(date).format(\"YYYY-MM-DD\")","var _eval, checkRequiredDetails, getFieldOdataValue, getFileFieldValue, getFormField, getFormTableField, getFormTableFieldCode, getFormTableSubField, getInstanceFieldValue, getObjectConfig, getObjectNameFieldKey, getRelatedObjectFieldCode, getRelateds, getSelectOrgValue, getSelectOrgValues, getSelectUserValue, getSelectUserValues, objectFind, objectFindOne, objectUpdate, objectql; \n\n_eval = require('eval');\n\nobjectql = require('@steedos/objectql');\n\ngetObjectConfig = function(objectApiName) {\n return objectql.getObject(objectApiName).toConfig();\n};\n\ngetObjectNameFieldKey = function(objectApiName) {\n return objectql.getObject(objectApiName).NAME_FIELD_KEY;\n};\n\ngetRelateds = function(objectApiName) {\n return Meteor.wrapAsync(function(objectApiName, cb) {\n return objectql.getObject(objectApiName).getRelateds().then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(objectApiName);\n};\n\nobjectFindOne = function(objectApiName, query) {\n return Meteor.wrapAsync(function(objectApiName, query, cb) {\n query.top = 1;\n return objectql.getObject(objectApiName).find(query).then(function(resolve, reject) {\n if (resolve && resolve.length > 0) {\n return cb(reject, resolve[0]);\n } else {\n return cb(reject, null);\n }\n });\n })(objectApiName, query);\n};\n\nobjectFind = function(objectApiName, query) {\n return Meteor.wrapAsync(function(objectApiName, query, cb) {\n return objectql.getObject(objectApiName).find(query).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(objectApiName, query);\n};\n\nobjectUpdate = function(objectApiName, id, data) {\n return Meteor.wrapAsync(function(objectApiName, id, data, cb) {\n return objectql.getObject(objectApiName).update(id, data).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(objectApiName, id, data);\n};\n\ngetRelatedObjectFieldCode = function(relatedObjectsKeys, key) {\n return _.find(relatedObjectsKeys, function(relatedObjectsKey) {\n return key.startsWith(relatedObjectsKey + '.');\n });\n};\n\ngetFormTableFieldCode = function(formTableFieldsCode, key) {\n return _.find(formTableFieldsCode, function(formTableFieldCode) {\n return key.startsWith(formTableFieldCode + '.');\n });\n};\n\ngetFormTableField = function(formTableFields, key) {\n return _.find(formTableFields, function(f) {\n return f.code === key;\n });\n};\n\ngetFormField = function(formFields, key) {\n var ff;\n ff = null;\n _.forEach(formFields, function(f) {\n if (ff) {\n return;\n }\n if (f.type === 'section') {\n return ff = _.find(f.fields, function(sf) {\n return sf.code === key;\n });\n } else if (f.code === key) {\n return ff = f;\n }\n });\n return ff;\n};\n\ngetFormTableSubField = function(tableField, subFieldCode) {\n return _.find(tableField.fields, function(f) {\n return f.code === subFieldCode;\n });\n};\n\ngetFieldOdataValue = function(objName, id, referenceToFieldName) {\n var _record, _records, nameKey, obj;\n obj = objectql.getObject(objName);\n nameKey = getObjectNameFieldKey(objName);\n if (!obj) {\n return;\n }\n if (_.isString(id)) {\n _record = objectFindOne(objName, {\n filters: [[referenceToFieldName, '=', id]]\n });\n if (_record) {\n _record['@label'] = _record[nameKey];\n return _record;\n }\n } else if (_.isArray(id)) {\n _records = [];\n objectFind(objName, {\n filters: [[referenceToFieldName, 'in', id]]\n }).forEach(function(_record) {\n _record['@label'] = _record[nameKey];\n return _records.push(_record);\n });\n if (!_.isEmpty(_records)) {\n return _records;\n }\n }\n};\n\ngetSelectUserValue = function(userId, spaceId) {\n var su;\n su = Creator.getCollection('space_users').findOne({\n space: spaceId,\n user: userId\n });\n su.id = userId;\n return su;\n};\n\ngetSelectUserValues = function(userIds, spaceId) {\n var sus;\n sus = [];\n if (_.isArray(userIds)) {\n _.each(userIds, function(userId) {\n var su;\n su = getSelectUserValue(userId, spaceId);\n if (su) {\n return sus.push(su);\n }\n });\n }\n return sus;\n};\n\ngetSelectOrgValue = function(orgId, spaceId) {\n var org;\n org = Creator.getCollection('organizations').findOne(orgId, {\n fields: {\n _id: 1,\n name: 1,\n fullname: 1\n }\n });\n org.id = orgId;\n return org;\n};\n\ngetSelectOrgValues = function(orgIds, spaceId) {\n var orgs;\n orgs = [];\n if (_.isArray(orgIds)) {\n _.each(orgIds, function(orgId) {\n var org;\n org = getSelectOrgValue(orgId, spaceId);\n if (org) {\n return orgs.push(org);\n }\n });\n }\n return orgs;\n};\n\ngetFileFieldValue = function(recordFieldId, fType) {\n var collection, files, query, value;\n if (_.isEmpty(recordFieldId)) {\n return;\n }\n if (fType === 'image') {\n collection = 'images';\n } else if (fType === 'file') {\n collection = 'files';\n }\n if (_.isString(recordFieldId)) {\n query = {\n _id: {\n $in: [recordFieldId]\n }\n };\n } else {\n query = {\n _id: {\n $in: recordFieldId\n }\n };\n }\n files = Creator.Collections[\"cfs.\" + collection + \".filerecord\"].find(query);\n value = [];\n files.forEach(function(f) {\n var newFile;\n newFile = new FS.File();\n return newFile.attachData(f.createReadStream('files'), {\n type: f.original.type\n }, function(err) {\n var metadata;\n if (err) {\n throw new Meteor.Error(err.error, err.reason);\n }\n newFile.name(f.name());\n newFile.size(f.size());\n metadata = {\n owner: f.metadata.owner\n };\n newFile.metadata = metadata;\n newFile._id = Creator.Collections.instances._makeNewID();\n cfs[collection].insert(newFile);\n return value.push(newFile._id);\n });\n });\n if (value.length > 0) {\n if (_.isString(recordFieldId)) {\n return value[0];\n } else {\n return value;\n }\n }\n};\n\ngetInstanceFieldValue = function(objField, formField, record, object_field, spaceId, recordFieldValue, enableAmisform) {\n var odataFieldValue, referenceToFieldName, referenceToObjectName, selectFieldValue, value;\n if (enableAmisform && formField.steedos_field) {\n return recordFieldValue;\n }\n recordFieldValue = record[objField.name];\n value;\n if (formField && objField && formField.type === 'odata' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)) {\n referenceToFieldName = objField.reference_to_field || '_id';\n referenceToObjectName = objField.reference_to;\n odataFieldValue;\n if (objField.multiple && formField.is_multiselect) {\n odataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName);\n } else if (!objField.multiple && !formField.is_multiselect) {\n odataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName);\n }\n value = odataFieldValue;\n } else if (formField && objField && ['user', 'group'].includes(formField.type) && ['lookup', 'master_detail'].includes(objField.type) && (['users', 'organizations'].includes(objField.reference_to) || ('space_users' === objField.reference_to && 'user' === objField.reference_to_field))) {\n if (!_.isEmpty(recordFieldValue)) {\n selectFieldValue;\n if (formField.type === 'user') {\n if (objField.multiple && formField.is_multiselect) {\n selectFieldValue = getSelectUserValues(recordFieldValue, spaceId);\n } else if (!objField.multiple && !formField.is_multiselect) {\n selectFieldValue = getSelectUserValue(recordFieldValue, spaceId);\n }\n } else if (formField.type === 'group') {\n if (objField.multiple && formField.is_multiselect) {\n selectFieldValue = getSelectOrgValues(recordFieldValue, spaceId);\n } else if (!objField.multiple && !formField.is_multiselect) {\n selectFieldValue = getSelectOrgValue(recordFieldValue, spaceId);\n }\n }\n if (selectFieldValue) {\n value = selectFieldValue;\n }\n }\n } else if (formField && objField && formField.type === 'date' && recordFieldValue) {\n value = uuflowManagerForInitApproval.formatDate(recordFieldValue);\n } else if (formField && objField && recordFieldValue && (formField.type === 'image' || formField.type === 'file')) {\n value = getFileFieldValue(recordFieldValue, formField.type);\n } else if (formField && objField && recordFieldValue && formField.type === 'lookup' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)) {\n value = recordFieldValue;\n } else if (formField && objField && recordFieldValue && (formField.type === 'multiSelect')) {\n value = recordFieldValue.join(',');\n } else if (record.hasOwnProperty(object_field)) {\n value = recordFieldValue;\n }\n return value;\n};\n\ncheckRequiredDetails = function(requiredDetails, masterRecord) {\n if (!_.isEmpty(requiredDetails)) {\n requiredDetails.forEach(function(rd) {\n var masterField, masterFieldValue, refId, subObjConfig, subTableMasterField, subTableName, subTableRecord;\n subTableName = rd.split('.')[0];\n subTableMasterField = rd.split('.')[1];\n subObjConfig = getObjectConfig(subTableName);\n masterField = subObjConfig.fields[subTableMasterField];\n refId = masterField.reference_to_field || '_id';\n masterFieldValue = masterRecord[refId];\n subTableRecord = objectFindOne(subTableName, {\n filters: [[subTableMasterField, '=', masterFieldValue]],\n fields: [subTableMasterField]\n });\n if (!subTableRecord) {\n throw new Error(\"请先新增\" + subObjConfig.label);\n }\n });\n }\n};\n\nuuflowManagerForInitApproval = {};\n\nuuflowManagerForInitApproval.check_authorization = function(req) {\n var authToken, hashedToken, query, user, userId;\n query = req.query;\n userId = query[\"X-User-Id\"];\n authToken = query[\"X-Auth-Token\"];\n if (!userId || !authToken) {\n throw new Meteor.Error(401, 'Unauthorized');\n }\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (!user) {\n throw new Meteor.Error(401, 'Unauthorized');\n }\n return user;\n};\n\nuuflowManagerForInitApproval.getSpace = function(space_id) {\n var space;\n space = Creator.Collections.spaces.findOne(space_id);\n if (!space) {\n throw new Meteor.Error('error!', \"space_id有误或此space已经被删除\");\n }\n return space;\n};\n\nuuflowManagerForInitApproval.getFlow = function(flow_id) {\n var flow;\n flow = Creator.Collections.flows.findOne(flow_id);\n if (!flow) {\n throw new Meteor.Error('error!', \"id有误或此流程已经被删除\");\n }\n return flow;\n};\n\nuuflowManagerForInitApproval.getSpaceUser = function(space_id, user_id) {\n var space_user;\n space_user = Creator.Collections.space_users.findOne({\n space: space_id,\n user: user_id\n });\n if (!space_user) {\n throw new Meteor.Error('error!', \"user_id对应的用户不属于当前space\");\n }\n return space_user;\n};\n\nuuflowManagerForInitApproval.getSpaceUserOrgInfo = function(space_user) {\n var info, org;\n info = new Object;\n info.organization = space_user.organization;\n org = Creator.Collections.organizations.findOne(space_user.organization, {\n fields: {\n name: 1,\n fullname: 1\n }\n });\n info.organization_name = org.name;\n info.organization_fullname = org.fullname;\n return info;\n};\n\nuuflowManagerForInitApproval.isFlowEnabled = function(flow) {\n if (flow.state !== \"enabled\") {\n throw new Meteor.Error('error!', \"流程未启用,操作失败\");\n }\n};\n\nuuflowManagerForInitApproval.isFlowSpaceMatched = function(flow, space_id) {\n if (flow.space !== space_id) {\n throw new Meteor.Error('error!', \"流程和工作区ID不匹配\");\n }\n};\n\nuuflowManagerForInitApproval.getForm = function(form_id) {\n var form;\n form = Creator.Collections.forms.findOne(form_id);\n if (!form) {\n throw new Meteor.Error('error!', '表单ID有误或此表单已经被删除');\n }\n return form;\n};\n\nuuflowManagerForInitApproval.getCategory = function(category_id) {\n return Creator.Collections.categories.findOne(category_id);\n};\n\nuuflowManagerForInitApproval.checkSyncDirection = function(object_name, flow_id) {\n var ow, syncDirection;\n ow = Creator.Collections.object_workflows.findOne({\n object_name: object_name,\n flow_id: flow_id\n });\n if (!ow) {\n throw new Meteor.Error('error!', '未找到对象流程映射记录。');\n }\n syncDirection = ow.sync_direction || 'both';\n if (!['both', 'obj_to_ins'].includes(syncDirection)) {\n throw new Meteor.Error('error!', '不支持的同步方向。');\n }\n};\n\nuuflowManagerForInitApproval.create_instance = function(instance_from_client, user_info) {\n var appr_obj, approve_from_client, category, flow, flow_id, form, ins_obj, new_ins_id, now, permissions, relatedTablesInfo, space, space_id, space_user, space_user_org_info, start_step, trace_from_client, trace_obj, user_id;\n check(instance_from_client[\"applicant\"], String);\n check(instance_from_client[\"space\"], String);\n check(instance_from_client[\"flow\"], String);\n check(instance_from_client[\"record_ids\"], [\n {\n o: String,\n ids: [String]\n }\n ]);\n uuflowManagerForInitApproval.checkSyncDirection(instance_from_client[\"record_ids\"][0].o, instance_from_client[\"flow\"]);\n uuflowManagerForInitApproval.checkIsInApproval(instance_from_client[\"record_ids\"][0], instance_from_client[\"space\"]);\n space_id = instance_from_client[\"space\"];\n flow_id = instance_from_client[\"flow\"];\n user_id = user_info._id;\n trace_from_client = null;\n approve_from_client = null;\n if (instance_from_client[\"traces\"] && instance_from_client[\"traces\"][0]) {\n trace_from_client = instance_from_client[\"traces\"][0];\n if (trace_from_client[\"approves\"] && trace_from_client[\"approves\"][0]) {\n approve_from_client = instance_from_client[\"traces\"][0][\"approves\"][0];\n }\n }\n space = uuflowManagerForInitApproval.getSpace(space_id);\n flow = uuflowManagerForInitApproval.getFlow(flow_id);\n space_user = uuflowManagerForInitApproval.getSpaceUser(space_id, user_id);\n space_user_org_info = uuflowManagerForInitApproval.getSpaceUserOrgInfo(space_user);\n uuflowManagerForInitApproval.isFlowEnabled(flow);\n uuflowManagerForInitApproval.isFlowSpaceMatched(flow, space_id);\n form = uuflowManagerForInitApproval.getForm(flow.form);\n permissions = permissionManager.getFlowPermissions(flow_id, user_id);\n if (!permissions.includes(\"add\")) {\n throw new Meteor.Error('error!', \"当前用户没有此流程的新建权限\");\n }\n now = new Date;\n ins_obj = {};\n ins_obj._id = Creator.Collections.instances._makeNewID();\n ins_obj.space = space_id;\n ins_obj.flow = flow_id;\n ins_obj.flow_version = flow.current._id;\n ins_obj.form = flow.form;\n ins_obj.form_version = flow.current.form_version;\n ins_obj.name = flow.name;\n ins_obj.submitter = user_id;\n ins_obj.submitter_name = user_info.name;\n ins_obj.applicant = instance_from_client[\"applicant\"] ? instance_from_client[\"applicant\"] : user_id;\n ins_obj.applicant_name = instance_from_client[\"applicant_name\"] ? instance_from_client[\"applicant_name\"] : user_info.name;\n ins_obj.applicant_organization = instance_from_client[\"applicant_organization\"] ? instance_from_client[\"applicant_organization\"] : space_user.organization;\n ins_obj.applicant_organization_name = instance_from_client[\"applicant_organization_name\"] ? instance_from_client[\"applicant_organization_name\"] : space_user_org_info.organization_name;\n ins_obj.applicant_organization_fullname = instance_from_client[\"applicant_organization_fullname\"] ? instance_from_client[\"applicant_organization_fullname\"] : space_user_org_info.organization_fullname;\n ins_obj.applicant_company = instance_from_client[\"applicant_company\"] ? instance_from_client[\"applicant_company\"] : space_user.company_id;\n ins_obj.state = 'draft';\n ins_obj.code = '';\n ins_obj.is_archived = false;\n ins_obj.is_deleted = false;\n ins_obj.created = now;\n ins_obj.created_by = user_id;\n ins_obj.modified = now;\n ins_obj.modified_by = user_id;\n ins_obj.record_ids = instance_from_client[\"record_ids\"];\n if (space_user.company_id) {\n ins_obj.company_id = space_user.company_id;\n }\n trace_obj = {};\n trace_obj._id = new Mongo.ObjectID()._str;\n trace_obj.instance = ins_obj._id;\n trace_obj.is_finished = false;\n start_step = _.find(flow.current.steps, function(step) {\n return step.step_type === 'start';\n });\n trace_obj.step = start_step._id;\n trace_obj.name = start_step.name;\n trace_obj.start_date = now;\n appr_obj = {};\n appr_obj._id = new Mongo.ObjectID()._str;\n appr_obj.instance = ins_obj._id;\n appr_obj.trace = trace_obj._id;\n appr_obj.is_finished = false;\n appr_obj.user = instance_from_client[\"applicant\"] ? instance_from_client[\"applicant\"] : user_id;\n appr_obj.user_name = instance_from_client[\"applicant_name\"] ? instance_from_client[\"applicant_name\"] : user_info.name;\n appr_obj.handler = user_id;\n appr_obj.handler_name = user_info.name;\n appr_obj.handler_organization = space_user.organization;\n appr_obj.handler_organization_name = space_user_org_info.name;\n appr_obj.handler_organization_fullname = space_user_org_info.fullname;\n appr_obj.type = 'draft';\n appr_obj.start_date = now;\n appr_obj.read_date = now;\n appr_obj.is_read = true;\n appr_obj.is_error = false;\n appr_obj.description = '';\n relatedTablesInfo = {};\n appr_obj.values = uuflowManagerForInitApproval.initiateValues(ins_obj.record_ids[0], flow_id, space_id, form.current.fields, relatedTablesInfo);\n trace_obj.approves = [appr_obj];\n ins_obj.traces = [trace_obj];\n ins_obj.values = appr_obj.values;\n ins_obj.inbox_users = instance_from_client.inbox_users || [];\n ins_obj.current_step_name = start_step.name;\n if (flow.auto_remind === true) {\n ins_obj.auto_remind = true;\n }\n ins_obj.flow_name = flow.name;\n if (form.category) {\n category = uuflowManagerForInitApproval.getCategory(form.category);\n if (category) {\n ins_obj.category_name = category.name;\n ins_obj.category = category._id;\n }\n }\n new_ins_id = Creator.Collections.instances.insert(ins_obj);\n uuflowManagerForInitApproval.initiateRecordInstanceInfo(ins_obj.record_ids[0], new_ins_id, space_id);\n uuflowManagerForInitApproval.initiateAttach(ins_obj.record_ids[0], space_id, ins_obj._id, appr_obj._id);\n return new_ins_id;\n};\n\nuuflowManagerForInitApproval.initiateValues = function(recordIds, flowId, spaceId, fields, relatedTablesInfo) {\n var enableAmisform, fieldCodes, filterValues, flow, form, formFields, formTableFields, formTableFieldsCode, object, objectName, ow, record, recordId, ref, relatedObjects, relatedObjectsKeys, requiredDetails, tableFieldCodes, tableFieldMap, tableToRelatedMap, values;\n fieldCodes = [];\n _.each(fields, function(f) {\n if (f.type === 'section') {\n return _.each(f.fields, function(ff) {\n return fieldCodes.push(ff.code);\n });\n } else {\n return fieldCodes.push(f.code);\n }\n });\n values = {};\n objectName = recordIds.o;\n object = getObjectConfig(objectName);\n recordId = recordIds.ids[0];\n ow = Creator.Collections.object_workflows.findOne({\n object_name: objectName,\n flow_id: flowId\n });\n record = objectFindOne(objectName, {\n filters: [['_id', '=', recordId]]\n });\n flow = Creator.getCollection('flows').findOne(flowId, {\n fields: {\n form: 1,\n enableAmisform: 1\n }\n });\n enableAmisform = flow.enable_amisform;\n if (ow && record) {\n requiredDetails = ow.required_details || [];\n checkRequiredDetails(requiredDetails, record);\n form = Creator.getCollection(\"forms\").findOne(flow.form);\n formFields = form.current.fields || [];\n relatedObjects = getRelateds(objectName);\n relatedObjectsKeys = _.pluck(relatedObjects, 'object_name');\n formTableFields = _.filter(formFields, function(formField) {\n return formField.type === 'table';\n });\n formTableFieldsCode = _.pluck(formTableFields, 'code');\n tableFieldCodes = [];\n tableFieldMap = [];\n tableToRelatedMap = {};\n if ((ref = ow.field_map) != null) {\n ref.forEach(function(fm) {\n var formField, formTableFieldCode, gridCode, lookupFieldName, lookupFieldObj, lookupObjectRecord, oTableCode, oTableCodeReferenceField, oTableCodeReferenceFieldCode, oTableFieldCode, objField, objectField, objectFieldName, objectFieldObjectName, objectLookupField, object_field, recordFieldValue, referenceToDoc, referenceToFieldName, referenceToFieldValue, referenceToObjectName, relatedObjectFieldCode, tableToRelatedMapKey, wTableCode, workflow_field;\n object_field = fm.object_field;\n workflow_field = fm.workflow_field;\n if (!object_field || !workflow_field) {\n throw new Meteor.Error(400, '未找到字段,请检查对象流程映射字段配置');\n }\n relatedObjectFieldCode = getRelatedObjectFieldCode(relatedObjectsKeys, object_field);\n formTableFieldCode = getFormTableFieldCode(formTableFieldsCode, workflow_field);\n objField = object.fields[object_field];\n formField = getFormField(formFields, workflow_field);\n recordFieldValue = record[object_field];\n if (relatedObjectFieldCode) {\n oTableCode = object_field.split('.')[0];\n oTableFieldCode = object_field.split('.')[1];\n tableToRelatedMapKey = oTableCode;\n if (!tableToRelatedMap[tableToRelatedMapKey]) {\n tableToRelatedMap[tableToRelatedMapKey] = {};\n }\n if (formTableFieldCode) {\n wTableCode = workflow_field.split('.')[0];\n tableToRelatedMap[tableToRelatedMapKey]['_FROM_TABLE_CODE'] = wTableCode;\n }\n return tableToRelatedMap[tableToRelatedMapKey][oTableFieldCode] = workflow_field;\n } else if (workflow_field.indexOf('.') > 0 && object_field.indexOf('.$.') > 0) {\n wTableCode = workflow_field.split('.')[0];\n oTableCode = object_field.split('.$.')[0](ref1.table1.$.name);\n if (record.hasOwnProperty(oTableCode) && _.isArray(record[oTableCode])) {\n tableFieldCodes.push(JSON.stringify({\n workflow_table_field_code: wTableCode,\n object_table_field_code: oTableCode\n }));\n return tableFieldMap.push(fm);\n } else if (oTableCode.indexOf('.') > 0) {\n oTableCodeReferenceFieldCode = oTableCode.split('.')[0];\n gridCode = oTableCode.split('.')[1];\n oTableCodeReferenceField = object.fields[oTableCodeReferenceFieldCode];\n if (oTableCodeReferenceField && ['lookup', 'master_detail'].includes(oTableCodeReferenceField.type) && _.isString(oTableCodeReferenceField.reference_to)) {\n if (record[oTableCode]) {\n return;\n }\n referenceToFieldName = oTableCodeReferenceField.reference_to_field || '_id';\n referenceToObjectName = oTableCodeReferenceField.reference_to;\n referenceToFieldValue = record[oTableCodeReferenceField.name];\n referenceToDoc = getFieldOdataValue(referenceToObjectName, referenceToFieldValue, referenceToFieldName);\n if (referenceToDoc[gridCode]) {\n record[oTableCode] = referenceToDoc[gridCode];\n tableFieldCodes.push(JSON.stringify({\n workflow_table_field_code: wTableCode,\n object_table_field_code: oTableCode\n }));\n return tableFieldMap.push(fm);\n }\n }\n }\n } else if (object_field.indexOf('.') > 0 && object_field.indexOf('.$.') === -1) {\n objectFieldName = object_field.split('.')[0];\n lookupFieldName = object_field.split('.')[1];\n if (object) {\n objectField = object.fields[objectFieldName];\n if (objectField && formField && ['lookup', 'master_detail'].includes(objectField.type) && _.isString(objectField.reference_to)) {\n lookupObjectRecord = objectFindOne(objectField.reference_to, {\n filters: [['_id', '=', record[objectFieldName]]],\n fields: [lookupFieldName]\n });\n if (!lookupObjectRecord) {\n return;\n }\n objectFieldObjectName = objectField.reference_to;\n lookupFieldObj = getObjectConfig(objectFieldObjectName);\n objectLookupField = lookupFieldObj.fields[lookupFieldName];\n return values[workflow_field] = getInstanceFieldValue(objectLookupField, formField, lookupObjectRecord, lookupFieldName, spaceId, record[lookupFieldName], enableAmisform);\n }\n }\n } else {\n return values[workflow_field] = getInstanceFieldValue(objField, formField, record, object_field, spaceId, record[object_field], enableAmisform);\n }\n });\n }\n _.uniq(tableFieldCodes).forEach(function(tfc) {\n var c;\n c = JSON.parse(tfc);\n values[c.workflow_table_field_code] = [];\n return record[c.object_table_field_code].forEach(function(tr) {\n var newTr;\n newTr = {};\n _.each(tr, function(tdValue, k) {\n return tableFieldMap.forEach(function(tfm) {\n var wTdCode;\n if (tfm.object_field === (c.object_table_field_code + '.$.' + k)) {\n wTdCode = tfm.workflow_field.split('.')[1];\n return newTr[wTdCode] = tdValue;\n }\n });\n });\n if (!_.isEmpty(newTr)) {\n return values[c.workflow_table_field_code].push(newTr);\n }\n });\n });\n _.each(tableToRelatedMap, function(map, key) {\n var formTableField, relatedField, relatedFieldName, relatedObject, relatedObjectName, relatedRecords, relatedTableItems, tableCode, tableValues;\n tableCode = map._FROM_TABLE_CODE;\n formTableField = getFormTableField(formTableFields, tableCode);\n if (!tableCode) {\n return console.warn('tableToRelated: [' + key + '] missing corresponding table.');\n } else {\n relatedObjectName = key;\n tableValues = [];\n relatedTableItems = [];\n relatedObject = getObjectConfig(relatedObjectName);\n relatedField = _.find(relatedObject.fields, function(f) {\n return ['lookup', 'master_detail'].includes(f.type) && f.reference_to === objectName;\n });\n relatedFieldName = relatedField.name;\n relatedRecords = objectFind(relatedObjectName, {\n filters: [[relatedFieldName, '=', recordId]]\n });\n relatedRecords.forEach(function(relatedRecord) {\n var tableValueItem;\n tableValueItem = {};\n _.each(map, function(valueKey, fieldKey) {\n var formField, formFieldKey, relatedObjectField, tableFieldValue;\n if (fieldKey !== '_FROM_TABLE_CODE') {\n tableFieldValue;\n formFieldKey;\n if (valueKey.startsWith(tableCode + '.')) {\n formFieldKey = (valueKey.split(\".\")[1]);\n } else {\n formFieldKey = valueKey;\n }\n formField = getFormTableSubField(formTableField, formFieldKey);\n relatedObjectField = relatedObject.fields[fieldKey];\n if (!formField || !relatedObjectField) {\n return;\n }\n tableFieldValue = getInstanceFieldValue(relatedObjectField, formField, relatedRecord, fieldKey, spaceId, relatedRecord[fieldKey], enableAmisform);\n return tableValueItem[formFieldKey] = tableFieldValue;\n }\n });\n if (!_.isEmpty(tableValueItem)) {\n tableValueItem._id = relatedRecord._id;\n tableValues.push(tableValueItem);\n return relatedTableItems.push({\n _table: {\n _id: relatedRecord._id,\n _code: tableCode\n }\n });\n }\n });\n values[tableCode] = tableValues;\n return relatedTablesInfo[relatedObjectName] = relatedTableItems;\n }\n });\n if (ow.field_map_script) {\n _.extend(values, uuflowManagerForInitApproval.evalFieldMapScript(ow.field_map_script, objectName, spaceId, recordId));\n }\n }\n filterValues = {};\n _.each(_.keys(values), function(k) {\n if (fieldCodes.includes(k)) {\n return filterValues[k] = values[k];\n }\n });\n return filterValues;\n};\n\nuuflowManagerForInitApproval.evalFieldMapScript = function(field_map_script, objectName, spaceId, objectId) {\n var func, record, script, values;\n record = objectFindOne(objectName, {\n filters: [['_id', '=', objectId]]\n });\n script = \"module.exports = function (record) { \" + field_map_script + \" }\";\n func = _eval(script, \"field_map_script\");\n values = func(record);\n if (_.isObject(values)) {\n return values;\n } else {\n console.error(\"evalFieldMapScript: 脚本返回值类型不是对象\");\n }\n return {};\n};\n\nuuflowManagerForInitApproval.initiateAttach = function(recordIds, spaceId, insId, approveId) {\n Creator.Collections['cms_files'].find({\n space: spaceId,\n parent: recordIds\n }).forEach(function(cf) {\n return _.each(cf.versions, function(versionId, idx) {\n var f, newFile;\n f = Creator.Collections['cfs.files.filerecord'].findOne(versionId);\n newFile = new FS.File();\n return newFile.attachData(f.createReadStream('files'), {\n type: f.original.type\n }, function(err) {\n var metadata;\n if (err) {\n throw new Meteor.Error(err.error, err.reason);\n }\n newFile.name(f.name());\n newFile.size(f.size());\n metadata = {\n owner: f.metadata.owner,\n owner_name: f.metadata.owner_name,\n space: spaceId,\n instance: insId,\n approve: approveId,\n parent: cf._id\n };\n if (idx === 0) {\n metadata.current = true;\n }\n newFile.metadata = metadata;\n return cfs.instances.insert(newFile);\n });\n });\n });\n};\n\nuuflowManagerForInitApproval.initiateRecordInstanceInfo = function(recordIds, insId, spaceId) {\n objectUpdate(recordIds.o, recordIds.ids[0], {\n instances: [\n {\n _id: insId,\n state: 'draft'\n }\n ],\n locked: true,\n instance_state: 'draft'\n });\n};\n\nuuflowManagerForInitApproval.initiateRelatedRecordInstanceInfo = function(relatedTablesInfo, insId, spaceId) {\n _.each(relatedTablesInfo, function(tableItems, relatedObjectName) {\n var relatedCollection;\n relatedCollection = Creator.getCollection(relatedObjectName, spaceId);\n return _.each(tableItems, function(item) {\n return relatedCollection.direct.update(item._table._id, {\n $set: {\n instances: [\n {\n _id: insId,\n state: 'draft'\n }\n ],\n _table: item._table\n }\n });\n });\n });\n};\n\nuuflowManagerForInitApproval.checkIsInApproval = function(recordIds, spaceId) {\n var record;\n record = objectFindOne(recordIds.o, {\n filters: [['_id', '=', recordIds.ids[0]]],\n fields: ['instances']\n });\n if (record && record.instances && record.instances[0].state !== 'completed' && Creator.Collections.instances.find(record.instances[0]._id).count() > 0) {\n throw new Meteor.Error('error!', \"此记录已发起流程正在审批中,待审批结束方可发起下一次审批!\");\n }\n};\n\nuuflowManagerForInitApproval.formatDate = function(date) {\n return moment(date).format(\"YYYY-MM-DD\");\n};\n"]} \ No newline at end of file +{"version":3,"sources":["meteor://💻app/packages/steedos:creator/checkNpm.js","meteor://💻app/packages/steedos_creator/core.coffee","meteor://💻app/core.coffee","meteor://💻app/packages/steedos_creator/lib/apps.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_recent_viewed.coffee","meteor://💻app/server/methods/object_recent_viewed.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_recent_record.coffee","meteor://💻app/server/methods/object_recent_record.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_listviews_options.coffee","meteor://💻app/server/methods/object_listviews_options.coffee","meteor://💻app/packages/steedos_creator/server/methods/report_data.coffee","meteor://💻app/server/methods/report_data.coffee","meteor://💻app/packages/steedos_creator/server/methods/user_tabular_settings.coffee","meteor://💻app/server/methods/user_tabular_settings.coffee","meteor://💻app/packages/steedos_creator/server/methods/object_export2xml.coffee","meteor://💻app/server/methods/object_export2xml.coffee","meteor://💻app/packages/steedos_creator/server/methods/related_objects_records.coffee","meteor://💻app/server/methods/related_objects_records.coffee","meteor://💻app/packages/steedos_creator/server/methods/pending_space.coffee","meteor://💻app/server/methods/pending_space.coffee","meteor://💻app/packages/steedos_creator/server/publications/object.coffee","meteor://💻app/server/publications/object.coffee","meteor://💻app/packages/steedos_creator/server/publications/object_tabular.coffee","meteor://💻app/server/publications/object_tabular.coffee","meteor://💻app/packages/steedos_creator/server/publications/object_listviews.coffee","meteor://💻app/packages/steedos_creator/server/publications/user_tabular_settings.coffee","meteor://💻app/packages/steedos_creator/server/publications/related_objects_records.coffee","meteor://💻app/server/publications/related_objects_records.coffee","meteor://💻app/packages/steedos_creator/server/publications/space_user_info.coffee","meteor://💻app/packages/steedos_creator/server/publications/contacts_view_limits.coffee","meteor://💻app/server/publications/contacts_view_limits.coffee","meteor://💻app/packages/steedos_creator/server/publications/contacts_no_force_phone_users.coffee","meteor://💻app/server/publications/contacts_no_force_phone_users.coffee","meteor://💻app/packages/steedos_creator/server/publications/space_need_to_confirm.coffee","meteor://💻app/server/publications/space_need_to_confirm.coffee","meteor://💻app/packages/steedos_creator/server/lib/permission_manager.coffee","meteor://💻app/server/lib/permission_manager.coffee","meteor://💻app/packages/steedos_creator/server/lib/uuflowManagerForInitApproval.coffee","meteor://💻app/server/lib/uuflowManagerForInitApproval.coffee"],"names":["checkNpmVersions","module","link","v","busboy","Meteor","settings","cfs","aliyun","Creator","getSchema","object_name","ref","getObject","schema","getObjectHomeComponent","getObjectUrl","record_id","app_id","list_view","list_view_id","Session","get","getListView","_id","getRelativeUrl","getObjectAbsoluteUrl","Steedos","absoluteUrl","getObjectRouterUrl","getListViewUrl","url","getListViewRelativeUrl","getSwitchListUrl","getRelatedObjectUrl","related_object_name","related_field_name","getObjectLookupFieldOptions","is_deep","is_skip_hide","is_related","_object","_options","fields","icon","relatedObjects","_","forEach","f","k","hidden","type","push","label","value","r_object","reference_to","isString","f2","k2","getRelatedObjects","each","_this","_relatedObject","relatedObject","relatedOptions","relatedOption","foreign_key","name","getObjectFilterFieldOptions","permission_fields","getFields","include","test","indexOf","getObjectFieldOptions","getFiltersWithFilterFields","filters","filter_fields","length","n","field","required","findWhere","is_default","is_required","filterItem","matchField","find","getObjectRecord","select_fields","expand","collection","obj","record","ref1","ref2","isClient","Template","instance","odata","database_name","getCollection","findOne","getObjectRecordName","name_field_key","NAME_FIELD_KEY","getApp","appMenus","currentApp","menuItem","id","getAppDashboard","app","dashboard","Dashboards","apps","getAppDashboardComponent","getAppObjectNames","appObjects","isMobile","objects","mobile_objects","permissions","allowRead","getUrlWithToken","expressionFormData","hasQuerySymbol","linkStr","params","spaceId","userId","getUserCompanyIds","Accounts","_storedLoginToken","isExpression","parseSingleExpression","USER_CONTEXT","$","param","getAppMenu","menu_id","menus","getAppMenus","menu","getAppMenuUrlForInternet","path","getAppMenuUrl","target","curentAppMenus","children","loadAppsMenus","data","options","mobile","success","set","authRequest","creatorAppsSelector","assigned_apps","adminApp","creatorApps","sortedApps","key","is_creator","visible","sortBy","values","admin","visibleAppsSelector","includeAdmin","getVisibleApps","changeApp","_subApp","Object","assign","Apps","getVisibleAppsObjects","visibleObjectNames","flatten","pluck","filter","Objects","sort","sortingMethod","bind","uniq","getAppsObjects","tempObjects","concat","validateFilters","logic","e","errorMsg","filter_items","filter_length","flag","index","word","map","isEmpty","compact","replace","match","i","includes","w","error","console","log","toastr","formatFiltersToMongo","selector","Array","operation","option","reg","sub_selector","evaluateFormula","RegExp","isBetweenFilterOperation","getBetweenTimeBuiltinValues","formatFiltersToDev","logicTempFilters","is_logic_or","pop","SteedosFilters","formatLogicFiltersToDev","filter_logic","format_logic","x","_f","isArray","JSON","stringify","related_object_names","related_objects","unrelated_objects","getObjectRelateds","_collection_name","getPermissions","difference","related_object","isActive","allowReadFiles","getRelatedObjectNames","getRelatedObjectListActions","relatedObjectName","actions","getActions","action","on","disabled_actions","has","allow_customActions","keys","exclude_actions","getListViews","disabled_list_views","listViews","list_views","object","item","item_name","isDisabled","owner","fieldsName","unreadable_fields","getObjectFieldsName","isloading","bootstrapLoaded","convertSpecialCharacter","str","getDisabledFields","fieldName","autoform","disabled","omit","getHiddenFields","getFieldsWithNoGroup","group","getSortedFieldGroupNames","names","unique","getFieldsForGroup","groupName","getSystemBaseFields","getFieldsWithoutSystemBase","getFieldsWithoutOmit","pick","getFieldsInFirstLevel","firstLevelKeys","getFieldsForReorder","isSingle","_keys","childKeys","is_wide_1","is_wide_2","sc_1","sc_2","endsWith","is_wide","slice","isFilterValueEmpty","Number","isNaN","getFieldDataType","objectFields","result","data_type","isServer","getAllRelatedObjects","related_field","enable_files","formatIndex","array","indexName","isdocumentDB","background","datasources","documentDB","join","substring","appsByName","methods","space_id","collection_recent_viewed","current_recent_viewed","doc","space","update","$inc","count","$set","modified","Date","modified_by","insert","_makeNewID","o","ids","created","created_by","validate","async_recent_aggregate","recent_aggregate","search_object","_records","callback","Collections","object_recent_viewed","rawCollection","aggregate","$match","$group","maxCreated","$max","$sort","$limit","toArray","err","Error","isFunction","wrapAsync","searchText","_object_collection","_object_name_key","query","query_and","records","search_Keywords","split","keyword","subquery","$regex","trim","$and","$in","limit","_name","_object_name","record_object","record_object_collection","self","objectsByName","object_record","enable_search","update_filters","listview_id","filter_scope","object_listviews","direct","update_columns","columns","check","compoundFields","cursor","filterFields","childKey","objectField","splits","isCommonSpace","isSpaceAdmin","skip","fetch","compoundFieldItem","compoundFilterFields","itemKey","itemValue","referenceItem","setting","column_width","obj1","_id_actions","_mixFieldsData","_mixRelatedData","_writeXmlFile","fs","logger","mkdirp","xml2js","require","Logger","jsonObj","objName","builder","day","fileAddress","fileName","filePath","month","now","stream","xml","year","Builder","buildObject","Buffer","getFullYear","getMonth","getDate","__meteor_bootstrap__","serverDir","existsSync","sync","writeFile","mixBool","mixDate","mixDefault","objFields","field_name","date","dateStr","format","moment","relatedObjNames","relatedObjName","relatedCollection","relatedRecordList","relatedTableData","relatedObj","fieldsData","Export2xml","recordList","info","time","recordObj","timeEnd","related_objects_records","related_records","viewAllRecords","getPendingSpaceInfo","inviterId","inviterName","spaceName","db","users","spaces","inviter","refuseJoinSpace","space_users","invite_state","acceptJoinSpace","user_accepted","publish","publishComposite","tableName","_fields","object_colleciton","reference_fields","ready","String","Match","Optional","getObjectName","unblock","field_keys","_objectKeys","reference_field","parent","children_fields","p_k","reference_ids","reference_to_object","s_k","getProperty","reduce","isObject","shared","user","space_settings","permissionManagerForInitApproval","getFlowPermissions","flow_id","user_id","flow","my_permissions","org_ids","organizations","orgs_can_add","orgs_can_admin","orgs_can_monitor","users_can_add","users_can_admin","users_can_monitor","uuflowManagerForInitApproval","getFlow","parents","org","parent_id","perms","org_id","_eval","checkRequiredDetails","getFieldOdataValue","getFileFieldValue","getFormField","getFormTableField","getFormTableFieldCode","getFormTableSubField","getInstanceFieldValue","getObjectConfig","getObjectNameFieldKey","getRelatedObjectFieldCode","getRelateds","getSelectOrgValue","getSelectOrgValues","getSelectUserValue","getSelectUserValues","objectFind","objectFindOne","objectUpdate","objectql","objectApiName","toConfig","cb","then","resolve","reject","top","relatedObjectsKeys","relatedObjectsKey","startsWith","formTableFieldsCode","formTableFieldCode","formTableFields","code","formFields","ff","sf","tableField","subFieldCode","referenceToFieldName","_record","nameKey","su","userIds","sus","orgId","fullname","orgIds","orgs","recordFieldId","fType","files","newFile","FS","File","attachData","createReadStream","original","metadata","reason","size","instances","objField","formField","object_field","recordFieldValue","enableAmisform","odataFieldValue","referenceToObjectName","selectFieldValue","steedos_field","reference_to_field","multiple","is_multiselect","formatDate","formatTime","hasOwnProperty","requiredDetails","masterRecord","rd","masterField","masterFieldValue","refId","subObjConfig","subTableMasterField","subTableName","subTableRecord","check_authorization","req","authToken","hashedToken","_hashLoginToken","getSpace","flows","getSpaceUser","space_user","getSpaceUserOrgInfo","organization","organization_name","organization_fullname","isFlowEnabled","state","isFlowSpaceMatched","getForm","form_id","form","forms","getCategory","category_id","categories","checkSyncDirection","ow","syncDirection","object_workflows","sync_direction","create_instance","instance_from_client","user_info","appr_obj","approve_from_client","category","ins_obj","new_ins_id","relatedTablesInfo","space_user_org_info","start_step","trace_from_client","trace_obj","checkIsInApproval","permissionManager","flow_version","current","form_version","submitter","submitter_name","applicant","applicant_name","applicant_organization","applicant_organization_name","applicant_organization_fullname","applicant_company","company_id","is_archived","is_deleted","record_ids","Mongo","ObjectID","_str","is_finished","steps","step","step_type","start_date","trace","user_name","handler","handler_name","handler_organization","handler_organization_name","handler_organization_fullname","read_date","is_read","is_error","description","initiateValues","approves","traces","inbox_users","current_step_name","auto_remind","flow_name","category_name","initiateRecordInstanceInfo","initiateAttach","recordIds","flowId","fieldCodes","filterValues","objectName","recordId","tableFieldCodes","tableFieldMap","tableToRelatedMap","enable_amisform","required_details","field_map","fm","gridCode","lookupFieldName","lookupFieldObj","lookupObjectRecord","oTableCode","oTableCodeReferenceField","oTableCodeReferenceFieldCode","oTableFieldCode","objectFieldName","objectFieldObjectName","objectLookupField","referenceToDoc","referenceToFieldValue","relatedObjectFieldCode","tableToRelatedMapKey","wTableCode","workflow_field","table1","workflow_table_field_code","object_table_field_code","tfc","c","parse","tr","newTr","tdValue","tfm","wTdCode","formTableField","relatedField","relatedFieldName","relatedRecords","relatedTableItems","tableCode","tableValues","_FROM_TABLE_CODE","warn","relatedRecord","tableValueItem","valueKey","fieldKey","formFieldKey","relatedObjectField","tableFieldValue","_table","_code","field_map_script","extend","evalFieldMapScript","objectId","func","script","insId","approveId","cf","versions","versionId","idx","owner_name","approve","locked","instance_state","initiateRelatedRecordInstanceInfo","tableItems","utcOffset"],"mappings":"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","file":"/packages/steedos_creator.js","sourcesContent":["import {\n\tcheckNpmVersions\n} from 'meteor/tmeasday:check-npm-versions';\ncheckNpmVersions({\n\tbusboy: \"^0.2.13\",\n\t\"xml2js\": \"^0.4.19\",\n}, 'steedos:creator');\n\nif (Meteor.settings && Meteor.settings.cfs && Meteor.settings.cfs.aliyun) {\n\tcheckNpmVersions({\n\t\t\"aliyun-sdk\": \"^1.11.12\"\n\t}, 'steedos:creator');\n}","\n\t# Creator.initApps()\n\n\n# Creator.initApps = ()->\n# \tif Meteor.isServer\n# \t\t_.each Creator.Apps, (app, app_id)->\n# \t\t\tdb_app = db.apps.findOne(app_id)\n# \t\t\tif !db_app\n# \t\t\t\tapp._id = app_id\n# \t\t\t\tdb.apps.insert(app)\n# else\n# \tapp._id = app_id\n# \tdb.apps.update({_id: app_id}, app)\n\nCreator.getSchema = (object_name)->\n\treturn Creator.getObject(object_name)?.schema\n\nCreator.getObjectHomeComponent = (object_name)->\n\t# if Meteor.isClient\n\t# \treturn BuilderCreator.pluginComponentSelector(BuilderCreator.store.getState(), \"ObjectHome\", object_name)\n\treturn false;\n\nCreator.getObjectUrl = (object_name, record_id, app_id) ->\n\tif !app_id\n\t\tapp_id = Session.get(\"app_id\")\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tlist_view = Creator.getListView(object_name, null)\n\tlist_view_id = list_view?._id\n\n\tif record_id\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id)\n\telse\n\t\tif Creator.getObjectHomeComponent(object_name)\n\t\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name)\n\t\telse\n\t\t\tif list_view_id\n\t\t\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id)\n\t\t\telse\n\t\t\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name)\n\nCreator.getObjectAbsoluteUrl = (object_name, record_id, app_id) ->\n\tif !app_id\n\t\tapp_id = Session.get(\"app_id\")\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tlist_view = Creator.getListView(object_name, null)\n\tlist_view_id = list_view?._id\n\n\tif record_id\n\t\treturn Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id, true)\n\telse\n\t\treturn Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id, true)\n\nCreator.getObjectRouterUrl = (object_name, record_id, app_id) ->\n\tif !app_id\n\t\tapp_id = Session.get(\"app_id\")\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tlist_view = Creator.getListView(object_name, null)\n\tlist_view_id = list_view?._id\n\n\tif record_id\n\t\treturn \"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id\n\telse\n\t\treturn \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id\n\nCreator.getListViewUrl = (object_name, app_id, list_view_id) ->\n\turl = Creator.getListViewRelativeUrl(object_name, app_id, list_view_id)\n\treturn Creator.getRelativeUrl(url)\n\nCreator.getListViewRelativeUrl = (object_name, app_id, list_view_id) ->\n\treturn \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id\n\nCreator.getSwitchListUrl = (object_name, app_id, list_view_id) ->\n\tif list_view_id\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + list_view_id + \"/list\")\n\telse\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/list/switch\")\n\nCreator.getRelatedObjectUrl = (object_name, app_id, record_id, related_object_name, related_field_name) ->\n\tif related_field_name\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid?related_field_name=\" + related_field_name)\n\telse\n\t\treturn Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid\")\n\nCreator.getObjectLookupFieldOptions = (object_name, is_deep, is_skip_hide, is_related)->\n\t_options = []\n\tunless object_name\n\t\treturn _options\n\t_object = Creator.getObject(object_name)\n\tfields = _object?.fields\n\ticon = _object?.icon\n\t_.forEach fields, (f, k)->\n\t\tif is_skip_hide and f.hidden\n\t\t\treturn\n\t\tif f.type == \"select\"\n\t\t\t_options.push {label: \"#{f.label || k}\", value: \"#{k}\", icon: icon}\n\t\telse\n\t\t\t_options.push {label: f.label || k, value: k, icon: icon}\n\tif is_deep\n\t\t_.forEach fields, (f, k)->\n\t\t\tif is_skip_hide and f.hidden\n\t\t\t\treturn\n\t\t\tif (f.type == \"lookup\" || f.type == \"master_detail\") && f.reference_to && _.isString(f.reference_to)\n\t\t\t\t# 不支持f.reference_to为function的情况,有需求再说\n\t\t\t\tr_object = Creator.getObject(f.reference_to)\n\t\t\t\tif r_object\n\t\t\t\t\t_.forEach r_object.fields, (f2, k2)->\n\t\t\t\t\t\t_options.push {label: \"#{f.label || k}=>#{f2.label || k2}\", value: \"#{k}.#{k2}\", icon: r_object?.icon}\n\tif is_related\n\t\trelatedObjects = Creator.getRelatedObjects(object_name)\n\t\t_.each relatedObjects, (_relatedObject)=>\n\t\t\trelatedOptions = Creator.getObjectLookupFieldOptions(_relatedObject.object_name, false, false, false)\n\t\t\trelatedObject = Creator.getObject(_relatedObject.object_name)\n\t\t\t_.each relatedOptions, (relatedOption)->\n\t\t\t\tif _relatedObject.foreign_key != relatedOption.value\n\t\t\t\t\t_options.push {label: \"#{relatedObject.label || relatedObject.name}=>#{relatedOption.label}\", value: \"#{relatedObject.name}.#{relatedOption.value}\", icon: relatedObject?.icon}\n\treturn _options\n\n# 统一为对象object_name提供可用于过虑器过虑字段\nCreator.getObjectFilterFieldOptions = (object_name)->\n\t_options = []\n\tunless object_name\n\t\treturn _options\n\t_object = Creator.getObject(object_name)\n\tfields = _object?.fields\n\tpermission_fields = Creator.getFields(object_name)\n\ticon = _object?.icon\n\t_.forEach fields, (f, k)->\n\t\t# hidden,grid等类型的字段,不需要过滤\n\t\tif !_.include([\"grid\",\"object\", \"[Object]\", \"[object]\", \"Object\", \"avatar\", \"image\", \"markdown\", \"html\"], f.type) and !f.hidden\n\t\t\t# filters.$.field及flow.current等子字段也不需要过滤\n\t\t\tif !/\\w+\\./.test(k) and _.indexOf(permission_fields, k) > -1\n\t\t\t\t_options.push {label: f.label || k, value: k, icon: icon}\n\n\treturn _options\n\nCreator.getObjectFieldOptions = (object_name)->\n\t_options = []\n\tunless object_name\n\t\treturn _options\n\t_object = Creator.getObject(object_name)\n\tfields = _object?.fields\n\tpermission_fields = Creator.getFields(object_name)\n\ticon = _object?.icon\n\t_.forEach fields, (f, k)->\n\t\tif !_.include([\"grid\",\"object\", \"[Object]\", \"[object]\", \"Object\", \"markdown\", \"html\"], f.type)\n\t\t\tif !/\\w+\\./.test(k) and _.indexOf(permission_fields, k) > -1\n\t\t\t\t_options.push {label: f.label || k, value: k, icon: icon}\n\treturn _options\n\n###\nfilters: 要转换的filters\nfields: 对象字段\nfilter_fields: 默认过滤字段,支持字符串数组和对象数组两种格式,如:['filed_name1','filed_name2'],[{field:'filed_name1',required:true}]\n处理逻辑: 把filters中存在于filter_fields的过滤条件增加每项的is_default、is_required属性,不存在于filter_fields的过滤条件对应的移除每项的相关属性\n返回结果: 处理后的filters\n###\nCreator.getFiltersWithFilterFields = (filters, fields, filter_fields)->\n\tunless filters\n\t\tfilters = []\n\tunless filter_fields\n\t\tfilter_fields = []\n\tif filter_fields?.length\n\t\tfilter_fields.forEach (n)->\n\t\t\tif _.isString(n)\n\t\t\t\tn = \n\t\t\t\t\tfield: n,\n\t\t\t\t\trequired: false\n\t\t\tif fields[n.field] and !_.findWhere(filters,{field:n.field})\n\t\t\t\tfilters.push\n\t\t\t\t\tfield: n.field,\n\t\t\t\t\tis_default: true,\n\t\t\t\t\tis_required: n.required\n\tfilters.forEach (filterItem)->\n\t\tmatchField = filter_fields.find (n)-> return n == filterItem.field or n.field == filterItem.field\n\t\tif _.isString(matchField)\n\t\t\tmatchField = \n\t\t\t\tfield: matchField,\n\t\t\t\trequired: false\n\t\tif matchField\n\t\t\tfilterItem.is_default = true\n\t\t\tfilterItem.is_required = matchField.required\n\t\telse\n\t\t\tdelete filterItem.is_default\n\t\t\tdelete filterItem.is_required\n\treturn filters\n\nCreator.getObjectRecord = (object_name, record_id, select_fields, expand)->\n\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\n\tif !record_id\n\t\trecord_id = Session.get(\"record_id\")\n\tif Meteor.isClient\n\t\tif object_name == Session.get(\"object_name\") && record_id == Session.get(\"record_id\")\n\t\t\tif Template.instance()?.record\n\t\t\t\treturn Template.instance()?.record?.get()\n\t\telse\n\t\t\treturn Creator.odata.get(object_name, record_id, select_fields, expand)\n\n\tobj = Creator.getObject(object_name)\n\n\tif obj.database_name == \"meteor\" || !obj.database_name\n\t\tcollection = Creator.getCollection(object_name)\n\t\tif collection\n\t\t\trecord = collection.findOne(record_id)\n\t\t\treturn record\n\telse if object_name && record_id\n\t\treturn Creator.odata.get(object_name, record_id, select_fields, expand)\n\nCreator.getObjectRecordName = (record, object_name)->\n\tunless record\n\t\trecord = Creator.getObjectRecord()\n\tif record\n\t\t# 显示组织列表时,特殊处理name_field_key为name字段\n\t\tname_field_key = if object_name == \"organizations\" then \"name\" else Creator.getObject(object_name)?.NAME_FIELD_KEY\n\t\tif record and name_field_key\n\t\t\treturn record.label || record[name_field_key]\n\nCreator.getApp = (app_id)->\n\tappMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n\tunless appMenus\n\t\treturn {}\n\tcurrentApp = appMenus.find (menuItem) ->\n\t\treturn menuItem.id == app_id\n\treturn currentApp\n\nCreator.getAppDashboard = (app_id)->\n\tapp = Creator.getApp(app_id)\n\tif !app\n\t\treturn\n\tdashboard = null\n\t_.each Creator.Dashboards, (v, k)->\n\t\tif v.apps?.indexOf(app._id) > -1\n\t\t\tdashboard = v;\n\treturn dashboard;\n\nCreator.getAppDashboardComponent = (app_id)->\n\tapp = Creator.getApp(app_id)\n\tif !app || true\n\t\treturn\n\t# return BuilderCreator.pluginComponentSelector(BuilderCreator.store.getState(), \"Dashboard\", app._id);\n\nCreator.getAppObjectNames = (app_id)->\n\tapp = Creator.getApp(app_id)\n\tif !app\n\t\treturn\n\tisMobile = Steedos.isMobile()\n\tappObjects = if isMobile then app.mobile_objects else app.objects\n\tobjects = []\n\tif app\n\t\t_.each appObjects, (v)->\n\t\t\tobj = Creator.getObject(v)\n\t\t\tif obj?.permissions.get().allowRead\n\t\t\t\tobjects.push v\n\treturn objects\n\nCreator.getUrlWithToken = (url, expressionFormData) ->\n\t# 给url时拼接当前用户token相关信息用于登录验证,支持配置表达式\n\tparams = {};\n\tparams[\"X-Space-Id\"] = Steedos.spaceId()\n\tparams[\"X-User-Id\"] = Steedos.userId();\n\tparams[\"X-Company-Ids\"] = Steedos.getUserCompanyIds();\n\tparams[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n\tif Steedos.isExpression(url)\n\t\turl = Steedos.parseSingleExpression(url, expressionFormData, \"#\", Creator.USER_CONTEXT)\n\t# 外部链接地址中可能会带有#号,比如/builder/?p_ids=619383545b2e9a72ec0558b3#/page/public/test\n\t# 此时url中已经在#号前面出现了一个?号,这个问号不可以被识别为url参数,只有#号后面的?号才应该被识别为url参数\n\thasQuerySymbol = /(\\#.+\\?)|(\\?[^#]*$)/g.test(url)\n\tlinkStr = if hasQuerySymbol then \"&\" else \"?\"\n\treturn \"#{url}#{linkStr}#{$.param(params)}\"\n\nCreator.getAppMenu = (app_id, menu_id)->\n\tmenus = Creator.getAppMenus(app_id)\n\treturn menus && menus.find (menu)-> return menu.id == menu_id\n\nCreator.getAppMenuUrlForInternet = (menu)->\n\t# 当tabs类型为url时,按外部链接处理,支持配置表达式并加上统一的url参数\n\treturn Creator.getUrlWithToken menu.path, menu\n\nCreator.getAppMenuUrl = (menu)->\n\turl = menu.path\n\tif menu.type == \"url\"\n\t\tif menu.target\n\t\t\treturn Creator.getAppMenuUrlForInternet(menu)\n\t\telse\n\t\t\t# 在iframe中显示url界面\n\t\t\treturn \"/app/-/tab_iframe/#{menu.id}\"\n\telse\n\t\treturn menu.path\n\nCreator.getAppMenus = (app_id)->\n\tappMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n\tunless appMenus\n\t\treturn []\n\tcurentAppMenus = appMenus.find (menuItem) ->\n\t\treturn menuItem.id == app_id\n\tif curentAppMenus\n\t\treturn curentAppMenus.children\n\nCreator.loadAppsMenus = ()->\n\tisMobile = Steedos.isMobile()\n\tdata = { }\n\tif isMobile\n\t\tdata.mobile = isMobile\n\toptions = { \n\t\ttype: 'get', \n\t\tdata: data, \n\t\tsuccess: (data)->\n\t\t\tSession.set(\"app_menus\", data);\n\t }\n\tSteedos?.authRequest \"/service/api/apps/menus\", options\n\nCreator.creatorAppsSelector = (apps, assigned_apps) ->\n\tadminApp = undefined\n\tsortedApps = undefined\n\t_.each apps, (app, key) ->\n\t\tif !app._id\n\t\t\tapp._id = key\n\t\tif app.is_creator\n\t\t\t# 不需要isSpaceAdmin逻辑\n\t\t\t# if (isSpaceAdmin) {\n\t\t\t#\t\t app.visible = true;\n\t\t\t# }\n\t\telse\n\t\t\t# 非creator应该一律不显示\n\t\t\tapp.visible = false\n\t\treturn\n\tsortedApps = _.sortBy(_.values(apps), 'sort')\n\tcreatorApps = {}\n\tadminApp = {}\n\t# 按钮sort排序次序设置Creator.Apps值\n\t_.each sortedApps, (n) ->\n\t\tif n._id == 'admin'\n\t\t\tadminApp = n\n\t\telse\n\t\t\tcreatorApps[n._id] = n\n\t# admin菜单显示在最后\n\tcreatorApps.admin = adminApp\n\tif assigned_apps.length\n\t\t_.each creatorApps, (app, key) ->\n\t\t\tif assigned_apps.indexOf(key) > -1\n\t\t\t\tapp.visible = app.is_creator\n\t\t\telse\n\t\t\t\tapp.visible = false\n\t\t\treturn\n\tcreatorApps\n\nCreator.visibleAppsSelector = (creatorApps, includeAdmin = true) ->\n\tapps = []\n\t_.each creatorApps, (v, k) ->\n\t\tif v.visible != false and v._id != 'admin' or includeAdmin and v._id == 'admin'\n\t\t\tapps.push v\n\t\treturn\n\tapps\n\nCreator.getVisibleApps = (includeAdmin)->\n\tchangeApp = Creator._subApp.get();\n\tcreatorApps = Object.assign({}, Creator.Apps, {apps: changeApp});\n\treturn Creator.visibleAppsSelector(creatorApps, includeAdmin)\n\nCreator.getVisibleAppsObjects = ()->\n\tapps = Creator.getVisibleApps()\n\tvisibleObjectNames = _.flatten(_.pluck(apps,'objects'))\n\tobjects = _.filter Creator.Objects, (obj)->\n\t\tif visibleObjectNames.indexOf(obj.name) < 0\n\t\t\treturn false\n\t\telse\n\t\t\treturn true\n\tobjects = objects.sort(Creator.sortingMethod.bind({key:\"label\"}))\n\tobjects = _.pluck(objects,'name')\n\treturn _.uniq objects\n\nCreator.getAppsObjects = ()->\n\tobjects = []\n\ttempObjects = []\n\t_.forEach Creator.Apps, (app)->\n\t\ttempObjects = _.filter app.objects, (obj)->\n\t\t\treturn !obj.hidden\n\t\tobjects = objects.concat(tempObjects)\n\treturn _.uniq objects\n\nCreator.validateFilters = (filters, logic)->\n\tfilter_items = _.map filters, (obj) ->\n\t\tif _.isEmpty(obj)\n\t\t\treturn false\n\t\telse\n\t\t\treturn obj\n\tfilter_items = _.compact(filter_items)\n\terrorMsg = \"\"\n\tfilter_length = filter_items.length\n\tif logic\n\t\t# 格式化filter\n\t\tlogic = logic.replace(/\\n/g, \"\").replace(/\\s+/g, \" \")\n\n\t\t# 判断特殊字符\n\t\tif /[._\\-!+]+/ig.test(logic)\n\t\t\terrorMsg = \"含有特殊字符。\"\n\n\t\tif !errorMsg\n\t\t\tindex = logic.match(/\\d+/ig)\n\t\t\tif !index\n\t\t\t\terrorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\"\n\t\t\telse\n\t\t\t\tindex.forEach (i)->\n\t\t\t\t\tif i < 1 or i > filter_length\n\t\t\t\t\t\terrorMsg = \"您的筛选条件引用了未定义的筛选器:#{i}。\"\n\n\t\t\t\tflag = 1\n\t\t\t\twhile flag <= filter_length\n\t\t\t\t\tif !index.includes(\"#{flag}\")\n\t\t\t\t\t\terrorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\"\n\t\t\t\t\tflag++;\n\n\t\tif !errorMsg\n\t\t\t# 判断是否有非法英文字符\n\t\t\tword = logic.match(/[a-zA-Z]+/ig)\n\t\t\tif word\n\t\t\t\tword.forEach (w)->\n\t\t\t\t\tif !/^(and|or)$/ig.test(w)\n\t\t\t\t\t\terrorMsg = \"检查您的高级筛选条件中的拼写。\"\n\n\t\tif !errorMsg\n\t\t\t# 判断格式是否正确\n\t\t\ttry\n\t\t\t\tCreator.eval(logic.replace(/and/ig, \"&&\").replace(/or/ig, \"||\"))\n\t\t\tcatch e\n\t\t\t\terrorMsg = \"您的筛选器中含有特殊字符\"\n\n\t\t\tif /(AND)[^()]+(OR)/ig.test(logic) || /(OR)[^()]+(AND)/ig.test(logic)\n\t\t\t\terrorMsg = \"您的筛选器必须在连续性的 AND 和 OR 表达式前后使用括号。\"\n\tif errorMsg\n\t\tconsole.log \"error\", errorMsg\n\t\tif Meteor.isClient\n\t\t\ttoastr.error(errorMsg)\n\t\treturn false\n\telse\n\t\treturn true\n\n# \"=\", \"<>\", \">\", \">=\", \"<\", \"<=\", \"startswith\", \"contains\", \"notcontains\".\n###\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n###\nCreator.formatFiltersToMongo = (filters, options)->\n\tunless filters?.length\n\t\treturn\n\t# 当filters不是[Array]类型而是[Object]类型时,进行格式转换\n\tunless filters[0] instanceof Array\n\t\tfilters = _.map filters, (obj)->\n\t\t\treturn [obj.field, obj.operation, obj.value]\n\tselector = []\n\t_.each filters, (filter)->\n\t\tfield = filter[0]\n\t\toption = filter[1]\n\t\tif Meteor.isClient\n\t\t\tvalue = Creator.evaluateFormula(filter[2])\n\t\telse\n\t\t\tvalue = Creator.evaluateFormula(filter[2], null, options)\n\t\tsub_selector = {}\n\t\tsub_selector[field] = {}\n\t\tif option == \"=\"\n\t\t\tsub_selector[field][\"$eq\"] = value\n\t\telse if option == \"<>\"\n\t\t\tsub_selector[field][\"$ne\"] = value\n\t\telse if option == \">\"\n\t\t\tsub_selector[field][\"$gt\"] = value\n\t\telse if option == \">=\"\n\t\t\tsub_selector[field][\"$gte\"] = value\n\t\telse if option == \"<\"\n\t\t\tsub_selector[field][\"$lt\"] = value\n\t\telse if option == \"<=\"\n\t\t\tsub_selector[field][\"$lte\"] = value\n\t\telse if option == \"startswith\"\n\t\t\treg = new RegExp(\"^\" + value, \"i\")\n\t\t\tsub_selector[field][\"$regex\"] = reg\n\t\telse if option == \"contains\"\n\t\t\treg = new RegExp(value, \"i\")\n\t\t\tsub_selector[field][\"$regex\"] = reg\n\t\telse if option == \"notcontains\"\n\t\t\treg = new RegExp(\"^((?!\" + value + \").)*$\", \"i\")\n\t\t\tsub_selector[field][\"$regex\"] = reg\n\t\tselector.push sub_selector\n\treturn selector\n\nCreator.isBetweenFilterOperation = (operation)->\n\treturn operation == \"between\" or !!Creator.getBetweenTimeBuiltinValues(true)?[operation]\n\n###\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\n\textend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n###\nCreator.formatFiltersToDev = (filters, object_name, options)->\n\tunless filters.length\n\t\treturn\n\tif options?.is_logic_or\n\t\t# 如果is_logic_or为true,为filters第一层元素增加or间隔\n\t\tlogicTempFilters = []\n\t\tfilters.forEach (n)->\n\t\t\tlogicTempFilters.push(n)\n\t\t\tlogicTempFilters.push(\"or\")\n\t\tlogicTempFilters.pop()\n\t\tfilters = logicTempFilters\n\tselector = SteedosFilters.formatFiltersToDev(filters, Creator.USER_CONTEXT)\n\treturn selector\n\n###\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n###\nCreator.formatLogicFiltersToDev = (filters, filter_logic, options)->\n\tformat_logic = filter_logic.replace(/\\(\\s+/ig, \"(\").replace(/\\s+\\)/ig, \")\").replace(/\\(/g, \"[\").replace(/\\)/g, \"]\").replace(/\\s+/g, \",\").replace(/(and|or)/ig, \"'$1'\")\n\tformat_logic = format_logic.replace(/(\\d)+/ig, (x)->\n\t\t_f = filters[x-1]\n\t\tfield = _f.field\n\t\toption = _f.operation\n\t\tif Meteor.isClient\n\t\t\tvalue = Creator.evaluateFormula(_f.value)\n\t\telse\n\t\t\tvalue = Creator.evaluateFormula(_f.value, null, options)\n\t\tsub_selector = []\n\t\tif _.isArray(value) == true\n\t\t\tif option == \"=\"\n\t\t\t\t_.each value, (v)->\n\t\t\t\t\tsub_selector.push [field, option, v], \"or\"\n\t\t\telse if option == \"<>\"\n\t\t\t\t_.each value, (v)->\n\t\t\t\t\tsub_selector.push [field, option, v], \"and\"\n\t\t\telse\n\t\t\t\t_.each value, (v)->\n\t\t\t\t\tsub_selector.push [field, option, v], \"or\"\n\t\t\tif sub_selector[sub_selector.length - 1] == \"and\" || sub_selector[sub_selector.length - 1] == \"or\"\n\t\t\t\tsub_selector.pop()\n\t\telse\n\t\t\tsub_selector = [field, option, value]\n\t\t# console.log \"sub_selector\", sub_selector\n\t\treturn JSON.stringify(sub_selector)\n\t)\n\tformat_logic = \"[#{format_logic}]\"\n\treturn Creator.eval(format_logic)\n\nCreator.getRelatedObjects = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\trelated_object_names = []\n\t_object = Creator.getObject(object_name)\n\n\tif !_object\n\t\treturn related_object_names\n\n#\trelated_object_names = _.pluck(_object.related_objects,\"object_name\")\n\n\trelated_objects = Creator.getObjectRelateds(_object._collection_name)\n\n\trelated_object_names = _.pluck(related_objects,\"object_name\")\n\tif related_object_names?.length == 0\n\t\treturn related_object_names\n\n\tpermissions = Creator.getPermissions(object_name, spaceId, userId)\n\tunrelated_objects = permissions.unrelated_objects\n\n\trelated_object_names = _.difference related_object_names, unrelated_objects\n\treturn _.filter related_objects, (related_object)->\n\t\trelated_object_name = related_object.object_name\n\t\tisActive = related_object_names.indexOf(related_object_name) > -1\n\t\t# related_object_name = if related_object_name == \"cfs_files_filerecord\" then \"cfs.files.filerecord\" else related_object_name\n\t\tallowRead = Creator.getPermissions(related_object_name, spaceId, userId)?.allowRead\n\t\tif related_object_name == \"cms_files\"\n\t\t\tallowRead = allowRead && permissions.allowReadFiles\n\t\treturn isActive and allowRead\n\nCreator.getRelatedObjectNames = (object_name, spaceId, userId)->\n\trelated_objects = Creator.getRelatedObjects(object_name, spaceId, userId)\n\treturn _.pluck(related_objects,\"object_name\")\n\nCreator.getRelatedObjectListActions = (relatedObjectName, spaceId, userId)->\n\tactions = Creator.getActions(relatedObjectName, spaceId, userId)\n\tactions = _.filter actions, (action)->\n\t\tif action.name == \"standard_follow\"\n\t\t\treturn false\n\t\tif action.name == \"standard_query\"\n\t\t\treturn false\n\t\tif action.on == \"list\"\n\t\t\tif typeof action.visible == \"function\"\n\t\t\t\treturn action.visible()\n\t\t\telse\n\t\t\t\treturn action.visible\n\t\telse\n\t\t\treturn false\n\treturn actions\n\nCreator.getActions = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\tobj = Creator.getObject(object_name)\n\n\tif !obj\n\t\treturn\n\n\tpermissions = Creator.getPermissions(object_name, spaceId, userId)\n\tdisabled_actions = permissions.disabled_actions\n\tactions = _.sortBy(_.values(obj.actions) , 'sort');\n\n\tif _.has(obj, 'allow_customActions')\n\t\tactions = _.filter actions, (action)->\n\t\t\treturn _.include(obj.allow_customActions, action.name) || _.include(_.keys(Creator.getObject('base').actions) || {}, action.name)\n\tif _.has(obj, 'exclude_actions')\n\t\tactions = _.filter actions, (action)->\n\t\t\treturn !_.include(obj.exclude_actions, action.name)\n\n\t_.each actions, (action)->\n\t\t# 手机上只显示编辑按钮,其他的放到折叠下拉菜单中\n\t\tif Steedos.isMobile() && [\"record\", \"record_only\"].indexOf(action.on) > -1 && action.name != 'standard_edit'\n\t\t\tif action.on == \"record_only\"\n\t\t\t\taction.on = 'record_only_more'\n\t\t\telse\n\t\t\t\taction.on = 'record_more'\n\n\tif Steedos.isMobile() && [\"cms_files\", \"cfs.files.filerecord\"].indexOf(object_name) > -1\n\t\t# 附件特殊处理,下载按钮放在主菜单,编辑按钮放到底下折叠下拉菜单中\n\t\tactions.find((n)-> return n.name == \"standard_edit\")?.on = \"record_more\"\n\t\tactions.find((n)-> return n.name == \"download\")?.on = \"record\"\n\n\tactions = _.filter actions, (action)->\n\t\treturn _.indexOf(disabled_actions, action.name) < 0\n\n\treturn actions\n\n///\n\t返回当前用户有权限访问的所有list_view,包括分享的,用户自定义非分享的(除非owner变了),以及默认的其他视图\n\t注意Creator.getPermissions函数中是不会有用户自定义非分享的视图的,所以Creator.getPermissions函数中拿到的结果不全,并不是当前用户能看到所有视图\n///\nCreator.getListViews = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\t\n\tunless object_name\n\t\treturn\n\n\tobject = Creator.getObject(object_name)\n\n\tif !object\n\t\treturn\n\n\tdisabled_list_views = Creator.getPermissions(object_name, spaceId, userId)?.disabled_list_views || []\n\n\tlist_views = []\n\n\tisMobile = Steedos.isMobile()\n\n\t_.each object.list_views, (item, item_name)->\n\t\titem.name = item_name\n\n\tlistViews = _.sortBy(_.values(object.list_views) , 'sort_no');\n\n\t_.each listViews, (item)->\n\t\tif isMobile and item.type == \"calendar\"\n\t\t\t# 手机上先不显示日历视图\n\t\t\treturn\n\t\tif item.name != \"default\"\n\t\t\tisDisabled = _.indexOf(disabled_list_views, item.name) > -1 || (item._id && _.indexOf(disabled_list_views, item._id) > -1)\n\t\t\tif !isDisabled || item.owner == userId\n\t\t\t\tlist_views.push item\n\treturn list_views\n\n# 前台理论上不应该调用该函数,因为字段的权限都在Creator.getObject(object_name).fields的相关属性中有标识了\nCreator.getFields = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\tfieldsName = Creator.getObjectFieldsName(object_name)\n\tunreadable_fields = Creator.getPermissions(object_name, spaceId, userId)?.unreadable_fields\n\treturn _.difference(fieldsName, unreadable_fields)\n\nCreator.isloading = ()->\n\treturn !Creator.bootstrapLoaded.get()\n\nCreator.convertSpecialCharacter = (str)->\n\treturn str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\")\n\n# 计算fields相关函数\n# START\nCreator.getDisabledFields = (schema)->\n\tfields = _.map(schema, (field, fieldName) ->\n\t\treturn field.autoform and field.autoform.disabled and !field.autoform.omit and fieldName\n\t)\n\tfields = _.compact(fields)\n\treturn fields\n\nCreator.getHiddenFields = (schema)->\n\tfields = _.map(schema, (field, fieldName) ->\n\t\treturn field.autoform and field.autoform.type == \"hidden\" and !field.autoform.omit and fieldName\n\t)\n\tfields = _.compact(fields)\n\treturn fields\n\nCreator.getFieldsWithNoGroup = (schema)->\n\tfields = _.map(schema, (field, fieldName) ->\n\t\treturn (!field.autoform or !field.autoform.group or field.autoform.group == \"-\") and (!field.autoform or field.autoform.type != \"hidden\") and fieldName\n\t)\n\tfields = _.compact(fields)\n\treturn fields\n\nCreator.getSortedFieldGroupNames = (schema)->\n\tnames = _.map(schema, (field) ->\n \t\treturn field.autoform and field.autoform.group != \"-\" and field.autoform.group\n\t)\n\tnames = _.compact(names)\n\tnames = _.unique(names)\n\treturn names\n\nCreator.getFieldsForGroup = (schema, groupName) ->\n \tfields = _.map(schema, (field, fieldName) ->\n \treturn field.autoform and field.autoform.group == groupName and field.autoform.type != \"hidden\" and fieldName\n \t)\n \tfields = _.compact(fields)\n \treturn fields\n\nCreator.getSystemBaseFields = () ->\n\treturn [\"created\", \"created_by\", \"modified\", \"modified_by\"]\n\nCreator.getFieldsWithoutSystemBase = (keys) ->\n\treturn _.difference(keys, Creator.getSystemBaseFields());\n\nCreator.getFieldsWithoutOmit = (schema, keys) ->\n\tkeys = _.map(keys, (key) ->\n\t\tfield = _.pick(schema, key)\n\t\tif field[key].autoform?.omit\n\t\t\treturn false\n\t\telse\n\t\t\treturn key\n\t)\n\tkeys = _.compact(keys)\n\treturn keys\n\nCreator.getFieldsInFirstLevel = (firstLevelKeys, keys) ->\n\tkeys = _.map(keys, (key) ->\n\t\tif _.indexOf(firstLevelKeys, key) > -1\n\t\t\treturn key\n\t\telse\n\t\t\treturn false\n\t)\n\tkeys = _.compact(keys)\n\treturn keys\n\nCreator.getFieldsForReorder = (schema, keys, isSingle) ->\n\tfields = []\n\ti = 0\n\t_keys = _.filter(keys, (key)->\n\t\treturn !key.endsWith('_endLine')\n\t);\n\twhile i < _keys.length\n\t\tsc_1 = _.pick(schema, _keys[i])\n\t\tsc_2 = _.pick(schema, _keys[i+1])\n\n\t\tis_wide_1 = false\n\t\tis_wide_2 = false\n\n#\t\tis_range_1 = false\n#\t\tis_range_2 = false\n\n\t\t_.each sc_1, (value) ->\n\t\t\tif value.autoform?.is_wide || value.autoform?.type == \"table\"\n\t\t\t\tis_wide_1 = true\n\n#\t\t\tif value.autoform?.is_range\n#\t\t\t\tis_range_1 = true\n\n\t\t_.each sc_2, (value) ->\n\t\t\tif value.autoform?.is_wide || value.autoform?.type == \"table\"\n\t\t\t\tis_wide_2 = true\n\n#\t\t\tif value.autoform?.is_range\n#\t\t\t\tis_range_2 = true\n\n\t\tif Steedos.isMobile()\n\t\t\tis_wide_1 = true\n\t\t\tis_wide_2 = true\n\n\t\tif isSingle\n\t\t\tfields.push _keys.slice(i, i+1)\n\t\t\ti += 1\n\t\telse\n#\t\t\tif !is_range_1 && is_range_2\n#\t\t\t\tchildKeys = _keys.slice(i, i+1)\n#\t\t\t\tchildKeys.push undefined\n#\t\t\t\tfields.push childKeys\n#\t\t\t\ti += 1\n#\t\t\telse\n\t\t\tif is_wide_1\n\t\t\t\tfields.push _keys.slice(i, i+1)\n\t\t\t\ti += 1\n\t\t\telse if !is_wide_1 and is_wide_2\n\t\t\t\tchildKeys = _keys.slice(i, i+1)\n\t\t\t\tchildKeys.push undefined\n\t\t\t\tfields.push childKeys\n\t\t\t\ti += 1\n\t\t\telse if !is_wide_1 and !is_wide_2\n\t\t\t\tchildKeys = _keys.slice(i, i+1)\n\t\t\t\tif _keys[i+1]\n\t\t\t\t\tchildKeys.push _keys[i+1]\n\t\t\t\telse\n\t\t\t\t\tchildKeys.push undefined\n\t\t\t\tfields.push childKeys\n\t\t\t\ti += 2\n\n\treturn fields\n\nCreator.isFilterValueEmpty = (v) ->\n\treturn typeof v == \"undefined\" || v == null || Number.isNaN(v) || v.length == 0\n\nCreator.getFieldDataType = (objectFields, key)->\n\tif objectFields and key\n\t\tresult = objectFields[key]?.type\n\t\tif [\"formula\", \"summary\"].indexOf(result) > -1\n\t\t\tresult = objectFields[key].data_type\n\t\t# else if result == \"select\" and objectFields[key]?.data_type and objectFields[key].data_type != \"text\"\n\t\t# \tresult = objectFields[key].data_type\n\t\treturn result\n\telse\n\t\treturn \"text\"\n\n# END\n\nif Meteor.isServer\n\tCreator.getAllRelatedObjects = (object_name)->\n\t\trelated_object_names = []\n\t\t_.each Creator.Objects, (related_object, related_object_name)->\n\t\t\t_.each related_object.fields, (related_field, related_field_name)->\n\t\t\t\tif related_field.type == \"master_detail\" and related_field.reference_to and related_field.reference_to == object_name\n\t\t\t\t\trelated_object_names.push related_object_name\n\n\t\tif Creator.getObject(object_name).enable_files\n\t\t\trelated_object_names.push \"cms_files\"\n\n\t\treturn related_object_names\n\nif Meteor.isServer\n\tSteedos.formatIndex = (array) ->\n\t\tobject = {\n \tbackground: true\n \t};\n\t\tisdocumentDB = Meteor.settings?.datasources?.default?.documentDB || false;\n\t\tif isdocumentDB\n\t\t\tif array.length > 0\n\t\t\t\tindexName = array.join(\".\");\n\t\t\t\tobject.name = indexName;\n\t\t\t\t\n\t\t\t\tif (indexName.length > 52)\n\t\t\t\t\tobject.name = indexName.substring(0,52);\n\n\t\treturn object;","Creator.getSchema = function(object_name) {\n var ref;\n return (ref = Creator.getObject(object_name)) != null ? ref.schema : void 0;\n};\n\nCreator.getObjectHomeComponent = function(object_name) {\n return false;\n};\n\nCreator.getObjectUrl = function(object_name, record_id, app_id) {\n var list_view, list_view_id;\n if (!app_id) {\n app_id = Session.get(\"app_id\");\n }\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n list_view = Creator.getListView(object_name, null);\n list_view_id = list_view != null ? list_view._id : void 0;\n if (record_id) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id);\n } else {\n if (Creator.getObjectHomeComponent(object_name)) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name);\n } else {\n if (list_view_id) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id);\n } else {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name);\n }\n }\n }\n};\n\nCreator.getObjectAbsoluteUrl = function(object_name, record_id, app_id) {\n var list_view, list_view_id;\n if (!app_id) {\n app_id = Session.get(\"app_id\");\n }\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n list_view = Creator.getListView(object_name, null);\n list_view_id = list_view != null ? list_view._id : void 0;\n if (record_id) {\n return Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id, true);\n } else {\n return Steedos.absoluteUrl(\"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id, true);\n }\n};\n\nCreator.getObjectRouterUrl = function(object_name, record_id, app_id) {\n var list_view, list_view_id;\n if (!app_id) {\n app_id = Session.get(\"app_id\");\n }\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n list_view = Creator.getListView(object_name, null);\n list_view_id = list_view != null ? list_view._id : void 0;\n if (record_id) {\n return \"/app/\" + app_id + \"/\" + object_name + \"/view/\" + record_id;\n } else {\n return \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id;\n }\n};\n\nCreator.getListViewUrl = function(object_name, app_id, list_view_id) {\n var url;\n url = Creator.getListViewRelativeUrl(object_name, app_id, list_view_id);\n return Creator.getRelativeUrl(url);\n};\n\nCreator.getListViewRelativeUrl = function(object_name, app_id, list_view_id) {\n return \"/app/\" + app_id + \"/\" + object_name + \"/grid/\" + list_view_id;\n};\n\nCreator.getSwitchListUrl = function(object_name, app_id, list_view_id) {\n if (list_view_id) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + list_view_id + \"/list\");\n } else {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/list/switch\");\n }\n};\n\nCreator.getRelatedObjectUrl = function(object_name, app_id, record_id, related_object_name, related_field_name) {\n if (related_field_name) {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid?related_field_name=\" + related_field_name);\n } else {\n return Creator.getRelativeUrl(\"/app/\" + app_id + \"/\" + object_name + \"/\" + record_id + \"/\" + related_object_name + \"/grid\");\n }\n};\n\nCreator.getObjectLookupFieldOptions = function(object_name, is_deep, is_skip_hide, is_related) {\n var _object, _options, fields, icon, relatedObjects;\n _options = [];\n if (!object_name) {\n return _options;\n }\n _object = Creator.getObject(object_name);\n fields = _object != null ? _object.fields : void 0;\n icon = _object != null ? _object.icon : void 0;\n _.forEach(fields, function(f, k) {\n if (is_skip_hide && f.hidden) {\n return;\n }\n if (f.type === \"select\") {\n return _options.push({\n label: \"\" + (f.label || k),\n value: \"\" + k,\n icon: icon\n });\n } else {\n return _options.push({\n label: f.label || k,\n value: k,\n icon: icon\n });\n }\n });\n if (is_deep) {\n _.forEach(fields, function(f, k) {\n var r_object;\n if (is_skip_hide && f.hidden) {\n return;\n }\n if ((f.type === \"lookup\" || f.type === \"master_detail\") && f.reference_to && _.isString(f.reference_to)) {\n r_object = Creator.getObject(f.reference_to);\n if (r_object) {\n return _.forEach(r_object.fields, function(f2, k2) {\n return _options.push({\n label: (f.label || k) + \"=>\" + (f2.label || k2),\n value: k + \".\" + k2,\n icon: r_object != null ? r_object.icon : void 0\n });\n });\n }\n }\n });\n }\n if (is_related) {\n relatedObjects = Creator.getRelatedObjects(object_name);\n _.each(relatedObjects, (function(_this) {\n return function(_relatedObject) {\n var relatedObject, relatedOptions;\n relatedOptions = Creator.getObjectLookupFieldOptions(_relatedObject.object_name, false, false, false);\n relatedObject = Creator.getObject(_relatedObject.object_name);\n return _.each(relatedOptions, function(relatedOption) {\n if (_relatedObject.foreign_key !== relatedOption.value) {\n return _options.push({\n label: (relatedObject.label || relatedObject.name) + \"=>\" + relatedOption.label,\n value: relatedObject.name + \".\" + relatedOption.value,\n icon: relatedObject != null ? relatedObject.icon : void 0\n });\n }\n });\n };\n })(this));\n }\n return _options;\n};\n\nCreator.getObjectFilterFieldOptions = function(object_name) {\n var _object, _options, fields, icon, permission_fields;\n _options = [];\n if (!object_name) {\n return _options;\n }\n _object = Creator.getObject(object_name);\n fields = _object != null ? _object.fields : void 0;\n permission_fields = Creator.getFields(object_name);\n icon = _object != null ? _object.icon : void 0;\n _.forEach(fields, function(f, k) {\n if (!_.include([\"grid\", \"object\", \"[Object]\", \"[object]\", \"Object\", \"avatar\", \"image\", \"markdown\", \"html\"], f.type) && !f.hidden) {\n if (!/\\w+\\./.test(k) && _.indexOf(permission_fields, k) > -1) {\n return _options.push({\n label: f.label || k,\n value: k,\n icon: icon\n });\n }\n }\n });\n return _options;\n};\n\nCreator.getObjectFieldOptions = function(object_name) {\n var _object, _options, fields, icon, permission_fields;\n _options = [];\n if (!object_name) {\n return _options;\n }\n _object = Creator.getObject(object_name);\n fields = _object != null ? _object.fields : void 0;\n permission_fields = Creator.getFields(object_name);\n icon = _object != null ? _object.icon : void 0;\n _.forEach(fields, function(f, k) {\n if (!_.include([\"grid\", \"object\", \"[Object]\", \"[object]\", \"Object\", \"markdown\", \"html\"], f.type)) {\n if (!/\\w+\\./.test(k) && _.indexOf(permission_fields, k) > -1) {\n return _options.push({\n label: f.label || k,\n value: k,\n icon: icon\n });\n }\n }\n });\n return _options;\n};\n\n\n/*\nfilters: 要转换的filters\nfields: 对象字段\nfilter_fields: 默认过滤字段,支持字符串数组和对象数组两种格式,如:['filed_name1','filed_name2'],[{field:'filed_name1',required:true}]\n处理逻辑: 把filters中存在于filter_fields的过滤条件增加每项的is_default、is_required属性,不存在于filter_fields的过滤条件对应的移除每项的相关属性\n返回结果: 处理后的filters\n */\n\nCreator.getFiltersWithFilterFields = function(filters, fields, filter_fields) {\n if (!filters) {\n filters = [];\n }\n if (!filter_fields) {\n filter_fields = [];\n }\n if (filter_fields != null ? filter_fields.length : void 0) {\n filter_fields.forEach(function(n) {\n if (_.isString(n)) {\n n = {\n field: n,\n required: false\n };\n }\n if (fields[n.field] && !_.findWhere(filters, {\n field: n.field\n })) {\n return filters.push({\n field: n.field,\n is_default: true,\n is_required: n.required\n });\n }\n });\n }\n filters.forEach(function(filterItem) {\n var matchField;\n matchField = filter_fields.find(function(n) {\n return n === filterItem.field || n.field === filterItem.field;\n });\n if (_.isString(matchField)) {\n matchField = {\n field: matchField,\n required: false\n };\n }\n if (matchField) {\n filterItem.is_default = true;\n return filterItem.is_required = matchField.required;\n } else {\n delete filterItem.is_default;\n return delete filterItem.is_required;\n }\n });\n return filters;\n};\n\nCreator.getObjectRecord = function(object_name, record_id, select_fields, expand) {\n var collection, obj, record, ref, ref1, ref2;\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!record_id) {\n record_id = Session.get(\"record_id\");\n }\n if (Meteor.isClient) {\n if (object_name === Session.get(\"object_name\") && record_id === Session.get(\"record_id\")) {\n if ((ref = Template.instance()) != null ? ref.record : void 0) {\n return (ref1 = Template.instance()) != null ? (ref2 = ref1.record) != null ? ref2.get() : void 0 : void 0;\n }\n } else {\n return Creator.odata.get(object_name, record_id, select_fields, expand);\n }\n }\n obj = Creator.getObject(object_name);\n if (obj.database_name === \"meteor\" || !obj.database_name) {\n collection = Creator.getCollection(object_name);\n if (collection) {\n record = collection.findOne(record_id);\n return record;\n }\n } else if (object_name && record_id) {\n return Creator.odata.get(object_name, record_id, select_fields, expand);\n }\n};\n\nCreator.getObjectRecordName = function(record, object_name) {\n var name_field_key, ref;\n if (!record) {\n record = Creator.getObjectRecord();\n }\n if (record) {\n name_field_key = object_name === \"organizations\" ? \"name\" : (ref = Creator.getObject(object_name)) != null ? ref.NAME_FIELD_KEY : void 0;\n if (record && name_field_key) {\n return record.label || record[name_field_key];\n }\n }\n};\n\nCreator.getApp = function(app_id) {\n var appMenus, currentApp;\n appMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n if (!appMenus) {\n return {};\n }\n currentApp = appMenus.find(function(menuItem) {\n return menuItem.id === app_id;\n });\n return currentApp;\n};\n\nCreator.getAppDashboard = function(app_id) {\n var app, dashboard;\n app = Creator.getApp(app_id);\n if (!app) {\n return;\n }\n dashboard = null;\n _.each(Creator.Dashboards, function(v, k) {\n var ref;\n if (((ref = v.apps) != null ? ref.indexOf(app._id) : void 0) > -1) {\n return dashboard = v;\n }\n });\n return dashboard;\n};\n\nCreator.getAppDashboardComponent = function(app_id) {\n var app;\n app = Creator.getApp(app_id);\n if (!app || true) {\n\n }\n};\n\nCreator.getAppObjectNames = function(app_id) {\n var app, appObjects, isMobile, objects;\n app = Creator.getApp(app_id);\n if (!app) {\n return;\n }\n isMobile = Steedos.isMobile();\n appObjects = isMobile ? app.mobile_objects : app.objects;\n objects = [];\n if (app) {\n _.each(appObjects, function(v) {\n var obj;\n obj = Creator.getObject(v);\n if (obj != null ? obj.permissions.get().allowRead : void 0) {\n return objects.push(v);\n }\n });\n }\n return objects;\n};\n\nCreator.getUrlWithToken = function(url, expressionFormData) {\n var hasQuerySymbol, linkStr, params;\n params = {};\n params[\"X-Space-Id\"] = Steedos.spaceId();\n params[\"X-User-Id\"] = Steedos.userId();\n params[\"X-Company-Ids\"] = Steedos.getUserCompanyIds();\n params[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n if (Steedos.isExpression(url)) {\n url = Steedos.parseSingleExpression(url, expressionFormData, \"#\", Creator.USER_CONTEXT);\n }\n hasQuerySymbol = /(\\#.+\\?)|(\\?[^#]*$)/g.test(url);\n linkStr = hasQuerySymbol ? \"&\" : \"?\";\n return \"\" + url + linkStr + ($.param(params));\n};\n\nCreator.getAppMenu = function(app_id, menu_id) {\n var menus;\n menus = Creator.getAppMenus(app_id);\n return menus && menus.find(function(menu) {\n return menu.id === menu_id;\n });\n};\n\nCreator.getAppMenuUrlForInternet = function(menu) {\n return Creator.getUrlWithToken(menu.path, menu);\n};\n\nCreator.getAppMenuUrl = function(menu) {\n var url;\n url = menu.path;\n if (menu.type === \"url\") {\n if (menu.target) {\n return Creator.getAppMenuUrlForInternet(menu);\n } else {\n return \"/app/-/tab_iframe/\" + menu.id;\n }\n } else {\n return menu.path;\n }\n};\n\nCreator.getAppMenus = function(app_id) {\n var appMenus, curentAppMenus;\n appMenus = Session.get(\"_app_menus\") || Session.get(\"app_menus\");\n if (!appMenus) {\n return [];\n }\n curentAppMenus = appMenus.find(function(menuItem) {\n return menuItem.id === app_id;\n });\n if (curentAppMenus) {\n return curentAppMenus.children;\n }\n};\n\nCreator.loadAppsMenus = function() {\n var data, isMobile, options;\n isMobile = Steedos.isMobile();\n data = {};\n if (isMobile) {\n data.mobile = isMobile;\n }\n options = {\n type: 'get',\n data: data,\n success: function(data) {\n return Session.set(\"app_menus\", data);\n }\n };\n return typeof Steedos !== \"undefined\" && Steedos !== null ? Steedos.authRequest(\"/service/api/apps/menus\", options) : void 0;\n};\n\nCreator.creatorAppsSelector = function(apps, assigned_apps) {\n var adminApp, creatorApps, sortedApps;\n adminApp = void 0;\n sortedApps = void 0;\n _.each(apps, function(app, key) {\n if (!app._id) {\n app._id = key;\n }\n if (app.is_creator) {\n\n } else {\n app.visible = false;\n }\n });\n sortedApps = _.sortBy(_.values(apps), 'sort');\n creatorApps = {};\n adminApp = {};\n _.each(sortedApps, function(n) {\n if (n._id === 'admin') {\n return adminApp = n;\n } else {\n return creatorApps[n._id] = n;\n }\n });\n creatorApps.admin = adminApp;\n if (assigned_apps.length) {\n _.each(creatorApps, function(app, key) {\n if (assigned_apps.indexOf(key) > -1) {\n app.visible = app.is_creator;\n } else {\n app.visible = false;\n }\n });\n }\n return creatorApps;\n};\n\nCreator.visibleAppsSelector = function(creatorApps, includeAdmin) {\n var apps;\n if (includeAdmin == null) {\n includeAdmin = true;\n }\n apps = [];\n _.each(creatorApps, function(v, k) {\n if (v.visible !== false && v._id !== 'admin' || includeAdmin && v._id === 'admin') {\n apps.push(v);\n }\n });\n return apps;\n};\n\nCreator.getVisibleApps = function(includeAdmin) {\n var changeApp, creatorApps;\n changeApp = Creator._subApp.get();\n creatorApps = Object.assign({}, Creator.Apps, {\n apps: changeApp\n });\n return Creator.visibleAppsSelector(creatorApps, includeAdmin);\n};\n\nCreator.getVisibleAppsObjects = function() {\n var apps, objects, visibleObjectNames;\n apps = Creator.getVisibleApps();\n visibleObjectNames = _.flatten(_.pluck(apps, 'objects'));\n objects = _.filter(Creator.Objects, function(obj) {\n if (visibleObjectNames.indexOf(obj.name) < 0) {\n return false;\n } else {\n return true;\n }\n });\n objects = objects.sort(Creator.sortingMethod.bind({\n key: \"label\"\n }));\n objects = _.pluck(objects, 'name');\n return _.uniq(objects);\n};\n\nCreator.getAppsObjects = function() {\n var objects, tempObjects;\n objects = [];\n tempObjects = [];\n _.forEach(Creator.Apps, function(app) {\n tempObjects = _.filter(app.objects, function(obj) {\n return !obj.hidden;\n });\n return objects = objects.concat(tempObjects);\n });\n return _.uniq(objects);\n};\n\nCreator.validateFilters = function(filters, logic) {\n var e, errorMsg, filter_items, filter_length, flag, index, word;\n filter_items = _.map(filters, function(obj) {\n if (_.isEmpty(obj)) {\n return false;\n } else {\n return obj;\n }\n });\n filter_items = _.compact(filter_items);\n errorMsg = \"\";\n filter_length = filter_items.length;\n if (logic) {\n logic = logic.replace(/\\n/g, \"\").replace(/\\s+/g, \" \");\n if (/[._\\-!+]+/ig.test(logic)) {\n errorMsg = \"含有特殊字符。\";\n }\n if (!errorMsg) {\n index = logic.match(/\\d+/ig);\n if (!index) {\n errorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\";\n } else {\n index.forEach(function(i) {\n if (i < 1 || i > filter_length) {\n return errorMsg = \"您的筛选条件引用了未定义的筛选器:\" + i + \"。\";\n }\n });\n flag = 1;\n while (flag <= filter_length) {\n if (!index.includes(\"\" + flag)) {\n errorMsg = \"有些筛选条件进行了定义,但未在高级筛选条件中被引用。\";\n }\n flag++;\n }\n }\n }\n if (!errorMsg) {\n word = logic.match(/[a-zA-Z]+/ig);\n if (word) {\n word.forEach(function(w) {\n if (!/^(and|or)$/ig.test(w)) {\n return errorMsg = \"检查您的高级筛选条件中的拼写。\";\n }\n });\n }\n }\n if (!errorMsg) {\n try {\n Creator[\"eval\"](logic.replace(/and/ig, \"&&\").replace(/or/ig, \"||\"));\n } catch (error) {\n e = error;\n errorMsg = \"您的筛选器中含有特殊字符\";\n }\n if (/(AND)[^()]+(OR)/ig.test(logic) || /(OR)[^()]+(AND)/ig.test(logic)) {\n errorMsg = \"您的筛选器必须在连续性的 AND 和 OR 表达式前后使用括号。\";\n }\n }\n }\n if (errorMsg) {\n console.log(\"error\", errorMsg);\n if (Meteor.isClient) {\n toastr.error(errorMsg);\n }\n return false;\n } else {\n return true;\n }\n};\n\n\n/*\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n */\n\nCreator.formatFiltersToMongo = function(filters, options) {\n var selector;\n if (!(filters != null ? filters.length : void 0)) {\n return;\n }\n if (!(filters[0] instanceof Array)) {\n filters = _.map(filters, function(obj) {\n return [obj.field, obj.operation, obj.value];\n });\n }\n selector = [];\n _.each(filters, function(filter) {\n var field, option, reg, sub_selector, value;\n field = filter[0];\n option = filter[1];\n if (Meteor.isClient) {\n value = Creator.evaluateFormula(filter[2]);\n } else {\n value = Creator.evaluateFormula(filter[2], null, options);\n }\n sub_selector = {};\n sub_selector[field] = {};\n if (option === \"=\") {\n sub_selector[field][\"$eq\"] = value;\n } else if (option === \"<>\") {\n sub_selector[field][\"$ne\"] = value;\n } else if (option === \">\") {\n sub_selector[field][\"$gt\"] = value;\n } else if (option === \">=\") {\n sub_selector[field][\"$gte\"] = value;\n } else if (option === \"<\") {\n sub_selector[field][\"$lt\"] = value;\n } else if (option === \"<=\") {\n sub_selector[field][\"$lte\"] = value;\n } else if (option === \"startswith\") {\n reg = new RegExp(\"^\" + value, \"i\");\n sub_selector[field][\"$regex\"] = reg;\n } else if (option === \"contains\") {\n reg = new RegExp(value, \"i\");\n sub_selector[field][\"$regex\"] = reg;\n } else if (option === \"notcontains\") {\n reg = new RegExp(\"^((?!\" + value + \").)*$\", \"i\");\n sub_selector[field][\"$regex\"] = reg;\n }\n return selector.push(sub_selector);\n });\n return selector;\n};\n\nCreator.isBetweenFilterOperation = function(operation) {\n var ref;\n return operation === \"between\" || !!((ref = Creator.getBetweenTimeBuiltinValues(true)) != null ? ref[operation] : void 0);\n};\n\n\n/*\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\n\textend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n */\n\nCreator.formatFiltersToDev = function(filters, object_name, options) {\n var logicTempFilters, selector;\n if (!filters.length) {\n return;\n }\n if (options != null ? options.is_logic_or : void 0) {\n logicTempFilters = [];\n filters.forEach(function(n) {\n logicTempFilters.push(n);\n return logicTempFilters.push(\"or\");\n });\n logicTempFilters.pop();\n filters = logicTempFilters;\n }\n selector = SteedosFilters.formatFiltersToDev(filters, Creator.USER_CONTEXT);\n return selector;\n};\n\n\n/*\noptions参数:\n\textend-- 是否需要把当前用户基本信息加入公式,即让公式支持Creator.USER_CONTEXT中的值,默认为true\n\tuserId-- 当前登录用户\n\tspaceId-- 当前所在工作区\nextend为true时,后端需要额外传入userId及spaceId用于抓取Creator.USER_CONTEXT对应的值\n */\n\nCreator.formatLogicFiltersToDev = function(filters, filter_logic, options) {\n var format_logic;\n format_logic = filter_logic.replace(/\\(\\s+/ig, \"(\").replace(/\\s+\\)/ig, \")\").replace(/\\(/g, \"[\").replace(/\\)/g, \"]\").replace(/\\s+/g, \",\").replace(/(and|or)/ig, \"'$1'\");\n format_logic = format_logic.replace(/(\\d)+/ig, function(x) {\n var _f, field, option, sub_selector, value;\n _f = filters[x - 1];\n field = _f.field;\n option = _f.operation;\n if (Meteor.isClient) {\n value = Creator.evaluateFormula(_f.value);\n } else {\n value = Creator.evaluateFormula(_f.value, null, options);\n }\n sub_selector = [];\n if (_.isArray(value) === true) {\n if (option === \"=\") {\n _.each(value, function(v) {\n return sub_selector.push([field, option, v], \"or\");\n });\n } else if (option === \"<>\") {\n _.each(value, function(v) {\n return sub_selector.push([field, option, v], \"and\");\n });\n } else {\n _.each(value, function(v) {\n return sub_selector.push([field, option, v], \"or\");\n });\n }\n if (sub_selector[sub_selector.length - 1] === \"and\" || sub_selector[sub_selector.length - 1] === \"or\") {\n sub_selector.pop();\n }\n } else {\n sub_selector = [field, option, value];\n }\n return JSON.stringify(sub_selector);\n });\n format_logic = \"[\" + format_logic + \"]\";\n return Creator[\"eval\"](format_logic);\n};\n\nCreator.getRelatedObjects = function(object_name, spaceId, userId) {\n var _object, permissions, related_object_names, related_objects, unrelated_objects;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n related_object_names = [];\n _object = Creator.getObject(object_name);\n if (!_object) {\n return related_object_names;\n }\n related_objects = Creator.getObjectRelateds(_object._collection_name);\n related_object_names = _.pluck(related_objects, \"object_name\");\n if ((related_object_names != null ? related_object_names.length : void 0) === 0) {\n return related_object_names;\n }\n permissions = Creator.getPermissions(object_name, spaceId, userId);\n unrelated_objects = permissions.unrelated_objects;\n related_object_names = _.difference(related_object_names, unrelated_objects);\n return _.filter(related_objects, function(related_object) {\n var allowRead, isActive, ref, related_object_name;\n related_object_name = related_object.object_name;\n isActive = related_object_names.indexOf(related_object_name) > -1;\n allowRead = (ref = Creator.getPermissions(related_object_name, spaceId, userId)) != null ? ref.allowRead : void 0;\n if (related_object_name === \"cms_files\") {\n allowRead = allowRead && permissions.allowReadFiles;\n }\n return isActive && allowRead;\n });\n};\n\nCreator.getRelatedObjectNames = function(object_name, spaceId, userId) {\n var related_objects;\n related_objects = Creator.getRelatedObjects(object_name, spaceId, userId);\n return _.pluck(related_objects, \"object_name\");\n};\n\nCreator.getRelatedObjectListActions = function(relatedObjectName, spaceId, userId) {\n var actions;\n actions = Creator.getActions(relatedObjectName, spaceId, userId);\n actions = _.filter(actions, function(action) {\n if (action.name === \"standard_follow\") {\n return false;\n }\n if (action.name === \"standard_query\") {\n return false;\n }\n if (action.on === \"list\") {\n if (typeof action.visible === \"function\") {\n return action.visible();\n } else {\n return action.visible;\n }\n } else {\n return false;\n }\n });\n return actions;\n};\n\nCreator.getActions = function(object_name, spaceId, userId) {\n var actions, disabled_actions, obj, permissions, ref, ref1;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n obj = Creator.getObject(object_name);\n if (!obj) {\n return;\n }\n permissions = Creator.getPermissions(object_name, spaceId, userId);\n disabled_actions = permissions.disabled_actions;\n actions = _.sortBy(_.values(obj.actions), 'sort');\n if (_.has(obj, 'allow_customActions')) {\n actions = _.filter(actions, function(action) {\n return _.include(obj.allow_customActions, action.name) || _.include(_.keys(Creator.getObject('base').actions) || {}, action.name);\n });\n }\n if (_.has(obj, 'exclude_actions')) {\n actions = _.filter(actions, function(action) {\n return !_.include(obj.exclude_actions, action.name);\n });\n }\n _.each(actions, function(action) {\n if (Steedos.isMobile() && [\"record\", \"record_only\"].indexOf(action.on) > -1 && action.name !== 'standard_edit') {\n if (action.on === \"record_only\") {\n return action.on = 'record_only_more';\n } else {\n return action.on = 'record_more';\n }\n }\n });\n if (Steedos.isMobile() && [\"cms_files\", \"cfs.files.filerecord\"].indexOf(object_name) > -1) {\n if ((ref = actions.find(function(n) {\n return n.name === \"standard_edit\";\n })) != null) {\n ref.on = \"record_more\";\n }\n if ((ref1 = actions.find(function(n) {\n return n.name === \"download\";\n })) != null) {\n ref1.on = \"record\";\n }\n }\n actions = _.filter(actions, function(action) {\n return _.indexOf(disabled_actions, action.name) < 0;\n });\n return actions;\n};\n\n/返回当前用户有权限访问的所有list_view,包括分享的,用户自定义非分享的(除非owner变了),以及默认的其他视图注意Creator.getPermissions函数中是不会有用户自定义非分享的视图的,所以Creator.getPermissions函数中拿到的结果不全,并不是当前用户能看到所有视图/;\n\nCreator.getListViews = function(object_name, spaceId, userId) {\n var disabled_list_views, isMobile, listViews, list_views, object, ref;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n if (!object_name) {\n return;\n }\n object = Creator.getObject(object_name);\n if (!object) {\n return;\n }\n disabled_list_views = ((ref = Creator.getPermissions(object_name, spaceId, userId)) != null ? ref.disabled_list_views : void 0) || [];\n list_views = [];\n isMobile = Steedos.isMobile();\n _.each(object.list_views, function(item, item_name) {\n return item.name = item_name;\n });\n listViews = _.sortBy(_.values(object.list_views), 'sort_no');\n _.each(listViews, function(item) {\n var isDisabled;\n if (isMobile && item.type === \"calendar\") {\n return;\n }\n if (item.name !== \"default\") {\n isDisabled = _.indexOf(disabled_list_views, item.name) > -1 || (item._id && _.indexOf(disabled_list_views, item._id) > -1);\n if (!isDisabled || item.owner === userId) {\n return list_views.push(item);\n }\n }\n });\n return list_views;\n};\n\nCreator.getFields = function(object_name, spaceId, userId) {\n var fieldsName, ref, unreadable_fields;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n fieldsName = Creator.getObjectFieldsName(object_name);\n unreadable_fields = (ref = Creator.getPermissions(object_name, spaceId, userId)) != null ? ref.unreadable_fields : void 0;\n return _.difference(fieldsName, unreadable_fields);\n};\n\nCreator.isloading = function() {\n return !Creator.bootstrapLoaded.get();\n};\n\nCreator.convertSpecialCharacter = function(str) {\n return str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\");\n};\n\nCreator.getDisabledFields = function(schema) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return field.autoform && field.autoform.disabled && !field.autoform.omit && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getHiddenFields = function(schema) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return field.autoform && field.autoform.type === \"hidden\" && !field.autoform.omit && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getFieldsWithNoGroup = function(schema) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return (!field.autoform || !field.autoform.group || field.autoform.group === \"-\") && (!field.autoform || field.autoform.type !== \"hidden\") && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getSortedFieldGroupNames = function(schema) {\n var names;\n names = _.map(schema, function(field) {\n return field.autoform && field.autoform.group !== \"-\" && field.autoform.group;\n });\n names = _.compact(names);\n names = _.unique(names);\n return names;\n};\n\nCreator.getFieldsForGroup = function(schema, groupName) {\n var fields;\n fields = _.map(schema, function(field, fieldName) {\n return field.autoform && field.autoform.group === groupName && field.autoform.type !== \"hidden\" && fieldName;\n });\n fields = _.compact(fields);\n return fields;\n};\n\nCreator.getSystemBaseFields = function() {\n return [\"created\", \"created_by\", \"modified\", \"modified_by\"];\n};\n\nCreator.getFieldsWithoutSystemBase = function(keys) {\n return _.difference(keys, Creator.getSystemBaseFields());\n};\n\nCreator.getFieldsWithoutOmit = function(schema, keys) {\n keys = _.map(keys, function(key) {\n var field, ref;\n field = _.pick(schema, key);\n if ((ref = field[key].autoform) != null ? ref.omit : void 0) {\n return false;\n } else {\n return key;\n }\n });\n keys = _.compact(keys);\n return keys;\n};\n\nCreator.getFieldsInFirstLevel = function(firstLevelKeys, keys) {\n keys = _.map(keys, function(key) {\n if (_.indexOf(firstLevelKeys, key) > -1) {\n return key;\n } else {\n return false;\n }\n });\n keys = _.compact(keys);\n return keys;\n};\n\nCreator.getFieldsForReorder = function(schema, keys, isSingle) {\n var _keys, childKeys, fields, i, is_wide_1, is_wide_2, sc_1, sc_2;\n fields = [];\n i = 0;\n _keys = _.filter(keys, function(key) {\n return !key.endsWith('_endLine');\n });\n while (i < _keys.length) {\n sc_1 = _.pick(schema, _keys[i]);\n sc_2 = _.pick(schema, _keys[i + 1]);\n is_wide_1 = false;\n is_wide_2 = false;\n _.each(sc_1, function(value) {\n var ref, ref1;\n if (((ref = value.autoform) != null ? ref.is_wide : void 0) || ((ref1 = value.autoform) != null ? ref1.type : void 0) === \"table\") {\n return is_wide_1 = true;\n }\n });\n _.each(sc_2, function(value) {\n var ref, ref1;\n if (((ref = value.autoform) != null ? ref.is_wide : void 0) || ((ref1 = value.autoform) != null ? ref1.type : void 0) === \"table\") {\n return is_wide_2 = true;\n }\n });\n if (Steedos.isMobile()) {\n is_wide_1 = true;\n is_wide_2 = true;\n }\n if (isSingle) {\n fields.push(_keys.slice(i, i + 1));\n i += 1;\n } else {\n if (is_wide_1) {\n fields.push(_keys.slice(i, i + 1));\n i += 1;\n } else if (!is_wide_1 && is_wide_2) {\n childKeys = _keys.slice(i, i + 1);\n childKeys.push(void 0);\n fields.push(childKeys);\n i += 1;\n } else if (!is_wide_1 && !is_wide_2) {\n childKeys = _keys.slice(i, i + 1);\n if (_keys[i + 1]) {\n childKeys.push(_keys[i + 1]);\n } else {\n childKeys.push(void 0);\n }\n fields.push(childKeys);\n i += 2;\n }\n }\n }\n return fields;\n};\n\nCreator.isFilterValueEmpty = function(v) {\n return typeof v === \"undefined\" || v === null || Number.isNaN(v) || v.length === 0;\n};\n\nCreator.getFieldDataType = function(objectFields, key) {\n var ref, result;\n if (objectFields && key) {\n result = (ref = objectFields[key]) != null ? ref.type : void 0;\n if ([\"formula\", \"summary\"].indexOf(result) > -1) {\n result = objectFields[key].data_type;\n }\n return result;\n } else {\n return \"text\";\n }\n};\n\nif (Meteor.isServer) {\n Creator.getAllRelatedObjects = function(object_name) {\n var related_object_names;\n related_object_names = [];\n _.each(Creator.Objects, function(related_object, related_object_name) {\n return _.each(related_object.fields, function(related_field, related_field_name) {\n if (related_field.type === \"master_detail\" && related_field.reference_to && related_field.reference_to === object_name) {\n return related_object_names.push(related_object_name);\n }\n });\n });\n if (Creator.getObject(object_name).enable_files) {\n related_object_names.push(\"cms_files\");\n }\n return related_object_names;\n };\n}\n\nif (Meteor.isServer) {\n Steedos.formatIndex = function(array) {\n var indexName, isdocumentDB, object, ref, ref1, ref2;\n object = {\n background: true\n };\n isdocumentDB = ((ref = Meteor.settings) != null ? (ref1 = ref.datasources) != null ? (ref2 = ref1[\"default\"]) != null ? ref2.documentDB : void 0 : void 0 : void 0) || false;\n if (isdocumentDB) {\n if (array.length > 0) {\n indexName = array.join(\".\");\n object.name = indexName;\n if (indexName.length > 52) {\n object.name = indexName.substring(0, 52);\n }\n }\n }\n return object;\n };\n}\n","Creator.appsByName = {}\n\n","Meteor.methods\n\t\"object_recent_viewed\": (object_name, record_id, space_id)->\n\t\tif !this.userId\n\t\t\treturn null\n\n\t\tif object_name == \"object_recent_viewed\"\n\t\t\treturn\n\t\tif object_name and record_id\n\t\t\tif !space_id\n\t\t\t\tdoc = Creator.getCollection(object_name).findOne({_id: record_id}, {fields: {space: 1}})\n\t\t\t\tspace_id = doc?.space\n\n\t\t\tcollection_recent_viewed = Creator.getCollection(\"object_recent_viewed\")\n\t\t\tfilters = { owner: this.userId, space: space_id, 'record.o': object_name, 'record.ids': [record_id]}\n\t\t\tcurrent_recent_viewed = collection_recent_viewed.findOne(filters)\n\t\t\tif current_recent_viewed\n\t\t\t\tcollection_recent_viewed.update(\n\t\t\t\t\tcurrent_recent_viewed._id,\n\t\t\t\t\t{\n\t\t\t\t\t\t$inc: {\n\t\t\t\t\t\t\tcount: 1\n\t\t\t\t\t\t},\n\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\t\tmodified_by: this.userId\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\telse\n\t\t\t\tcollection_recent_viewed.insert(\n\t\t\t\t\t{\n\t\t\t\t\t\t_id: collection_recent_viewed._makeNewID()\n\t\t\t\t\t\towner: this.userId\n\t\t\t\t\t\tspace: space_id\n\t\t\t\t\t\trecord: {o: object_name, ids: [record_id]}\n\t\t\t\t\t\tcount: 1\n\t\t\t\t\t\tcreated: new Date()\n\t\t\t\t\t\tcreated_by: this.userId\n\t\t\t\t\t\tmodified: new Date()\n\t\t\t\t\t\tmodified_by: this.userId\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvalidate: false\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\treturn","Meteor.methods({\n \"object_recent_viewed\": function(object_name, record_id, space_id) {\n var collection_recent_viewed, current_recent_viewed, doc, filters;\n if (!this.userId) {\n return null;\n }\n if (object_name === \"object_recent_viewed\") {\n return;\n }\n if (object_name && record_id) {\n if (!space_id) {\n doc = Creator.getCollection(object_name).findOne({\n _id: record_id\n }, {\n fields: {\n space: 1\n }\n });\n space_id = doc != null ? doc.space : void 0;\n }\n collection_recent_viewed = Creator.getCollection(\"object_recent_viewed\");\n filters = {\n owner: this.userId,\n space: space_id,\n 'record.o': object_name,\n 'record.ids': [record_id]\n };\n current_recent_viewed = collection_recent_viewed.findOne(filters);\n if (current_recent_viewed) {\n collection_recent_viewed.update(current_recent_viewed._id, {\n $inc: {\n count: 1\n },\n $set: {\n modified: new Date(),\n modified_by: this.userId\n }\n });\n } else {\n collection_recent_viewed.insert({\n _id: collection_recent_viewed._makeNewID(),\n owner: this.userId,\n space: space_id,\n record: {\n o: object_name,\n ids: [record_id]\n },\n count: 1,\n created: new Date(),\n created_by: this.userId,\n modified: new Date(),\n modified_by: this.userId\n }, {\n validate: false\n });\n }\n }\n }\n});\n","recent_aggregate = (created_by, spaceId, _records, callback)->\n\tCreator.Collections.object_recent_viewed.rawCollection().aggregate([\n\t\t{$match: {created_by: created_by, space: spaceId}},\n\t\t{$group: {_id: {object_name: \"$record.o\", record_id: \"$record.ids\", space: \"$space\"}, maxCreated: {$max: \"$created\"}}},\n\t\t{$sort: {maxCreated: -1}},\n\t\t{$limit: 10}\n\t]).toArray (err, data)->\n\t\tif err\n\t\t\tthrow new Error(err)\n\n\t\tdata.forEach (doc) ->\n\t\t\t_records.push doc._id\n\n\t\tif callback && _.isFunction(callback)\n\t\t\tcallback()\n\n\t\treturn\n\nasync_recent_aggregate = Meteor.wrapAsync(recent_aggregate)\n\nsearch_object = (space, object_name,userId, searchText)->\n\tdata = new Array()\n\n\tif searchText\n\n\t\t_object = Creator.getObject(object_name)\n\n\t\t_object_collection = Creator.getCollection(object_name)\n\t\t_object_name_key = _object?.NAME_FIELD_KEY\n\t\tif _object && _object_collection && _object_name_key\n\t\t\tquery = {}\n\t\t\tsearch_Keywords = searchText.split(\" \")\n\t\t\tquery_and = []\n\t\t\tsearch_Keywords.forEach (keyword)->\n\t\t\t\tsubquery = {}\n\t\t\t\tsubquery[_object_name_key] = {$regex: keyword.trim()}\n\t\t\t\tquery_and.push subquery\n\n\t\t\tquery.$and = query_and\n\t\t\tquery.space = {$in: [space]}\n\n\t\t\tfields = {_id: 1}\n\t\t\tfields[_object_name_key] = 1\n\n\t\t\trecords = _object_collection.find(query, {fields: fields, sort: {modified: 1}, limit: 5})\n\n\t\t\trecords.forEach (record)->\n\t\t\t\tdata.push {_id: record._id, _name: record[_object_name_key], _object_name: object_name}\n\t\n\treturn data\n\nMeteor.methods\n\t'object_recent_record': (spaceId)->\n\t\tdata = new Array()\n\t\trecords = new Array()\n\t\tasync_recent_aggregate(this.userId, spaceId, records)\n\t\trecords.forEach (item)->\n\t\t\trecord_object = Creator.getObject(item.object_name, item.space)\n\n\t\t\tif !record_object\n\t\t\t\treturn\n\n\t\t\trecord_object_collection = Creator.getCollection(item.object_name, item.space)\n\n\t\t\tif record_object && record_object_collection\n\t\t\t\tfields = {_id: 1}\n\n\t\t\t\tfields[record_object.NAME_FIELD_KEY] = 1\n\n\t\t\t\trecord = record_object_collection.findOne(item.record_id[0], {fields: fields})\n\t\t\t\tif record\n\t\t\t\t\tdata.push {_id: record._id, _name: record[record_object.NAME_FIELD_KEY], _object_name: item.object_name}\n\n\t\treturn data\n\n\t'object_record_search': (options)->\n\t\tself = this\n\n\t\tdata = new Array()\n\n\t\tsearchText = options.searchText\n\t\tspace = options.space\n\n\t\t_.forEach Creator.objectsByName, (_object, name)->\n\t\t\tif _object.enable_search\n\t\t\t\tobject_record = search_object(space, _object.name, self.userId, searchText)\n\t\t\t\tdata = data.concat(object_record)\n\n\t\treturn data\n","var async_recent_aggregate, recent_aggregate, search_object;\n\nrecent_aggregate = function(created_by, spaceId, _records, callback) {\n return Creator.Collections.object_recent_viewed.rawCollection().aggregate([\n {\n $match: {\n created_by: created_by,\n space: spaceId\n }\n }, {\n $group: {\n _id: {\n object_name: \"$record.o\",\n record_id: \"$record.ids\",\n space: \"$space\"\n },\n maxCreated: {\n $max: \"$created\"\n }\n }\n }, {\n $sort: {\n maxCreated: -1\n }\n }, {\n $limit: 10\n }\n ]).toArray(function(err, data) {\n if (err) {\n throw new Error(err);\n }\n data.forEach(function(doc) {\n return _records.push(doc._id);\n });\n if (callback && _.isFunction(callback)) {\n callback();\n }\n });\n};\n\nasync_recent_aggregate = Meteor.wrapAsync(recent_aggregate);\n\nsearch_object = function(space, object_name, userId, searchText) {\n var _object, _object_collection, _object_name_key, data, fields, query, query_and, records, search_Keywords;\n data = new Array();\n if (searchText) {\n _object = Creator.getObject(object_name);\n _object_collection = Creator.getCollection(object_name);\n _object_name_key = _object != null ? _object.NAME_FIELD_KEY : void 0;\n if (_object && _object_collection && _object_name_key) {\n query = {};\n search_Keywords = searchText.split(\" \");\n query_and = [];\n search_Keywords.forEach(function(keyword) {\n var subquery;\n subquery = {};\n subquery[_object_name_key] = {\n $regex: keyword.trim()\n };\n return query_and.push(subquery);\n });\n query.$and = query_and;\n query.space = {\n $in: [space]\n };\n fields = {\n _id: 1\n };\n fields[_object_name_key] = 1;\n records = _object_collection.find(query, {\n fields: fields,\n sort: {\n modified: 1\n },\n limit: 5\n });\n records.forEach(function(record) {\n return data.push({\n _id: record._id,\n _name: record[_object_name_key],\n _object_name: object_name\n });\n });\n }\n }\n return data;\n};\n\nMeteor.methods({\n 'object_recent_record': function(spaceId) {\n var data, records;\n data = new Array();\n records = new Array();\n async_recent_aggregate(this.userId, spaceId, records);\n records.forEach(function(item) {\n var fields, record, record_object, record_object_collection;\n record_object = Creator.getObject(item.object_name, item.space);\n if (!record_object) {\n return;\n }\n record_object_collection = Creator.getCollection(item.object_name, item.space);\n if (record_object && record_object_collection) {\n fields = {\n _id: 1\n };\n fields[record_object.NAME_FIELD_KEY] = 1;\n record = record_object_collection.findOne(item.record_id[0], {\n fields: fields\n });\n if (record) {\n return data.push({\n _id: record._id,\n _name: record[record_object.NAME_FIELD_KEY],\n _object_name: item.object_name\n });\n }\n }\n });\n return data;\n },\n 'object_record_search': function(options) {\n var data, searchText, self, space;\n self = this;\n data = new Array();\n searchText = options.searchText;\n space = options.space;\n _.forEach(Creator.objectsByName, function(_object, name) {\n var object_record;\n if (_object.enable_search) {\n object_record = search_object(space, _object.name, self.userId, searchText);\n return data = data.concat(object_record);\n }\n });\n return data;\n }\n});\n","Meteor.methods\n update_filters: (listview_id, filters, filter_scope, filter_logic)->\n Creator.Collections.object_listviews.direct.update({_id: listview_id}, {$set: {filters: filters, filter_scope: filter_scope, filter_logic: filter_logic}})\n\n update_columns: (listview_id, columns)->\n check(columns, Array)\n \n if columns.length < 1\n throw new Meteor.Error 400, \"Select at least one field to display\"\n Creator.Collections.object_listviews.update({_id: listview_id}, {$set: {columns: columns}})\n","Meteor.methods({\n update_filters: function(listview_id, filters, filter_scope, filter_logic) {\n return Creator.Collections.object_listviews.direct.update({\n _id: listview_id\n }, {\n $set: {\n filters: filters,\n filter_scope: filter_scope,\n filter_logic: filter_logic\n }\n });\n },\n update_columns: function(listview_id, columns) {\n check(columns, Array);\n if (columns.length < 1) {\n throw new Meteor.Error(400, \"Select at least one field to display\");\n }\n return Creator.Collections.object_listviews.update({\n _id: listview_id\n }, {\n $set: {\n columns: columns\n }\n });\n }\n});\n","Meteor.methods\n\t'report_data': (options)->\n\t\tcheck(options, Object)\n\t\tspace = options.space\n\t\tfields = options.fields\n\t\tobject_name = options.object_name\n\t\tfilter_scope = options.filter_scope\n\t\tfilters = options.filters\n\t\tfilterFields = {}\n\t\tcompoundFields = []\n\t\tobjectFields = Creator.getObject(object_name)?.fields\n\t\t_.each fields, (item, index)->\n\t\t\tsplits = item.split(\".\")\n\t\t\tname = splits[0]\n\t\t\tobjectField = objectFields[name]\n\t\t\tif splits.length > 1 and objectField\n\t\t\t\tchildKey = item.replace name + \".\", \"\"\n\t\t\t\tcompoundFields.push({name: name, childKey: childKey, field: objectField})\n\t\t\tfilterFields[name] = 1\n\n\t\tselector = {}\n\t\tuserId = this.userId\n\t\tselector.space = space\n\t\tif filter_scope == \"spacex\"\n\t\t\tselector.space = \n\t\t\t\t$in: [null,space]\n\t\telse if filter_scope == \"mine\"\n\t\t\tselector.owner = userId\n\n\t\tif Creator.isCommonSpace(space) && Creator.isSpaceAdmin(space, @userId)\n\t\t\tdelete selector.space\n\n\t\tif filters and filters.length > 0\n\t\t\tselector[\"$and\"] = filters\n\n\t\tcursor = Creator.getCollection(object_name).find(selector, {fields: filterFields, skip: 0, limit: 10000})\n#\t\tif cursor.count() > 10000\n#\t\t\treturn []\n\t\tresult = cursor.fetch()\n\t\tif compoundFields.length\n\t\t\tresult = result.map (item,index)->\n\t\t\t\t_.each compoundFields, (compoundFieldItem, index)->\n\t\t\t\t\titemKey = compoundFieldItem.name + \"*%*\" + compoundFieldItem.childKey.replace(/\\./g, \"*%*\")\n\t\t\t\t\titemValue = item[compoundFieldItem.name]\n\t\t\t\t\ttype = compoundFieldItem.field.type\n\t\t\t\t\tif [\"lookup\", \"master_detail\"].indexOf(type) > -1\n\t\t\t\t\t\treference_to = compoundFieldItem.field.reference_to\n\t\t\t\t\t\tcompoundFilterFields = {}\n\t\t\t\t\t\tcompoundFilterFields[compoundFieldItem.childKey] = 1\n\t\t\t\t\t\treferenceItem = Creator.getCollection(reference_to).findOne {_id: itemValue}, fields: compoundFilterFields\n\t\t\t\t\t\tif referenceItem\n\t\t\t\t\t\t\titem[itemKey] = referenceItem[compoundFieldItem.childKey]\n\t\t\t\t\telse if type == \"select\"\n\t\t\t\t\t\toptions = compoundFieldItem.field.options\n\t\t\t\t\t\titem[itemKey] = _.findWhere(options, {value: itemValue})?.label or itemValue\n\t\t\t\t\telse\n\t\t\t\t\t\titem[itemKey] = itemValue\n\t\t\t\t\tunless item[itemKey]\n\t\t\t\t\t\titem[itemKey] = \"--\"\n\t\t\t\treturn item\n\t\t\treturn result\n\t\telse\n\t\t\treturn result\n\n","Meteor.methods({\n 'report_data': function(options) {\n var compoundFields, cursor, fields, filterFields, filter_scope, filters, objectFields, object_name, ref, result, selector, space, userId;\n check(options, Object);\n space = options.space;\n fields = options.fields;\n object_name = options.object_name;\n filter_scope = options.filter_scope;\n filters = options.filters;\n filterFields = {};\n compoundFields = [];\n objectFields = (ref = Creator.getObject(object_name)) != null ? ref.fields : void 0;\n _.each(fields, function(item, index) {\n var childKey, name, objectField, splits;\n splits = item.split(\".\");\n name = splits[0];\n objectField = objectFields[name];\n if (splits.length > 1 && objectField) {\n childKey = item.replace(name + \".\", \"\");\n compoundFields.push({\n name: name,\n childKey: childKey,\n field: objectField\n });\n }\n return filterFields[name] = 1;\n });\n selector = {};\n userId = this.userId;\n selector.space = space;\n if (filter_scope === \"spacex\") {\n selector.space = {\n $in: [null, space]\n };\n } else if (filter_scope === \"mine\") {\n selector.owner = userId;\n }\n if (Creator.isCommonSpace(space) && Creator.isSpaceAdmin(space, this.userId)) {\n delete selector.space;\n }\n if (filters && filters.length > 0) {\n selector[\"$and\"] = filters;\n }\n cursor = Creator.getCollection(object_name).find(selector, {\n fields: filterFields,\n skip: 0,\n limit: 10000\n });\n result = cursor.fetch();\n if (compoundFields.length) {\n result = result.map(function(item, index) {\n _.each(compoundFields, function(compoundFieldItem, index) {\n var compoundFilterFields, itemKey, itemValue, ref1, referenceItem, reference_to, type;\n itemKey = compoundFieldItem.name + \"*%*\" + compoundFieldItem.childKey.replace(/\\./g, \"*%*\");\n itemValue = item[compoundFieldItem.name];\n type = compoundFieldItem.field.type;\n if ([\"lookup\", \"master_detail\"].indexOf(type) > -1) {\n reference_to = compoundFieldItem.field.reference_to;\n compoundFilterFields = {};\n compoundFilterFields[compoundFieldItem.childKey] = 1;\n referenceItem = Creator.getCollection(reference_to).findOne({\n _id: itemValue\n }, {\n fields: compoundFilterFields\n });\n if (referenceItem) {\n item[itemKey] = referenceItem[compoundFieldItem.childKey];\n }\n } else if (type === \"select\") {\n options = compoundFieldItem.field.options;\n item[itemKey] = ((ref1 = _.findWhere(options, {\n value: itemValue\n })) != null ? ref1.label : void 0) || itemValue;\n } else {\n item[itemKey] = itemValue;\n }\n if (!item[itemKey]) {\n return item[itemKey] = \"--\";\n }\n });\n return item;\n });\n return result;\n } else {\n return result;\n }\n }\n});\n","###\n type: \"user\"\n object_name: \"object_listviews\"\n record_id: \"{object_name},{listview_id}\"\n settings:\n column_width: { field_a: 100, field_2: 150 }\n sort: [[\"field_a\", \"desc\"]]\n owner: {userId}\n###\n\nMeteor.methods\n \"tabular_sort_settings\": (object_name, list_view_id, sort)->\n userId = this.userId\n setting = Creator.Collections.settings.findOne({object_name: object_name, record_id: \"object_listviews\", owner: userId})\n if setting\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.sort\": sort}})\n else\n doc = \n type: \"user\"\n object_name: object_name\n record_id: \"object_listviews\"\n settings: {}\n owner: userId\n\n doc.settings[list_view_id] = {}\n doc.settings[list_view_id].sort = sort\n\n Creator.Collections.settings.insert(doc)\n\n \"tabular_column_width_settings\": (object_name, list_view_id, column_width)->\n userId = this.userId\n setting = Creator.Collections.settings.findOne({object_name: object_name, record_id: \"object_listviews\", owner: userId})\n if setting\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.column_width\": column_width}})\n else\n doc = \n type: \"user\"\n object_name: object_name\n record_id: \"object_listviews\"\n settings: {}\n owner: userId\n\n doc.settings[list_view_id] = {}\n doc.settings[list_view_id].column_width = column_width\n\n Creator.Collections.settings.insert(doc)\n\n \"grid_settings\": (object_name, list_view_id, column_width, sort)->\n userId = this.userId\n setting = Creator.Collections.settings.findOne({object_name: object_name, record_id: \"object_gridviews\", owner: userId})\n if setting\n # 每次都强制改变_id_actions列的宽度,以解决当用户只改变字段次序而没有改变任何字段宽度时,前端没有订阅到字段次序变更的数据的问题\n column_width._id_actions = if setting.settings[\"#{list_view_id}\"]?.column_width?._id_actions == 46 then 47 else 46\n if sort\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.sort\": sort, \"settings.#{list_view_id}.column_width\": column_width}})\n else\n Creator.Collections.settings.update({_id: setting._id}, {$set: {\"settings.#{list_view_id}.column_width\": column_width}})\n else\n doc =\n type: \"user\"\n object_name: object_name\n record_id: \"object_gridviews\"\n settings: {}\n owner: userId\n \n doc.settings[list_view_id] = {}\n doc.settings[list_view_id].column_width = column_width\n doc.settings[list_view_id].sort = sort\n\n Creator.Collections.settings.insert(doc)","\n/*\n type: \"user\"\n object_name: \"object_listviews\"\n record_id: \"{object_name},{listview_id}\"\n settings:\n column_width: { field_a: 100, field_2: 150 }\n sort: [[\"field_a\", \"desc\"]]\n owner: {userId}\n */\nMeteor.methods({\n \"tabular_sort_settings\": function(object_name, list_view_id, sort) {\n var doc, obj, setting, userId;\n userId = this.userId;\n setting = Creator.Collections.settings.findOne({\n object_name: object_name,\n record_id: \"object_listviews\",\n owner: userId\n });\n if (setting) {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj = {},\n obj[\"settings.\" + list_view_id + \".sort\"] = sort,\n obj\n )\n });\n } else {\n doc = {\n type: \"user\",\n object_name: object_name,\n record_id: \"object_listviews\",\n settings: {},\n owner: userId\n };\n doc.settings[list_view_id] = {};\n doc.settings[list_view_id].sort = sort;\n return Creator.Collections.settings.insert(doc);\n }\n },\n \"tabular_column_width_settings\": function(object_name, list_view_id, column_width) {\n var doc, obj, setting, userId;\n userId = this.userId;\n setting = Creator.Collections.settings.findOne({\n object_name: object_name,\n record_id: \"object_listviews\",\n owner: userId\n });\n if (setting) {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj = {},\n obj[\"settings.\" + list_view_id + \".column_width\"] = column_width,\n obj\n )\n });\n } else {\n doc = {\n type: \"user\",\n object_name: object_name,\n record_id: \"object_listviews\",\n settings: {},\n owner: userId\n };\n doc.settings[list_view_id] = {};\n doc.settings[list_view_id].column_width = column_width;\n return Creator.Collections.settings.insert(doc);\n }\n },\n \"grid_settings\": function(object_name, list_view_id, column_width, sort) {\n var doc, obj, obj1, ref, ref1, setting, userId;\n userId = this.userId;\n setting = Creator.Collections.settings.findOne({\n object_name: object_name,\n record_id: \"object_gridviews\",\n owner: userId\n });\n if (setting) {\n column_width._id_actions = ((ref = setting.settings[\"\" + list_view_id]) != null ? (ref1 = ref.column_width) != null ? ref1._id_actions : void 0 : void 0) === 46 ? 47 : 46;\n if (sort) {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj = {},\n obj[\"settings.\" + list_view_id + \".sort\"] = sort,\n obj[\"settings.\" + list_view_id + \".column_width\"] = column_width,\n obj\n )\n });\n } else {\n return Creator.Collections.settings.update({\n _id: setting._id\n }, {\n $set: (\n obj1 = {},\n obj1[\"settings.\" + list_view_id + \".column_width\"] = column_width,\n obj1\n )\n });\n }\n } else {\n doc = {\n type: \"user\",\n object_name: object_name,\n record_id: \"object_gridviews\",\n settings: {},\n owner: userId\n };\n doc.settings[list_view_id] = {};\n doc.settings[list_view_id].column_width = column_width;\n doc.settings[list_view_id].sort = sort;\n return Creator.Collections.settings.insert(doc);\n }\n }\n});\n","xml2js = require 'xml2js'\nfs = require 'fs'\npath = require 'path'\nmkdirp = require 'mkdirp'\n\nlogger = new Logger 'Export_TO_XML'\n\n_writeXmlFile = (jsonObj,objName) ->\n\t# 转xml\n\tbuilder = new xml2js.Builder()\n\txml = builder.buildObject jsonObj\n\n\t# 转为buffer\n\tstream = new Buffer xml\n\n\t# 根据当天时间的年月日作为存储路径\n\tnow = new Date\n\tyear = now.getFullYear()\n\tmonth = now.getMonth() + 1\n\tday = now.getDate()\n\n\t# 文件路径\n\tfilePath = path.join(__meteor_bootstrap__.serverDir,'../../../export/' + year + '/' + month + '/' + day + '/' + objName )\n\tfileName = jsonObj?._id + \".xml\"\n\tfileAddress = path.join filePath, fileName\n\n\tif !fs.existsSync filePath\n\t\tmkdirp.sync filePath\n\n\t# 写入文件\n\tfs.writeFile fileAddress, stream, (err) ->\n\t\tif err\n\t\t\tlogger.error \"#{jsonObj._id}写入xml文件失败\",err\n\t\n\treturn filePath\n\n\n# 整理Fields的json数据\n_mixFieldsData = (obj,objName) ->\n\t# 初始化对象数据\n\tjsonObj = {}\n\t# 获取fields\n\tobjFields = Creator?.getObject(objName)?.fields\n\n\tmixDefault = (field_name)->\n\t\tjsonObj[field_name] = obj[field_name] || \"\"\n\n\tmixDate = (field_name,type)->\n\t\tdate = obj[field_name]\n\t\tif type == \"date\"\n\t\t\tformat = \"YYYY-MM-DD\"\n\t\telse\n\t\t\tformat = \"YYYY-MM-DD HH:mm:ss\"\n\t\tif date? and format?\n\t\t\tdateStr = moment(date).format(format)\n\t\tjsonObj[field_name] = dateStr || \"\"\n\n\tmixBool = (field_name)->\n\t\tif obj[field_name] == true\n\t\t\tjsonObj[field_name] = \"是\"\n\t\telse if obj[field_name] == false\n\t\t\tjsonObj[field_name] = \"否\"\n\t\telse\n\t\t\tjsonObj[field_name] = \"\"\n\n\t# 循环每个fields,并判断取值\n\t_.each objFields, (field, field_name)->\n\t\tswitch field?.type\n\t\t\twhen \"date\",\"datetime\" then mixDate field_name,field.type\n\t\t\twhen \"boolean\" then mixBool field_name\n\t\t\telse mixDefault field_name\n\n\treturn jsonObj\n\n# 获取子表整理数据\n_mixRelatedData = (obj,objName) ->\n\t# 初始化对象数据\n\trelated_objects = {}\n\n\t# 获取相关表\n\trelatedObjNames = Creator?.getAllRelatedObjects objName\n\n\t# 循环相关表\n\trelatedObjNames.forEach (relatedObjName) ->\n\t\t# 每个表定义一个对象数组\n\t\trelatedTableData = []\n\n\t\t# *设置关联搜索查询的字段\n\t\t# 附件的关联搜索字段是定死的\n\t\tif relatedObjName == \"cms_files\"\n\t\t\trelated_field_name = \"parent.ids\"\n\t\telse\n\t\t\t# 获取fields\n\t\t\tfields = Creator?.Objects[relatedObjName]?.fields\n\t\t\t# 循环每个field,找出reference_to的关联字段\n\t\t\trelated_field_name = \"\"\n\t\t\t_.each fields, (field, field_name)->\n\t\t\t\tif field?.reference_to == objName\n\t\t\t\t\trelated_field_name = field_name\n\n\t\t# 根据找出的关联字段,查子表数据\n\t\tif related_field_name\n\t\t\trelatedCollection = Creator.getCollection(relatedObjName)\n\t\t\t# 获取到所有的数据\n\t\t\trelatedRecordList = relatedCollection.find({\"#{related_field_name}\":obj._id}).fetch()\n\t\t\t# 循环每一条数据\n\t\t\trelatedRecordList.forEach (relatedObj)->\n\t\t\t\t# 整合fields数据\n\t\t\t\tfieldsData = _mixFieldsData relatedObj,relatedObjName\n\t\t\t\t# 把一条记录插入到对象数组中\n\t\t\t\trelatedTableData.push fieldsData\n\n\t\t# 把一个子表的所有数据插入到related_objects中,再循环下一个\n\t\trelated_objects[relatedObjName] = relatedTableData\n\n\treturn related_objects\n\n# Creator.Export2xml()\nCreator.Export2xml = (objName, recordList) ->\n\tlogger.info \"Run Creator.Export2xml\"\n\n\tconsole.time \"Creator.Export2xml\"\n\n\t# 测试数据\n\t# objName = \"archive_records\"\n\n\t# 查找对象数据\n\tcollection = Creator.getCollection(objName)\n\t# 测试数据\n\trecordList = collection.find({}).fetch()\n\n\trecordList.forEach (recordObj)->\n\t\tjsonObj = {}\n\t\tjsonObj._id = recordObj._id\n\n\t\t# 整理主表的Fields数据\n\t\tfieldsData = _mixFieldsData recordObj,objName\n\t\tjsonObj[objName] = fieldsData\n\n\t\t# 整理相关表数据\n\t\trelated_objects = _mixRelatedData recordObj,objName\n\n\t\tjsonObj[\"related_objects\"] = related_objects\n\n\t\t# 转为xml保存文件\n\t\tfilePath = _writeXmlFile jsonObj,objName\n\n\tconsole.timeEnd \"Creator.Export2xml\"\n\treturn filePath","var _mixFieldsData, _mixRelatedData, _writeXmlFile, fs, logger, mkdirp, path, xml2js;\n\nxml2js = require('xml2js');\n\nfs = require('fs');\n\npath = require('path');\n\nmkdirp = require('mkdirp');\n\nlogger = new Logger('Export_TO_XML');\n\n_writeXmlFile = function(jsonObj, objName) {\n var builder, day, fileAddress, fileName, filePath, month, now, stream, xml, year;\n builder = new xml2js.Builder();\n xml = builder.buildObject(jsonObj);\n stream = new Buffer(xml);\n now = new Date;\n year = now.getFullYear();\n month = now.getMonth() + 1;\n day = now.getDate();\n filePath = path.join(__meteor_bootstrap__.serverDir, '../../../export/' + year + '/' + month + '/' + day + '/' + objName);\n fileName = (jsonObj != null ? jsonObj._id : void 0) + \".xml\";\n fileAddress = path.join(filePath, fileName);\n if (!fs.existsSync(filePath)) {\n mkdirp.sync(filePath);\n }\n fs.writeFile(fileAddress, stream, function(err) {\n if (err) {\n return logger.error(jsonObj._id + \"写入xml文件失败\", err);\n }\n });\n return filePath;\n};\n\n_mixFieldsData = function(obj, objName) {\n var jsonObj, mixBool, mixDate, mixDefault, objFields, ref;\n jsonObj = {};\n objFields = typeof Creator !== \"undefined\" && Creator !== null ? (ref = Creator.getObject(objName)) != null ? ref.fields : void 0 : void 0;\n mixDefault = function(field_name) {\n return jsonObj[field_name] = obj[field_name] || \"\";\n };\n mixDate = function(field_name, type) {\n var date, dateStr, format;\n date = obj[field_name];\n if (type === \"date\") {\n format = \"YYYY-MM-DD\";\n } else {\n format = \"YYYY-MM-DD HH:mm:ss\";\n }\n if ((date != null) && (format != null)) {\n dateStr = moment(date).format(format);\n }\n return jsonObj[field_name] = dateStr || \"\";\n };\n mixBool = function(field_name) {\n if (obj[field_name] === true) {\n return jsonObj[field_name] = \"是\";\n } else if (obj[field_name] === false) {\n return jsonObj[field_name] = \"否\";\n } else {\n return jsonObj[field_name] = \"\";\n }\n };\n _.each(objFields, function(field, field_name) {\n switch (field != null ? field.type : void 0) {\n case \"date\":\n case \"datetime\":\n return mixDate(field_name, field.type);\n case \"boolean\":\n return mixBool(field_name);\n default:\n return mixDefault(field_name);\n }\n });\n return jsonObj;\n};\n\n_mixRelatedData = function(obj, objName) {\n var relatedObjNames, related_objects;\n related_objects = {};\n relatedObjNames = typeof Creator !== \"undefined\" && Creator !== null ? Creator.getAllRelatedObjects(objName) : void 0;\n relatedObjNames.forEach(function(relatedObjName) {\n var fields, obj1, ref, relatedCollection, relatedRecordList, relatedTableData, related_field_name;\n relatedTableData = [];\n if (relatedObjName === \"cms_files\") {\n related_field_name = \"parent.ids\";\n } else {\n fields = typeof Creator !== \"undefined\" && Creator !== null ? (ref = Creator.Objects[relatedObjName]) != null ? ref.fields : void 0 : void 0;\n related_field_name = \"\";\n _.each(fields, function(field, field_name) {\n if ((field != null ? field.reference_to : void 0) === objName) {\n return related_field_name = field_name;\n }\n });\n }\n if (related_field_name) {\n relatedCollection = Creator.getCollection(relatedObjName);\n relatedRecordList = relatedCollection.find((\n obj1 = {},\n obj1[\"\" + related_field_name] = obj._id,\n obj1\n )).fetch();\n relatedRecordList.forEach(function(relatedObj) {\n var fieldsData;\n fieldsData = _mixFieldsData(relatedObj, relatedObjName);\n return relatedTableData.push(fieldsData);\n });\n }\n return related_objects[relatedObjName] = relatedTableData;\n });\n return related_objects;\n};\n\nCreator.Export2xml = function(objName, recordList) {\n var collection;\n logger.info(\"Run Creator.Export2xml\");\n console.time(\"Creator.Export2xml\");\n collection = Creator.getCollection(objName);\n recordList = collection.find({}).fetch();\n recordList.forEach(function(recordObj) {\n var fieldsData, filePath, jsonObj, related_objects;\n jsonObj = {};\n jsonObj._id = recordObj._id;\n fieldsData = _mixFieldsData(recordObj, objName);\n jsonObj[objName] = fieldsData;\n related_objects = _mixRelatedData(recordObj, objName);\n jsonObj[\"related_objects\"] = related_objects;\n return filePath = _writeXmlFile(jsonObj, objName);\n });\n console.timeEnd(\"Creator.Export2xml\");\n return filePath;\n};\n","Meteor.methods \n\trelated_objects_records: (object_name, related_object_name, related_field_name, record_id, spaceId)->\n\t\tuserId = this.userId\n\t\tif related_object_name == \"cfs.files.filerecord\"\n\t\t\tselector = {\"metadata.space\": spaceId}\n\t\telse\n\t\t\tselector = {space: spaceId}\n\t\t\n\t\tif related_object_name == \"cms_files\"\n\t\t\t# 附件的关联搜索条件是定死的\n\t\t\tselector[\"parent.o\"] = object_name\n\t\t\tselector[\"parent.ids\"] = [record_id]\n\t\telse\n\t\t\tselector[related_field_name] = record_id\n\n\t\tpermissions = Creator.getPermissions(related_object_name, spaceId, userId)\n\t\tif !permissions.viewAllRecords and permissions.allowRead\n\t\t\tselector.owner = userId\n\t\t\n\t\trelated_records = Creator.getCollection(related_object_name).find(selector)\n\t\treturn related_records.count()","Meteor.methods({\n related_objects_records: function(object_name, related_object_name, related_field_name, record_id, spaceId) {\n var permissions, related_records, selector, userId;\n userId = this.userId;\n if (related_object_name === \"cfs.files.filerecord\") {\n selector = {\n \"metadata.space\": spaceId\n };\n } else {\n selector = {\n space: spaceId\n };\n }\n if (related_object_name === \"cms_files\") {\n selector[\"parent.o\"] = object_name;\n selector[\"parent.ids\"] = [record_id];\n } else {\n selector[related_field_name] = record_id;\n }\n permissions = Creator.getPermissions(related_object_name, spaceId, userId);\n if (!permissions.viewAllRecords && permissions.allowRead) {\n selector.owner = userId;\n }\n related_records = Creator.getCollection(related_object_name).find(selector);\n return related_records.count();\n }\n});\n","Meteor.methods\n\tgetPendingSpaceInfo: (inviterId, spaceId)->\n\t\tinviterName = db.users.findOne({_id: inviterId}).name\n\t\tspaceName = db.spaces.findOne({_id: spaceId}).name\n\n\t\treturn {inviter: inviterName, space: spaceName}\n\n\trefuseJoinSpace: (_id)->\n\t\tdb.space_users.direct.update({_id: _id},{$set: {invite_state: \"refused\"}})\n\n\tacceptJoinSpace: (_id)->\n\t\tdb.space_users.direct.update({_id: _id},{$set: {invite_state: \"accepted\", user_accepted: true}})\n\n","Meteor.methods({\n getPendingSpaceInfo: function(inviterId, spaceId) {\n var inviterName, spaceName;\n inviterName = db.users.findOne({\n _id: inviterId\n }).name;\n spaceName = db.spaces.findOne({\n _id: spaceId\n }).name;\n return {\n inviter: inviterName,\n space: spaceName\n };\n },\n refuseJoinSpace: function(_id) {\n return db.space_users.direct.update({\n _id: _id\n }, {\n $set: {\n invite_state: \"refused\"\n }\n });\n },\n acceptJoinSpace: function(_id) {\n return db.space_users.direct.update({\n _id: _id\n }, {\n $set: {\n invite_state: \"accepted\",\n user_accepted: true\n }\n });\n }\n});\n","Meteor.publish \"creator_object_record\", (object_name, id, space_id)->\n\tcollection = Creator.getCollection(object_name, space_id)\n\tif collection\n\t\treturn collection.find({_id: id})\n\n","Meteor.publish(\"creator_object_record\", function(object_name, id, space_id) {\n var collection;\n collection = Creator.getCollection(object_name, space_id);\n if (collection) {\n return collection.find({\n _id: id\n });\n }\n});\n","Meteor.publishComposite \"steedos_object_tabular\", (tableName, ids, fields, spaceId)->\n\tunless this.userId\n\t\treturn this.ready()\n\n\tcheck(tableName, String);\n\tcheck(ids, Array);\n\tcheck(fields, Match.Optional(Object));\n\n\t_object_name = tableName.replace(\"creator_\",\"\")\n\t_object = Creator.getObject(_object_name, spaceId)\n\n\tif spaceId\n\t\t_object_name = Creator.getObjectName(_object)\n\n\tobject_colleciton = Creator.getCollection(_object_name)\n\n\n\t_fields = _object?.fields\n\tif !_fields || !object_colleciton\n\t\treturn this.ready()\n\n\treference_fields = _.filter _fields, (f)->\n\t\treturn _.isFunction(f.reference_to) || !_.isEmpty(f.reference_to)\n\n\tself = this\n\n\tself.unblock();\n\n\tif reference_fields.length > 0\n\t\tdata = {\n\t\t\tfind: ()->\n\t\t\t\tself.unblock();\n\t\t\t\tfield_keys = {}\n\t\t\t\t_.each _.keys(fields), (f)->\n\t\t\t\t\tunless /\\w+(\\.\\$){1}\\w?/.test(f)\n\t\t\t\t\t\tfield_keys[f] = 1\n\t\t\t\t\n\t\t\t\treturn object_colleciton.find({_id: {$in: ids}}, {fields: field_keys});\n\t\t}\n\n\t\tdata.children = []\n\n\t\tkeys = _.keys(fields)\n\n\t\tif keys.length < 1\n\t\t\tkeys = _.keys(_fields)\n\n\t\t_keys = []\n\n\t\tkeys.forEach (key)->\n\t\t\tif _object.schema._objectKeys[key + '.']\n\t\t\t\t_keys = _keys.concat(_.map(_object.schema._objectKeys[key + '.'], (k)->\n\t\t\t\t\treturn key + '.' + k\n\t\t\t\t))\n\t\t\t_keys.push(key)\n\n\t\t_keys.forEach (key)->\n\t\t\treference_field = _fields[key]\n\n\t\t\tif reference_field && (_.isFunction(reference_field.reference_to) || !_.isEmpty(reference_field.reference_to)) # and Creator.Collections[reference_field.reference_to]\n\t\t\t\tdata.children.push {\n\t\t\t\t\tfind: (parent) ->\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t\tself.unblock();\n\n\t\t\t\t\t\t\tquery = {}\n\n\t\t\t\t\t\t\t# 表格子字段特殊处理\n\t\t\t\t\t\t\tif /\\w+(\\.\\$\\.){1}\\w+/.test(key)\n\t\t\t\t\t\t\t\tp_k = key.replace(/(\\w+)\\.\\$\\.\\w+/ig, \"$1\")\n\t\t\t\t\t\t\t\ts_k = key.replace(/\\w+\\.\\$\\.(\\w+)/ig, \"$1\")\n\t\t\t\t\t\t\t\treference_ids = parent[p_k].getProperty(s_k)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\treference_ids = key.split('.').reduce (o, x) ->\n\t\t\t\t\t\t\t\t\t\to?[x]\n\t\t\t\t\t\t\t\t, parent\n\n\t\t\t\t\t\t\treference_to = reference_field.reference_to\n\n\t\t\t\t\t\t\tif _.isFunction(reference_to)\n\t\t\t\t\t\t\t\treference_to = reference_to()\n\n\t\t\t\t\t\t\tif _.isArray(reference_to)\n\t\t\t\t\t\t\t\tif _.isObject(reference_ids) && !_.isArray(reference_ids)\n\t\t\t\t\t\t\t\t\treference_to = reference_ids.o\n\t\t\t\t\t\t\t\t\treference_ids = reference_ids.ids || []\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\treturn []\n\n\t\t\t\t\t\t\tif _.isArray(reference_ids)\n\t\t\t\t\t\t\t\tquery._id = {$in: reference_ids}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tquery._id = reference_ids\n\n\t\t\t\t\t\t\treference_to_object = Creator.getObject(reference_to, spaceId)\n\n\t\t\t\t\t\t\tname_field_key = reference_to_object.NAME_FIELD_KEY\n\n\t\t\t\t\t\t\tchildren_fields = {_id: 1, space: 1}\n\n\t\t\t\t\t\t\tif name_field_key\n\t\t\t\t\t\t\t\tchildren_fields[name_field_key] = 1\n\n\t\t\t\t\t\t\treturn Creator.getCollection(reference_to, spaceId).find(query, {\n\t\t\t\t\t\t\t\tfields: children_fields\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcatch e\n\t\t\t\t\t\t\tconsole.log(reference_to, parent, e)\n\t\t\t\t\t\t\treturn []\n\t\t\t\t}\n\n\t\treturn data\n\telse\n\t\treturn {\n\t\t\tfind: ()->\n\t\t\t\tself.unblock();\n\t\t\t\treturn object_colleciton.find({_id: {$in: ids}}, {fields: fields})\n\t\t};\n\n","Meteor.publishComposite(\"steedos_object_tabular\", function(tableName, ids, fields, spaceId) {\n var _fields, _keys, _object, _object_name, data, keys, object_colleciton, reference_fields, self;\n if (!this.userId) {\n return this.ready();\n }\n check(tableName, String);\n check(ids, Array);\n check(fields, Match.Optional(Object));\n _object_name = tableName.replace(\"creator_\", \"\");\n _object = Creator.getObject(_object_name, spaceId);\n if (spaceId) {\n _object_name = Creator.getObjectName(_object);\n }\n object_colleciton = Creator.getCollection(_object_name);\n _fields = _object != null ? _object.fields : void 0;\n if (!_fields || !object_colleciton) {\n return this.ready();\n }\n reference_fields = _.filter(_fields, function(f) {\n return _.isFunction(f.reference_to) || !_.isEmpty(f.reference_to);\n });\n self = this;\n self.unblock();\n if (reference_fields.length > 0) {\n data = {\n find: function() {\n var field_keys;\n self.unblock();\n field_keys = {};\n _.each(_.keys(fields), function(f) {\n if (!/\\w+(\\.\\$){1}\\w?/.test(f)) {\n return field_keys[f] = 1;\n }\n });\n return object_colleciton.find({\n _id: {\n $in: ids\n }\n }, {\n fields: field_keys\n });\n }\n };\n data.children = [];\n keys = _.keys(fields);\n if (keys.length < 1) {\n keys = _.keys(_fields);\n }\n _keys = [];\n keys.forEach(function(key) {\n if (_object.schema._objectKeys[key + '.']) {\n _keys = _keys.concat(_.map(_object.schema._objectKeys[key + '.'], function(k) {\n return key + '.' + k;\n }));\n }\n return _keys.push(key);\n });\n _keys.forEach(function(key) {\n var reference_field;\n reference_field = _fields[key];\n if (reference_field && (_.isFunction(reference_field.reference_to) || !_.isEmpty(reference_field.reference_to))) {\n return data.children.push({\n find: function(parent) {\n var children_fields, e, name_field_key, p_k, query, reference_ids, reference_to, reference_to_object, s_k;\n try {\n self.unblock();\n query = {};\n if (/\\w+(\\.\\$\\.){1}\\w+/.test(key)) {\n p_k = key.replace(/(\\w+)\\.\\$\\.\\w+/ig, \"$1\");\n s_k = key.replace(/\\w+\\.\\$\\.(\\w+)/ig, \"$1\");\n reference_ids = parent[p_k].getProperty(s_k);\n } else {\n reference_ids = key.split('.').reduce(function(o, x) {\n return o != null ? o[x] : void 0;\n }, parent);\n }\n reference_to = reference_field.reference_to;\n if (_.isFunction(reference_to)) {\n reference_to = reference_to();\n }\n if (_.isArray(reference_to)) {\n if (_.isObject(reference_ids) && !_.isArray(reference_ids)) {\n reference_to = reference_ids.o;\n reference_ids = reference_ids.ids || [];\n } else {\n return [];\n }\n }\n if (_.isArray(reference_ids)) {\n query._id = {\n $in: reference_ids\n };\n } else {\n query._id = reference_ids;\n }\n reference_to_object = Creator.getObject(reference_to, spaceId);\n name_field_key = reference_to_object.NAME_FIELD_KEY;\n children_fields = {\n _id: 1,\n space: 1\n };\n if (name_field_key) {\n children_fields[name_field_key] = 1;\n }\n return Creator.getCollection(reference_to, spaceId).find(query, {\n fields: children_fields\n });\n } catch (error) {\n e = error;\n console.log(reference_to, parent, e);\n return [];\n }\n }\n });\n }\n });\n return data;\n } else {\n return {\n find: function() {\n self.unblock();\n return object_colleciton.find({\n _id: {\n $in: ids\n }\n }, {\n fields: fields\n });\n }\n };\n }\n});\n","Meteor.publish \"object_listviews\", (object_name, spaceId)->\n userId = this.userId\n return Creator.getCollection(\"object_listviews\").find({object_name: object_name, space: spaceId ,\"$or\":[{owner: userId}, {shared: true}]})","Meteor.publish \"user_tabular_settings\", (object_name)->\n userId = this.userId\n return Creator.Collections.settings.find({object_name: {$in: object_name}, record_id: {$in: [\"object_listviews\", \"object_gridviews\"]}, owner: userId})\n","Meteor.publish \"related_objects_records\", (object_name, related_object_name, related_field_name, record_id, spaceId)->\n\tuserId = this.userId\n\tif related_object_name == \"cfs.files.filerecord\"\n\t\tselector = {\"metadata.space\": spaceId}\n\telse\n\t\tselector = {space: spaceId}\n\t\n\tif related_object_name == \"cms_files\"\n\t\t# 附件的关联搜索条件是定死的\n\t\tselector[\"parent.o\"] = object_name\n\t\tselector[\"parent.ids\"] = [record_id]\n\telse\n\t\tselector[related_field_name] = record_id\n\n\tpermissions = Creator.getPermissions(related_object_name, spaceId, userId)\n\tif !permissions.viewAllRecords and permissions.allowRead\n\t\tselector.owner = userId\n\t\n\treturn Creator.getCollection(related_object_name).find(selector)","Meteor.publish(\"related_objects_records\", function(object_name, related_object_name, related_field_name, record_id, spaceId) {\n var permissions, selector, userId;\n userId = this.userId;\n if (related_object_name === \"cfs.files.filerecord\") {\n selector = {\n \"metadata.space\": spaceId\n };\n } else {\n selector = {\n space: spaceId\n };\n }\n if (related_object_name === \"cms_files\") {\n selector[\"parent.o\"] = object_name;\n selector[\"parent.ids\"] = [record_id];\n } else {\n selector[related_field_name] = record_id;\n }\n permissions = Creator.getPermissions(related_object_name, spaceId, userId);\n if (!permissions.viewAllRecords && permissions.allowRead) {\n selector.owner = userId;\n }\n return Creator.getCollection(related_object_name).find(selector);\n});\n","Meteor.publish 'space_user_info', (spaceId, userId)->\n\treturn Creator.getCollection(\"space_users\").find({space: spaceId, user: userId})","\nif Meteor.isServer\n\n\tMeteor.publish 'contacts_view_limits', (spaceId)->\n\n\t\tunless this.userId\n\t\t\treturn this.ready()\n\n\t\tunless spaceId\n\t\t\treturn this.ready()\n\n\t\tselector =\n\t\t\tspace: spaceId\n\t\t\tkey: 'contacts_view_limits'\n\n\t\treturn db.space_settings.find(selector)","if (Meteor.isServer) {\n Meteor.publish('contacts_view_limits', function(spaceId) {\n var selector;\n if (!this.userId) {\n return this.ready();\n }\n if (!spaceId) {\n return this.ready();\n }\n selector = {\n space: spaceId,\n key: 'contacts_view_limits'\n };\n return db.space_settings.find(selector);\n });\n}\n","\nif Meteor.isServer\n\n\tMeteor.publish 'contacts_no_force_phone_users', (spaceId)->\n\n\t\tunless this.userId\n\t\t\treturn this.ready()\n\n\t\tunless spaceId\n\t\t\treturn this.ready()\n\n\t\tselector =\n\t\t\tspace: spaceId\n\t\t\tkey: 'contacts_no_force_phone_users'\n\n\t\treturn db.space_settings.find(selector)","if (Meteor.isServer) {\n Meteor.publish('contacts_no_force_phone_users', function(spaceId) {\n var selector;\n if (!this.userId) {\n return this.ready();\n }\n if (!spaceId) {\n return this.ready();\n }\n selector = {\n space: spaceId,\n key: 'contacts_no_force_phone_users'\n };\n return db.space_settings.find(selector);\n });\n}\n","if Meteor.isServer\n\tMeteor.publish 'space_need_to_confirm', ()->\n\t\tuserId = this.userId\n\t\treturn db.space_users.find({user: userId, invite_state: \"pending\"})","if (Meteor.isServer) {\n Meteor.publish('space_need_to_confirm', function() {\n var userId;\n userId = this.userId;\n return db.space_users.find({\n user: userId,\n invite_state: \"pending\"\n });\n });\n}\n","permissionManagerForInitApproval = {}\n\npermissionManagerForInitApproval.getFlowPermissions = (flow_id, user_id) ->\n\t# 根据:flow_id查到对应的flow\n\tflow = uuflowManagerForInitApproval.getFlow(flow_id)\n\tspace_id = flow.space\n\t# 根据space_id和:user_id到organizations表中查到用户所属所有的org_id(包括上级组ID)\n\torg_ids = new Array\n\torganizations = db.organizations.find({\n\t\tspace: space_id, users: user_id }, { fields: { parents: 1 } }).fetch()\n\t_.each(organizations, (org) ->\n\t\torg_ids.push(org._id)\n\t\tif org.parents\n\t\t\t_.each(org.parents, (parent_id) ->\n\t\t\t\torg_ids.push(parent_id)\n\t\t\t)\n\t)\n\torg_ids = _.uniq(org_ids)\n\tmy_permissions = new Array\n\tif flow.perms\n\t\t# 判断flow.perms.users_can_admin中是否包含当前用户,\n\t\t# 或者flow.perms.orgs_can_add是否包含4步得到的org_id数组中的任何一个,\n\t\t# 若是,则在返回的数组中加上add\n\t\tif flow.perms.users_can_add\n\t\t\tusers_can_add = flow.perms.users_can_add\n\t\t\tif users_can_add.includes(user_id)\n\t\t\t\tmy_permissions.push(\"add\")\n\n\t\tif flow.perms.orgs_can_add\n\t\t\torgs_can_add = flow.perms.orgs_can_add\n\t\t\t_.each(org_ids, (org_id) ->\n\t\t\t\tif orgs_can_add.includes(org_id)\n\t\t\t\t\tmy_permissions.push(\"add\")\n\t\t\t)\n\t\t# 判断flow.perms.users_can_monitor中是否包含当前用户,\n\t\t# 或者flow.perms.orgs_can_monitor是否包含4步得到的org_id数组中的任何一个,\n\t\t# 若是,则在返回的数组中加上monitor\n\t\tif flow.perms.users_can_monitor\n\t\t\tusers_can_monitor = flow.perms.users_can_monitor\n\t\t\tif users_can_monitor.includes(user_id)\n\t\t\t\tmy_permissions.push(\"monitor\")\n\n\t\tif flow.perms.orgs_can_monitor\n\t\t\torgs_can_monitor = flow.perms.orgs_can_monitor\n\t\t\t_.each(org_ids, (org_id) ->\n\t\t\t\tif orgs_can_monitor.includes(org_id)\n\t\t\t\t\tmy_permissions.push(\"monitor\")\n\t\t\t)\n\t\t# 判断flow.perms.users_can_admin中是否包含当前用户,\n\t\t# 或者flow.perms.orgs_can_admin是否包含4步得到的org_id数组中的任何一个,\n\t\t# 若是,则在返回的数组中加上admin\n\t\tif flow.perms.users_can_admin\n\t\t\tusers_can_admin = flow.perms.users_can_admin\n\t\t\tif users_can_admin.includes(user_id)\n\t\t\t\tmy_permissions.push(\"admin\")\n\n\t\tif flow.perms.orgs_can_admin\n\t\t\torgs_can_admin = flow.perms.orgs_can_admin\n\t\t\t_.each(org_ids, (org_id) ->\n\t\t\t\tif orgs_can_admin.includes(org_id)\n\t\t\t\t\tmy_permissions.push(\"admin\")\n\t\t\t)\n\n\tmy_permissions = _.uniq(my_permissions)\n\treturn my_permissions"," \n\npermissionManagerForInitApproval = {};\n\npermissionManagerForInitApproval.getFlowPermissions = function(flow_id, user_id) {\n var flow, my_permissions, org_ids, organizations, orgs_can_add, orgs_can_admin, orgs_can_monitor, space_id, users_can_add, users_can_admin, users_can_monitor;\n flow = uuflowManagerForInitApproval.getFlow(flow_id);\n space_id = flow.space;\n org_ids = new Array;\n organizations = db.organizations.find({\n space: space_id,\n users: user_id\n }, {\n fields: {\n parents: 1\n }\n }).fetch();\n _.each(organizations, function(org) {\n org_ids.push(org._id);\n if (org.parents) {\n return _.each(org.parents, function(parent_id) {\n return org_ids.push(parent_id);\n });\n }\n });\n org_ids = _.uniq(org_ids);\n my_permissions = new Array;\n if (flow.perms) {\n if (flow.perms.users_can_add) {\n users_can_add = flow.perms.users_can_add;\n if (users_can_add.includes(user_id)) {\n my_permissions.push(\"add\");\n }\n }\n if (flow.perms.orgs_can_add) {\n orgs_can_add = flow.perms.orgs_can_add;\n _.each(org_ids, function(org_id) {\n if (orgs_can_add.includes(org_id)) {\n return my_permissions.push(\"add\");\n }\n });\n }\n if (flow.perms.users_can_monitor) {\n users_can_monitor = flow.perms.users_can_monitor;\n if (users_can_monitor.includes(user_id)) {\n my_permissions.push(\"monitor\");\n }\n }\n if (flow.perms.orgs_can_monitor) {\n orgs_can_monitor = flow.perms.orgs_can_monitor;\n _.each(org_ids, function(org_id) {\n if (orgs_can_monitor.includes(org_id)) {\n return my_permissions.push(\"monitor\");\n }\n });\n }\n if (flow.perms.users_can_admin) {\n users_can_admin = flow.perms.users_can_admin;\n if (users_can_admin.includes(user_id)) {\n my_permissions.push(\"admin\");\n }\n }\n if (flow.perms.orgs_can_admin) {\n orgs_can_admin = flow.perms.orgs_can_admin;\n _.each(org_ids, function(org_id) {\n if (orgs_can_admin.includes(org_id)) {\n return my_permissions.push(\"admin\");\n }\n });\n }\n }\n my_permissions = _.uniq(my_permissions);\n return my_permissions;\n};\n","# 发起审批\n_eval = require('eval')\nobjectql = require('@steedos/objectql');\n\ngetObjectConfig = (objectApiName) ->\n\treturn objectql.getObject(objectApiName).toConfig()\n\ngetObjectNameFieldKey = (objectApiName) ->\n\treturn objectql.getObject(objectApiName).NAME_FIELD_KEY\n\ngetRelateds = (objectApiName) ->\n\treturn Meteor.wrapAsync((objectApiName, cb) ->\n\t\tobjectql.getObject(objectApiName).getRelateds().then (resolve, reject) ->\n\t\t\tcb(reject, resolve)\n\t\t)(objectApiName)\n\nobjectFindOne = (objectApiName, query) ->\n\treturn Meteor.wrapAsync((objectApiName, query, cb) ->\n\t\tquery.top = 1\n\t\tobjectql.getObject(objectApiName).find(query).then (resolve, reject) ->\n\t\t\tif (resolve && resolve.length > 0)\n\t\t\t\tcb(reject, resolve[0])\n\t\t\telse\n\t\t\t\tcb(reject, null)\n\t\t)(objectApiName, query)\n\nobjectFind = (objectApiName, query) ->\n\treturn Meteor.wrapAsync((objectApiName, query, cb) ->\n\t\tobjectql.getObject(objectApiName).find(query).then (resolve, reject) ->\n\t\t\tcb(reject, resolve)\n\t\t)(objectApiName, query)\n\nobjectUpdate = (objectApiName, id, data) ->\n\treturn Meteor.wrapAsync((objectApiName, id, data, cb) ->\n\t\tobjectql.getObject(objectApiName).update(id, data).then (resolve, reject) ->\n\t\t\tcb(reject, resolve)\n\t\t)(objectApiName, id, data)\n\ngetRelatedObjectFieldCode = (relatedObjectsKeys, key) ->\n\treturn _.find relatedObjectsKeys, (relatedObjectsKey) ->\n\t\treturn key.startsWith(relatedObjectsKey + '.')\n\ngetFormTableFieldCode = (formTableFieldsCode, key) ->\n\treturn _.find formTableFieldsCode, (formTableFieldCode) ->\n\t\treturn key.startsWith(formTableFieldCode + '.')\n\ngetFormTableField = (formTableFields, key) ->\n\treturn _.find formTableFields, (f) ->\n\t\treturn f.code == key\n\ngetFormField = (formFields, key) ->\n\tff = null\n\t_.forEach formFields, (f) ->\n\t\tif ff\n\t\t\treturn\n\t\tif f.type == 'section'\n\t\t\tff = _.find f.fields, (sf) ->\n\t\t\t\treturn sf.code == key\n\t\telse if f.code == key\n\t\t\tff = f\n\n\treturn ff\n\ngetFormTableSubField = (tableField, subFieldCode) ->\n\treturn _.find tableField.fields, (f) ->\n\t\treturn f.code == subFieldCode\n\ngetFieldOdataValue = (objName, id, referenceToFieldName) ->\n\t# obj = Creator.getCollection(objName)\n\tobj = objectql.getObject(objName)\n\tnameKey = getObjectNameFieldKey(objName)\n\tif !obj\n\t\treturn\n\tif _.isString id\n\t\t# _record = obj.findOne(id)\n\t\t_record = objectFindOne(objName, { filters: [[referenceToFieldName, '=', id]]})\n\t\tif _record\n\t\t\t_record['@label'] = _record[nameKey]\n\t\t\treturn _record\n\telse if _.isArray id\n\t\t_records = []\n\t\t# obj.find({ _id: { $in: id } })\n\t\tobjectFind(objName, { filters: [[referenceToFieldName, 'in', id]]}).forEach (_record) ->\n\t\t\t_record['@label'] = _record[nameKey]\n\t\t\t_records.push _record\n\t\tif !_.isEmpty _records\n\t\t\treturn _records\n\treturn\n\ngetSelectUserValue = (userId, spaceId) ->\n\tsu = Creator.getCollection('space_users').findOne({ space: spaceId, user: userId })\n\tsu.id = userId\n\treturn su\n\ngetSelectUserValues = (userIds, spaceId) ->\n\tsus = []\n\tif _.isArray userIds\n\t\t_.each userIds, (userId) ->\n\t\t\tsu = getSelectUserValue(userId, spaceId)\n\t\t\tif su\n\t\t\t\tsus.push(su)\n\treturn sus\n\ngetSelectOrgValue = (orgId, spaceId) ->\n\torg = Creator.getCollection('organizations').findOne(orgId, { fields: { _id: 1, name: 1, fullname: 1 } })\n\torg.id = orgId\n\treturn org\n\ngetSelectOrgValues = (orgIds, spaceId) ->\n\torgs = []\n\tif _.isArray orgIds\n\t\t_.each orgIds, (orgId) ->\n\t\t\torg = getSelectOrgValue(orgId, spaceId)\n\t\t\tif org\n\t\t\t\torgs.push(org)\n\treturn orgs\n\ngetFileFieldValue = (recordFieldId, fType)->\n\tif _.isEmpty(recordFieldId)\n\t\treturn \n\tif fType == 'image'\n\t\tcollection = 'images'\n\telse if fType == 'file'\n\t\tcollection = 'files'\n\tif _.isString(recordFieldId)\n\t\tquery = {_id: {$in: [recordFieldId]}}\n\telse\n\t\tquery = {_id: {$in: recordFieldId}}\n\tfiles = Creator.Collections[\"cfs.#{collection}.filerecord\"].find(query);\n\tvalue = []\n\tfiles.forEach (f) ->\n\t\tnewFile = new FS.File()\n\t\tnewFile.attachData f.createReadStream('files'), {\n\t\t\t\ttype: f.original.type\n\t\t}, (err) ->\n\t\t\tif (err)\n\t\t\t\tthrow new Meteor.Error(err.error, err.reason)\n\n\t\t\tnewFile.name(f.name())\n\t\t\tnewFile.size(f.size())\n\t\t\tmetadata = {\n\t\t\t\towner: f.metadata.owner\n\t\t\t}\n\t\t\tnewFile.metadata = metadata;\n\t\t\tnewFile._id = Creator.Collections.instances._makeNewID();\n\t\t\tcfs[collection].insert(newFile);\n\t\t\tvalue.push(newFile._id)\n\tif value.length > 0\n\t\tif _.isString(recordFieldId)\n\t\t\treturn value[0]\n\t\telse\n\t\t\treturn value;\n\ngetInstanceFieldValue = (objField, formField, record, object_field, spaceId, recordFieldValue, enableAmisform) ->\n\n\tif enableAmisform && formField.steedos_field\n\t\treturn recordFieldValue\n\n\trecordFieldValue = record[objField.name]\n\tvalue\n\t# lookup、master_detail字段同步到odata字段\n\tif formField && objField && formField.type == 'odata' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)\n\t\treferenceToFieldName = objField.reference_to_field || '_id'\n\t\treferenceToObjectName = objField.reference_to\n\t\todataFieldValue\n\t\tif objField.multiple && formField.is_multiselect\n\t\t\todataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName)\n\t\telse if !objField.multiple && !formField.is_multiselect\n\t\t\todataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName)\n\t\tvalue = odataFieldValue\n\telse if formField && objField && ['user', 'group'].includes(formField.type) && ['lookup', 'master_detail'].includes(objField.type) && (['users', 'organizations'].includes(objField.reference_to) || ('space_users' == objField.reference_to && 'user' == objField.reference_to_field) )\n\t\tif !_.isEmpty(recordFieldValue)\n\t\t\tselectFieldValue\n\t\t\tif formField.type == 'user'\n\t\t\t\tif objField.multiple && formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectUserValues(recordFieldValue, spaceId)\n\t\t\t\telse if !objField.multiple && !formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectUserValue(recordFieldValue, spaceId)\n\t\t\telse if formField.type == 'group'\n\t\t\t\tif objField.multiple && formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectOrgValues(recordFieldValue, spaceId)\n\t\t\t\telse if !objField.multiple && !formField.is_multiselect\n\t\t\t\t\tselectFieldValue = getSelectOrgValue(recordFieldValue, spaceId)\n\t\t\tif selectFieldValue\n\t\t\t\tvalue = selectFieldValue\n\telse if formField && objField && formField.type == 'date' && recordFieldValue\n\t\tvalue = uuflowManagerForInitApproval.formatDate(recordFieldValue) # Date转String\n\telse if formField && objField && formField.type == 'time' && recordFieldValue\n\t\tvalue = uuflowManagerForInitApproval.formatTime(recordFieldValue) # Time转String\n\telse if formField && objField && recordFieldValue && (formField.type == 'image' || formField.type == 'file')\n\t\tvalue = getFileFieldValue(recordFieldValue, formField.type)\n\telse if formField && objField && recordFieldValue && formField.type == 'lookup' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)\n\t\tvalue = recordFieldValue\n\telse if formField && objField && recordFieldValue && (formField.type == 'multiSelect')\n\t\tvalue = recordFieldValue.join(',')\n\telse if record.hasOwnProperty(object_field)\n\t\tvalue = recordFieldValue\n\t\n\treturn value\n\n# requiredDetails结构[\"子表名.子表中master_detail字段名\", ...]\ncheckRequiredDetails = (requiredDetails, masterRecord) ->\n\tif !_.isEmpty requiredDetails\n\t\t# 检查子表必填,即子表必须有记录\n\t\trequiredDetails.forEach (rd) ->\n\t\t\tsubTableName = rd.split('.')[0]\n\t\t\tsubTableMasterField = rd.split('.')[1]\n\t\t\tsubObjConfig = getObjectConfig subTableName\n\t\t\tmasterField = subObjConfig.fields[subTableMasterField]\n\t\t\trefId = masterField.reference_to_field || '_id'\n\t\t\tmasterFieldValue = masterRecord[refId]\n\t\t\t# 查询子表记录\n\t\t\tsubTableRecord = objectFindOne(subTableName, { filters: [[subTableMasterField, '=', masterFieldValue]], fields: [subTableMasterField] })\n\t\t\tif !subTableRecord\n\t\t\t\tthrow new Error \"请先新增#{subObjConfig.label}\"\n\t\treturn\n\nuuflowManagerForInitApproval = {}\n\nuuflowManagerForInitApproval.check_authorization = (req) ->\n\tquery = req.query\n\tuserId = query[\"X-User-Id\"]\n\tauthToken = query[\"X-Auth-Token\"]\n\n\tif not userId or not authToken\n\t\tthrow new Meteor.Error 401, 'Unauthorized'\n\n\thashedToken = Accounts._hashLoginToken(authToken)\n\tuser = Meteor.users.findOne\n\t\t_id: userId,\n\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\n\tif not user\n\t\tthrow new Meteor.Error 401, 'Unauthorized'\n\n\treturn user\n\nuuflowManagerForInitApproval.getSpace = (space_id) ->\n\tspace = Creator.Collections.spaces.findOne(space_id)\n\tif not space\n\t\tthrow new Meteor.Error('error!', \"space_id有误或此space已经被删除\")\n\treturn space\n\nuuflowManagerForInitApproval.getFlow = (flow_id) ->\n\tflow = Creator.Collections.flows.findOne(flow_id)\n\tif not flow\n\t\tthrow new Meteor.Error('error!', \"id有误或此流程已经被删除\")\n\treturn flow\n\nuuflowManagerForInitApproval.getSpaceUser = (space_id, user_id) ->\n\tspace_user = Creator.Collections.space_users.findOne({ space: space_id, user: user_id })\n\tif not space_user\n\t\tthrow new Meteor.Error('error!', \"user_id对应的用户不属于当前space\")\n\treturn space_user\n\nuuflowManagerForInitApproval.getSpaceUserOrgInfo = (space_user) ->\n\tinfo = new Object\n\tinfo.organization = space_user.organization\n\torg = Creator.Collections.organizations.findOne(space_user.organization, { fields: { name: 1 , fullname: 1 } })\n\tinfo.organization_name = org.name\n\tinfo.organization_fullname = org.fullname\n\treturn info\n\nuuflowManagerForInitApproval.isFlowEnabled = (flow) ->\n\tif flow.state isnt \"enabled\"\n\t\tthrow new Meteor.Error('error!', \"流程未启用,操作失败\")\n\nuuflowManagerForInitApproval.isFlowSpaceMatched = (flow, space_id) ->\n\tif flow.space isnt space_id\n\t\tthrow new Meteor.Error('error!', \"流程和工作区ID不匹配\")\n\nuuflowManagerForInitApproval.getForm = (form_id) ->\n\tform = Creator.Collections.forms.findOne(form_id)\n\tif not form\n\t\tthrow new Meteor.Error('error!', '表单ID有误或此表单已经被删除')\n\n\treturn form\n\nuuflowManagerForInitApproval.getCategory = (category_id) ->\n\treturn Creator.Collections.categories.findOne(category_id)\n\nuuflowManagerForInitApproval.checkSyncDirection = (object_name, flow_id) ->\n\tow = Creator.Collections.object_workflows.findOne({\n\t\tobject_name: object_name,\n\t\tflow_id: flow_id\n\t})\n\tif !ow\n\t\tthrow new Meteor.Error('error!', '未找到对象流程映射记录。')\n\tsyncDirection = ow.sync_direction || 'both'\n\tif !['both', 'obj_to_ins'].includes(syncDirection)\n\t\tthrow new Meteor.Error('error!', '不支持的同步方向。')\n\n\treturn \n\nuuflowManagerForInitApproval.create_instance = (instance_from_client, user_info) ->\n\tcheck instance_from_client[\"applicant\"], String\n\tcheck instance_from_client[\"space\"], String\n\tcheck instance_from_client[\"flow\"], String\n\tcheck instance_from_client[\"record_ids\"], [{o: String, ids: [String]}]\n\n\t# 校验同步方向\n\tuuflowManagerForInitApproval.checkSyncDirection(instance_from_client[\"record_ids\"][0].o, instance_from_client[\"flow\"])\n\n\t# 校验是否record已经发起的申请还在审批中\n\tuuflowManagerForInitApproval.checkIsInApproval(instance_from_client[\"record_ids\"][0], instance_from_client[\"space\"])\n\n\tspace_id = instance_from_client[\"space\"]\n\tflow_id = instance_from_client[\"flow\"]\n\tuser_id = user_info._id\n\t# 获取前台所传的trace\n\ttrace_from_client = null\n\t# 获取前台所传的approve\n\tapprove_from_client = null\n\tif instance_from_client[\"traces\"] and instance_from_client[\"traces\"][0]\n\t\ttrace_from_client = instance_from_client[\"traces\"][0]\n\t\tif trace_from_client[\"approves\"] and trace_from_client[\"approves\"][0]\n\t\t\tapprove_from_client = instance_from_client[\"traces\"][0][\"approves\"][0]\n\n\t# 获取一个space\n\tspace = uuflowManagerForInitApproval.getSpace(space_id)\n\t# 获取一个flow\n\tflow = uuflowManagerForInitApproval.getFlow(flow_id)\n\t# 获取一个space下的一个user\n\tspace_user = uuflowManagerForInitApproval.getSpaceUser(space_id, user_id)\n\t# 获取space_user所在的部门信息\n\tspace_user_org_info = uuflowManagerForInitApproval.getSpaceUserOrgInfo(space_user)\n\t# 判断一个flow是否为启用状态\n\tuuflowManagerForInitApproval.isFlowEnabled(flow)\n\t# 判断一个flow和space_id是否匹配\n\tuuflowManagerForInitApproval.isFlowSpaceMatched(flow, space_id)\n\n\tform = uuflowManagerForInitApproval.getForm(flow.form)\n\n\tpermissions = permissionManager.getFlowPermissions(flow_id, user_id)\n\n\tif not permissions.includes(\"add\")\n\t\tthrow new Meteor.Error('error!', \"当前用户没有此流程的新建权限\")\n\n\tnow = new Date\n\tins_obj = {}\n\tins_obj._id = Creator.Collections.instances._makeNewID()\n\tins_obj.space = space_id\n\tins_obj.flow = flow_id\n\tins_obj.flow_version = flow.current._id\n\tins_obj.form = flow.form\n\tins_obj.form_version = flow.current.form_version\n\tins_obj.name = flow.name\n\tins_obj.submitter = user_id\n\tins_obj.submitter_name = user_info.name\n\tins_obj.applicant = if instance_from_client[\"applicant\"] then instance_from_client[\"applicant\"] else user_id\n\tins_obj.applicant_name = if instance_from_client[\"applicant_name\"] then instance_from_client[\"applicant_name\"] else user_info.name\n\tins_obj.applicant_organization = if instance_from_client[\"applicant_organization\"] then instance_from_client[\"applicant_organization\"] else space_user.organization\n\tins_obj.applicant_organization_name = if instance_from_client[\"applicant_organization_name\"] then instance_from_client[\"applicant_organization_name\"] else space_user_org_info.organization_name\n\tins_obj.applicant_organization_fullname = if instance_from_client[\"applicant_organization_fullname\"] then instance_from_client[\"applicant_organization_fullname\"] else space_user_org_info.organization_fullname\n\tins_obj.applicant_company = if instance_from_client[\"applicant_company\"] then instance_from_client[\"applicant_company\"] else space_user.company_id\n\tins_obj.state = 'draft'\n\tins_obj.code = ''\n\tins_obj.is_archived = false\n\tins_obj.is_deleted = false\n\tins_obj.created = now\n\tins_obj.created_by = user_id\n\tins_obj.modified = now\n\tins_obj.modified_by = user_id\n\n\tins_obj.record_ids = instance_from_client[\"record_ids\"]\n\n\tif space_user.company_id\n\t\tins_obj.company_id = space_user.company_id\n\n\t# 新建Trace\n\ttrace_obj = {}\n\ttrace_obj._id = new Mongo.ObjectID()._str\n\ttrace_obj.instance = ins_obj._id\n\ttrace_obj.is_finished = false\n\t# 当前最新版flow中开始节点\n\tstart_step = _.find(flow.current.steps, (step) ->\n\t\treturn step.step_type is 'start'\n\t)\n\ttrace_obj.step = start_step._id\n\ttrace_obj.name = start_step.name\n\n\ttrace_obj.start_date = now\n\t# 新建Approve\n\tappr_obj = {}\n\tappr_obj._id = new Mongo.ObjectID()._str\n\tappr_obj.instance = ins_obj._id\n\tappr_obj.trace = trace_obj._id\n\tappr_obj.is_finished = false\n\tappr_obj.user = if instance_from_client[\"applicant\"] then instance_from_client[\"applicant\"] else user_id\n\tappr_obj.user_name = if instance_from_client[\"applicant_name\"] then instance_from_client[\"applicant_name\"] else user_info.name\n\tappr_obj.handler = user_id\n\tappr_obj.handler_name = user_info.name\n\tappr_obj.handler_organization = space_user.organization\n\tappr_obj.handler_organization_name = space_user_org_info.name\n\tappr_obj.handler_organization_fullname = space_user_org_info.fullname\n\tappr_obj.type = 'draft'\n\tappr_obj.start_date = now\n\tappr_obj.read_date = now\n\tappr_obj.is_read = true\n\tappr_obj.is_error = false\n\tappr_obj.description = ''\n\trelatedTablesInfo = {}\n\tappr_obj.values = uuflowManagerForInitApproval.initiateValues(ins_obj.record_ids[0], flow_id, space_id, form.current.fields, relatedTablesInfo)\n\n\ttrace_obj.approves = [appr_obj]\n\tins_obj.traces = [trace_obj]\n\n\tins_obj.values = appr_obj.values\n\n\tins_obj.inbox_users = instance_from_client.inbox_users || []\n\n\tins_obj.current_step_name = start_step.name\n\n\tif flow.auto_remind is true\n\t\tins_obj.auto_remind = true\n\n\t# 新建申请单时,instances记录流程名称、流程分类名称 #1313\n\tins_obj.flow_name = flow.name\n\tif form.category\n\t\tcategory = uuflowManagerForInitApproval.getCategory(form.category)\n\t\tif category\n\t\t\tins_obj.category_name = category.name\n\t\t\tins_obj.category = category._id\n\n\tnew_ins_id = Creator.Collections.instances.insert(ins_obj)\n\n\tuuflowManagerForInitApproval.initiateRecordInstanceInfo(ins_obj.record_ids[0], new_ins_id, space_id)\n\n\t# uuflowManagerForInitApproval.initiateRelatedRecordInstanceInfo(relatedTablesInfo, new_ins_id, space_id)\n\n\tuuflowManagerForInitApproval.initiateAttach(ins_obj.record_ids[0], space_id, ins_obj._id, appr_obj._id)\n\n\treturn new_ins_id\n\nuuflowManagerForInitApproval.initiateValues = (recordIds, flowId, spaceId, fields, relatedTablesInfo) ->\n\tfieldCodes = []\n\t_.each fields, (f) ->\n\t\tif f.type == 'section'\n\t\t\t_.each f.fields, (ff) ->\n\t\t\t\tfieldCodes.push ff.code\n\t\telse\n\t\t\tfieldCodes.push f.code\n\n\tvalues = {}\n\tobjectName = recordIds.o\n\tobject = getObjectConfig(objectName)\n\trecordId = recordIds.ids[0]\n\tow = Creator.Collections.object_workflows.findOne({\n\t\tobject_name: objectName,\n\t\tflow_id: flowId\n\t})\n\t# record = Creator.getCollection(objectName, spaceId).findOne(recordId)\n\trecord = objectFindOne(objectName, { filters: [['_id', '=', recordId]]})\n\tflow = Creator.getCollection('flows').findOne(flowId, { fields: { form: 1, enableAmisform: 1 } })\n\tenableAmisform = flow.enable_amisform\n\tif ow and record\n\t\trequiredDetails = ow.required_details || []\n\t\tcheckRequiredDetails(requiredDetails, record)\n\n\t\tform = Creator.getCollection(\"forms\").findOne(flow.form)\n\t\tformFields = form.current.fields || []\n\t\trelatedObjects = getRelateds(objectName)\n\t\trelatedObjectsKeys = _.pluck(relatedObjects, 'object_name')\n\t\tformTableFields = _.filter formFields, (formField) ->\n\t\t\treturn formField.type == 'table'\n\t\tformTableFieldsCode = _.pluck(formTableFields, 'code')\n\n\t\t# steedos field 中定义的grid、table类型字段\n\t\ttableFieldCodes = []\n\t\ttableFieldMap = []\n\t\t# 相关表\n\t\ttableToRelatedMap = {}\n\n\t\t# field_map: 从台账到审批单的字段同步映射规则\n\t\tow.field_map?.forEach (fm) ->\n\t\t\tobject_field = fm.object_field\n\t\t\tworkflow_field = fm.workflow_field\n\t\t\tif !object_field || !workflow_field\n\t\t\t\tthrow new Meteor.Error(400, '未找到字段,请检查对象流程映射字段配置')\n\t\t\trelatedObjectFieldCode = getRelatedObjectFieldCode(relatedObjectsKeys, object_field)\n\t\t\tformTableFieldCode = getFormTableFieldCode(formTableFieldsCode, workflow_field)\n\t\t\tobjField = object.fields[object_field]\n\t\t\tformField = getFormField(formFields, workflow_field)\n\t\t\trecordFieldValue = record[object_field]\n\t\t\t# 处理子表字段\n\t\t\tif relatedObjectFieldCode\n\t\t\t\t\n\t\t\t\toTableCode = object_field.split('.')[0]\n\t\t\t\toTableFieldCode = object_field.split('.')[1]\n\t\t\t\ttableToRelatedMapKey = oTableCode\n\t\t\t\tif !tableToRelatedMap[tableToRelatedMapKey]\n\t\t\t\t\ttableToRelatedMap[tableToRelatedMapKey] = {}\n\n\t\t\t\tif formTableFieldCode\n\t\t\t\t\twTableCode = workflow_field.split('.')[0]\n\t\t\t\t\ttableToRelatedMap[tableToRelatedMapKey]['_FROM_TABLE_CODE'] = wTableCode\n\n\t\t\t\ttableToRelatedMap[tableToRelatedMapKey][oTableFieldCode] = workflow_field\n\t\t\t# 判断是否是表格字段(object field 的 grid、table)\n\t\t\telse if workflow_field.indexOf('.') > 0 and object_field.indexOf('.$.') > 0\n\t\t\t\twTableCode = workflow_field.split('.')[0]\n\t\t\t\toTableCode = object_field.split('.$.')[0] ref1.table1.$.name\n\t\t\t\tif record.hasOwnProperty(oTableCode) and _.isArray(record[oTableCode])\n\t\t\t\t\ttableFieldCodes.push(JSON.stringify({\n\t\t\t\t\t\tworkflow_table_field_code: wTableCode,\n\t\t\t\t\t\tobject_table_field_code: oTableCode\n\t\t\t\t\t}))\n\t\t\t\t\ttableFieldMap.push(fm)\n\t\t\t\telse if oTableCode.indexOf('.') > 0 # 说明是关联表的grid字段\n\t\t\t\t\toTableCodeReferenceFieldCode = oTableCode.split('.')[0];\n\t\t\t\t\tgridCode = oTableCode.split('.')[1];\n\t\t\t\t\toTableCodeReferenceField = object.fields[oTableCodeReferenceFieldCode];\n\t\t\t\t\tif oTableCodeReferenceField && ['lookup', 'master_detail'].includes(oTableCodeReferenceField.type) && _.isString(oTableCodeReferenceField.reference_to)\n\t\t\t\t\t\tif record[oTableCode]\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\treferenceToFieldName = oTableCodeReferenceField.reference_to_field || '_id';\n\t\t\t\t\t\treferenceToObjectName = oTableCodeReferenceField.reference_to;\n\t\t\t\t\t\treferenceToFieldValue = record[oTableCodeReferenceField.name];\n\t\t\t\t\t\t# 此处借助getFieldOdataValue函数的能力, 获取关联表(lookup)的记录. 此处未未考虑lookup单选的情况. 此处获取关系数据的所有字段, 交由下方的表格数据同步统一整理数据\n\t\t\t\t\t\treferenceToDoc = getFieldOdataValue(referenceToObjectName, referenceToFieldValue, referenceToFieldName);\n\t\t\t\t\t\tif referenceToDoc[gridCode]\n\t\t\t\t\t\t\trecord[oTableCode] = referenceToDoc[gridCode];\n\t\t\t\t\t\t\ttableFieldCodes.push(JSON.stringify({\n\t\t\t\t\t\t\t\tworkflow_table_field_code: wTableCode,\n\t\t\t\t\t\t\t\tobject_table_field_code: oTableCode\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\treturn tableFieldMap.push(fm);\n\n\t\t\t# 处理lookup、master_detail类型字段\n\t\t\telse if object_field.indexOf('.') > 0 and object_field.indexOf('.$.') == -1\n\t\t\t\tobjectFieldName = object_field.split('.')[0]\n\t\t\t\tlookupFieldName = object_field.split('.')[1]\n\t\t\t\tif object\n\t\t\t\t\tobjectField = object.fields[objectFieldName]\n\t\t\t\t\tif objectField && formField && ['lookup', 'master_detail'].includes(objectField.type) && _.isString(objectField.reference_to)\n\t\t\t\t\t\tlookupObjectRecord = objectFindOne(objectField.reference_to, { filters: [['_id', '=', record[objectFieldName]]], fields: [lookupFieldName] })\n\t\t\t\t\t\tif !lookupObjectRecord\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tobjectFieldObjectName = objectField.reference_to\n\t\t\t\t\t\tlookupFieldObj = getObjectConfig(objectFieldObjectName)\n\t\t\t\t\t\tobjectLookupField = lookupFieldObj.fields[lookupFieldName]\n\n\t\t\t\t\t\tvalues[workflow_field] = getInstanceFieldValue(objectLookupField, formField, lookupObjectRecord, lookupFieldName, spaceId, record[lookupFieldName], enableAmisform)\n\t\t\telse\n\t\t\t\tvalues[workflow_field] = getInstanceFieldValue(objField, formField, record, object_field, spaceId, record[object_field], enableAmisform)\n\n\t\t# 表格字段\n\t\t_.uniq(tableFieldCodes).forEach (tfc) ->\n\t\t\tc = JSON.parse(tfc)\n\t\t\tvalues[c.workflow_table_field_code] = []\n\t\t\trecord[c.object_table_field_code].forEach (tr) ->\n\t\t\t\tnewTr = {}\n\t\t\t\t_.each tr, (tdValue, k) ->\n\t\t\t\t\ttableFieldMap.forEach (tfm) ->\n\t\t\t\t\t\tif tfm.object_field is (c.object_table_field_code + '.$.' + k)\n\t\t\t\t\t\t\twTdCode = tfm.workflow_field.split('.')[1]\n\t\t\t\t\t\t\tnewTr[wTdCode] = tdValue\n\t\t\t\tif not _.isEmpty(newTr)\n\t\t\t\t\tvalues[c.workflow_table_field_code].push(newTr)\n\n\t\t# 同步子表数据至表单表格\n\t\t_.each tableToRelatedMap, (map, key) ->\n\t\t\ttableCode = map._FROM_TABLE_CODE\n\t\t\tformTableField = getFormTableField(formTableFields, tableCode)\n\t\t\tif !tableCode\n\t\t\t\tconsole.warn('tableToRelated: [' + key + '] missing corresponding table.')\n\t\t\telse\n\t\t\t\trelatedObjectName = key\n\t\t\t\ttableValues = []\n\t\t\t\trelatedTableItems = []\n\t\t\t\trelatedObject = getObjectConfig(relatedObjectName)\n\t\t\t\trelatedField = _.find relatedObject.fields, (f) ->\n\t\t\t\t\treturn ['lookup', 'master_detail'].includes(f.type) && f.reference_to == objectName\n\n\t\t\t\trelatedFieldName = relatedField.name\n\n\t\t\t\trelatedRecords = objectFind(relatedObjectName, {\n\t\t\t\t\tfilters: [\n\t\t\t\t\t\t[relatedFieldName, '=', recordId]\n\t\t\t\t\t]\n\t\t\t\t})\n\n\t\t\t\trelatedRecords.forEach (relatedRecord) ->\n\t\t\t\t\ttableValueItem = {}\n\t\t\t\t\t_.each map, (valueKey, fieldKey) ->\n\t\t\t\t\t\tif fieldKey != '_FROM_TABLE_CODE'\n\t\t\t\t\t\t\ttableFieldValue\n\t\t\t\t\t\t\tformFieldKey\n\t\t\t\t\t\t\tif valueKey.startsWith(tableCode + '.')\n\t\t\t\t\t\t\t\tformFieldKey = (valueKey.split(\".\")[1])\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tformFieldKey = valueKey\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tformField = getFormTableSubField(formTableField, formFieldKey)\n\t\t\t\t\t\t\trelatedObjectField = relatedObject.fields[fieldKey]\n\t\t\t\t\t\t\tif !formField || !relatedObjectField\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\ttableFieldValue = getInstanceFieldValue(relatedObjectField, formField, relatedRecord, fieldKey, spaceId, relatedRecord[fieldKey], enableAmisform)\n\t\t\t\t\t\t\ttableValueItem[formFieldKey] = tableFieldValue\n\t\t\t\t\tif !_.isEmpty(tableValueItem)\n\t\t\t\t\t\ttableValueItem._id = relatedRecord._id\n\t\t\t\t\t\ttableValues.push(tableValueItem)\n\t\t\t\t\t\trelatedTableItems.push({ _table: { _id: relatedRecord._id, _code: tableCode } } )\n\n\t\t\t\tvalues[tableCode] = tableValues\n\t\t\t\trelatedTablesInfo[relatedObjectName] = relatedTableItems\n\n\t\t# 如果配置了脚本则执行脚本\n\t\tif ow.field_map_script\n\t\t\t_.extend(values, uuflowManagerForInitApproval.evalFieldMapScript(ow.field_map_script, objectName, spaceId, recordId))\n\n\t# 过滤掉values中的非法key\n\tfilterValues = {}\n\t_.each _.keys(values), (k) ->\n\t\tif fieldCodes.includes(k)\n\t\t\tfilterValues[k] = values[k]\n\n\treturn filterValues\n\nuuflowManagerForInitApproval.evalFieldMapScript = (field_map_script, objectName, spaceId, objectId) ->\n\t# record = Creator.getCollection(objectName, spaceId).findOne(objectId)\n\trecord = objectFindOne(objectName, { filters: [['_id', '=', objectId]] })\n\tscript = \"module.exports = function (record) { \" + field_map_script + \" }\"\n\tfunc = _eval(script, \"field_map_script\")\n\tvalues = func(record)\n\tif _.isObject values\n\t\treturn values\n\telse\n\t\tconsole.error \"evalFieldMapScript: 脚本返回值类型不是对象\"\n\treturn {}\n\n\n\nuuflowManagerForInitApproval.initiateAttach = (recordIds, spaceId, insId, approveId) ->\n\n\tCreator.Collections['cms_files'].find({\n\t\tspace: spaceId,\n\t\tparent: recordIds\n\t}).forEach (cf) ->\n\t\t_.each cf.versions, (versionId, idx) ->\n\t\t\tf = Creator.Collections['cfs.files.filerecord'].findOne(versionId)\n\t\t\tnewFile = new FS.File()\n\n\t\t\tnewFile.attachData f.createReadStream('files'), {\n\t\t\t\t\ttype: f.original.type\n\t\t\t}, (err) ->\n\t\t\t\tif (err)\n\t\t\t\t\tthrow new Meteor.Error(err.error, err.reason)\n\n\t\t\t\tnewFile.name(f.name())\n\t\t\t\tnewFile.size(f.size())\n\t\t\t\tmetadata = {\n\t\t\t\t\towner: f.metadata.owner,\n\t\t\t\t\towner_name: f.metadata.owner_name,\n\t\t\t\t\tspace: spaceId,\n\t\t\t\t\tinstance: insId,\n\t\t\t\t\tapprove: approveId\n\t\t\t\t\tparent: cf._id\n\t\t\t\t}\n\n\t\t\t\tif idx is 0\n\t\t\t\t\tmetadata.current = true\n\n\t\t\t\tnewFile.metadata = metadata\n\t\t\t\tcfs.instances.insert(newFile)\n\n\treturn\n\nuuflowManagerForInitApproval.initiateRecordInstanceInfo = (recordIds, insId, spaceId) ->\n\t# Creator.getCollection(recordIds.o, spaceId).update(recordIds.ids[0], {\n\t# \t$push: {\n\t# \t\tinstances: {\n\t# \t\t\t$each: [{\n\t# \t\t\t\t_id: insId,\n\t# \t\t\t\tstate: 'draft'\n\t# \t\t\t}],\n\t# \t\t\t$position: 0\n\t# \t\t}\n\t# \t},\n\t# \t$set: {\n\t# \t\tlocked: true\n\t# \t\tinstance_state: 'draft'\n\t# \t}\n\t# })\n\tobjectUpdate(recordIds.o, recordIds.ids[0], {\n\t\tinstances: [{\n\t\t\t_id: insId,\n\t\t\tstate: 'draft'\n\t\t}],\n\t\tlocked: true,\n\t\tinstance_state: 'draft'\n\t})\n\n\treturn\n\n\nuuflowManagerForInitApproval.initiateRelatedRecordInstanceInfo = (relatedTablesInfo, insId, spaceId) ->\n\t_.each relatedTablesInfo, (tableItems, relatedObjectName) ->\n\t\trelatedCollection = Creator.getCollection(relatedObjectName, spaceId)\n\t\t_.each tableItems, (item) ->\n\t\t\trelatedCollection.direct.update(item._table._id, {\n\t\t\t\t$set: {\n\t\t\t\t\tinstances: [{\n\t\t\t\t\t\t_id: insId,\n\t\t\t\t\t\tstate: 'draft'\n\t\t\t\t\t}],\n\t\t\t\t\t_table: item._table\n\t\t\t\t}\n\t\t\t})\n\n\treturn\n\nuuflowManagerForInitApproval.checkIsInApproval = (recordIds, spaceId) ->\n\t# record = Creator.getCollection(recordIds.o, spaceId).findOne({\n\t# \t_id: recordIds.ids[0], instances: { $exists: true }\n\t# }, { fields: { instances: 1 } })\n\trecord = objectFindOne(recordIds.o, { filters: [['_id', '=', recordIds.ids[0]]], fields: ['instances'] })\n\n\tif record and record.instances and record.instances[0].state isnt 'completed' and Creator.Collections.instances.find(record.instances[0]._id).count() > 0\n\t\tthrow new Meteor.Error('error!', \"此记录已发起流程正在审批中,待审批结束方可发起下一次审批!\")\n\n\treturn\n\n\nuuflowManagerForInitApproval.formatDate = (date) ->\n\treturn moment(date).format(\"YYYY-MM-DD\")\n\nuuflowManagerForInitApproval.formatTime = (date) ->\n\treturn moment(date).utcOffset(0).format(\"1970-01-01THH:mm:00.000[Z]\")","var _eval, checkRequiredDetails, getFieldOdataValue, getFileFieldValue, getFormField, getFormTableField, getFormTableFieldCode, getFormTableSubField, getInstanceFieldValue, getObjectConfig, getObjectNameFieldKey, getRelatedObjectFieldCode, getRelateds, getSelectOrgValue, getSelectOrgValues, getSelectUserValue, getSelectUserValues, objectFind, objectFindOne, objectUpdate, objectql; \n\n_eval = require('eval');\n\nobjectql = require('@steedos/objectql');\n\ngetObjectConfig = function(objectApiName) {\n return objectql.getObject(objectApiName).toConfig();\n};\n\ngetObjectNameFieldKey = function(objectApiName) {\n return objectql.getObject(objectApiName).NAME_FIELD_KEY;\n};\n\ngetRelateds = function(objectApiName) {\n return Meteor.wrapAsync(function(objectApiName, cb) {\n return objectql.getObject(objectApiName).getRelateds().then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(objectApiName);\n};\n\nobjectFindOne = function(objectApiName, query) {\n return Meteor.wrapAsync(function(objectApiName, query, cb) {\n query.top = 1;\n return objectql.getObject(objectApiName).find(query).then(function(resolve, reject) {\n if (resolve && resolve.length > 0) {\n return cb(reject, resolve[0]);\n } else {\n return cb(reject, null);\n }\n });\n })(objectApiName, query);\n};\n\nobjectFind = function(objectApiName, query) {\n return Meteor.wrapAsync(function(objectApiName, query, cb) {\n return objectql.getObject(objectApiName).find(query).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(objectApiName, query);\n};\n\nobjectUpdate = function(objectApiName, id, data) {\n return Meteor.wrapAsync(function(objectApiName, id, data, cb) {\n return objectql.getObject(objectApiName).update(id, data).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(objectApiName, id, data);\n};\n\ngetRelatedObjectFieldCode = function(relatedObjectsKeys, key) {\n return _.find(relatedObjectsKeys, function(relatedObjectsKey) {\n return key.startsWith(relatedObjectsKey + '.');\n });\n};\n\ngetFormTableFieldCode = function(formTableFieldsCode, key) {\n return _.find(formTableFieldsCode, function(formTableFieldCode) {\n return key.startsWith(formTableFieldCode + '.');\n });\n};\n\ngetFormTableField = function(formTableFields, key) {\n return _.find(formTableFields, function(f) {\n return f.code === key;\n });\n};\n\ngetFormField = function(formFields, key) {\n var ff;\n ff = null;\n _.forEach(formFields, function(f) {\n if (ff) {\n return;\n }\n if (f.type === 'section') {\n return ff = _.find(f.fields, function(sf) {\n return sf.code === key;\n });\n } else if (f.code === key) {\n return ff = f;\n }\n });\n return ff;\n};\n\ngetFormTableSubField = function(tableField, subFieldCode) {\n return _.find(tableField.fields, function(f) {\n return f.code === subFieldCode;\n });\n};\n\ngetFieldOdataValue = function(objName, id, referenceToFieldName) {\n var _record, _records, nameKey, obj;\n obj = objectql.getObject(objName);\n nameKey = getObjectNameFieldKey(objName);\n if (!obj) {\n return;\n }\n if (_.isString(id)) {\n _record = objectFindOne(objName, {\n filters: [[referenceToFieldName, '=', id]]\n });\n if (_record) {\n _record['@label'] = _record[nameKey];\n return _record;\n }\n } else if (_.isArray(id)) {\n _records = [];\n objectFind(objName, {\n filters: [[referenceToFieldName, 'in', id]]\n }).forEach(function(_record) {\n _record['@label'] = _record[nameKey];\n return _records.push(_record);\n });\n if (!_.isEmpty(_records)) {\n return _records;\n }\n }\n};\n\ngetSelectUserValue = function(userId, spaceId) {\n var su;\n su = Creator.getCollection('space_users').findOne({\n space: spaceId,\n user: userId\n });\n su.id = userId;\n return su;\n};\n\ngetSelectUserValues = function(userIds, spaceId) {\n var sus;\n sus = [];\n if (_.isArray(userIds)) {\n _.each(userIds, function(userId) {\n var su;\n su = getSelectUserValue(userId, spaceId);\n if (su) {\n return sus.push(su);\n }\n });\n }\n return sus;\n};\n\ngetSelectOrgValue = function(orgId, spaceId) {\n var org;\n org = Creator.getCollection('organizations').findOne(orgId, {\n fields: {\n _id: 1,\n name: 1,\n fullname: 1\n }\n });\n org.id = orgId;\n return org;\n};\n\ngetSelectOrgValues = function(orgIds, spaceId) {\n var orgs;\n orgs = [];\n if (_.isArray(orgIds)) {\n _.each(orgIds, function(orgId) {\n var org;\n org = getSelectOrgValue(orgId, spaceId);\n if (org) {\n return orgs.push(org);\n }\n });\n }\n return orgs;\n};\n\ngetFileFieldValue = function(recordFieldId, fType) {\n var collection, files, query, value;\n if (_.isEmpty(recordFieldId)) {\n return;\n }\n if (fType === 'image') {\n collection = 'images';\n } else if (fType === 'file') {\n collection = 'files';\n }\n if (_.isString(recordFieldId)) {\n query = {\n _id: {\n $in: [recordFieldId]\n }\n };\n } else {\n query = {\n _id: {\n $in: recordFieldId\n }\n };\n }\n files = Creator.Collections[\"cfs.\" + collection + \".filerecord\"].find(query);\n value = [];\n files.forEach(function(f) {\n var newFile;\n newFile = new FS.File();\n return newFile.attachData(f.createReadStream('files'), {\n type: f.original.type\n }, function(err) {\n var metadata;\n if (err) {\n throw new Meteor.Error(err.error, err.reason);\n }\n newFile.name(f.name());\n newFile.size(f.size());\n metadata = {\n owner: f.metadata.owner\n };\n newFile.metadata = metadata;\n newFile._id = Creator.Collections.instances._makeNewID();\n cfs[collection].insert(newFile);\n return value.push(newFile._id);\n });\n });\n if (value.length > 0) {\n if (_.isString(recordFieldId)) {\n return value[0];\n } else {\n return value;\n }\n }\n};\n\ngetInstanceFieldValue = function(objField, formField, record, object_field, spaceId, recordFieldValue, enableAmisform) {\n var odataFieldValue, referenceToFieldName, referenceToObjectName, selectFieldValue, value;\n if (enableAmisform && formField.steedos_field) {\n return recordFieldValue;\n }\n recordFieldValue = record[objField.name];\n value;\n if (formField && objField && formField.type === 'odata' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)) {\n referenceToFieldName = objField.reference_to_field || '_id';\n referenceToObjectName = objField.reference_to;\n odataFieldValue;\n if (objField.multiple && formField.is_multiselect) {\n odataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName);\n } else if (!objField.multiple && !formField.is_multiselect) {\n odataFieldValue = getFieldOdataValue(referenceToObjectName, recordFieldValue, referenceToFieldName);\n }\n value = odataFieldValue;\n } else if (formField && objField && ['user', 'group'].includes(formField.type) && ['lookup', 'master_detail'].includes(objField.type) && (['users', 'organizations'].includes(objField.reference_to) || ('space_users' === objField.reference_to && 'user' === objField.reference_to_field))) {\n if (!_.isEmpty(recordFieldValue)) {\n selectFieldValue;\n if (formField.type === 'user') {\n if (objField.multiple && formField.is_multiselect) {\n selectFieldValue = getSelectUserValues(recordFieldValue, spaceId);\n } else if (!objField.multiple && !formField.is_multiselect) {\n selectFieldValue = getSelectUserValue(recordFieldValue, spaceId);\n }\n } else if (formField.type === 'group') {\n if (objField.multiple && formField.is_multiselect) {\n selectFieldValue = getSelectOrgValues(recordFieldValue, spaceId);\n } else if (!objField.multiple && !formField.is_multiselect) {\n selectFieldValue = getSelectOrgValue(recordFieldValue, spaceId);\n }\n }\n if (selectFieldValue) {\n value = selectFieldValue;\n }\n }\n } else if (formField && objField && formField.type === 'date' && recordFieldValue) {\n value = uuflowManagerForInitApproval.formatDate(recordFieldValue);\n } else if (formField && objField && formField.type === 'time' && recordFieldValue) {\n value = uuflowManagerForInitApproval.formatTime(recordFieldValue);\n } else if (formField && objField && recordFieldValue && (formField.type === 'image' || formField.type === 'file')) {\n value = getFileFieldValue(recordFieldValue, formField.type);\n } else if (formField && objField && recordFieldValue && formField.type === 'lookup' && ['lookup', 'master_detail'].includes(objField.type) && _.isString(objField.reference_to)) {\n value = recordFieldValue;\n } else if (formField && objField && recordFieldValue && (formField.type === 'multiSelect')) {\n value = recordFieldValue.join(',');\n } else if (record.hasOwnProperty(object_field)) {\n value = recordFieldValue;\n }\n return value;\n};\n\ncheckRequiredDetails = function(requiredDetails, masterRecord) {\n if (!_.isEmpty(requiredDetails)) {\n requiredDetails.forEach(function(rd) {\n var masterField, masterFieldValue, refId, subObjConfig, subTableMasterField, subTableName, subTableRecord;\n subTableName = rd.split('.')[0];\n subTableMasterField = rd.split('.')[1];\n subObjConfig = getObjectConfig(subTableName);\n masterField = subObjConfig.fields[subTableMasterField];\n refId = masterField.reference_to_field || '_id';\n masterFieldValue = masterRecord[refId];\n subTableRecord = objectFindOne(subTableName, {\n filters: [[subTableMasterField, '=', masterFieldValue]],\n fields: [subTableMasterField]\n });\n if (!subTableRecord) {\n throw new Error(\"请先新增\" + subObjConfig.label);\n }\n });\n }\n};\n\nuuflowManagerForInitApproval = {};\n\nuuflowManagerForInitApproval.check_authorization = function(req) {\n var authToken, hashedToken, query, user, userId;\n query = req.query;\n userId = query[\"X-User-Id\"];\n authToken = query[\"X-Auth-Token\"];\n if (!userId || !authToken) {\n throw new Meteor.Error(401, 'Unauthorized');\n }\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (!user) {\n throw new Meteor.Error(401, 'Unauthorized');\n }\n return user;\n};\n\nuuflowManagerForInitApproval.getSpace = function(space_id) {\n var space;\n space = Creator.Collections.spaces.findOne(space_id);\n if (!space) {\n throw new Meteor.Error('error!', \"space_id有误或此space已经被删除\");\n }\n return space;\n};\n\nuuflowManagerForInitApproval.getFlow = function(flow_id) {\n var flow;\n flow = Creator.Collections.flows.findOne(flow_id);\n if (!flow) {\n throw new Meteor.Error('error!', \"id有误或此流程已经被删除\");\n }\n return flow;\n};\n\nuuflowManagerForInitApproval.getSpaceUser = function(space_id, user_id) {\n var space_user;\n space_user = Creator.Collections.space_users.findOne({\n space: space_id,\n user: user_id\n });\n if (!space_user) {\n throw new Meteor.Error('error!', \"user_id对应的用户不属于当前space\");\n }\n return space_user;\n};\n\nuuflowManagerForInitApproval.getSpaceUserOrgInfo = function(space_user) {\n var info, org;\n info = new Object;\n info.organization = space_user.organization;\n org = Creator.Collections.organizations.findOne(space_user.organization, {\n fields: {\n name: 1,\n fullname: 1\n }\n });\n info.organization_name = org.name;\n info.organization_fullname = org.fullname;\n return info;\n};\n\nuuflowManagerForInitApproval.isFlowEnabled = function(flow) {\n if (flow.state !== \"enabled\") {\n throw new Meteor.Error('error!', \"流程未启用,操作失败\");\n }\n};\n\nuuflowManagerForInitApproval.isFlowSpaceMatched = function(flow, space_id) {\n if (flow.space !== space_id) {\n throw new Meteor.Error('error!', \"流程和工作区ID不匹配\");\n }\n};\n\nuuflowManagerForInitApproval.getForm = function(form_id) {\n var form;\n form = Creator.Collections.forms.findOne(form_id);\n if (!form) {\n throw new Meteor.Error('error!', '表单ID有误或此表单已经被删除');\n }\n return form;\n};\n\nuuflowManagerForInitApproval.getCategory = function(category_id) {\n return Creator.Collections.categories.findOne(category_id);\n};\n\nuuflowManagerForInitApproval.checkSyncDirection = function(object_name, flow_id) {\n var ow, syncDirection;\n ow = Creator.Collections.object_workflows.findOne({\n object_name: object_name,\n flow_id: flow_id\n });\n if (!ow) {\n throw new Meteor.Error('error!', '未找到对象流程映射记录。');\n }\n syncDirection = ow.sync_direction || 'both';\n if (!['both', 'obj_to_ins'].includes(syncDirection)) {\n throw new Meteor.Error('error!', '不支持的同步方向。');\n }\n};\n\nuuflowManagerForInitApproval.create_instance = function(instance_from_client, user_info) {\n var appr_obj, approve_from_client, category, flow, flow_id, form, ins_obj, new_ins_id, now, permissions, relatedTablesInfo, space, space_id, space_user, space_user_org_info, start_step, trace_from_client, trace_obj, user_id;\n check(instance_from_client[\"applicant\"], String);\n check(instance_from_client[\"space\"], String);\n check(instance_from_client[\"flow\"], String);\n check(instance_from_client[\"record_ids\"], [\n {\n o: String,\n ids: [String]\n }\n ]);\n uuflowManagerForInitApproval.checkSyncDirection(instance_from_client[\"record_ids\"][0].o, instance_from_client[\"flow\"]);\n uuflowManagerForInitApproval.checkIsInApproval(instance_from_client[\"record_ids\"][0], instance_from_client[\"space\"]);\n space_id = instance_from_client[\"space\"];\n flow_id = instance_from_client[\"flow\"];\n user_id = user_info._id;\n trace_from_client = null;\n approve_from_client = null;\n if (instance_from_client[\"traces\"] && instance_from_client[\"traces\"][0]) {\n trace_from_client = instance_from_client[\"traces\"][0];\n if (trace_from_client[\"approves\"] && trace_from_client[\"approves\"][0]) {\n approve_from_client = instance_from_client[\"traces\"][0][\"approves\"][0];\n }\n }\n space = uuflowManagerForInitApproval.getSpace(space_id);\n flow = uuflowManagerForInitApproval.getFlow(flow_id);\n space_user = uuflowManagerForInitApproval.getSpaceUser(space_id, user_id);\n space_user_org_info = uuflowManagerForInitApproval.getSpaceUserOrgInfo(space_user);\n uuflowManagerForInitApproval.isFlowEnabled(flow);\n uuflowManagerForInitApproval.isFlowSpaceMatched(flow, space_id);\n form = uuflowManagerForInitApproval.getForm(flow.form);\n permissions = permissionManager.getFlowPermissions(flow_id, user_id);\n if (!permissions.includes(\"add\")) {\n throw new Meteor.Error('error!', \"当前用户没有此流程的新建权限\");\n }\n now = new Date;\n ins_obj = {};\n ins_obj._id = Creator.Collections.instances._makeNewID();\n ins_obj.space = space_id;\n ins_obj.flow = flow_id;\n ins_obj.flow_version = flow.current._id;\n ins_obj.form = flow.form;\n ins_obj.form_version = flow.current.form_version;\n ins_obj.name = flow.name;\n ins_obj.submitter = user_id;\n ins_obj.submitter_name = user_info.name;\n ins_obj.applicant = instance_from_client[\"applicant\"] ? instance_from_client[\"applicant\"] : user_id;\n ins_obj.applicant_name = instance_from_client[\"applicant_name\"] ? instance_from_client[\"applicant_name\"] : user_info.name;\n ins_obj.applicant_organization = instance_from_client[\"applicant_organization\"] ? instance_from_client[\"applicant_organization\"] : space_user.organization;\n ins_obj.applicant_organization_name = instance_from_client[\"applicant_organization_name\"] ? instance_from_client[\"applicant_organization_name\"] : space_user_org_info.organization_name;\n ins_obj.applicant_organization_fullname = instance_from_client[\"applicant_organization_fullname\"] ? instance_from_client[\"applicant_organization_fullname\"] : space_user_org_info.organization_fullname;\n ins_obj.applicant_company = instance_from_client[\"applicant_company\"] ? instance_from_client[\"applicant_company\"] : space_user.company_id;\n ins_obj.state = 'draft';\n ins_obj.code = '';\n ins_obj.is_archived = false;\n ins_obj.is_deleted = false;\n ins_obj.created = now;\n ins_obj.created_by = user_id;\n ins_obj.modified = now;\n ins_obj.modified_by = user_id;\n ins_obj.record_ids = instance_from_client[\"record_ids\"];\n if (space_user.company_id) {\n ins_obj.company_id = space_user.company_id;\n }\n trace_obj = {};\n trace_obj._id = new Mongo.ObjectID()._str;\n trace_obj.instance = ins_obj._id;\n trace_obj.is_finished = false;\n start_step = _.find(flow.current.steps, function(step) {\n return step.step_type === 'start';\n });\n trace_obj.step = start_step._id;\n trace_obj.name = start_step.name;\n trace_obj.start_date = now;\n appr_obj = {};\n appr_obj._id = new Mongo.ObjectID()._str;\n appr_obj.instance = ins_obj._id;\n appr_obj.trace = trace_obj._id;\n appr_obj.is_finished = false;\n appr_obj.user = instance_from_client[\"applicant\"] ? instance_from_client[\"applicant\"] : user_id;\n appr_obj.user_name = instance_from_client[\"applicant_name\"] ? instance_from_client[\"applicant_name\"] : user_info.name;\n appr_obj.handler = user_id;\n appr_obj.handler_name = user_info.name;\n appr_obj.handler_organization = space_user.organization;\n appr_obj.handler_organization_name = space_user_org_info.name;\n appr_obj.handler_organization_fullname = space_user_org_info.fullname;\n appr_obj.type = 'draft';\n appr_obj.start_date = now;\n appr_obj.read_date = now;\n appr_obj.is_read = true;\n appr_obj.is_error = false;\n appr_obj.description = '';\n relatedTablesInfo = {};\n appr_obj.values = uuflowManagerForInitApproval.initiateValues(ins_obj.record_ids[0], flow_id, space_id, form.current.fields, relatedTablesInfo);\n trace_obj.approves = [appr_obj];\n ins_obj.traces = [trace_obj];\n ins_obj.values = appr_obj.values;\n ins_obj.inbox_users = instance_from_client.inbox_users || [];\n ins_obj.current_step_name = start_step.name;\n if (flow.auto_remind === true) {\n ins_obj.auto_remind = true;\n }\n ins_obj.flow_name = flow.name;\n if (form.category) {\n category = uuflowManagerForInitApproval.getCategory(form.category);\n if (category) {\n ins_obj.category_name = category.name;\n ins_obj.category = category._id;\n }\n }\n new_ins_id = Creator.Collections.instances.insert(ins_obj);\n uuflowManagerForInitApproval.initiateRecordInstanceInfo(ins_obj.record_ids[0], new_ins_id, space_id);\n uuflowManagerForInitApproval.initiateAttach(ins_obj.record_ids[0], space_id, ins_obj._id, appr_obj._id);\n return new_ins_id;\n};\n\nuuflowManagerForInitApproval.initiateValues = function(recordIds, flowId, spaceId, fields, relatedTablesInfo) {\n var enableAmisform, fieldCodes, filterValues, flow, form, formFields, formTableFields, formTableFieldsCode, object, objectName, ow, record, recordId, ref, relatedObjects, relatedObjectsKeys, requiredDetails, tableFieldCodes, tableFieldMap, tableToRelatedMap, values;\n fieldCodes = [];\n _.each(fields, function(f) {\n if (f.type === 'section') {\n return _.each(f.fields, function(ff) {\n return fieldCodes.push(ff.code);\n });\n } else {\n return fieldCodes.push(f.code);\n }\n });\n values = {};\n objectName = recordIds.o;\n object = getObjectConfig(objectName);\n recordId = recordIds.ids[0];\n ow = Creator.Collections.object_workflows.findOne({\n object_name: objectName,\n flow_id: flowId\n });\n record = objectFindOne(objectName, {\n filters: [['_id', '=', recordId]]\n });\n flow = Creator.getCollection('flows').findOne(flowId, {\n fields: {\n form: 1,\n enableAmisform: 1\n }\n });\n enableAmisform = flow.enable_amisform;\n if (ow && record) {\n requiredDetails = ow.required_details || [];\n checkRequiredDetails(requiredDetails, record);\n form = Creator.getCollection(\"forms\").findOne(flow.form);\n formFields = form.current.fields || [];\n relatedObjects = getRelateds(objectName);\n relatedObjectsKeys = _.pluck(relatedObjects, 'object_name');\n formTableFields = _.filter(formFields, function(formField) {\n return formField.type === 'table';\n });\n formTableFieldsCode = _.pluck(formTableFields, 'code');\n tableFieldCodes = [];\n tableFieldMap = [];\n tableToRelatedMap = {};\n if ((ref = ow.field_map) != null) {\n ref.forEach(function(fm) {\n var formField, formTableFieldCode, gridCode, lookupFieldName, lookupFieldObj, lookupObjectRecord, oTableCode, oTableCodeReferenceField, oTableCodeReferenceFieldCode, oTableFieldCode, objField, objectField, objectFieldName, objectFieldObjectName, objectLookupField, object_field, recordFieldValue, referenceToDoc, referenceToFieldName, referenceToFieldValue, referenceToObjectName, relatedObjectFieldCode, tableToRelatedMapKey, wTableCode, workflow_field;\n object_field = fm.object_field;\n workflow_field = fm.workflow_field;\n if (!object_field || !workflow_field) {\n throw new Meteor.Error(400, '未找到字段,请检查对象流程映射字段配置');\n }\n relatedObjectFieldCode = getRelatedObjectFieldCode(relatedObjectsKeys, object_field);\n formTableFieldCode = getFormTableFieldCode(formTableFieldsCode, workflow_field);\n objField = object.fields[object_field];\n formField = getFormField(formFields, workflow_field);\n recordFieldValue = record[object_field];\n if (relatedObjectFieldCode) {\n oTableCode = object_field.split('.')[0];\n oTableFieldCode = object_field.split('.')[1];\n tableToRelatedMapKey = oTableCode;\n if (!tableToRelatedMap[tableToRelatedMapKey]) {\n tableToRelatedMap[tableToRelatedMapKey] = {};\n }\n if (formTableFieldCode) {\n wTableCode = workflow_field.split('.')[0];\n tableToRelatedMap[tableToRelatedMapKey]['_FROM_TABLE_CODE'] = wTableCode;\n }\n return tableToRelatedMap[tableToRelatedMapKey][oTableFieldCode] = workflow_field;\n } else if (workflow_field.indexOf('.') > 0 && object_field.indexOf('.$.') > 0) {\n wTableCode = workflow_field.split('.')[0];\n oTableCode = object_field.split('.$.')[0](ref1.table1.$.name);\n if (record.hasOwnProperty(oTableCode) && _.isArray(record[oTableCode])) {\n tableFieldCodes.push(JSON.stringify({\n workflow_table_field_code: wTableCode,\n object_table_field_code: oTableCode\n }));\n return tableFieldMap.push(fm);\n } else if (oTableCode.indexOf('.') > 0) {\n oTableCodeReferenceFieldCode = oTableCode.split('.')[0];\n gridCode = oTableCode.split('.')[1];\n oTableCodeReferenceField = object.fields[oTableCodeReferenceFieldCode];\n if (oTableCodeReferenceField && ['lookup', 'master_detail'].includes(oTableCodeReferenceField.type) && _.isString(oTableCodeReferenceField.reference_to)) {\n if (record[oTableCode]) {\n return;\n }\n referenceToFieldName = oTableCodeReferenceField.reference_to_field || '_id';\n referenceToObjectName = oTableCodeReferenceField.reference_to;\n referenceToFieldValue = record[oTableCodeReferenceField.name];\n referenceToDoc = getFieldOdataValue(referenceToObjectName, referenceToFieldValue, referenceToFieldName);\n if (referenceToDoc[gridCode]) {\n record[oTableCode] = referenceToDoc[gridCode];\n tableFieldCodes.push(JSON.stringify({\n workflow_table_field_code: wTableCode,\n object_table_field_code: oTableCode\n }));\n return tableFieldMap.push(fm);\n }\n }\n }\n } else if (object_field.indexOf('.') > 0 && object_field.indexOf('.$.') === -1) {\n objectFieldName = object_field.split('.')[0];\n lookupFieldName = object_field.split('.')[1];\n if (object) {\n objectField = object.fields[objectFieldName];\n if (objectField && formField && ['lookup', 'master_detail'].includes(objectField.type) && _.isString(objectField.reference_to)) {\n lookupObjectRecord = objectFindOne(objectField.reference_to, {\n filters: [['_id', '=', record[objectFieldName]]],\n fields: [lookupFieldName]\n });\n if (!lookupObjectRecord) {\n return;\n }\n objectFieldObjectName = objectField.reference_to;\n lookupFieldObj = getObjectConfig(objectFieldObjectName);\n objectLookupField = lookupFieldObj.fields[lookupFieldName];\n return values[workflow_field] = getInstanceFieldValue(objectLookupField, formField, lookupObjectRecord, lookupFieldName, spaceId, record[lookupFieldName], enableAmisform);\n }\n }\n } else {\n return values[workflow_field] = getInstanceFieldValue(objField, formField, record, object_field, spaceId, record[object_field], enableAmisform);\n }\n });\n }\n _.uniq(tableFieldCodes).forEach(function(tfc) {\n var c;\n c = JSON.parse(tfc);\n values[c.workflow_table_field_code] = [];\n return record[c.object_table_field_code].forEach(function(tr) {\n var newTr;\n newTr = {};\n _.each(tr, function(tdValue, k) {\n return tableFieldMap.forEach(function(tfm) {\n var wTdCode;\n if (tfm.object_field === (c.object_table_field_code + '.$.' + k)) {\n wTdCode = tfm.workflow_field.split('.')[1];\n return newTr[wTdCode] = tdValue;\n }\n });\n });\n if (!_.isEmpty(newTr)) {\n return values[c.workflow_table_field_code].push(newTr);\n }\n });\n });\n _.each(tableToRelatedMap, function(map, key) {\n var formTableField, relatedField, relatedFieldName, relatedObject, relatedObjectName, relatedRecords, relatedTableItems, tableCode, tableValues;\n tableCode = map._FROM_TABLE_CODE;\n formTableField = getFormTableField(formTableFields, tableCode);\n if (!tableCode) {\n return console.warn('tableToRelated: [' + key + '] missing corresponding table.');\n } else {\n relatedObjectName = key;\n tableValues = [];\n relatedTableItems = [];\n relatedObject = getObjectConfig(relatedObjectName);\n relatedField = _.find(relatedObject.fields, function(f) {\n return ['lookup', 'master_detail'].includes(f.type) && f.reference_to === objectName;\n });\n relatedFieldName = relatedField.name;\n relatedRecords = objectFind(relatedObjectName, {\n filters: [[relatedFieldName, '=', recordId]]\n });\n relatedRecords.forEach(function(relatedRecord) {\n var tableValueItem;\n tableValueItem = {};\n _.each(map, function(valueKey, fieldKey) {\n var formField, formFieldKey, relatedObjectField, tableFieldValue;\n if (fieldKey !== '_FROM_TABLE_CODE') {\n tableFieldValue;\n formFieldKey;\n if (valueKey.startsWith(tableCode + '.')) {\n formFieldKey = (valueKey.split(\".\")[1]);\n } else {\n formFieldKey = valueKey;\n }\n formField = getFormTableSubField(formTableField, formFieldKey);\n relatedObjectField = relatedObject.fields[fieldKey];\n if (!formField || !relatedObjectField) {\n return;\n }\n tableFieldValue = getInstanceFieldValue(relatedObjectField, formField, relatedRecord, fieldKey, spaceId, relatedRecord[fieldKey], enableAmisform);\n return tableValueItem[formFieldKey] = tableFieldValue;\n }\n });\n if (!_.isEmpty(tableValueItem)) {\n tableValueItem._id = relatedRecord._id;\n tableValues.push(tableValueItem);\n return relatedTableItems.push({\n _table: {\n _id: relatedRecord._id,\n _code: tableCode\n }\n });\n }\n });\n values[tableCode] = tableValues;\n return relatedTablesInfo[relatedObjectName] = relatedTableItems;\n }\n });\n if (ow.field_map_script) {\n _.extend(values, uuflowManagerForInitApproval.evalFieldMapScript(ow.field_map_script, objectName, spaceId, recordId));\n }\n }\n filterValues = {};\n _.each(_.keys(values), function(k) {\n if (fieldCodes.includes(k)) {\n return filterValues[k] = values[k];\n }\n });\n return filterValues;\n};\n\nuuflowManagerForInitApproval.evalFieldMapScript = function(field_map_script, objectName, spaceId, objectId) {\n var func, record, script, values;\n record = objectFindOne(objectName, {\n filters: [['_id', '=', objectId]]\n });\n script = \"module.exports = function (record) { \" + field_map_script + \" }\";\n func = _eval(script, \"field_map_script\");\n values = func(record);\n if (_.isObject(values)) {\n return values;\n } else {\n console.error(\"evalFieldMapScript: 脚本返回值类型不是对象\");\n }\n return {};\n};\n\nuuflowManagerForInitApproval.initiateAttach = function(recordIds, spaceId, insId, approveId) {\n Creator.Collections['cms_files'].find({\n space: spaceId,\n parent: recordIds\n }).forEach(function(cf) {\n return _.each(cf.versions, function(versionId, idx) {\n var f, newFile;\n f = Creator.Collections['cfs.files.filerecord'].findOne(versionId);\n newFile = new FS.File();\n return newFile.attachData(f.createReadStream('files'), {\n type: f.original.type\n }, function(err) {\n var metadata;\n if (err) {\n throw new Meteor.Error(err.error, err.reason);\n }\n newFile.name(f.name());\n newFile.size(f.size());\n metadata = {\n owner: f.metadata.owner,\n owner_name: f.metadata.owner_name,\n space: spaceId,\n instance: insId,\n approve: approveId,\n parent: cf._id\n };\n if (idx === 0) {\n metadata.current = true;\n }\n newFile.metadata = metadata;\n return cfs.instances.insert(newFile);\n });\n });\n });\n};\n\nuuflowManagerForInitApproval.initiateRecordInstanceInfo = function(recordIds, insId, spaceId) {\n objectUpdate(recordIds.o, recordIds.ids[0], {\n instances: [\n {\n _id: insId,\n state: 'draft'\n }\n ],\n locked: true,\n instance_state: 'draft'\n });\n};\n\nuuflowManagerForInitApproval.initiateRelatedRecordInstanceInfo = function(relatedTablesInfo, insId, spaceId) {\n _.each(relatedTablesInfo, function(tableItems, relatedObjectName) {\n var relatedCollection;\n relatedCollection = Creator.getCollection(relatedObjectName, spaceId);\n return _.each(tableItems, function(item) {\n return relatedCollection.direct.update(item._table._id, {\n $set: {\n instances: [\n {\n _id: insId,\n state: 'draft'\n }\n ],\n _table: item._table\n }\n });\n });\n });\n};\n\nuuflowManagerForInitApproval.checkIsInApproval = function(recordIds, spaceId) {\n var record;\n record = objectFindOne(recordIds.o, {\n filters: [['_id', '=', recordIds.ids[0]]],\n fields: ['instances']\n });\n if (record && record.instances && record.instances[0].state !== 'completed' && Creator.Collections.instances.find(record.instances[0]._id).count() > 0) {\n throw new Meteor.Error('error!', \"此记录已发起流程正在审批中,待审批结束方可发起下一次审批!\");\n }\n};\n\nuuflowManagerForInitApproval.formatDate = function(date) {\n return moment(date).format(\"YYYY-MM-DD\");\n};\n\nuuflowManagerForInitApproval.formatTime = function(date) {\n return moment(date).utcOffset(0).format(\"1970-01-01THH:mm:00.000[Z]\");\n};\n"]} \ No newline at end of file diff --git a/server/bundle/programs/server/packages/steedos_workflow.js b/server/bundle/programs/server/packages/steedos_workflow.js index 3bc817e218..055600ee85 100644 --- a/server/bundle/programs/server/packages/steedos_workflow.js +++ b/server/bundle/programs/server/packages/steedos_workflow.js @@ -2936,6 +2936,24 @@ InstanceReadOnlyTemplate.getValue = function (value, field, locale, utcOffset) { value = InstanceReadOnlyTemplate.formatDate(value, utcOffset); break; + case 'time': + if (value && value.length === 16) { + t = value.split("T"); + t0 = t[0].split("-"); + t1 = t[1].split(":"); + year = t0[0]; + month = t0[1]; + date = t0[2]; + hours = t1[0]; + seconds = t1[1]; + value = new Date(year, month - 1, date, hours, seconds); + } else { + value = new Date(value); + } + + value = InstanceReadOnlyTemplate.formatTime(value); + break; + case 'input': if (field.is_textarea) { value = value; @@ -3277,6 +3295,12 @@ InstanceReadOnlyTemplate.formatDate = function (date, utcOffset) { return moment(date).utcOffset(utcOffset, passing).format("YYYY-MM-DD HH:mm"); }; +InstanceReadOnlyTemplate.formatTime = function (date) { + var utcOffset; + utcOffset = 0; + return moment(date).utcOffset(utcOffset).format("HH:mm"); +}; + InstanceReadOnlyTemplate.getInstanceView = function (user, space, instance, options) { var body, instanceCompiled, instanceRenderFunction, instanceTemplate, steedosData; steedosData = _getTemplateData(user, space, instance, options); @@ -4260,6 +4284,7 @@ SteedosTable.getTDValue = function (field, value) { case 'file': case 'lookup': case 'image': + case 'time': td_value = InstanceReadOnlyTemplate.getValue(value, field); break; @@ -11984,4 +12009,4 @@ Package._define("steedos:workflow", { })(); //# sourceURL=meteor://💻app/packages/steedos_workflow.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jaGVja05wbS5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9saWIvVVJJLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvaW5zdGFuY2VfdGFza3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvYXV0aF90b2tlbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC9saWIvaW5zdGFuY2VfcmVhZG9ubHlfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL2luc3RhbmNlX3JlYWRvbmx5X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L2NsaWVudC9jb3JlZm9ybS9pbnB1dFR5cGVzL2NvcmVmb3JtLXRhYmxlL3N0ZWVkb3MtdGFibGUuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oYW5kbGVyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL190cmFjZXNfaGFuZGxlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX2luc3RhbmNlX2F0dGFjaG1lbnRzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9faW5zdGFuY2Vfc2lnbl90ZXh0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9zaWduX3RleHQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9fdHJhY2VzX2hlbHAuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oZWxwLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX2luc3RhbmNlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfcmVjb3Jkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldFNwYWNlVXNlcnMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldEZvcm11bGFVc2VyT2JqZWN0cy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvaW5pdF9mb3JtdWxhX3ZhbHVlcy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvYXBpX3dvcmtmbG93X2ZvcndhcmQuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvcm91dGVzL3Rlc3Rfd2ViaG9vay5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3JvdXRlcy90ZXN0X3dlYmhvb2suY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3NldF9pbnN0YW5jZV9zdGVwX2FwcHJvdmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2dldF9pbnN0YW5jZV9kYXRhLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL3NhdmVfaW5zdGFuY2UuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvc2VydmVyL21ldGhvZHMvdHJhY2VfYXBwcm92ZV9jYy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mb3J3YXJkX2luc3RhbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2Nmc19pbnN0YW5jZXMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfYXBwcm92ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfcmV0dXJuLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV9yZW1pbmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL25leHRfc3RlcF91c2Vyc19ub3RfZm91bmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX251bWJlcl9ydWxlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvY2hlY2tfbWFpbl9hdHRhY2guY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9lZGl0X2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9zdGFydF9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV90cmFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX2JhdGNoLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9oaWRlX2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV92YWx1ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3JvdXRlcy9pbnN0YW5jZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9yb3V0ZXMvaW5zdGFuY2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9yb3V0ZXMvc3RlZWRvc19jc3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL3N0ZWVkb3NfY3NzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9saWIvMV9mb3JtX2Zvcm11bGEuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19wb3NpdGlvbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9mbG93cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZm9ybXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zvcm1zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RyYWZ0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV9kcmFmdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9mbG93LXRlbXBsYXRlL3dvcmtmbG93X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL2Zsb3ctdGVtcGxhdGUvd29ya2Zsb3dfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9zY2hlZHVsZS9hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc2NoZWR1bGUvYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvc2NoZWR1bGUvdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zY2hlZHVsZS90aW1lb3V0X2F1dG9fc3VibWl0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3RhYnVsYXIuY29mZmVlIl0sIm5hbWVzIjpbImNoZWNrTnBtVmVyc2lvbnMiLCJtb2R1bGUiLCJsaW5rIiwidiIsInJvb3QiLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiVVJJIiwicHVueWNvZGUiLCJJUHY2IiwiU2Vjb25kTGV2ZWxEb21haW5zIiwiU0xEIiwiX1VSSSIsInVybCIsImJhc2UiLCJfdXJsU3VwcGxpZWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJfYmFzZVN1cHBsaWVkIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwibG9jYXRpb24iLCJocmVmIiwiYWJzb2x1dGVUbyIsInZlcnNpb24iLCJwIiwicHJvdG90eXBlIiwiaGFzT3duIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJlc2NhcGVSZWdFeCIsInN0cmluZyIsInJlcGxhY2UiLCJnZXRUeXBlIiwidmFsdWUiLCJTdHJpbmciLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsImlzQXJyYXkiLCJvYmoiLCJmaWx0ZXJBcnJheVZhbHVlcyIsImRhdGEiLCJsb29rdXAiLCJpIiwiX21hdGNoIiwidGVzdCIsInNwbGljZSIsImFycmF5Q29udGFpbnMiLCJsaXN0IiwiX3R5cGUiLCJtYXRjaCIsImFycmF5c0VxdWFsIiwib25lIiwidHdvIiwic29ydCIsImwiLCJ0cmltU2xhc2hlcyIsInRleHQiLCJ0cmltX2V4cHJlc3Npb24iLCJfcGFydHMiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJob3N0bmFtZSIsInVybiIsInBvcnQiLCJwYXRoIiwicXVlcnkiLCJmcmFnbWVudCIsImR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyIsImVzY2FwZVF1ZXJ5U3BhY2UiLCJwcm90b2NvbF9leHByZXNzaW9uIiwiaWRuX2V4cHJlc3Npb24iLCJwdW55Y29kZV9leHByZXNzaW9uIiwiaXA0X2V4cHJlc3Npb24iLCJpcDZfZXhwcmVzc2lvbiIsImZpbmRfdXJpX2V4cHJlc3Npb24iLCJmaW5kVXJpIiwic3RhcnQiLCJlbmQiLCJ0cmltIiwiZGVmYXVsdFBvcnRzIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwid3MiLCJ3c3MiLCJpbnZhbGlkX2hvc3RuYW1lX2NoYXJhY3RlcnMiLCJkb21BdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlIiwibm9kZSIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJ0eXBlIiwiZXNjYXBlRm9yRHVtYkZpcmVmb3gzNiIsImVzY2FwZSIsInN0cmljdEVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZSIsImRlY29kZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzbzg4NTkiLCJ1bmVzY2FwZSIsInVuaWNvZGUiLCJjaGFyYWN0ZXJzIiwicGF0aG5hbWUiLCJleHByZXNzaW9uIiwibWFwIiwicmVzZXJ2ZWQiLCJ1cm5wYXRoIiwiZW5jb2RlUXVlcnkiLCJlc2NhcGVkIiwiZGVjb2RlUXVlcnkiLCJlIiwiX3BhcnQiLCJnZW5lcmF0ZUFjY2Vzc29yIiwiX2dyb3VwIiwiYyIsImdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uIiwiX3NlcCIsIl9jb2RpbmdGdW5jTmFtZSIsIl9pbm5lckNvZGluZ0Z1bmNOYW1lIiwiYWN0dWFsQ29kaW5nRnVuYyIsInNlZ21lbnRzIiwic3BsaXQiLCJqb2luIiwiZGVjb2RlUGF0aCIsImRlY29kZVVyblBhdGgiLCJyZWNvZGVQYXRoIiwicmVjb2RlVXJuUGF0aCIsImVuY29kZVJlc2VydmVkIiwicGFyc2UiLCJwYXJ0cyIsInBvcyIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJwYXJzZUF1dGhvcml0eSIsInBhcnNlSG9zdCIsImJyYWNrZXRQb3MiLCJ0IiwiY2hhckF0IiwiZmlyc3RDb2xvbiIsImZpcnN0U2xhc2giLCJuZXh0Q29sb24iLCJwYXJzZVVzZXJpbmZvIiwibGFzdEluZGV4T2YiLCJzaGlmdCIsInBhcnNlUXVlcnkiLCJpdGVtcyIsInNwbGl0cyIsIm5hbWUiLCJwdXNoIiwiYnVpbGQiLCJidWlsZEF1dGhvcml0eSIsImJ1aWxkSG9zdCIsImJ1aWxkVXNlcmluZm8iLCJidWlsZFF1ZXJ5IiwidW5pcXVlIiwia2V5IiwiYnVpbGRRdWVyeVBhcmFtZXRlciIsImFkZFF1ZXJ5IiwiY29uY2F0IiwicmVtb3ZlUXVlcnkiLCJoYXNRdWVyeSIsIndpdGhpbkFycmF5IiwiX2Jvb2x5IiwiQm9vbGVhbiIsIm9wIiwiY29tbW9uUGF0aCIsIk1hdGgiLCJtaW4iLCJ3aXRoaW5TdHJpbmciLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJfc3RhcnQiLCJfZW5kIiwiX3RyaW0iLCJfYXR0cmlidXRlT3BlbiIsImxhc3RJbmRleCIsImV4ZWMiLCJpbmRleCIsImlnbm9yZUh0bWwiLCJhdHRyaWJ1dGVPcGVuIiwibWF4Iiwic2VhcmNoIiwiaWdub3JlIiwicmVzdWx0IiwiZW5zdXJlVmFsaWRIb3N0bmFtZSIsInRvQVNDSUkiLCJub0NvbmZsaWN0IiwicmVtb3ZlQWxsIiwidW5jb25mbGljdGVkIiwiVVJJVGVtcGxhdGUiLCJkZWZlckJ1aWxkIiwiX2RlZmVycmVkX2J1aWxkIiwiX3N0cmluZyIsImNsb25lIiwidmFsdWVPZiIsImdlbmVyYXRlU2ltcGxlQWNjZXNzb3IiLCJnZW5lcmF0ZVByZWZpeEFjY2Vzc29yIiwiX2tleSIsImhhc2giLCJyZXMiLCJfb2JqZWN0IiwiYXR0cmlidXRlIiwic3JjIiwiaXMiLCJ3aGF0IiwiaXAiLCJpcDQiLCJpcDYiLCJzbGQiLCJpZG4iLCJyZWxhdGl2ZSIsImhhcyIsIl9wcm90b2NvbCIsIl9wb3J0IiwiX2hvc3RuYW1lIiwic2NoZW1lIiwieCIsIm9yaWdpbiIsImF1dGhvcml0eSIsImhvc3QiLCJ1c2VyaW5mbyIsInJlc291cmNlIiwic3ViZG9tYWluIiwiZG9tYWluIiwic3ViIiwiUmVnRXhwIiwidGxkIiwiZ2V0IiwiUmVmZXJlbmNlRXJyb3IiLCJkaXJlY3RvcnkiLCJmaWxlbmFtZSIsImRlY29kZVBhdGhTZWdtZW50IiwibXV0YXRlZERpcmVjdG9yeSIsIm5vcm1hbGl6ZVBhdGgiLCJzdWZmaXgiLCJzIiwic2VnbWVudCIsInNlcGFyYXRvciIsImFic29sdXRlIiwiRXJyb3IiLCJwb3AiLCJ1bnNoaWZ0Iiwic2VnbWVudENvZGVkIiwicSIsInNldFF1ZXJ5Iiwic2V0U2VhcmNoIiwiYWRkU2VhcmNoIiwicmVtb3ZlU2VhcmNoIiwiaGFzU2VhcmNoIiwibm9ybWFsaXplIiwibm9ybWFsaXplUHJvdG9jb2wiLCJub3JtYWxpemVRdWVyeSIsIm5vcm1hbGl6ZUZyYWdtZW50Iiwibm9ybWFsaXplSG9zdG5hbWUiLCJub3JtYWxpemVQb3J0IiwiYmVzdCIsIl9wYXRoIiwiX3dhc19yZWxhdGl2ZSIsIl9sZWFkaW5nUGFyZW50cyIsIl9wYXJlbnQiLCJfcG9zIiwibm9ybWFsaXplUGF0aG5hbWUiLCJub3JtYWxpemVTZWFyY2giLCJub3JtYWxpemVIYXNoIiwiZCIsInJlYWRhYmxlIiwidXJpIiwidG9Vbmljb2RlIiwicXAiLCJrdiIsInJlc29sdmVkIiwicHJvcGVydGllcyIsImJhc2VkaXIiLCJyZWxhdGl2ZVRvIiwicmVsYXRpdmVQYXJ0cyIsImJhc2VQYXJ0cyIsImNvbW1vbiIsInJlbGF0aXZlUGF0aCIsImJhc2VQYXRoIiwicGFyZW50cyIsImVxdWFscyIsIm9uZV9tYXAiLCJ0d29fbWFwIiwiY2hlY2tlZCIsIm9uZV9xdWVyeSIsInR3b19xdWVyeSIsIldvcmtmbG93IiwiSW1hZ2VTaWduIiwiVHJhY2VzSGFuZGxlciIsIlRyYWNlc1RlbXBsYXRlIiwiSW5zdGFuY2Vmb3JtVGVtcGxhdGUiLCJJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSIsIkluc3RhbmNlU2lnblRleHQiLCJSZWxhdGVkSW5zdGFuY2VzIiwiUmVsYXRlZFJlY29yZHMiLCJJbnN0YW5jZU1hY3JvIiwiY29udGV4dCIsIlRyYWNlc01hbmFnZXIiLCJpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyIsImZpZWxkX2Zvcm11bGEiLCJpbmNsdWRlc09waW5pb25GaWVsZCIsImZvcm0iLCJmb3JtX3ZlcnNpb24iLCJfZm9ybV92ZXJzaW9uIiwiZmllbGRfZm9ybXVsYXMiLCJmaWVsZHMiLCJBcnJheSIsIk1ldGVvciIsImlzU2VydmVyIiwidXVmbG93TWFuYWdlciIsImdldEZvcm1WZXJzaW9uIiwiZGIiLCJmb3JtcyIsImZpbmRPbmUiLCJfaWQiLCJmb3JtX3ZlcnNpb25zIiwiZm9yRWFjaCIsImYiLCJyZWYiLCJjb25zb2xlIiwibG9nIiwiZjEiLCJmb3JtdWxhIiwiXyIsInNvbWUiLCJoZWxwZXJzIiwiaW5zdGFuY2VfdGFza3MiLCJDb2xsZWN0aW9uIiwiX3NpbXBsZVNjaGVtYSIsIlNpbXBsZVNjaGVtYSIsImluc3RhbmNlIiwidHJhY2UiLCJpc19maW5pc2hlZCIsInVzZXIiLCJ1c2VyX25hbWUiLCJoYW5kbGVyIiwiaGFuZGxlcl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb24iLCJoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUiLCJzdGFydF9kYXRlIiwiRGF0ZSIsImR1ZV9kYXRlIiwiaXNfcmVhZCIsImlzX2Vycm9yIiwidmFsdWVzIiwiZGVhZGxpbmUiLCJyZW1pbmRfZGF0ZSIsInJlbWluZGVkX2NvdW50IiwiTnVtYmVyIiwicmVhZF9kYXRlIiwiZGVzY3JpcHRpb24iLCJtb2RpZmllZCIsIm1vZGlmaWVkX2J5Iiwic2lnbl9zaG93IiwianVkZ2UiLCJuZXh0X3N0ZXBzIiwiZmluaXNoX2RhdGUiLCJjb3N0X3RpbWUiLCJzcGFjZSIsImluc3RhbmNlX25hbWUiLCJzdWJtaXR0ZXIiLCJzdWJtaXR0ZXJfbmFtZSIsImFwcGxpY2FudCIsImFwcGxpY2FudF9uYW1lIiwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lIiwic3VibWl0X2RhdGUiLCJmbG93IiwiZmxvd19uYW1lIiwic3RlcCIsInN0ZXBfbmFtZSIsImNhdGVnb3J5X25hbWUiLCJpbnN0YW5jZV9zdGF0ZSIsImRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSIsImZvcndhcmRfZnJvbV9pbnN0YW5jZSIsImtleXdvcmRzIiwiaXNfYXJjaGl2ZWQiLCJjYXRlZ29yeSIsImF1dGhfdG9rZW5zIiwiX2dldExvY2FsZSIsIl9nZXRSZXF1aXJlZEZpZWxkcyIsIl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsIl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyIsIl9nZXRUZW1wbGF0ZURhdGEiLCJfZ2V0Vmlld0h0bWwiLCJnZXRMaW5rVGV4dCIsIm1hcmtlZCIsInJlcXVpcmUiLCJJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUiLCJpbnN0YW5jZV9hdHRhY2htZW50IiwiYWZTZWxlY3RVc2VyUmVhZCIsImFmRm9ybUdyb3VwUmVhZCIsImFmRm9ybUdyb3VwIiwiY3JlYXRlIiwidGVtcGFsdGVOYW1lIiwic3RlZWRvc0RhdGEiLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlQ29tcGlsZWQiLCJ0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uIiwiU3BhY2ViYXJzQ29tcGlsZXIiLCJjb21waWxlIiwiaXNCb2R5IiwiZXZhbCIsIlRlbXBsYXRlIiwiQmxhemUiLCJjcmVhdGVJbnN0YW5jZVNpZ25UZXh0IiwiaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkIiwiaW5zdGFuY2VTaWduVGV4dEh0bWwiLCJpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVNpZ25UZXh0IiwiY3JlYXRlSW1hZ2VTaWduIiwiaW1hZ2VTaWduQ29tcGlsZWQiLCJpbWFnZVNpZ25IdG1sIiwiaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24iLCJpbWFnZVNpZ24iLCJjcmVhdGVUcmFjZXNIYW5sZGVyIiwidHJhY2VzSGFubGRlckNvbXBpbGVkIiwidHJhY2VzSGFubGRlckh0bWwiLCJ0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZV90cmFjZXNfaGFuZGxlciIsImluaXQiLCJpdGVtIiwibGFiZWwiLCJkZXRhaWxfdXJsIiwiU3RlZWRvcyIsImFic29sdXRlVXJsIiwiZ2V0VmFsdWUiLCJmaWVsZCIsImxvY2FsZSIsInV0Y09mZnNldCIsImRhdGUiLCJmaWVsZE9wdGlvbnMiLCJob3VycyIsIm1vbnRoIiwibmFtZUZpZWxkIiwicmVjb3JkcyIsInNlY29uZHMiLCJzZWxlY3RlZE9wdGlvbiIsInNlbGVjdGVkT3B0aW9ucyIsInNwbGl0ZWRWYWx1ZXMiLCJ0MCIsInQxIiwidWlTY2hlbWEiLCJ5ZWFyIiwibiIsIml0ZW1TcGxpdHMiLCJlbmNvZGVVUkkiLCJlcnJvciIsImlzX211bHRpc2VsZWN0IiwiZ2V0UHJvcGVydHkiLCJmdWxsbmFtZSIsIlRBUGkxOG4iLCJfXyIsImZvcm1hdERhdGUiLCJpc190ZXh0YXJlYSIsImZpbmQiLCJmaWx0ZXIiLCJpc19wZXJjZW50IiwibnVtYmVyVG9QZXJjZW50U3RyaW5nIiwiZGlnaXRzIiwibnVtYmVyVG9TdHJpbmciLCJpc0NsaWVudCIsImF1dGhSZXF1ZXN0IiwiSlNPTiIsInN0cmluZ2lmeSIsImFzeW5jIiwib2JqZWN0RmluZCIsImZpbHRlcnMiLCJmaWxlTmFtZSIsImZpbGVQcmV2aWV3SHRtbCIsImZpbGVVcmwiLCJvcmlnaW5hbCIsIkNyZWF0b3IiLCJnZXRPYmplY3QiLCJyZWZlcmVuY2VfdG8iLCJOQU1FX0ZJRUxEX0tFWSIsInJlZmVyZW5jZV90b19maWVsZCIsImdldE9iamVjdE5hbWVGaWVsZEtleSIsImdldExhYmVsIiwiY29kZSIsImZpbmRQcm9wZXJ0eUJ5UEsiLCJnZXRJbnN0YW5jZUZvcm1WZXJzaW9uIiwiZm9ybV9maWVsZHMiLCJjdXJyZW50Iiwid2hlcmUiLCJoaXN0b3J5cyIsImdldEZsb3dWZXJzaW9uIiwiZmxvd192ZXJzaW9uIiwiZmxvd3MiLCJ2aWV3SHRtbCIsIkFzc2V0cyIsImdldFRleHQiLCJyZWYxIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJyZXYiLCJpc19yZXF1aXJlZCIsInN0ZXBzIiwiZWRpdGFibGVDb2RlIiwic3RhcnRTdGVwIiwia2V5cyIsInBlcm1pc3Npb25zIiwicmVxdWlyZWRGaWVsZHMiLCJpbnRlcnNlY3Rpb24iLCJXb3JrZmxvd01hbmFnZXIiLCJXb3JrZmxvd01hbmFnZXJfZm9ybWF0IiwiZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMiLCJpbnNuYW1lIiwiaW5zX3N0YXRlIiwic3RhdGUiLCJpbnNfZmluYWxfZGVjaXNpb24iLCJpbnNfY29kZSIsImluc19pc19hcmNoaXZlZCIsImluc19pc19kZWxldGVkIiwiYXBwbGljYW50Q29udGV4dCIsInNlc3Npb25Vc2VySWQiLCJlZGl0YWJsZSIsInN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzIiwicGFzc2luZyIsIm1vbWVudCIsImZvcm1hdCIsImdldEluc3RhbmNlVmlldyIsImJvZHkiLCJpbnN0YW5jZUNvbXBpbGVkIiwiaW5zdGFuY2VSZW5kZXJGdW5jdGlvbiIsImluc3RhbmNlVGVtcGxhdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJnZXRUZW1wbGF0ZSIsInRlbXBsYXRlTmFtZSIsImluc3RhbmNlX3JlYWRvbmx5X3ZpZXciLCJ0b0hUTUxXaXRoRGF0YSIsImdldFRyYWNlc1ZpZXciLCJ0cmFjZUNvbXBpbGVkIiwidHJhY2VSZW5kZXJGdW5jdGlvbiIsInRyYWNlc0h0bWwiLCJpbnN0YW5jZV9zdHlsZSIsInRyYWNlX3JlYWRvbmx5X3ZpZXciLCJ0cmFjZXMiLCJnZXRBdHRhY2htZW50VmlldyIsImF0dGFjaG1lbnRDb21waWxlZCIsImF0dGFjaG1lbnRIdG1sIiwiYXR0YWNobWVudFJlbmRlckZ1bmN0aW9uIiwiYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldyIsImdldFJlbGF0ZWRJbnN0YW5jZXNWaWV3IiwicmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkIiwicmVsYXRlZEluc3RhbmNlc0h0bWwiLCJyZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24iLCJyZWxhdGVkX2luc3RhbmNlc192aWV3IiwiZ2V0UmVsYXRlZFJlY29yZHNWaWV3IiwicmVsYXRlZFJlY29yZHNDb21waWxlZCIsInJlbGF0ZWRSZWNvcmRzSHRtbCIsInJlbGF0ZWRSZWNvcmRzUmVuZGVyRnVuY3Rpb24iLCJyZWxhdGVkX3JlY29yZHNfdmlldyIsImdldE9uTG9hZFNjcmlwdCIsImZvcm1fc2NyaXB0IiwiZ2V0SW5zdGFuY2VIdG1sIiwiYWxsQ3NzTGluayIsImF0dGFjaG1lbnQiLCJjcmVhdG9yU2VydmljZSIsImNzc0hyZWYiLCJmb3JtRGVzY3JpcHRpb24iLCJmb3JtRGVzY3JpcHRpb25IdG1sIiwiaHRtbCIsImluc19yZWNvcmRfaWRzIiwiaW5zdGFuY2VCb3hTdHlsZSIsImpxSHJlZiIsIm9uTG9hZFNjcmlwdCIsIm9wZW5GaWxlU2NyaXB0IiwicmVsYXRlZF9pbnN0YW5jZXMiLCJyZWxhdGVkX3JlY29yZHMiLCJzaG93VHJhY2VzQnRuIiwic2hvd1RyYWNlc1NjcmlwdCIsInRyYWNlQ2hlY2siLCJ3aWR0aCIsInNldHRpbmdzIiwid2Vic2VydmljZXMiLCJjcmVhdG9yIiwicmVjb3JkX2lkcyIsImlzTW9iaWxlIiwic2hvd1RyYWNlIiwiZmluYWxfZGVjaXNpb24iLCJzaG93QXR0YWNobWVudHMiLCJpc0VtcHR5IiwidGFnZ2VyIiwic3R5bGVzIiwicGx1Z2lucyIsImFkZF9zdHlsZXMiLCJmb3JtSWQiLCJpbnN0YW5jZV90aXRsZSIsInBhZ2VUaXRsZSIsInBhZ2VUaXRsZVRyQ2xhc3MiLCJ2YWwiLCJDb3JlRm9ybSIsInBhZ2VUaXRsZUZpZWxkTmFtZSIsImhhbmRsZVRhYmxlVGVtcGxhdGUiLCJfZXhwb3J0IiwidGFibGVfZmllbGRzIiwidGFibGVfZmllbGQiLCJmaWVsZF9wZXJtaXNzaW9uIiwicHVyZUNvZGUiLCJyZXF1aXJlZCIsInRpdGxlX3Blcm1pc3Npb24iLCJyZW1vdmVTcGVjaWFsQ2hhcmFjdGVyIiwiaXNPcGluaW9uRmllbGQiLCJ0cl9zdGFydCIsInRkX2NvbHNwYW4iLCJ0cl9lbmQiLCJpbmNsdWRlcyIsInBlcm1pc3Npb24iLCJfdGVtcGxhdGUiLCJ0YWJsZSIsIl90ZW1wbGF0ZUhlbHBzIiwic3RlZWRvc19pbnN0YW5jZSIsImdldEluc3RhbmNlIiwiYXR0cyIsImlkIiwic3R5bGUiLCJkaXNhYmxlZCIsImluc3RhbmNlSWQiLCJmb3JtX3R5cGVzIiwiQXBwcm92ZU1hbmFnZXIiLCJpc1JlYWRPbmx5Iiwic3RlZWRvc19mb3JtIiwiaW5uZXJzdWJmb3JtQ29udGV4dCIsImRvY192YWx1ZXMiLCJTZXNzaW9uIiwiYSIsImIiLCJnZXRBdXRvZm9ybVNjaGVtYSIsImluc3RhbmNlX2JveF9zdHlsZSIsImJveCIsImlucyIsInByaW50X3RlbXBsYXRlIiwiaW5zdGFuY2VfdGVtcGxhdGUiLCJTdGVlZG9zVGFibGUiLCJjaGVja0l0ZW0iLCJpdGVtX2luZGV4IiwiZmllbGRPYmoiLCJnZXRGaWVsZCIsImZpZWxkVmFsIiwiZ2V0SXRlbU1vZGFsVmFsdWUiLCJzZl9uYW1lIiwic2ZpZWxkcyIsInNmIiwiSW5zdGFuY2VNYW5hZ2VyIiwiY2hlY2tGb3JtRmllbGRWYWx1ZSIsIiQiLCJzZXRUYWJsZUl0ZW1WYWx1ZSIsIml0ZW1fdmFsdWUiLCJ0YWJsZVZhbHVlIiwiZ2V0VGFibGVWYWx1ZSIsImdldFRhYmxlSXRlbVZhbHVlIiwicmVtb3ZlVGFibGVJdGVtIiwicmVtb3ZlZCIsInNldFRhYmxlVmFsdWUiLCJnZXRWYWxpZFZhbHVlIiwidmFsaWRWYWx1ZSIsImhhbmRsZURhdGEiLCJpbnN0YW5jZUZpZWxkcyIsImdldEluc3RhbmNlRmllbGRzIiwiZ2V0TW9kYWxEYXRhIiwiRm9ybV9mb3JtdWxhIiwiZ2V0Rm9ybXVsYUZpZWxkVmFyaWFibGUiLCJBdXRvRm9ybSIsImdldEZvcm1WYWx1ZXMiLCJpbnNlcnREb2MiLCJhZGRJdGVtIiwiX2l0ZW1fdmFsdWUiLCJnZXRLZXlzIiwiYXBwZW5kIiwiZ2V0VHIiLCJ1cGRhdGVJdGVtIiwidGRzIiwiZ2V0UmVtb3ZlVGQiLCJzZmllbGQiLCJnZXRUZCIsImVtcHR5IiwicnVuRm9ybXVsYSIsInJlbW92ZUl0ZW0iLCJoaWRlIiwic2hvd01vZGFsIiwibWV0aG9kIiwibW9kYWxEYXRhIiwic2V0VGltZW91dCIsIk1vZGFsIiwic2hvdyIsImdldEN1cnJlbnREYXRhRm9yRm9ybSIsInNzIiwiZ2V0Rm9ybVNjaGVtYSIsInNjaGVtYSIsIm9iamVjdEtleXMiLCJfbWFrZUdlbmVyaWMiLCJnZXRUaGVhZCIsImlzT2JqZWN0IiwidGhlYWQiLCJ0cnMiLCJzZl9sZW5ndGgiLCJ3aWRlX2ZpZWxkcyIsImZpbHRlclByb3BlcnR5IiwiaXNfd2lkZSIsImdldFRib2R5Iiwic2ZpZWxkc0VkaXRhYmxlIiwidGJvZHkiLCJ0ciIsInRkIiwidGRfdmFsdWUiLCJnZXRURFZhbHVlIiwidmlldyIsIkNGRGF0YU1hbmFnZXIiLCJnZXRGb3JtdWxhU3BhY2VVc2VycyIsInUiLCJnZXRGb3JtdWxhT3JnYW5pemF0aW9ucyIsIm8iLCJnZXRGb3JtdWxhT3JnYW5pemF0aW9uIiwicGx1Y2siLCJhZGRJbnB1dFR5cGUiLCJ2YWx1ZU91dCIsInZhbHVlQ29udmVydGVycyIsInN0cmluZ1RvU3RyaW5nQXJyYXkiLCJzdHJpbmdUb051bWJlciIsInN0cmluZ1RvTnVtYmVyQXJyYXkiLCJzdHJpbmdUb0Jvb2xlYW4iLCJzdHJpbmdUb0Jvb2xlYW5BcnJheSIsInN0cmluZ1RvRGF0ZSIsInN0cmluZ1RvRGF0ZUFycmF5IiwiY29udGV4dEFkanVzdCIsIm1heGxlbmd0aCIsImFmVGFibGUiLCJldmVudHMiLCJldmVudCIsIm5ld19pdGVtX2luZGV4IiwiY3VycmVudFRhcmdldCIsImRhdGFzZXQiLCJzZXQiLCJyZW5kZXJlZCIsInN0ciIsImFkZEl0ZW1UciIsImdldEN1cnJlbnRTdGVwIiwic3RlcF90eXBlIiwiY2NIYXNFZGl0UGVybWlzc2lvbiIsImF1dG9ydW4iLCJjdXJyZW50RGF0YSIsInNwYWNlVXNlclNpZ24iLCJ1c2VySWQiLCJzcGFjZV91c2VyX3NpZ25zIiwiaW1hZ2VVUkwiLCJzaWduIiwic2hvd1NpZ25JbWFnZSIsInRyYWNlU2hvd1NpZ25JbWFnZSIsIm9iamVjdFVybCIsIm9iamVjdF9uYW1lIiwicmVjb3JkX2lkIiwiYXBwX2lkIiwiZ2V0T2JqZWN0VXJsIiwidW5lbXB0eSIsInVuZXF1YWxzIiwiaW5jbHVkZSIsInJlZjIiLCJyZWYzIiwiZ2V0SW5zdGFuY2VGbG93VmVyc2lvbiIsImFwcHJvdmVzIiwicmVmNCIsImFwcHJvdmUiLCJqdWRnZV9uYW1lIiwib3Bpbmlvbl9maWVsZHNfY29kZSIsInNpZ25fZmllbGRfY29kZSIsImFmdGVyX2ZpZWxkIiwiYmVmb3JlX2ZpZWxkIiwicHJlX2ZpZWxkcyIsInByZV93aWRlX2ZpZWxkcyIsInNvcnRfYXBwcm92ZSIsIm9yZGVyIiwicDEiLCJwMiIsIl9wMSIsIl9wMiIsImdldFRpbWUiLCJfdCIsImlzVGV4dGFyZWEiLCJnZXRDZkNsYXNzIiwiZ2V0VGFibGVUaGVhZCIsImdldFRhYmxlQm9keSIsInNob3dMYWJlbCIsInRlbXBsYXRlRGF0YSIsImdldE9waW5pb25GaWVsZFN0ZXBzTmFtZSIsInRvcF9rZXl3b3JkcyIsImZvbzEiLCJvcGluaW9uRmllbGRzIiwiZm9vIiwianNvbl9mb3JtdWxhIiwiczEiLCJlcnJvcjEiLCJ5aWppYW5sYW4iLCJzdGVwTmFtZSIsImltYWdlX3NpZ24iLCJvbmx5X2NjX29waW5pb24iLCJvbmx5X2NjIiwiZGVmYXVsdF9kZXNjcmlwdGlvbiIsIm9ubHlfaGFuZGxlciIsInNob3dDQ09waW5pb24iLCJtYXJrRG93blRvSHRtbCIsIm1hcmtEb3duU3RyaW5nIiwiTnBtIiwiU3BhY2ViYXJzIiwiU2FmZVN0cmluZyIsImZfbGFiZWwiLCJ0aGF0IiwiaXNTZWN0aW9uIiwicmVnaXN0ZXJIZWxwZXIiLCJpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCIsImdldFBlcm1pc3Npb25zIiwiaW5zdGFuY2Vmb3JtQ2hhbmdlRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsIm9wZW5XaW5kb3ciLCJ0YXJnZXQiLCJvbkNyZWF0ZWQiLCJjb21waWxlZCIsImluc3RhbmNlQ3VzdG9tVGVtcGxhdGUiLCJpbnN0YW5jZVZpZXciLCJyZW5kZXJGdW5jdGlvbiIsIlZpZXciLCJpbnN0YW5jZV9jdXN0b21fdGVtcGxhdGUiLCJvblJlbmRlcmVkIiwiY3VycmVudEFwcHJvdmUiLCJjdXJyZW50U3RlcCIsImZvcm11bGFfZmllbGRzIiwiaW5zdGFuY2VOdW1iZXJGaWVsZHMiLCJzZXRJbnN0YW5jZUZvcm1BcHBsaWNhbnQiLCJuZXh0U3RlcHMiLCJuZXh0U3RlcFVzZXJzIiwiSW5zdGFuY2VFdmVudCIsImluaXRFdmVudHMiLCJnZXRDdXJyZW50QXBwcm92ZSIsImVhY2giLCJlbGVtZW50Iiwic2NoZW1hS2V5IiwidG9hc3RyIiwicmVhc29uIiwiZ2V0RmllbGRWYWx1ZSIsIkluc3RhbmNlTnVtYmVyUnVsZXMiLCJpbnN0YW5jZU51bWJlckJ1aWxkZXIiLCJ0cmlnZ2VyIiwicnVuIiwic2hvd01haW5UaXRsZSIsIndvcmtmbG93TWFpbkF0dGFjaFRpdGxlIiwiZW5hYmxlZF9hZGRfbWFpbl9hdHRhY2htZW50IiwiY3VycmVudF9zdGVwIiwiY3VycmVudFRyYWNlIiwiZ2V0Q3VycmVudFRyYWNlIiwibWFpbl9hdHRhY2hfY291bnQiLCJjZnMiLCJpbnN0YW5jZXMiLCJjb3VudCIsImRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQiLCJzdGFydF9zdGVwIiwiZ2V0U3RhcnRTdGVwIiwiY2FuX2VkaXRfbWFpbl9hdHRhY2giLCJlbmFibGVkX2VkaXRfbm9ybWFsX2F0dGFjaG1lbnQiLCJnZXRGbG93IiwidXBsb2FkX2FmdGVyX2JlaW5nX2Rpc3RyaWJ1dGVkIiwiaXNDQyIsImdldENDU3RlcCIsImNhbl9lZGl0X25vcm1hbF9hdHRhY2giLCJtYWluX2F0dGFjaG1lbnQiLCJtYWluX2F0dGFjaCIsIm5vcm1hbF9hdHRhY2htZW50cyIsInNlbGVjdG9yIiwiJG5lIiwiZGZpcyIsImRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMiLCIkaW4iLCJkaXN0cmlidXRlX21haW4iLCJmaXJzdFZlcnNpb25NYWluIiwibWV0YWRhdGEiLCJwYXJlbnQiLCJhdHRhY2htZW50VXBsb2FkZWRBdCIsInVwbG9hZGVkQXQiLCJmaXJzdFZlcnNpb24iLCJzb3J0QnkiLCJpbnN0YW5jZUlkcyIsImF0dGFjaG1lbnRzX2NvdW50IiwiZmxvd19maWxlcyIsImZpbGVzIiwiaXNEcmFmdEFuZEZsb3dmaWxlc0V4aXN0IiwiY29tcGFjdCIsImF0dGFjaG1lbnRzIiwiJG9yIiwiZmV0Y2giLCJteUFwcHJvdmUiLCJteVRyYWNlIiwiaXNJbmJveCIsImRlZmF1bHREZXNjcmlwdGlvbiIsImFwcHJvdmVfc29ydCIsImFwcHJvdmVzR3JvdXAiLCJhcHByb3Zlc19zb3J0ZWQiLCJjb21wbGV0ZWRfZGF0ZSIsImhhc05leHQiLCJoYXZlRGVzY3JpcHRpb25BcHByb3ZlIiwiaXNfY29tcGxldGVkIiwibGFzdCIsInRvcF9hcHByb3ZlcyIsInVuaW9uIiwidG9wX2FwcHJvdmUiLCJncm91cEJ5IiwiaGFuZGxlckFwcHJvdmVzIiwiZGVzY3JpcHRpb25BcHByb3ZlcyIsIndvcmtmbG93Iiwic2hvd0JsYW5rQXBwcm92ZURlc2NyaXB0aW9uIiwiX2Rpc3BsYXkiLCJpc015QXBwcm92ZSIsIm15QXBwcm92ZURlc2NyaXB0aW9uIiwiYXBwcm92ZUlkIiwibm93IiwiaXNPcGluaW9uT2ZGaWVsZCIsImltYWdlU2lnbkRhdGEiLCJnZXRMYXN0U2lnbkFwcHJvdmUiLCJnZXRIYW5kbGVyU2lnblNob3dBcHByb3ZlcyIsImxhc3RNeUFwcHJvdmVEZXNjcmlwdGlvbiIsInNob3dBcHByb3ZlIiwianVkZ2VfZGVzY3JpcHRpb24iLCJpc19hcHByb3ZlZCIsImlzX3JlamVjdGVkIiwiaXNfcmVhZGVkIiwiYWRkQ2xhc3MiLCJkYXRlRm9ybWF0IiwiZ2V0RnVsbFllYXIiLCJnZXRTdGVwTmFtZSIsInN0ZXBJZCIsImdldEluc3RhbmNlU3RlcCIsInNob3dEZWxldGVCdXR0b24iLCJhcHByb3ZlZCIsImZyb21fdXNlciIsImlzU2hvd01vZGlmaWNhdGlvbkJ1dHRvbiIsImFwcHJvdmVfYWRtaW5zIiwiaXNTaG93IiwiY29udGFpbnMiLCJpc0VkaXRpbmciLCJpc19lZGl0aW5nIiwiaXNTaG93RGVzY3JpcHRpb24iLCJnZXRBcHByb3ZlU3RhdHVzSWNvbiIsImFwcHJvdmVKdWRnZSIsImF1dG9TdWJtaXR0ZWQiLCJhcHByb3ZlU3RhdHVzSWNvbiIsImdldEFwcHJvdmVTdGF0dXNUZXh0IiwiYXBwcm92ZVN0YXR1c1RleHQiLCJnZXRBcHByb3ZlSnVkZ2VDbGFzcyIsImlzRm9yd2FyZCIsInNob3dGb3J3YXJkRGVsZXRlQnV0dG9uIiwiZm9yd2FyZF9pbnN0YW5jZSIsImlzRGlzdHJpYnV0ZSIsInNob3dEaXN0cmlidXRlRGVsZXRlQnV0dG9uIiwiaGFzRmxvd0FkbWluUGVybWlzc2lvbiIsImZpbmlzaERhdGVTY2hlbWEiLCJpc0FuZHJvaWRPcklPUyIsImF1dG9mb3JtIiwib3B0aW9uYWwiLCJyZWFkb25seSIsImRhdGVUaW1lUGlja2VyT3B0aW9ucyIsImlnbm9yZVJlYWRvbmx5Iiwid2lkZ2V0UG9zaXRpb25pbmciLCJob3Jpem9udGFsIiwiZmluaXNoRGF0ZVZhbHVlcyIsInNob3dUcmFjZXNWaWV3Iiwic2hvd19tb2RhbF90cmFjZXNfbGlzdCIsInNwYWNlX3NldHRpbmdzIiwiZ2V0SW5zdGFuY2VTdGF0ZVRleHQiLCJpbnN0YW5jZV9pZCIsImdldEluc3RhbmNlU3RhdGVDb2xvciIsImNsYSIsImZpcnN0VHJhY2UiLCJsYXN0X2Rpc3RyaWJ1dGVfZnJvbSIsImRpc19pbmZvIiwiJGV4aXN0cyIsImNyZWF0ZWQiLCJjcmVhdGVkX2J5IiwiVVVmbG93X2FwaSIsImdldE5hbWVGb3JVc2VyIiwidXNlcnMiLCJmcm9tX3VzZXJfbmFtZSIsImlzQ0NPckRpc3RyaWJ1dGVPckZvcndhcmRUZXJtaW5hdGVkIiwianVkZ2VUZXJtaW5hdGVkIiwiaW5zdGFuY2VFeGlzdHMiLCJhZ2VudERlc2NyaXB0aW9uIiwidXNlck5hbWUiLCJ0cmFjZU5hbWUiLCJ0cmFjZUlkIiwiaGFuZGxlckRvYyIsImhhbmRsZXJJZCIsInVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8iLCJnZXRDb250YWN0SW5mb0ZvclVzZXIiLCJzdG9wUHJvcGFnYXRpb24iLCJjYWxsaW5nIiwiZXJyIiwicmVtb3ZlQ2xhc3MiLCJzdWNjZXNzIiwiYWxsb3dNdWx0aXBsZSIsImNsb3Nlc3QiLCJ0YXJnZXRfdXNlcl9pZCIsIm9wZW5TYWZlT2JqZWN0VXJsIiwiZm9yd2FyZF9zcGFjZSIsImZvcndhcmRzcGFjZSIsImZvcndhcmRpbnN0YW5jZSIsIlRyYWNrZXIiLCJhZnRlckZsdXNoIiwib24iLCJzY3JvbGxUb3AiLCJmaW5pc2hfaW5wdXQiLCJvcGluaW9uX2lucHV0Iiwic2hvd1JlbGF0ZWRJbnN0YWNlcyIsInJlbGF0ZWRfaW5zdGFjZXMiLCJyZWxhdGVkX2luc3RhY2VfdXJsIiwiaXNDb3Jkb3ZhIiwic2hvd19kZWxldGUiLCJzaG93UmVsYXRlZFJlY29yZHMiLCJyZWxhdGVkUmVjb3JkVXJsIiwib2JqY2V0TmFtZSIsImlkcyIsInByb2Nlc3MiLCJlbnYiLCJDUkVBVE9SX05PREVfRU5WIiwiSnNvblJvdXRlcyIsImFkZCIsInJlcSIsIm5leHQiLCJoYXNoRGF0YSIsImFjdGlvbiIsInRvX3VzZXJzIiwic2VuZFJlc3VsdCIsInN0YWNrIiwiZXJyb3JzIiwiZXJyb3JNZXNzYWdlIiwibWVzc2FnZSIsIndvcmtmbG93TWV0aG9kcyIsIm1ldGhvZHMiLCJzZXRfaW5zdGFuY2Vfc3RlcF9hcHByb3ZlIiwiaW5zX2lkIiwic3RlcF9hcHByb3ZlIiwic3RlcHNBcHByb3Zlc09wdGlvbnMiLCJhcHBseSIsInNldF9pbnN0YW5jZV9za2lwX3N0ZXBzIiwiZ2V0X2luc3RhbmNlX2RhdGEiLCJmb3JtQ2FjaGVkIiwiZmxvd0NhY2hlZCIsImRyYWZ0X3NhdmVfaW5zdGFuY2UiLCJpbmJveF9zYXZlX2luc3RhbmNlIiwiY2NfZG8iLCJjY191c2VyX2lkcyIsImNjX3JlYWQiLCJjY19zdWJtaXQiLCJjY19yZW1vdmUiLCJiYXRjaF9jYW5jZWxfY2MiLCJhcHByb3ZlX2lkcyIsImNjX3NhdmUiLCJzcGFjZV9pZCIsImZsb3dfaWQiLCJoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQiLCJpc0ZvcndhcmRBdHRhY2htZW50cyIsInNlbGVjdGVkVXNlcnMiLCJhY3Rpb25fdHlwZSIsInJlbGF0ZWQiLCJmcm9tX2FwcHJvdmVfaWQiLCJmb3J3YXJkX3JlbW92ZSIsInRyYWNlX2lkIiwiYXBwcm92ZV9pZCIsImNhbmNlbERpc3RyaWJ1dGUiLCJjZnNfaW5zdGFuY2VzX3JlbW92ZSIsImZpbGVfaWQiLCJjZnNfaW5zdGFuY2VzX3NldF9jdXJyZW50IiwiY2ZzX2luc3RhbmNlc19sb2NrIiwidXNlcl9pZCIsImNmc19pbnN0YW5jZXNfdW5sb2NrIiwiZG93bmxvYWRfc3BhY2VfaW5zdGFuY2VfYXR0YWNobWVudHNfdG9fZGlzayIsInNwYWNlSWQiLCJjZnNSZWNvcmRJZHMiLCJzZXRfYXBwcm92ZV9oYXZlX3JlYWQiLCJjaGFuZ2VfYXBwcm92ZV9pbmZvIiwidXBkYXRlX2FwcHJvdmVfc2lnbiIsInNpZ25fdHlwZSIsImxhc3RTaWduQXBwcm92ZSIsInVwZGF0ZV9zaWduX3Nob3ciLCJvYmpzIiwibXlBcHByb3ZlX2lkIiwiaW5zdGFuY2VfcmV0dXJuIiwiaW5zdGFuY2VfcmVtaW5kIiwicmVtaW5kX3VzZXJzIiwicmVtaW5kX2NvdW50IiwicmVtaW5kX2RlYWRsaW5lIiwiYWN0aW9uX3R5cGVzIiwibmV4dF9zdGVwX3VzZXJzX25vdF9mb3VuZCIsImRlYWxfdHlwZSIsInBhcmFtcyIsIl9ldmFsIiwiY2hlY2tfbWFpbl9hdHRhY2giLCJyZW1vdmVfcmVsYXRlZCIsInJlX2luc19pZCIsInVwZGF0ZV9pbnN0YW5jZV9yZWxhdGVkIiwidXBkYXRlRmxvd1Bvc2l0aW9uIiwidXBkYXRlRmxvd1JvbGUiLCJzdGFydF9mbG93IiwiZmxvd0lkIiwiZ2V0X2luc3RhbmNlX3RyYWNlcyIsImNhdGVnb3J5SWQiLCJmbG93SWRzIiwiZ2V0X2JhdGNoX2luc3RhbmNlcyIsImdldF9iYXRjaF9pbnN0YW5jZXNfY291bnQiLCJnZXRfbXlfYXBwcm92ZXMiLCJjaGFuZ2VfZmxvd19zdGF0ZSIsImhpZGVfaW5zdGFuY2UiLCJpbnNJZCIsImlzX2hpZGRlbiIsImdldEluc3RhbmNlVmFsdWVzIiwiQ29va2llcyIsImdldEluc3RhbmNlUmVhZE9ubHkiLCJfaGFzUGVybWlzc2lvbiIsIl9sb2NhbGUiLCJfcGFyZW50X2luc3RhbmNlcyIsImRhdGFCdWYiLCJoaWRlX3RyYWNlcyIsInNwYWNlVXNlckNvdW50IiwiZ2V0QVBJTG9naW5Vc2VyIiwiYWNjZXNzX3Rva2VuIiwiZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuIiwic3BhY2VzIiwic3BhY2VfdXNlcnMiLCJoYXNJbnN0YW5jZVBlcm1pc3Npb25zIiwiX3BhcmVudF9pZCIsIl9wYXJlbnRfaW5zIiwiY2hhcnNldCIsIkJ1ZmZlciIsInNldEhlYWRlciIsInN0YXR1c0NvZGUiLCJyZXRfc3luY190b2tlbiIsInNwYWNlVXNlciIsInNwYWNlVXNlck9yZ2FuaXphdGlvbnMiLCJzeW5jX3Rva2VuIiwiQVBJQXV0aGVudGljYXRpb25DaGVjayIsImhlYWRlcnMiLCJpc1NwYWNlQWRtaW4iLCJvcmdhbml6YXRpb25zIiwiY2FuTW9uaXRvciIsImNhbkFkbWluIiwiJGd0IiwiJG5pbiIsImluYm94X3VlcnMiLCJjY191c2VycyIsIm91dGJveF91c2VycyIsInNraXAiLCJsaW1pdCIsImNvcGllcyIsImFsbENzcyIsIldlYkFwcCIsImdldFJlZnJlc2hhYmxlQXNzZXRzIiwiY3NzIiwicm9vdFVybCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsIlJPT1RfVVJMIiwiZW5kc1dpdGgiLCJoIiwiZyIsIm0iLCJrIiwiZ2V0RWFjaCIsInVuaXEiLCJtaXhpbiIsImRlc3QiLCJoYW5kZXJVc2VyT2JqZWN0Iiwib3JnYW5pemF0aW9uIiwiaHIiLCJzb3J0X25vIiwibW9iaWxlIiwid29ya19waG9uZSIsInBvc2l0aW9uIiwidXNlclJvbGVzIiwicm9sZXMiLCJoYW5kZXJPcmdPYmplY3QiLCJvcmciLCJpbml0X2Zvcm11bGFfdmFsdWVzIiwiYXV0b0Zvcm1Eb2MiLCJhcHByb3ZlciIsIl9fdmFsdWVzIiwidGFibGVGaWVsZHMiLCJ0YWJsZVZhbHVlcyIsImZvcm11bGFUYWJsZVZhbHVlcyIsIl9fdGFibGVWYWx1ZXMiLCJ0YWJsZWZpZWxkIiwiZ2V0Rm9ybXVsYVVzZXJPYmplY3RzIiwiZ2V0Rm9ybXVsYU9yZ09iamVjdHMiLCJnZXRGb3JtdWxhVXNlck9iamVjdCIsInB1Ymxpc2giLCJjaGVjayIsInJlYWR5IiwiY2F0ZWdvcmllcyIsImFwcCIsImZsb3dfcG9zaXRpb25zIiwicm9sZSIsInB1Ymxpc2hDb21wb3NpdGUiLCJ0YWJsZU5hbWUiLCJNYXRjaCIsIk9wdGlvbmFsIiwidW5ibG9jayIsImNoaWxkcmVuIiwiZmxvd19yb2xlcyIsImNyZWF0ZVRlbXBsYXRlRm9ybUFuZEZsb3ciLCJwZXJtcyIsImNvbXBhbnlfaWQiLCJkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzIiwiZGlzdHJpYnV0ZV90b19zZWxmIiwiZW5hYmxlX2FtaXNmb3JtIiwidmVyc2lvbklkIiwiaGFuZGxlIiwic2VsZiIsImxhdGVzdCIsIm9ic2VydmVDaGFuZ2VzIiwiY2hhbmdlZCIsImFkZGVkIiwib25TdG9wIiwic3RvcCIsImZsb3dfaWRzIiwiZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uIiwiYWxsb3dfc2VsZWN0X3N0ZXAiLCJhbWlzX3NjaGVtYSIsImdldE1pbmlJbnN0YW5jZSIsImdldE15YXBwcm92ZU1vZGlmaWVkIiwiaW5zdGFuY2VfZmllbGRzXzAiLCJtaW5pQXBwcm92ZUZpZWxkcyIsIm5lZWRDaGFuZ2UiLCJ0cmlnZ2VyQ2hhbmdlRmllbGRzIiwidHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlcyIsIm15QXBwcm92ZU1vZGlmaWVkcyIsIl9pbnN0YW5jZUlkIiwiX3RyYWNlIiwiY2hhbmdlRmllbGRzIiwiX2NoYW5nZSIsIl9yZXYiLCJfbXlfYXBwcm92ZV9tb2RpZmllZHMiLCJpc0VxdWFsIiwiZ2V0SW5zdGFuY2VUcmFjZXMiLCJfaW5zSWQiLCJpbmJveF91c2VycyIsImFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZSIsImxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUiLCJpbnN0YW5jZWlkIiwiZGF0YU1hcCIsIm9wZXJhdGlvbiIsInJhd0NvbGxlY3Rpb24iLCJhZ2dyZWdhdGUiLCJ0b0FycmF5IiwiZG9jIiwiaXNGdW5jdGlvbiIsIndyYXBBc3luYyIsImdldE15QXBwcm92ZSIsImdldE15TGFzdEZpbmlzaGVkQXBwcm92ZSIsImdldFN0ZXBDdXJyZW50TmFtZSIsIm5vdEZpbmlzaGVkVHJhY2VzIiwiYWdlbnQiLCJzdGVwQ3VycmVudE5hbWUiLCIkc2xpY2UiLCJteUxhc3RGaW5pc2hlZEFwcHJvdmUiLCJhZ2VudF91c2VyX25hbWUiLCJteV9maW5pc2hfZGF0ZSIsImlzX2NjIiwiY2NfY291bnQiLCJ0YWJ1bGFyTmFtZSIsImluc3RhbmNlX2lkcyIsInJlbGF0ZWRfaW5zdGFuY2VfaWRzIiwiX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUiLCJfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSIsIl9pdGVtcyIsIiRtYXRjaCIsIiRncm91cCIsIiRzdW0iLCJfY2hhbmdlRGF0YSIsIl9mbG93c0RhdGEiLCJfaW5pdCIsImRhdGFJdGVtIiwiZmxvd19pbnN0YW5jZSIsIm9ic2VydmUiLCJnZXRDb2xsZWN0aW9uIiwid29ya2Zsb3dUZW1wbGF0ZSIsInN0YXJ0dXAiLCJhYnNvbHV0ZV9wYXRoX2NuIiwiYWJzb2x1dGVfcGF0aF91cyIsImZpbGVzTGlzdF9jbiIsImZpbGVzTGlzdF91cyIsImZzIiwibWltZSIsInBhdGhfY24iLCJwYXRoX3VzIiwicmVhZEZpbGVMaXN0IiwicGF0aERpciIsImZpbGVzTGlzdCIsInJlYWRkaXJTeW5jIiwic3RhdCIsInN0YXRTeW5jIiwiaXNEaXJlY3RvcnkiLCJ3b3JrZmxvd1RlbXBsYXRlcyIsInJlc29sdmUiLCJleGlzdHNTeW5jIiwiZmlsZSIsInJlYWRGaWxlU3luYyIsImdvX25leHQiLCJydWxlIiwic2NoZWR1bGUiLCJjcm9uIiwiYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uIiwic2NoZWR1bGVKb2IiLCJiaW5kRW52aXJvbm1lbnQiLCJ0aW1lIiwicHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzIiwidXBkYXRlIiwiZW5hYmxlZCIsImVuZF90aW1lIiwiJGx0ZSIsIiRzZXQiLCJtdWx0aSIsInRpbWVFbmQiLCJ0aW1lb3V0X2F1dG9fc3VibWl0IiwidGltZW91dEF1dG9TdWJtaXQiLCJUYWJ1bGFyVGFibGVzIiwicmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhciIsIlRhYnVsYXIiLCJUYWJsZSIsImNvbGxlY3Rpb24iLCJjb2x1bW5zIiwidGl0bGUiLCJvcmRlcmFibGUiLCJyZW5kZXIiLCJpbnB1dCIsInN0ZXBfY3VycmVudF9uYW1lIiwiY3VycmVudF9zdGVwX25hbWUiLCJkb20iLCJsZW5ndGhDaGFuZ2UiLCJleHRyYUZpZWxkcyIsInBhZ2VMZW5ndGgiLCJpbmZvIiwic2VhcmNoaW5nIiwicmVzcG9uc2l2ZSIsImRldGFpbHMiLCJhdXRvV2lkdGgiLCJjaGFuZ2VTZWxlY3RvciIsImN1clNwYWNlVXNlciIsIiRhbmQiLCJhZG1pbnMiLCJmbCIsImV4dGVuZCIsIkdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zIiwiX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zIiwiX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyIsIl9oYW5kbGVMaXN0RmllbGRzIiwiaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIiLCJpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyIiwibmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIiLCJ1cGRhdGVUYWJ1bGFyVGl0bGUiLCJzdWJzIiwiU3Vic01hbmFnZXIiLCJpbnNfZmllbGRzIiwicHViIiwib25VbmxvYWQiLCJpbnN0YW5jZV9saXN0IiwiX3RhYmxlQ29sdW1ucyIsImRyYXdDYWxsYmFjayIsImVsbGlwc2lzTGluayIsImVtcHR5VGQiLCJjb2xTcGFuIiwiaXNQYWQiLCJwZXJmZWN0U2Nyb2xsYmFyIiwib0luc3RhbmNlIiwiYXR0ciIsImNsaWNrIiwiZ29QYWdlIiwiaGVpZ2h0IiwicGFnZXMiLCJjZWlsIiwiZm5SZWNvcmRzRGlzcGxheSIsIl9pRGlzcGxheUxlbmd0aCIsIkRhdGFUYWJsZSIsInBhZ2UiLCJkcmF3IiwiYmx1ciIsImN1cnJlbnRQYWdlIiwia2V5ZG93biIsImtleUNvZGUiLCJjcmVhdGVkUm93Iiwicm93IiwiZGF0YUluZGV4IiwiRmxvd1JvdXRlciIsInNldEF0dHJpYnV0ZSIsImFnZW50X3ZpZXciLCJjY192aWV3IiwiaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyIsIm1vZGlmaWVkRnJvbU5vdyIsIm1vZGlmaWVkU3RyaW5nIiwicHJpb3JpdHlJY29uIiwicHJpb3JpdHlJY29uQ2xhc3MiLCJwcmlvcml0eVZhbHVlIiwic3RlcF9jdXJyZW50X25hbWVfdmlldyIsInVucmVhZCIsIm1vbWVudFJlYWN0aXZlRnJvbU5vdyIsInByaW9yaXR5IiwidmlzaWJsZSIsImNjX3RhZyIsInJlY29yZF9uZWVkIiwibGVuZ3RoTWVudSIsInNwYWNlX3VzZXIiLCJwYWdpbmdUeXBlIiwiaXNfbGlzdF9kaXNwbGF5IiwiaW5ib3hfaW5zdGFuY2VzIiwib3V0Ym94X2luc3RhbmNlcyIsImdldFNvcnQiLCJmbG93SW5zdGFuY2VzIiwiUmVhY3RpdmVWYXIiLCJfY2hhbmdlT3JkZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJQSxnQkFBSjtBQUFxQkMsTUFBTSxDQUFDQyxJQUFQLENBQVksb0NBQVosRUFBaUQ7QUFBQ0Ysa0JBQWdCLENBQUNHLENBQUQsRUFBRztBQUFDSCxvQkFBZ0IsR0FBQ0csQ0FBakI7QUFBbUI7O0FBQXhDLENBQWpELEVBQTJGLENBQTNGO0FBQ3JCSCxnQkFBZ0IsQ0FBQztBQUNoQixtQkFBaUIsUUFERDtBQUVoQixZQUFVO0FBRk0sQ0FBRCxFQUdiLGtCQUhhLENBQWhCLEM7Ozs7Ozs7Ozs7OztBQ0RBOzs7Ozs7Ozs7Ozs7O0FBYUMsYUFBVUksSUFBVixFQUFnQkMsT0FBaEIsRUFBeUI7QUFDekIsaUJBRHlCLENBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsUUFBSSxPQUFPQyxNQUFQLEtBQWtCLFVBQWxCLElBQWdDQSxNQUFNLENBQUNDLEdBQTNDLEVBQWdEO0FBQy9DO0FBQ0FELFlBQU0sQ0FBQyxDQUFDLFlBQUQsRUFBZSxRQUFmLEVBQXlCLHNCQUF6QixDQUFELEVBQW1ERCxPQUFuRCxDQUFOO0FBQ0EsS0FIRCxNQUdPO0FBQ047QUFDQUQsVUFBSSxDQUFDSSxHQUFMLEdBQVdILE9BQU8sQ0FBQ0QsSUFBSSxDQUFDSyxRQUFOLEVBQWdCTCxJQUFJLENBQUNNLElBQXJCLEVBQTJCTixJQUFJLENBQUNPLGtCQUFoQyxFQUFvRFAsSUFBcEQsQ0FBbEI7QUFDQTtBQUNELEdB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QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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SyxPQUFaLEtBQXdCLElBQXhCLEdBQStCUyxLRGpHOEMzTCxNQ2lHN0UsR0RqRzZFLE1BQTlGLEdBQThGLE1BQTlGO0FBQ0EsYUFBT0EsTUFBUDtBQUxEO0FBQUEsR0FERDtBQzBHQSxDIiwiZmlsZSI6Ii9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2hlY2tOcG1WZXJzaW9ucyB9IGZyb20gJ21ldGVvci90bWVhc2RheTpjaGVjay1ucG0tdmVyc2lvbnMnO1xuY2hlY2tOcG1WZXJzaW9ucyh7XG5cdFwibm9kZS1zY2hlZHVsZVwiOiBcIl4xLjMuMVwiLFxuXHRcInhtbDJqc1wiOiBcIl4wLjQuMTlcIixcbn0sICdzdGVlZG9zOndvcmtmbG93Jyk7IiwiLyohXG4gKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzXG4gKlxuICogVmVyc2lvbjogMS4xNy4wXG4gKlxuICogQXV0aG9yOiBSb2RuZXkgUmVobVxuICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvXG4gKlxuICogTGljZW5zZWQgdW5kZXJcbiAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICogICBHUEwgdjMgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0dQTC0zLjBcbiAqXG4gKi9cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHQndXNlIHN0cmljdCc7XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvcmV0dXJuRXhwb3J0cy5qc1xuXHQvLyBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdC8vICAgLy8gTm9kZVxuXHQvLyAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuL3B1bnljb2RlJyksIHJlcXVpcmUoJy4vSVB2NicpLCByZXF1aXJlKCcuL1NlY29uZExldmVsRG9tYWlucycpKTtcblx0Ly8gfSBlbHNlXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKFsnLi9wdW55Y29kZScsICcuL0lQdjYnLCAnLi9TZWNvbmRMZXZlbERvbWFpbnMnXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcblx0XHRyb290LlVSSSA9IGZhY3Rvcnkocm9vdC5wdW55Y29kZSwgcm9vdC5JUHY2LCByb290LlNlY29uZExldmVsRG9tYWlucywgcm9vdCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKHB1bnljb2RlLCBJUHY2LCBTTEQsIHJvb3QpIHtcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmdsb2JhbCBsb2NhdGlvbiwgZXNjYXBlLCB1bmVzY2FwZSAqL1xuXHQvLyBGSVhNRTogdjIuMC4wIHJlbmFtY2Ugbm9uLWNhbWVsQ2FzZSBwcm9wZXJ0aWVzIHRvIHVwcGVyY2FzZVxuXHQvKmpzaGludCBjYW1lbGNhc2U6IGZhbHNlICovXG5cblx0Ly8gc2F2ZSBjdXJyZW50IFVSSSB2YXJpYWJsZSwgaWYgYW55XG5cdHZhciBfVVJJID0gcm9vdCAmJiByb290LlVSSTtcblxuXHRmdW5jdGlvbiBVUkkodXJsLCBiYXNlKSB7XG5cdFx0dmFyIF91cmxTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMTtcblx0XHR2YXIgX2Jhc2VTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjtcblxuXHRcdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRcdGlmICghKHRoaXMgaW5zdGFuY2VvZiBVUkkpKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdGlmIChfYmFzZVN1cHBsaWVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBVUkkodXJsLCBiYXNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgVVJJKHVybCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgVVJJKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgVVJJJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHVybCA9IGxvY2F0aW9uLmhyZWYgKyAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHVybCA9ICcnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaHJlZih1cmwpO1xuXG5cdFx0Ly8gcmVzb2x2ZSB0byBiYXNlIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbnN0cnVjdG9yXG5cdFx0aWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYWJzb2x1dGVUbyhiYXNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdFVSSS52ZXJzaW9uID0gJzEuMTcuMCc7XG5cblx0dmFyIHAgPSBVUkkucHJvdG90eXBlO1xuXHR2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBlc2NhcGVSZWdFeChzdHJpbmcpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9jb21taXQvODVhYzIxNzgzYzExZjhjY2FiMDYxMDZkYmE5NzM1YTMxYTg2OTI0ZCNjb21taXRjb21tZW50LTgyMTk2M1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXF1cXC9cXFxcXSkvZywgJ1xcXFwkMScpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VHlwZSh2YWx1ZSkge1xuXHRcdC8vIElFOCBkb2Vzbid0IHJldHVybiBbT2JqZWN0IFVuZGVmaW5lZF0gYnV0IFtPYmplY3QgT2JqZWN0XSBmb3IgdW5kZWZpbmVkIHZhbHVlXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnVW5kZWZpbmVkJztcblx0XHR9XG5cblx0XHRyZXR1cm4gU3RyaW5nKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpLnNsaWNlKDgsIC0xKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG5cdFx0cmV0dXJuIGdldFR5cGUob2JqKSA9PT0gJ0FycmF5Jztcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbHRlckFycmF5VmFsdWVzKGRhdGEsIHZhbHVlKSB7XG5cdFx0dmFyIGxvb2t1cCA9IHt9O1xuXHRcdHZhciBpLCBsZW5ndGg7XG5cblx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRsb29rdXAgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGxvb2t1cFt2YWx1ZVtpXV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb29rdXBbdmFsdWVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogdHJ1ZSAqL1xuXHRcdFx0dmFyIF9tYXRjaCA9IGxvb2t1cCAmJiBsb29rdXBbZGF0YVtpXV0gIT09IHVuZGVmaW5lZFxuXHRcdFx0XHR8fCAhbG9va3VwICYmIHZhbHVlLnRlc3QoZGF0YVtpXSk7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogZmFsc2UgKi9cblx0XHRcdGlmIChfbWF0Y2gpIHtcblx0XHRcdFx0ZGF0YS5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGxlbmd0aC0tO1xuXHRcdFx0XHRpLS07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBhcnJheUNvbnRhaW5zKGxpc3QsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aDtcblxuXHRcdC8vIHZhbHVlIG1heSBiZSBzdHJpbmcsIG51bWJlciwgYXJyYXksIHJlZ2V4cFxuXHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Ly8gTm90ZTogdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRvIE8obikgKGluc3RlYWQgb2YgY3VycmVudCBPKG0gKiBuKSlcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICghYXJyYXlDb250YWlucyhsaXN0LCB2YWx1ZVtpXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIF90eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKF90eXBlID09PSAnUmVnRXhwJykge1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RbaV0gPT09ICdzdHJpbmcnICYmIGxpc3RbaV0ubWF0Y2godmFsdWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobGlzdFtpXSA9PT0gdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJyYXlzRXF1YWwob25lLCB0d28pIHtcblx0XHRpZiAoIWlzQXJyYXkob25lKSB8fCAhaXNBcnJheSh0d28pKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gYXJyYXlzIGNhbid0IGJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50IG9mIGNvbnRlbnRcblx0XHRpZiAob25lLmxlbmd0aCAhPT0gdHdvLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdG9uZS5zb3J0KCk7XG5cdFx0dHdvLnNvcnQoKTtcblxuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gb25lLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0aWYgKG9uZVtpXSAhPT0gdHdvW2ldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRyaW1TbGFzaGVzKHRleHQpIHtcblx0XHR2YXIgdHJpbV9leHByZXNzaW9uID0gL15cXC8rfFxcLyskL2c7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSh0cmltX2V4cHJlc3Npb24sICcnKTtcblx0fVxuXG5cdFVSSS5fcGFydHMgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvdG9jb2w6IG51bGwsXG5cdFx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdFx0aG9zdG5hbWU6IG51bGwsXG5cdFx0XHR1cm46IG51bGwsXG5cdFx0XHRwb3J0OiBudWxsLFxuXHRcdFx0cGF0aDogbnVsbCxcblx0XHRcdHF1ZXJ5OiBudWxsLFxuXHRcdFx0ZnJhZ21lbnQ6IG51bGwsXG5cdFx0XHQvLyBzdGF0ZVxuXHRcdFx0ZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzOiBVUkkuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLFxuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZTogVVJJLmVzY2FwZVF1ZXJ5U3BhY2Vcblx0XHR9O1xuXHR9O1xuXHQvLyBzdGF0ZTogYWxsb3cgZHVwbGljYXRlIHF1ZXJ5IHBhcmFtZXRlcnMgKGE9MSZhPTEpXG5cdFVSSS5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMgPSBmYWxzZTtcblx0Ly8gc3RhdGU6IHJlcGxhY2VzICsgd2l0aCAlMjAgKHNwYWNlIGluIHF1ZXJ5IHN0cmluZ3MpXG5cdFVSSS5lc2NhcGVRdWVyeVNwYWNlID0gdHJ1ZTtcblx0Ly8gc3RhdGljIHByb3BlcnRpZXNcblx0VVJJLnByb3RvY29sX2V4cHJlc3Npb24gPSAvXlthLXpdW2EtejAtOS4rLV0qJC9pO1xuXHRVUkkuaWRuX2V4cHJlc3Npb24gPSAvW15hLXowLTlcXC4tXS9pO1xuXHRVUkkucHVueWNvZGVfZXhwcmVzc2lvbiA9IC8oeG4tLSkvaTtcblx0Ly8gd2VsbCwgMzMzLjQ0NC41NTUuNjY2IG1hdGNoZXMsIGJ1dCBpdCBzdXJlIGFpbid0IG5vIElQdjQgLSBkbyB3ZSBjYXJlP1xuXHRVUkkuaXA0X2V4cHJlc3Npb24gPSAvXlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9JC87XG5cdC8vIGNyZWRpdHMgdG8gUmljaCBCcm93blxuXHQvLyBzb3VyY2U6IGh0dHA6Ly9mb3J1bXMuaW50ZXJtYXBwZXIuY29tL3ZpZXd0b3BpYy5waHA/cD0xMDk2IzEwOTZcblx0Ly8gc3BlY2lmaWNhdGlvbjogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDI5MS50eHRcblx0VVJJLmlwNl9leHByZXNzaW9uID0gL15cXHMqKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsxfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKCUuKyk/XFxzKiQvO1xuXHQvLyBleHByZXNzaW9uIHVzZWQgaXMgXCJncnViZXIgcmV2aXNlZFwiIChAZ3J1YmVyIHYyKSBkZXRlcm1pbmVkIHRvIGJlIHRoZVxuXHQvLyBiZXN0IHNvbHV0aW9uIGluIGEgcmVnZXgtZ29sZiB3ZSBkaWQgYSBjb3VwbGUgb2YgYWdlcyBhZ28gYXRcblx0Ly8gKiBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9kZW1vL3VybC1yZWdleFxuXHQvLyAqIGh0dHA6Ly9yb2RuZXlyZWhtLmRlL3QvdXJsLXJlZ2V4Lmh0bWxcblx0VVJJLmZpbmRfdXJpX2V4cHJlc3Npb24gPSAvXFxiKCg/OlthLXpdW1xcdy1dKzooPzpcXC97MSwzfXxbYS16MC05JV0pfHd3d1xcZHswLDN9Wy5dfFthLXowLTkuXFwtXStbLl1bYS16XXsyLDR9XFwvKSg/OlteXFxzKCk8Pl0rfFxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCkpKyg/OlxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCl8W15cXHNgISgpXFxbXFxde307OidcIi4sPD4/wqvCu+KAnOKAneKAmOKAmV0pKS9pZztcblx0VVJJLmZpbmRVcmkgPSB7XG5cdFx0Ly8gdmFsaWQgXCJzY2hlbWU6Ly9cIiBvciBcInd3dy5cIlxuXHRcdHN0YXJ0OiAvXFxiKD86KFthLXpdW2EtejAtOS4rLV0qOlxcL1xcLyl8d3d3XFwuKS9naSxcblx0XHQvLyBldmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IHdoaXRlc3BhY2Vcblx0XHRlbmQ6IC9bXFxzXFxyXFxuXXwkLyxcblx0XHQvLyB0cmltIHRyYWlsaW5nIHB1bmN0dWF0aW9uIGNhcHR1cmVkIGJ5IGVuZCBSZWdFeHBcblx0XHR0cmltOiAvW2AhKClcXFtcXF17fTs6J1wiLiw8Pj/Cq8K74oCc4oCd4oCe4oCY4oCZXSskL1xuXHR9O1xuXHQvLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3VyaS1zY2hlbWVzLmh0bWxcblx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1RDUF9hbmRfVURQX3BvcnRfbnVtYmVycyNXZWxsLWtub3duX3BvcnRzXG5cdFVSSS5kZWZhdWx0UG9ydHMgPSB7XG5cdFx0aHR0cDogJzgwJyxcblx0XHRodHRwczogJzQ0MycsXG5cdFx0ZnRwOiAnMjEnLFxuXHRcdGdvcGhlcjogJzcwJyxcblx0XHR3czogJzgwJyxcblx0XHR3c3M6ICc0NDMnXG5cdH07XG5cdC8vIGFsbG93ZWQgaG9zdG5hbWUgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0Ly8gQUxQSEEgRElHSVQgXCItXCIgXCIuXCIgXCJfXCIgXCJ+XCIgXCIhXCIgXCIkXCIgXCImXCIgXCInXCIgXCIoXCIgXCIpXCIgXCIqXCIgXCIrXCIgXCIsXCIgXCI7XCIgXCI9XCIgJWVuY29kZWRcblx0Ly8gSSd2ZSBuZXZlciBzZWVuIGEgKG5vbi1JRE4pIGhvc3RuYW1lIG90aGVyIHRoYW46IEFMUEhBIERJR0lUIC4gLVxuXHRVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzID0gL1teYS16QS1aMC05XFwuLV0vO1xuXHQvLyBtYXAgRE9NIEVsZW1lbnRzIHRvIHRoZWlyIFVSSSBhdHRyaWJ1dGVcblx0VVJJLmRvbUF0dHJpYnV0ZXMgPSB7XG5cdFx0J2EnOiAnaHJlZicsXG5cdFx0J2Jsb2NrcXVvdGUnOiAnY2l0ZScsXG5cdFx0J2xpbmsnOiAnaHJlZicsXG5cdFx0J2Jhc2UnOiAnaHJlZicsXG5cdFx0J3NjcmlwdCc6ICdzcmMnLFxuXHRcdCdmb3JtJzogJ2FjdGlvbicsXG5cdFx0J2ltZyc6ICdzcmMnLFxuXHRcdCdhcmVhJzogJ2hyZWYnLFxuXHRcdCdpZnJhbWUnOiAnc3JjJyxcblx0XHQnZW1iZWQnOiAnc3JjJyxcblx0XHQnc291cmNlJzogJ3NyYycsXG5cdFx0J3RyYWNrJzogJ3NyYycsXG5cdFx0J2lucHV0JzogJ3NyYycsIC8vIGJ1dCBvbmx5IGlmIHR5cGU9XCJpbWFnZVwiXG5cdFx0J2F1ZGlvJzogJ3NyYycsXG5cdFx0J3ZpZGVvJzogJ3NyYydcblx0fTtcblx0VVJJLmdldERvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRpZiAoIW5vZGUgfHwgIW5vZGUubm9kZU5hbWUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdC8vIDxpbnB1dD4gc2hvdWxkIG9ubHkgZXhwb3NlIHNyYyBmb3IgdHlwZT1cImltYWdlXCJcblx0XHRpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgbm9kZS50eXBlICE9PSAnaW1hZ2UnKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBVUkkuZG9tQXR0cmlidXRlc1tub2RlTmFtZV07XG5cdH07XG5cblx0ZnVuY3Rpb24gZXNjYXBlRm9yRHVtYkZpcmVmb3gzNih2YWx1ZSkge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy85MVxuXHRcdHJldHVybiBlc2NhcGUodmFsdWUpO1xuXHR9XG5cblx0Ly8gZW5jb2RpbmcgLyBkZWNvZGluZyBhY2NvcmRpbmcgdG8gUkZDMzk4NlxuXHRmdW5jdGlvbiBzdHJpY3RFbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSB7XG5cdFx0Ly8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZW5jb2RlVVJJQ29tcG9uZW50XG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcpXG5cdFx0XHQucmVwbGFjZSgvWyEnKCkqXS9nLCBlc2NhcGVGb3JEdW1iRmlyZWZveDM2KVxuXHRcdFx0LnJlcGxhY2UoL1xcKi9nLCAnJTJBJyk7XG5cdH1cblx0VVJJLmVuY29kZSA9IHN0cmljdEVuY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmlzbzg4NTkgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0fTtcblx0VVJJLnVuaWNvZGUgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdH07XG5cdFVSSS5jaGFyYWN0ZXJzID0ge1xuXHRcdHBhdGhuYW1lOiB7XG5cdFx0XHRlbmNvZGU6IHtcblx0XHRcdFx0Ly8gUkZDMzk4NiAyLjE6IEZvciBjb25zaXN0ZW5jeSwgVVJJIHByb2R1Y2VycyBhbmQgbm9ybWFsaXplcnMgc2hvdWxkXG5cdFx0XHRcdC8vIHVzZSB1cHBlcmNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzIGZvciBhbGwgcGVyY2VudC1lbmNvZGluZ3MuXG5cdFx0XHRcdGV4cHJlc3Npb246IC8lKDI0fDI2fDJCfDJDfDNCfDNEfDNBfDQwKS9pZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Ly8gLS5ffiEnKCkqXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI2JzogJyYnLFxuXHRcdFx0XHRcdCclMkInOiAnKycsXG5cdFx0XHRcdFx0JyUyQyc6ICcsJyxcblx0XHRcdFx0XHQnJTNCJzogJzsnLFxuXHRcdFx0XHRcdCclM0QnOiAnPScsXG5cdFx0XHRcdFx0JyUzQSc6ICc6Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jXS9nLFxuXHRcdFx0XHRtYXA6IHtcblx0XHRcdFx0XHQnLyc6ICclMkYnLFxuXHRcdFx0XHRcdCc/JzogJyUzRicsXG5cdFx0XHRcdFx0JyMnOiAnJTIzJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZXNlcnZlZDoge1xuXHRcdFx0ZW5jb2RlOiB7XG5cdFx0XHRcdC8vIFJGQzM5ODYgMi4xOiBGb3IgY29uc2lzdGVuY3ksIFVSSSBwcm9kdWNlcnMgYW5kIG5vcm1hbGl6ZXJzIHNob3VsZFxuXHRcdFx0XHQvLyB1c2UgdXBwZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cyBmb3IgYWxsIHBlcmNlbnQtZW5jb2RpbmdzLlxuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyM3wyNHwyNnwyN3wyOHwyOXwyQXwyQnwyQ3wyRnwzQXwzQnwzRHwzRnw0MHw1Qnw1RCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdC8vIGdlbi1kZWxpbXNcblx0XHRcdFx0XHQnJTNBJzogJzonLFxuXHRcdFx0XHRcdCclMkYnOiAnLycsXG5cdFx0XHRcdFx0JyUzRic6ICc/Jyxcblx0XHRcdFx0XHQnJTIzJzogJyMnLFxuXHRcdFx0XHRcdCclNUInOiAnWycsXG5cdFx0XHRcdFx0JyU1RCc6ICddJyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnLFxuXHRcdFx0XHRcdC8vIHN1Yi1kZWxpbXNcblx0XHRcdFx0XHQnJTIxJzogJyEnLFxuXHRcdFx0XHRcdCclMjQnOiAnJCcsXG5cdFx0XHRcdFx0JyUyNic6ICcmJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR1cm5wYXRoOiB7XG5cdFx0XHQvLyBUaGUgY2hhcmFjdGVycyB1bmRlciBgZW5jb2RlYCBhcmUgdGhlIGNoYXJhY3RlcnMgY2FsbGVkIG91dCBieSBSRkMgMjE0MSBhcyBiZWluZyBhY2NlcHRhYmxlXG5cdFx0XHQvLyBmb3IgdXNhZ2UgaW4gYSBVUk4uIFJGQzIxNDEgYWxzbyBjYWxscyBvdXQgXCItXCIsIFwiLlwiLCBhbmQgXCJfXCIgYXMgYWNjZXB0YWJsZSBjaGFyYWN0ZXJzLCBidXRcblx0XHRcdC8vIHRoZXNlIGFyZW4ndCBlbmNvZGVkIGJ5IGVuY29kZVVSSUNvbXBvbmVudCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRoZW0gb3V0IGhlcmUuIEFsc29cblx0XHRcdC8vIG5vdGUgdGhhdCB0aGUgY29sb24gY2hhcmFjdGVyIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGUgZW5jb2RpbmcgbWFwOyB0aGlzIGlzIGJlY2F1c2UgVVJJLmpzXG5cdFx0XHQvLyBnaXZlcyB0aGUgY29sb25zIGluIFVSTnMgc2VtYW50aWMgbWVhbmluZyBhcyB0aGUgZGVsaW1pdGVycyBvZiBwYXRoIHNlZ2VtZW50cywgYW5kIHNvIGl0XG5cdFx0XHQvLyBzaG91bGQgbm90IGFwcGVhciB1bmVuY29kZWQgaW4gYSBzZWdtZW50IGl0c2VsZi5cblx0XHRcdC8vIFNlZSBhbHNvIHRoZSBub3RlIGFib3ZlIGFib3V0IFJGQzM5ODYgYW5kIGNhcGl0YWxhbGl6ZWQgaGV4IGRpZ2l0cy5cblx0XHRcdGVuY29kZToge1xuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyNHwyN3wyOHwyOXwyQXwyQnwyQ3wzQnwzRHw0MCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdCclMjEnOiAnIScsXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBUaGVzZSBjaGFyYWN0ZXJzIGFyZSB0aGUgY2hhcmFjdGVycyBjYWxsZWQgb3V0IGJ5IFJGQzIxNDEgYXMgXCJyZXNlcnZlZFwiIGNoYXJhY3RlcnMgdGhhdFxuXHRcdFx0Ly8gc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBhIFVSTiwgcGx1cyB0aGUgY29sb24gY2hhcmFjdGVyIChzZWUgbm90ZSBhYm92ZSkuXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jOl0vZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Jy8nOiAnJTJGJyxcblx0XHRcdFx0XHQnPyc6ICclM0YnLFxuXHRcdFx0XHRcdCcjJzogJyUyMycsXG5cdFx0XHRcdFx0JzonOiAnJTNBJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRVUkkuZW5jb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHR2YXIgZXNjYXBlZCA9IFVSSS5lbmNvZGUoc3RyaW5nICsgJycpO1xuXHRcdGlmIChlc2NhcGVRdWVyeVNwYWNlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVzY2FwZVF1ZXJ5U3BhY2UgPSBVUkkuZXNjYXBlUXVlcnlTcGFjZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXNjYXBlUXVlcnlTcGFjZSA/IGVzY2FwZWQucmVwbGFjZSgvJTIwL2csICcrJykgOiBlc2NhcGVkO1xuXHR9O1xuXHRVUkkuZGVjb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRzdHJpbmcgKz0gJyc7XG5cdFx0aWYgKGVzY2FwZVF1ZXJ5U3BhY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZSA9IFVSSS5lc2NhcGVRdWVyeVNwYWNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gVVJJLmRlY29kZShlc2NhcGVRdWVyeVNwYWNlID8gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTIwJykgOiBzdHJpbmcpO1xuXHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0Ly8gd2UncmUgbm90IGdvaW5nIHRvIG1lc3Mgd2l0aCB3ZWlyZCBlbmNvZGluZ3MsXG5cdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvODdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvOTJcblx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xuXHQvLyBnZW5lcmF0ZSBlbmNvZGUvZGVjb2RlIHBhdGggZnVuY3Rpb25zXG5cdHZhciBfcGFydHMgPSB7J2VuY29kZSc6J2VuY29kZScsICdkZWNvZGUnOidkZWNvZGUnfTtcblx0dmFyIF9wYXJ0O1xuXHR2YXIgZ2VuZXJhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uKF9ncm91cCwgX3BhcnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gVVJJW19wYXJ0XShzdHJpbmcgKyAnJykucmVwbGFjZShVUkkuY2hhcmFjdGVyc1tfZ3JvdXBdW19wYXJ0XS5leHByZXNzaW9uLCBmdW5jdGlvbihjKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFVSSS5jaGFyYWN0ZXJzW19ncm91cF1bX3BhcnRdLm1hcFtjXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIHdlJ3JlIG5vdCBnb2luZyB0byBtZXNzIHdpdGggd2VpcmQgZW5jb2RpbmdzLFxuXHRcdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy84N1xuXHRcdFx0XHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvaXNzdWVzLzkyXG5cdFx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHRmb3IgKF9wYXJ0IGluIF9wYXJ0cykge1xuXHRcdFVSSVtfcGFydCArICdQYXRoU2VnbWVudCddID0gZ2VuZXJhdGVBY2Nlc3NvcigncGF0aG5hbWUnLCBfcGFydHNbX3BhcnRdKTtcblx0XHRVUklbX3BhcnQgKyAnVXJuUGF0aFNlZ21lbnQnXSA9IGdlbmVyYXRlQWNjZXNzb3IoJ3VybnBhdGgnLCBfcGFydHNbX3BhcnRdKTtcblx0fVxuXG5cdHZhciBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbiA9IGZ1bmN0aW9uKF9zZXAsIF9jb2RpbmdGdW5jTmFtZSwgX2lubmVyQ29kaW5nRnVuY05hbWUpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHQvLyBXaHkgcGFzcyBpbiBuYW1lcyBvZiBmdW5jdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXM/IFRoZVxuXHRcdFx0Ly8gZGVmaW5pdGlvbnMgb2Ygc29tZSBmdW5jdGlvbnMgKGJ1dCBpbiBwYXJ0aWN1bGFyLCBVUkkuZGVjb2RlKSB3aWxsIG9jY2FzaW9uYWxseSBjaGFuZ2UgZHVlXG5cdFx0XHQvLyB0byBVUkkuanMgaGF2aW5nIElTTzg4NTkgYW5kIFVuaWNvZGUgbW9kZXMuIFBhc3NpbmcgaW4gdGhlIG5hbWUgYW5kIGdldHRpbmcgaXQgd2lsbCBlbnN1cmVcblx0XHRcdC8vIHRoYXQgdGhlIGZ1bmN0aW9ucyB3ZSB1c2UgaGVyZSBhcmUgXCJmcmVzaFwiLlxuXHRcdFx0dmFyIGFjdHVhbENvZGluZ0Z1bmM7XG5cdFx0XHRpZiAoIV9pbm5lckNvZGluZ0Z1bmNOYW1lKSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBVUklbX2NvZGluZ0Z1bmNOYW1lXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gVVJJW19jb2RpbmdGdW5jTmFtZV0oVVJJW19pbm5lckNvZGluZ0Z1bmNOYW1lXShzdHJpbmcpKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHNlZ21lbnRzID0gKHN0cmluZyArICcnKS5zcGxpdChfc2VwKTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNlZ21lbnRzW2ldID0gYWN0dWFsQ29kaW5nRnVuYyhzZWdtZW50c1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZWdtZW50cy5qb2luKF9zZXApO1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVGhpcyB0YWtlcyBwbGFjZSBvdXRzaWRlIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCwgZS5nLiwgZW5jb2RlVXJuUGF0aCBmdW5jdGlvbnMuXG5cdFVSSS5kZWNvZGVQYXRoID0gZ2VuZXJhdGVTZWdtZW50ZWRQYXRoRnVuY3Rpb24oJy8nLCAnZGVjb2RlUGF0aFNlZ21lbnQnKTtcblx0VVJJLmRlY29kZVVyblBhdGggPSBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbignOicsICdkZWNvZGVVcm5QYXRoU2VnbWVudCcpO1xuXHRVUkkucmVjb2RlUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCcvJywgJ2VuY29kZVBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXHRVUkkucmVjb2RlVXJuUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCc6JywgJ2VuY29kZVVyblBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXG5cdFVSSS5lbmNvZGVSZXNlcnZlZCA9IGdlbmVyYXRlQWNjZXNzb3IoJ3Jlc2VydmVkJywgJ2VuY29kZScpO1xuXG5cdFVSSS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHR2YXIgcG9zO1xuXHRcdGlmICghcGFydHMpIHtcblx0XHRcdHBhcnRzID0ge307XG5cdFx0fVxuXHRcdC8vIFtwcm90b2NvbFwiOi8vXCJbdXNlcm5hbWVbXCI6XCJwYXNzd29yZF1cIkBcIl1ob3N0bmFtZVtcIjpcInBvcnRdXCIvXCI/XVtwYXRoXVtcIj9cInF1ZXJ5c3RyaW5nXVtcIiNcImZyYWdtZW50XVxuXG5cdFx0Ly8gZXh0cmFjdCBmcmFnbWVudFxuXHRcdHBvcyA9IHN0cmluZy5pbmRleE9mKCcjJyk7XG5cdFx0aWYgKHBvcyA+IC0xKSB7XG5cdFx0XHQvLyBlc2NhcGluZz9cblx0XHRcdHBhcnRzLmZyYWdtZW50ID0gc3RyaW5nLnN1YnN0cmluZyhwb3MgKyAxKSB8fCBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpO1xuXHRcdH1cblxuXHRcdC8vIGV4dHJhY3QgcXVlcnlcblx0XHRwb3MgPSBzdHJpbmcuaW5kZXhPZignPycpO1xuXHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0Ly8gZXNjYXBpbmc/XG5cdFx0XHRwYXJ0cy5xdWVyeSA9IHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkgfHwgbnVsbDtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKTtcblx0XHR9XG5cblx0XHQvLyBleHRyYWN0IHByb3RvY29sXG5cdFx0aWYgKHN0cmluZy5zdWJzdHJpbmcoMCwgMikgPT09ICcvLycpIHtcblx0XHRcdC8vIHJlbGF0aXZlLXNjaGVtZVxuXHRcdFx0cGFydHMucHJvdG9jb2wgPSBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygyKTtcblx0XHRcdC8vIGV4dHJhY3QgXCJ1c2VyOnBhc3NAaG9zdDpwb3J0XCJcblx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zID0gc3RyaW5nLmluZGV4T2YoJzonKTtcblx0XHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0XHRwYXJ0cy5wcm90b2NvbCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAocGFydHMucHJvdG9jb2wgJiYgIXBhcnRzLnByb3RvY29sLm1hdGNoKFVSSS5wcm90b2NvbF9leHByZXNzaW9uKSkge1xuXHRcdFx0XHRcdC8vIDogbWF5IGJlIHdpdGhpbiB0aGUgcGF0aFxuXHRcdFx0XHRcdHBhcnRzLnByb3RvY29sID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSwgcG9zICsgMykgPT09ICcvLycpIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDMpO1xuXG5cdFx0XHRcdFx0Ly8gZXh0cmFjdCBcInVzZXI6cGFzc0Bob3N0OnBvcnRcIlxuXHRcdFx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdFx0XHRcdHBhcnRzLnVybiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB3aGF0J3MgbGVmdCBtdXN0IGJlIHRoZSBwYXRoXG5cdFx0cGFydHMucGF0aCA9IHN0cmluZztcblxuXHRcdC8vIGFuZCB3ZSdyZSBkb25lXG5cdFx0cmV0dXJuIHBhcnRzO1xuXHR9O1xuXHRVUkkucGFyc2VIb3N0ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuXHRcdC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuXHRcdC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2Jsb2IvMzg2ZmQyNGY0OWIwZTlkMWE4YTA3NjU5MmE0MDQxNjhmYWVlY2MzNC9saWIvdXJsLmpzI0wxMTUtTDEyNFxuXHRcdC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvcHVsbC8yMzNcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG5cdFx0Ly8gZXh0cmFjdCBob3N0OnBvcnRcblx0XHR2YXIgcG9zID0gc3RyaW5nLmluZGV4T2YoJy8nKTtcblx0XHR2YXIgYnJhY2tldFBvcztcblx0XHR2YXIgdDtcblxuXHRcdGlmIChwb3MgPT09IC0xKSB7XG5cdFx0XHRwb3MgPSBzdHJpbmcubGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChzdHJpbmcuY2hhckF0KDApID09PSAnWycpIHtcblx0XHRcdC8vIElQdjYgaG9zdCAtIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtNm1hbi10ZXh0LWFkZHItcmVwcmVzZW50YXRpb24tMDQjc2VjdGlvbi02XG5cdFx0XHQvLyBJIGNsYWltIG1vc3QgY2xpZW50IHNvZnR3YXJlIGJyZWFrcyBvbiBJUHY2IGFueXdheXMuIFRvIHNpbXBsaWZ5IHRoaW5ncywgVVJJIG9ubHkgYWNjZXB0c1xuXHRcdFx0Ly8gSVB2Nitwb3J0IGluIHRoZSBmb3JtYXQgWzIwMDE6ZGI4OjoxXTo4MCAoZm9yIHRoZSB0aW1lIGJlaW5nKVxuXHRcdFx0YnJhY2tldFBvcyA9IHN0cmluZy5pbmRleE9mKCddJyk7XG5cdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHN0cmluZy5zdWJzdHJpbmcoMSwgYnJhY2tldFBvcykgfHwgbnVsbDtcblx0XHRcdHBhcnRzLnBvcnQgPSBzdHJpbmcuc3Vic3RyaW5nKGJyYWNrZXRQb3MgKyAyLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRpZiAocGFydHMucG9ydCA9PT0gJy8nKSB7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZmlyc3RDb2xvbiA9IHN0cmluZy5pbmRleE9mKCc6Jyk7XG5cdFx0XHR2YXIgZmlyc3RTbGFzaCA9IHN0cmluZy5pbmRleE9mKCcvJyk7XG5cdFx0XHR2YXIgbmV4dENvbG9uID0gc3RyaW5nLmluZGV4T2YoJzonLCBmaXJzdENvbG9uICsgMSk7XG5cdFx0XHRpZiAobmV4dENvbG9uICE9PSAtMSAmJiAoZmlyc3RTbGFzaCA9PT0gLTEgfHwgbmV4dENvbG9uIDwgZmlyc3RTbGFzaCkpIHtcblx0XHRcdFx0Ly8gSVB2NiBob3N0IGNvbnRhaW5zIG11bHRpcGxlIGNvbG9ucyAtIGJ1dCBubyBwb3J0XG5cdFx0XHRcdC8vIHRoaXMgbm90YXRpb24gaXMgYWN0dWFsbHkgbm90IGFsbG93ZWQgYnkgUkZDIDM5ODYsIGJ1dCB3ZSdyZSBhIGxpYmVyYWwgcGFyc2VyXG5cdFx0XHRcdHBhcnRzLmhvc3RuYW1lID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHRbMF0gfHwgbnVsbDtcblx0XHRcdFx0cGFydHMucG9ydCA9IHRbMV0gfHwgbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocGFydHMuaG9zdG5hbWUgJiYgc3RyaW5nLnN1YnN0cmluZyhwb3MpLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRwb3MrKztcblx0XHRcdHN0cmluZyA9ICcvJyArIHN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwb3MpIHx8ICcvJztcblx0fTtcblx0VVJJLnBhcnNlQXV0aG9yaXR5ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdHN0cmluZyA9IFVSSS5wYXJzZVVzZXJpbmZvKHN0cmluZywgcGFydHMpO1xuXHRcdHJldHVybiBVUkkucGFyc2VIb3N0KHN0cmluZywgcGFydHMpO1xuXHR9O1xuXHRVUkkucGFyc2VVc2VyaW5mbyA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHQvLyBleHRyYWN0IHVzZXJuYW1lOnBhc3N3b3JkXG5cdFx0dmFyIGZpcnN0U2xhc2ggPSBzdHJpbmcuaW5kZXhPZignLycpO1xuXHRcdHZhciBwb3MgPSBzdHJpbmcubGFzdEluZGV4T2YoJ0AnLCBmaXJzdFNsYXNoID4gLTEgPyBmaXJzdFNsYXNoIDogc3RyaW5nLmxlbmd0aCAtIDEpO1xuXHRcdHZhciB0O1xuXG5cdFx0Ly8gYXV0aG9yaXR5QCBtdXN0IGNvbWUgYmVmb3JlIC9wYXRoXG5cdFx0aWYgKHBvcyA+IC0xICYmIChmaXJzdFNsYXNoID09PSAtMSB8fCBwb3MgPCBmaXJzdFNsYXNoKSkge1xuXHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0cGFydHMudXNlcm5hbWUgPSB0WzBdID8gVVJJLmRlY29kZSh0WzBdKSA6IG51bGw7XG5cdFx0XHR0LnNoaWZ0KCk7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IHRbMF0gPyBVUkkuZGVjb2RlKHQuam9pbignOicpKSA6IG51bGw7XG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJ0cy51c2VybmFtZSA9IG51bGw7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblx0VVJJLnBhcnNlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdC8vIHRocm93IG91dCB0aGUgZnVua3kgYnVzaW5lc3MgLSBcIj9cIltuYW1lXCI9XCJ2YWx1ZVwiJlwiXStcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJisvZywgJyYnKS5yZXBsYWNlKC9eXFw/KiYqfCYrJC9nLCAnJyk7XG5cblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdHZhciBpdGVtcyA9IHt9O1xuXHRcdHZhciBzcGxpdHMgPSBzdHJpbmcuc3BsaXQoJyYnKTtcblx0XHR2YXIgbGVuZ3RoID0gc3BsaXRzLmxlbmd0aDtcblx0XHR2YXIgdiwgbmFtZSwgdmFsdWU7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2ID0gc3BsaXRzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHRuYW1lID0gVVJJLmRlY29kZVF1ZXJ5KHYuc2hpZnQoKSwgZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHQvLyBubyBcIj1cIiBpcyBudWxsIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHRcdHZhbHVlID0gdi5sZW5ndGggPyBVUkkuZGVjb2RlUXVlcnkodi5qb2luKCc9JyksIGVzY2FwZVF1ZXJ5U3BhY2UpIDogbnVsbDtcblxuXHRcdFx0aWYgKGhhc093bi5jYWxsKGl0ZW1zLCBuYW1lKSkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW1zW25hbWVdID09PSAnc3RyaW5nJyB8fCBpdGVtc1tuYW1lXSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGl0ZW1zW25hbWVdID0gW2l0ZW1zW25hbWVdXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1zW25hbWVdLnB1c2godmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXRlbXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbXM7XG5cdH07XG5cblx0VVJJLmJ1aWxkID0gZnVuY3Rpb24ocGFydHMpIHtcblx0XHR2YXIgdCA9ICcnO1xuXG5cdFx0aWYgKHBhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHBhcnRzLnByb3RvY29sICsgJzonO1xuXHRcdH1cblxuXHRcdGlmICghcGFydHMudXJuICYmICh0IHx8IHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnLy8nO1xuXHRcdH1cblxuXHRcdHQgKz0gKFVSSS5idWlsZEF1dGhvcml0eShwYXJ0cykgfHwgJycpO1xuXG5cdFx0aWYgKHR5cGVvZiBwYXJ0cy5wYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHBhcnRzLnBhdGguY2hhckF0KDApICE9PSAnLycgJiYgdHlwZW9mIHBhcnRzLmhvc3RuYW1lID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHR0ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0dCArPSBwYXJ0cy5wYXRoO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMucXVlcnkgPT09ICdzdHJpbmcnICYmIHBhcnRzLnF1ZXJ5KSB7XG5cdFx0XHR0ICs9ICc/JyArIHBhcnRzLnF1ZXJ5O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMuZnJhZ21lbnQgPT09ICdzdHJpbmcnICYmIHBhcnRzLmZyYWdtZW50KSB7XG5cdFx0XHR0ICs9ICcjJyArIHBhcnRzLmZyYWdtZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkSG9zdCA9IGZ1bmN0aW9uKHBhcnRzKSB7XG5cdFx0dmFyIHQgPSAnJztcblxuXHRcdGlmICghcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9IGVsc2UgaWYgKFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnWycgKyBwYXJ0cy5ob3N0bmFtZSArICddJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dCArPSBwYXJ0cy5ob3N0bmFtZTtcblx0XHR9XG5cblx0XHRpZiAocGFydHMucG9ydCkge1xuXHRcdFx0dCArPSAnOicgKyBwYXJ0cy5wb3J0O1xuXHRcdH1cblxuXHRcdHJldHVybiB0O1xuXHR9O1xuXHRVUkkuYnVpbGRBdXRob3JpdHkgPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHJldHVybiBVUkkuYnVpbGRVc2VyaW5mbyhwYXJ0cykgKyBVUkkuYnVpbGRIb3N0KHBhcnRzKTtcblx0fTtcblx0VVJJLmJ1aWxkVXNlcmluZm8gPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHZhciB0ID0gJyc7XG5cblx0XHRpZiAocGFydHMudXNlcm5hbWUpIHtcblx0XHRcdHQgKz0gVVJJLmVuY29kZShwYXJ0cy51c2VybmFtZSk7XG5cblx0XHRcdGlmIChwYXJ0cy5wYXNzd29yZCkge1xuXHRcdFx0XHR0ICs9ICc6JyArIFVSSS5lbmNvZGUocGFydHMucGFzc3dvcmQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0ICs9ICdAJztcblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBkdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHQvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiBvciBodHRwOi8vbGFicy5hcGFjaGUub3JnL3dlYmFyY2gvdXJpL3JmYy9yZmMzOTg2Lmh0bWxcblx0XHQvLyBiZWluZyDCuy0uX34hJCYnKCkqKyw7PTpALz/CqyAlSEVYIGFuZCBhbG51bSBhcmUgYWxsb3dlZFxuXHRcdC8vIHRoZSBSRkMgZXhwbGljaXRseSBzdGF0ZXMgPy9mb28gYmVpbmcgYSB2YWxpZCB1c2UgY2FzZSwgbm8gbWVudGlvbiBvZiBwYXJhbWV0ZXIgc3ludGF4IVxuXHRcdC8vIFVSSS5qcyB0cmVhdHMgdGhlIHF1ZXJ5IHN0cmluZyBhcyBiZWluZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2Zvcm0tY29udGVudC10eXBlXG5cblx0XHR2YXIgdCA9ICcnO1xuXHRcdHZhciB1bmlxdWUsIGtleSwgaSwgbGVuZ3RoO1xuXHRcdGZvciAoa2V5IGluIGRhdGEpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChkYXRhLCBrZXkpICYmIGtleSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheShkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0dW5pcXVlID0ge307XG5cdFx0XHRcdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gZGF0YVtrZXldLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YVtrZXldW2ldICE9PSB1bmRlZmluZWQgJiYgdW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHQgKz0gJyYnICsgVVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIoa2V5LCBkYXRhW2tleV1baV0sIGVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0ICs9ICcmJyArIFVSSS5idWlsZFF1ZXJ5UGFyYW1ldGVyKGtleSwgZGF0YVtrZXldLCBlc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0LnN1YnN0cmluZygxKTtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgZXNjYXBlUXVlcnlTcGFjZSkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNmb3JtLWNvbnRlbnQtdHlwZSAtLSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBkb24ndCBhcHBlbmQgXCI9XCIgZm9yIG51bGwgdmFsdWVzLCBhY2NvcmRpbmcgdG8gaHR0cDovL2R2Y3MudzMub3JnL2hnL3VybC9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbCN1cmwtcGFyYW1ldGVyLXNlcmlhbGl6YXRpb25cblx0XHRyZXR1cm4gVVJJLmVuY29kZVF1ZXJ5KG5hbWUsIGVzY2FwZVF1ZXJ5U3BhY2UpICsgKHZhbHVlICE9PSBudWxsID8gJz0nICsgVVJJLmVuY29kZVF1ZXJ5KHZhbHVlLCBlc2NhcGVRdWVyeVNwYWNlKSA6ICcnKTtcblx0fTtcblxuXHRVUkkuYWRkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBuYW1lLCB2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAoZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRhdGFbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGF0YVtuYW1lXSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IFtkYXRhW25hbWVdXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHR2YWx1ZSA9IFt2YWx1ZV07XG5cdFx0XHR9XG5cblx0XHRcdGRhdGFbbmFtZV0gPSAoZGF0YVtuYW1lXSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aCwga2V5O1xuXG5cdFx0aWYgKGlzQXJyYXkobmFtZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IG5hbWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0ZGF0YVtuYW1lW2ldXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGdldFR5cGUobmFtZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBkYXRhKSB7XG5cdFx0XHRcdGlmIChuYW1lLnRlc3Qoa2V5KSkge1xuXHRcdFx0XHRcdGRhdGFba2V5XSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLnJlbW92ZVF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pICYmIHZhbHVlLnRlc3QoZGF0YVtuYW1lXSkpIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSBmaWx0ZXJBcnJheVZhbHVlcyhkYXRhW25hbWVdLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFbbmFtZV0gPT09IFN0cmluZyh2YWx1ZSkgJiYgKCFpc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDEpKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IGZpbHRlckFycmF5VmFsdWVzKGRhdGFbbmFtZV0sIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLnJlbW92ZVF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZywgUmVnRXhwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5oYXNRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlLCB3aXRoaW5BcnJheSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0aWYgKCFVUkkuaGFzUXVlcnkoZGF0YSwga2V5LCBuYW1lW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdVUkkuaGFzUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlcicpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoZ2V0VHlwZSh2YWx1ZSkpIHtcblx0XHRcdGNhc2UgJ1VuZGVmaW5lZCc6XG5cdFx0XHRcdC8vIHRydWUgaWYgZXhpc3RzIChidXQgbWF5IGJlIGVtcHR5KVxuXHRcdFx0XHRyZXR1cm4gbmFtZSBpbiBkYXRhOyAvLyBkYXRhW25hbWVdICE9PSB1bmRlZmluZWQ7XG5cblx0XHRcdGNhc2UgJ0Jvb2xlYW4nOlxuXHRcdFx0XHQvLyB0cnVlIGlmIGV4aXN0cyBhbmQgbm9uLWVtcHR5XG5cdFx0XHRcdHZhciBfYm9vbHkgPSBCb29sZWFuKGlzQXJyYXkoZGF0YVtuYW1lXSkgPyBkYXRhW25hbWVdLmxlbmd0aCA6IGRhdGFbbmFtZV0pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IF9ib29seTtcblxuXHRcdFx0Y2FzZSAnRnVuY3Rpb24nOlxuXHRcdFx0XHQvLyBhbGxvdyBjb21wbGV4IGNvbXBhcmlzb25cblx0XHRcdFx0cmV0dXJuICEhdmFsdWUoZGF0YVtuYW1lXSwgbmFtZSwgZGF0YSk7XG5cblx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG9wID0gd2l0aGluQXJyYXkgPyBhcnJheUNvbnRhaW5zIDogYXJyYXlzRXF1YWw7XG5cdFx0XHRcdHJldHVybiBvcChkYXRhW25hbWVdLCB2YWx1ZSk7XG5cblx0XHRcdGNhc2UgJ1JlZ0V4cCc6XG5cdFx0XHRcdGlmICghaXNBcnJheShkYXRhW25hbWVdKSkge1xuXHRcdFx0XHRcdHJldHVybiBCb29sZWFuKGRhdGFbbmFtZV0gJiYgZGF0YVtuYW1lXS5tYXRjaCh2YWx1ZSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdFx0dmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnU3RyaW5nJzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGFbbmFtZV0gPT09IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmhhc1F1ZXJ5KCkgYWNjZXB0cyB1bmRlZmluZWQsIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyLCBSZWdFeHAsIEZ1bmN0aW9uIGFzIHRoZSB2YWx1ZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cblxuXHRVUkkuY29tbW9uUGF0aCA9IGZ1bmN0aW9uKG9uZSwgdHdvKSB7XG5cdFx0dmFyIGxlbmd0aCA9IE1hdGgubWluKG9uZS5sZW5ndGgsIHR3by5sZW5ndGgpO1xuXHRcdHZhciBwb3M7XG5cblx0XHQvLyBmaW5kIGZpcnN0IG5vbi1tYXRjaGluZyBjaGFyYWN0ZXJcblx0XHRmb3IgKHBvcyA9IDA7IHBvcyA8IGxlbmd0aDsgcG9zKyspIHtcblx0XHRcdGlmIChvbmUuY2hhckF0KHBvcykgIT09IHR3by5jaGFyQXQocG9zKSkge1xuXHRcdFx0XHRwb3MtLTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBvcyA8IDEpIHtcblx0XHRcdHJldHVybiBvbmUuY2hhckF0KDApID09PSB0d28uY2hhckF0KDApICYmIG9uZS5jaGFyQXQoMCkgPT09ICcvJyA/ICcvJyA6ICcnO1xuXHRcdH1cblxuXHRcdC8vIHJldmVydCB0byBsYXN0IC9cblx0XHRpZiAob25lLmNoYXJBdChwb3MpICE9PSAnLycgfHwgdHdvLmNoYXJBdChwb3MpICE9PSAnLycpIHtcblx0XHRcdHBvcyA9IG9uZS5zdWJzdHJpbmcoMCwgcG9zKS5sYXN0SW5kZXhPZignLycpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvbmUuc3Vic3RyaW5nKDAsIHBvcyArIDEpO1xuXHR9O1xuXG5cdFVSSS53aXRoaW5TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblx0XHR2YXIgX3N0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCBVUkkuZmluZFVyaS5zdGFydDtcblx0XHR2YXIgX2VuZCA9IG9wdGlvbnMuZW5kIHx8IFVSSS5maW5kVXJpLmVuZDtcblx0XHR2YXIgX3RyaW0gPSBvcHRpb25zLnRyaW0gfHwgVVJJLmZpbmRVcmkudHJpbTtcblx0XHR2YXIgX2F0dHJpYnV0ZU9wZW4gPSAvW2EtejAtOS1dPVtcIiddPyQvaTtcblxuXHRcdF9zdGFydC5sYXN0SW5kZXggPSAwO1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHR2YXIgbWF0Y2ggPSBfc3RhcnQuZXhlYyhzdHJpbmcpO1xuXHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN0YXJ0ID0gbWF0Y2guaW5kZXg7XG5cdFx0XHRpZiAob3B0aW9ucy5pZ25vcmVIdG1sKSB7XG5cdFx0XHRcdC8vIGF0dHJpYnV0KGU9W1wiJ10/JClcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZU9wZW4gPSBzdHJpbmcuc2xpY2UoTWF0aC5tYXgoc3RhcnQgLSAzLCAwKSwgc3RhcnQpO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlT3BlbiAmJiBfYXR0cmlidXRlT3Blbi50ZXN0KGF0dHJpYnV0ZU9wZW4pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGVuZCA9IHN0YXJ0ICsgc3RyaW5nLnNsaWNlKHN0YXJ0KS5zZWFyY2goX2VuZCk7XG5cdFx0XHR2YXIgc2xpY2UgPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGVuZCkucmVwbGFjZShfdHJpbSwgJycpO1xuXHRcdFx0aWYgKG9wdGlvbnMuaWdub3JlICYmIG9wdGlvbnMuaWdub3JlLnRlc3Qoc2xpY2UpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRlbmQgPSBzdGFydCArIHNsaWNlLmxlbmd0aDtcblx0XHRcdHZhciByZXN1bHQgPSBjYWxsYmFjayhzbGljZSwgc3RhcnQsIGVuZCwgc3RyaW5nKTtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zbGljZSgwLCBzdGFydCkgKyByZXN1bHQgKyBzdHJpbmcuc2xpY2UoZW5kKTtcblx0XHRcdF9zdGFydC5sYXN0SW5kZXggPSBzdGFydCArIHJlc3VsdC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0X3N0YXJ0Lmxhc3RJbmRleCA9IDA7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblxuXHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSA9IGZ1bmN0aW9uKHYpIHtcblx0XHQvLyBUaGVvcmV0aWNhbGx5IFVSSXMgYWxsb3cgcGVyY2VudC1lbmNvZGluZyBpbiBIb3N0bmFtZXMgKGFjY29yZGluZyB0byBSRkMgMzk4Nilcblx0XHQvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBETlMgYW5kIHRoZXJlZm9yZSBpZ25vcmVkIGJ5IFVSSS5qc1xuXG5cdFx0aWYgKHYubWF0Y2goVVJJLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycykpIHtcblx0XHRcdC8vIHRlc3QgcHVueWNvZGVcblx0XHRcdGlmICghcHVueWNvZGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXSBhbmQgUHVueWNvZGUuanMgaXMgbm90IGF2YWlsYWJsZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHVueWNvZGUudG9BU0NJSSh2KS5tYXRjaChVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIG5vQ29uZmxpY3Rcblx0VVJJLm5vQ29uZmxpY3QgPSBmdW5jdGlvbihyZW1vdmVBbGwpIHtcblx0XHRpZiAocmVtb3ZlQWxsKSB7XG5cdFx0XHR2YXIgdW5jb25mbGljdGVkID0ge1xuXHRcdFx0XHRVUkk6IHRoaXMubm9Db25mbGljdCgpXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocm9vdC5VUklUZW1wbGF0ZSAmJiB0eXBlb2Ygcm9vdC5VUklUZW1wbGF0ZS5ub0NvbmZsaWN0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHVuY29uZmxpY3RlZC5VUklUZW1wbGF0ZSA9IHJvb3QuVVJJVGVtcGxhdGUubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdC5JUHY2ICYmIHR5cGVvZiByb290LklQdjYubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuSVB2NiA9IHJvb3QuSVB2Ni5ub0NvbmZsaWN0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290LlNlY29uZExldmVsRG9tYWlucyAmJiB0eXBlb2Ygcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuU2Vjb25kTGV2ZWxEb21haW5zID0gcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5jb25mbGljdGVkO1xuXHRcdH0gZWxzZSBpZiAocm9vdC5VUkkgPT09IHRoaXMpIHtcblx0XHRcdHJvb3QuVVJJID0gX1VSSTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmJ1aWxkID0gZnVuY3Rpb24oZGVmZXJCdWlsZCkge1xuXHRcdGlmIChkZWZlckJ1aWxkID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChkZWZlckJ1aWxkID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZGVmZXJyZWRfYnVpbGQpIHtcblx0XHRcdHRoaXMuX3N0cmluZyA9IFVSSS5idWlsZCh0aGlzLl9wYXJ0cyk7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAuY2xvbmUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IFVSSSh0aGlzKTtcblx0fTtcblxuXHRwLnZhbHVlT2YgPSBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYnVpbGQoZmFsc2UpLl9zdHJpbmc7XG5cdH07XG5cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKF9wYXJ0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzW19wYXJ0XSB8fCAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzW19wYXJ0XSA9IHYgfHwgbnVsbDtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVQcmVmaXhBY2Nlc3NvcihfcGFydCwgX2tleSl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0c1tfcGFydF0gfHwgJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodiAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHYgPSB2ICsgJyc7XG5cdFx0XHRcdFx0aWYgKHYuY2hhckF0KDApID09PSBfa2V5KSB7XG5cdFx0XHRcdFx0XHR2ID0gdi5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fcGFydHNbX3BhcnRdID0gdjtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0cC5wcm90b2NvbCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3Byb3RvY29sJyk7XG5cdHAudXNlcm5hbWUgPSBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKCd1c2VybmFtZScpO1xuXHRwLnBhc3N3b3JkID0gZ2VuZXJhdGVTaW1wbGVBY2Nlc3NvcigncGFzc3dvcmQnKTtcblx0cC5ob3N0bmFtZSA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ2hvc3RuYW1lJyk7XG5cdHAucG9ydCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3BvcnQnKTtcblx0cC5xdWVyeSA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ3F1ZXJ5JywgJz8nKTtcblx0cC5mcmFnbWVudCA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ2ZyYWdtZW50JywgJyMnKTtcblxuXHRwLnNlYXJjaCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0dmFyIHQgPSB0aGlzLnF1ZXJ5KHYsIGJ1aWxkKTtcblx0XHRyZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIHQubGVuZ3RoID8gKCc/JyArIHQpIDogdDtcblx0fTtcblx0cC5oYXNoID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgdCA9IHRoaXMuZnJhZ21lbnQodiwgYnVpbGQpO1xuXHRcdHJldHVybiB0eXBlb2YgdCA9PT0gJ3N0cmluZycgJiYgdC5sZW5ndGggPyAoJyMnICsgdCkgOiB0O1xuXHR9O1xuXG5cdHAucGF0aG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGggfHwgKHRoaXMuX3BhcnRzLmhvc3RuYW1lID8gJy8nIDogJycpO1xuXHRcdFx0cmV0dXJuIHYgPyAodGhpcy5fcGFydHMudXJuID8gVVJJLmRlY29kZVVyblBhdGggOiBVUkkuZGVjb2RlUGF0aCkocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVVcm5QYXRoKHYpIDogJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVQYXRoKHYpIDogJy8nO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnBhdGggPSBwLnBhdGhuYW1lO1xuXHRwLmhyZWYgPSBmdW5jdGlvbihocmVmLCBidWlsZCkge1xuXHRcdHZhciBrZXk7XG5cblx0XHRpZiAoaHJlZiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3N0cmluZyA9ICcnO1xuXHRcdHRoaXMuX3BhcnRzID0gVVJJLl9wYXJ0cygpO1xuXG5cdFx0dmFyIF9VUkkgPSBocmVmIGluc3RhbmNlb2YgVVJJO1xuXHRcdHZhciBfb2JqZWN0ID0gdHlwZW9mIGhyZWYgPT09ICdvYmplY3QnICYmIChocmVmLmhvc3RuYW1lIHx8IGhyZWYucGF0aCB8fCBocmVmLnBhdGhuYW1lKTtcblx0XHRpZiAoaHJlZi5ub2RlTmFtZSkge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IFVSSS5nZXREb21BdHRyaWJ1dGUoaHJlZik7XG5cdFx0XHRocmVmID0gaHJlZlthdHRyaWJ1dGVdIHx8ICcnO1xuXHRcdFx0X29iamVjdCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIHdpbmRvdy5sb2NhdGlvbiBpcyByZXBvcnRlZCB0byBiZSBhbiBvYmplY3QsIGJ1dCBpdCdzIG5vdCB0aGUgc29ydFxuXHRcdC8vIG9mIG9iamVjdCB3ZSdyZSBsb29raW5nIGZvcjpcblx0XHQvLyAqIGxvY2F0aW9uLnByb3RvY29sIGVuZHMgd2l0aCBhIGNvbG9uXG5cdFx0Ly8gKiBsb2NhdGlvbi5xdWVyeSAhPSBvYmplY3Quc2VhcmNoXG5cdFx0Ly8gKiBsb2NhdGlvbi5oYXNoICE9IG9iamVjdC5mcmFnbWVudFxuXHRcdC8vIHNpbXBseSBzZXJpYWxpemluZyB0aGUgdW5rbm93biBvYmplY3Qgc2hvdWxkIGRvIHRoZSB0cmlja1xuXHRcdC8vIChmb3IgbG9jYXRpb24sIG5vdCBmb3IgZXZlcnl0aGluZy4uLilcblx0XHRpZiAoIV9VUkkgJiYgX29iamVjdCAmJiBocmVmLnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGhyZWYgPSBocmVmLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBocmVmID09PSAnc3RyaW5nJyB8fCBocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cyA9IFVSSS5wYXJzZShTdHJpbmcoaHJlZiksIHRoaXMuX3BhcnRzKTtcblx0XHR9IGVsc2UgaWYgKF9VUkkgfHwgX29iamVjdCkge1xuXHRcdFx0dmFyIHNyYyA9IF9VUkkgPyBocmVmLl9wYXJ0cyA6IGhyZWY7XG5cdFx0XHRmb3IgKGtleSBpbiBzcmMpIHtcblx0XHRcdFx0aWYgKGhhc093bi5jYWxsKHRoaXMuX3BhcnRzLCBrZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5fcGFydHNba2V5XSA9IHNyY1trZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaW5wdXQnKTtcblx0XHR9XG5cblx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0Ly8gaWRlbnRpZmljYXRpb24gYWNjZXNzb3JzXG5cdHAuaXMgPSBmdW5jdGlvbih3aGF0KSB7XG5cdFx0dmFyIGlwID0gZmFsc2U7XG5cdFx0dmFyIGlwNCA9IGZhbHNlO1xuXHRcdHZhciBpcDYgPSBmYWxzZTtcblx0XHR2YXIgbmFtZSA9IGZhbHNlO1xuXHRcdHZhciBzbGQgPSBmYWxzZTtcblx0XHR2YXIgaWRuID0gZmFsc2U7XG5cdFx0dmFyIHB1bnljb2RlID0gZmFsc2U7XG5cdFx0dmFyIHJlbGF0aXZlID0gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0cmVsYXRpdmUgPSBmYWxzZTtcblx0XHRcdGlwNCA9IFVSSS5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwNiA9IFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwID0gaXA0IHx8IGlwNjtcblx0XHRcdG5hbWUgPSAhaXA7XG5cdFx0XHRzbGQgPSBuYW1lICYmIFNMRCAmJiBTTEQuaGFzKHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlkbiA9IG5hbWUgJiYgVVJJLmlkbl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdFx0cHVueWNvZGUgPSBuYW1lICYmIFVSSS5wdW55Y29kZV9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAod2hhdC50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRjYXNlICdyZWxhdGl2ZSc6XG5cdFx0XHRcdHJldHVybiByZWxhdGl2ZTtcblxuXHRcdFx0Y2FzZSAnYWJzb2x1dGUnOlxuXHRcdFx0XHRyZXR1cm4gIXJlbGF0aXZlO1xuXG5cdFx0XHQvLyBob3N0bmFtZSBpZGVudGlmaWNhdGlvblxuXHRcdFx0Y2FzZSAnZG9tYWluJzpcblx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRyZXR1cm4gbmFtZTtcblxuXHRcdFx0Y2FzZSAnc2xkJzpcblx0XHRcdFx0cmV0dXJuIHNsZDtcblxuXHRcdFx0Y2FzZSAnaXAnOlxuXHRcdFx0XHRyZXR1cm4gaXA7XG5cblx0XHRcdGNhc2UgJ2lwNCc6XG5cdFx0XHRjYXNlICdpcHY0Jzpcblx0XHRcdGNhc2UgJ2luZXQ0Jzpcblx0XHRcdFx0cmV0dXJuIGlwNDtcblxuXHRcdFx0Y2FzZSAnaXA2Jzpcblx0XHRcdGNhc2UgJ2lwdjYnOlxuXHRcdFx0Y2FzZSAnaW5ldDYnOlxuXHRcdFx0XHRyZXR1cm4gaXA2O1xuXG5cdFx0XHRjYXNlICdpZG4nOlxuXHRcdFx0XHRyZXR1cm4gaWRuO1xuXG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0XHRyZXR1cm4gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdFx0Y2FzZSAndXJuJzpcblx0XHRcdFx0cmV0dXJuICEhdGhpcy5fcGFydHMudXJuO1xuXG5cdFx0XHRjYXNlICdwdW55Y29kZSc6XG5cdFx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHQvLyBjb21wb25lbnQgc3BlY2lmaWMgaW5wdXQgdmFsaWRhdGlvblxuXHR2YXIgX3Byb3RvY29sID0gcC5wcm90b2NvbDtcblx0dmFyIF9wb3J0ID0gcC5wb3J0O1xuXHR2YXIgX2hvc3RuYW1lID0gcC5ob3N0bmFtZTtcblxuXHRwLnByb3RvY29sID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHQvLyBhY2NlcHQgdHJhaWxpbmcgOi8vXG5cdFx0XHRcdHYgPSB2LnJlcGxhY2UoLzooXFwvXFwvKT8kLywgJycpO1xuXG5cdFx0XHRcdGlmICghdi5tYXRjaChVUkkucHJvdG9jb2xfZXhwcmVzc2lvbikpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm90b2NvbCBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2VzblxcJ3Qgc3RhcnQgd2l0aCBbQS1aXScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfcHJvdG9jb2wuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuc2NoZW1lID0gcC5wcm90b2NvbDtcblx0cC5wb3J0ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh2ID09PSAwKSB7XG5cdFx0XHRcdHYgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHR2ICs9ICcnO1xuXHRcdFx0XHRpZiAodi5jaGFyQXQoMCkgPT09ICc6Jykge1xuXHRcdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2Lm1hdGNoKC9bXjAtOV0vKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BvcnQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gWzAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX3BvcnQuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuaG9zdG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFyIHggPSB7fTtcblx0XHRcdHZhciByZXMgPSBVUkkucGFyc2VIb3N0KHYsIHgpO1xuXHRcdFx0aWYgKHJlcyAhPT0gJy8nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lIFwiJyArIHYgKyAnXCIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLV0nKTtcblx0XHRcdH1cblxuXHRcdFx0diA9IHguaG9zdG5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBfaG9zdG5hbWUuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cblx0Ly8gY29tcG91bmQgYWNjZXNzb3JzXG5cdHAub3JpZ2luID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2woKTtcblx0XHRcdHZhciBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eSgpO1xuXHRcdFx0aWYgKCFhdXRob3JpdHkpIHJldHVybiAnJztcblx0XHRcdHJldHVybiAocHJvdG9jb2wgPyBwcm90b2NvbCArICc6Ly8nIDogJycpICsgdGhpcy5hdXRob3JpdHkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG9yaWdpbiA9IFVSSSh2KTtcblx0XHRcdHRoaXNcblx0XHRcdFx0LnByb3RvY29sKG9yaWdpbi5wcm90b2NvbCgpKVxuXHRcdFx0XHQuYXV0aG9yaXR5KG9yaWdpbi5hdXRob3JpdHkoKSlcblx0XHRcdFx0LmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuaG9zdCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUgPyBVUkkuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKSA6ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgcmVzID0gVVJJLnBhcnNlSG9zdCh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuYXV0aG9yaXR5ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/IFVSSS5idWlsZEF1dGhvcml0eSh0aGlzLl9wYXJ0cykgOiAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJlcyA9IFVSSS5wYXJzZUF1dGhvcml0eSh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAudXNlcmluZm8gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy51c2VybmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciB0ID0gVVJJLmJ1aWxkVXNlcmluZm8odGhpcy5fcGFydHMpO1xuXHRcdFx0cmV0dXJuIHQuc3Vic3RyaW5nKDAsIHQubGVuZ3RoIC0xKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZbdi5sZW5ndGgtMV0gIT09ICdAJykge1xuXHRcdFx0XHR2ICs9ICdAJztcblx0XHRcdH1cblxuXHRcdFx0VVJJLnBhcnNlVXNlcmluZm8odiwgdGhpcy5fcGFydHMpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnJlc291cmNlID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXRoKCkgKyB0aGlzLnNlYXJjaCgpICsgdGhpcy5oYXNoKCk7XG5cdFx0fVxuXG5cdFx0cGFydHMgPSBVUkkucGFyc2Uodik7XG5cdFx0dGhpcy5fcGFydHMucGF0aCA9IHBhcnRzLnBhdGg7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBwYXJ0cy5xdWVyeTtcblx0XHR0aGlzLl9wYXJ0cy5mcmFnbWVudCA9IHBhcnRzLmZyYWdtZW50O1xuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvLyBmcmFjdGlvbiBhY2Nlc3NvcnNcblx0cC5zdWJkb21haW4gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVuaWVuY2UsIHJldHVybiBcInd3d1wiIGZyb20gXCJ3d3cuZXhhbXBsZS5vcmdcIlxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGdyYWIgZG9tYWluIGFuZCBhZGQgYW5vdGhlciBzZWdtZW50XG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoIC0gdGhpcy5kb21haW4oKS5sZW5ndGggLSAxO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlbmQpIHx8ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aCAtIHRoaXMuZG9tYWluKCkubGVuZ3RoO1xuXHRcdFx0dmFyIHN1YiA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlKTtcblx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cCgnXicgKyBlc2NhcGVSZWdFeChzdWIpKTtcblxuXHRcdFx0aWYgKHYgJiYgdi5jaGFyQXQodi5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG5cdFx0XHRcdHYgKz0gJy4nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLmRvbWFpbiA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBjb252ZW5pZW5jZSwgcmV0dXJuIFwiZXhhbXBsZS5vcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiBob3N0bmFtZSBjb25zaXN0cyBvZiAxIG9yIDIgc2VnbWVudHMsIGl0IG11c3QgYmUgdGhlIGRvbWFpblxuXHRcdFx0dmFyIHQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5tYXRjaCgvXFwuL2cpO1xuXHRcdFx0aWYgKHQgJiYgdC5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZ3JhYiB0bGQgYW5kIGFkZCBhbm90aGVyIHNlZ21lbnRcblx0XHRcdHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGggLSB0aGlzLnRsZChidWlsZCkubGVuZ3RoIC0gMTtcblx0XHRcdGVuZCA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKCcuJywgZW5kIC0xKSArIDE7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKGVuZCkgfHwgJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdikge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IGRvbWFpbiBlbXB0eScpO1xuXHRcdFx0fVxuXG5cdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZSB8fCB0aGlzLmlzKCdJUCcpKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCh0aGlzLmRvbWFpbigpKSArICckJyk7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnRsZCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyByZXR1cm4gXCJvcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoJy4nKTtcblx0XHRcdHZhciB0bGQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcocG9zICsgMSk7XG5cblx0XHRcdGlmIChidWlsZCAhPT0gdHJ1ZSAmJiBTTEQgJiYgU0xELmxpc3RbdGxkLnRvTG93ZXJDYXNlKCldKSB7XG5cdFx0XHRcdHJldHVybiBTTEQuZ2V0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSB8fCB0bGQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0bGQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciByZXBsYWNlO1xuXG5cdFx0XHRpZiAoIXYpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBUTEQgZW1wdHknKTtcblx0XHRcdH0gZWxzZSBpZiAodi5tYXRjaCgvW15hLXpBLVowLTktXS8pKSB7XG5cdFx0XHRcdGlmIChTTEQgJiYgU0xELmlzKHYpKSB7XG5cdFx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUTEQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2Nhbm5vdCBzZXQgVExEIG9uIG5vbi1kb21haW4gaG9zdCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5ob3N0bmFtZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5kaXJlY3RvcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLnBhdGggJiYgIXRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJy8nO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoIC0gMTtcblx0XHRcdHZhciByZXMgPSB0aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZygwLCBlbmQpIHx8ICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/ICcvJyA6ICcnKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aChyZXMpIDogcmVzO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBlID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoO1xuXHRcdFx0dmFyIGRpcmVjdG9yeSA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsIGUpO1xuXHRcdFx0dmFyIHJlcGxhY2UgPSBuZXcgUmVnRXhwKCdeJyArIGVzY2FwZVJlZ0V4KGRpcmVjdG9yeSkpO1xuXG5cdFx0XHQvLyBmdWxseSBxdWFsaWZpZXIgZGlyZWN0b3JpZXMgYmVnaW4gd2l0aCBhIHNsYXNoXG5cdFx0XHRpZiAoIXRoaXMuaXMoJ3JlbGF0aXZlJykpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0diA9ICcvJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2LmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0diA9ICcvJyArIHY7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGlyZWN0b3JpZXMgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcblx0XHRcdGlmICh2ICYmIHYuY2hhckF0KHYubGVuZ3RoIC0gMSkgIT09ICcvJykge1xuXHRcdFx0XHR2ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0diA9IFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0dGhpcy5fcGFydHMucGF0aCA9IHRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5maWxlbmFtZSA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IHRydWUpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMucGF0aCB8fCB0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMucGF0aC5sYXN0SW5kZXhPZignLycpO1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKHBvcysxKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aFNlZ21lbnQocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG11dGF0ZWREaXJlY3RvcnkgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHYuY2hhckF0KDApID09PSAnLycpIHtcblx0XHRcdFx0diA9IHYuc3Vic3RyaW5nKDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodi5tYXRjaCgvXFwuP1xcLy8pKSB7XG5cdFx0XHRcdG11dGF0ZWREaXJlY3RvcnkgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy5maWxlbmFtZSgpKSArICckJyk7XG5cdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXG5cdFx0XHRpZiAobXV0YXRlZERpcmVjdG9yeSkge1xuXHRcdFx0XHR0aGlzLm5vcm1hbGl6ZVBhdGgoYnVpbGQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuc3VmZml4ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5wYXRoIHx8IHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmaWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTtcblx0XHRcdHZhciBwb3MgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpO1xuXHRcdFx0dmFyIHMsIHJlcztcblxuXHRcdFx0aWYgKHBvcyA9PT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdWZmaXggbWF5IG9ubHkgY29udGFpbiBhbG51bSBjaGFyYWN0ZXJzICh5dXAsIEkgbWFkZSB0aGlzIHVwLilcblx0XHRcdHMgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKzEpO1xuXHRcdFx0cmVzID0gKC9eW2EtejAtOSVdKyQvaSkudGVzdChzKSA/IHMgOiAnJztcblx0XHRcdHJldHVybiB2ID8gVVJJLmRlY29kZVBhdGhTZWdtZW50KHJlcykgOiByZXM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG5cdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN1ZmZpeCA9IHRoaXMuc3VmZml4KCk7XG5cdFx0XHR2YXIgcmVwbGFjZTtcblxuXHRcdFx0aWYgKCFzdWZmaXgpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoICs9ICcuJyArIFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0fSBlbHNlIGlmICghdikge1xuXHRcdFx0XHRyZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCgnLicgKyBzdWZmaXgpICsgJyQnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4KHN1ZmZpeCkgKyAnJCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVwbGFjZSkge1xuXHRcdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSB0aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5zZWdtZW50ID0gZnVuY3Rpb24oc2VnbWVudCwgdiwgYnVpbGQpIHtcblx0XHR2YXIgc2VwYXJhdG9yID0gdGhpcy5fcGFydHMudXJuID8gJzonIDogJy8nO1xuXHRcdHZhciBwYXRoID0gdGhpcy5wYXRoKCk7XG5cdFx0dmFyIGFic29sdXRlID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJztcblx0XHR2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcGFyYXRvcik7XG5cblx0XHRpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzZWdtZW50ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHNlZ21lbnQ7XG5cdFx0XHRzZWdtZW50ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHNlZ21lbnQgIT09ICdudW1iZXInKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0JhZCBzZWdtZW50IFwiJyArIHNlZ21lbnQgKyAnXCIsIG11c3QgYmUgMC1iYXNlZCBpbnRlZ2VyJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFic29sdXRlKSB7XG5cdFx0XHRzZWdtZW50cy5zaGlmdCgpO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50IDwgMCkge1xuXHRcdFx0Ly8gYWxsb3cgbmVnYXRpdmUgaW5kZXhlcyB0byBhZGRyZXNzIGZyb20gdGhlIGVuZFxuXHRcdFx0c2VnbWVudCA9IE1hdGgubWF4KHNlZ21lbnRzLmxlbmd0aCArIHNlZ21lbnQsIDApO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiB0cnVlICovXG5cdFx0XHRyZXR1cm4gc2VnbWVudCA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gc2VnbWVudHNcblx0XHRcdFx0OiBzZWdtZW50c1tzZWdtZW50XTtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiBmYWxzZSAqL1xuXHRcdH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gbnVsbCB8fCBzZWdtZW50c1tzZWdtZW50XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXNBcnJheSh2KSkge1xuXHRcdFx0XHRzZWdtZW50cyA9IFtdO1xuXHRcdFx0XHQvLyBjb2xsYXBzZSBlbXB0eSBlbGVtZW50cyB3aXRoaW4gYXJyYXlcblx0XHRcdFx0Zm9yICh2YXIgaT0wLCBsPXYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKCF2W2ldLmxlbmd0aCAmJiAoIXNlZ21lbnRzLmxlbmd0aCB8fCAhc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoc2VnbWVudHMubGVuZ3RoICYmICFzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLTFdLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0c2VnbWVudHMucG9wKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh0cmltU2xhc2hlcyh2W2ldKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodiB8fCB0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0diA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9PT0gJycpIHtcblx0XHRcdFx0XHQvLyBlbXB0eSB0cmFpbGluZyBlbGVtZW50cyBoYXZlIHRvIGJlIG92ZXJ3cml0dGVuXG5cdFx0XHRcdFx0Ly8gdG8gcHJldmVudCByZXN1bHRzIHN1Y2ggYXMgL2Zvby8vYmFyXG5cdFx0XHRcdFx0c2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9IHY7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh2KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRzZWdtZW50c1tzZWdtZW50XSA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VnbWVudHMuc3BsaWNlKHNlZ21lbnQsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhYnNvbHV0ZSkge1xuXHRcdFx0c2VnbWVudHMudW5zaGlmdCgnJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGF0aChzZWdtZW50cy5qb2luKHNlcGFyYXRvciksIGJ1aWxkKTtcblx0fTtcblx0cC5zZWdtZW50Q29kZWQgPSBmdW5jdGlvbihzZWdtZW50LCB2LCBidWlsZCkge1xuXHRcdHZhciBzZWdtZW50cywgaSwgbDtcblxuXHRcdGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ251bWJlcicpIHtcblx0XHRcdGJ1aWxkID0gdjtcblx0XHRcdHYgPSBzZWdtZW50O1xuXHRcdFx0c2VnbWVudCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWdtZW50cyA9IHRoaXMuc2VnbWVudChzZWdtZW50LCB2LCBidWlsZCk7XG5cdFx0XHRpZiAoIWlzQXJyYXkoc2VnbWVudHMpKSB7XG5cdFx0XHRcdHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IFVSSS5kZWNvZGUoc2VnbWVudHMpIDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHNlZ21lbnRzW2ldID0gVVJJLmRlY29kZShzZWdtZW50c1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlZ21lbnRzO1xuXHRcdH1cblxuXHRcdGlmICghaXNBcnJheSh2KSkge1xuXHRcdFx0diA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdiBpbnN0YW5jZW9mIFN0cmluZykgPyBVUkkuZW5jb2RlKHYpIDogdjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChpID0gMCwgbCA9IHYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZbaV0gPSBVUkkuZW5jb2RlKHZbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnNlZ21lbnQoc2VnbWVudCwgdiwgYnVpbGQpO1xuXHR9O1xuXG5cdC8vIG11dGF0aW5nIHF1ZXJ5IHN0cmluZ1xuXHR2YXIgcSA9IHAucXVlcnk7XG5cdHAucXVlcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0dmFyIHJlc3VsdCA9IHYuY2FsbCh0aGlzLCBkYXRhKTtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkocmVzdWx0IHx8IGRhdGEsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9IGVsc2UgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdiAhPT0gJ3N0cmluZycpIHtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkodiwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcS5jYWxsKHRoaXMsIHYsIGJ1aWxkKTtcblx0XHR9XG5cdH07XG5cdHAuc2V0UXVlcnkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgYnVpbGQpIHtcblx0XHR2YXIgZGF0YSA9IFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHwgbmFtZSBpbnN0YW5jZW9mIFN0cmluZykge1xuXHRcdFx0ZGF0YVtuYW1lXSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YVtrZXldID0gbmFtZVtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1VSSS5hZGRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmFkZFF1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJ1aWxkKSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIG5hbWUsIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUpO1xuXHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkoZGF0YSwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRidWlsZCA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBidWlsZCkge1xuXHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFVSSS5yZW1vdmVRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSk7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmhhc1F1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHdpdGhpbkFycmF5KSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0cmV0dXJuIFVSSS5oYXNRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSwgd2l0aGluQXJyYXkpO1xuXHR9O1xuXHRwLnNldFNlYXJjaCA9IHAuc2V0UXVlcnk7XG5cdHAuYWRkU2VhcmNoID0gcC5hZGRRdWVyeTtcblx0cC5yZW1vdmVTZWFyY2ggPSBwLnJlbW92ZVF1ZXJ5O1xuXHRwLmhhc1NlYXJjaCA9IHAuaGFzUXVlcnk7XG5cblx0Ly8gc2FuaXRpemluZyBVUkxzXG5cdHAubm9ybWFsaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHRcdFx0Lm5vcm1hbGl6ZVByb3RvY29sKGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplUGF0aChmYWxzZSlcblx0XHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplRnJhZ21lbnQoZmFsc2UpXG5cdFx0XHRcdC5idWlsZCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQubm9ybWFsaXplUHJvdG9jb2woZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplSG9zdG5hbWUoZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplUG9ydChmYWxzZSlcblx0XHRcdC5ub3JtYWxpemVQYXRoKGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZUZyYWdtZW50KGZhbHNlKVxuXHRcdFx0LmJ1aWxkKCk7XG5cdH07XG5cdHAubm9ybWFsaXplUHJvdG9jb2wgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wcm90b2NvbCA9IHRoaXMuX3BhcnRzLnByb3RvY29sLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplSG9zdG5hbWUgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHRoaXMuaXMoJ0lETicpICYmIHB1bnljb2RlKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXMoJ0lQdjYnKSAmJiBJUHY2KSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gSVB2Ni5iZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBvcnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdC8vIHJlbW92ZSBwb3J0IG9mIGl0J3MgdGhlIHByb3RvY29sJ3MgZGVmYXVsdFxuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnICYmIHRoaXMuX3BhcnRzLnBvcnQgPT09IFVSSS5kZWZhdWx0UG9ydHNbdGhpcy5fcGFydHMucHJvdG9jb2xdKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wb3J0ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVQYXRoID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHR2YXIgX3BhdGggPSB0aGlzLl9wYXJ0cy5wYXRoO1xuXHRcdGlmICghX3BhdGgpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSBVUkkucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHZhciBfd2FzX3JlbGF0aXZlO1xuXHRcdHZhciBfbGVhZGluZ1BhcmVudHMgPSAnJztcblx0XHR2YXIgX3BhcmVudCwgX3BvcztcblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRoc1xuXHRcdGlmIChfcGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0X3dhc19yZWxhdGl2ZSA9IHRydWU7XG5cdFx0XHRfcGF0aCA9ICcvJyArIF9wYXRoO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBmaWxlcyAoYXMgb3Bwb3NlZCB0byBkaXJlY3Rvcmllcylcblx0XHRpZiAoX3BhdGguc2xpY2UoLTMpID09PSAnLy4uJyB8fCBfcGF0aC5zbGljZSgtMikgPT09ICcvLicpIHtcblx0XHRcdF9wYXRoICs9ICcvJztcblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHNpbXBsZXNcblx0XHRfcGF0aCA9IF9wYXRoXG5cdFx0XHQucmVwbGFjZSgvKFxcLyhcXC5cXC8pKyl8KFxcL1xcLiQpL2csICcvJylcblx0XHRcdC5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG5cblx0XHQvLyByZW1lbWJlciBsZWFkaW5nIHBhcmVudHNcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSkge1xuXHRcdFx0X2xlYWRpbmdQYXJlbnRzID0gX3BhdGguc3Vic3RyaW5nKDEpLm1hdGNoKC9eKFxcLlxcLlxcLykrLykgfHwgJyc7XG5cdFx0XHRpZiAoX2xlYWRpbmdQYXJlbnRzKSB7XG5cdFx0XHRcdF9sZWFkaW5nUGFyZW50cyA9IF9sZWFkaW5nUGFyZW50c1swXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHBhcmVudHNcblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0X3BhcmVudCA9IF9wYXRoLmluZGV4T2YoJy8uLicpO1xuXHRcdFx0aWYgKF9wYXJlbnQgPT09IC0xKSB7XG5cdFx0XHRcdC8vIG5vIG1vcmUgLi4vIHRvIHJlc29sdmVcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2UgaWYgKF9wYXJlbnQgPT09IDApIHtcblx0XHRcdFx0Ly8gdG9wIGxldmVsIGNhbm5vdCBiZSByZWxhdGl2ZSwgc2tpcCBpdFxuXHRcdFx0XHRfcGF0aCA9IF9wYXRoLnN1YnN0cmluZygzKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdF9wb3MgPSBfcGF0aC5zdWJzdHJpbmcoMCwgX3BhcmVudCkubGFzdEluZGV4T2YoJy8nKTtcblx0XHRcdGlmIChfcG9zID09PSAtMSkge1xuXHRcdFx0XHRfcG9zID0gX3BhcmVudDtcblx0XHRcdH1cblx0XHRcdF9wYXRoID0gX3BhdGguc3Vic3RyaW5nKDAsIF9wb3MpICsgX3BhdGguc3Vic3RyaW5nKF9wYXJlbnQgKyAzKTtcblx0XHR9XG5cblx0XHQvLyByZXZlcnQgdG8gcmVsYXRpdmVcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSAmJiB0aGlzLmlzKCdyZWxhdGl2ZScpKSB7XG5cdFx0XHRfcGF0aCA9IF9sZWFkaW5nUGFyZW50cyArIF9wYXRoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cblx0XHRfcGF0aCA9IFVSSS5yZWNvZGVQYXRoKF9wYXRoKTtcblx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gX3BhdGg7XG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBhdGhuYW1lID0gcC5ub3JtYWxpemVQYXRoO1xuXHRwLm5vcm1hbGl6ZVF1ZXJ5ID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHRpZiAodHlwZW9mIHRoaXMuX3BhcnRzLnF1ZXJ5ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5xdWVyeS5sZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5fcGFydHMucXVlcnkgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5xdWVyeShVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplRnJhZ21lbnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICghdGhpcy5fcGFydHMuZnJhZ21lbnQpIHtcblx0XHRcdHRoaXMuX3BhcnRzLmZyYWdtZW50ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVTZWFyY2ggPSBwLm5vcm1hbGl6ZVF1ZXJ5O1xuXHRwLm5vcm1hbGl6ZUhhc2ggPSBwLm5vcm1hbGl6ZUZyYWdtZW50O1xuXG5cdHAuaXNvODg1OSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCB1bmljb2RlIGlucHV0LCBpc284ODU5IG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdFVSSS5lbmNvZGUgPSBlO1xuXHRcdFx0VVJJLmRlY29kZSA9IGQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAudW5pY29kZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCBpc284ODU5IGlucHV0LCB1bmljb2RlIG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0VVJJLmVuY29kZSA9IGU7XG5cdFx0XHRVUkkuZGVjb2RlID0gZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0cC5yZWFkYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmkgPSB0aGlzLmNsb25lKCk7XG5cdFx0Ly8gcmVtb3ZpbmcgdXNlcm5hbWUsIHBhc3N3b3JkLCBiZWNhdXNlIHRoZXkgc2hvdWxkbid0IGJlIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0XHR1cmkudXNlcm5hbWUoJycpLnBhc3N3b3JkKCcnKS5ub3JtYWxpemUoKTtcblx0XHR2YXIgdCA9ICcnO1xuXHRcdGlmICh1cmkuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHVyaS5fcGFydHMucHJvdG9jb2wgKyAnOi8vJztcblx0XHR9XG5cblx0XHRpZiAodXJpLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHVyaS5pcygncHVueWNvZGUnKSAmJiBwdW55Y29kZSkge1xuXHRcdFx0XHR0ICs9IHB1bnljb2RlLnRvVW5pY29kZSh1cmkuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdFx0aWYgKHVyaS5fcGFydHMucG9ydCkge1xuXHRcdFx0XHRcdHQgKz0gJzonICsgdXJpLl9wYXJ0cy5wb3J0O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0ICs9IHVyaS5ob3N0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHVyaS5fcGFydHMuaG9zdG5hbWUgJiYgdXJpLl9wYXJ0cy5wYXRoICYmIHVyaS5fcGFydHMucGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dCArPSAnLyc7XG5cdFx0fVxuXG5cdFx0dCArPSB1cmkucGF0aCh0cnVlKTtcblx0XHRpZiAodXJpLl9wYXJ0cy5xdWVyeSkge1xuXHRcdFx0dmFyIHEgPSAnJztcblx0XHRcdGZvciAodmFyIGkgPSAwLCBxcCA9IHVyaS5fcGFydHMucXVlcnkuc3BsaXQoJyYnKSwgbCA9IHFwLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR2YXIga3YgPSAocXBbaV0gfHwgJycpLnNwbGl0KCc9Jyk7XG5cdFx0XHRcdHEgKz0gJyYnICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzBdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC8mL2csICclMjYnKTtcblxuXHRcdFx0XHRpZiAoa3ZbMV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHEgKz0gJz0nICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzFdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyYvZywgJyUyNicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0ICs9ICc/JyArIHEuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHQgKz0gVVJJLmRlY29kZVF1ZXJ5KHVyaS5oYXNoKCksIHRydWUpO1xuXHRcdHJldHVybiB0O1xuXHR9O1xuXG5cdC8vIHJlc29sdmluZyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgVVJMc1xuXHRwLmFic29sdXRlVG8gPSBmdW5jdGlvbihiYXNlKSB7XG5cdFx0dmFyIHJlc29sdmVkID0gdGhpcy5jbG9uZSgpO1xuXHRcdHZhciBwcm9wZXJ0aWVzID0gWydwcm90b2NvbCcsICd1c2VybmFtZScsICdwYXNzd29yZCcsICdob3N0bmFtZScsICdwb3J0J107XG5cdFx0dmFyIGJhc2VkaXIsIGksIHA7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoYmFzZSBpbnN0YW5jZW9mIFVSSSkpIHtcblx0XHRcdGJhc2UgPSBuZXcgVVJJKGJhc2UpO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucHJvdG9jb2wgPSBiYXNlLl9wYXJ0cy5wcm90b2NvbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiByZXNvbHZlZDtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyAocCA9IHByb3BlcnRpZXNbaV0pOyBpKyspIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0c1twXSA9IGJhc2UuX3BhcnRzW3BdO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnBhdGgpIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0cy5wYXRoID0gYmFzZS5fcGFydHMucGF0aDtcblx0XHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnF1ZXJ5KSB7XG5cdFx0XHRcdHJlc29sdmVkLl9wYXJ0cy5xdWVyeSA9IGJhc2UuX3BhcnRzLnF1ZXJ5O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocmVzb2x2ZWQuX3BhcnRzLnBhdGguc3Vic3RyaW5nKC0yKSA9PT0gJy4uJykge1xuXHRcdFx0cmVzb2x2ZWQuX3BhcnRzLnBhdGggKz0gJy8nO1xuXHRcdH1cblxuXHRcdGlmIChyZXNvbHZlZC5wYXRoKCkuY2hhckF0KDApICE9PSAnLycpIHtcblx0XHRcdGJhc2VkaXIgPSBiYXNlLmRpcmVjdG9yeSgpO1xuXHRcdFx0YmFzZWRpciA9IGJhc2VkaXIgPyBiYXNlZGlyIDogYmFzZS5wYXRoKCkuaW5kZXhPZignLycpID09PSAwID8gJy8nIDogJyc7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucGF0aCA9IChiYXNlZGlyID8gKGJhc2VkaXIgKyAnLycpIDogJycpICsgcmVzb2x2ZWQuX3BhcnRzLnBhdGg7XG5cdFx0XHRyZXNvbHZlZC5ub3JtYWxpemVQYXRoKCk7XG5cdFx0fVxuXG5cdFx0cmVzb2x2ZWQuYnVpbGQoKTtcblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH07XG5cdHAucmVsYXRpdmVUbyA9IGZ1bmN0aW9uKGJhc2UpIHtcblx0XHR2YXIgcmVsYXRpdmUgPSB0aGlzLmNsb25lKCkubm9ybWFsaXplKCk7XG5cdFx0dmFyIHJlbGF0aXZlUGFydHMsIGJhc2VQYXJ0cywgY29tbW9uLCByZWxhdGl2ZVBhdGgsIGJhc2VQYXRoO1xuXG5cdFx0aWYgKHJlbGF0aXZlLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMnKTtcblx0XHR9XG5cblx0XHRiYXNlID0gbmV3IFVSSShiYXNlKS5ub3JtYWxpemUoKTtcblx0XHRyZWxhdGl2ZVBhcnRzID0gcmVsYXRpdmUuX3BhcnRzO1xuXHRcdGJhc2VQYXJ0cyA9IGJhc2UuX3BhcnRzO1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlLnBhdGgoKTtcblx0XHRiYXNlUGF0aCA9IGJhc2UucGF0aCgpO1xuXG5cdFx0aWYgKHJlbGF0aXZlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVUkkgaXMgYWxyZWFkeSByZWxhdGl2ZScpO1xuXHRcdH1cblxuXHRcdGlmIChiYXNlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsY3VsYXRlIGEgVVJJIHJlbGF0aXZlIHRvIGFub3RoZXIgcmVsYXRpdmUgVVJJJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMucHJvdG9jb2wgPT09IGJhc2VQYXJ0cy5wcm90b2NvbCkge1xuXHRcdFx0cmVsYXRpdmVQYXJ0cy5wcm90b2NvbCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IGJhc2VQYXJ0cy51c2VybmFtZSB8fCByZWxhdGl2ZVBhcnRzLnBhc3N3b3JkICE9PSBiYXNlUGFydHMucGFzc3dvcmQpIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhcnRzLnByb3RvY29sICE9PSBudWxsIHx8IHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IG51bGwgfHwgcmVsYXRpdmVQYXJ0cy5wYXNzd29yZCAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMuaG9zdG5hbWUgPT09IGJhc2VQYXJ0cy5ob3N0bmFtZSAmJiByZWxhdGl2ZVBhcnRzLnBvcnQgPT09IGJhc2VQYXJ0cy5wb3J0KSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLmhvc3RuYW1lID0gbnVsbDtcblx0XHRcdHJlbGF0aXZlUGFydHMucG9ydCA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhdGggPT09IGJhc2VQYXRoKSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLnBhdGggPSAnJztcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBjb21tb24gc3ViIHBhdGhcblx0XHRjb21tb24gPSBVUkkuY29tbW9uUGF0aChyZWxhdGl2ZVBhdGgsIGJhc2VQYXRoKTtcblxuXHRcdC8vIElmIHRoZSBwYXRocyBoYXZlIG5vdGhpbmcgaW4gY29tbW9uLCByZXR1cm4gYSByZWxhdGl2ZSBVUkwgd2l0aCB0aGUgYWJzb2x1dGUgcGF0aC5cblx0XHRpZiAoIWNvbW1vbikge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0dmFyIHBhcmVudHMgPSBiYXNlUGFydHMucGF0aFxuXHRcdFx0LnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKVxuXHRcdFx0LnJlcGxhY2UoL1teXFwvXSokLywgJycpXG5cdFx0XHQucmVwbGFjZSgvLio/XFwvL2csICcuLi8nKTtcblxuXHRcdHJlbGF0aXZlUGFydHMucGF0aCA9IChwYXJlbnRzICsgcmVsYXRpdmVQYXJ0cy5wYXRoLnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKSkgfHwgJy4vJztcblxuXHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHR9O1xuXG5cdC8vIGNvbXBhcmluZyBVUklzXG5cdHAuZXF1YWxzID0gZnVuY3Rpb24odXJpKSB7XG5cdFx0dmFyIG9uZSA9IHRoaXMuY2xvbmUoKTtcblx0XHR2YXIgdHdvID0gbmV3IFVSSSh1cmkpO1xuXHRcdHZhciBvbmVfbWFwID0ge307XG5cdFx0dmFyIHR3b19tYXAgPSB7fTtcblx0XHR2YXIgY2hlY2tlZCA9IHt9O1xuXHRcdHZhciBvbmVfcXVlcnksIHR3b19xdWVyeSwga2V5O1xuXG5cdFx0b25lLm5vcm1hbGl6ZSgpO1xuXHRcdHR3by5ub3JtYWxpemUoKTtcblxuXHRcdC8vIGV4YWN0IG1hdGNoXG5cdFx0aWYgKG9uZS50b1N0cmluZygpID09PSB0d28udG9TdHJpbmcoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gZXh0cmFjdCBxdWVyeSBzdHJpbmdcblx0XHRvbmVfcXVlcnkgPSBvbmUucXVlcnkoKTtcblx0XHR0d29fcXVlcnkgPSB0d28ucXVlcnkoKTtcblx0XHRvbmUucXVlcnkoJycpO1xuXHRcdHR3by5xdWVyeSgnJyk7XG5cblx0XHQvLyBkZWZpbml0ZWx5IG5vdCBlcXVhbCBpZiBub3QgZXZlbiBub24tcXVlcnkgcGFydHMgbWF0Y2hcblx0XHRpZiAob25lLnRvU3RyaW5nKCkgIT09IHR3by50b1N0cmluZygpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gcXVlcnkgcGFyYW1ldGVycyBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgZXZlbiBpZiB0aGV5J3JlIHBlcm11dGVkXG5cdFx0aWYgKG9uZV9xdWVyeS5sZW5ndGggIT09IHR3b19xdWVyeS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRvbmVfbWFwID0gVVJJLnBhcnNlUXVlcnkob25lX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHR0d29fbWFwID0gVVJJLnBhcnNlUXVlcnkodHdvX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGZvciAoa2V5IGluIG9uZV9tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChvbmVfbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghaXNBcnJheShvbmVfbWFwW2tleV0pKSB7XG5cdFx0XHRcdFx0aWYgKG9uZV9tYXBba2V5XSAhPT0gdHdvX21hcFtrZXldKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhcnJheXNFcXVhbChvbmVfbWFwW2tleV0sIHR3b19tYXBba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjaGVja2VkW2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoa2V5IGluIHR3b19tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbCh0d29fbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghY2hlY2tlZFtrZXldKSB7XG5cdFx0XHRcdFx0Ly8gdHdvIGNvbnRhaW5zIGEgcGFyYW1ldGVyIG5vdCBwcmVzZW50IGluIG9uZVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cdC8vIHN0YXRlXG5cdHAuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzID0gZnVuY3Rpb24odikge1xuXHRcdHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmVzY2FwZVF1ZXJ5U3BhY2UgPSBmdW5jdGlvbih2KSB7XG5cdFx0dGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRyZXR1cm4gVVJJO1xufSkpOyIsIldvcmtmbG93ID0ge31cblxuQEltYWdlU2lnbiA9IHt9O1xuXG5AVHJhY2VzSGFuZGxlciA9IHt9O1xuXG5AVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxuQEluc3RhbmNlZm9ybVRlbXBsYXRlID0ge307XG5cbkBJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSA9IHt9O1xuXG5ASW5zdGFuY2VTaWduVGV4dCA9IHt9XG5cbkBSZWxhdGVkSW5zdGFuY2VzID0ge31cblxuQFJlbGF0ZWRSZWNvcmRzID0ge31cblxuQEluc3RhbmNlTWFjcm8gPSB7Y29udGV4dDoge319XG5cbkBUcmFjZXNNYW5hZ2VyID0ge307XG5cbkluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcgPSAoZmllbGRfZm9ybXVsYSktPlxuXHRyZXR1cm4gKGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3lpamlhbmxhbjpcIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7J3lpamlhbmxhbic6XCIpID4gLTEpXG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSAoZm9ybSwgZm9ybV92ZXJzaW9uKS0+XG5cdGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG5cblx0X2Zvcm1fdmVyc2lvbiA9IHt9XG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0X2Zvcm1fdmVyc2lvbiA9IHV1Zmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oZGIuZm9ybXMuZmluZE9uZSh7X2lkOiBmb3JtfSksIGZvcm1fdmVyc2lvbilcblx0ZWxzZVxuXHRcdF9mb3JtX3ZlcnNpb24gPSBkYi5mb3JtX3ZlcnNpb25zLmZpbmRPbmUoe19pZDogZm9ybV92ZXJzaW9uLCBmb3JtOiBmb3JtfSlcblxuXHRmaWVsZHMgPSBfZm9ybV92ZXJzaW9uPy5maWVsZHMgfHwgW11cblxuXHRmaWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdGlmIGYudHlwZSA9PSAndGFibGUnXG5cdFx0XHRjb25zb2xlLmxvZyAnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnXG5cdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRmPy5maWVsZHM/LmZvckVhY2ggKGYxKS0+XG5cdFx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZjEuZm9ybXVsYVxuXHRcdGVsc2Vcblx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZi5mb3JtdWxhXG5cblx0Xy5zb21lIGZpZWxkX2Zvcm11bGFzLCAoZmllbGRfZm9ybXVsYSktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cbiIsIiAgICAgICAgICAgICBcblxuV29ya2Zsb3cgPSB7fTtcblxudGhpcy5JbWFnZVNpZ24gPSB7fTtcblxudGhpcy5UcmFjZXNIYW5kbGVyID0ge307XG5cbnRoaXMuVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxudGhpcy5JbnN0YW5jZWZvcm1UZW1wbGF0ZSA9IHt9O1xuXG50aGlzLkluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlID0ge307XG5cbnRoaXMuSW5zdGFuY2VTaWduVGV4dCA9IHt9O1xuXG50aGlzLlJlbGF0ZWRJbnN0YW5jZXMgPSB7fTtcblxudGhpcy5SZWxhdGVkUmVjb3JkcyA9IHt9O1xuXG50aGlzLkluc3RhbmNlTWFjcm8gPSB7XG4gIGNvbnRleHQ6IHt9XG59O1xuXG50aGlzLlRyYWNlc01hbmFnZXIgPSB7fTtcblxuSW5zdGFuY2VTaWduVGV4dC5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyA9IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgcmV0dXJuIChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xIHx8IChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7eWlqaWFubGFuOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwieyd5aWppYW5sYW4nOlwiKSA6IHZvaWQgMCkgPiAtMTtcbn07XG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSBmdW5jdGlvbihmb3JtLCBmb3JtX3ZlcnNpb24pIHtcbiAgdmFyIF9mb3JtX3ZlcnNpb24sIGZpZWxkX2Zvcm11bGFzLCBmaWVsZHM7XG4gIGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG4gIF9mb3JtX3ZlcnNpb24gPSB7fTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIF9mb3JtX3ZlcnNpb24gPSB1dWZsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmb3JtXG4gICAgfSksIGZvcm1fdmVyc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgX2Zvcm1fdmVyc2lvbiA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZvcm1fdmVyc2lvbixcbiAgICAgIGZvcm06IGZvcm1cbiAgICB9KTtcbiAgfVxuICBmaWVsZHMgPSAoX2Zvcm1fdmVyc2lvbiAhPSBudWxsID8gX2Zvcm1fdmVyc2lvbi5maWVsZHMgOiB2b2lkIDApIHx8IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgfSBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYgPSBmLmZpZWxkcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGYxKSB7XG4gICAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYxLmZvcm11bGEpO1xuICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYuZm9ybXVsYSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIF8uc29tZShmaWVsZF9mb3JtdWxhcywgZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICB9KTtcbn07XG4iLCJkYi5pbnN0YW5jZV90YXNrcyA9IG5ldyBNZXRlb3IuQ29sbGVjdGlvbignaW5zdGFuY2VfdGFza3MnKVxuXG5kYi5pbnN0YW5jZV90YXNrcy5fc2ltcGxlU2NoZW1hID0gbmV3IFNpbXBsZVNjaGVtYVxuICAgIGluc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICB0cmFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaXNfZmluaXNoZWQ6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXI6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBoYW5kbGVyX29yZ2FuaXphdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHN0YXJ0X2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkdWVfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGlzX3JlYWQ6XG4gICAgICAgIHR5cGU6IEJvb2xlYW5cbiAgICBpc19lcnJvcjpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIHZhbHVlczpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgZGVhZGxpbmU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICByZW1pbmRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIHJlbWluZGVkX2NvdW50OlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICByZWFkX2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgbW9kaWZpZWQ6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBtb2RpZmllZF9ieTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc2lnbl9zaG93OlxuICAgICAgICB0eXBlOiBCb29sZWFuXG4gICAganVkZ2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIG5leHRfc3RlcHM6XG4gICAgICAgIHR5cGU6IEFycmF5XG4gICAgXCJuZXh0X3N0ZXBzLiRcIjpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgXCJuZXh0X3N0ZXBzLiQuc3RlcFwiOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBcIm5leHRfc3RlcHMuJC51c2Vyc1wiOlxuICAgICAgICB0eXBlOiBbU3RyaW5nXVxuICAgIGZpbmlzaF9kYXRlOlxuICAgICAgICB0eXBlOiBEYXRlXG4gICAgY29zdF90aW1lOlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICBzcGFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaW5zdGFuY2VfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3VibWl0dGVyOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXR0ZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBhcHBsaWNhbnRfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGZsb3c6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGZsb3dfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZm9ybTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcDpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcF9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBjYXRlZ29yeV9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpbnN0YW5jZV9zdGF0ZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBmb3J3YXJkX2Zyb21faW5zdGFuY2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGtleXdvcmRzOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpc19hcmNoaXZlZDpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIGNhdGVnb3J5OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiIsImRiLmF1dGhfdG9rZW5zID0gbmV3IE1ldGVvci5Db2xsZWN0aW9uKCdhdXRoX3Rva2VucycpIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUgPSB7fTtcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5zdGFuY2VfYXR0YWNobWVudCA9IFwiXCJcIlxuXHQ8dHI+XG5cdFx0PHRkIGNsYXNzPVwiaW5zLWF0dGFjaC12aWV3XCI+XG5cdFx0XHQ8YSBocmVmPVwie3tpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCBfaWQgYWJzb2x1dGV9fVwiIGNsYXNzPVwiaW5zX2F0dGFjaF9ocmVmXCIgdGFyZ2V0PVwiX3BhcmVudFwiIGRhdGEtbmFtZT1cInt7dGhpcy5uYW1lfX1cIiBkYXRhLXR5cGU9XCJ7e3RoaXMub3JpZ2luYWwudHlwZX19XCIgZGF0YS1pZD1cInt7X2lkfX1cIj57e3RoaXMubmFtZX19PC9hPlxuXHRcdDwvdGQ+XG5cdDwvdHI+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmU2VsZWN0VXNlclJlYWQgPSBcIlwiXCJcblx0PGRpdiBjbGFzcz0nc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCc+e3t2YWx1ZX19PC9kaXY+XG5cIlwiXCJcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXBSZWFkID0gXCJcIlwiXG5cdDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAnPlxuXHRcdHt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0nc2VjdGlvbiBjYWxsb3V0IGNhbGxvdXQtZGVmYXVsdCc+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tmX2xhYmVsIHRoaXN9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjBweDtcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiA+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJlYWRvbmx5LXRhYmxlXCIgc3R5bGU9XCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgdHlwZT0ndGFibGUnIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cInt7dGhpcy5jb2RlfX1UYWJsZVwiIG5hbWU9XCJ7e3RoaXMuY29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3t0aGlzLm5hbWV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8dGhlYWQgaWQ9XCJ7e3RoaXMubmFtZX19VGhlYWRcIiBuYW1lPVwie3t0aGlzLm5hbWV9fVRoZWFkXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGhlYWQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cInt7dGhpcy5uYW1lfX1UYm9keVwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZUJvZHkgdGhpc319fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHR7eyNpZiBzaG93TGFiZWx9fVxuXHRcdFx0XHRcdFx0PGxhYmVsPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdFx0e3sjaWYgaXNUZXh0YXJlYSB0aGlzfX1cblx0XHRcdFx0XHRcdDxwIGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvcD5cblx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L2Rpdj5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdHt7L2lmfX1cblx0XHRcdHt7L2lmfX1cblx0XHR7ey93aXRofX1cblx0PC9kaXY+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwID0gXCJcIlwiXG5cblx0e3sjd2l0aCBnZXRGaWVsZCB0aGlzLm5hbWV9fVxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cblx0XHRcdFx0XHRcdDxwPnt7e2Rlc2NyaXB0aW9ufX19PC9wPlxuXHRcdFx0XHRcdDwvZGl2PlxuICBcdFx0XHRcdDwvZGl2PlxuXHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgc3RlZWRvcy10YWJsZVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MHB4O1wiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiID5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmVhZG9ubHktdGFibGVcIiBzdHlsZT1cInBhZGRpbmc6MHB4O292ZXJmbG93LXg6YXV0bztcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1jb25kZW5zZWQgYXV0b2Zvcm0tdGFibGVcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVwie3t0aGlzLmNvZGV9fVRhYmxlXCIgbmFtZT1cInt7dGhpcy5jb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e3RoaXMubmFtZX19XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cInt7dGhpcy5uYW1lfX1UaGVhZFwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGhlYWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHRib2R5IGlkPVwie3t0aGlzLm5hbWV9fVRib2R5XCIgbmFtZT1cInt7dGhpcy5uYW1lfX1UYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdpbnB1dCd9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLXJlcXVpcmVkPVwie3sjaWYgaXNfcmVxdWlyZWR9fXRydWV7ey9pZn19XCI+XG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0e3sjaWYgaXNfdGV4dGFyZWF9fVxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdGV4dGFyZWE+XG5cdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3sjdW5sZXNzIGlzX3RleHRhcmVhfX1cblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHR7ey91bmxlc3N9fVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdudW1iZXInfX1cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJudW1iZXJcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlJ319XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXR5cGU9XCJkYXRlXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlVGltZSd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS10eXBlPSdkYXRldGltZScgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdwYXNzd29yZCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgdGl0bGU9XCJ7e2dldExhYmVsIGNvZGV9fVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGRhdGEtc2NoZW1hLWtleT1cInt7Z2V0TGFiZWwgY29kZX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VsZWN0J319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInt7dmFsdWV9fVwiPnt7bGFiZWx9fTwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvc2VsZWN0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdyYWRpbyd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWYtcmFkaW8tZ3JvdXBcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cbiAgICAgICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcIj48aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJ7e3ZhbHVlfX1cIiBuYW1lPVwie3suLi9jb2RlfX1cIiBjbGFzcz1cInJhZGlvLWlubGluZSBmaXgtaW5kZW50XCI+IHt7bGFiZWx9fTwvbGFiZWw+XG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbXVsdGlTZWxlY3QnfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFmLWNoZWNrYm94LWdyb3VwXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwie3t2YWx1ZX19XCIgbmFtZT1cInt7Li4vY29kZX19XCIgY2xhc3M9XCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFwiPiB7e2xhYmVsfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3VybCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInVybFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2VtYWlsJ319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwiZW1haWxcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdjaGVja2JveCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwidHJ1ZVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGNsYXNzPVwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcIj48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0e3svaWZ9fVxuXHRcdHt7L3dpdGh9fVxuXCJcIlwiXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUgPSAodGVtcGFsdGVOYW1lLCBzdGVlZG9zRGF0YSkgLT5cblx0dGVtcGxhdGUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGVbdGVtcGFsdGVOYW1lXVxuXG5cdHRlbXBsYXRlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0dGVtcGxhdGVSZW5kZXJGdW5jdGlvbiA9IGV2YWwodGVtcGxhdGVDb21waWxlZCk7XG5cblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZSh0ZW1wYWx0ZU5hbWUsIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQgPSAoc3RlZWRvc0RhdGEpLT5cblx0aW5zdGFuY2VTaWduVGV4dEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9zaWduX3RleHQuaHRtbCcpXG5cblx0aW5zdGFuY2VTaWduVGV4dENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVNpZ25UZXh0SHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VTaWduVGV4dFwiLCBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzIEluc3RhbmNlU2lnblRleHQuaGVscGVyc1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduID0gKHN0ZWVkb3NEYXRhKSAtPlxuXHRpbWFnZVNpZ25IdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW1hZ2Vfc2lnbi5odG1sJylcblx0aW1hZ2VTaWduQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGltYWdlU2lnbkh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0aW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24gPSBldmFsKGltYWdlU2lnbkNvbXBpbGVkKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW1hZ2VTaWduXCIsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW1hZ2VTaWduLmhlbHBlcnMgSW1hZ2VTaWduLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZVRyYWNlc0hhbmxkZXIgPSAoc3RlZWRvc0RhdGEpIC0+XG5cdHRyYWNlc0hhbmxkZXJIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX2hhbmRsZXIuaHRtbCcpXG5cdHRyYWNlc0hhbmxkZXJDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSGFubGRlckh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0dHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZXNIYW5sZGVyQ29tcGlsZWQpO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlciA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3RyYWNlc19oYW5kbGVyXCIsIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbik7XG5cdFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuaGVscGVycyBUcmFjZXNIYW5kbGVyLmhlbHBlcnNcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdCA9IChzdGVlZG9zRGF0YSkgLT5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmU2VsZWN0VXNlclJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuXG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZkZvcm1Hcm91cFwiLCBzdGVlZG9zRGF0YSk7XG5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwUmVhZFwiLCBzdGVlZG9zRGF0YSk7XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJpbnN0YW5jZV9hdHRhY2htZW50XCIsIHthYnNvbHV0ZTogc3RlZWRvc0RhdGEuYWJzb2x1dGV9KTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduKHN0ZWVkb3NEYXRhKVxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyKHN0ZWVkb3NEYXRhKTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW5zdGFuY2VTaWduVGV4dChzdGVlZG9zRGF0YSlcblxuZ2V0TGlua1RleHQgPSAoaXRlbSwgbGFiZWwsIGRldGFpbF91cmwpLT5cblx0aWYgZGV0YWlsX3VybFxuXHRcdGRldGFpbF91cmwgPSBkZXRhaWxfdXJsLnJlcGxhY2UoXCJ7X2lkfVwiLCBpdGVtLl9pZClcblx0XHRpZiAhL15odHRwKHM/KTpcXC9cXC8vLnRlc3QoZGV0YWlsX3VybClcblx0XHRcdGRldGFpbF91cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKGRldGFpbF91cmwpXG5cdFx0cmV0dXJuICc8YSBocmVmPVwiJytkZXRhaWxfdXJsKydcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nK2xhYmVsKyc8L2E+Jztcblx0ZWxzZVxuXHRcdHJldHVybiBsYWJlbFxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUgPSAodmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldCkgLT5cblx0aWYgIXZhbHVlICYmIHZhbHVlICE9IGZhbHNlXG5cdFx0cmV0dXJuICcnXG5cdGlmIFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xXG5cdFx0ZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAgKG4pLT5cblx0XHRcdGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG5cdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cblx0XHRcdH1cblx0c3dpdGNoIGZpZWxkLnR5cGVcblx0XHR3aGVuICdlbWFpbCdcblx0XHRcdHZhbHVlID0gaWYgdmFsdWUgdGhlbiAnPGEgaHJlZj1cXCdtYWlsdG86JyArIHZhbHVlICsgJ1xcJz4nICsgdmFsdWUgKyAnPC9hPicgZWxzZSAnJ1xuXHRcdHdoZW4gJ3VybCdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmIHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09IDBcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdHZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcblx0XHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9ICcnXG5cdFx0d2hlbiAnZ3JvdXAnXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZnVsbG5hbWVcblx0XHR3aGVuICd1c2VyJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdHdoZW4gJ3Bhc3N3b3JkJ1xuXHRcdFx0dmFsdWUgPSAnKioqKioqJ1xuXHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0aWYgdmFsdWUgJiYgdmFsdWUgIT0gJ2ZhbHNlJ1xuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIsIHt9LCBsb2NhbGUpXG5cdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKHZhbHVlLCB1dGNPZmZzZXQpO1xuXHRcdHdoZW4gJ2lucHV0J1xuXHRcdFx0aWYgZmllbGQuaXNfdGV4dGFyZWFcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVxuXHRcdHdoZW4gJ3NlbGVjdCdcblx0XHRcdHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoKGl0ZW0pIC0+IHJldHVybiBpdGVtLnZhbHVlID09IHZhbHVlKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25cblx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbFxuXHRcdHdoZW4gJ3JhZGlvJ1xuXHRcdFx0c2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZCgoaXRlbSkgLT4gcmV0dXJuIGl0ZW0udmFsdWUgPT0gdmFsdWUpXG5cdFx0XHRpZiBzZWxlY3RlZE9wdGlvblxuXHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsXG5cdFx0d2hlbiAnbXVsdGlTZWxlY3QnXG5cdFx0XHRzcGxpdGVkVmFsdWVzID0gdmFsdWUuc3BsaXQoXCIsXCIpXG5cdFx0XHRzZWxlY3RlZE9wdGlvbnMgPSBmaWVsZE9wdGlvbnMuZmlsdGVyKChpdGVtKSAtPiByZXR1cm4gc3BsaXRlZFZhbHVlcy5pbmRleE9mKGl0ZW0udmFsdWUpID4gLTEpXG5cdFx0XHRpZiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXG5cdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRPcHRpb25zLm1hcCgoaXRlbSkgLT4gcmV0dXJuIGl0ZW0ubGFiZWwpLmpvaW4oXCIsXCIpXG5cdFx0d2hlbiAnbnVtYmVyJ1xuXHRcdFx0aWYgdmFsdWUgb3IgdmFsdWUgPT0gMFxuXHRcdFx0XHRpZiBmaWVsZC5pc19wZXJjZW50XG5cdFx0XHRcdFx0dmFsdWUgPSBTdGVlZG9zLm51bWJlclRvUGVyY2VudFN0cmluZyB2YWx1ZSwgZmllbGQuZGlnaXRzXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWx1ZSA9IFN0ZWVkb3MubnVtYmVyVG9TdHJpbmcgdmFsdWUsIGZpZWxkLmRpZ2l0c1xuXHRcdHdoZW4gJ29kYXRhJ1xuXHRcdFx0ZGV0YWlsX3VybCA9IGZpZWxkLmRldGFpbF91cmxcblx0XHRcdGlmIGZpZWxkLmlzX211bHRpc2VsZWN0XG5cdFx0XHRcdHZhbHVlID0gXy5tYXAgdmFsdWUsIChpdGVtKS0+XG5cdFx0XHRcdFx0cmV0dXJuIGdldExpbmtUZXh0KGl0ZW0sIGl0ZW1bJ0BsYWJlbCddLCBkZXRhaWxfdXJsKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IGdldExpbmtUZXh0KHZhbHVlLCB2YWx1ZVsnQGxhYmVsJ10sIGRldGFpbF91cmwpXG5cdFx0d2hlbiAnaW1hZ2UnXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IF8ubWFwIHZhbHVlLCAoaXRlbSktPlxuXHRcdFx0XHRcdHJldHVybiAnPGRpdiBjbGFzcz1cImFudGQtSW1hZ2VDb250cm9sLWl0ZW0gaXMtdXBsb2FkZWRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iXCI+PGltZyBjbGFzcz1cImFudGQtSW1hZ2UtaW1hZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzcmM9XCIvYXBpL2ZpbGVzL2ltYWdlcy8nK2l0ZW0rJ1wiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2Pidcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9ICc8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZUNvbnRyb2wtaXRlbSBpcy11cGxvYWRlZFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFudGQtSW1hZ2UgYW50ZC1JbWFnZS0tdGh1bWIgYW50ZC1JbWFnZUNvbnRyb2wtaW1hZ2VcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFudGQtSW1hZ2UtdGh1bWJXcmFwXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFudGQtSW1hZ2UtdGh1bWJcIj48aW1nIGNsYXNzPVwiYW50ZC1JbWFnZS1pbWFnZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNyYz1cIi9hcGkvZmlsZXMvaW1hZ2VzLycrdmFsdWUrJ1wiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2Pidcblx0XHR3aGVuICdmaWxlJ1xuXHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0aWYgIWZpZWxkLmlzX211bHRpc2VsZWN0XG5cdFx0XHRcdFx0dmFsdWUgPSBbdmFsdWVdXG5cdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRcdHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvY2ZzX2ZpbGVzX2ZpbGVyZWNvcmQ/ZmlsdGVycz1bW1wiX2lkXCIsXCJpblwiLCAnK0pTT04uc3RyaW5naWZ5KHZhbHVlKSsnXV0mZmllbGRzPVtcIl9pZFwiLFwib3JpZ2luYWxcIl0nLCB7YXN5bmM6ZmFsc2V9KVxuXHRcdFx0XHRcdHJlY29yZHMgPSByZXMuZGF0YS5pdGVtc1xuXHRcdFx0XHRlbHNlIGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoXCJjZnNfZmlsZXNfZmlsZXJlY29yZFwiLCB7IGZpbHRlcnM6IFtbXCJfaWRcIiwgJ2luJywgdmFsdWVdXSwgZmllbGRzOiBbXCJfaWRcIiwgXCJvcmlnaW5hbFwiXSB9KTtcblxuXHRcdFx0XHR2YWx1ZSA9IF8ubWFwIHJlY29yZHMsIChpdGVtKS0+XG5cdFx0XHRcdFx0ZmlsZU5hbWUgPSBpdGVtLm9yaWdpbmFsLm5hbWU7XG5cdFx0XHRcdFx0ZmlsZVVybCA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwoJy9hcGkvZmlsZXMvZmlsZXMvJytpdGVtLl9pZCk7XG5cdFx0XHRcdFx0ZmlsZVByZXZpZXdIdG1sID0gJyc7XG5cdFx0XHRcdFx0aWYgW1wiLnBkZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wbmdcIiwgXCIuZ2lmXCJdLmluZGV4T2YoZmlsZU5hbWUuc2xpY2UoLTQpKSA+IC0xXG5cdFx0XHRcdFx0XHRmaWxlUHJldmlld0h0bWwgPSBcIiZlbnNwOzxhIGhyZWY9JyN7ZmlsZVVybH0nIHRhcmdldD0nX2JsYW5rJyBjbGFzcz0nYW50ZC1MaW5rJz48c3BhbiBjbGFzcz0nYW50ZC1UcGxGaWVsZCc+PHNwYW4+6aKE6KeIPC9zcGFuPjwvc3Bhbj48L2E+XCJcblx0XHRcdFx0XHRyZXR1cm4gXCI8ZGl2PjxhIGhyZWY9JyN7ZmlsZVVybCsnP2Rvd25sb2FkPXRydWUnfScgdGFyZ2V0PSdfYmxhbmsnPiN7ZmlsZU5hbWV9PC9hPiAje2ZpbGVQcmV2aWV3SHRtbCA/IGZpbGVQcmV2aWV3SHRtbCA6ICcnfTwvZGl2PlwiXG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuXHRcdHdoZW4gJ2xvb2t1cCdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmICFmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHZhbHVlID0gW3ZhbHVlXVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHR1aVNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0KGZpZWxkLnJlZmVyZW5jZV90bylcblx0XHRcdFx0XHRuYW1lRmllbGQgPSB1aVNjaGVtYT8uTkFNRV9GSUVMRF9LRVkgfHwgJ25hbWUnXG5cdFx0XHRcdFx0cmVzID0gU3RlZWRvcy5hdXRoUmVxdWVzdCgnL2FwaS92MS8nK2ZpZWxkLnJlZmVyZW5jZV90bysnP2ZpbHRlcnM9W1tcIicrKGZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJykrJ1wiLFwiaW5cIiwgJytKU09OLnN0cmluZ2lmeSh2YWx1ZSkrJ11dJmZpZWxkcz1bXCJfaWRcIixcIicrbmFtZUZpZWxkKydcIl0nLCB7YXN5bmM6ZmFsc2V9KVxuXHRcdFx0XHRcdHJlY29yZHMgPSByZXMuZGF0YS5pdGVtc1xuXHRcdFx0XHRlbHNlIGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdG5hbWVGaWVsZCA9IFN0ZWVkb3MuZ2V0T2JqZWN0TmFtZUZpZWxkS2V5KGZpZWxkLnJlZmVyZW5jZV90byk7XG5cdFx0XHRcdFx0cmVjb3JkcyA9IFN0ZWVkb3Mub2JqZWN0RmluZChmaWVsZC5yZWZlcmVuY2VfdG8sIHsgZmlsdGVyczogW1soZmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkIHx8ICdfaWQnKSwgJ2luJywgdmFsdWVdXSwgZmllbGRzOiBbXCJfaWRcIiwgbmFtZUZpZWxkXSB9KTtcblx0XHRcdFx0dmFsdWUgPSBfLm1hcCByZWNvcmRzLCAoaXRlbSktPlxuXHRcdFx0XHRcdHJldHVybiBcIjxhIGhyZWY9JyN7U3RlZWRvcy5hYnNvbHV0ZVVybCgnL2FwcC8tLycrZmllbGQucmVmZXJlbmNlX3RvKycvdmlldy8nK2l0ZW0uX2lkKX0nIHRhcmdldD0nX2JsYW5rJz4je2l0ZW1bbmFtZUZpZWxkXX08L2E+XCJcblxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLmpvaW4oXCIgLCBcIik7XHRcblx0XHR3aGVuICdodG1sJ1xuXHRcdFx0dmFsdWUgPSBpZiB2YWx1ZSB0aGVuIFwiPGRpdiBjbGFzcz1cXFwic3RlZWRvcy1odG1sXFxcIj4je3ZhbHVlfTwvZGl2PlwiIGVsc2UgJydcblxuXHRyZXR1cm4gdmFsdWU7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCA9IChmaWVsZHMsIGNvZGUpIC0+XG5cdGZpZWxkID0gZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpXG5cdGlmIGZpZWxkXG5cdFx0aWYgZmllbGQubmFtZVxuXHRcdFx0cmV0dXJuIGZpZWxkLm5hbWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmllbGQuY29kZVxuXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uID0gKGluc3RhbmNlKS0+XG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXG5cdGZvcm1fdmVyc2lvbiA9IHt9XG5cblx0Zm9ybV9maWVsZHMgPSBbXTtcblxuXHRpZiBmb3JtLmN1cnJlbnQuX2lkID09IGluc3RhbmNlLmZvcm1fdmVyc2lvblxuXHRcdGZvcm1fdmVyc2lvbiA9IGZvcm0uY3VycmVudFxuXHRlbHNlXG5cdFx0Zm9ybV92ZXJzaW9uID0gXy53aGVyZShmb3JtLmhpc3RvcnlzLCB7X2lkOiBpbnN0YW5jZS5mb3JtX3ZlcnNpb259KVswXVxuXG5cdGZvcm1fdmVyc2lvbi5maWVsZHMuZm9yRWFjaCAoZmllbGQpLT5cblx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0Zm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG5cdFx0XHRpZiBmaWVsZC5maWVsZHNcblx0XHRcdFx0ZmllbGQuZmllbGRzLmZvckVhY2ggKGYpIC0+XG5cdFx0XHRcdFx0Zm9ybV9maWVsZHMucHVzaChmKTtcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0ZmllbGRbJ3NmaWVsZHMnXSA9IGZpZWxkWydmaWVsZHMnXVxuXHRcdFx0ZGVsZXRlIGZpZWxkWydmaWVsZHMnXVxuXHRcdFx0Zm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybV9maWVsZHMucHVzaChmaWVsZCk7XG5cblx0Zm9ybV92ZXJzaW9uLmZpZWxkcyA9IGZvcm1fZmllbGRzO1xuXG5cdHJldHVybiBmb3JtX3ZlcnNpb247XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbiA9IChpbnN0YW5jZSktPlxuXHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcblx0Zmxvd192ZXJzaW9uID0ge31cblx0aWYgZmxvdy5jdXJyZW50Ll9pZCA9PSBpbnN0YW5jZS5mbG93X3ZlcnNpb25cblx0XHRmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnRcblx0ZWxzZVxuXHRcdGZsb3dfdmVyc2lvbiA9IF8ud2hlcmUoZmxvdy5oaXN0b3J5cywge19pZDogaW5zdGFuY2UuZmxvd192ZXJzaW9ufSlbMF1cblxuXHRyZXR1cm4gZmxvd192ZXJzaW9uO1xuXG5cbl9nZXRWaWV3SHRtbCA9IChwYXRoKSAtPlxuXHR2aWV3SHRtbCA9IEFzc2V0cy5nZXRUZXh0KHBhdGgpXG5cblx0aWYgdmlld0h0bWxcblx0XHR2aWV3SHRtbCA9IHZpZXdIdG1sLnJlcGxhY2UoLzx0ZW1wbGF0ZVtcXHdcXHNcXFwiXFw9J10rPi9pLFwiXCIpLnJlcGxhY2UoLzxcXC90ZW1wbGF0ZT4vaSxcIlwiKVxuXG5cdHJldHVybiB2aWV3SHRtbDtcblxuX2dldExvY2FsZSA9ICh1c2VyKS0+XG5cdGlmIHVzZXI/LmxvY2FsZT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnemgtY24nXG5cdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdGVsc2UgaWYgdXNlcj8ubG9jYWxlPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdlbi11cydcblx0XHRsb2NhbGUgPSBcImVuXCJcblx0ZWxzZVxuXHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRyZXR1cm4gbG9jYWxlXG5cblxuX2dldFJlcXVpcmVkRmllbGRzID0gKGZpZWxkcywgcmV2KS0+XG5cdGlmICFyZXZcblx0XHRyZXYgPSBbXTtcblxuXHRmaWVsZHMuZm9yRWFjaCAoZmllbGQpLT5cblx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0X2dldFJlcXVpcmVkRmllbGRzKGZpZWxkLmZpZWxkcywgcmV2KVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAndGFibGUnXG5cblx0XHRlbHNlXG5cdFx0XHRpZiBmaWVsZC5pc19yZXF1aXJlZFxuXHRcdFx0XHRyZXYucHVzaCBmaWVsZC5jb2RlXG5cdHJldHVybiByZXY7XG5cbl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IChmaWVsZHMsIHN0ZXBzKS0+XG5cdHN0YXJ0U3RlcCA9IHN0ZXBzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJzdGVwX3R5cGVcIixcInN0YXJ0XCIpXG5cblx0ZWRpdGFibGVDb2RlID0gW11cblxuXHRfLmtleXMoc3RhcnRTdGVwLnBlcm1pc3Npb25zKS5mb3JFYWNoIChrZXkpLT5cblx0XHRpZiBzdGFydFN0ZXAucGVybWlzc2lvbnNba2V5XSA9PSAnZWRpdGFibGUnXG5cdFx0XHRlZGl0YWJsZUNvZGUucHVzaCBrZXlcblxuXHRyZXR1cm4gZWRpdGFibGVDb2RlXG5cbl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyA9IChmaWVsZHMsIHN0ZXBzKS0+XG5cdHJlcXVpcmVkRmllbGRzID0gX2dldFJlcXVpcmVkRmllbGRzKGZpZWxkcylcblxuXHRlZGl0YWJsZUNvZGUgPSBfZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMoZmllbGRzLCBzdGVwcylcblxuXHRyZXR1cm4gXy5pbnRlcnNlY3Rpb24ocmVxdWlyZWRGaWVsZHMsIGVkaXRhYmxlQ29kZSlcblxuX2dldFRlbXBsYXRlRGF0YSA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0Zm9ybV92ZXJzaW9uID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpXG5cdGVsc2Vcblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbihpbnN0YW5jZSlcblxuXHRsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpXG5cblx0c3RlZWRvc0RhdGEgPSB7fVxuXG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdHN0ZWVkb3NEYXRhID0gXy5jbG9uZShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCkpXG5cdFx0c3RlZWRvc0RhdGEuaW5zbmFtZSA9IGluc3RhbmNlLm5hbWVcblx0XHRzdGVlZG9zRGF0YS5pbnNfc3RhdGUgPSBpbnN0YW5jZS5zdGF0ZVxuXHRcdHN0ZWVkb3NEYXRhLmluc19maW5hbF9kZWNpc2lvbiA9IGluc3RhbmNlLmluc19maW5hbF9kZWNpc2lvblxuXHRcdHN0ZWVkb3NEYXRhLmluc19jb2RlID0gaW5zdGFuY2UuY29kZVxuXHRcdHN0ZWVkb3NEYXRhLmluc19pc19hcmNoaXZlZCA9IGluc3RhbmNlLmlzX2FyY2hpdmVkXG5cdFx0c3RlZWRvc0RhdGEuaW5zX2lzX2RlbGV0ZWQgPSBpbnN0YW5jZS5pbnNfaXNfZGVsZXRlZFxuXHRcdHN0ZWVkb3NEYXRhLmFwcGxpY2FudF9uYW1lID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblx0XHRzdGVlZG9zRGF0YS5hcHBsaWNhbnRDb250ZXh0ID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblxuXHRzdGVlZG9zRGF0YS5pbnN0YW5jZSA9IGluc3RhbmNlXG5cdHN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbiA9IGZvcm1fdmVyc2lvblxuXHRzdGVlZG9zRGF0YS5sb2NhbGUgPSBsb2NhbGVcblx0c3RlZWRvc0RhdGEudXRjT2Zmc2V0ID0gdXNlci51dGNPZmZzZXRcblx0c3RlZWRvc0RhdGEuc3BhY2UgPSBpbnN0YW5jZS5zcGFjZVxuXHRzdGVlZG9zRGF0YS5zZXNzaW9uVXNlcklkID0gdXNlci5faWRcblxuXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRpZiBvcHRpb25zPy5lZGl0YWJsZVxuXHRcdFx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe19pZDogaW5zdGFuY2UuZm9ybX0pXG5cblx0XHRcdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtfaWQ6IGluc3RhbmNlLmZsb3d9KVxuXG5cdFx0XHRzdGVlZG9zRGF0YS5zdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyhmb3JtLmN1cnJlbnQuZmllbGRzLCBmbG93LmN1cnJlbnQuc3RlcHMpO1xuXG5cdHJldHVybiBzdGVlZG9zRGF0YTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdERhdGUgPSAoZGF0ZSwgdXRjT2Zmc2V0KS0+XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdHBhc3NpbmcgPSBmYWxzZTtcblx0ZWxzZVxuXHRcdHBhc3NpbmcgPSB0cnVlO1xuXG5cdGlmICF1dGNPZmZzZXQgJiYgdXRjT2Zmc2V0ICE9MFxuXHRcdHV0Y09mZnNldCA9IDhcblxuXHRyZXR1cm4gbW9tZW50KGRhdGUpLnV0Y09mZnNldCh1dGNPZmZzZXQsIHBhc3NpbmcpLmZvcm1hdChcIllZWVktTU0tREQgSEg6bW1cIik7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZVZpZXcgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cblx0c3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucylcblxuXHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IGZhbHNlO1xuXG5cdGlmIG9wdGlvbnM/LmFic29sdXRlXG5cdFx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuXG5cdGluc3RhbmNlVGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUoaW5zdGFuY2UsIG9wdGlvbnM/LnRlbXBsYXRlTmFtZSk7XG5cblx0aW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGUucmVwbGFjZSgvYWZTZWxlY3RVc2VyL2csXCJhZlNlbGVjdFVzZXJSZWFkXCIpXG5cblx0aWYgIW9wdGlvbnM/LmVkaXRhYmxlXG5cdFx0aW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGUucmVwbGFjZSgvYWZGb3JtR3JvdXAvZyxcImFmRm9ybUdyb3VwUmVhZFwiKVxuXG5cdGluc3RhbmNlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGluc3RhbmNlVGVtcGxhdGUsIHtpc0JvZHk6IHRydWV9KTtcblxuXHRpbnN0YW5jZVJlbmRlckZ1bmN0aW9uID0gZXZhbChpbnN0YW5jZUNvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VfcmVhZG9ubHlfdmlld1wiLCBpbnN0YW5jZVJlbmRlckZ1bmN0aW9uKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LmhlbHBlcnMgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVyc1xuXG5cdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5pbml0KHN0ZWVkb3NEYXRhKTtcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldywgc3RlZWRvc0RhdGEpXG5cblx0cmV0dXJuIFwiXCJcIlxuXHRcdDxkaXYgaWQ9J2luc3RhbmNlZm9ybScgPlxuXHRcdFx0I3tib2R5fVxuXHRcdDwvZGl2PlxuXHRcIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFRyYWNlc1ZpZXcgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cblx0c3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblxuXHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcblx0aWYgZm9ybS5pbnN0YW5jZV9zdHlsZSA9PSBcInRhYmxlXCIgfHwgb3B0aW9ucz8udGVtcGxhdGVOYW1lID09IFwidGFibGVcIlxuXHRcdHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXNfdGFibGUuaHRtbCcpXG5cdGVsc2Vcblx0XHR0cmFjZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzLmh0bWwnKVxuXG5cdHRyYWNlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRyYWNlc0h0bWwsIHtpc0JvZHk6IHRydWV9KTtcblxuXHR0cmFjZVJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZUNvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwidHJhY2VfcmVhZG9ubHlfdmlld1wiLCB0cmFjZVJlbmRlckZ1bmN0aW9uKTtcblxuXHRUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblxuXHRUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LmhlbHBlcnMgVHJhY2VzVGVtcGxhdGUuaGVscGVyc1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LCBpbnN0YW5jZS50cmFjZXMpXG5cblx0cmV0dXJuIGJvZHk7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRBdHRhY2htZW50VmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpLT5cblxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXG5cdGF0dGFjaG1lbnRIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW5zdGFuY2VfYXR0YWNobWVudHMuaHRtbCcpXG5cblx0YXR0YWNobWVudENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShhdHRhY2htZW50SHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoYXR0YWNobWVudENvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiYXR0YWNobWVudHNfcmVhZG9ubHlfdmlld1wiLCBhdHRhY2htZW50UmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcuaGVscGVycyBJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzXG5cblx0Ym9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcpXG5cblx0cmV0dXJuIGJvZHk7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblx0c3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblxuXHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IGZhbHNlO1xuXG5cdGlmIG9wdGlvbnM/LmFic29sdXRlXG5cdFx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuXG5cdHJlbGF0ZWRJbnN0YW5jZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvcmVsYXRlZF9pbnN0YW5jZXMuaHRtbCcpXG5cblx0cmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShyZWxhdGVkSW5zdGFuY2VzSHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbiA9IGV2YWwocmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwicmVsYXRlZF9pbnN0YW5jZXNfdmlld1wiLCByZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcuaGVscGVycyBSZWxhdGVkSW5zdGFuY2VzLmhlbHBlcnNcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldywgc3RlZWRvc0RhdGEpXG5cblx0cmV0dXJuIGJvZHk7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkUmVjb3Jkc1ZpZXcgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cdHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cblx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcblxuXHRpZiBvcHRpb25zPy5hYnNvbHV0ZVxuXHRcdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gdHJ1ZTtcblxuXHRyZWxhdGVkUmVjb3Jkc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9yZWxhdGVkX3JlY29yZHMuaHRtbCcpXG5cblx0cmVsYXRlZFJlY29yZHNDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUocmVsYXRlZFJlY29yZHNIdG1sLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0cmVsYXRlZFJlY29yZHNSZW5kZXJGdW5jdGlvbiA9IGV2YWwocmVsYXRlZFJlY29yZHNDb21waWxlZCk7XG5cblx0VGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX3JlY29yZHNfdmlld1wiLCByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uKTtcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcuaGVscGVycyBSZWxhdGVkUmVjb3Jkcy5oZWxwZXJzXG5cblx0Ym9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LCBzdGVlZG9zRGF0YSlcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldE9uTG9hZFNjcmlwdCA9IChpbnN0YW5jZSktPlxuXHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oaW5zdGFuY2UuZm9ybSwgaW5zdGFuY2UuZm9ybV92ZXJzaW9uKVxuXG5cdGZvcm1fc2NyaXB0ID0gZm9ybV92ZXJzaW9uLmZvcm1fc2NyaXB0O1xuXG5cdGlmIGZvcm1fc2NyaXB0ICYmIGZvcm1fc2NyaXB0LnJlcGxhY2UoL1xcbi9nLFwiXCIpLnJlcGxhY2UoL1xccy9nLFwiXCIpLmxlbmd0aCA+IDBcblx0XHRmb3JtX3NjcmlwdCA9IFwiQ29yZUZvcm0gPSB7fTtDb3JlRm9ybS5pbnN0YW5jZWZvcm0gPSB7fTtcIiArIGZvcm1fc2NyaXB0XG5cdFx0Zm9ybV9zY3JpcHQgKz0gXCI7aWYoQ29yZUZvcm0uZm9ybV9PbkxvYWQpe3dpbmRvdy5vbmxvYWQgPSBDb3JlRm9ybS5mb3JtX09uTG9hZCgpO31cIlxuXHRlbHNlXG5cdFx0Zm9ybV9zY3JpcHQgPSBcIlwiXG5cblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyktPlxuXG5cdGJvZHkgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG5cblx0b25Mb2FkU2NyaXB0ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldE9uTG9hZFNjcmlwdChpbnN0YW5jZSk7XG5cblx0Y3JlYXRvclNlcnZpY2UgPSBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndlYnNlcnZpY2VzPy5jcmVhdG9yPy51cmxcblx0aW5zX3JlY29yZF9pZHMgPSBpbnN0YW5jZS5yZWNvcmRfaWRzXG5cdGxvY2FsZSA9IF9nZXRMb2NhbGUodXNlcik7XG5cdG9wZW5GaWxlU2NyaXB0ID0gXCJcIlwiXG5cdFx0XHRpZih3aW5kb3cuaXNOb2RlICYmIGlzTm9kZSgpKXtcblx0XHRcdFx0YXR0YWNocyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJpbnNfYXR0YWNoX2hyZWZcIik7XG5cdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBhdHRhY2hzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHRhdHRhY2ggPSBhdHRhY2hzW2ldO1xuXHRcdFx0XHRcdGF0dGFjaC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdFx0XHRpZihpc0ltYWdlKHRoaXMuZGF0YXNldC50eXBlKSB8fCBpc0h0bWwodGhpcy5kYXRhc2V0LnR5cGUpKXtcblx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRvcGVuV2luZG93KFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvXCIgKyB0aGlzLmRhdGFzZXQuaWQpO1xuXHRcdFx0XHRcdFx0fWVsc2UgaWYobndfY29yZS5jYW5PcGVuRmlsZSh0aGlzLmRhdGFzZXQubmFtZSkpe1xuXHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdG53X2NvcmUub3BlbkZpbGUodGhpcy5ocmVmLCB0aGlzLmRhdGFzZXQubmFtZSlcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZmxvdyA9IFwiI3tpbnN0YW5jZS5mbG93fVwiO1xuXHRcdFx0dmFyIHNwYWNlID0gXCIje2luc3RhbmNlLnNwYWNlfVwiO1xuXG5cdFx0XHRmdW5jdGlvbiBnZXRDb29raWUobmFtZSl7XG5cdFx0XHRcdGxldCBwYXR0ZXJuID0gUmVnRXhwKG5hbWUgKyBcIj0uW147XSpcIilcblx0XHRcdFx0bGV0IG1hdGNoZWQgPSBkb2N1bWVudC5jb29raWUubWF0Y2gocGF0dGVybilcblx0XHRcdFx0aWYobWF0Y2hlZCl7XG5cdFx0XHRcdFx0bGV0IGNvb2tpZSA9IG1hdGNoZWRbMF0uc3BsaXQoJz0nKVxuXHRcdFx0XHRcdHJldHVybiBjb29raWVbMV1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gJydcblx0XHRcdH1cblxuXHRcdFx0dmFyIHJlY29yZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiaW5zLXJlbGF0ZWQtcmVjb3Jkc1wiKTtcblx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKXtcblx0XHRcdFx0XHR2YXIgcmVjb3JkID0gcmVjb3Jkc1tpXTtcblx0XHRcdFx0XHRyZWNvcmQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHRcdFx0dmFyIGNyZWF0b3JTZXJ2aWNlID0gXCIje2NyZWF0b3JTZXJ2aWNlfVwiXG5cdFx0XHRcdFx0XHR2YXIgaW5zX3JlY29yZF9pZHMgPSAje0pTT04uc3RyaW5naWZ5KGluc19yZWNvcmRfaWRzKX1cblx0XHRcdFx0XHRcdGlmKGNyZWF0b3JTZXJ2aWNlICYmIGluc19yZWNvcmRfaWRzICYmIGluc19yZWNvcmRfaWRzLmxlbmd0aCA+IDApe1xuXHRcdFx0XHRcdFx0XHR2YXIgb2JqY2V0TmFtZSA9IGluc19yZWNvcmRfaWRzWzBdLm9cblx0XHRcdFx0XHRcdFx0dmFyIGlkID0gaW5zX3JlY29yZF9pZHNbMF0uaWRzWzBdXG5cdFx0XHRcdFx0XHRcdHZhciB1b2JqID0ge307XG5cdFx0XHRcdFx0XHRcdHVvYmpbXCJYLVVzZXItSWRcIl0gPSBnZXRDb29raWUoXCJYLVVzZXItSWRcIik7XG5cdFx0XHRcdFx0XHRcdHVvYmpbXCJYLUF1dGgtVG9rZW5cIl0gPSBnZXRDb29raWUoXCJYLUF1dGgtVG9rZW5cIik7XG5cdFx0XHRcdFx0XHRcdHJlZGlyZWN0VXJsID0gY3JlYXRvclNlcnZpY2UgKyBcImFwcC8tL1wiICsgb2JqY2V0TmFtZSArIFwiL3ZpZXcvXCIgKyBpZCArIFwiP1wiICsgJC5wYXJhbSh1b2JqKTtcblx0XHRcdFx0XHRcdFx0b3BlbldpbmRvdyhyZWRpcmVjdFVybCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcIlwiXCI7XG5cblxuXHRpZiAhU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG5cdFx0aWYgZm9ybT8uaW5zdGFuY2Vfc3R5bGUgPT0gJ3RhYmxlJ1xuXHRcdFx0aW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCJcblxuXHRpZiBvcHRpb25zPy50ZW1wbGF0ZU5hbWUgPT0gJ3RhYmxlJ1xuXHRcdGluc3RhbmNlX3N0eWxlID0gXCJpbnN0YW5jZS10YWJsZVwiXG5cblx0aWYgb3B0aW9ucz8uaW5zdGFuY2Vfc3R5bGVcblx0XHRpbnN0YW5jZV9zdHlsZSA9IG9wdGlvbnMuaW5zdGFuY2Vfc3R5bGVcblxuXHRpZiAhb3B0aW9ucyB8fCBvcHRpb25zLnNob3dUcmFjZSA9PSB0cnVlXG5cdFx0dHJhY2UgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cdGVsc2Vcblx0XHR0cmFjZSA9IFwiXCJcblxuXHRpbnN0YW5jZUJveFN0eWxlID0gXCJcIjtcblxuXHRpZiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5maW5hbF9kZWNpc2lvblxuXHRcdGlmIGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uID09IFwiYXBwcm92ZWRcIlxuXHRcdFx0aW5zdGFuY2VCb3hTdHlsZSA9IFwiYm94LXN1Y2Nlc3NcIlxuXHRcdGVsc2UgaWYgKGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uID09IFwicmVqZWN0ZWRcIilcblx0XHRcdGluc3RhbmNlQm94U3R5bGUgPSBcImJveC1kYW5nZXJcIlxuXHRpZiAhb3B0aW9ucyB8fCBvcHRpb25zLnNob3dBdHRhY2htZW50cyA9PSB0cnVlXG5cdFx0YXR0YWNobWVudCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRBdHRhY2htZW50Vmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cdFx0cmVsYXRlZF9pbnN0YW5jZXMgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZEluc3RhbmNlc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXHRcdHJlbGF0ZWRfcmVjb3JkcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkUmVjb3Jkc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXHRlbHNlXG5cdFx0YXR0YWNobWVudCA9IFwiXCJcblx0XHRyZWxhdGVkX2luc3RhbmNlcyA9IFwiXCJcblx0XHRyZWxhdGVkX3JlY29yZHMgPSBcIlwiXG5cblxuXHR3aWR0aCA9IFwiOTYwcHhcIlxuXHQjXHTlpoLmnpznu5l0YWJsZeeahHBhcmVudOiuvue9rndpZHRo77yM5YiZ5Lya5a+86Ie06Zi/6YeM5LqR6YKu566x5pi+56S6dGFibGUg5byC5bi4XG5cdGlmIG9wdGlvbnM/LndpZHRoXG5cdFx0d2lkdGggPSBcIlwiXG5cblx0Y3NzSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcInN0ZWVkb3MtY3NzXCIpXG5cdFxuXHRqcUhyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3ZWJzaXRlL2xpYnMvanF1ZXJ5Lm1pbi5qc1wiKVxuXG5cdGFsbENzc0xpbmsgPSBcIlwiXCI8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgY2xhc3M9XCJfX21ldGVvci1jc3NfX1wiIGhyZWY9XCIje2Nzc0hyZWZ9XCI+XCJcIlwiXG5cblx0dHJhY2VDaGVjayA9IFwiXCJcblx0aWYgIV8uaXNFbXB0eSh0cmFjZSlcblx0XHR0cmFjZUNoZWNrID0gXCJjaGVja2VkXCJcblx0aWYgb3B0aW9ucz8udGFnZ2VyID09ICdlbWFpbCcgfHwgb3B0aW9ucz8uZWRpdGFibGVcblx0XHRzaG93VHJhY2VzQnRuID0gXCJcIlxuXHRlbHNlXG5cdFx0c2hvd1RyYWNlc0J0biA9IFwiXCJcIlxuXHRcdFx0PGRpdiBjbGFzcz1cIm5hdmlnYXRpb24tYmFyIGJ0bi1ncm91cCBuby1wcmludFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MDBweDsgei1pbmRleDogOTk5OyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicHJpbnQtdG9vbFwiPlxuXHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNieC1sYWJlbFwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNieC1wcmludCBjYngtcHJpbnQtYXR0YWNobWVudHNcIiBpZD1cImNieC1wcmludC1hdHRhY2htZW50c1wiIGNoZWNrZWQ9XCJjaGVja2VkXCI+PHNwYW4+I3tUQVBpMThuLl9fKCdpbnN0YW5jZV9hdHRhY2htZW50Jywge30sIGxvY2FsZSl9PC9zcGFuPjwvbGFiZWw+XG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY2J4LWxhYmVsXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2J4LXByaW50IGNieC1wcmludC10cmFjZXNcIiBpZD1cImNieC1wcmludC10cmFjZXNcIiBjaGVja2VkPVwiI3t0cmFjZUNoZWNrfVwiPjxzcGFuPiN7VEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92YWxfaGlzdG9yeScsIHt9LCBsb2NhbGUpfTwvc3Bhbj48L2xhYmVsPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0XCJcIlwiXG5cblx0c2hvd1RyYWNlc1NjcmlwdCA9IFwiXCJcIlxuXHRcdCQoIGRvY3VtZW50ICkucmVhZHkoZnVuY3Rpb24oKXtcblx0XHRcdHZhciBiID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NieC1wcmludC10cmFjZXMnKTtcblx0XHRcdHZhciB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5zdGFuY2UtdHJhY2VzJylbMF07XG5cdFx0XHRpZiAoYiAmJiBiLmNoZWNrZWQgJiYgdCl7XG5cdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xuXHRcdFx0fSBlbHNlIGlmKHQpe1xuXHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xuXHRcdFx0fVxuXHRcdFx0aWYoYil7XG5cdFx0XHRcdGIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdFx0aWYgKGUudGFyZ2V0LmNoZWNrZWQpe1xuXHRcdFx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXG5cdFx0XHR2YXIgYXR0YWNobWVudHNDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYngtcHJpbnQtYXR0YWNobWVudHMnKTtcblx0XHRcdHZhciBhdHRhY2htZW50c1ZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRhY2htZW50cy1zZWN0aW9uJylbMF07XG5cdFx0XHRpZiAoYXR0YWNobWVudHNDaGVja2JveCAmJiBhdHRhY2htZW50c0NoZWNrYm94LmNoZWNrZWQgJiYgYXR0YWNobWVudHNWaWV3KXtcblx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcblx0XHRcdH0gZWxzZSBpZihhdHRhY2htZW50c1ZpZXcpe1xuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXG5cdFx0XHR9XG5cdFx0XHRpZihhdHRhY2htZW50c0NoZWNrYm94KXtcblx0XHRcdFx0YXR0YWNobWVudHNDaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XG5cdFx0XHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcIlwiXCJcblxuXHRpZiBvcHRpb25zPy5zdHlsZXNcblx0XHRhbGxDc3NMaW5rID0gXCJcIlxuXG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlLmZvcm19KTtcblx0Zm9ybURlc2NyaXB0aW9uSHRtbCA9IFwiXCJcblx0aWYgZm9ybVxuXHRcdGZvcm1EZXNjcmlwdGlvbiA9IGZvcm0uZGVzY3JpcHRpb25cblx0XHRpZiBmb3JtRGVzY3JpcHRpb25cblx0XHRcdGZvcm1EZXNjcmlwdGlvbiA9IGZvcm1EZXNjcmlwdGlvbi5yZXBsYWNlKC9cXG4vZyxcIjxici8+XCIpXG5cdFx0XHRmb3JtRGVzY3JpcHRpb25IdG1sID0gXCJcIlwiXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJib3gtaGVhZGVyICB3aXRoLWJvcmRlciBpbnN0YW5jZS1oZWFkZXJcIj5cblx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0I3tmb3JtRGVzY3JpcHRpb259XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcIlwiXCJcblxuXHRodG1sID0gXCJcIlwiXG5cdFx0PCFET0NUWVBFIGh0bWw+XG5cdFx0PGh0bWw+XG5cdFx0XHQ8aGVhZD5cblx0XHRcdFx0PG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIi8+XG5cdFx0XHRcdCN7YWxsQ3NzTGlua31cblx0XHRcdFx0PHNjcmlwdCBzcmM9XCIje2pxSHJlZn1cIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cdFx0XHRcdDxzY3JpcHQgc3JjPVwiL2pzL253X2NvcmUuanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cdFx0XHRcdCN7b3B0aW9ucy5wbHVnaW5zIHx8IFwiXCJ9XG5cblx0XHRcdFx0PHN0eWxlPlxuXHRcdFx0XHRcdC5zdGVlZG9ze1xuXHRcdFx0XHRcdFx0d2lkdGg6ICN7d2lkdGh9O1xuXHRcdFx0XHRcdFx0bWFyZ2luLWxlZnQ6IGF1dG87XG5cdFx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IGF1dG87XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Lmluc3RhbmNlLXZpZXcgLmluc3RhbmNlLW5hbWV7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYm94LXRvb2xze1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmJveC5jb2xsYXBzZWQtYm94IC5ib3gtYm9keSwuYm94LmNvbGxhcHNlZC1ib3ggLmJveC1mb290ZXIge1xuXHRcdFx0XHRcdCAgZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ym9keXtcblx0XHRcdFx0XHRcdGJhY2tncm91bmQ6IGF6dXJlICFpbXBvcnRhbnQ7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Lmluc3RhbmNlLXZpZXcgLmluc3RhbmNlLXRyYWNlc3tcblx0XHRcdFx0XHRcdHBhZGRpbmctbGVmdDogMTVweDtcblx0XHRcdFx0XHRcdHBhZGRpbmctcmlnaHQ6IDE1cHg7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0ge1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLUltYWdlQ29udHJvbC1hZGRCdG4tYm9yZGVyUmFkaXVzKTtcblx0XHRcdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuXHRcdFx0XHRcdHBhZGRpbmc6IHZhcigtLWdhcC14cyk7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogdmFyKC0tZ2FwLWJhc2UpO1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IHZhcigtLWdhcC1iYXNlKTtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0d2lkdGg6IDcuNXJlbTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZCB7XG5cdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHRib3JkZXItY29sb3I6IHZhcigtLUZpbGVDb250cm9sLWRhbmdlci1jb2xvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtIHN2Zy5pY29uLXJlZnJlc2gge1xuXHRcdFx0XHRcdHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSB7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdFx0XHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0XHRcdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0XHRcdGNvbG9yOiB2YXIoLS1GaWxlQ29udHJvbC1kYW5nZXItY29sb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUgPiBzdmcuaWNvbi1pbWFnZSB7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogOHB4O1xuXHRcdFx0XHRcdHdpZHRoOiAyNHB4O1xuXHRcdFx0XHRcdGhlaWdodDogMjRweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lID4gc3BhbiB7XG5cdFx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWltYWdlIHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0Y29sb3I6ICM5OTk7XG5cdFx0XHRcdFx0dG9wOiA1cHg7XG5cdFx0XHRcdFx0cmlnaHQ6IDVweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciA+IHN2ZyB7XG5cdFx0XHRcdFx0dG9wOiAwO1xuXHRcdFx0XHRcdHdpZHRoOiAxMHB4O1xuXHRcdFx0XHRcdGhlaWdodDogMTBweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1JbmZvIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0XHRcdFx0XHR3aWR0aDogMTEwcHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMTBweDtcblx0XHRcdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0XHRcdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0XHRcdGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcblx0XHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtSW5mbyA+IHAge1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0XHRmb250LXNpemU6IDEycHg7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3Mge1xuXHRcdFx0XHRcdHdpZHRoOiA3MHB4O1xuXHRcdFx0XHRcdGhlaWdodDogNXB4O1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICNlYmViZWI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1wcm9ncmVzc1ZhbHVlIHtcblx0XHRcdFx0XHRoZWlnaHQ6IDVweDtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3MtYm9yZGVyUmFkaXVzKTtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1pbmZvKTtcblx0XHRcdFx0XHRtaW4td2lkdGg6IDEwJTtcblx0XHRcdFx0XHR0cmFuc2l0aW9uOiBlYXNlLW91dCB3aWR0aCB2YXIoLS1hbmltYXRpb24tZHVyYXRpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xuXHRcdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQ6aG92ZXIgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1lcnJvck1zZyB7XG5cdFx0XHRcdFx0Y29sb3I6IHZhcigtLWRhbmdlcik7XG5cdFx0XHRcdFx0bWFyZ2luOiA1cHggMCAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtdXBsb2FkQnRuIHtcblx0XHRcdFx0XHRtYXJnaW4tdG9wOiA1cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wcGVyV3JhcHBlciB7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcHBlcldyYXBwZXIgaW1nIHtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0bWF4LWhlaWdodDogNDAwcHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0cmlnaHQ6IDA7XG5cdFx0XHRcdFx0Ym90dG9tOiAwO1xuXHRcdFx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRcdFx0YWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXHRcdFx0XHRcdG1hcmdpbjogMC41cmVtO1xuXHRcdFx0XHRcdGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyID4gYSB7XG5cdFx0XHRcdFx0Y29sb3I6IHZhcigtLUZvcm0taXRlbS1mb250Q29sb3IpO1xuXHRcdFx0XHRcdHBhZGRpbmc6IDJweCA1cHg7XG5cdFx0XHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIgPiBhOmhvdmVyIHtcblx0XHRcdFx0XHRjb2xvcjogdmFyKC0tbGluay1jb2xvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1hY2NlcHRUaXAge1xuXHRcdFx0XHRcdGhlaWdodDogMTIwcHg7XG5cdFx0XHRcdFx0Y29sb3I6ICM5OTk7XG5cdFx0XHRcdFx0Ym9yZGVyOiAycHggZGFzaGVkIHZhcigtLWJvcmRlckNvbG9yKTtcblx0XHRcdFx0XHRib3JkZXItY29sb3I6IHZhcigtLWluZm8pO1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6ICNmM2Y5ZmU7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUmFkaXVzKTtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMTIwcHg7XG5cdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZml4ZWQtc2l6ZSB7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maXhlZC1zaXplIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtT3ZlcmxheSB7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC5hbnRkLUltYWdlcyB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRcdFx0ZmxleC13cmFwOiB3cmFwO1xuXHRcdFx0XHRcdFx0bWFyZ2luOiBjYWxjKHZhcigtLWdhcC14cykgKiAtMSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZXMtaXRlbSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRcdFx0bWFyZ2luOiB2YXIoLS1nYXAteHMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2Uge1xuXHRcdFx0XHRcdFx0Ym9yZGVyOiB2YXIoLS1ib3JkZXJXaWR0aCkgc29saWQgdmFyKC0tYm9yZGVyQ29sb3IpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtLXRodW1iIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRcdHBhZGRpbmc6IHZhcigtLWdhcC14cyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYldyYXAge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtaW1hZ2Uge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS1pbWFnZS0tbG9hZGluZyB7XG5cdFx0XHRcdFx0XHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS0tb3JpZ2luYWwgLmFudGQtSW1hZ2UtaW1hZ2Uge1xuXHRcdFx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdFx0bWF4LWhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRcdFx0bWFyZ2luOiBhdXRvO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWIge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiA2Ljg3NXJlbTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYiA+IGltZyB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0XHRsZWZ0OiA1MCU7XG5cdFx0XHRcdFx0XHR0b3A6IDUwJTtcblx0XHRcdFx0XHRcdG1heC1oZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0XHR3aWR0aDogYXV0bztcblx0XHRcdFx0XHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtaW5mbyB7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiA1cHggMTBweDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLS10aHVtYiAuYW50ZC1JbWFnZS1pbmZvIHtcblx0XHRcdFx0XHRcdHdpZHRoOiA2Ljg3NXJlbTtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tNC0zIHtcblx0XHRcdFx0XHRcdGhlaWdodDogNS4xNTYyNXJlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS0xNi05IHtcblx0XHRcdFx0XHRcdGhlaWdodDogMy44NjcxODc1cmVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLWZpeGVkLXNpemUge1xuXHRcdFx0XHRcdFx0bWluLXdpZHRoOiA2Ljg3NXJlbTtcblx0XHRcdFx0XHRcdG1pbi1oZWlnaHQ6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLWZpeGVkLXNpemUgLmFudGQtSW1hZ2UtdGh1bWIge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZS10aHVtYiA+IGltZyB7XG5cdFx0XHRcdFx0XHR3aWR0aDogYXV0bztcblx0XHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS13LWZ1bGwgPiBpbWcge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGF1dG87XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQje29wdGlvbnM/LnN0eWxlcyB8fCBcIlwifVxuXG5cdFx0XHRcdFx0I3tvcHRpb25zPy5hZGRfc3R5bGVzIHx8IFwiXCJ9XG5cdFx0XHRcdDwvc3R5bGU+XG5cdFx0XHQ8L2hlYWQ+XG5cdFx0XHQ8Ym9keT5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZWVkb3Mgd29ya2Zsb3cgaW5zdGFuY2UtcHJpbnRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2tpbi1ncmVlbiBza2luLWFkbWluLWx0ZVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbnRlbnQtd3JhcHBlclwiPlxuXHRcdFx0XHRcdFx0XHRcdCN7c2hvd1RyYWNlc0J0bn1cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zdGFuY2UtcHJpbnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnN0YW5jZSAje2luc3RhbmNlX3N0eWxlfVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8Zm9ybSBuYW1lPVwiaW5zdGFuY2VGb3JtXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImluc3RhbmNlLWZvcm0gYm94ICN7aW5zdGFuY2VCb3hTdHlsZX1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCN7Zm9ybURlc2NyaXB0aW9uSHRtbH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3gtYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgc3R5bGU9XCJib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2F0dGFjaG1lbnRzLXNlY3Rpb24nPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3thdHRhY2htZW50fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tyZWxhdGVkX2luc3RhbmNlc31cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCN7cmVsYXRlZF9yZWNvcmRzfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCN7Ym9keX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9mb3JtPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQje3RyYWNlfVxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2JvZHk+XG5cdFx0XHQ8c2NyaXB0PiN7b3BlbkZpbGVTY3JpcHR9OyN7b25Mb2FkU2NyaXB0fTsje3Nob3dUcmFjZXNTY3JpcHR9PC9zY3JpcHQ+XG5cdFx0PC9odG1sPlxuXHRcIlwiXCJcblxuXHRyZXR1cm4gaHRtbCIsInZhciBfZ2V0TG9jYWxlLCBfZ2V0UmVxdWlyZWRGaWVsZHMsIF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcywgX2dldFN0YXJ0U3RlcFJlcXVpcmVkRmllbGRzLCBfZ2V0VGVtcGxhdGVEYXRhLCBfZ2V0Vmlld0h0bWwsIGdldExpbmtUZXh0LCBtYXJrZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcblxubWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlID0ge307XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5pbnN0YW5jZV9hdHRhY2htZW50ID0gXCI8dHI+XFxuXHQ8dGQgY2xhc3M9XFxcImlucy1hdHRhY2gtdmlld1xcXCI+XFxuXHRcdDxhIGhyZWY9XFxcInt7aW5zX2F0dGFjaF9kb3dubG9hZF91cmwgX2lkIGFic29sdXRlfX1cXFwiIGNsYXNzPVxcXCJpbnNfYXR0YWNoX2hyZWZcXFwiIHRhcmdldD1cXFwiX3BhcmVudFxcXCIgZGF0YS1uYW1lPVxcXCJ7e3RoaXMubmFtZX19XFxcIiBkYXRhLXR5cGU9XFxcInt7dGhpcy5vcmlnaW5hbC50eXBlfX1cXFwiIGRhdGEtaWQ9XFxcInt7X2lkfX1cXFwiPnt7dGhpcy5uYW1lfX08L2E+XFxuXHQ8L3RkPlxcbjwvdHI+XCI7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5hZlNlbGVjdFVzZXJSZWFkID0gXCI8ZGl2IGNsYXNzPSdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50Jz57e3ZhbHVlfX08L2Rpdj5cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwUmVhZCA9IFwiPGRpdiBjbGFzcz0nZm9ybS1ncm91cCc+XFxuXHR7eyN3aXRoIGdldEZpZWxkIHRoaXMubmFtZX19XFxuXHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cXG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cXG5cdFx0XHRcdFx0PHA+e3t7ZGVzY3JpcHRpb259fX08L3A+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0e3tlbHNlfX1cXG5cdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAndGFibGUnfX1cXG5cdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhbmVsIHBhbmVsLWRlZmF1bHQgc3RlZWRvcy10YWJsZVxcXCI+XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOjBweDtcXFwiPlxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiID5cXG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz0nY29udHJvbC1sYWJlbCc+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XFxcImRlc2NyaXB0aW9uXFxcIj57e3tkZXNjcmlwdGlvbn19fTwvc3Bhbj5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJyZWFkb25seS10YWJsZVxcXCIgc3R5bGU9XFxcInBhZGRpbmc6MHB4O292ZXJmbG93LXg6YXV0bztcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgdHlwZT0ndGFibGUnIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1jb25kZW5zZWQgYXV0b2Zvcm0tdGFibGVcXFwiIHN0eWxlPSdtYXJnaW4tYm90dG9tOjBweDsnIHt7dGhpcy5hdHRzfX0gaWQ9XFxcInt7dGhpcy5jb2RlfX1UYWJsZVxcXCIgbmFtZT1cXFwie3t0aGlzLmNvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e3RoaXMubmFtZX19XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGhlYWQgaWQ9XFxcInt7dGhpcy5uYW1lfX1UaGVhZFxcXCIgbmFtZT1cXFwie3t0aGlzLm5hbWV9fVRoZWFkXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlVGhlYWQgdGhpc319fVxcblx0XHRcdFx0XHRcdFx0XHRcdDwvdGhlYWQ+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PHRib2R5IGlkPVxcXCJ7e3RoaXMubmFtZX19VGJvZHlcXFwiIG5hbWU9XFxcInt7dGhpcy5uYW1lfX1UYm9keVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZUJvZHkgdGhpc319fVxcblx0XHRcdFx0XHRcdFx0XHRcdDwvdGJvZHk+XFxuXHRcdFx0XHRcdFx0XHRcdDwvdGFibGU+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdHt7I2lmIHNob3dMYWJlbH19XFxuXHRcdFx0XHRcdDxsYWJlbD57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHR7eyNpZiBpc1RleHRhcmVhIHRoaXN9fVxcblx0XHRcdFx0XHQ8cCBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L3A+XFxuXHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvZGl2Plxcblx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdHt7L2lmfX1cXG5cdFx0e3svaWZ9fVxcblx0e3svd2l0aH19XFxuPC9kaXY+XCI7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5hZkZvcm1Hcm91cCA9IFwiXFxue3sjd2l0aCBnZXRGaWVsZCB0aGlzLm5hbWV9fVxcblx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VjdGlvbid9fVxcblx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0PGRpdiBjbGFzcz0nc2VjdGlvbiBjYWxsb3V0IGNhbGxvdXQtZGVmYXVsdCc+XFxuXHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tmX2xhYmVsIHRoaXN9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdDxwPnt7e2Rlc2NyaXB0aW9ufX19PC9wPlxcblx0XHRcdFx0PC9kaXY+XFxuICBcdFx0XHRcdDwvZGl2Plxcblx0XHR7e2Vsc2V9fVxcblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxcblx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdCBzdGVlZG9zLXRhYmxlXFxcIj5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCIgc3R5bGU9XFxcInBhZGRpbmc6MHB4O1xcXCI+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCIgPlxcblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cXFwiZGVzY3JpcHRpb25cXFwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInJlYWRvbmx5LXRhYmxlXFxcIiBzdHlsZT1cXFwicGFkZGluZzowcHg7b3ZlcmZsb3cteDphdXRvO1xcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XFxcInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWNvbmRlbnNlZCBhdXRvZm9ybS10YWJsZVxcXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cXFwie3t0aGlzLmNvZGV9fVRhYmxlXFxcIiBuYW1lPVxcXCJ7e3RoaXMuY29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7dGhpcy5uYW1lfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cXFwie3t0aGlzLm5hbWV9fVRoZWFkXFxcIiBuYW1lPVxcXCJ7e3RoaXMubmFtZX19VGhlYWRcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGJvZHkgaWQ9XFxcInt7dGhpcy5uYW1lfX1UYm9keVxcXCIgbmFtZT1cXFwie3t0aGlzLm5hbWV9fVRib2R5XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC90Ym9keT5cXG5cdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2lucHV0J319XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIGRhdGEtcmVxdWlyZWQ9XFxcInt7I2lmIGlzX3JlcXVpcmVkfX10cnVle3svaWZ9fVxcXCI+XFxuXHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0e3sjaWYgaXNfdGV4dGFyZWF9fVxcblx0XHRcdFx0XHRcdFx0PHRleHRhcmVhIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIHt7Z2V0UGVybWlzc2lvbnMgY29kZX19IGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPjwvdGV4dGFyZWE+XFxuXHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdHt7I3VubGVzcyBpc190ZXh0YXJlYX19XFxuXHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0e3svdW5sZXNzfX1cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbnVtYmVyJ319XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJudW1iZXJcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlJ319XFxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXR5cGU9XFxcImRhdGVcXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlVGltZSd9fVxcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS10eXBlPSdkYXRldGltZScgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3Bhc3N3b3JkJ319XFxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJwYXNzd29yZFxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlbGVjdCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c2VsZWN0IG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVxcXCJ7e3ZhbHVlfX1cXFwiPnt7bGFiZWx9fTwvb3B0aW9uPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2VhY2h9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3NlbGVjdD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAncmFkaW8nfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiYWYtcmFkaW8tZ3JvdXBcXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjZWFjaCBvcHRpb25zIHRoaXN9fVxcbiAgICAgICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJyYWRpby1pbmxpbmUgZml4LWluZGVudFxcXCI+PGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiB2YWx1ZT1cXFwie3t2YWx1ZX19XFxcIiBuYW1lPVxcXCJ7ey4uL2NvZGV9fVxcXCIgY2xhc3M9XFxcInJhZGlvLWlubGluZSBmaXgtaW5kZW50XFxcIj4ge3tsYWJlbH19PC9sYWJlbD5cXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cXG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ211bHRpU2VsZWN0J319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImFmLWNoZWNrYm94LWdyb3VwXFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjZWFjaCBvcHRpb25zIHRoaXN9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XFxcIj48aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIHZhbHVlPVxcXCJ7e3ZhbHVlfX1cXFwiIG5hbWU9XFxcInt7Li4vY29kZX19XFxcIiBjbGFzcz1cXFwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcXFwiPiB7e2xhYmVsfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd1cmwnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInVybFxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2VtYWlsJ319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJlbWFpbFxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2NoZWNrYm94J319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImNoZWNrYm94XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIHN0eWxlPVxcXCJ3aWR0aDogMTAwJTtcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgdmFsdWU9XFxcInRydWVcXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBjbGFzcz1cXFwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcXFwiPjwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdHt7L2lmfX1cXG5cdFx0e3svaWZ9fVxcblx0e3svd2l0aH19XCI7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUgPSBmdW5jdGlvbih0ZW1wYWx0ZU5hbWUsIHN0ZWVkb3NEYXRhKSB7XG4gIHZhciB0ZW1wbGF0ZSwgdGVtcGxhdGVDb21waWxlZCwgdGVtcGxhdGVSZW5kZXJGdW5jdGlvbjtcbiAgdGVtcGxhdGUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGVbdGVtcGFsdGVOYW1lXTtcbiAgdGVtcGxhdGVDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodGVtcGxhdGUsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRlbXBsYXRlQ29tcGlsZWQpO1xuICBUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdID0gbmV3IEJsYXplLlRlbXBsYXRlKHRlbXBhbHRlTmFtZSwgdGVtcGxhdGVSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlW3RlbXBhbHRlTmFtZV0uc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgcmV0dXJuIFRlbXBsYXRlW3RlbXBhbHRlTmFtZV0uaGVscGVycyhJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzKTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVJbnN0YW5jZVNpZ25UZXh0ID0gZnVuY3Rpb24oc3RlZWRvc0RhdGEpIHtcbiAgdmFyIGluc3RhbmNlU2lnblRleHRDb21waWxlZCwgaW5zdGFuY2VTaWduVGV4dEh0bWwsIGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbjtcbiAgaW5zdGFuY2VTaWduVGV4dEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9zaWduX3RleHQuaHRtbCcpO1xuICBpbnN0YW5jZVNpZ25UZXh0Q29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGluc3RhbmNlU2lnblRleHRIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24gPSBldmFsKGluc3RhbmNlU2lnblRleHRDb21waWxlZCk7XG4gIFRlbXBsYXRlLmluc3RhbmNlU2lnblRleHQgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbnN0YW5jZVNpZ25UZXh0XCIsIGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmluc3RhbmNlU2lnblRleHQuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlU2lnblRleHQuaGVscGVycyhJbnN0YW5jZVNpZ25UZXh0LmhlbHBlcnMpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUltYWdlU2lnbiA9IGZ1bmN0aW9uKHN0ZWVkb3NEYXRhKSB7XG4gIHZhciBpbWFnZVNpZ25Db21waWxlZCwgaW1hZ2VTaWduSHRtbCwgaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb247XG4gIGltYWdlU2lnbkh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbWFnZV9zaWduLmh0bWwnKTtcbiAgaW1hZ2VTaWduQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGltYWdlU2lnbkh0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uID0gZXZhbChpbWFnZVNpZ25Db21waWxlZCk7XG4gIFRlbXBsYXRlLmltYWdlU2lnbiA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImltYWdlU2lnblwiLCBpbWFnZVNpZ25SZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmltYWdlU2lnbi5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICByZXR1cm4gVGVtcGxhdGUuaW1hZ2VTaWduLmhlbHBlcnMoSW1hZ2VTaWduLmhlbHBlcnMpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZVRyYWNlc0hhbmxkZXIgPSBmdW5jdGlvbihzdGVlZG9zRGF0YSkge1xuICB2YXIgdHJhY2VzSGFubGRlckNvbXBpbGVkLCB0cmFjZXNIYW5sZGVySHRtbCwgdHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uO1xuICB0cmFjZXNIYW5sZGVySHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3RyYWNlc19oYW5kbGVyLmh0bWwnKTtcbiAgdHJhY2VzSGFubGRlckNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0cmFjZXNIYW5sZGVySHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgdHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZXNIYW5sZGVyQ29tcGlsZWQpO1xuICBUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlciA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3RyYWNlc19oYW5kbGVyXCIsIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlci5oZWxwZXJzKFRyYWNlc0hhbmRsZXIuaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdCA9IGZ1bmN0aW9uKHN0ZWVkb3NEYXRhKSB7XG4gIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZlNlbGVjdFVzZXJSZWFkXCIsIHN0ZWVkb3NEYXRhKTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZkZvcm1Hcm91cFwiLCBzdGVlZG9zRGF0YSk7XG4gIH1cbiAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwUmVhZFwiLCBzdGVlZG9zRGF0YSk7XG4gIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlKFwiaW5zdGFuY2VfYXR0YWNobWVudFwiLCB7XG4gICAgICBhYnNvbHV0ZTogc3RlZWRvc0RhdGEuYWJzb2x1dGVcbiAgICB9KTtcbiAgICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduKHN0ZWVkb3NEYXRhKTtcbiAgICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlVHJhY2VzSGFubGRlcihzdGVlZG9zRGF0YSk7XG4gICAgcmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVJbnN0YW5jZVNpZ25UZXh0KHN0ZWVkb3NEYXRhKTtcbiAgfVxufTtcblxuZ2V0TGlua1RleHQgPSBmdW5jdGlvbihpdGVtLCBsYWJlbCwgZGV0YWlsX3VybCkge1xuICBpZiAoZGV0YWlsX3VybCkge1xuICAgIGRldGFpbF91cmwgPSBkZXRhaWxfdXJsLnJlcGxhY2UoXCJ7X2lkfVwiLCBpdGVtLl9pZCk7XG4gICAgaWYgKCEvXmh0dHAocz8pOlxcL1xcLy8udGVzdChkZXRhaWxfdXJsKSkge1xuICAgICAgZGV0YWlsX3VybCA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwoZGV0YWlsX3VybCk7XG4gICAgfVxuICAgIHJldHVybiAnPGEgaHJlZj1cIicgKyBkZXRhaWxfdXJsICsgJ1wiIHRhcmdldD1cIl9ibGFua1wiPicgKyBsYWJlbCArICc8L2E+JztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBmaWVsZCwgbG9jYWxlLCB1dGNPZmZzZXQpIHtcbiAgdmFyIGRhdGUsIGRldGFpbF91cmwsIGUsIGZpZWxkT3B0aW9ucywgaG91cnMsIG1vbnRoLCBuYW1lRmllbGQsIHJlY29yZHMsIHJlcywgc2Vjb25kcywgc2VsZWN0ZWRPcHRpb24sIHNlbGVjdGVkT3B0aW9ucywgc3BsaXRlZFZhbHVlcywgdCwgdDAsIHQxLCB1aVNjaGVtYSwgeWVhcjtcbiAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xKSB7XG4gICAgZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obikge1xuICAgICAgdmFyIGl0ZW1TcGxpdHM7XG4gICAgICBpdGVtU3BsaXRzID0gbi5zcGxpdChcIjpcIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogaXRlbVNwbGl0c1swXSxcbiAgICAgICAgdmFsdWU6IGl0ZW1TcGxpdHNbMV0gfHwgblxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlICdlbWFpbCc6XG4gICAgICB2YWx1ZSA9IHZhbHVlID8gJzxhIGhyZWY9XFwnbWFpbHRvOicgKyB2YWx1ZSArICdcXCc+JyArIHZhbHVlICsgJzwvYT4nIDogJyc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1cmwnOlxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiaHR0cFwiKSA9PT0gMCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFwiPGEgaHJlZj0nXCIgKyBlbmNvZGVVUkkodmFsdWUpICsgXCInIHRhcmdldD0nX2JsYW5rJz5cIiArIHZhbHVlICsgXCI8L2E+XCI7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgICAgIHZhbHVlID0gXCI8YSBocmVmPScnIHRhcmdldD0nX2JsYW5rJz5cIiArIHZhbHVlICsgXCI8L2E+XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gXCI8YSBocmVmPSdodHRwOi8vXCIgKyBlbmNvZGVVUkkodmFsdWUpICsgXCInIHRhcmdldD0nX2JsYW5rJz5cIiArIHZhbHVlICsgXCI8L2E+XCI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdncm91cCc6XG4gICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUuZ2V0UHJvcGVydHkoXCJmdWxsbmFtZVwiKS50b1N0cmluZygpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUuZnVsbG5hbWUgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1c2VyJzpcbiAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLm5hbWUgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYXNzd29yZCc6XG4gICAgICB2YWx1ZSA9ICcqKioqKionO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSAnZmFsc2UnKSB7XG4gICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfeWVzXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiLCB7fSwgbG9jYWxlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT09IDE2KSB7XG4gICAgICAgIHQgPSB2YWx1ZS5zcGxpdChcIlRcIik7XG4gICAgICAgIHQwID0gdFswXS5zcGxpdChcIi1cIik7XG4gICAgICAgIHQxID0gdFsxXS5zcGxpdChcIjpcIik7XG4gICAgICAgIHllYXIgPSB0MFswXTtcbiAgICAgICAgbW9udGggPSB0MFsxXTtcbiAgICAgICAgZGF0ZSA9IHQwWzJdO1xuICAgICAgICBob3VycyA9IHQxWzBdO1xuICAgICAgICBzZWNvbmRzID0gdDFbMV07XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXRlLCBob3Vycywgc2Vjb25kcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdERhdGUodmFsdWUsIHV0Y09mZnNldCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpZiAoZmllbGQuaXNfdGV4dGFyZWEpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWUgPT09IHZhbHVlO1xuICAgICAgfSk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgdmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbXVsdGlTZWxlY3QnOlxuICAgICAgc3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgIHNlbGVjdGVkT3B0aW9ucyA9IGZpZWxkT3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gc3BsaXRlZFZhbHVlcy5pbmRleE9mKGl0ZW0udmFsdWUpID4gLTE7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gc2VsZWN0ZWRPcHRpb25zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgICBpZiAoZmllbGQuaXNfcGVyY2VudCkge1xuICAgICAgICAgIHZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBTdGVlZG9zLm51bWJlclRvU3RyaW5nKHZhbHVlLCBmaWVsZC5kaWdpdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvZGF0YSc6XG4gICAgICBkZXRhaWxfdXJsID0gZmllbGQuZGV0YWlsX3VybDtcbiAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICB2YWx1ZSA9IF8ubWFwKHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldExpbmtUZXh0KGl0ZW0sIGl0ZW1bJ0BsYWJlbCddLCBkZXRhaWxfdXJsKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGdldExpbmtUZXh0KHZhbHVlLCB2YWx1ZVsnQGxhYmVsJ10sIGRldGFpbF91cmwpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gXy5tYXAodmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPiA8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCIgc3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJyArIGl0ZW0gKyAnXCI+PC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+JztcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPiA8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCIgc3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJyArIHZhbHVlICsgJ1wiPjwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICByZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxL2Nmc19maWxlc19maWxlcmVjb3JkP2ZpbHRlcnM9W1tcIl9pZFwiLFwiaW5cIiwgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICddXSZmaWVsZHM9W1wiX2lkXCIsXCJvcmlnaW5hbFwiXScsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlY29yZHMgPSByZXMuZGF0YS5pdGVtcztcbiAgICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICByZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiwge1xuICAgICAgICAgICAgZmlsdGVyczogW1tcIl9pZFwiLCAnaW4nLCB2YWx1ZV1dLFxuICAgICAgICAgICAgZmllbGRzOiBbXCJfaWRcIiwgXCJvcmlnaW5hbFwiXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gXy5tYXAocmVjb3JkcywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHZhciBmaWxlTmFtZSwgZmlsZVByZXZpZXdIdG1sLCBmaWxlVXJsO1xuICAgICAgICAgIGZpbGVOYW1lID0gaXRlbS5vcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIGZpbGVVcmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBpL2ZpbGVzL2ZpbGVzLycgKyBpdGVtLl9pZCk7XG4gICAgICAgICAgZmlsZVByZXZpZXdIdG1sID0gJyc7XG4gICAgICAgICAgaWYgKFtcIi5wZGZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiXS5pbmRleE9mKGZpbGVOYW1lLnNsaWNlKC00KSkgPiAtMSkge1xuICAgICAgICAgICAgZmlsZVByZXZpZXdIdG1sID0gXCImZW5zcDs8YSBocmVmPSdcIiArIGZpbGVVcmwgKyBcIicgdGFyZ2V0PSdfYmxhbmsnIGNsYXNzPSdhbnRkLUxpbmsnPjxzcGFuIGNsYXNzPSdhbnRkLVRwbEZpZWxkJz48c3Bhbj7pooTop4g8L3NwYW4+PC9zcGFuPjwvYT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdj48YSBocmVmPSdcIiArIChmaWxlVXJsICsgJz9kb3dubG9hZD10cnVlJykgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgZmlsZU5hbWUgKyBcIjwvYT4gXCIgKyAoZmlsZVByZXZpZXdIdG1sICE9IG51bGwgPyBmaWxlUHJldmlld0h0bWwgOiB7XG4gICAgICAgICAgICBmaWxlUHJldmlld0h0bWw6ICcnXG4gICAgICAgICAgfSkgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbG9va3VwJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICB1aVNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0KGZpZWxkLnJlZmVyZW5jZV90byk7XG4gICAgICAgICAgbmFtZUZpZWxkID0gKHVpU2NoZW1hICE9IG51bGwgPyB1aVNjaGVtYS5OQU1FX0ZJRUxEX0tFWSA6IHZvaWQgMCkgfHwgJ25hbWUnO1xuICAgICAgICAgIHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvJyArIGZpZWxkLnJlZmVyZW5jZV90byArICc/ZmlsdGVycz1bW1wiJyArIChmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCcpICsgJ1wiLFwiaW5cIiwgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICddXSZmaWVsZHM9W1wiX2lkXCIsXCInICsgbmFtZUZpZWxkICsgJ1wiXScsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlY29yZHMgPSByZXMuZGF0YS5pdGVtcztcbiAgICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICBuYW1lRmllbGQgPSBTdGVlZG9zLmdldE9iamVjdE5hbWVGaWVsZEtleShmaWVsZC5yZWZlcmVuY2VfdG8pO1xuICAgICAgICAgIHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoZmllbGQucmVmZXJlbmNlX3RvLCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbW2ZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJywgJ2luJywgdmFsdWVdXSxcbiAgICAgICAgICAgIGZpZWxkczogW1wiX2lkXCIsIG5hbWVGaWVsZF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IF8ubWFwKHJlY29yZHMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gXCI8YSBocmVmPSdcIiArIChTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBwLy0vJyArIGZpZWxkLnJlZmVyZW5jZV90byArICcvdmlldy8nICsgaXRlbS5faWQpKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyBpdGVtW25hbWVGaWVsZF0gKyBcIjwvYT5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIiAsIFwiKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgdmFsdWUgPSB2YWx1ZSA/IFwiPGRpdiBjbGFzcz1cXFwic3RlZWRvcy1odG1sXFxcIj5cIiArIHZhbHVlICsgXCI8L2Rpdj5cIiA6ICcnO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCA9IGZ1bmN0aW9uKGZpZWxkcywgY29kZSkge1xuICB2YXIgZmllbGQ7XG4gIGZpZWxkID0gZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpO1xuICBpZiAoZmllbGQpIHtcbiAgICBpZiAoZmllbGQubmFtZSkge1xuICAgICAgcmV0dXJuIGZpZWxkLm5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZC5jb2RlO1xuICAgIH1cbiAgfVxufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24gPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICB2YXIgZm9ybSwgZm9ybV9maWVsZHMsIGZvcm1fdmVyc2lvbjtcbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gIGZvcm1fdmVyc2lvbiA9IHt9O1xuICBmb3JtX2ZpZWxkcyA9IFtdO1xuICBpZiAoZm9ybS5jdXJyZW50Ll9pZCA9PT0gaW5zdGFuY2UuZm9ybV92ZXJzaW9uKSB7XG4gICAgZm9ybV92ZXJzaW9uID0gZm9ybS5jdXJyZW50O1xuICB9IGVsc2Uge1xuICAgIGZvcm1fdmVyc2lvbiA9IF8ud2hlcmUoZm9ybS5oaXN0b3J5cywge1xuICAgICAgX2lkOiBpbnN0YW5jZS5mb3JtX3ZlcnNpb25cbiAgICB9KVswXTtcbiAgfVxuICBmb3JtX3ZlcnNpb24uZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpIHtcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIGlmIChmaWVsZC5maWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybV9maWVsZHMucHVzaChmKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICBmaWVsZFsnc2ZpZWxkcyddID0gZmllbGRbJ2ZpZWxkcyddO1xuICAgICAgZGVsZXRlIGZpZWxkWydmaWVsZHMnXTtcbiAgICAgIHJldHVybiBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuICAgIH1cbiAgfSk7XG4gIGZvcm1fdmVyc2lvbi5maWVsZHMgPSBmb3JtX2ZpZWxkcztcbiAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbiA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIHZhciBmbG93LCBmbG93X3ZlcnNpb247XG4gIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKGluc3RhbmNlLmZsb3cpO1xuICBmbG93X3ZlcnNpb24gPSB7fTtcbiAgaWYgKGZsb3cuY3VycmVudC5faWQgPT09IGluc3RhbmNlLmZsb3dfdmVyc2lvbikge1xuICAgIGZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudDtcbiAgfSBlbHNlIHtcbiAgICBmbG93X3ZlcnNpb24gPSBfLndoZXJlKGZsb3cuaGlzdG9yeXMsIHtcbiAgICAgIF9pZDogaW5zdGFuY2UuZmxvd192ZXJzaW9uXG4gICAgfSlbMF07XG4gIH1cbiAgcmV0dXJuIGZsb3dfdmVyc2lvbjtcbn07XG5cbl9nZXRWaWV3SHRtbCA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHZpZXdIdG1sO1xuICB2aWV3SHRtbCA9IEFzc2V0cy5nZXRUZXh0KHBhdGgpO1xuICBpZiAodmlld0h0bWwpIHtcbiAgICB2aWV3SHRtbCA9IHZpZXdIdG1sLnJlcGxhY2UoLzx0ZW1wbGF0ZVtcXHdcXHNcXFwiXFw9J10rPi9pLCBcIlwiKS5yZXBsYWNlKC88XFwvdGVtcGxhdGU+L2ksIFwiXCIpO1xuICB9XG4gIHJldHVybiB2aWV3SHRtbDtcbn07XG5cbl9nZXRMb2NhbGUgPSBmdW5jdGlvbih1c2VyKSB7XG4gIHZhciBsb2NhbGUsIHJlZiwgcmVmMTtcbiAgaWYgKCh1c2VyICE9IG51bGwgPyAocmVmID0gdXNlci5sb2NhbGUpICE9IG51bGwgPyByZWYudG9Mb2NhbGVMb3dlckNhc2UoKSA6IHZvaWQgMCA6IHZvaWQgMCkgPT09ICd6aC1jbicpIHtcbiAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gIH0gZWxzZSBpZiAoKHVzZXIgIT0gbnVsbCA/IChyZWYxID0gdXNlci5sb2NhbGUpICE9IG51bGwgPyByZWYxLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB2b2lkIDAgOiB2b2lkIDApID09PSAnZW4tdXMnKSB7XG4gICAgbG9jYWxlID0gXCJlblwiO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgfVxuICByZXR1cm4gbG9jYWxlO1xufTtcblxuX2dldFJlcXVpcmVkRmllbGRzID0gZnVuY3Rpb24oZmllbGRzLCByZXYpIHtcbiAgaWYgKCFyZXYpIHtcbiAgICByZXYgPSBbXTtcbiAgfVxuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCkge1xuICAgIGlmIChmaWVsZC50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgIHJldHVybiBfZ2V0UmVxdWlyZWRGaWVsZHMoZmllbGQuZmllbGRzLCByZXYpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWVsZC5pc19yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gcmV2LnB1c2goZmllbGQuY29kZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldjtcbn07XG5cbl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgc3RlcHMpIHtcbiAgdmFyIGVkaXRhYmxlQ29kZSwgc3RhcnRTdGVwO1xuICBzdGFydFN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcF90eXBlXCIsIFwic3RhcnRcIik7XG4gIGVkaXRhYmxlQ29kZSA9IFtdO1xuICBfLmtleXMoc3RhcnRTdGVwLnBlcm1pc3Npb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChzdGFydFN0ZXAucGVybWlzc2lvbnNba2V5XSA9PT0gJ2VkaXRhYmxlJykge1xuICAgICAgcmV0dXJuIGVkaXRhYmxlQ29kZS5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGVkaXRhYmxlQ29kZTtcbn07XG5cbl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgc3RlcHMpIHtcbiAgdmFyIGVkaXRhYmxlQ29kZSwgcmVxdWlyZWRGaWVsZHM7XG4gIHJlcXVpcmVkRmllbGRzID0gX2dldFJlcXVpcmVkRmllbGRzKGZpZWxkcyk7XG4gIGVkaXRhYmxlQ29kZSA9IF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHN0ZXBzKTtcbiAgcmV0dXJuIF8uaW50ZXJzZWN0aW9uKHJlcXVpcmVkRmllbGRzLCBlZGl0YWJsZUNvZGUpO1xufTtcblxuX2dldFRlbXBsYXRlRGF0YSA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgZmxvdywgZm9ybSwgZm9ybV92ZXJzaW9uLCBsb2NhbGUsIHN0ZWVkb3NEYXRhO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgZm9ybV92ZXJzaW9uID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKGluc3RhbmNlKTtcbiAgfVxuICBsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpO1xuICBzdGVlZG9zRGF0YSA9IHt9O1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgc3RlZWRvc0RhdGEgPSBfLmNsb25lKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKSk7XG4gICAgc3RlZWRvc0RhdGEuaW5zbmFtZSA9IGluc3RhbmNlLm5hbWU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX2ZpbmFsX2RlY2lzaW9uID0gaW5zdGFuY2UuaW5zX2ZpbmFsX2RlY2lzaW9uO1xuICAgIHN0ZWVkb3NEYXRhLmluc19jb2RlID0gaW5zdGFuY2UuY29kZTtcbiAgICBzdGVlZG9zRGF0YS5pbnNfaXNfYXJjaGl2ZWQgPSBpbnN0YW5jZS5pc19hcmNoaXZlZDtcbiAgICBzdGVlZG9zRGF0YS5pbnNfaXNfZGVsZXRlZCA9IGluc3RhbmNlLmluc19pc19kZWxldGVkO1xuICAgIHN0ZWVkb3NEYXRhLmFwcGxpY2FudF9uYW1lID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWU7XG4gICAgc3RlZWRvc0RhdGEuYXBwbGljYW50Q29udGV4dCA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lO1xuICB9XG4gIHN0ZWVkb3NEYXRhLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbiA9IGZvcm1fdmVyc2lvbjtcbiAgc3RlZWRvc0RhdGEubG9jYWxlID0gbG9jYWxlO1xuICBzdGVlZG9zRGF0YS51dGNPZmZzZXQgPSB1c2VyLnV0Y09mZnNldDtcbiAgc3RlZWRvc0RhdGEuc3BhY2UgPSBpbnN0YW5jZS5zcGFjZTtcbiAgc3RlZWRvc0RhdGEuc2Vzc2lvblVzZXJJZCA9IHVzZXIuX2lkO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApIHtcbiAgICAgIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpbnN0YW5jZS5mb3JtXG4gICAgICB9KTtcbiAgICAgIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpbnN0YW5jZS5mbG93XG4gICAgICB9KTtcbiAgICAgIHN0ZWVkb3NEYXRhLnN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzID0gX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzKGZvcm0uY3VycmVudC5maWVsZHMsIGZsb3cuY3VycmVudC5zdGVwcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGVlZG9zRGF0YTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlID0gZnVuY3Rpb24oZGF0ZSwgdXRjT2Zmc2V0KSB7XG4gIHZhciBwYXNzaW5nO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgcGFzc2luZyA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHBhc3NpbmcgPSB0cnVlO1xuICB9XG4gIGlmICghdXRjT2Zmc2V0ICYmIHV0Y09mZnNldCAhPT0gMCkge1xuICAgIHV0Y09mZnNldCA9IDg7XG4gIH1cbiAgcmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0LCBwYXNzaW5nKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tXCIpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgaW5zdGFuY2VDb21waWxlZCwgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbiwgaW5zdGFuY2VUZW1wbGF0ZSwgc3RlZWRvc0RhdGE7XG4gIHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICBzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5hYnNvbHV0ZSA6IHZvaWQgMCkge1xuICAgIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gdHJ1ZTtcbiAgfVxuICBpbnN0YW5jZVRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlLCBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRlbXBsYXRlTmFtZSA6IHZvaWQgMCk7XG4gIGluc3RhbmNlVGVtcGxhdGUgPSBpbnN0YW5jZVRlbXBsYXRlLnJlcGxhY2UoL2FmU2VsZWN0VXNlci9nLCBcImFmU2VsZWN0VXNlclJlYWRcIik7XG4gIGlmICghKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApKSB7XG4gICAgaW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGUucmVwbGFjZSgvYWZGb3JtR3JvdXAvZywgXCJhZkZvcm1Hcm91cFJlYWRcIik7XG4gIH1cbiAgaW5zdGFuY2VDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW5zdGFuY2VUZW1wbGF0ZSwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VDb21waWxlZCk7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbnN0YW5jZV9yZWFkb25seV92aWV3XCIsIGluc3RhbmNlUmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuaGVscGVycyhJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzKTtcbiAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluaXQoc3RlZWRvc0RhdGEpO1xuICBib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldywgc3RlZWRvc0RhdGEpO1xuICByZXR1cm4gXCI8ZGl2IGlkPSdpbnN0YW5jZWZvcm0nID5cXG5cdFwiICsgYm9keSArIFwiXFxuPC9kaXY+XCI7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgZm9ybSwgc3RlZWRvc0RhdGEsIHRyYWNlQ29tcGlsZWQsIHRyYWNlUmVuZGVyRnVuY3Rpb24sIHRyYWNlc0h0bWw7XG4gIHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpO1xuICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcbiAgaWYgKGZvcm0uaW5zdGFuY2Vfc3R5bGUgPT09IFwidGFibGVcIiB8fCAob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50ZW1wbGF0ZU5hbWUgOiB2b2lkIDApID09PSBcInRhYmxlXCIpIHtcbiAgICB0cmFjZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX3RhYmxlLmh0bWwnKTtcbiAgfSBlbHNlIHtcbiAgICB0cmFjZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzLmh0bWwnKTtcbiAgfVxuICB0cmFjZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0cmFjZXNIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICB0cmFjZVJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZUNvbXBpbGVkKTtcbiAgVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInRyYWNlX3JlYWRvbmx5X3ZpZXdcIiwgdHJhY2VSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldy5oZWxwZXJzKFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMpO1xuICBib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldywgaW5zdGFuY2UudHJhY2VzKTtcbiAgcmV0dXJuIGJvZHk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0QXR0YWNobWVudFZpZXcgPSBmdW5jdGlvbih1c2VyLCBzcGFjZSwgaW5zdGFuY2UpIHtcbiAgdmFyIGF0dGFjaG1lbnRDb21waWxlZCwgYXR0YWNobWVudEh0bWwsIGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbiwgYm9keSwgc3RlZWRvc0RhdGE7XG4gIHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpO1xuICBhdHRhY2htZW50SHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2luc3RhbmNlX2F0dGFjaG1lbnRzLmh0bWwnKTtcbiAgYXR0YWNobWVudENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShhdHRhY2htZW50SHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgYXR0YWNobWVudFJlbmRlckZ1bmN0aW9uID0gZXZhbChhdHRhY2htZW50Q29tcGlsZWQpO1xuICBUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiYXR0YWNobWVudHNfcmVhZG9ubHlfdmlld1wiLCBhdHRhY2htZW50UmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5hdHRhY2htZW50c19yZWFkb25seV92aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcuaGVscGVycyhJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzKTtcbiAgYm9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcpO1xuICByZXR1cm4gYm9keTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgcmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkLCByZWxhdGVkSW5zdGFuY2VzSHRtbCwgcmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uLCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFic29sdXRlIDogdm9pZCAwKSB7XG4gICAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuICB9XG4gIHJlbGF0ZWRJbnN0YW5jZXNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvcmVsYXRlZF9pbnN0YW5jZXMuaHRtbCcpO1xuICByZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRJbnN0YW5jZXNIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICByZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24gPSBldmFsKHJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCk7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX2luc3RhbmNlc192aWV3XCIsIHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5oZWxwZXJzKFJlbGF0ZWRJbnN0YW5jZXMuaGVscGVycyk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LCBzdGVlZG9zRGF0YSk7XG4gIHJldHVybiBib2R5O1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRSZWNvcmRzVmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgYm9keSwgcmVsYXRlZFJlY29yZHNDb21waWxlZCwgcmVsYXRlZFJlY29yZHNIdG1sLCByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uLCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFic29sdXRlIDogdm9pZCAwKSB7XG4gICAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuICB9XG4gIHJlbGF0ZWRSZWNvcmRzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3JlbGF0ZWRfcmVjb3Jkcy5odG1sJyk7XG4gIHJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRSZWNvcmRzSHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgcmVsYXRlZFJlY29yZHNSZW5kZXJGdW5jdGlvbiA9IGV2YWwocmVsYXRlZFJlY29yZHNDb21waWxlZCk7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwicmVsYXRlZF9yZWNvcmRzX3ZpZXdcIiwgcmVsYXRlZFJlY29yZHNSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LmhlbHBlcnMoUmVsYXRlZFJlY29yZHMuaGVscGVycyk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldywgc3RlZWRvc0RhdGEpO1xuICByZXR1cm4gYm9keTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRPbkxvYWRTY3JpcHQgPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICB2YXIgZm9ybV9zY3JpcHQsIGZvcm1fdmVyc2lvbjtcbiAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbik7XG4gIGZvcm1fc2NyaXB0ID0gZm9ybV92ZXJzaW9uLmZvcm1fc2NyaXB0O1xuICBpZiAoZm9ybV9zY3JpcHQgJiYgZm9ybV9zY3JpcHQucmVwbGFjZSgvXFxuL2csIFwiXCIpLnJlcGxhY2UoL1xccy9nLCBcIlwiKS5sZW5ndGggPiAwKSB7XG4gICAgZm9ybV9zY3JpcHQgPSBcIkNvcmVGb3JtID0ge307Q29yZUZvcm0uaW5zdGFuY2Vmb3JtID0ge307XCIgKyBmb3JtX3NjcmlwdDtcbiAgICByZXR1cm4gZm9ybV9zY3JpcHQgKz0gXCI7aWYoQ29yZUZvcm0uZm9ybV9PbkxvYWQpe3dpbmRvdy5vbmxvYWQgPSBDb3JlRm9ybS5mb3JtX09uTG9hZCgpO31cIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZm9ybV9zY3JpcHQgPSBcIlwiO1xuICB9XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBhbGxDc3NMaW5rLCBhdHRhY2htZW50LCBib2R5LCBjcmVhdG9yU2VydmljZSwgY3NzSHJlZiwgZm9ybSwgZm9ybURlc2NyaXB0aW9uLCBmb3JtRGVzY3JpcHRpb25IdG1sLCBodG1sLCBpbnNfcmVjb3JkX2lkcywgaW5zdGFuY2VCb3hTdHlsZSwgaW5zdGFuY2Vfc3R5bGUsIGpxSHJlZiwgbG9jYWxlLCBvbkxvYWRTY3JpcHQsIG9wZW5GaWxlU2NyaXB0LCByZWYsIHJlZjEsIHJlbGF0ZWRfaW5zdGFuY2VzLCByZWxhdGVkX3JlY29yZHMsIHNob3dUcmFjZXNCdG4sIHNob3dUcmFjZXNTY3JpcHQsIHRyYWNlLCB0cmFjZUNoZWNrLCB3aWR0aDtcbiAgYm9keSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZVZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgb25Mb2FkU2NyaXB0ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldE9uTG9hZFNjcmlwdChpbnN0YW5jZSk7XG4gIGNyZWF0b3JTZXJ2aWNlID0gKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53ZWJzZXJ2aWNlcykgIT0gbnVsbCA/IChyZWYxID0gcmVmLmNyZWF0b3IpICE9IG51bGwgPyByZWYxLnVybCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgaW5zX3JlY29yZF9pZHMgPSBpbnN0YW5jZS5yZWNvcmRfaWRzO1xuICBsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpO1xuICBvcGVuRmlsZVNjcmlwdCA9IFwiaWYod2luZG93LmlzTm9kZSAmJiBpc05vZGUoKSl7XFxuXHRhdHRhY2hzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcXFwiaW5zX2F0dGFjaF9ocmVmXFxcIik7XFxuXHRmb3IodmFyIGkgPSAwOyBpIDwgYXR0YWNocy5sZW5ndGg7IGkrKyl7XFxuXHRcdGF0dGFjaCA9IGF0dGFjaHNbaV07XFxuXHRcdGF0dGFjaC5hZGRFdmVudExpc3RlbmVyKFxcXCJjbGlja1xcXCIsIGZ1bmN0aW9uKGUpe1xcblx0XHRcdGlmKGlzSW1hZ2UodGhpcy5kYXRhc2V0LnR5cGUpIHx8IGlzSHRtbCh0aGlzLmRhdGFzZXQudHlwZSkpe1xcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xcblx0XHRcdFx0b3BlbldpbmRvdyhcXFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvXFxcIiArIHRoaXMuZGF0YXNldC5pZCk7XFxuXHRcdFx0fWVsc2UgaWYobndfY29yZS5jYW5PcGVuRmlsZSh0aGlzLmRhdGFzZXQubmFtZSkpe1xcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xcblx0XHRcdFx0bndfY29yZS5vcGVuRmlsZSh0aGlzLmhyZWYsIHRoaXMuZGF0YXNldC5uYW1lKVxcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxufVxcblxcbnZhciBmbG93ID0gXFxcIlwiICsgaW5zdGFuY2UuZmxvdyArIFwiXFxcIjtcXG52YXIgc3BhY2UgPSBcXFwiXCIgKyBpbnN0YW5jZS5zcGFjZSArIFwiXFxcIjtcXG5cXG5mdW5jdGlvbiBnZXRDb29raWUobmFtZSl7XFxuXHRsZXQgcGF0dGVybiA9IFJlZ0V4cChuYW1lICsgXFxcIj0uW147XSpcXFwiKVxcblx0bGV0IG1hdGNoZWQgPSBkb2N1bWVudC5jb29raWUubWF0Y2gocGF0dGVybilcXG5cdGlmKG1hdGNoZWQpe1xcblx0XHRsZXQgY29va2llID0gbWF0Y2hlZFswXS5zcGxpdCgnPScpXFxuXHRcdHJldHVybiBjb29raWVbMV1cXG5cdH1cXG5cdHJldHVybiAnJ1xcbn1cXG5cXG52YXIgcmVjb3JkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXFxcImlucy1yZWxhdGVkLXJlY29yZHNcXFwiKTtcXG5mb3IodmFyIGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKyl7XFxuXHRcdHZhciByZWNvcmQgPSByZWNvcmRzW2ldO1xcblx0XHRyZWNvcmQuYWRkRXZlbnRMaXN0ZW5lcihcXFwiY2xpY2tcXFwiLCBmdW5jdGlvbihlKXtcXG5cdFx0XHR2YXIgY3JlYXRvclNlcnZpY2UgPSBcXFwiXCIgKyBjcmVhdG9yU2VydmljZSArIFwiXFxcIlxcblx0XHRcdHZhciBpbnNfcmVjb3JkX2lkcyA9IFwiICsgKEpTT04uc3RyaW5naWZ5KGluc19yZWNvcmRfaWRzKSkgKyBcIlxcblx0XHRcdGlmKGNyZWF0b3JTZXJ2aWNlICYmIGluc19yZWNvcmRfaWRzICYmIGluc19yZWNvcmRfaWRzLmxlbmd0aCA+IDApe1xcblx0XHRcdFx0dmFyIG9iamNldE5hbWUgPSBpbnNfcmVjb3JkX2lkc1swXS5vXFxuXHRcdFx0XHR2YXIgaWQgPSBpbnNfcmVjb3JkX2lkc1swXS5pZHNbMF1cXG5cdFx0XHRcdHZhciB1b2JqID0ge307XFxuXHRcdFx0XHR1b2JqW1xcXCJYLVVzZXItSWRcXFwiXSA9IGdldENvb2tpZShcXFwiWC1Vc2VyLUlkXFxcIik7XFxuXHRcdFx0XHR1b2JqW1xcXCJYLUF1dGgtVG9rZW5cXFwiXSA9IGdldENvb2tpZShcXFwiWC1BdXRoLVRva2VuXFxcIik7XFxuXHRcdFx0XHRyZWRpcmVjdFVybCA9IGNyZWF0b3JTZXJ2aWNlICsgXFxcImFwcC8tL1xcXCIgKyBvYmpjZXROYW1lICsgXFxcIi92aWV3L1xcXCIgKyBpZCArIFxcXCI/XFxcIiArICQucGFyYW0odW9iaik7XFxuXHRcdFx0XHRvcGVuV2luZG93KHJlZGlyZWN0VXJsKTtcXG5cdFx0XHR9XFxuXHRcdH0pO1xcblx0fVxcblwiO1xuICBpZiAoIVN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuICAgIGlmICgoZm9ybSAhPSBudWxsID8gZm9ybS5pbnN0YW5jZV9zdHlsZSA6IHZvaWQgMCkgPT09ICd0YWJsZScpIHtcbiAgICAgIGluc3RhbmNlX3N0eWxlID0gXCJpbnN0YW5jZS10YWJsZVwiO1xuICAgIH1cbiAgfVxuICBpZiAoKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMudGVtcGxhdGVOYW1lIDogdm9pZCAwKSA9PT0gJ3RhYmxlJykge1xuICAgIGluc3RhbmNlX3N0eWxlID0gXCJpbnN0YW5jZS10YWJsZVwiO1xuICB9XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmluc3RhbmNlX3N0eWxlIDogdm9pZCAwKSB7XG4gICAgaW5zdGFuY2Vfc3R5bGUgPSBvcHRpb25zLmluc3RhbmNlX3N0eWxlO1xuICB9XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnNob3dUcmFjZSA9PT0gdHJ1ZSkge1xuICAgIHRyYWNlID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFRyYWNlc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICB0cmFjZSA9IFwiXCI7XG4gIH1cbiAgaW5zdGFuY2VCb3hTdHlsZSA9IFwiXCI7XG4gIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5maW5hbF9kZWNpc2lvbikge1xuICAgIGlmIChpbnN0YW5jZS5maW5hbF9kZWNpc2lvbiA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICBpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtc3VjY2Vzc1wiO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuZmluYWxfZGVjaXNpb24gPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgaW5zdGFuY2VCb3hTdHlsZSA9IFwiYm94LWRhbmdlclwiO1xuICAgIH1cbiAgfVxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5zaG93QXR0YWNobWVudHMgPT09IHRydWUpIHtcbiAgICBhdHRhY2htZW50ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEF0dGFjaG1lbnRWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gICAgcmVsYXRlZF9pbnN0YW5jZXMgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZEluc3RhbmNlc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgICByZWxhdGVkX3JlY29yZHMgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZFJlY29yZHNWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYXR0YWNobWVudCA9IFwiXCI7XG4gICAgcmVsYXRlZF9pbnN0YW5jZXMgPSBcIlwiO1xuICAgIHJlbGF0ZWRfcmVjb3JkcyA9IFwiXCI7XG4gIH1cbiAgd2lkdGggPSBcIjk2MHB4XCI7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLndpZHRoIDogdm9pZCAwKSB7XG4gICAgd2lkdGggPSBcIlwiO1xuICB9XG4gIGNzc0hyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJzdGVlZG9zLWNzc1wiKTtcbiAganFIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwid2Vic2l0ZS9saWJzL2pxdWVyeS5taW4uanNcIik7XG4gIGFsbENzc0xpbmsgPSBcIjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGNsYXNzPVxcXCJfX21ldGVvci1jc3NfX1xcXCIgaHJlZj1cXFwiXCIgKyBjc3NIcmVmICsgXCJcXFwiPlwiO1xuICB0cmFjZUNoZWNrID0gXCJcIjtcbiAgaWYgKCFfLmlzRW1wdHkodHJhY2UpKSB7XG4gICAgdHJhY2VDaGVjayA9IFwiY2hlY2tlZFwiO1xuICB9XG4gIGlmICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50YWdnZXIgOiB2b2lkIDApID09PSAnZW1haWwnIHx8IChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmVkaXRhYmxlIDogdm9pZCAwKSkge1xuICAgIHNob3dUcmFjZXNCdG4gPSBcIlwiO1xuICB9IGVsc2Uge1xuICAgIHNob3dUcmFjZXNCdG4gPSBcIjxkaXYgY2xhc3M9XFxcIm5hdmlnYXRpb24tYmFyIGJ0bi1ncm91cCBuby1wcmludFxcXCIgc3R5bGU9XFxcIm1pbi13aWR0aDogNjAwcHg7IHotaW5kZXg6IDk5OTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcXFwiPlxcblx0PGRpdiBjbGFzcz1cXFwicHJpbnQtdG9vbFxcXCI+XFxuXHRcdDxsYWJlbCBjbGFzcz1cXFwiY2J4LWxhYmVsXFxcIj48aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGNsYXNzPVxcXCJjYngtcHJpbnQgY2J4LXByaW50LWF0dGFjaG1lbnRzXFxcIiBpZD1cXFwiY2J4LXByaW50LWF0dGFjaG1lbnRzXFxcIiBjaGVja2VkPVxcXCJjaGVja2VkXFxcIj48c3Bhbj5cIiArIChUQVBpMThuLl9fKCdpbnN0YW5jZV9hdHRhY2htZW50Jywge30sIGxvY2FsZSkpICsgXCI8L3NwYW4+PC9sYWJlbD5cXG5cdFx0PGxhYmVsIGNsYXNzPVxcXCJjYngtbGFiZWxcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2xhc3M9XFxcImNieC1wcmludCBjYngtcHJpbnQtdHJhY2VzXFxcIiBpZD1cXFwiY2J4LXByaW50LXRyYWNlc1xcXCIgY2hlY2tlZD1cXFwiXCIgKyB0cmFjZUNoZWNrICsgXCJcXFwiPjxzcGFuPlwiICsgKFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmFsX2hpc3RvcnknLCB7fSwgbG9jYWxlKSkgKyBcIjwvc3Bhbj48L2xhYmVsPlxcblx0PC9kaXY+XFxuPC9kaXY+XCI7XG4gIH1cbiAgc2hvd1RyYWNlc1NjcmlwdCA9IFwiJCggZG9jdW1lbnQgKS5yZWFkeShmdW5jdGlvbigpe1xcblx0dmFyIGIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LXRyYWNlcycpO1xcblx0dmFyIHQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnN0YW5jZS10cmFjZXMnKVswXTtcXG5cdGlmIChiICYmIGIuY2hlY2tlZCAmJiB0KXtcXG5cdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXFxuXHR9IGVsc2UgaWYodCl7XFxuXHRcdHQuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXFxuXHR9XFxuXHRpZihiKXtcXG5cdFx0Yi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcXG5cdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XFxuXHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdFx0XHR9IGVsc2Uge1xcblx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcXG5cdFx0XHR9XFxuXHRcdH0pO1xcblx0fVxcblxcblxcblx0dmFyIGF0dGFjaG1lbnRzQ2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LWF0dGFjaG1lbnRzJyk7XFxuXHR2YXIgYXR0YWNobWVudHNWaWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYXR0YWNobWVudHMtc2VjdGlvbicpWzBdO1xcblx0aWYgKGF0dGFjaG1lbnRzQ2hlY2tib3ggJiYgYXR0YWNobWVudHNDaGVja2JveC5jaGVja2VkICYmIGF0dGFjaG1lbnRzVmlldyl7XFxuXHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXFxuXHR9IGVsc2UgaWYoYXR0YWNobWVudHNWaWV3KXtcXG5cdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xcblx0fVxcblx0aWYoYXR0YWNobWVudHNDaGVja2JveCl7XFxuXHRcdGF0dGFjaG1lbnRzQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oZSl7XFxuXHRcdFx0aWYgKGUudGFyZ2V0LmNoZWNrZWQpe1xcblx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdFx0XHR9IGVsc2Uge1xcblx0XHRcdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxufSk7XFxuXCI7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnN0eWxlcyA6IHZvaWQgMCkge1xuICAgIGFsbENzc0xpbmsgPSBcIlwiO1xuICB9XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICBfaWQ6IGluc3RhbmNlLmZvcm1cbiAgfSk7XG4gIGZvcm1EZXNjcmlwdGlvbkh0bWwgPSBcIlwiO1xuICBpZiAoZm9ybSkge1xuICAgIGZvcm1EZXNjcmlwdGlvbiA9IGZvcm0uZGVzY3JpcHRpb247XG4gICAgaWYgKGZvcm1EZXNjcmlwdGlvbikge1xuICAgICAgZm9ybURlc2NyaXB0aW9uID0gZm9ybURlc2NyaXB0aW9uLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuICAgICAgZm9ybURlc2NyaXB0aW9uSHRtbCA9IFwiPGRpdiBjbGFzcz1cXFwiYm94LWhlYWRlciAgd2l0aC1ib3JkZXIgaW5zdGFuY2UtaGVhZGVyXFxcIj5cXG5cdDxkaXY+XFxuXHRcdFwiICsgZm9ybURlc2NyaXB0aW9uICsgXCJcXG5cdDwvZGl2PlxcbjwvZGl2PlwiO1xuICAgIH1cbiAgfVxuICBodG1sID0gXCI8IURPQ1RZUEUgaHRtbD5cXG48aHRtbD5cXG5cdDxoZWFkPlxcblx0XHQ8bWV0YSBodHRwLWVxdWl2PVxcXCJDb250ZW50LVR5cGVcXFwiIGNvbnRlbnQ9XFxcInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFxcXCIvPlxcblx0XHRcIiArIGFsbENzc0xpbmsgKyBcIlxcblx0XHQ8c2NyaXB0IHNyYz1cXFwiXCIgKyBqcUhyZWYgKyBcIlxcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIj48L3NjcmlwdD5cXG5cdFx0PHNjcmlwdCBzcmM9XFxcIi9qcy9ud19jb3JlLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0Plxcblx0XHRcIiArIChvcHRpb25zLnBsdWdpbnMgfHwgXCJcIikgKyBcIlxcblxcblx0XHQ8c3R5bGU+XFxuXHRcdFx0LnN0ZWVkb3N7XFxuXHRcdFx0XHR3aWR0aDogXCIgKyB3aWR0aCArIFwiO1xcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IGF1dG87XFxuXHRcdFx0XHRtYXJnaW4tcmlnaHQ6IGF1dG87XFxuXHRcdFx0fVxcblxcblx0XHRcdC5pbnN0YW5jZS12aWV3IC5pbnN0YW5jZS1uYW1le1xcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnRcXG5cdFx0XHR9XFxuXHRcdFx0LmJveC10b29sc3tcXG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XFxuXHRcdFx0fVxcblx0XHRcdC5ib3guY29sbGFwc2VkLWJveCAuYm94LWJvZHksLmJveC5jb2xsYXBzZWQtYm94IC5ib3gtZm9vdGVyIHtcXG5cdFx0XHQgIGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdH1cXG5cXG5cdFx0XHRib2R5e1xcblx0XHRcdFx0YmFja2dyb3VuZDogYXp1cmUgIWltcG9ydGFudDtcXG5cdFx0XHR9XFxuXFxuXHRcdFx0Lmluc3RhbmNlLXZpZXcgLmluc3RhbmNlLXRyYWNlc3tcXG5cdFx0XHRcdHBhZGRpbmctbGVmdDogMTVweDtcXG5cdFx0XHRcdHBhZGRpbmctcmlnaHQ6IDE1cHg7XFxuXHRcdFx0fVxcblxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtIHtcXG5cdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1JbWFnZUNvbnRyb2wtYWRkQnRuLWJvcmRlclJhZGl1cyk7XFxuXHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcXG5cdFx0XHRwYWRkaW5nOiB2YXIoLS1nYXAteHMpO1xcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG5cdFx0XHRtYXJnaW4tcmlnaHQ6IHZhcigtLWdhcC1iYXNlKTtcXG5cdFx0XHRtYXJnaW4tYm90dG9tOiB2YXIoLS1nYXAtYmFzZSk7XFxuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblx0XHRcdHdpZHRoOiA3LjVyZW07XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQge1xcblx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1GaWxlQ29udHJvbC1kYW5nZXItY29sb3IpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbSBzdmcuaWNvbi1yZWZyZXNoIHtcXG5cdFx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUge1xcblx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcXG5cdFx0XHRjb2xvcjogdmFyKC0tRmlsZUNvbnRyb2wtZGFuZ2VyLWNvbG9yKTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lID4gc3ZnLmljb24taW1hZ2Uge1xcblx0XHRcdG1hcmdpbi1ib3R0b206IDhweDtcXG5cdFx0XHR3aWR0aDogMjRweDtcXG5cdFx0XHRoZWlnaHQ6IDI0cHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSA+IHNwYW4ge1xcblx0XHRcdG1heC13aWR0aDogMTAwJTtcXG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xcblx0XHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pbWFnZSB7XFxuXHRcdFx0d2lkdGg6IDEwMCU7XFxuXHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0Ym9yZGVyOiBub25lO1xcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcXG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xcblx0XHRcdGNvbG9yOiAjOTk5O1xcblx0XHRcdHRvcDogNXB4O1xcblx0XHRcdHJpZ2h0OiA1cHg7XFxuXHRcdFx0bGluZS1oZWlnaHQ6IDE7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIgPiBzdmcge1xcblx0XHRcdHRvcDogMDtcXG5cdFx0XHR3aWR0aDogMTBweDtcXG5cdFx0XHRoZWlnaHQ6IDEwcHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtSW5mbyB7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXHRcdFx0d2lkdGg6IDExMHB4O1xcblx0XHRcdGhlaWdodDogMTEwcHg7XFxuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcXG5cdFx0XHRhbGlnbi1jb250ZW50OiBjZW50ZXI7XFxuXHRcdFx0ZmxleC13cmFwOiB3cmFwO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUluZm8gPiBwIHtcXG5cdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XFxuXHRcdFx0Zm9udC1zaXplOiAxMnB4O1xcblx0XHRcdG1hcmdpbi1ib3R0b206IDVweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXByb2dyZXNzIHtcXG5cdFx0XHR3aWR0aDogNzBweDtcXG5cdFx0XHRoZWlnaHQ6IDVweDtcXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZWJlYmViO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3NWYWx1ZSB7XFxuXHRcdFx0aGVpZ2h0OiA1cHg7XFxuXHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tSW1hZ2VDb250cm9sLXByb2dyZXNzLWJvcmRlclJhZGl1cyk7XFxuXHRcdFx0ZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0YmFja2dyb3VuZDogdmFyKC0taW5mbyk7XFxuXHRcdFx0bWluLXdpZHRoOiAxMCU7XFxuXHRcdFx0dHJhbnNpdGlvbjogZWFzZS1vdXQgd2lkdGggdmFyKC0tYW5pbWF0aW9uLWR1cmF0aW9uKTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZCAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcXG5cdFx0XHRkaXNwbGF5OiBub25lO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkOmhvdmVyIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZXJyb3JNc2cge1xcblx0XHRcdGNvbG9yOiB2YXIoLS1kYW5nZXIpO1xcblx0XHRcdG1hcmdpbjogNXB4IDAgMDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXVwbG9hZEJ0biB7XFxuXHRcdFx0bWFyZ2luLXRvcDogNXB4O1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcHBlcldyYXBwZXIge1xcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BwZXJXcmFwcGVyIGltZyB7XFxuXHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xcblx0XHRcdG1heC1oZWlnaHQ6IDQwMHB4O1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciB7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xcblx0XHRcdHJpZ2h0OiAwO1xcblx0XHRcdGJvdHRvbTogMDtcXG5cdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcblx0XHRcdGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xcblx0XHRcdGJvcmRlci1yYWRpdXM6IDRweDtcXG5cdFx0XHRtYXJnaW46IDAuNXJlbTtcXG5cdFx0XHRib3gtc2hhZG93OiAwIDAgNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciA+IGEge1xcblx0XHRcdGNvbG9yOiB2YXIoLS1Gb3JtLWl0ZW0tZm9udENvbG9yKTtcXG5cdFx0XHRwYWRkaW5nOiAycHggNXB4O1xcblx0XHRcdGN1cnNvcjogcG9pbnRlcjtcXG5cdFx0XHRmb250LXNpemU6IDE4cHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyID4gYTpob3ZlciB7XFxuXHRcdFx0Y29sb3I6IHZhcigtLWxpbmstY29sb3IpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtYWNjZXB0VGlwIHtcXG5cdFx0XHRoZWlnaHQ6IDEyMHB4O1xcblx0XHRcdGNvbG9yOiAjOTk5O1xcblx0XHRcdGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1ib3JkZXJDb2xvcik7XFxuXHRcdFx0Ym9yZGVyLWNvbG9yOiB2YXIoLS1pbmZvKTtcXG5cdFx0XHRiYWNrZ3JvdW5kOiAjZjNmOWZlO1xcblx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlclJhZGl1cyk7XFxuXHRcdFx0bGluZS1oZWlnaHQ6IDEyMHB4O1xcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpeGVkLXNpemUge1xcblx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdGhlaWdodDogMTAwJTtcXG5cdFx0XHRwYWRkaW5nOiAwO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbU92ZXJsYXkge1xcblx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdGhlaWdodDogMTAwJTtcXG5cdFx0XHR9XFxuXFxuXHRcdFx0LmFudGQtSW1hZ2VzIHtcXG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XFxuXHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XFxuXHRcdFx0XHRtYXJnaW46IGNhbGModmFyKC0tZ2FwLXhzKSAqIC0xKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlcy1pdGVtIHtcXG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XFxuXHRcdFx0XHRtYXJnaW46IHZhcigtLWdhcC14cyk7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZSB7XFxuXHRcdFx0XHRib3JkZXI6IHZhcigtLWJvcmRlcldpZHRoKSBzb2xpZCB2YXIoLS1ib3JkZXJDb2xvcik7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIge1xcblx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcblx0XHRcdFx0cGFkZGluZzogdmFyKC0tZ2FwLXhzKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iV3JhcCB7XFxuXHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS1pbWFnZSB7XFxuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlLS1sb2FkaW5nIHtcXG5cdFx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLS1vcmlnaW5hbCAuYW50ZC1JbWFnZS1pbWFnZSB7XFxuXHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XFxuXHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xcblx0XHRcdFx0d2lkdGg6IGF1dG87XFxuXHRcdFx0XHRtYXJnaW46IGF1dG87XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYiB7XFxuXHRcdFx0XHR3aWR0aDogNi44NzVyZW07XFxuXHRcdFx0XHRoZWlnaHQ6IDYuODc1cmVtO1xcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcXG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cdFx0XHRcdGxlZnQ6IDUwJTtcXG5cdFx0XHRcdHRvcDogNTAlO1xcblx0XHRcdFx0bWF4LWhlaWdodDogMTAwJTtcXG5cdFx0XHRcdHdpZHRoOiBhdXRvO1xcblx0XHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS1pbmZvIHtcXG5cdFx0XHRcdHBhZGRpbmc6IDVweCAxMHB4O1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtLXRodW1iIC5hbnRkLUltYWdlLWluZm8ge1xcblx0XHRcdFx0d2lkdGg6IDYuODc1cmVtO1xcblx0XHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS00LTMge1xcblx0XHRcdFx0aGVpZ2h0OiA1LjE1NjI1cmVtO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTE2LTkge1xcblx0XHRcdFx0aGVpZ2h0OiAzLjg2NzE4NzVyZW07XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSB7XFxuXHRcdFx0XHRtaW4td2lkdGg6IDYuODc1cmVtO1xcblx0XHRcdFx0bWluLWhlaWdodDogNi44NzVyZW07XFxuXHRcdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0XHRoZWlnaHQ6IDEwMCU7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZS10aHVtYiB7XFxuXHRcdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcXG5cdFx0XHRcdHdpZHRoOiBhdXRvO1xcblx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLXctZnVsbCA+IGltZyB7XFxuXHRcdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRcdGhlaWdodDogYXV0bztcXG5cdFx0XHRcdH1cXG5cXG5cdFx0XHRcIiArICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5zdHlsZXMgOiB2b2lkIDApIHx8IFwiXCIpICsgXCJcXG5cXG5cdFx0XHRcIiArICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5hZGRfc3R5bGVzIDogdm9pZCAwKSB8fCBcIlwiKSArIFwiXFxuXHRcdDwvc3R5bGU+XFxuXHQ8L2hlYWQ+XFxuXHQ8Ym9keT5cXG5cdFx0PGRpdiBjbGFzcz1cXFwic3RlZWRvcyB3b3JrZmxvdyBpbnN0YW5jZS1wcmludFxcXCI+XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwic2tpbi1ncmVlbiBza2luLWFkbWluLWx0ZVxcXCI+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJ3cmFwcGVyXFxcIj5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiY29udGVudC13cmFwcGVyXFxcIj5cXG5cdFx0XHRcdFx0XHRcIiArIHNob3dUcmFjZXNCdG4gKyBcIlxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImluc3RhbmNlLXByaW50XFxcIj5cXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImluc3RhbmNlIFwiICsgaW5zdGFuY2Vfc3R5bGUgKyBcIlxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDxmb3JtIG5hbWU9XFxcImluc3RhbmNlRm9ybVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiaW5zdGFuY2UtZm9ybSBib3ggXCIgKyBpbnN0YW5jZUJveFN0eWxlICsgXCJcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyBmb3JtRGVzY3JpcHRpb25IdG1sICsgXCJcXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImJveC1ib2R5XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiY29sLW1kLTEyXFxcIiBzdHlsZT1cXFwiYm94LXNpemluZzogYm9yZGVyLWJveDtcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2F0dGFjaG1lbnRzLXNlY3Rpb24nPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyBhdHRhY2htZW50ICsgXCJcXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiICsgcmVsYXRlZF9pbnN0YW5jZXMgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyByZWxhdGVkX3JlY29yZHMgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiICsgYm9keSArIFwiXFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdDwvZm9ybT5cXG5cdFx0XHRcdFx0XHRcdFx0XCIgKyB0cmFjZSArIFwiXFxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHQ8L2Rpdj5cXG5cdFx0PC9kaXY+XFxuXHQ8L2JvZHk+XFxuXHQ8c2NyaXB0PlwiICsgb3BlbkZpbGVTY3JpcHQgKyBcIjtcIiArIG9uTG9hZFNjcmlwdCArIFwiO1wiICsgc2hvd1RyYWNlc1NjcmlwdCArIFwiPC9zY3JpcHQ+XFxuPC9odG1sPlwiO1xuICByZXR1cm4gaHRtbDtcbn07XG4iLCJUZW1wbGF0ZU1hbmFnZXIgPSB7fTtcblxuZm9ybUlkID0gJ2luc3RhbmNlZm9ybSc7XG5cblxuVGVtcGxhdGVNYW5hZ2VyLmluc3RhbmNlX3RpdGxlID0gKCktPlxuXHRwYWdlVGl0bGUgPSBcIlwiXCJcblx0XHR7e2luc3RhbmNlLm5hbWV9fVxuXHRcIlwiXCJcblxuXHRwYWdlVGl0bGVUckNsYXNzID0gXCJpbnN0YW5jZS1uYW1lXCJcblxuXHRpZiBDb3JlRm9ybT8ucGFnZVRpdGxlRmllbGROYW1lXG5cdFx0cGFnZVRpdGxlID0gXCJcIlwiXG5cdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPVwiI3tDb3JlRm9ybS5wYWdlVGl0bGVGaWVsZE5hbWV9XCIgbGFiZWw9ZmFsc2V9fVxuXHRcdFwiXCJcIlxuXHRcdHBhZ2VUaXRsZVRyQ2xhc3MgPSBcIlwiXG5cblx0aWYgQ29yZUZvcm0/LnBhZ2VUaXRsZVxuXHRcdHBhZ2VUaXRsZSA9IFwiXCJcIlxuXHRcdFx0I3tDb3JlRm9ybS5wYWdlVGl0bGV9XG5cdFx0XCJcIlwiXG5cdFx0cGFnZVRpdGxlVHJDbGFzcyA9IFwiXCJcblxuXHR2YWwgPVxuXHRcdHBhZ2VUaXRsZTogcGFnZVRpdGxlXG5cdFx0cGFnZVRpdGxlVHJDbGFzczogcGFnZVRpdGxlVHJDbGFzc1xuXG5cdHJldHVybiB2YWxcblxuVGVtcGxhdGVNYW5hZ2VyLmhhbmRsZVRhYmxlVGVtcGxhdGUgPSAoaW5zdGFuY2UsIF9leHBvcnQpIC0+XG5cblx0dGVtcGxhdGUgPSBcIlwiXCJcblx0PGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlxuXHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2UtdGl0bGUgZm9ybS10YWJsZSBuby1ib3JkZXIgdGV4dC1hbGlnbi1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlO2Rpc3BsYXk6IGlubGluZS10YWJsZTtcIj5cblx0XHRcdDx0ciBjbGFzcz1cIiN7dGhpcy5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZVRyQ2xhc3N9XCI+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImluc3RhbmNlLXRhYmxlLW5hbWUtdGQgcGFnZS10aXRsZVwiPlxuXHRcdFx0XHRcdCN7dGhpcy5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZX1cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cblx0XHQ8L3RhYmxlPlxuXHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2UtYm9keSBmb3JtLXRhYmxlXCI+XG5cdFx0XHRcdDx0ciBzdHlsZT1cImhlaWdodDowcHhcIj5cblx0XHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XG5cdFx0XHRcdFx0PHRoPjwvdGg+XG5cdFx0XHRcdFx0PHRoIHN0eWxlPSd3aWR0aDogMTYlJz48L3RoPlxuXHRcdFx0XHRcdDx0aD48L3RoPlxuXHRcdFx0XHQ8L3RyPlxuXHRcIlwiXCI7XG5cblx0dGFibGVfZmllbGRzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50YWJsZV9maWVsZHMoaW5zdGFuY2UpXG5cblx0dGFibGVfZmllbGRzICYmIHRhYmxlX2ZpZWxkcy5mb3JFYWNoICh0YWJsZV9maWVsZCktPlxuXG5cdFx0cmVxdWlyZWQgPSBcIlwiXG5cdFx0aWYgIUNvcmVGb3JtPy5wYWdlVGl0bGVGaWVsZE5hbWUgfHwgQ29yZUZvcm0/LnBhZ2VUaXRsZUZpZWxkTmFtZSAhPSB0YWJsZV9maWVsZC5jb2RlXG5cdFx0XHRpZiB0YWJsZV9maWVsZC5pc19yZXF1aXJlZFxuXHRcdFx0XHRyZXF1aXJlZCA9IFwiaXMtcmVxdWlyZWRcIlxuXG5cdFx0XHRpZiBfZXhwb3J0XG5cdFx0XHRcdHJlcXVpcmVkID0gXCJcIjtcblxuXHRcdFx0cHVyZUNvZGUgPSBTdGVlZG9zLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXIodGFibGVfZmllbGQuY29kZSk7XG5cblx0XHRcdGlmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGQodGFibGVfZmllbGQpXG5cdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0XG5cdFx0XHRcdHRlbXBsYXRlICs9IFwiXCJcIlxuXHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlICN7cmVxdWlyZWR9XCI+XG5cdFx0XHRcdFx0XHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIn19XG5cdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCBvcGluaW9uLWZpZWxkIG9waW5pb24tZmllbGQtI3twdXJlQ29kZX0gYXV0b21hdGljXCIgY29sc3BhbiA9IFwiI3t0YWJsZV9maWVsZC50ZF9jb2xzcGFufVwiPlxuXHRcdFx0XHRcdFx0e3s+IGluc3RhbmNlU2lnblRleHQgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIn19XG5cdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZFxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpZiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGVzKHRhYmxlX2ZpZWxkLnR5cGUsICdzZWN0aW9uLHRhYmxlJylcblx0XHRcdFx0XHR0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9zdGFydFxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IFwiXCJcIlxuXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtY2hpbGRmaWVsZCB0ZC1jaGlsZGZpZWxkLSN7cHVyZUNvZGV9XCIgY29sc3BhbiA9IFwiI3t0YWJsZV9maWVsZC50ZF9jb2xzcGFufVwiPlxuXHRcdFx0XHRcdFx0ICAge3s+IGFmRm9ybUdyb3VwIG5hbWU9XCIje3RhYmxlX2ZpZWxkLmNvZGV9XCIgbGFiZWw9ZmFsc2V9fVxuXHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0XHR0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9lbmRcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0XG5cblx0XHRcdFx0XHRpZiBfZXhwb3J0XG5cdFx0XHRcdFx0XHR0aXRsZV9wZXJtaXNzaW9uID0gXCJcIlxuXHRcdFx0XHRcdFx0ZmllbGRfcGVybWlzc2lvbiA9IFwiXCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aXRsZV9wZXJtaXNzaW9uID0gXCJ0aXRsZS1cIiArIHRhYmxlX2ZpZWxkLnBlcm1pc3Npb25cblx0XHRcdFx0XHRcdGZpZWxkX3Blcm1pc3Npb24gPSBcImZpZWxkLVwiICsgdGFibGVfZmllbGQucGVybWlzc2lvblxuXG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC10aXRsZSB0ZC10aXRsZS0je3B1cmVDb2RlfSAje3RpdGxlX3Blcm1pc3Npb259ICN7cmVxdWlyZWR9XCI+XG5cdFx0XHRcdFx0XHRcdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwifX1cblx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCB0ZC1maWVsZC0je3B1cmVDb2RlfSAje2ZpZWxkX3Blcm1pc3Npb259XCIgY29sc3BhbiA9IFwiI3t0YWJsZV9maWVsZC50ZF9jb2xzcGFufVwiPlxuXHRcdFx0XHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIiBsYWJlbD1mYWxzZX19XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZFxuXG5cdHRlbXBsYXRlICs9IFwiXCJcIlxuXHRcdDwvdGFibGU+XG5cblx0XHQ8dGFibGUgY2xhc3M9XCJ0YWJsZS1wYWdlLWZvb3RlciBmb3JtLXRhYmxlIG5vLWJvcmRlclwiPlxuXHRcdFx0PHRyIGNsYXNzPVwiYXBwbGljYW50LXdyYXBwZXJcIj5cblx0XHRcdFx0PHRkIGNsYXNzPVwibm93cmFwXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxuXHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7X3QgXCJpbnN0YW5jZV9pbml0aWF0b3JcIn1977yaPC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS10YWJsZS13cmFwcGVyLXRkIGlubGluZS1sZWZ0Jz5cblx0XHRcdFx0XHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVwiYWZTZWxlY3RVc2VyXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwibm93cmFwXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0ncHVsbC1sZWZ0Jz5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1sZWZ0Jz5cblx0XHRcdFx0XHRcdFx0PGxhYmVsPnt7X3QgXCJpbnN0YW5jZV9zdWJtaXRfZGF0ZVwifX3vvJo8L2xhYmVsPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtcmlnaHQnPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdHt7Zm9ybWF0RGF0ZSBpbnN0YW5jZS5zdWJtaXRfZGF0ZSAne1wiZm9ybWF0XCI6XCJZWVlZLU1NLUREXCJ9J319XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHQ8L3RyPlxuXHRcdDwvdGFibGU+XG5cdDwvZGl2PlxuXHRcIlwiXCJcblx0cmV0dXJuIHRlbXBsYXRlXG5cbiPmraTlpITmqKHmnb/lhaznlKjkuI7vvJppbnN0YW5jZSDnvJbovpHjgIHmn6XnnIvjgIHmiZPljbDjgIHovazlj5Hml7bnlJ/miJDpmYTku7bjgIHlj5HpgIHpgq7ku7Zib2R56YOo5YiGKHRhYmxlIOaooeadvylcbiPlpoLmnpzmnInkv67mlLnvvIzor7fmtYvor5Xnoa7orqTlhbbku5blip/og73mmK/lkKbmraPluLjjgIJcblRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUgPVxuXHRkZWZhdWx0OiAoaW5zdGFuY2UpLT5cblxuXHRcdHRlbXBsYXRlID0gXCJcIlwiXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid2l0aC1ib3JkZXIgY29sLW1kLTEyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnN0YW5jZS1uYW1lXCI+XG5cdFx0XHRcdFx0PGgzIGNsYXNzPVwiYm94LXRpdGxlXCI+I3tUZW1wbGF0ZU1hbmFnZXIuaW5zdGFuY2VfdGl0bGUoKS5wYWdlVGl0bGV9PC9oMz5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhlbHAtYmxvY2tcIj48L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhlbHAtYmxvY2tcIj48L3NwYW4+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdHt7I2VhY2ggc3RlZWRvc19mb3JtLmZpZWxkc319XG5cdFx0XHRcdHt7I2lmIGlzT3BpbmlvbkZpZWxkIHRoaXN9fVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ7eyNpZiB0aGlzLmlzX3dpZGV9fWNvbC1tZC0xMnt7ZWxzZX19Y29sLW1kLTZ7ey9pZn19IGZpZWxkLXt7dGhpcy5jb2RlfX1cIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGF1dG9tYXRpYyBvcGluaW9uLWZpZWxkLXt7dGhpcy5jb2RlfX1cIj5cblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPXRoaXMuY29kZX19PC9sYWJlbD5cblxuXHRcdFx0XHRcdFx0XHR7ez4gaW5zdGFuY2VTaWduVGV4dCBuYW1lPXRoaXMuY29kZX19XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHR7eyNpZiBpbmNsdWRlcyB0aGlzLnR5cGUgJ3NlY3Rpb24sdGFibGUnfX1cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ7eyNpZiB0aGlzLmlzX3dpZGV9fWNvbC1tZC0xMnt7ZWxzZX19Y29sLW1kLTZ7ey9pZn19IGZpZWxkLXt7dGhpcy5jb2RlfX1cIj5cblx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZX19XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdHt7L2lmfX1cblx0XHRcdHt7L2VhY2h9fVxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXBwbGljYW50LXdyYXBwZXIgZm9ybS1ncm91cCBmb3JtLWhvcml6b250YWxcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG5cdFx0XHRcdFx0ICB7e190IFwiaW5zdGFuY2VfaW5pdGlhdG9yXCJ9fSZuYnNwOzpcblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cImFmU2VsZWN0VXNlclwiIGRhdGE9YXBwbGljYW50Q29udGV4dH19XG5cdFx0XHRcdCAgPC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XCJcIlwiXG5cdFx0cmV0dXJuIHRlbXBsYXRlXG5cblx0dGFibGU6IChpbnN0YW5jZSktPlxuXHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuaGFuZGxlVGFibGVUZW1wbGF0ZShpbnN0YW5jZSlcbiNcdHRhYmxlOiAnJydcbiNcdFx0PHRhYmxlIGNsYXNzPVwiYm94LWhlYWRlciAgd2l0aC1ib3JkZXJcIiBzdHlsZT1cIndpZHRoOiAxMDAlO2Rpc3BsYXk6IGlubGluZS10YWJsZTtcIj5cbiNcdFx0XHQ8dHIgY2xhc3M9XCJpbnN0YW5jZS1uYW1lXCI+XG4jXHRcdFx0XHQ8dGQgY2xhc3M9XCJpbnN0YW5jZS10YWJsZS1uYW1lLXRkXCI+XG4jXHRcdFx0XHRcdDxoMyBjbGFzcz1cImJveC10aXRsZVwiPnt7aW5zdGFuY2UubmFtZX19PC9oMz5cbiNcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJoZWxwLWJsb2NrXCI+PC9zcGFuPlxuI1x0XHRcdFx0PC90ZD5cbiNcdFx0XHQ8L3RyPlxuIyAgICAgICAgICAgIDx0ciBjbGFzcz1cImFwcGxpY2FudC13cmFwcGVyXCI+XG4jXHRcdFx0XHQ8dGQgY2xhc3M9XCJpbnN0YW5jZS10YWJsZS13cmFwcGVyLXRkXCI+XG4jXHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e190IFwiaW5zdGFuY2VfaW5pdGlhdG9yXCJ9fSZuYnNwOzo8L2xhYmVsPlxuI1x0XHRcdFx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cImFmU2VsZWN0VXNlclwiIGRhdGE9YXBwbGljYW50Q29udGV4dH19XG4jXHRcdFx0XHQ8L3RkPlxuI1x0XHRcdDwvdHI+XG4jICAgICAgICA8L3RhYmxlPlxuI1x0XHQ8dGFibGUgY2xhc3M9XCJmb3JtLXRhYmxlXCI+XG4jXHRcdCAgICB7eyNlYWNoIHRhYmxlX2ZpZWxkc319XG4jXHRcdFx0XHR7eyNpZiBpc09waW5pb25GaWVsZCB0aGlzfX1cbiNcdFx0XHRcdFx0e3t7dHJfc3RhcnR9fX1cbiNcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC10aXRsZSB7eyNpZiBpc19yZXF1aXJlZH19aXMtcmVxdWlyZWR7ey9pZn19XCI+XG4jXHRcdFx0XHRcdFx0XHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT10aGlzLmNvZGV9fVxuI1x0XHRcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtZmllbGQgb3Bpbmlvbi1maWVsZFwiIGNvbHNwYW4gPSAne3t0ZF9jb2xzcGFufX0nPlxuI1x0XHRcdFx0XHRcdFx0e3s+IGluc3RhbmNlU2lnblRleHQgc3RlcD0oZ2V0T3BpbmlvbkZpZWxkU3RlcE5hbWUgdGhpcykgZGVmYXVsdD0nJ319XG4jXHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0e3t7dHJfZW5kfX19XG4jXHRcdFx0XHR7e2Vsc2V9fVxuI1x0XHRcdFx0XHR7eyNpZiBpbmNsdWRlcyB0aGlzLnR5cGUgJ3NlY3Rpb24sdGFibGUnfX1cbiNcdFx0XHRcdFx0XHR7e3t0cl9zdGFydH19fVxuI1x0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtY2hpbGRmaWVsZFwiIGNvbHNwYW4gPSAne3t0ZF9jb2xzcGFufX0nPlxuI1x0XHRcdFx0XHRcdFx0ICAge3s+IGFmRm9ybUdyb3VwIG5hbWU9dGhpcy5jb2RlIGxhYmVsPWZhbHNlfX1cbiNcdFx0XHRcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0XHRcdFx0e3t7dHJfZW5kfX19XG4jXHRcdFx0XHRcdHt7ZWxzZX19XG4jXHRcdFx0XHRcdFx0e3t7dHJfc3RhcnR9fX1cbiNcdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlIHt7I2lmIGlzX3JlcXVpcmVkfX1pcy1yZXF1aXJlZHt7L2lmfX1cIj5cbiNcdFx0XHRcdFx0XHRcdFx0e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9dGhpcy5jb2RlfX1cbiNcdFx0XHRcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCB7e3Blcm1pc3Npb259fVwiIGNvbHNwYW4gPSAne3t0ZF9jb2xzcGFufX0nPlxuI1x0XHRcdFx0XHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxuI1x0XHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHR7e3t0cl9lbmR9fX1cbiNcdFx0XHRcdFx0e3svaWZ9fVxuI1x0XHRcdFx0e3svaWZ9fVxuI1xuI1x0XHQgICAge3svZWFjaH19XG4jXHRcdDwvdGFibGU+XG4jXHQnJydcblxuVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZUhlbHBzID1cblx0YXBwbGljYW50Q29udGV4dDogLT5cblx0XHRzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZGF0YSA9IHtcblx0XHRcdG5hbWU6ICdpbnNfYXBwbGljYW50Jyxcblx0XHRcdGF0dHM6IHtcblx0XHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0XHRpZDogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0XHRjbGFzczogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sJyxcblx0XHRcdFx0c3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4O3dpZHRoOjE0MHB4O2Rpc3BsYXk6aW5saW5lJ1xuXHRcdFx0fVxuXHRcdH1cbiNcdFx0aWYgbm90IHN0ZWVkb3NfaW5zdGFuY2UgfHwgc3RlZWRvc19pbnN0YW5jZS5zdGF0ZSAhPSBcImRyYWZ0XCJcblx0XHRkYXRhLmF0dHMuZGlzYWJsZWQgPSB0cnVlXG5cdFx0cmV0dXJuIGRhdGE7XG5cbmluc3RhbmNlSWQ6IC0+XG5cdHJldHVybiAnaW5zdGFuY2Vmb3JtJzsjXCJpbnN0YW5jZV9cIiArIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKTtcblxuZm9ybV90eXBlczogLT5cblx0aWYgQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpXG5cdFx0cmV0dXJuICdkaXNhYmxlZCc7XG5cdGVsc2Vcblx0XHRyZXR1cm4gJ21ldGhvZCc7XG5cbnN0ZWVkb3NfZm9ybTogLT5cblx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0cmV0dXJuIGZvcm1fdmVyc2lvblxuXG5pbm5lcnN1YmZvcm1Db250ZXh0OiAob2JqKS0+XG5cdGRvY192YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG5cdG9ialtcInRhYmxlVmFsdWVzXCJdID0gaWYgZG9jX3ZhbHVlcyB0aGVuIGRvY192YWx1ZXNbb2JqLmNvZGVdIGVsc2UgW11cblx0b2JqW1wiZm9ybUlkXCJdID0gZm9ybUlkO1xuXHRyZXR1cm4gb2JqO1xuXG5pbnN0YW5jZTogLT5cblx0U2Vzc2lvbi5nZXQoXCJjaGFuZ2VfZGF0ZVwiKVxuXHRpZiAoU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKVxuXHRcdHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRyZXR1cm4gc3RlZWRvc19pbnN0YW5jZTtcblxuZXF1YWxzOiAoYSwgYikgLT5cblx0cmV0dXJuIChhID09IGIpXG5cbmluY2x1ZGVzOiAoYSwgYikgLT5cblx0cmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcblxuZmllbGRzOiAtPlxuXHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRpZiBmb3JtX3ZlcnNpb25cblx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuXG5kb2NfdmFsdWVzOiAtPlxuXHRXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG5cbmluc3RhbmNlX2JveF9zdHlsZTogLT5cblx0Ym94ID0gU2Vzc2lvbi5nZXQoXCJib3hcIilcblx0aWYgYm94ID09IFwiaW5ib3hcIiB8fCBib3ggPT0gXCJkcmFmdFwiXG5cdFx0anVkZ2UgPSBTZXNzaW9uLmdldChcImp1ZGdlXCIpXG5cdFx0aWYganVkZ2Vcblx0XHRcdGlmIChqdWRnZSA9PSBcImFwcHJvdmVkXCIpXG5cdFx0XHRcdHJldHVybiBcImJveC1zdWNjZXNzXCJcblx0XHRcdGVsc2UgaWYgKGp1ZGdlID09IFwicmVqZWN0ZWRcIilcblx0XHRcdFx0cmV0dXJuIFwiYm94LWRhbmdlclwiXG5cdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRpZiBpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uXG5cdFx0aWYgaW5zLmZpbmFsX2RlY2lzaW9uID09IFwiYXBwcm92ZWRcIlxuXHRcdFx0cmV0dXJuIFwiYm94LXN1Y2Nlc3NcIlxuXHRcdGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PSBcInJlamVjdGVkXCIpXG5cdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblxuXG5UZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUgPSAoaW5zdGFuY2UsIHRlbXBsYXRlTmFtZSkgLT5cblx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoaW5zdGFuY2UuZmxvdyk7XG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXG5cdGlmIHRlbXBsYXRlTmFtZVxuXHRcdGlmIHRlbXBsYXRlTmFtZSA9PSAndGFibGUnXG5cdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSlcblx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS5kZWZhdWx0KGluc3RhbmNlKVxuXG5cdGlmIFNlc3Npb24/LmdldChcImluc3RhbmNlUHJpbnRcIilcblx0XHRpZiBmbG93Py5wcmludF90ZW1wbGF0ZVxuXHRcdFx0cmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5wcmludF90ZW1wbGF0ZSArIFwiPC9kaXY+XCJcblx0XHRlbHNlXG5cdFx0XHRpZiBmbG93Py5pbnN0YW5jZV90ZW1wbGF0ZVxuXHRcdFx0XHRyZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlICsgXCI8L2Rpdj5cIlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSlcblx0ZWxzZVxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUuZGVmYXVsdChpbnN0YW5jZSlcblxuXHRcdGlmIGZsb3c/Lmluc3RhbmNlX3RlbXBsYXRlXG5cdFx0XHRyZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlICsgXCI8L2Rpdj5cIlxuXG5cdFx0aWYgZm9ybT8uaW5zdGFuY2Vfc3R5bGVcblx0XHRcdGlmIGZvcm0uaW5zdGFuY2Vfc3R5bGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSlcblx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLmRlZmF1bHQoaW5zdGFuY2UpXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUuZGVmYXVsdChpbnN0YW5jZSlcblxuI1RlbXBsYXRlTWFuYWdlci5leHBvcnRUZW1wbGF0ZSA9IChmbG93SWQpIC0+XG4jXHR0ZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZShmbG93SWQpO1xuI1xuI1x0ZmxvdyA9IFdvcmtmbG93TWFuYWdlci5nZXRGbG93KGZsb3dJZCk7XG4jXG4jXHRpZiBmbG93Py5pbnN0YW5jZV90ZW1wbGF0ZVxuI1x0XHRyZXR1cm4gdGVtcGxhdGU7XG4jXG4jXHRyZXR1cm4gdGVtcGxhdGU7XG5cbiIsInZhciBmb3JtSWQ7ICAgICAgICAgICAgICAgICBcblxuVGVtcGxhdGVNYW5hZ2VyID0ge307XG5cbmZvcm1JZCA9ICdpbnN0YW5jZWZvcm0nO1xuXG5UZW1wbGF0ZU1hbmFnZXIuaW5zdGFuY2VfdGl0bGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhZ2VUaXRsZSwgcGFnZVRpdGxlVHJDbGFzcywgdmFsO1xuICBwYWdlVGl0bGUgPSBcInt7aW5zdGFuY2UubmFtZX19XCI7XG4gIHBhZ2VUaXRsZVRyQ2xhc3MgPSBcImluc3RhbmNlLW5hbWVcIjtcbiAgaWYgKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkge1xuICAgIHBhZ2VUaXRsZSA9IFwie3s+IGFmRm9ybUdyb3VwIG5hbWU9XFxcIlwiICsgQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lICsgXCJcXFwiIGxhYmVsPWZhbHNlfX1cIjtcbiAgICBwYWdlVGl0bGVUckNsYXNzID0gXCJcIjtcbiAgfVxuICBpZiAodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlIDogdm9pZCAwKSB7XG4gICAgcGFnZVRpdGxlID0gXCJcIiArIENvcmVGb3JtLnBhZ2VUaXRsZTtcbiAgICBwYWdlVGl0bGVUckNsYXNzID0gXCJcIjtcbiAgfVxuICB2YWwgPSB7XG4gICAgcGFnZVRpdGxlOiBwYWdlVGl0bGUsXG4gICAgcGFnZVRpdGxlVHJDbGFzczogcGFnZVRpdGxlVHJDbGFzc1xuICB9O1xuICByZXR1cm4gdmFsO1xufTtcblxuVGVtcGxhdGVNYW5hZ2VyLmhhbmRsZVRhYmxlVGVtcGxhdGUgPSBmdW5jdGlvbihpbnN0YW5jZSwgX2V4cG9ydCkge1xuICB2YXIgdGFibGVfZmllbGRzLCB0ZW1wbGF0ZTtcbiAgdGVtcGxhdGUgPSBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cXG5cdDx0YWJsZSBjbGFzcz1cXFwidGFibGUtcGFnZS10aXRsZSBmb3JtLXRhYmxlIG5vLWJvcmRlciB0ZXh0LWFsaWduLWNlbnRlclxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlO2Rpc3BsYXk6IGlubGluZS10YWJsZTtcXFwiPlxcblx0XHQ8dHIgY2xhc3M9XFxcIlwiICsgKHRoaXMuaW5zdGFuY2VfdGl0bGUoKS5wYWdlVGl0bGVUckNsYXNzKSArIFwiXFxcIj5cXG5cdFx0XHQ8dGQgY2xhc3M9XFxcImluc3RhbmNlLXRhYmxlLW5hbWUtdGQgcGFnZS10aXRsZVxcXCI+XFxuXHRcdFx0XHRcIiArICh0aGlzLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlKSArIFwiXFxuXHRcdFx0PC90ZD5cXG5cdFx0PC90cj5cXG5cXG5cdDwvdGFibGU+XFxuXHQ8dGFibGUgY2xhc3M9XFxcInRhYmxlLXBhZ2UtYm9keSBmb3JtLXRhYmxlXFxcIj5cXG5cdFx0XHQ8dHIgc3R5bGU9XFxcImhlaWdodDowcHhcXFwiPlxcblx0XHRcdFx0PHRoIHN0eWxlPSd3aWR0aDogMTYlJz48L3RoPlxcblx0XHRcdFx0PHRoPjwvdGg+XFxuXHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XFxuXHRcdFx0XHQ8dGg+PC90aD5cXG5cdFx0XHQ8L3RyPlwiO1xuICB0YWJsZV9maWVsZHMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRhYmxlX2ZpZWxkcyhpbnN0YW5jZSk7XG4gIHRhYmxlX2ZpZWxkcyAmJiB0YWJsZV9maWVsZHMuZm9yRWFjaChmdW5jdGlvbih0YWJsZV9maWVsZCkge1xuICAgIHZhciBmaWVsZF9wZXJtaXNzaW9uLCBwdXJlQ29kZSwgcmVxdWlyZWQsIHRpdGxlX3Blcm1pc3Npb247XG4gICAgcmVxdWlyZWQgPSBcIlwiO1xuICAgIGlmICghKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkgfHwgKHR5cGVvZiBDb3JlRm9ybSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBDb3JlRm9ybSAhPT0gbnVsbCA/IENvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZSA6IHZvaWQgMCkgIT09IHRhYmxlX2ZpZWxkLmNvZGUpIHtcbiAgICAgIGlmICh0YWJsZV9maWVsZC5pc19yZXF1aXJlZCkge1xuICAgICAgICByZXF1aXJlZCA9IFwiaXMtcmVxdWlyZWRcIjtcbiAgICAgIH1cbiAgICAgIGlmIChfZXhwb3J0KSB7XG4gICAgICAgIHJlcXVpcmVkID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIHB1cmVDb2RlID0gU3RlZWRvcy5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVyKHRhYmxlX2ZpZWxkLmNvZGUpO1xuICAgICAgaWYgKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGQodGFibGVfZmllbGQpKSB7XG4gICAgICAgIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0O1xuICAgICAgICB0ZW1wbGF0ZSArPSBcIjx0ZCBjbGFzcz1cXFwidGQtdGl0bGUgXCIgKyByZXF1aXJlZCArIFwiXFxcIj5cXG5cdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCJ9fVxcbjwvdGQ+XFxuPHRkIGNsYXNzPVxcXCJ0ZC1maWVsZCBvcGluaW9uLWZpZWxkIG9waW5pb24tZmllbGQtXCIgKyBwdXJlQ29kZSArIFwiIGF1dG9tYXRpY1xcXCIgY29sc3BhbiA9IFxcXCJcIiArIHRhYmxlX2ZpZWxkLnRkX2NvbHNwYW4gKyBcIlxcXCI+XFxuXHR7ez4gaW5zdGFuY2VTaWduVGV4dCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCJ9fVxcbjwvdGQ+XCI7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9lbmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbmNsdWRlcyh0YWJsZV9maWVsZC50eXBlLCAnc2VjdGlvbix0YWJsZScpKSB7XG4gICAgICAgICAgdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnQ7XG4gICAgICAgICAgdGVtcGxhdGUgKz0gXCI8dGQgY2xhc3M9XFxcInRkLWNoaWxkZmllbGQgdGQtY2hpbGRmaWVsZC1cIiArIHB1cmVDb2RlICsgXCJcXFwiIGNvbHNwYW4gPSBcXFwiXCIgKyB0YWJsZV9maWVsZC50ZF9jb2xzcGFuICsgXCJcXFwiPlxcbiAgIHt7PiBhZkZvcm1Hcm91cCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCIgbGFiZWw9ZmFsc2V9fVxcbjwvdGQ+XCI7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9zdGFydDtcbiAgICAgICAgICBpZiAoX2V4cG9ydCkge1xuICAgICAgICAgICAgdGl0bGVfcGVybWlzc2lvbiA9IFwiXCI7XG4gICAgICAgICAgICBmaWVsZF9wZXJtaXNzaW9uID0gXCJcIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGl0bGVfcGVybWlzc2lvbiA9IFwidGl0bGUtXCIgKyB0YWJsZV9maWVsZC5wZXJtaXNzaW9uO1xuICAgICAgICAgICAgZmllbGRfcGVybWlzc2lvbiA9IFwiZmllbGQtXCIgKyB0YWJsZV9maWVsZC5wZXJtaXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZW1wbGF0ZSArPSBcIjx0ZCBjbGFzcz1cXFwidGQtdGl0bGUgdGQtdGl0bGUtXCIgKyBwdXJlQ29kZSArIFwiIFwiICsgdGl0bGVfcGVybWlzc2lvbiArIFwiIFwiICsgcmVxdWlyZWQgKyBcIlxcXCI+XFxuXHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT1cXFwiXCIgKyB0YWJsZV9maWVsZC5jb2RlICsgXCJcXFwifX1cXG48L3RkPlxcbjx0ZCBjbGFzcz1cXFwidGQtZmllbGQgdGQtZmllbGQtXCIgKyBwdXJlQ29kZSArIFwiIFwiICsgZmllbGRfcGVybWlzc2lvbiArIFwiXFxcIiBjb2xzcGFuID0gXFxcIlwiICsgdGFibGVfZmllbGQudGRfY29sc3BhbiArIFwiXFxcIj5cXG5cdHt7PiBhZkZvcm1Hcm91cCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCIgbGFiZWw9ZmFsc2V9fVxcbjwvdGQ+XCI7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRlbXBsYXRlICs9IFwiXHQ8L3RhYmxlPlxcblxcblx0PHRhYmxlIGNsYXNzPVxcXCJ0YWJsZS1wYWdlLWZvb3RlciBmb3JtLXRhYmxlIG5vLWJvcmRlclxcXCI+XFxuXHRcdDx0ciBjbGFzcz1cXFwiYXBwbGljYW50LXdyYXBwZXJcXFwiPlxcblx0XHRcdDx0ZCBjbGFzcz1cXFwibm93cmFwXFxcIj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1sZWZ0Jz5cXG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e190IFxcXCJpbnN0YW5jZV9pbml0aWF0b3JcXFwifX3vvJo8L2xhYmVsPlxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS10YWJsZS13cmFwcGVyLXRkIGlubGluZS1sZWZ0Jz5cXG5cdFx0XHRcdFx0e3s+VGVtcGxhdGUuZHluYW1pYyAgdGVtcGxhdGU9XFxcImFmU2VsZWN0VXNlclxcXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdDwvdGQ+XFxuXHRcdFx0PHRkIGNsYXNzPVxcXCJub3dyYXBcXFwiPlxcblx0XHRcdFx0PGRpdiBjbGFzcz0ncHVsbC1sZWZ0Jz5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxcblx0XHRcdFx0XHRcdDxsYWJlbD57e190IFxcXCJpbnN0YW5jZV9zdWJtaXRfZGF0ZVxcXCJ9fe+8mjwvbGFiZWw+XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtcmlnaHQnPlxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0e3tmb3JtYXREYXRlIGluc3RhbmNlLnN1Ym1pdF9kYXRlICd7XFxcImZvcm1hdFxcXCI6XFxcIllZWVktTU0tRERcXFwifSd9fVxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdDwvdGQ+XFxuXHRcdDwvdHI+XFxuXHQ8L3RhYmxlPlxcbjwvZGl2PlwiO1xuICByZXR1cm4gdGVtcGxhdGU7XG59O1xuXG5UZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlID0ge1xuICBcImRlZmF1bHRcIjogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgdGVtcGxhdGU7XG4gICAgdGVtcGxhdGUgPSBcIjxkaXYgY2xhc3M9XFxcIndpdGgtYm9yZGVyIGNvbC1tZC0xMlxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJpbnN0YW5jZS1uYW1lXFxcIj5cXG5cdFx0PGgzIGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlwiICsgKFRlbXBsYXRlTWFuYWdlci5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZSkgKyBcIjwvaDM+XFxuXHRcdDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj48L3NwYW4+XFxuXHQ8L2Rpdj5cXG5cdDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj48L3NwYW4+XFxuPC9kaXY+XFxue3sjZWFjaCBzdGVlZG9zX2Zvcm0uZmllbGRzfX1cXG5cdHt7I2lmIGlzT3BpbmlvbkZpZWxkIHRoaXN9fVxcblx0XHQ8ZGl2IGNsYXNzPVxcXCJ7eyNpZiB0aGlzLmlzX3dpZGV9fWNvbC1tZC0xMnt7ZWxzZX19Y29sLW1kLTZ7ey9pZn19IGZpZWxkLXt7dGhpcy5jb2RlfX1cXFwiPlxcblx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgYXV0b21hdGljIG9waW5pb24tZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPXRoaXMuY29kZX19PC9sYWJlbD5cXG5cXG5cdFx0XHRcdHt7PiBpbnN0YW5jZVNpZ25UZXh0IG5hbWU9dGhpcy5jb2RlfX1cXG5cdFx0XHQ8L2Rpdj5cXG5cdFx0PC9kaXY+XFxuXHR7e2Vsc2V9fVxcblx0XHR7eyNpZiBpbmNsdWRlcyB0aGlzLnR5cGUgJ3NlY3Rpb24sdGFibGUnfX1cXG5cdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTIgZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxcblx0XHRcdDwvZGl2Plxcblx0XHR7e2Vsc2V9fVxcblx0XHRcdDxkaXYgY2xhc3M9XFxcInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9dGhpcy5jb2RlfX1cXG5cdFx0XHQ8L2Rpdj5cXG5cdFx0e3svaWZ9fVxcblx0e3svaWZ9fVxcbnt7L2VhY2h9fVxcbjxkaXYgY2xhc3M9XFxcImNvbC1tZC0xMlxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJhcHBsaWNhbnQtd3JhcHBlciBmb3JtLWdyb3VwIGZvcm0taG9yaXpvbnRhbFxcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cFxcXCI+XFxuXHRcdDxkaXYgY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uXFxcIj5cXG5cdFx0ICB7e190IFxcXCJpbnN0YW5jZV9pbml0aWF0b3JcXFwifX0mbmJzcDs6XFxuXHRcdDwvZGl2Plxcblx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cXFwiYWZTZWxlY3RVc2VyXFxcIiBkYXRhPWFwcGxpY2FudENvbnRleHR9fVxcblx0ICA8L2Rpdj5cXG5cdDwvZGl2PlxcbjwvZGl2PlwiO1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfSxcbiAgdGFibGU6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIFRlbXBsYXRlTWFuYWdlci5oYW5kbGVUYWJsZVRlbXBsYXRlKGluc3RhbmNlKTtcbiAgfVxufTtcblxuVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZUhlbHBzID0ge1xuICBhcHBsaWNhbnRDb250ZXh0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGF0YSwgc3RlZWRvc19pbnN0YW5jZTtcbiAgICBzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgZGF0YSA9IHtcbiAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgIGF0dHM6IHtcbiAgICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBpZDogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBcImNsYXNzXCI6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCcsXG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo2cHggMTJweDt3aWR0aDoxNDBweDtkaXNwbGF5OmlubGluZSdcbiAgICAgIH1cbiAgICB9O1xuICAgIGRhdGEuYXR0cy5kaXNhYmxlZCA9IHRydWU7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn07XG5cbih7XG4gIGluc3RhbmNlSWQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnaW5zdGFuY2Vmb3JtJztcbiAgfSxcbiAgZm9ybV90eXBlczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKSkge1xuICAgICAgcmV0dXJuICdkaXNhYmxlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnbWV0aG9kJztcbiAgICB9XG4gIH0sXG4gIHN0ZWVkb3NfZm9ybTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmb3JtX3ZlcnNpb247XG4gICAgfVxuICB9LFxuICBpbm5lcnN1YmZvcm1Db250ZXh0OiBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgZG9jX3ZhbHVlcztcbiAgICBkb2NfdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICAgIG9ialtcInRhYmxlVmFsdWVzXCJdID0gZG9jX3ZhbHVlcyA/IGRvY192YWx1ZXNbb2JqLmNvZGVdIDogW107XG4gICAgb2JqW1wiZm9ybUlkXCJdID0gZm9ybUlkO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG4gIGluc3RhbmNlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RlZWRvc19pbnN0YW5jZTtcbiAgICBTZXNzaW9uLmdldChcImNoYW5nZV9kYXRlXCIpO1xuICAgIGlmIChTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpIHtcbiAgICAgIHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIHJldHVybiBzdGVlZG9zX2luc3RhbmNlO1xuICAgIH1cbiAgfSxcbiAgZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH0sXG4gIGluY2x1ZGVzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcbiAgfSxcbiAgZmllbGRzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcbiAgICB9XG4gIH0sXG4gIGRvY192YWx1ZXM6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gIH0sXG4gIGluc3RhbmNlX2JveF9zdHlsZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJveCwgaW5zLCBqdWRnZTtcbiAgICBib3ggPSBTZXNzaW9uLmdldChcImJveFwiKTtcbiAgICBpZiAoYm94ID09PSBcImluYm94XCIgfHwgYm94ID09PSBcImRyYWZ0XCIpIHtcbiAgICAgIGp1ZGdlID0gU2Vzc2lvbi5nZXQoXCJqdWRnZVwiKTtcbiAgICAgIGlmIChqdWRnZSkge1xuICAgICAgICBpZiAoanVkZ2UgPT09IFwiYXBwcm92ZWRcIikge1xuICAgICAgICAgIHJldHVybiBcImJveC1zdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoanVkZ2UgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIHJldHVybiBcImJveC1kYW5nZXJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBpZiAoaW5zICYmIGlucy5maW5hbF9kZWNpc2lvbikge1xuICAgICAgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImJveC1zdWNjZXNzXCI7XG4gICAgICB9IGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImJveC1kYW5nZXJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuXG5UZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbihpbnN0YW5jZSwgdGVtcGxhdGVOYW1lKSB7XG4gIHZhciBmbG93LCBmb3JtO1xuICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gIGlmICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICBpZiAodGVtcGxhdGVOYW1lID09PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSk7XG4gICAgfVxuICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBTZXNzaW9uICE9PSBcInVuZGVmaW5lZFwiICYmIFNlc3Npb24gIT09IG51bGwgPyBTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgOiB2b2lkIDApIHtcbiAgICBpZiAoZmxvdyAhPSBudWxsID8gZmxvdy5wcmludF90ZW1wbGF0ZSA6IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5wcmludF90ZW1wbGF0ZSArIFwiPC9kaXY+XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmbG93ICE9IG51bGwgPyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlIDogdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cIiArIGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgKyBcIjwvZGl2PlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUudGFibGUoaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZVtcImRlZmF1bHRcIl0oaW5zdGFuY2UpO1xuICAgIH1cbiAgICBpZiAoZmxvdyAhPSBudWxsID8gZmxvdy5pbnN0YW5jZV90ZW1wbGF0ZSA6IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5pbnN0YW5jZV90ZW1wbGF0ZSArIFwiPC9kaXY+XCI7XG4gICAgfVxuICAgIGlmIChmb3JtICE9IG51bGwgPyBmb3JtLmluc3RhbmNlX3N0eWxlIDogdm9pZCAwKSB7XG4gICAgICBpZiAoZm9ybS5pbnN0YW5jZV9zdHlsZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZVtcImRlZmF1bHRcIl0oaW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZVtcImRlZmF1bHRcIl0oaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufTtcbiIsIlN0ZWVkb3NUYWJsZSA9IHt9O1xuXG5TdGVlZG9zVGFibGUuZm9ybUlkID0gXCJpbnN0YW5jZWZvcm1cIjtcblxuU3RlZWRvc1RhYmxlLmNoZWNrSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaXRlbV9pbmRleCkge1xuICAgIHZhciBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICB2YXIgZmllbGRWYWwgPSBTdGVlZG9zVGFibGUuZ2V0SXRlbU1vZGFsVmFsdWUoZmllbGQsIGl0ZW1faW5kZXgpO1xuXG4gICAgdmFyIHNmX25hbWUgPSAnJztcbiAgICB2YXIgcmV2ID0gdHJ1ZTtcbiAgICBmaWVsZE9iai5zZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKHNmKSB7XG4gICAgICAgIGlmIChzZi5wZXJtaXNzaW9uID09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgIHNmX25hbWUgPSBmaWVsZE9iai5jb2RlICsgXCIuXCIgKyBzZi5jb2RlO1xuICAgICAgICAgICAgaWYgKCFJbnN0YW5jZU1hbmFnZXIuY2hlY2tGb3JtRmllbGRWYWx1ZSgkKFwiW25hbWU9J1wiICsgc2ZfbmFtZSArIFwiJ11cIilbMF0sIHNmX25hbWUsIGZpZWxkVmFsW3NmLmNvZGVdKSkge1xuICAgICAgICAgICAgICAgIHJldiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV2O1xufVxuXG5TdGVlZG9zVGFibGUuc2V0VGFibGVJdGVtVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgsIGl0ZW1fdmFsdWUpIHtcblxuICAgIHZhciB0YWJsZVZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpO1xuICAgIHRhYmxlVmFsdWVbaXRlbV9pbmRleF0gPSBpdGVtX3ZhbHVlO1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0VGFibGVJdGVtVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgpIHtcbiAgICByZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpW2l0ZW1faW5kZXhdO1xufVxuXG5TdGVlZG9zVGFibGUucmVtb3ZlVGFibGVJdGVtID0gZnVuY3Rpb24gKGZpZWxkLCBpdGVtX2luZGV4KSB7XG4gICAgdmFyIGl0ZW1fdmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVJdGVtVmFsdWUoZmllbGQsIGl0ZW1faW5kZXgpO1xuICAgIGl0ZW1fdmFsdWUucmVtb3ZlZCA9IHRydWU7XG59XG5cblN0ZWVkb3NUYWJsZS5zZXRUYWJsZVZhbHVlID0gZnVuY3Rpb24gKGZpZWxkLCB2YWx1ZSkge1xuICAgICQoXCJ0YWJsZVtuYW1lPSdcIiArIGZpZWxkICsgXCInXVwiKS52YWwoe1xuICAgICAgICB2YWw6IHZhbHVlXG4gICAgfSk7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUYWJsZVZhbHVlID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgcmV0dXJuICQoXCJ0YWJsZVtuYW1lPSdcIiArIGZpZWxkICsgXCInXVwiKS52YWwoKS52YWw7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRWYWxpZFZhbHVlID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIHZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgdmFsaWRWYWx1ZSA9IFtdO1xuXG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICBpZiAoIXYucmVtb3ZlZCkge1xuICAgICAgICAgICAgdmFsaWRWYWx1ZS5wdXNoKHYpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkVmFsdWU7XG59XG5cblxuU3RlZWRvc1RhYmxlLmhhbmRsZURhdGEgPSBmdW5jdGlvbiAoZmllbGQsIHZhbHVlcykge1xuXG4gICAgaWYgKCF2YWx1ZXMgfHwgISh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgZmllbGRPYmogPSBTdGVlZG9zVGFibGUuZ2V0RmllbGQoZmllbGQpO1xuXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgZmllbGRPYmouc2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgICAgICBpZiAoZi50eXBlID09ICd1c2VyJyB8fCBmLnR5cGUgPT0gJ2dyb3VwJykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZbZi5jb2RlXVxuICAgICAgICAgICAgICAgIGlmIChmLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiAodmFsdWVbMF0pID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2W2YuY29kZV0gPSB2W2YuY29kZV0uZ2V0UHJvcGVydHkoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlKSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdltmLmNvZGVdID0gdltmLmNvZGVdLmlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmLnR5cGUgPT0gJ2RhdGVUaW1lJykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZbZi5jb2RlXVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZhbHVlLnNwbGl0KFwiVFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQxID0gdFsxXS5zcGxpdChcIjpcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSB0MFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gdDBbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gdDBbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBob3VycyA9IHQxWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9IHQxWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbZi5jb2RlXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIHZhciBpbnN0YW5jZUZpZWxkcyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZpZWxkcygpO1xuICAgIGlmICghaW5zdGFuY2VGaWVsZHMpXG4gICAgICAgIHJldHVybjtcblxuICAgIHZhciBmaWVsZE9iaiA9IGluc3RhbmNlRmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGZpZWxkKTtcblxuICAgIHJldHVybiBmaWVsZE9iajtcbn1cblxuXG5TdGVlZG9zVGFibGUuZ2V0TW9kYWxEYXRhID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCkge1xuXG4gICAgdmFyIGRhdGEgPSB7fTtcblxuICAgIHZhciBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICBpZiAoIWZpZWxkT2JqKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkYXRhLmZpZWxkID0gZmllbGRPYmo7XG5cbiAgICBkYXRhLmZpZWxkLmZvcm11bGEgPSBGb3JtX2Zvcm11bGEuZ2V0Rm9ybXVsYUZpZWxkVmFyaWFibGUoXCJGb3JtX2Zvcm11bGEuZmllbGRfdmFsdWVzXCIsIGZpZWxkT2JqLnNmaWVsZHMpO1xuXG4gICAgZGF0YS52YWx1ZSA9IHt9O1xuXG4gICAgZGF0YS52YWx1ZVtmaWVsZF0gPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVJdGVtVmFsdWUoZmllbGQsIGluZGV4KTtcblxuICAgIGRhdGEuaW5kZXggPSBpbmRleDtcblxuICAgIHJldHVybiBkYXRhO1xufVxuXG5cblxuU3RlZWRvc1RhYmxlLmdldEl0ZW1Nb2RhbFZhbHVlID0gZnVuY3Rpb24gKGZpZWxkLCBpdGVtX2luZGV4KSB7XG5cbiAgICBpZiAoIUF1dG9Gb3JtLmdldEZvcm1WYWx1ZXMoXCJzdGVlZG9zX3RhYmxlX21vZGFsX1wiICsgZmllbGQgKyBcIl9cIiArIGl0ZW1faW5kZXgpKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIHZhciBpdGVtX3ZhbHVlID0gQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcInN0ZWVkb3NfdGFibGVfbW9kYWxfXCIgKyBmaWVsZCArIFwiX1wiICsgaXRlbV9pbmRleCkuaW5zZXJ0RG9jW2ZpZWxkXTtcbiAgICByZXR1cm4gaXRlbV92YWx1ZTtcbn1cblxuXG5TdGVlZG9zVGFibGUuYWRkSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgsIF9pdGVtX3ZhbHVlKSB7XG4gICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgdmFyIGl0ZW1fdmFsdWUgPSBfaXRlbV92YWx1ZSB8fCBTdGVlZG9zVGFibGUuZ2V0SXRlbU1vZGFsVmFsdWUoZmllbGQsIGluZGV4KTtcbiAgICAkKFwidGJvZHlbbmFtZT0nXCIgKyBmaWVsZCArIFwiVGJvZHknXVwiKS5hcHBlbmQoU3RlZWRvc1RhYmxlLmdldFRyKGtleXMsIGl0ZW1fdmFsdWUsIGluZGV4LCBmaWVsZCwgdHJ1ZSkpXG5cbn1cblxuU3RlZWRvc1RhYmxlLnVwZGF0ZUl0ZW0gPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4LCBfaXRlbV92YWx1ZSkge1xuXG4gICAgdmFyIGl0ZW0gPSAkKFwidHJbbmFtZT0nXCIgKyBmaWVsZCArIFwiX2l0ZW1fXCIgKyBpbmRleCArIFwiJ11cIik7XG5cbiAgICB2YXIgaXRlbV92YWx1ZSA9IF9pdGVtX3ZhbHVlIHx8IFN0ZWVkb3NUYWJsZS5nZXRJdGVtTW9kYWxWYWx1ZShmaWVsZCwgaW5kZXgpO1xuXG4gICAgaWYgKGl0ZW0gJiYgaXRlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gU3RlZWRvc1RhYmxlLmdldEtleXMoZmllbGQpO1xuICAgICAgICB2YXIgdGRzID0gU3RlZWRvc1RhYmxlLmdldFJlbW92ZVRkKGZpZWxkLCBpbmRleCk7XG5cbiAgICAgICAgdmFyIHNmaWVsZHMgPSBTdGVlZG9zVGFibGUuZ2V0RmllbGQoZmllbGQpLnNmaWVsZHM7XG5cbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBzZmllbGQgPSBzZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGtleSk7XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGl0ZW1fdmFsdWVba2V5XTtcblxuICAgICAgICAgICAgdGRzID0gdGRzICsgU3RlZWRvc1RhYmxlLmdldFRkKHNmaWVsZCwgaW5kZXgsIHZhbHVlKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBpdGVtLmVtcHR5KCk7XG5cbiAgICAgICAgaXRlbS5hcHBlbmQodGRzKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgU3RlZWRvc1RhYmxlLmFkZEl0ZW0oZmllbGQsIGluZGV4KTtcbiAgICB9XG5cbiAgICBpZiAoU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpKSB7XG5cbiAgICAgICAgU3RlZWRvc1RhYmxlLnNldFRhYmxlSXRlbVZhbHVlKGZpZWxkLCBpbmRleCwgaXRlbV92YWx1ZSk7XG5cbiAgICAgICAgLy9TdGVlZG9zVGFibGUudmFsdWVIYXNoW2ZpZWxkXVtpbmRleF0gPSBpdGVtX3ZhbHVlO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9TdGVlZG9zVGFibGUudmFsdWVIYXNoW2ZpZWxkXSA9IFtpdGVtX3ZhbHVlXTtcblxuICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVWYWx1ZShmaWVsZCwgW2l0ZW1fdmFsdWVdKVxuXG4gICAgfVxuXG4gICAgLy/miafooYzkuLvooajlhazlvI/orqHnrpdcbiAgICBJbnN0YW5jZU1hbmFnZXIucnVuRm9ybXVsYShmaWVsZCk7XG5cbn1cblxuU3RlZWRvc1RhYmxlLnJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4KSB7XG5cbiAgICAkKFwidHJbbmFtZT0nXCIgKyBmaWVsZCArIFwiX2l0ZW1fXCIgKyBpbmRleCArIFwiJ11cIikuaGlkZSgpO1xuXG4gICAgU3RlZWRvc1RhYmxlLnJlbW92ZVRhYmxlSXRlbShmaWVsZCwgaW5kZXgpO1xuXG4gICAgSW5zdGFuY2VNYW5hZ2VyLnJ1bkZvcm11bGEoZmllbGQpO1xufVxuXG5TdGVlZG9zVGFibGUuc2hvd01vZGFsID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCwgbWV0aG9kKSB7XG5cblxuICAgIHZhciBtb2RhbERhdGEgPSBTdGVlZG9zVGFibGUuZ2V0TW9kYWxEYXRhKGZpZWxkLCBpbmRleCk7XG5cbiAgICBtb2RhbERhdGEubWV0aG9kID0gbWV0aG9kO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgTW9kYWwuc2hvdyhcInN0ZWVkb3NUYWJsZU1vZGFsXCIsIG1vZGFsRGF0YSk7XG4gICAgfSwgMzAwKVxufVxuXG5TdGVlZG9zVGFibGUuZ2V0S2V5cyA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIGlmICghQXV0b0Zvcm0uZ2V0Q3VycmVudERhdGFGb3JGb3JtKFN0ZWVkb3NUYWJsZS5mb3JtSWQpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgc3MgPSBBdXRvRm9ybS5nZXRGb3JtU2NoZW1hKFN0ZWVkb3NUYWJsZS5mb3JtSWQpO1xuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmIChzcy5zY2hlbWEoZmllbGQgKyBcIi4kXCIpLnR5cGUgPT09IE9iamVjdCkge1xuICAgICAgICBrZXlzID0gc3Mub2JqZWN0S2V5cyhTaW1wbGVTY2hlbWEuX21ha2VHZW5lcmljKGZpZWxkKSArICcuJCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXM7XG5cbn1cblxuU3RlZWRvc1RhYmxlLmdldFRoZWFkID0gZnVuY3Rpb24gKGZpZWxkLCBlZGl0YWJsZSkge1xuXG4gICAgdmFyIGZpZWxkT2JqID0gZmllbGQ7XG4gICAgaWYgKCFfLmlzT2JqZWN0KGZpZWxkKSlcbiAgICAgICAgZmllbGRPYmogPSBTdGVlZG9zVGFibGUuZ2V0RmllbGQoZmllbGQpO1xuXG4gICAgaWYgKCFmaWVsZE9iaikge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgdmFyIHRoZWFkID0gJycsXG4gICAgICAgIHRycyA9ICcnLFxuICAgICAgICBsYWJlbCA9ICcnLFxuICAgICAgICB3aWR0aCA9IDEwMDtcblxuICAgIGlmIChlZGl0YWJsZSkge1xuICAgICAgICAvLyB0cnMgPSBcIjx0aCBjbGFzcz0ncmVtb3ZlZCc+PC90aD5cIlxuICAgICAgICB0cnMgPSBcIlwiXG4gICAgfVxuXG4gICAgdmFyIHNmaWVsZHMgPSBmaWVsZE9iai5zZmllbGRzO1xuXG4gICAgaWYgKCFzZmllbGRzKSB7XG4gICAgICAgIHJldHVybiB0aGVhZDtcbiAgICB9XG5cbiAgICB2YXIgc2ZfbGVuZ3RoID0gc2ZpZWxkcy5sZW5ndGg7XG5cbiAgICBpZiAoc2ZfbGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgd2lkZV9maWVsZHMgPSBzZmllbGRzLmZpbHRlclByb3BlcnR5KFwiaXNfd2lkZVwiLCB0cnVlKTtcblxuICAgICAgICB3aWR0aCA9IDEwMCAvIChzZl9sZW5ndGggKyB3aWRlX2ZpZWxkcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHNmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoc2YsIGluZGV4KSB7XG5cbiAgICAgICAgbGFiZWwgPSAoc2YubmFtZSAhPSBudWxsICYmIHNmLm5hbWUubGVuZ3RoID4gMCkgPyBzZi5uYW1lIDogc2YuY29kZTtcblxuICAgICAgICB0cnMgPSB0cnMgKyBcIjx0ZCBcIjsgLy8gbm93cmFwPSdub3dyYXAnXG5cbiAgICAgICAgdHJzID0gdHJzICsgXCIgY2xhc3M9J3RpdGxlIFwiICsgc2YudHlwZSArIFwiJ1wiO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSAoc2ZfbGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgIGlmIChzZi5pc193aWRlKSB7XG4gICAgICAgICAgICAgICAgdHJzID0gdHJzICsgXCJzdHlsZT0nd2lkdGg6XCIgKyB3aWR0aCAqIDIgKyBcIiUnXCJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJzID0gdHJzICsgXCJzdHlsZT0nd2lkdGg6XCIgKyB3aWR0aCArIFwiJSdcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJzID0gdHJzICsgXCI+XCIgKyBsYWJlbCArIFwiPC90ZD5cIlxuICAgIH0pO1xuXG4gICAgdGhlYWQgPSAnPHRyPicgKyB0cnMgKyAnPC90cj4nO1xuXG4gICAgcmV0dXJuIHRoZWFkO1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0VGJvZHkgPSBmdW5jdGlvbiAoa2V5cywgZmllbGQsIHZhbHVlcywgZWRpdGFibGUsIHNmaWVsZHNFZGl0YWJsZSkge1xuICAgIHZhciB0Ym9keSA9IFwiXCI7XG5cbiAgICBpZiAodmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgdGJvZHkgPSB0Ym9keSArIFN0ZWVkb3NUYWJsZS5nZXRUcihrZXlzLCB2YWx1ZSwgaW5kZXgsIGZpZWxkLCBlZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRib2R5O1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0VHIgPSBmdW5jdGlvbiAoa2V5cywgaXRlbV92YWx1ZSwgaW5kZXgsIGZpZWxkLCBlZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSB7XG5cbiAgICB2YXIgZmllbGRPYmogPSBmaWVsZDtcbiAgICBpZiAoIV8uaXNPYmplY3QoZmllbGQpKVxuICAgICAgICBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICB2YXIgdHIgPSBcIjx0ciBpZD0nXCIgKyBmaWVsZE9iai5jb2RlICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInIG5hbWU9J1wiICsgZmllbGRPYmouY29kZSArIFwiX2l0ZW1fXCIgKyBpbmRleCArIFwiJyBkYXRhLWluZGV4PSdcIiArIGluZGV4ICsgXCInXCJcblxuICAgIGlmIChlZGl0YWJsZSB8fCBzZmllbGRzRWRpdGFibGUpIHtcbiAgICAgICAgdHIgPSB0ciArIFwiJyBjbGFzcz0naXRlbSBlZGl0J1wiXG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgdHIgPSB0ciArIFwiIGNsYXNzPSdpdGVtIGl0ZW0tcmVhZG9ubHknXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyID0gdHIgKyBcIiBjbGFzcz0naXRlbSAnXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpdGVtX3ZhbHVlLnJlbW92ZWQpIHtcbiAgICAgICAgdHIgPSB0ciArIFwiIHN0eWxlPSdkaXNwbGF5Om5vbmUnIFwiO1xuICAgIH1cblxuICAgIHRyID0gdHIgKyBcIic+XCI7XG5cbiAgICB2YXIgdGRzID0gXCJcIjtcblxuICAgIGlmIChlZGl0YWJsZSkge1xuICAgICAgICB0ZHMgPSBTdGVlZG9zVGFibGUuZ2V0UmVtb3ZlVGQoZmllbGRPYmouY29kZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIHZhciBzZmllbGRzID0gZmllbGRPYmouc2ZpZWxkcztcblxuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBzZmllbGQgPSBzZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGtleSk7XG5cbiAgICAgICAgdmFyIHZhbHVlID0gaXRlbV92YWx1ZVtrZXldO1xuXG4gICAgICAgIHRkcyA9IHRkcyArIFN0ZWVkb3NUYWJsZS5nZXRUZChzZmllbGQsIGluZGV4LCB2YWx1ZSk7XG5cbiAgICB9KTtcblxuICAgIHRyID0gdHIgKyB0ZHMgKyBcIjwvdHI+XCI7XG4gICAgcmV0dXJuIHRyO1xufVxuXG5TdGVlZG9zVGFibGUuZ2V0UmVtb3ZlVGQgPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4KSB7XG4gICAgLy8gcmV0dXJuIFwiPHRkIGNsYXNzPSdzdGVlZG9zVGFibGUtaXRlbS1yZW1vdmUgcmVtb3ZlZCcgZGF0YS1pbmRleD0nXCIgKyBpbmRleCArIFwiJz48aSBjbGFzcz0nZmEgZmEtdGltZXMnIGFyaWEtaGlkZGVuPSd0cnVlJz48L3RkPlwiO1xuICAgIHJldHVybiBcIlwiXG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUZCA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgdmFyIHRkID0gXCI8dGQgXCI7XG5cbiAgICB0ZCA9IHRkICsgXCIgY2xhc3M9J3N0ZWVkb3NUYWJsZS1pdGVtLWZpZWxkIFwiICsgZmllbGQudHlwZSArIFwiJyBcIjtcblxuICAgIHZhciB0ZF92YWx1ZSA9IFwiXCI7XG5cbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHRkX3ZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFREVmFsdWUoZmllbGQsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblxuICAgICAgICB1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0XG5cbiAgICAgICAgdGRfdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUodmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldClcbiAgICB9XG5cbiAgICB0ZCA9IHRkICsgXCIgZGF0YS1pbmRleD0nXCIgKyBpbmRleCArIFwiJz5cIiArIHRkX3ZhbHVlICsgXCI8L3RkPlwiXG5cbiAgICByZXR1cm4gdGQ7XG59XG5cblxuU3RlZWRvc1RhYmxlLmdldFREVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIHZhbHVlKSB7XG4gICAgdmFyIHRkX3ZhbHVlID0gXCJcIjtcbiAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgIHJldHVybiB0ZF92YWx1ZVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB2YXIgZmllbGRPcHRpb25zID0gW107XG4gICAgICAgIGlmKFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xKXtcbiAgICAgICAgICAgIGZpZWxkT3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pe1xuICAgICAgICAgICAgICAgIHZhciBpdGVtU3BsaXRzID0gbi5zcGxpdChcIjpcIilcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogaXRlbVNwbGl0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1TcGxpdHNbMV0gfHwgblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhU3BhY2VVc2Vycyh2YWx1ZSkuZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhU3BhY2VVc2Vycyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB1ID8gdS5uYW1lIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gdmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhT3JnYW5pemF0aW9ucyh2YWx1ZSkuZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gQ0ZEYXRhTWFuYWdlci5nZXRGb3JtdWxhT3JnYW5pemF0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IG8gPyBvLm5hbWUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZSA/IFwiPGEgaHJlZj0nbWFpbHRvOlwiICsgdmFsdWUgKyBcIic+XCIgKyB2YWx1ZSArIFwiPC9hPlwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VybCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiaHR0cFwiKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+aHR0cDovL1wiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwYXNzd29yZCc6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSAnKioqKioqJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZhbHVlLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSB0WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IHRbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gJC5mb3JtYXQuZGF0ZSh2YWx1ZSwgJ3l5eXktTU0tZGQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmFsdWUuc3BsaXQoXCJUXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQwID0gdFswXS5zcGxpdChcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0MFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSB0MFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0gdDFbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXRlLCBob3Vycywgc2Vjb25kcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9ICQuZm9ybWF0LmRhdGUodmFsdWUsICd5eXl5LU1NLWRkIEhIOm1tJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKXsgcmV0dXJuIGl0ZW0udmFsdWUgPT0gdmFsdWU7IH0pXG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRPcHRpb24pe1xuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZTsgfSlcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aVNlbGVjdCc6XG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0ZWRWYWx1ZXMgPSB2YWx1ZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkT3B0aW9ucyA9IGZpZWxkT3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7IHJldHVybiBzcGxpdGVkVmFsdWVzLmluZGV4T2YoaXRlbS52YWx1ZSkgPiAtMTsgfSk7XG4gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gc2VsZWN0ZWRPcHRpb25zLm1hcChmdW5jdGlvbihpdGVtKXsgcmV0dXJuIGl0ZW0ubGFiZWw7IH0pLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX3BlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFN0ZWVkb3MubnVtYmVyVG9TdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvZGF0YSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgY2FzZSAnbG9va3VwJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRWYWx1ZSh2YWx1ZSwgZmllbGQpO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gdmFsdWUgPyB2YWx1ZSA6ICcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlO1xuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRkX3ZhbHVlO1xufTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIEF1dG9Gb3JtLmFkZElucHV0VHlwZShcInRhYmxlXCIsIHtcbiAgICAgICAgdGVtcGxhdGU6IFwiYWZUYWJsZVwiLFxuICAgICAgICB2YWx1ZU91dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSB0aGlzLmRhdGEoXCJzY2hlbWFLZXlcIik7XG4gICAgICAgICAgICByZXR1cm4gU3RlZWRvc1RhYmxlLmdldFZhbGlkVmFsdWUobmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlQ29udmVydGVyczoge1xuICAgICAgICAgICAgXCJzdHJpbmdBcnJheVwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9TdHJpbmdBcnJheSxcbiAgICAgICAgICAgIFwibnVtYmVyXCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb051bWJlcixcbiAgICAgICAgICAgIFwibnVtZXJBcnJheVwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9OdW1iZXJBcnJheSxcbiAgICAgICAgICAgIFwiYm9vbGVhblwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9Cb29sZWFuLFxuICAgICAgICAgICAgXCJib29sZWFuQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvQm9vbGVhbkFycmF5LFxuICAgICAgICAgICAgXCJkYXRlXCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb0RhdGUsXG4gICAgICAgICAgICBcImRhdGVBcnJheVwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9EYXRlQXJyYXlcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dEFkanVzdDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dC5hdHRzLm1heGxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnRleHQubWF4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYXR0cy5tYXhsZW5ndGggPSBjb250ZXh0Lm1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBUZW1wbGF0ZS5hZlRhYmxlLmV2ZW50cyh7XG4gICAgICAgICd0YXAgLnN0ZWVkb3MtdGFibGUgLnN0ZWVkb3NUYWJsZS1pdGVtLWFkZCwuYWRkLWl0ZW0tdHInOiBmdW5jdGlvbiAoZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRlbXBsYXRlLmRhdGEubmFtZTtcblxuICAgICAgICAgICAgdmFyIHRhYmxlVmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShuYW1lKTtcblxuICAgICAgICAgICAgdmFyIG5ld19pdGVtX2luZGV4ID0gdGFibGVWYWx1ZSA/IHRhYmxlVmFsdWUubGVuZ3RoIDogMDtcblxuICAgICAgICAgICAgU3RlZWRvc1RhYmxlLnNob3dNb2RhbChuYW1lLCBuZXdfaXRlbV9pbmRleCwgXCJhZGRcIik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3RhcCAuc3RlZWRvcy10YWJsZSAuc3RlZWRvc1RhYmxlLWl0ZW0tZmllbGQnOiBmdW5jdGlvbiAoZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgICAgICAgICBpZiAodGVtcGxhdGUuZGF0YS5hdHRzLmVkaXRhYmxlIHx8IHRlbXBsYXRlLmRhdGEuYXR0cy5zZmllbGRzRWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSB0ZW1wbGF0ZS5kYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgICAgICAgICAgICAgIFN0ZWVkb3NUYWJsZS5zaG93TW9kYWwoZmllbGQsIGluZGV4LCBcImVkaXRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3RhcCAuc3RlZWRvcy10YWJsZSAuc3RlZWRvc1RhYmxlLWl0ZW0tcmVtb3ZlJzogZnVuY3Rpb24gKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gdGVtcGxhdGUuZGF0YS5uYW1lO1xuICAgICAgICAgICAgdmFyIGl0ZW1faW5kZXggPSBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG4gICAgICAgICAgICBTZXNzaW9uLnNldChcImluc3RhbmNlX2NoYW5nZVwiLCB0cnVlKTtcbiAgICAgICAgICAgIFN0ZWVkb3NUYWJsZS5yZW1vdmVJdGVtKGZpZWxkLCBpdGVtX2luZGV4KTtcbiAgICAgICAgfSxcblxuICAgICAgICAndGFwIC5zdGVlZG9zLXRhYmxlIC5pdGVtLXJlYWRvbmx5JzogZnVuY3Rpb24gKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZS5kYXRhLmF0dHMuZWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSB0ZW1wbGF0ZS5kYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgICAgICAgICAgICAgIFN0ZWVkb3NUYWJsZS5zaG93TW9kYWwoZmllbGQsIGluZGV4LCBcInJlYWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG5cbiAgICBUZW1wbGF0ZS5hZlRhYmxlLnJlbmRlcmVkID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZGF0YS5uYW1lO1xuXG4gICAgICAgIHZhciBzZmllbGRzRWRpdGFibGUgPSB0aGlzLmRhdGEuYXR0cy5zZmllbGRzRWRpdGFibGU7XG5cbiAgICAgICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgICAgIHZhciB2YWxpZFZhbHVlID0gU3RlZWRvc1RhYmxlLmhhbmRsZURhdGEoZmllbGQsIHRoaXMuZGF0YS52YWx1ZSk7XG4gICAgICAgIFN0ZWVkb3NUYWJsZS5zZXRUYWJsZVZhbHVlKGZpZWxkLCB2YWxpZFZhbHVlKTtcblxuICAgICAgICAkKFwidGhlYWRbbmFtZT0nXCIgKyBmaWVsZCArIFwiVGhlYWQnXVwiKS5odG1sKFN0ZWVkb3NUYWJsZS5nZXRUaGVhZChmaWVsZCwgdGhpcy5kYXRhLmF0dHMuZWRpdGFibGUpKTtcblxuICAgICAgICAkKFwidGJvZHlbbmFtZT0nXCIgKyBmaWVsZCArIFwiVGJvZHknXVwiKS5odG1sKFN0ZWVkb3NUYWJsZS5nZXRUYm9keShrZXlzLCBmaWVsZCwgU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUoZmllbGQpLCB0aGlzLmRhdGEuYXR0cy5lZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSk7XG5cbiAgICAgICAgc3RyID0gdChcInN0ZWVkb3NfdGFibGVfYWRkX2l0ZW1cIik7XG4gICAgICAgIGFkZEl0ZW1UciA9IFwiPHRyIGNsYXNzPSdhZGQtaXRlbS10cic+PHRkIGNvbHNwYW49J1wiICsga2V5cy5sZW5ndGggKyBcIic+PGkgY2xhc3M9J2lvbiBpb24tcGx1cy1yb3VuZCc+PC9pPlwiICsgc3RyICsgXCI8L3RkPjwvdHI+XCI7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5hdHRzLmVkaXRhYmxlKSB7XG4gICAgICAgICAgICAkKFwidGZvb3RbbmFtZT0nXCIgKyBmaWVsZCArIFwiVGZvb3QnXVwiKS5hcHBlbmQoYWRkSXRlbVRyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgICAgIGlmIChjLnN0ZXBfdHlwZSA9PSAnY291bnRlclNpZ24nIHx8IEluc3RhbmNlTWFuYWdlci5jY0hhc0VkaXRQZXJtaXNzaW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b3J1bihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBUZW1wbGF0ZS5jdXJyZW50RGF0YSgpO1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGRhdGEubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFN0ZWVkb3NUYWJsZS5nZXRLZXlzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsaWRWYWx1ZSA9IFN0ZWVkb3NUYWJsZS5oYW5kbGVEYXRhKGZpZWxkLCBkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVWYWx1ZShmaWVsZCwgdmFsaWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgJChcInRib2R5W25hbWU9J1wiICsgZmllbGQgKyBcIlRib2R5J11cIikuaHRtbChTdGVlZG9zVGFibGUuZ2V0VGJvZHkoa2V5cywgZmllbGQsIFN0ZWVkb3NUYWJsZS5nZXRUYWJsZVZhbHVlKGZpZWxkKSwgZGF0YS5hdHRzLmVkaXRhYmxlLCBzZmllbGRzRWRpdGFibGUpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgIH07XG59IiwiSW1hZ2VTaWduLmhlbHBlcnMgPVxuXHRzcGFjZVVzZXJTaWduOiAodXNlcklkKS0+XG5cdFx0c3BhY2UgPSBcIlwiXG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdHNwYWNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnNwYWNlXG5cdFx0ZWxzZVxuXHRcdFx0c3BhY2UgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcblxuXHRcdHNwYWNlVXNlclNpZ24gPSBkYi5zcGFjZV91c2VyX3NpZ25zLmZpbmRPbmUoe3NwYWNlOiBzcGFjZSwgdXNlcjogdXNlcklkfSk7XG5cdFx0cmV0dXJuIHNwYWNlVXNlclNpZ25cblxuXHRpbWFnZVVSTDogKHVzZXJJZCktPlxuXG5cdFx0c3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24odXNlcklkKTtcblxuXHRcdGFic29sdXRlID0gZmFsc2VcblxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0YWJzb2x1dGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuYWJzb2x1dGVcblxuXHRcdGlmIHNwYWNlVXNlclNpZ24/LnNpZ25cblx0XHRcdGlmIGFic29sdXRlXG5cdFx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcGkvZmlsZXMvYXZhdGFycy9cIiArIHNwYWNlVXNlclNpZ24uc2lnbik7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyBzcGFjZVVzZXJTaWduLnNpZ24pO1xuIiwiSW1hZ2VTaWduLmhlbHBlcnMgPSB7XG4gIHNwYWNlVXNlclNpZ246IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgIHZhciBzcGFjZSwgc3BhY2VVc2VyU2lnbjtcbiAgICBzcGFjZSA9IFwiXCI7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgc3BhY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuc3BhY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYWNlID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIH1cbiAgICBzcGFjZVVzZXJTaWduID0gZGIuc3BhY2VfdXNlcl9zaWducy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZSxcbiAgICAgIHVzZXI6IHVzZXJJZFxuICAgIH0pO1xuICAgIHJldHVybiBzcGFjZVVzZXJTaWduO1xuICB9LFxuICBpbWFnZVVSTDogZnVuY3Rpb24odXNlcklkKSB7XG4gICAgdmFyIGFic29sdXRlLCBzcGFjZVVzZXJTaWduO1xuICAgIHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKHVzZXJJZCk7XG4gICAgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBhYnNvbHV0ZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5hYnNvbHV0ZTtcbiAgICB9XG4gICAgaWYgKHNwYWNlVXNlclNpZ24gIT0gbnVsbCA/IHNwYWNlVXNlclNpZ24uc2lnbiA6IHZvaWQgMCkge1xuICAgICAgaWYgKGFic29sdXRlKSB7XG4gICAgICAgIHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcGkvZmlsZXMvYXZhdGFycy9cIiArIHNwYWNlVXNlclNpZ24uc2lnbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgc3BhY2VVc2VyU2lnbi5zaWduKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iLCJUcmFjZXNIYW5kbGVyLmhlbHBlcnMgPVxuXHRzaG93U2lnbkltYWdlOiAoaGFuZGxlciwgaXNfZmluaXNoZWQsIGp1ZGdlLCB0cmFjZVNob3dTaWduSW1hZ2UpIC0+XG5cdFx0aWYgdHJhY2VTaG93U2lnbkltYWdlID09IGZhbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRpZiAhaXNfZmluaXNoZWRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGlmIFsncmV0dXJuZWQnLCAndGVybWluYXRlZCcsICdyZXRyaWV2ZWQnXS5pbmNsdWRlcyhqdWRnZSlcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKGhhbmRsZXIpXG5cblx0XHRpZiBzcGFjZVVzZXJTaWduPy5zaWduXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdG9iamVjdFVybDogKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCktPlxuXHRcdHJldHVybiBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpIiwiVHJhY2VzSGFuZGxlci5oZWxwZXJzID0ge1xuICBzaG93U2lnbkltYWdlOiBmdW5jdGlvbihoYW5kbGVyLCBpc19maW5pc2hlZCwganVkZ2UsIHRyYWNlU2hvd1NpZ25JbWFnZSkge1xuICAgIHZhciBzcGFjZVVzZXJTaWduO1xuICAgIGlmICh0cmFjZVNob3dTaWduSW1hZ2UgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghaXNfZmluaXNoZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFsncmV0dXJuZWQnLCAndGVybWluYXRlZCcsICdyZXRyaWV2ZWQnXS5pbmNsdWRlcyhqdWRnZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24oaGFuZGxlcik7XG4gICAgaWYgKHNwYWNlVXNlclNpZ24gIT0gbnVsbCA/IHNwYWNlVXNlclNpZ24uc2lnbiA6IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIG9iamVjdFVybDogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCk7XG4gIH1cbn07XG4iLCJtYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzID1cblx0YXBwbGljYW50Q29udGV4dDogLT5cblx0XHRzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZGF0YSA9IHtcblx0XHRcdG5hbWU6ICdpbnNfYXBwbGljYW50Jyxcblx0XHRcdGF0dHM6IHtuYW1lOiAnaW5zX2FwcGxpY2FudCcsIGlkOiAnaW5zX2FwcGxpY2FudCcsIGNsYXNzOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCd9LFxuXHRcdFx0dmFsdWU6IHN0ZWVkb3NfaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblx0XHR9XG5cdFx0aWYgbm90IHN0ZWVkb3NfaW5zdGFuY2UgfHwgc3RlZWRvc19pbnN0YW5jZS5zdGF0ZSAhPSBcImRyYWZ0XCJcblx0XHRcdGRhdGEuYXR0cy5kaXNhYmxlZCA9IHRydWVcblx0XHRyZXR1cm4gZGF0YTtcblxuXHRpbnN0YW5jZUlkOiAtPlxuXHRcdHJldHVybiAnaW5zdGFuY2Vmb3JtJzsjXCJpbnN0YW5jZV9cIiArIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKTtcblxuXHRmb3JtX3R5cGVzOiAtPlxuXHRcdGlmIEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKVxuXHRcdFx0cmV0dXJuICdkaXNhYmxlZCc7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuICdtZXRob2QnO1xuXG5cdHN0ZWVkb3NfZm9ybTogLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRcdGlmIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuIGZvcm1fdmVyc2lvblxuXG5cdGlubmVyc3ViZm9ybUNvbnRleHQ6IChvYmopLT5cblx0XHRkb2NfdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuXHRcdG9ialtcInRhYmxlVmFsdWVzXCJdID0gaWYgZG9jX3ZhbHVlcyB0aGVuIGRvY192YWx1ZXNbb2JqLmNvZGVdIGVsc2UgW11cblx0XHRvYmpbXCJmb3JtSWRcIl0gPSBcImluc3RhbmNlZm9ybVwiO1xuXHRcdHJldHVybiBvYmo7XG5cblx0aW5zdGFuY2U6IC0+XG5cdFx0U2Vzc2lvbi5nZXQoXCJjaGFuZ2VfZGF0ZVwiKVxuXHRcdGlmIChTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpXG5cdFx0XHRzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0XHRyZXR1cm4gc3RlZWRvc19pbnN0YW5jZTtcblxuXHRlbXB0eTogKHZhbCkgLT5cblx0XHRpZiB2YWxcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdHVuZW1wdHk6ICh2YWwpIC0+XG5cdFx0aWYgdmFsXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0ZXF1YWxzOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gKGEgPT0gYilcblxuXHR1bmVxdWFsczogKGEsIGIpIC0+XG5cdFx0cmV0dXJuICEoYSA9PSBiKVxuXG5cdGluY2x1ZGVzOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuXG5cdGluY2x1ZGU6IChhLCBiKSAtPlxuXHRcdHJldHVybiBiLnNwbGl0KCcsJykuaW5jbHVkZXMoYSk7XG5cblx0ZmllbGRzOiAtPlxuXHRcdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cdFx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuXG5cdGZvcm1hdERhdGU6IChkYXRlLCBvcHRpb25zKS0+XG5cdFx0aWYgIWRhdGVcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdGlmIG9wdGlvbnMgJiYgdHlwZW9mKG9wdGlvbnMpID09ICdzdHJpbmcnXG5cdFx0XHRvcHRpb25zID0gSlNPTi5wYXJzZShvcHRpb25zKTtcblxuXHRcdGlmICFvcHRpb25zLmZvcm1hdFxuXHRcdFx0b3B0aW9ucyA9IHtmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbVwifVxuXG5cdFx0cmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQob3B0aW9ucy5mb3JtYXQpO1xuXG5cdHRyYWNlczogLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdHN0ZWVkb3NEYXRhID0gVGVtcGxhdGUuaW5zdGFuY2UoKT8udmlldz8udGVtcGxhdGU/LnN0ZWVkb3NEYXRhXG5cdFx0XHRpbnN0YW5jZSA9IHN0ZWVkb3NEYXRhPy5pbnN0YW5jZVxuXHRcdFx0ZmxvdyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbihpbnN0YW5jZSk7XG5cdFx0XHRsb2NhbGUgPSBzdGVlZG9zRGF0YT8ubG9jYWxlXG5cdFx0XHRpZiBsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnemgtY24nXG5cdFx0XHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRcdGVsc2Vcblx0XHRcdGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cblx0XHRcdGZsb3cgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGbG93VmVyc2lvbigpXG5cblx0XHRcdGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIilcblxuXHRcdGlmICFpbnN0YW5jZSB8fCAhZmxvd1xuXHRcdFx0cmV0dXJuIHt9O1xuXG5cdFx0c3RlcHMgPSBmbG93LnN0ZXBzO1xuXG5cdFx0dHJhY2VzID0ge307XG5cblx0XHRpbnN0YW5jZS50cmFjZXM/LmZvckVhY2ggKHRyYWNlKS0+XG5cdFx0XHRzdGVwID0gc3RlcHMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB0cmFjZS5zdGVwKVxuXG5cdFx0XHRhcHByb3ZlcyA9IFtdXG5cblx0XHRcdHRyYWNlLmFwcHJvdmVzPy5mb3JFYWNoIChhcHByb3ZlKSAtPlxuXHRcdFx0XHRpZiB0cmFjZS5pc19maW5pc2hlZCA9PSB0cnVlXG4jIOW3sue7k+adn+eahOaYvuekuuS4uuaguOWHhi/pqbPlm54v5Y+W5raI55Sz6K+3XG5cdFx0XHRcdFx0aWYgYXBwcm92ZS5qdWRnZSA9PSAnYXBwcm92ZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIGFwcHJvdmVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICdyZWplY3RlZCdcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcmVqZWN0ZWRcIiwge30sIGxvY2FsZSlcblx0XHRcdFx0XHRlbHNlIGlmIGFwcHJvdmUuanVkZ2UgPT0gJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHRlcm1pbmF0ZWRcIiwge30sIGxvY2FsZSlcblx0XHRcdFx0XHRlbHNlIGlmIGFwcHJvdmUuanVkZ2UgPT0gJ3JlYXNzaWduZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlYXNzaWduZWRcIiwge30sIGxvY2FsZSlcblx0XHRcdFx0XHRlbHNlIGlmIGFwcHJvdmUuanVkZ2UgPT0gJ3JlbG9jYXRlZCdcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcmVsb2NhdGVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICcnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gXCJcIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBcIlwiXG5cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgcGVuZGluZ1wiLCB7fSwgbG9jYWxlKVxuXG5cdFx0XHRcdGFwcHJvdmVzLnB1c2hcblx0XHRcdFx0XHRfaWQ6IGFwcHJvdmUuX2lkXG5cdFx0XHRcdFx0aGFuZGxlcjogYXBwcm92ZS51c2VyXG5cdFx0XHRcdFx0aGFuZGxlcl9uYW1lOiBhcHByb3ZlLmhhbmRsZXJfbmFtZVxuXHRcdFx0XHRcdGhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWU6IGFwcHJvdmUuaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZVxuXHRcdFx0XHRcdGhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lOiBhcHByb3ZlLmhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lXG5cdFx0XHRcdFx0ZmluaXNoX2RhdGU6IGFwcHJvdmUuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRqdWRnZTogYXBwcm92ZS5qdWRnZVxuXHRcdFx0XHRcdGp1ZGdlX25hbWU6IGp1ZGdlX25hbWVcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogYXBwcm92ZS5kZXNjcmlwdGlvblxuXHRcdFx0XHRcdGlzX2ZpbmlzaGVkOiBhcHByb3ZlLmlzX2ZpbmlzaGVkXG5cdFx0XHRcdFx0dHlwZTogYXBwcm92ZS50eXBlXG5cdFx0XHRcdFx0b3Bpbmlvbl9maWVsZHNfY29kZTogYXBwcm92ZS5vcGluaW9uX2ZpZWxkc19jb2RlXG5cdFx0XHRcdFx0c2lnbl9maWVsZF9jb2RlOiBhcHByb3ZlLnNpZ25fZmllbGRfY29kZVxuXHRcdFx0XHRcdGlzX3JlYWQ6IGFwcHJvdmUuaXNfcmVhZFxuXHRcdFx0XHRcdHNpZ25fc2hvdzogYXBwcm92ZS5zaWduX3Nob3dcblxuXG5cdFx0XHRpZiBzdGVwXG5cdFx0XHRcdGlmIHN0ZXAubmFtZSBvZiB0cmFjZXNcblx0XHRcdFx0XHR0cmFjZXNbc3RlcC5uYW1lXSA9IHRyYWNlc1tzdGVwLm5hbWVdLmNvbmNhdChhcHByb3Zlcylcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRyYWNlc1tzdGVwLm5hbWVdID0gYXBwcm92ZXNcblxuXHRcdHJldHVybiB0cmFjZXM7XG5cblxuXG5cdGRvY192YWx1ZXM6IC0+XG5cdFx0V29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuXG5cdGluc3RhbmNlX2JveF9zdHlsZTogLT5cblx0XHRib3ggPSBTZXNzaW9uLmdldChcImJveFwiKVxuXHRcdGlmIGJveCA9PSBcImluYm94XCIgfHwgYm94ID09IFwiZHJhZnRcIlxuXHRcdFx0anVkZ2UgPSBTZXNzaW9uLmdldChcImp1ZGdlXCIpXG5cdFx0XHRpZiBqdWRnZVxuXHRcdFx0XHRpZiAoanVkZ2UgPT0gXCJhcHByb3ZlZFwiKVxuXHRcdFx0XHRcdHJldHVybiBcImJveC1zdWNjZXNzXCJcblx0XHRcdFx0ZWxzZSBpZiAoanVkZ2UgPT0gXCJyZWplY3RlZFwiKVxuXHRcdFx0XHRcdHJldHVybiBcImJveC1kYW5nZXJcIlxuXHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmIGlucyAmJiBpbnMuZmluYWxfZGVjaXNpb25cblx0XHRcdGlmIGlucy5maW5hbF9kZWNpc2lvbiA9PSBcImFwcHJvdmVkXCJcblx0XHRcdFx0cmV0dXJuIFwiYm94LXN1Y2Nlc3NcIlxuXHRcdFx0ZWxzZSBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09IFwicmVqZWN0ZWRcIilcblx0XHRcdFx0cmV0dXJuIFwiYm94LWRhbmdlclwiXG5cbiNpc19kaXNhYmxlZDogLT5cbiMgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4jICAgIGlmICFpbnNcbiMgICAgICAgIHJldHVybjtcbiMgICAgaWYgaW5zLnN0YXRlIT1cImRyYWZ0XCJcbiMgICAgICAgIHJldHVybiBcImRpc2FibGVkXCI7XG4jICAgIHJldHVybjtcblxuXHR0YWJsZV9maWVsZHM6IChpbnN0YW5jZSktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblx0XHRlbHNlXG5cdFx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oaW5zdGFuY2UuZm9ybSwgaW5zdGFuY2UuZm9ybV92ZXJzaW9uKVxuXHRcdGlmIGZvcm1fdmVyc2lvblxuXHRcdFx0ZmllbGRzID0gXy5jbG9uZShmb3JtX3ZlcnNpb24uZmllbGRzKTtcblxuXHRcdFx0ZmllbGRzLmZvckVhY2ggKGZpZWxkLCBpbmRleCkgLT5cblx0XHRcdFx0ZmllbGQudHJfc3RhcnQgPSBcIlwiO1xuXHRcdFx0XHRmaWVsZC50cl9lbmQgPSBcIlwiO1xuXHRcdFx0XHR0ZF9jb2xzcGFuID0gMTtcbiNcdFx0XHRcdOW8uuWItuiuvue9ruagh+WktOWtl+auteS4uuWuveWtl+autVxuXHRcdFx0XHRpZiBDb3JlRm9ybT8ucGFnZVRpdGxlRmllbGROYW1lID09IGZpZWxkLmNvZGVcblx0XHRcdFx0XHRmaWVsZC5pc193aWRlID0gdHJ1ZVxuXG5cdFx0XHRcdGlmIGZpZWxkLmZvcm11bGEgJiYgZmllbGQudHlwZSAhPSAnb2RhdGEnXG5cdFx0XHRcdFx0ZmllbGQucGVybWlzc2lvbiA9IFwicmVhZG9ubHlcIjtcblxuXHRcdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcbiMg5aaC5p6c5b2T5YmN5a2X5q615piv5YiG57uE44CB6KGo5qC844CB5a695a2X5q61XG5cdFx0XHRcdFx0aWYgZmllbGQudHlwZSA9PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PSAndGFibGUnXG5cdFx0XHRcdFx0XHRmaWVsZC50ZF9jb2xzcGFuID0gNDtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRmaWVsZC50ZF9jb2xzcGFuID0gMztcblxuXHRcdFx0XHRcdGlmIGluZGV4ICE9IDBcblx0XHRcdFx0XHRcdGZpZWxkLnRyX3N0YXJ0ID0gXCI8dHI+XCI7XG5cdFx0XHRcdFx0XHRmaWVsZC50cl9lbmQgPSBcIjwvdHI+XCI7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRwcmVfZmllbGRzID0gZmllbGRzLnNsaWNlKDAsIGluZGV4KTtcblxuXHRcdFx0XHRcdHByZV93aWRlX2ZpZWxkcyA9IHByZV9maWVsZHMuZmlsdGVyUHJvcGVydHkoXCJpc193aWRlXCIsIHRydWUpO1xuXG5cdFx0XHRcdFx0dHJfc3RhcnQgPSBcIlwiO1xuXG5cdFx0XHRcdFx0dHJfZW5kID0gXCJcIjtcblxuXHRcdFx0XHRcdCMg5YWI6K6h566X5b2T5YmN5a2X5q615piv5ZCm5Li65a695a2X5q61XG5cdFx0XHRcdFx0YmVmb3JlX2ZpZWxkID0gbnVsbDtcblx0XHRcdFx0XHRhZnRlcl9maWVsZCA9IG51bGw7XG5cblx0XHRcdFx0XHRpZiBpbmRleCA+IDBcblx0XHRcdFx0XHRcdGJlZm9yZV9maWVsZCA9IGZpZWxkc1tpbmRleCAtIDFdXG5cblx0XHRcdFx0XHRpZiBpbmRleCA8IGZpZWxkcy5sZW5ndGggLSAxXG5cdFx0XHRcdFx0XHRhZnRlcl9maWVsZCA9IGZpZWxkc1tpbmRleCArIDFdXG5cblx0XHRcdFx0XHQjIOWmguaenOW9k+WJjeWtl+auteaYr+WIhue7hOOAgeihqOagvOOAgeWuveWtl+autVxuXHRcdFx0XHRcdGlmIGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDQ7XG5cdFx0XHRcdFx0ZWxzZSBpZiBmaWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHR0ZF9jb2xzcGFuID0gMztcblx0XHRcdFx0XHRlbHNlXG4jIOWJjeWQjumDveaYr+WuveWtl+autVxuXHRcdFx0XHRcdFx0aWYgYmVmb3JlX2ZpZWxkICYmIGFmdGVyX2ZpZWxkICYmIGJlZm9yZV9maWVsZC5pc193aWRlICYmIGFmdGVyX2ZpZWxkLmlzX3dpZGVcblx0XHRcdFx0XHRcdFx0ZmllbGQuaXNfd2lkZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSAzO1xuXG5cdFx0XHRcdFx0XHQjIOW9k+WJjeaYr3RyIOS4i+eahCDnrKzkuIDkuKp0ZCAmIOWQjui+ueeahOWtl+auteaYr+WuveWtl+autVxuXHRcdFx0XHRcdFx0aWYgKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09IDAgJiYgYWZ0ZXJfZmllbGQgJiYgYWZ0ZXJfZmllbGQuaXNfd2lkZVxuXHRcdFx0XHRcdFx0XHRmaWVsZC5pc193aWRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDM7XG5cblx0XHRcdFx0XHRcdCMg5b2T5YmN5pivdHIg5LiL55qEIOesrOS4gOS4qnRkICYg5b2T5YmN5a2X5q615piv5pyA5ZCO5LiA5Liq5a2X5q61XG5cdFx0XHRcdFx0XHRpZiAocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT0gMCAmJiBhZnRlcl9maWVsZCA9PSBudWxsXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR0ZF9jb2xzcGFuID0gMztcblxuXHRcdFx0XHRcdGZpZWxkLnRkX2NvbHNwYW4gPSB0ZF9jb2xzcGFuO1xuXG5cblx0XHRcdFx0XHRpZiBpbmRleCA9PSAwXG4jIHRyX3N0YXJ0ID0gXCI8dHI+XCI7IOeUseS6jlRlbXBsYXRl55qE57yW6K+RYnVn77yM5a+86Ie05q+P5qyh57uZ5LiA5LiqdHLlvIDlp4vml7bvvIzkvJroh6rliqjooaXlpLTmiJbooaXlsL7jgILlm6DmraTlnKjnrKzkuIDooYzov5Tlm57kuIDkuKrnqbrlrZfnrKbkuLIuXG5cdFx0XHRcdFx0XHR0cl9zdGFydCA9IFwiPHRyPlwiO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlmIChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PSAwIHx8IGZpZWxkLmlzX3dpZGVcblx0XHRcdFx0XHRcdFx0aWYgZmllbGQudHlwZSA9PSAndGFibGUnXG5cdFx0XHRcdFx0XHRcdFx0dHJfc3RhcnQgPSBcIjx0ciBjbGFzcyA9IFxcXCJ0ci1jaGlsZC10YWJsZVxcXCI+XCI7XG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHR0cl9zdGFydCA9IFwiPHRyPlwiO1xuXG5cdFx0XHRcdFx0ZmllbGQudHJfc3RhcnQgPSB0cl9zdGFydDtcblxuXG5cdFx0XHRcdFx0aWYgaW5kZXggKyAxID09IGZpZWxkcy5sZW5ndGggfHwgZmllbGQudHlwZSA9PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PSAndGFibGUnIHx8IGZpZWxkLmlzX3dpZGVcblx0XHRcdFx0XHRcdHRyX2VuZCA9IFwiPC90cj5cIjtcblxuXHRcdFx0XHRcdGlmIChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiAhPSAwXG5cdFx0XHRcdFx0XHR0cl9lbmQgPSBcIjwvdHI+XCI7XG5cblx0XHRcdFx0XHRmaWVsZC50cl9lbmQgPSB0cl9lbmQ7XG5cblx0XHRcdHJldHVybiBmaWVsZHM7XG5cblx0c29ydF9hcHByb3ZlOiAoYXBwcm92ZXMsIG9yZGVyKS0+XG5cdFx0aWYgIWFwcHJvdmVzXG5cdFx0XHRyZXR1cm4gW11cblxuXHRcdGlmICFhcHByb3ZlcyBpbnN0YW5jZW9mIEFycmF5XG5cdFx0XHRyZXR1cm4gW11cblx0XHRlbHNlXG5cdFx0XHRpZiBvcmRlciA9PSAnZGVzYydcblx0XHRcdFx0YXBwcm92ZXMuc29ydCAocDEsIHAyKSAtPlxuXHRcdFx0XHRcdF9wMSA9IDBcblx0XHRcdFx0XHRfcDIgPSAwXG5cblx0XHRcdFx0XHRpZiBwMS5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0X3AxID0gcDEuZmluaXNoX2RhdGUuZ2V0VGltZSgpXG5cblx0XHRcdFx0XHRpZiBwMi5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0X3AyID0gcDIuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIF9wMiAtIF9wMVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhcHByb3Zlcy5zb3J0IChwMSwgcDIpIC0+XG5cdFx0XHRcdFx0X3AxID0gMFxuXHRcdFx0XHRcdF9wMiA9IDBcblxuXHRcdFx0XHRcdGlmIHAxLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0XHRfcDEgPSBwMS5maW5pc2hfZGF0ZS5nZXRUaW1lKClcblxuXHRcdFx0XHRcdGlmIHAyLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0XHRfcDIgPSBwMi5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gX3AxIC0gX3AyXG5cdFx0cmV0dXJuIGFwcHJvdmVzXG5cblx0X3Q6IChrZXkpLT5cblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpXG5cdGdldEZpZWxkOiAoY29kZSktPlxuXHRcdGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb25cblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVybiBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpXG5cblx0Z2V0VmFsdWU6IChjb2RlKS0+XG5cdFx0aW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2VcblxuXHRcdGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb25cblxuXHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblxuXHRcdHV0Y09mZnNldCA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS51dGNPZmZzZXRcblxuXHRcdHZhbHVlcyA9IGluc3RhbmNlLnZhbHVlcyB8fCB7fVxuXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHR2YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKClcblxuXHRcdHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUgdmFsdWVzW2NvZGVdLCBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpLCBsb2NhbGUsIHV0Y09mZnNldFxuXG5cdGdldExhYmVsOiAoY29kZSktPlxuXHRcdGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb25cblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgZm9ybV92ZXJzaW9uLmZpZWxkcywgY29kZVxuXG5cdGlzVGV4dGFyZWE6IChmaWVsZCktPlxuXHRcdGlmIGZpZWxkPy50eXBlID09IFwiaW5wdXRcIiAmJiBmaWVsZD8uaXNfdGV4dGFyZWFcblx0XHRcdHJldHVybiB0cnVlXG5cblx0Z2V0Q2ZDbGFzczogKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQ/LnR5cGUgPT0gXCJpbnB1dFwiICYmIGZpZWxkPy5pc190ZXh0YXJlYVxuXHRcdFx0cmV0dXJuIFwiY2ZUZXh0YXJlYVwiXG5cblx0Z2V0VGFibGVUaGVhZDogKGZpZWxkKS0+XG5cdFx0cmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRUaGVhZChmaWVsZCwgZmFsc2UpXG5cblx0Z2V0VGFibGVCb2R5OiAoZmllbGQpLT5cblxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0aW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2Vcblx0XHRcdHZhbHVlcyA9IGluc3RhbmNlLnZhbHVlcyB8fCB7fVxuXHRcdGVsc2Vcblx0XHRcdHZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKVxuXG5cdFx0dGFibGVWYWx1ZSA9IHZhbHVlc1tmaWVsZC5jb2RlXTtcblx0XHRyZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRib2R5KGZpZWxkLnNmaWVsZHMuZ2V0UHJvcGVydHkoXCJjb2RlXCIpLCBmaWVsZCwgdGFibGVWYWx1ZSwgZmFsc2UpXG5cblx0c2hvd0xhYmVsOiAoZmllbGQpLT5cblx0XHR0ZW1wbGF0ZURhdGEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGFcblx0XHRpZiB0ZW1wbGF0ZURhdGEubGFiZWwgPT0gZmFsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHJldHVybiB0cnVlXG5cbiNcdGFmRmllbGRMYWJlbFRleHQ6IChvcCktPlxuI1x0XHRpZiAhVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhXG4jXHRcdFx0cmV0dXJuIEF1dG9Gb3JtLmdldExhYmVsRm9yRmllbGQob3AubmFtZSlcbiNcdFx0ZWxzZVxuI1x0XHRcdGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb25cbiNcdFx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgZm9ybV92ZXJzaW9uLmZpZWxkcywgb3A/Lmhhc2g/Lm5hbWVcblxuXHRpc09waW5pb25GaWVsZDogKGZpZWxkKS0+XG5cdFx0cmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGQuZm9ybXVsYSlcblxuXHRpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZzogKGZpZWxkX2Zvcm11bGEpLT5cblx0XHRyZXR1cm4gSW5zdGFuY2VTaWduVGV4dC5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKVxuXG5cdGluY2x1ZGVzT3BpbmlvbkZpZWxkOiAoZm9ybSwgZm9ybV92ZXJzaW9uKS0+XG5cblx0XHRmaWVsZF9mb3JtdWxhcyA9IG5ldyBBcnJheSgpO1xuXG5cdFx0ZmllbGRzID0gZGIuZm9ybV92ZXJzaW9ucy5maW5kT25lKHtfaWQ6IGZvcm1fdmVyc2lvbiwgZm9ybTogZm9ybX0pPy5maWVsZHMgfHwgW11cblxuXHRcdGZpZWxkcy5mb3JFYWNoIChmKS0+XG5cdFx0XHRpZiBmLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRjb25zb2xlLmxvZyAnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnXG5cdFx0XHRlbHNlIGlmIGYudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdFx0Zj8uZmllbGRzPy5mb3JFYWNoIChmMSktPlxuXHRcdFx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZjEuZm9ybXVsYVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmaWVsZF9mb3JtdWxhcy5wdXNoIGYuZm9ybXVsYVxuXG5cdFx0Xy5zb21lIGZpZWxkX2Zvcm11bGFzLCAoZmllbGRfZm9ybXVsYSktPlxuXHRcdFx0cmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSlcblxuXHRnZXRPcGluaW9uRmllbGRTdGVwc05hbWU6IChmaWVsZF9mb3JtdWxhLCB0b3Bfa2V5d29yZHMpLT5cblxuXHRcdG9waW5pb25GaWVsZHMgPSBuZXcgQXJyYXkoKTtcbiNcdFx0Y29uc29sZS5sb2coXCJmaWVsZF9mb3JtdWxhXCIsIGZpZWxkX2Zvcm11bGEpXG5cdFx0aWYgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKVxuXHRcdFx0aWYgZmllbGRfZm9ybXVsYVxuXG4jXHRcdFx0XHRmb28xID0gZmllbGRfZm9ybXVsYS5zcGxpdChcIixcIilcblx0XHRcdFx0Zm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCI7XCIpXG5cbiNcdFx0XHRcdGlmIHRvcF9rZXl3b3Jkc1xuI1x0XHRcdFx0XHRmb28xID0gZmllbGRfZm9ybXVsYS5zcGxpdChcIjtcIilcblxuXHRcdFx0XHRmb28xLmZvckVhY2ggKGZvbyktPlxuXHRcdFx0XHRcdGpzb25fZm9ybXVsYSA9IHt9XG5cblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGpzb25fZm9ybXVsYSA9IGV2YWwoXCIoXCIgKyBmb28gKyBcIilcIilcblx0XHRcdFx0XHRjYXRjaFxuXHRcdFx0XHRcdFx0anNvbl9mb3JtdWxhID0ge31cblxuXHRcdFx0XHRcdGlmIGpzb25fZm9ybXVsYT8ueWlqaWFubGFuXG5cdFx0XHRcdFx0XHRzZiA9IHt9XG5cblx0XHRcdFx0XHRcdHNmLnN0ZXBOYW1lID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5zdGVwXG5cblx0XHRcdFx0XHRcdHNmLmltYWdlX3NpZ24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLmltYWdlX3NpZ24gfHwgZmFsc2VcblxuXHRcdFx0XHRcdFx0c2Yub25seV9jY19vcGluaW9uID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5vbmx5X2NjIHx8IGZhbHNlXG5cblx0XHRcdFx0XHRcdHNmLmRlZmF1bHRfZGVzY3JpcHRpb24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLmRlZmF1bHRcblxuXHRcdFx0XHRcdFx0c2Yub25seV9oYW5kbGVyID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5vbmx5X2hhbmRsZXJcblxuXHRcdFx0XHRcdFx0c2YudG9wX2tleXdvcmRzID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi50b3Bfa2V5d29yZHMgfHwgdG9wX2tleXdvcmRzXG5cblx0XHRcdFx0XHRcdG9waW5pb25GaWVsZHMucHVzaChzZik7XG5cblx0XHRcdFx0XHRlbHNlIGlmKGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMSlcblxuXHRcdFx0XHRcdFx0c2YgPSB7b25seV9jY19vcGluaW9uOiBmYWxzZSwgaW1hZ2Vfc2lnbjogZmFsc2UsIHRvcF9rZXl3b3JkczogdG9wX2tleXdvcmRzfVxuXG5cdFx0XHRcdFx0XHRpZiBmb28uaW5kZXhPZihcIntzaWduYXR1cmUuXCIpID4gLTFcblx0XHRcdFx0XHRcdFx0c2YuaW1hZ2Vfc2lnbiA9IHRydWVcblx0XHRcdFx0XHRcdFx0Zm9vID0gZm9vLnJlcGxhY2UoXCJ7c2lnbmF0dXJlLlwiLFwiXCIpO1xuXG5cdFx0XHRcdFx0XHRzMSA9IGZvby5yZXBsYWNlKFwie1wiLFwiXCIpLnJlcGxhY2UoXCJ9XCIsXCJcIilcblx0XHRcdFx0XHRcdGlmIHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxXG5cdFx0XHRcdFx0XHRcdHNmLnN0ZXBOYW1lID0gczEuc3BsaXQoXCIuXCIpWzFdXG5cdFx0XHRcdFx0XHRcdGlmIG9waW5pb25GaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJzdGVwTmFtZVwiLHNmLnN0ZXBOYW1lKS5sZW5ndGggPiAwXG5cdFx0XHRcdFx0XHRcdFx0b3BpbmlvbkZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcE5hbWVcIiwgc2Yuc3RlcE5hbWUpPy5vbmx5X2NjX29waW5pb24gPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRpZiBzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMlxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpWzJdPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdjYydcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2Yub25seV9jY19vcGluaW9uID0gdHJ1ZVxuXHRcdFx0XHRcdFx0b3BpbmlvbkZpZWxkcy5wdXNoKHNmKTtcblxuXHRcdHJldHVybiBvcGluaW9uRmllbGRzXG5cblx0c2hvd0NDT3BpbmlvbjogKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQuZm9ybXVsYT8uaW5kZXhPZihcInt0cmFjZXMuXCIpID4gLTEgfHwgZmllbGQuZm9ybXVsYT8uaW5kZXhPZihcIntzaWduYXR1cmUudHJhY2VzLlwiKSA+IC0xXG5cdFx0XHRzMSA9IGZpZWxkLmZvcm11bGEucmVwbGFjZShcIntzaWduYXR1cmUuXCIsXCJcIikucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpXG5cdFx0XHRpZiBzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMlxuXHRcdFx0XHRpZiBzMS5zcGxpdChcIi5cIilbMl0/LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ2NjJ1xuXHRcdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0bWFya0Rvd25Ub0h0bWw6IChtYXJrRG93blN0cmluZyktPlxuXHRcdGlmIG1hcmtEb3duU3RyaW5nXG5cdFx0XHQjIHJlbmRlcmVyID0gbmV3IE1hcmtkb3duLlJlbmRlcmVyKCk7XG5cdFx0XHQjIHJlbmRlcmVyLmxpbmsgPSAoIGhyZWYsIHRpdGxlLCB0ZXh0ICkgLT5cblx0XHRcdCMgXHRyZXR1cm4gXCI8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nI3tocmVmfScgdGl0bGU9JyN7dGl0bGV9Jz4je3RleHR9PC9hPlwiXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0bWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpXG5cdFx0XHRyZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSlcblxuXHRmX2xhYmVsOiAodGhhdCktPlxuXHRcdHJldHVybiB0aGF0Lm5hbWUgfHwgdGhhdC5jb2RlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnN0ZWVkb3NfZm9ybSA9IC0+XG5cdFx0cmV0dXJuIHRoaXMuZm9ybV92ZXJzaW9uXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc1NlY3Rpb24gPSAoY29kZSktPlxuXHRcdGZvcm1fdmVyc2lvbiA9IHRoaXMuZm9ybV92ZXJzaW9uXG5cdFx0cmV0dXJuIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSkudHlwZSA9PSAnc2VjdGlvbidcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmRvY192YWx1ZXMgPSAtPlxuXHRcdGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcblx0XHRyZXR1cm4gaW5zdGFuY2UudmFsdWVzO1xuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuYXBwbGljYW50Q29udGV4dCA9IC0+XG5cdFx0aW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlO1xuXHRcdGRhdGEgPSB7XG5cdFx0XHRuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRhdHRzOiB7bmFtZTogJ2luc19hcHBsaWNhbnQnLCBpZDogJ2luc19hcHBsaWNhbnQnLCBjbGFzczogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnfSxcblx0XHRcdHZhbHVlOiBpbnN0YW5jZS5hcHBsaWNhbnRfbmFtZVxuXHRcdH1cblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluc3RhbmNlID0gLT5cblx0XHRyZXR1cm4gdGhpcy5pbnN0YW5jZVxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZmllbGRzID0gLT5cblx0XHRmb3JtX3ZlcnNpb24gPSB0aGlzLmZvcm1fdmVyc2lvblxuXHRcdGlmIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZvcm1fdHlwZXMgPSAtPlxuXHRcdHJldHVybiBcImRpc2FibGVkXCJcblxuXHRUZW1wbGF0ZS5yZWdpc3RlckhlbHBlciBcImFmRmllbGRMYWJlbFRleHRcIiwgKG9wKS0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvblxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCBmb3JtX3ZlcnNpb24uZmllbGRzLCBvcD8uaGFzaD8ubmFtZVxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuX3QgPSAoa2V5KS0+XG5cdFx0bG9jYWxlID0gdGhpcy5sb2NhbGVcblxuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSlcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluc19hdHRhY2hfZG93bmxvYWRfdXJsID0gKF9pZCwgYWJzb2x1dGUpLT5cblx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0cmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcIi9hcGkvZmlsZXMvaW5zdGFuY2VzLyN7X2lkfT9kb3dubG9hZD10cnVlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBcIi9hcGkvZmlsZXMvaW5zdGFuY2VzLyN7X2lkfT9kb3dubG9hZD10cnVlXCI7XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5vcHRpb25zID0gKGZpZWxkKS0+XG5cdFx0b3B0aW9ucyA9IGZpZWxkPy5vcHRpb25zPy5zcGxpdChcIlxcblwiKVxuXHRcdHJldiA9IFtdXG5cdFx0b3B0aW9ucz8uZm9yRWFjaCAoaXRlbSktPlxuXHRcdFx0cmV2LnB1c2goe2xhYmVsOiBpdGVtLCB2YWx1ZTogaXRlbX0pXG5cblx0XHRyZXR1cm4gcmV2XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5nZXRQZXJtaXNzaW9ucyA9IChjb2RlKS0+XG5cdFx0aWYgIVRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5zdGFydFN0ZXBFZGl0YWJsZUZpZWxkcz8uaW5jbHVkZXMoY29kZSlcblx0XHRcdHJldHVybiBcInJlYWRvbmx5IGRpc2FibGVkXCJcblx0XHRyZXR1cm4gXCJcIlxuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5ldmVudHMgPVxuXHQnY2hhbmdlIC5mb3JtLWNvbnRyb2wsLmNoZWNrYm94IGlucHV0LC5hZi1yYWRpby1ncm91cCBpbnB1dCwuYWYtY2hlY2tib3gtZ3JvdXAgaW5wdXQnOiAoZXZlbnQpLT5cblx0XHRJbnN0YW5jZU1hbmFnZXIuaW5zdGFuY2Vmb3JtQ2hhbmdlRXZlbnQoZXZlbnQpXG5cblx0J3R5cGVhaGVhZDpjaGFuZ2UgLmZvcm0tY29udHJvbCc6IChldmVudCkgLT5cblx0XHRJbnN0YW5jZU1hbmFnZXIuaW5zdGFuY2Vmb3JtQ2hhbmdlRXZlbnQoZXZlbnQpXG5cblx0J2NsaWNrIC5jZlRleHRhcmVhIGEnOiAoZXZlbnQpLT5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFN0ZWVkb3Mub3BlbldpbmRvdyhldmVudC50YXJnZXQuaHJlZik7XG5cblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUub25DcmVhdGVkID0gKCktPlxuXHRpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRpZiAhaW5zdGFuY2Vcblx0XHRyZXR1cm47XG5cblx0dGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUoaW5zdGFuY2UpO1xuXG5cdHRyeVxuXHRcdGNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0ZW1wbGF0ZSwge2lzQm9keTogdHJ1ZX0pO1xuXHRjYXRjaCBlXG5cdFx0Y29uc29sZS5sb2cgXCJJbnN0YW5jZSBUZW1wbGF0ZSBFcnJvclwiLCBlXG5cdFx0Y29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKFwiXCIsIHtpc0JvZHk6IHRydWV9KTtcblxuXG5cdHJlbmRlckZ1bmN0aW9uID0gZXZhbChjb21waWxlZCk7XG5cblx0aW5zdGFuY2VWaWV3ID0gbmV3IEJsYXplLlZpZXcoXCJjdXN0b21faW5zdGFuY2VfdGVtcGxhdGVcIiwgcmVuZGVyRnVuY3Rpb24pO1xuXG5cdGluc3RhbmNlQ3VzdG9tVGVtcGxhdGUgPSBuZXcgQmxhemUuVGVtcGxhdGUoaW5zdGFuY2VWaWV3Lm5hbWUsIHJlbmRlckZ1bmN0aW9uKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZV9jdXN0b21fdGVtcGxhdGUgPSBpbnN0YW5jZUN1c3RvbVRlbXBsYXRlXG5cblx0VGVtcGxhdGUuaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlLmhlbHBlcnMgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVyc1xuXG5cblxuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5vblJlbmRlcmVkID0gKCktPlxuXHQjIHQgPSB0aGlzO1xuXG5cdCN0LnN1YnNjcmliZSBcImluc3RhbmNlX2RhdGFcIiwgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpLCAtPlxuXHQjICAgIFRyYWNrZXIuYWZ0ZXJGbHVzaCAtPlxuXHRpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRpZiAhaW5zdGFuY2Vcblx0XHRyZXR1cm47XG5cblx0IyQoXCIjaW5zX2FwcGxpY2FudFwiKS5zZWxlY3QyKCkudmFsKGluc3RhbmNlLmFwcGxpY2FudCkudHJpZ2dlcignY2hhbmdlJyk7XG5cdCMkKFwiI2luc19hcHBsaWNhbnRcIikudmFsKGluc3RhbmNlLmFwcGxpY2FudCk7XG5cdEluc3RhbmNlTWFuYWdlci5zZXRJbnN0YW5jZUZvcm1BcHBsaWNhbnQoaW5zdGFuY2UuYXBwbGljYW50LCBpbnN0YW5jZS5hcHBsaWNhbnRfbmFtZSlcblxuXG5cdEFwcHJvdmVNYW5hZ2VyLmVycm9yID0ge25leHRTdGVwczogJycsIG5leHRTdGVwVXNlcnM6ICcnfTtcblxuXHQjIGluc3RhbmNlIGZyb23nu5Hlrprkuovku7Zcblx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnZHJhZnQnXG5cdFx0SW5zdGFuY2VFdmVudC5pbml0RXZlbnRzKGluc3RhbmNlLmZsb3cpO1xuXG5cdGlmICFBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblxuXHRcdGN1cnJlbnRBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG5cblxuXHRcdGluc3RhbmNlTnVtYmVyRmllbGRzID0gJChcIltkYXRhLWZvcm11bGFdXCIsICQoXCIjaW5zdGFuY2Vmb3JtXCIpKVxuXG5cdFx0aW5zdGFuY2VOdW1iZXJGaWVsZHMuZWFjaCAoKS0+XG5cdFx0XHRzY2hlbWFLZXkgPSB0aGlzLmRhdGFzZXQuc2NoZW1hS2V5XG5cdFx0XHRlbGVtZW50ID0gJCh0aGlzKVxuXHRcdFx0aWYgISQodGhpcykudmFsKCkgJiYgc2NoZW1hS2V5ICYmIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKVxuXHRcdFx0XHRNZXRlb3IuY2FsbCAnZ2V0SW5zdGFuY2VWYWx1ZXMnLCBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIiksIChlcnJvciwgcmVzdWx0KS0+XG5cdFx0XHRcdFx0aWYgZXJyb3Jcblx0XHRcdFx0XHRcdHRvYXN0ci5lcnJvcihlcnJvci5yZWFzb24pXG5cblx0XHRcdFx0XHRpZiAhcmVzdWx0W3NjaGVtYUtleV1cblx0XHRcdFx0XHRcdGtleSA9IGVsZW1lbnQuZGF0YShcImZvcm11bGFcIik/LnJlcGxhY2UoXCJhdXRvX251bWJlcihcIiwgXCJcIikucmVwbGFjZShcIilcIiwgXCJcIilcblxuXHRcdFx0XHRcdFx0a2V5ID0ga2V5LnJlcGxhY2UoL1xcXCIvZywgXCJcIikucmVwbGFjZSgvXFwnL2csIFwiXCIpXG5cblx0XHRcdFx0XHRcdGlmIGtleS5pbmRleE9mKFwie1wiKSA+IC0xXG5cdFx0XHRcdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKFwie1wiLFwiXCIpLnJlcGxhY2UoXCJ9XCIsXCJcIilcblx0XHRcdFx0XHRcdFx0a2V5ID0ga2V5LnRyaW0oKVxuXHRcdFx0XHRcdFx0XHRrZXkgPSBBdXRvRm9ybS5nZXRGaWVsZFZhbHVlKGtleSwgJ2luc3RhbmNlZm9ybScpXG5cdFx0XHRcdFx0XHRJbnN0YW5jZU51bWJlclJ1bGVzLmluc3RhbmNlTnVtYmVyQnVpbGRlciBlbGVtZW50LCBrZXlcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRlbGVtZW50Py52YWwocmVzdWx0W3NjaGVtYUtleV0pLnRyaWdnZXIoXCJjaGFuZ2VcIilcblxuXHRcdGp1ZGdlID0gY3VycmVudEFwcHJvdmUuanVkZ2Vcblx0XHRjdXJyZW50U3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuXHRcdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cblx0XHR1bmxlc3MgZm9ybV92ZXJzaW9uXG5cdFx0XHRyZXR1cm5cblxuXHRcdHVubGVzcyBmb3JtX3ZlcnNpb24uZmllbGRzXG5cdFx0XHRyZXR1cm5cblxuXHRcdGZvcm11bGFfZmllbGRzID0gRm9ybV9mb3JtdWxhLmdldEZvcm11bGFGaWVsZFZhcmlhYmxlKFwiRm9ybV9mb3JtdWxhLmZpZWxkX3ZhbHVlc1wiLCBmb3JtX3ZlcnNpb24uZmllbGRzKTtcblx0XHRpbnNlcnREb2MgPSBBdXRvRm9ybS5nZXRGb3JtVmFsdWVzKFwiaW5zdGFuY2Vmb3JtXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmYWxzZSlcblx0XHRGb3JtX2Zvcm11bGEucnVuKFwiXCIsIFwiXCIsIGZvcm11bGFfZmllbGRzLCBpbnNlcnREb2MsIGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuXHRcdCPlnKjmraTlpITliJ3lp4vljJZzZXNzaW9uIOS4reeahCBmb3JtX3ZhbHVlcyDlj5jph4/vvIznlKjkuo7op6blj5HkuIvkuIDmraXmraXpqqTorqHnrpdcblx0XHRTZXNzaW9uLnNldChcImluc3RhbmNlX2Zvcm1fdmFsdWVzXCIsIHtpbnN0YW5jZUlkOiBpbnN0YW5jZS5faWQsIHZhbHVlczogaW5zZXJ0RG9jfSk7XG5cblxuXG4iLCJ2YXIgbWFya2VkO1xuXG5tYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpO1xuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzID0ge1xuICBhcHBsaWNhbnRDb250ZXh0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGF0YSwgc3RlZWRvc19pbnN0YW5jZTtcbiAgICBzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgZGF0YSA9IHtcbiAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgIGF0dHM6IHtcbiAgICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBpZDogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBcImNsYXNzXCI6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50J1xuICAgICAgfSxcbiAgICAgIHZhbHVlOiBzdGVlZG9zX2luc3RhbmNlLmFwcGxpY2FudF9uYW1lXG4gICAgfTtcbiAgICBpZiAoIXN0ZWVkb3NfaW5zdGFuY2UgfHwgc3RlZWRvc19pbnN0YW5jZS5zdGF0ZSAhPT0gXCJkcmFmdFwiKSB7XG4gICAgICBkYXRhLmF0dHMuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfSxcbiAgaW5zdGFuY2VJZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdpbnN0YW5jZWZvcm0nO1xuICB9LFxuICBmb3JtX3R5cGVzOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FibGVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdtZXRob2QnO1xuICAgIH1cbiAgfSxcbiAgc3RlZWRvc19mb3JtOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbiAgICB9XG4gIH0sXG4gIGlubmVyc3ViZm9ybUNvbnRleHQ6IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBkb2NfdmFsdWVzO1xuICAgIGRvY192YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gICAgb2JqW1widGFibGVWYWx1ZXNcIl0gPSBkb2NfdmFsdWVzID8gZG9jX3ZhbHVlc1tvYmouY29kZV0gOiBbXTtcbiAgICBvYmpbXCJmb3JtSWRcIl0gPSBcImluc3RhbmNlZm9ybVwiO1xuICAgIHJldHVybiBvYmo7XG4gIH0sXG4gIGluc3RhbmNlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RlZWRvc19pbnN0YW5jZTtcbiAgICBTZXNzaW9uLmdldChcImNoYW5nZV9kYXRlXCIpO1xuICAgIGlmIChTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpIHtcbiAgICAgIHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIHJldHVybiBzdGVlZG9zX2luc3RhbmNlO1xuICAgIH1cbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uKHZhbCkge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICB1bmVtcHR5OiBmdW5jdGlvbih2YWwpIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH0sXG4gIHVuZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuICEoYSA9PT0gYik7XG4gIH0sXG4gIGluY2x1ZGVzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcbiAgfSxcbiAgaW5jbHVkZTogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiLnNwbGl0KCcsJykuaW5jbHVkZXMoYSk7XG4gIH0sXG4gIGZpZWxkczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG4gICAgfVxuICB9LFxuICBmb3JtYXREYXRlOiBmdW5jdGlvbihkYXRlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0gSlNPTi5wYXJzZShvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmZvcm1hdCkge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgZm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW1cIlxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQob3B0aW9ucy5mb3JtYXQpO1xuICB9LFxuICB0cmFjZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmbG93LCBpbnN0YW5jZSwgbG9jYWxlLCByZWYsIHJlZjEsIHJlZjIsIHJlZjMsIHN0ZWVkb3NEYXRhLCBzdGVwcywgdHJhY2VzO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIHN0ZWVkb3NEYXRhID0gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi52aWV3KSAhPSBudWxsID8gKHJlZjIgPSByZWYxLnRlbXBsYXRlKSAhPSBudWxsID8gcmVmMi5zdGVlZG9zRGF0YSA6IHZvaWQgMCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIGluc3RhbmNlID0gc3RlZWRvc0RhdGEgIT0gbnVsbCA/IHN0ZWVkb3NEYXRhLmluc3RhbmNlIDogdm9pZCAwO1xuICAgICAgZmxvdyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbihpbnN0YW5jZSk7XG4gICAgICBsb2NhbGUgPSBzdGVlZG9zRGF0YSAhPSBudWxsID8gc3RlZWRvc0RhdGEubG9jYWxlIDogdm9pZCAwO1xuICAgICAgaWYgKGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSAnemgtY24nKSB7XG4gICAgICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGZsb3cgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGbG93VmVyc2lvbigpO1xuICAgICAgbG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKTtcbiAgICB9XG4gICAgaWYgKCFpbnN0YW5jZSB8fCAhZmxvdykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBzdGVwcyA9IGZsb3cuc3RlcHM7XG4gICAgdHJhY2VzID0ge307XG4gICAgaWYgKChyZWYzID0gaW5zdGFuY2UudHJhY2VzKSAhPSBudWxsKSB7XG4gICAgICByZWYzLmZvckVhY2goZnVuY3Rpb24odHJhY2UpIHtcbiAgICAgICAgdmFyIGFwcHJvdmVzLCByZWY0LCBzdGVwO1xuICAgICAgICBzdGVwID0gc3RlcHMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB0cmFjZS5zdGVwKTtcbiAgICAgICAgYXBwcm92ZXMgPSBbXTtcbiAgICAgICAgaWYgKChyZWY0ID0gdHJhY2UuYXBwcm92ZXMpICE9IG51bGwpIHtcbiAgICAgICAgICByZWY0LmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICAgICAgdmFyIGp1ZGdlX25hbWU7XG4gICAgICAgICAgICBpZiAodHJhY2UuaXNfZmluaXNoZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICdhcHByb3ZlZCcpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIGFwcHJvdmVkXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlamVjdGVkXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICd0ZXJtaW5hdGVkJykge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBUQVBpMThuLl9fKFwiSW5zdGFuY2UgU3RhdGUgdGVybWluYXRlZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAncmVhc3NpZ25lZCcpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlYXNzaWduZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJ3JlbG9jYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlbG9jYXRlZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGp1ZGdlX25hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHBlbmRpbmdcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXBwcm92ZXMucHVzaCh7XG4gICAgICAgICAgICAgIF9pZDogYXBwcm92ZS5faWQsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IGFwcHJvdmUudXNlcixcbiAgICAgICAgICAgICAgaGFuZGxlcl9uYW1lOiBhcHByb3ZlLmhhbmRsZXJfbmFtZSxcbiAgICAgICAgICAgICAgaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZTogYXBwcm92ZS5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lLFxuICAgICAgICAgICAgICBoYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZTogYXBwcm92ZS5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZSxcbiAgICAgICAgICAgICAgZmluaXNoX2RhdGU6IGFwcHJvdmUuZmluaXNoX2RhdGUsXG4gICAgICAgICAgICAgIGp1ZGdlOiBhcHByb3ZlLmp1ZGdlLFxuICAgICAgICAgICAgICBqdWRnZV9uYW1lOiBqdWRnZV9uYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYXBwcm92ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgaXNfZmluaXNoZWQ6IGFwcHJvdmUuaXNfZmluaXNoZWQsXG4gICAgICAgICAgICAgIHR5cGU6IGFwcHJvdmUudHlwZSxcbiAgICAgICAgICAgICAgb3Bpbmlvbl9maWVsZHNfY29kZTogYXBwcm92ZS5vcGluaW9uX2ZpZWxkc19jb2RlLFxuICAgICAgICAgICAgICBzaWduX2ZpZWxkX2NvZGU6IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlLFxuICAgICAgICAgICAgICBpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWQsXG4gICAgICAgICAgICAgIHNpZ25fc2hvdzogYXBwcm92ZS5zaWduX3Nob3dcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgaWYgKHN0ZXAubmFtZSBpbiB0cmFjZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFjZXNbc3RlcC5uYW1lXSA9IHRyYWNlc1tzdGVwLm5hbWVdLmNvbmNhdChhcHByb3Zlcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFjZXNbc3RlcC5uYW1lXSA9IGFwcHJvdmVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0cmFjZXM7XG4gIH0sXG4gIGRvY192YWx1ZXM6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gIH0sXG4gIGluc3RhbmNlX2JveF9zdHlsZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJveCwgaW5zLCBqdWRnZTtcbiAgICBib3ggPSBTZXNzaW9uLmdldChcImJveFwiKTtcbiAgICBpZiAoYm94ID09PSBcImluYm94XCIgfHwgYm94ID09PSBcImRyYWZ0XCIpIHtcbiAgICAgIGp1ZGdlID0gU2Vzc2lvbi5nZXQoXCJqdWRnZVwiKTtcbiAgICAgIGlmIChqdWRnZSkge1xuICAgICAgICBpZiAoanVkZ2UgPT09IFwiYXBwcm92ZWRcIikge1xuICAgICAgICAgIHJldHVybiBcImJveC1zdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoanVkZ2UgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgIHJldHVybiBcImJveC1kYW5nZXJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBpZiAoaW5zICYmIGlucy5maW5hbF9kZWNpc2lvbikge1xuICAgICAgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImJveC1zdWNjZXNzXCI7XG4gICAgICB9IGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImJveC1kYW5nZXJcIjtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHRhYmxlX2ZpZWxkczogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgZmllbGRzLCBmb3JtX3ZlcnNpb247XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbik7XG4gICAgfVxuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIGZpZWxkcyA9IF8uY2xvbmUoZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG4gICAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGFmdGVyX2ZpZWxkLCBiZWZvcmVfZmllbGQsIHByZV9maWVsZHMsIHByZV93aWRlX2ZpZWxkcywgdGRfY29sc3BhbiwgdHJfZW5kLCB0cl9zdGFydDtcbiAgICAgICAgZmllbGQudHJfc3RhcnQgPSBcIlwiO1xuICAgICAgICBmaWVsZC50cl9lbmQgPSBcIlwiO1xuICAgICAgICB0ZF9jb2xzcGFuID0gMTtcbiAgICAgICAgaWYgKCh0eXBlb2YgQ29yZUZvcm0gIT09IFwidW5kZWZpbmVkXCIgJiYgQ29yZUZvcm0gIT09IG51bGwgPyBDb3JlRm9ybS5wYWdlVGl0bGVGaWVsZE5hbWUgOiB2b2lkIDApID09PSBmaWVsZC5jb2RlKSB7XG4gICAgICAgICAgZmllbGQuaXNfd2lkZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLmZvcm11bGEgJiYgZmllbGQudHlwZSAhPT0gJ29kYXRhJykge1xuICAgICAgICAgIGZpZWxkLnBlcm1pc3Npb24gPSBcInJlYWRvbmx5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgICAgZmllbGQudGRfY29sc3BhbiA9IDQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpZWxkLnRkX2NvbHNwYW4gPSAzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIGZpZWxkLnRyX3N0YXJ0ID0gXCI8dHI+XCI7XG4gICAgICAgICAgICByZXR1cm4gZmllbGQudHJfZW5kID0gXCI8L3RyPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmVfZmllbGRzID0gZmllbGRzLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgICBwcmVfd2lkZV9maWVsZHMgPSBwcmVfZmllbGRzLmZpbHRlclByb3BlcnR5KFwiaXNfd2lkZVwiLCB0cnVlKTtcbiAgICAgICAgICB0cl9zdGFydCA9IFwiXCI7XG4gICAgICAgICAgdHJfZW5kID0gXCJcIjtcbiAgICAgICAgICBiZWZvcmVfZmllbGQgPSBudWxsO1xuICAgICAgICAgIGFmdGVyX2ZpZWxkID0gbnVsbDtcbiAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICBiZWZvcmVfZmllbGQgPSBmaWVsZHNbaW5kZXggLSAxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluZGV4IDwgZmllbGRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGFmdGVyX2ZpZWxkID0gZmllbGRzW2luZGV4ICsgMV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgICAgdGRfY29sc3BhbiA9IDQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5pc193aWRlKSB7XG4gICAgICAgICAgICB0ZF9jb2xzcGFuID0gMztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGJlZm9yZV9maWVsZCAmJiBhZnRlcl9maWVsZCAmJiBiZWZvcmVfZmllbGQuaXNfd2lkZSAmJiBhZnRlcl9maWVsZC5pc193aWRlKSB7XG4gICAgICAgICAgICAgIGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICB0ZF9jb2xzcGFuID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT09IDAgJiYgYWZ0ZXJfZmllbGQgJiYgYWZ0ZXJfZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgICBmaWVsZC5pc193aWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09PSAwICYmIGFmdGVyX2ZpZWxkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICB0ZF9jb2xzcGFuID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGQudGRfY29sc3BhbiA9IHRkX2NvbHNwYW47XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0cl9zdGFydCA9IFwiPHRyPlwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09PSAwIHx8IGZpZWxkLmlzX3dpZGUpIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB0cl9zdGFydCA9IFwiPHRyIGNsYXNzID0gXFxcInRyLWNoaWxkLXRhYmxlXFxcIj5cIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cl9zdGFydCA9IFwiPHRyPlwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLnRyX3N0YXJ0ID0gdHJfc3RhcnQ7XG4gICAgICAgICAgaWYgKGluZGV4ICsgMSA9PT0gZmllbGRzLmxlbmd0aCB8fCBmaWVsZC50eXBlID09PSAnc2VjdGlvbicgfHwgZmllbGQudHlwZSA9PT0gJ3RhYmxlJyB8fCBmaWVsZC5pc193aWRlKSB7XG4gICAgICAgICAgICB0cl9lbmQgPSBcIjwvdHI+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHRyX2VuZCA9IFwiPC90cj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpZWxkLnRyX2VuZCA9IHRyX2VuZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmllbGRzO1xuICAgIH1cbiAgfSxcbiAgc29ydF9hcHByb3ZlOiBmdW5jdGlvbihhcHByb3Zlcywgb3JkZXIpIHtcbiAgICBpZiAoIWFwcHJvdmVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICghYXBwcm92ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3JkZXIgPT09ICdkZXNjJykge1xuICAgICAgICBhcHByb3Zlcy5zb3J0KGZ1bmN0aW9uKHAxLCBwMikge1xuICAgICAgICAgIHZhciBfcDEsIF9wMjtcbiAgICAgICAgICBfcDEgPSAwO1xuICAgICAgICAgIF9wMiA9IDA7XG4gICAgICAgICAgaWYgKHAxLmZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICBfcDEgPSBwMS5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwMi5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgX3AyID0gcDIuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3AyIC0gX3AxO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcHJvdmVzLnNvcnQoZnVuY3Rpb24ocDEsIHAyKSB7XG4gICAgICAgICAgdmFyIF9wMSwgX3AyO1xuICAgICAgICAgIF9wMSA9IDA7XG4gICAgICAgICAgX3AyID0gMDtcbiAgICAgICAgICBpZiAocDEuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIF9wMSA9IHAxLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHAyLmZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICBfcDIgPSBwMi5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfcDEgLSBfcDI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXBwcm92ZXM7XG4gIH0sXG4gIF90OiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuICB9LFxuICBnZXRGaWVsZDogZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbjtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKTtcbiAgICB9XG4gIH0sXG4gIGdldFZhbHVlOiBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbiwgaW5zdGFuY2UsIGxvY2FsZSwgdXRjT2Zmc2V0LCB2YWx1ZXM7XG4gICAgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG4gICAgZm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbjtcbiAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgIHV0Y09mZnNldCA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS51dGNPZmZzZXQ7XG4gICAgdmFsdWVzID0gaW5zdGFuY2UudmFsdWVzIHx8IHt9O1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRWYWx1ZSh2YWx1ZXNbY29kZV0sIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSksIGxvY2FsZSwgdXRjT2Zmc2V0KTtcbiAgfSxcbiAgZ2V0TGFiZWw6IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb247XG4gICAgcmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbChmb3JtX3ZlcnNpb24uZmllbGRzLCBjb2RlKTtcbiAgfSxcbiAgaXNUZXh0YXJlYTogZnVuY3Rpb24oZmllbGQpIHtcbiAgICBpZiAoKGZpZWxkICE9IG51bGwgPyBmaWVsZC50eXBlIDogdm9pZCAwKSA9PT0gXCJpbnB1dFwiICYmIChmaWVsZCAhPSBudWxsID8gZmllbGQuaXNfdGV4dGFyZWEgOiB2b2lkIDApKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIGdldENmQ2xhc3M6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgaWYgKChmaWVsZCAhPSBudWxsID8gZmllbGQudHlwZSA6IHZvaWQgMCkgPT09IFwiaW5wdXRcIiAmJiAoZmllbGQgIT0gbnVsbCA/IGZpZWxkLmlzX3RleHRhcmVhIDogdm9pZCAwKSkge1xuICAgICAgcmV0dXJuIFwiY2ZUZXh0YXJlYVwiO1xuICAgIH1cbiAgfSxcbiAgZ2V0VGFibGVUaGVhZDogZnVuY3Rpb24oZmllbGQpIHtcbiAgICByZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRoZWFkKGZpZWxkLCBmYWxzZSk7XG4gIH0sXG4gIGdldFRhYmxlQm9keTogZnVuY3Rpb24oZmllbGQpIHtcbiAgICB2YXIgaW5zdGFuY2UsIHRhYmxlVmFsdWUsIHZhbHVlcztcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZTtcbiAgICAgIHZhbHVlcyA9IGluc3RhbmNlLnZhbHVlcyB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICAgIH1cbiAgICB0YWJsZVZhbHVlID0gdmFsdWVzW2ZpZWxkLmNvZGVdO1xuICAgIHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGJvZHkoZmllbGQuc2ZpZWxkcy5nZXRQcm9wZXJ0eShcImNvZGVcIiksIGZpZWxkLCB0YWJsZVZhbHVlLCBmYWxzZSk7XG4gIH0sXG4gIHNob3dMYWJlbDogZnVuY3Rpb24oZmllbGQpIHtcbiAgICB2YXIgdGVtcGxhdGVEYXRhO1xuICAgIHRlbXBsYXRlRGF0YSA9IFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YTtcbiAgICBpZiAodGVtcGxhdGVEYXRhLmxhYmVsID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgaXNPcGluaW9uRmllbGQ6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGQuZm9ybXVsYSk7XG4gIH0sXG4gIGlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nOiBmdW5jdGlvbihmaWVsZF9mb3JtdWxhKSB7XG4gICAgcmV0dXJuIEluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSk7XG4gIH0sXG4gIGluY2x1ZGVzT3BpbmlvbkZpZWxkOiBmdW5jdGlvbihmb3JtLCBmb3JtX3ZlcnNpb24pIHtcbiAgICB2YXIgZmllbGRfZm9ybXVsYXMsIGZpZWxkcywgcmVmO1xuICAgIGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG4gICAgZmllbGRzID0gKChyZWYgPSBkYi5mb3JtX3ZlcnNpb25zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmb3JtX3ZlcnNpb24sXG4gICAgICBmb3JtOiBmb3JtXG4gICAgfSkpICE9IG51bGwgPyByZWYuZmllbGRzIDogdm9pZCAwKSB8fCBbXTtcbiAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgICB2YXIgcmVmMTtcbiAgICAgIGlmIChmLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdpZ25vcmUgb3BpbmlvbiBmaWVsZCBpbiB0YWJsZScpO1xuICAgICAgfSBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgICByZXR1cm4gZiAhPSBudWxsID8gKHJlZjEgPSBmLmZpZWxkcykgIT0gbnVsbCA/IHJlZjEuZm9yRWFjaChmdW5jdGlvbihmMSkge1xuICAgICAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYxLmZvcm11bGEpO1xuICAgICAgICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYuZm9ybXVsYSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF8uc29tZShmaWVsZF9mb3JtdWxhcywgZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldE9waW5pb25GaWVsZFN0ZXBzTmFtZTogZnVuY3Rpb24oZmllbGRfZm9ybXVsYSwgdG9wX2tleXdvcmRzKSB7XG4gICAgdmFyIGZvbzEsIG9waW5pb25GaWVsZHM7XG4gICAgb3BpbmlvbkZpZWxkcyA9IG5ldyBBcnJheSgpO1xuICAgIGlmIChJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpKSB7XG4gICAgICBpZiAoZmllbGRfZm9ybXVsYSkge1xuICAgICAgICBmb28xID0gZmllbGRfZm9ybXVsYS5zcGxpdChcIjtcIik7XG4gICAgICAgIGZvbzEuZm9yRWFjaChmdW5jdGlvbihmb28pIHtcbiAgICAgICAgICB2YXIganNvbl9mb3JtdWxhLCByZWYsIHJlZjEsIHMxLCBzZjtcbiAgICAgICAgICBqc29uX2Zvcm11bGEgPSB7fTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAganNvbl9mb3JtdWxhID0gZXZhbChcIihcIiArIGZvbyArIFwiKVwiKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICAgIGpzb25fZm9ybXVsYSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoanNvbl9mb3JtdWxhICE9IG51bGwgPyBqc29uX2Zvcm11bGEueWlqaWFubGFuIDogdm9pZCAwKSB7XG4gICAgICAgICAgICBzZiA9IHt9O1xuICAgICAgICAgICAgc2Yuc3RlcE5hbWUgPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLnN0ZXA7XG4gICAgICAgICAgICBzZi5pbWFnZV9zaWduID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5pbWFnZV9zaWduIHx8IGZhbHNlO1xuICAgICAgICAgICAgc2Yub25seV9jY19vcGluaW9uID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5vbmx5X2NjIHx8IGZhbHNlO1xuICAgICAgICAgICAgc2YuZGVmYXVsdF9kZXNjcmlwdGlvbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW5bXCJkZWZhdWx0XCJdO1xuICAgICAgICAgICAgc2Yub25seV9oYW5kbGVyID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5vbmx5X2hhbmRsZXI7XG4gICAgICAgICAgICBzZi50b3Bfa2V5d29yZHMgPSBqc29uX2Zvcm11bGEueWlqaWFubGFuLnRvcF9rZXl3b3JkcyB8fCB0b3Bfa2V5d29yZHM7XG4gICAgICAgICAgICByZXR1cm4gb3BpbmlvbkZpZWxkcy5wdXNoKHNmKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xKSB7XG4gICAgICAgICAgICBzZiA9IHtcbiAgICAgICAgICAgICAgb25seV9jY19vcGluaW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgaW1hZ2Vfc2lnbjogZmFsc2UsXG4gICAgICAgICAgICAgIHRvcF9rZXl3b3JkczogdG9wX2tleXdvcmRzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGZvby5pbmRleE9mKFwie3NpZ25hdHVyZS5cIikgPiAtMSkge1xuICAgICAgICAgICAgICBzZi5pbWFnZV9zaWduID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZm9vID0gZm9vLnJlcGxhY2UoXCJ7c2lnbmF0dXJlLlwiLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMxID0gZm9vLnJlcGxhY2UoXCJ7XCIsIFwiXCIpLnJlcGxhY2UoXCJ9XCIsIFwiXCIpO1xuICAgICAgICAgICAgaWYgKHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHNmLnN0ZXBOYW1lID0gczEuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgICBpZiAob3BpbmlvbkZpZWxkcy5maWx0ZXJQcm9wZXJ0eShcInN0ZXBOYW1lXCIsIHNmLnN0ZXBOYW1lKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKChyZWYgPSBvcGluaW9uRmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJzdGVwTmFtZVwiLCBzZi5zdGVwTmFtZSkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHJlZi5vbmx5X2NjX29waW5pb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgoKHJlZjEgPSBzMS5zcGxpdChcIi5cIilbMl0pICE9IG51bGwgPyByZWYxLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB2b2lkIDApID09PSAnY2MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNmLm9ubHlfY2Nfb3BpbmlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3BpbmlvbkZpZWxkcy5wdXNoKHNmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3BpbmlvbkZpZWxkcztcbiAgfSxcbiAgc2hvd0NDT3BpbmlvbjogZnVuY3Rpb24oZmllbGQpIHtcbiAgICB2YXIgcmVmLCByZWYxLCByZWYyLCBzMTtcbiAgICBpZiAoKChyZWYgPSBmaWVsZC5mb3JtdWxhKSAhPSBudWxsID8gcmVmLmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoKHJlZjEgPSBmaWVsZC5mb3JtdWxhKSAhPSBudWxsID8gcmVmMS5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xKSB7XG4gICAgICBzMSA9IGZpZWxkLmZvcm11bGEucmVwbGFjZShcIntzaWduYXR1cmUuXCIsIFwiXCIpLnJlcGxhY2UoXCJ7XCIsIFwiXCIpLnJlcGxhY2UoXCJ9XCIsIFwiXCIpO1xuICAgICAgaWYgKHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAyKSB7XG4gICAgICAgIGlmICgoKHJlZjIgPSBzMS5zcGxpdChcIi5cIilbMl0pICE9IG51bGwgPyByZWYyLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB2b2lkIDApID09PSAnY2MnKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBtYXJrRG93blRvSHRtbDogZnVuY3Rpb24obWFya0Rvd25TdHJpbmcpIHtcbiAgICBpZiAobWFya0Rvd25TdHJpbmcpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgbWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpO1xuICAgIH1cbiAgfSxcbiAgZl9sYWJlbDogZnVuY3Rpb24odGhhdCkge1xuICAgIHJldHVybiB0aGF0Lm5hbWUgfHwgdGhhdC5jb2RlO1xuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuc3RlZWRvc19mb3JtID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybV92ZXJzaW9uO1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzU2VjdGlvbiA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IHRoaXMuZm9ybV92ZXJzaW9uO1xuICAgIHJldHVybiBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpLnR5cGUgPT09ICdzZWN0aW9uJztcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5kb2NfdmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGluc3RhbmNlO1xuICAgIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcbiAgICByZXR1cm4gaW5zdGFuY2UudmFsdWVzO1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmFwcGxpY2FudENvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGF0YSwgaW5zdGFuY2U7XG4gICAgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlO1xuICAgIHJldHVybiBkYXRhID0ge1xuICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgYXR0czoge1xuICAgICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIGlkOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIFwiY2xhc3NcIjogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnXG4gICAgICB9LFxuICAgICAgdmFsdWU6IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lXG4gICAgfTtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZpZWxkcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gdGhpcy5mb3JtX3ZlcnNpb247XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcbiAgICB9XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZm9ybV90eXBlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcImRpc2FibGVkXCI7XG4gIH07XG4gIFRlbXBsYXRlLnJlZ2lzdGVySGVscGVyKFwiYWZGaWVsZExhYmVsVGV4dFwiLCBmdW5jdGlvbihvcCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb24sIHJlZjtcbiAgICBmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uO1xuICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwoZm9ybV92ZXJzaW9uLmZpZWxkcywgb3AgIT0gbnVsbCA/IChyZWYgPSBvcC5oYXNoKSAhPSBudWxsID8gcmVmLm5hbWUgOiB2b2lkIDAgOiB2b2lkIDApO1xuICB9KTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5fdCA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBsb2NhbGU7XG4gICAgbG9jYWxlID0gdGhpcy5sb2NhbGU7XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKTtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnNfYXR0YWNoX2Rvd25sb2FkX3VybCA9IGZ1bmN0aW9uKF9pZCwgYWJzb2x1dGUpIHtcbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cIiArIF9pZCArIFwiP2Rvd25sb2FkPXRydWVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIi9hcGkvZmlsZXMvaW5zdGFuY2VzL1wiICsgX2lkICsgXCI/ZG93bmxvYWQ9dHJ1ZVwiO1xuICAgIH1cbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5vcHRpb25zID0gZnVuY3Rpb24oZmllbGQpIHtcbiAgICB2YXIgb3B0aW9ucywgcmVmLCByZXY7XG4gICAgb3B0aW9ucyA9IGZpZWxkICE9IG51bGwgPyAocmVmID0gZmllbGQub3B0aW9ucykgIT0gbnVsbCA/IHJlZi5zcGxpdChcIlxcblwiKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICByZXYgPSBbXTtcbiAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gcmV2LnB1c2goe1xuICAgICAgICAgIGxhYmVsOiBpdGVtLFxuICAgICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXY7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZ2V0UGVybWlzc2lvbnMgPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoISgocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKGNvZGUpIDogdm9pZCAwKSkge1xuICAgICAgcmV0dXJuIFwicmVhZG9ubHkgZGlzYWJsZWRcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH07XG59XG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLmV2ZW50cyA9IHtcbiAgJ2NoYW5nZSAuZm9ybS1jb250cm9sLC5jaGVja2JveCBpbnB1dCwuYWYtcmFkaW8tZ3JvdXAgaW5wdXQsLmFmLWNoZWNrYm94LWdyb3VwIGlucHV0JzogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICByZXR1cm4gSW5zdGFuY2VNYW5hZ2VyLmluc3RhbmNlZm9ybUNoYW5nZUV2ZW50KGV2ZW50KTtcbiAgfSxcbiAgJ3R5cGVhaGVhZDpjaGFuZ2UgLmZvcm0tY29udHJvbCc6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgcmV0dXJuIEluc3RhbmNlTWFuYWdlci5pbnN0YW5jZWZvcm1DaGFuZ2VFdmVudChldmVudCk7XG4gIH0sXG4gICdjbGljayAuY2ZUZXh0YXJlYSBhJzogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHJldHVybiBTdGVlZG9zLm9wZW5XaW5kb3coZXZlbnQudGFyZ2V0LmhyZWYpO1xuICB9XG59O1xuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5vbkNyZWF0ZWQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvbXBpbGVkLCBlLCBpbnN0YW5jZSwgaW5zdGFuY2VDdXN0b21UZW1wbGF0ZSwgaW5zdGFuY2VWaWV3LCByZW5kZXJGdW5jdGlvbiwgdGVtcGxhdGU7XG4gIGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUoaW5zdGFuY2UpO1xuICB0cnkge1xuICAgIGNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0ZW1wbGF0ZSwge1xuICAgICAgaXNCb2R5OiB0cnVlXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIGUgPSBlcnJvcjE7XG4gICAgY29uc29sZS5sb2coXCJJbnN0YW5jZSBUZW1wbGF0ZSBFcnJvclwiLCBlKTtcbiAgICBjb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoXCJcIiwge1xuICAgICAgaXNCb2R5OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyRnVuY3Rpb24gPSBldmFsKGNvbXBpbGVkKTtcbiAgaW5zdGFuY2VWaWV3ID0gbmV3IEJsYXplLlZpZXcoXCJjdXN0b21faW5zdGFuY2VfdGVtcGxhdGVcIiwgcmVuZGVyRnVuY3Rpb24pO1xuICBpbnN0YW5jZUN1c3RvbVRlbXBsYXRlID0gbmV3IEJsYXplLlRlbXBsYXRlKGluc3RhbmNlVmlldy5uYW1lLCByZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmluc3RhbmNlX2N1c3RvbV90ZW1wbGF0ZSA9IGluc3RhbmNlQ3VzdG9tVGVtcGxhdGU7XG4gIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZV9jdXN0b21fdGVtcGxhdGUuaGVscGVycyhJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzKTtcbn07XG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLm9uUmVuZGVyZWQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGN1cnJlbnRBcHByb3ZlLCBjdXJyZW50U3RlcCwgZm9ybV92ZXJzaW9uLCBmb3JtdWxhX2ZpZWxkcywgaW5zZXJ0RG9jLCBpbnN0YW5jZSwgaW5zdGFuY2VOdW1iZXJGaWVsZHMsIGp1ZGdlO1xuICBpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEluc3RhbmNlTWFuYWdlci5zZXRJbnN0YW5jZUZvcm1BcHBsaWNhbnQoaW5zdGFuY2UuYXBwbGljYW50LCBpbnN0YW5jZS5hcHBsaWNhbnRfbmFtZSk7XG4gIEFwcHJvdmVNYW5hZ2VyLmVycm9yID0ge1xuICAgIG5leHRTdGVwczogJycsXG4gICAgbmV4dFN0ZXBVc2VyczogJydcbiAgfTtcbiAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnZHJhZnQnKSB7XG4gICAgSW5zdGFuY2VFdmVudC5pbml0RXZlbnRzKGluc3RhbmNlLmZsb3cpO1xuICB9XG4gIGlmICghQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpKSB7XG4gICAgY3VycmVudEFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcbiAgICBpbnN0YW5jZU51bWJlckZpZWxkcyA9ICQoXCJbZGF0YS1mb3JtdWxhXVwiLCAkKFwiI2luc3RhbmNlZm9ybVwiKSk7XG4gICAgaW5zdGFuY2VOdW1iZXJGaWVsZHMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlbGVtZW50LCBzY2hlbWFLZXk7XG4gICAgICBzY2hlbWFLZXkgPSB0aGlzLmRhdGFzZXQuc2NoZW1hS2V5O1xuICAgICAgZWxlbWVudCA9ICQodGhpcyk7XG4gICAgICBpZiAoISQodGhpcykudmFsKCkgJiYgc2NoZW1hS2V5ICYmIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSkge1xuICAgICAgICByZXR1cm4gTWV0ZW9yLmNhbGwoJ2dldEluc3RhbmNlVmFsdWVzJywgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGtleSwgcmVmO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdG9hc3RyLmVycm9yKGVycm9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmVzdWx0W3NjaGVtYUtleV0pIHtcbiAgICAgICAgICAgIGtleSA9IChyZWYgPSBlbGVtZW50LmRhdGEoXCJmb3JtdWxhXCIpKSAhPSBudWxsID8gcmVmLnJlcGxhY2UoXCJhdXRvX251bWJlcihcIiwgXCJcIikucmVwbGFjZShcIilcIiwgXCJcIikgOiB2b2lkIDA7XG4gICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxcIi9nLCBcIlwiKS5yZXBsYWNlKC9cXCcvZywgXCJcIik7XG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoXCJ7XCIpID4gLTEpIHtcbiAgICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoXCJ7XCIsIFwiXCIpLnJlcGxhY2UoXCJ9XCIsIFwiXCIpO1xuICAgICAgICAgICAgICBrZXkgPSBrZXkudHJpbSgpO1xuICAgICAgICAgICAgICBrZXkgPSBBdXRvRm9ybS5nZXRGaWVsZFZhbHVlKGtleSwgJ2luc3RhbmNlZm9ybScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEluc3RhbmNlTnVtYmVyUnVsZXMuaW5zdGFuY2VOdW1iZXJCdWlsZGVyKGVsZW1lbnQsIGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50LnZhbChyZXN1bHRbc2NoZW1hS2V5XSkudHJpZ2dlcihcImNoYW5nZVwiKSA6IHZvaWQgMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGp1ZGdlID0gY3VycmVudEFwcHJvdmUuanVkZ2U7XG4gICAgY3VycmVudFN0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIGlmICghZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZm9ybV92ZXJzaW9uLmZpZWxkcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3JtdWxhX2ZpZWxkcyA9IEZvcm1fZm9ybXVsYS5nZXRGb3JtdWxhRmllbGRWYXJpYWJsZShcIkZvcm1fZm9ybXVsYS5maWVsZF92YWx1ZXNcIiwgZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG4gICAgaW5zZXJ0RG9jID0gQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcImluc3RhbmNlZm9ybVwiLCB2b2lkIDAsIHZvaWQgMCwgZmFsc2UpO1xuICAgIEZvcm1fZm9ybXVsYS5ydW4oXCJcIiwgXCJcIiwgZm9ybXVsYV9maWVsZHMsIGluc2VydERvYywgZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG4gICAgcmV0dXJuIFNlc3Npb24uc2V0KFwiaW5zdGFuY2VfZm9ybV92YWx1ZXNcIiwge1xuICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2UuX2lkLFxuICAgICAgdmFsdWVzOiBpbnNlcnREb2NcbiAgICB9KTtcbiAgfVxufTtcbiIsIkluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMgPSB7XG5cblx0c2hvd01haW5UaXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkud29ya2Zsb3dNYWluQXR0YWNoVGl0bGUuZ2V0KCk7XG5cdH0sXG5cdGlzQ2xpZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gTWV0ZW9yLmlzQ2xpZW50XG5cdH0sXG5cdGVuYWJsZWRfYWRkX21haW5fYXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbiAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIChTZXNzaW9uLmdldChcImJveFwiKSAhPSBcImRyYWZ0XCIgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gXCJpbmJveFwiKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cblx0XHQvLyDlt7Lnu4/nu5PmnZ/nmoTljZXlrZDkuI3og73mlLnpmYTku7Zcblx0XHRpZiAoaW5zLnN0YXRlID09IFwiY29tcGxldGVkXCIpIHtcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblxuXHRcdHZhciBjdXJyZW50X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblxuXHRcdGlmICghY3VycmVudF9zdGVwKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gY2PnmoTljZXlrZDvvIzlj6rmnInlnKjlvZPliY3mraXpqqTmiY3og73kv67mlLnpmYTku7Zcblx0XHR2YXIgYXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuXHRcdGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PSBcImNjXCIpIHtcblx0XHRcdHZhciBjdXJyZW50VHJhY2UgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFRyYWNlKCk7XG5cdFx0XHRpZihjdXJyZW50VHJhY2UgJiYgY3VycmVudFRyYWNlLl9pZCAhPSBhcHByb3ZlLnRyYWNlKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIOWIhuWPkeeahOato+aWh+aIluiAhemZhOS7tuS4jeaYvuekuui9rOS4unBkZuaMiemSrlxuXHRcdC8vIOWmguaenOacieato+aWh+adg+mZkOWImeS4uuato+aWh++8jOWQpuWImeWIhuWPkeS4uumZhOS7tlxuXHRcdC8vIOWIhuWPkeeahOmZhOS7tuS4jeWFgeiuuOS/ruaUuSDliKDpmaQg5paw5aKe54mI5pysXG5cdFx0dmFyIG1haW5fYXR0YWNoX2NvdW50ID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGlucy5faWQsXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHR9KS5jb3VudCgpO1xuXG5cdFx0dmFyIGRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQgPSAwO1xuXG5cdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UpIHtcblx0XHRcdHZhciBzdGFydF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldFN0YXJ0U3RlcCgpO1xuXHRcdFx0aWYgKHN0YXJ0X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2gpIHtcblx0XHRcdFx0dmFyIGRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UsXG5cdFx0XHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdFx0XHR9KS5jb3VudCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggPT0gdHJ1ZSAmJiBtYWluX2F0dGFjaF9jb3VudCA8IDEgJiYgZGlzdHJpYnV0ZV9tYWluX2F0dGFjaF9jb3VudCA8IDEpIHtcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0fVxuXG5cdFx0Ly8g5q2j5paH5pyA5aSa5Y+q6IO95pyJ5LiA5LiqXG5cdFx0aWYgKG1haW5fYXR0YWNoX2NvdW50ID49IDEgfHwgZGlzdHJpYnV0ZV9tYWluX2F0dGFjaF9jb3VudCA+PSAxKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8g5byA5aeL6IqC54K55bm25LiU6K6+572u5LqG5Y+v5Lul5LiK5Lyg5q2j5paH5omN5pi+56S65LiK5Lyg5q2j5paH55qE5oyJ6ZKuXG5cdFx0dmFyIGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuXHRcdGlmIChjdXJyZW50X3N0ZXAgJiYgY3VycmVudF9zdGVwLnN0ZXBfdHlwZSA9PSBcInN0YXJ0XCIgJiYgY3VycmVudF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoID09IHRydWUpXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0cmV0dXJuIGZhbHNlXG5cdH0sXG5cblx0ZW5hYmxlZF9lZGl0X25vcm1hbF9hdHRhY2htZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIChTZXNzaW9uICYmIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSlcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0dmFyIGZsb3cgPSBXb3JrZmxvd01hbmFnZXIuZ2V0RmxvdyhpbnMuZmxvdyk7XG5cdFx0aWYgKCFmbG93KVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblxuXHRcdC8vIOWIhuWPkeWQjueahCDpmYTku7bvvIzkuI3lj6/ku6XnvJbovpEv5Yig6Zmk77yM5Lmf5LiN6K6p5LiK5Lyg5paw55qE6ZmE5Lu2LCDmtYHnqIvliJfooajvvJrmt7vliqDlsZ7mgKcg4oCY6KKr5YiG5Y+R5ZCO5piv5ZCm5YWB6K645LiK5Lyg6ZmE5Lu24oCZICMxODM3XG5cdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UgJiYgIWZsb3cudXBsb2FkX2FmdGVyX2JlaW5nX2Rpc3RyaWJ1dGVkKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gXCJkcmFmdFwiICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9IFwiaW5ib3hcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fVxuXG5cdFx0Ly8g5bey57uP57uT5p2f55qE5Y2V5a2Q5LiN6IO95pS56ZmE5Lu2XG5cdFx0aWYgKGlucy5zdGF0ZSA9PSBcImNvbXBsZXRlZFwiKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cblx0XHQvLyBjY+eahOWNleWtkO+8jOWPquacieWcqOW9k+WJjeatpemqpOaJjeiDveS/ruaUuemZhOS7tlxuXHRcdHZhciBhcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG5cdFx0aWYgKGFwcHJvdmUgJiYgYXBwcm92ZS50eXBlID09IFwiY2NcIikge1xuXHRcdFx0dmFyIGN1cnJlbnRUcmFjZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50VHJhY2UoKTtcblx0XHRcdGlmKGN1cnJlbnRUcmFjZSAmJiBjdXJyZW50VHJhY2UuX2lkICE9IGFwcHJvdmUudHJhY2Upe1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKEluc3RhbmNlTWFuYWdlci5pc0NDKGlucykpIHtcblx0XHRcdHZhciBzdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldENDU3RlcCgpO1xuXHRcdFx0aWYgKHN0ZXAgJiYgKHN0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB0cnVlIHx8IHN0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB1bmRlZmluZWQpKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgY3VycmVudF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cdFx0XHRpZiAoY3VycmVudF9zdGVwICYmIChjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB0cnVlIHx8IGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09IHVuZGVmaW5lZCkpXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlXG5cdH0sXG5cblx0bWFpbl9hdHRhY2htZW50OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdHZhciBzdGFydF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldFN0YXJ0U3RlcCgpO1xuXG5cdFx0Ly8g5aaC5p6c5piv6KKr5YiG5Y+R55qE55Sz6K+35Y2V5bm25LiU5pyJ5L+u5pS55q2j5paH55qE5p2D6ZmQ77yM5YiZ5LyY5YWI5pi+56S65Y6f55Sz6K+35Y2V5paH5Lu2XG5cdFx0dmFyIG1haW5fYXR0YWNoID0gbnVsbDtcblx0XHRpZiAoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSAmJiBzdGFydF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoID09IHRydWUpIHtcblx0XHRcdG1haW5fYXR0YWNoID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKHtcblx0XHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzogaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSxcblx0XHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICghbWFpbl9hdHRhY2gpIHtcblx0XHRcdG1haW5fYXR0YWNoID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKHtcblx0XHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzogaW5zLl9pZCxcblx0XHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYWluX2F0dGFjaDtcblx0fSxcblxuXHRub3JtYWxfYXR0YWNobWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0dmFyIHNlbGVjdG9yID0ge1xuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB7XG5cdFx0XHRcdCRuZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0dmFyIGF0dHMgPSBuZXcgQXJyYXkoKTtcblxuXHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlKSB7XG5cdFx0XHQvLyDlpoLmnpzmmK/ooqvliIblj5HnmoTnlLPor7fljZXvvIzliJnmmL7npLrljp/nlLPor7fljZXmlofku7YsIOWmguaenOmAieaLqeS6huWwhuWOn+ihqOWNleWtmOWCqOS4uumZhOS7tuS5n+imgeaYvuekuiwg5ZCM5pe25Lmf6KaB5pi+56S65paw5LiK5Lyg55qE6ZmE5Lu2XG5cdFx0XHR2YXIgZGZpcyA9IF8uY2xvbmUoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMpIHx8IFtdO1xuXHRcdFx0ZGZpcy5wdXNoKGlucy5faWQpO1xuXHRcdFx0c2VsZWN0b3JbJ21ldGFkYXRhLmluc3RhbmNlJ10gPSB7XG5cdFx0XHRcdCRpbjogZGZpc1xuXHRcdFx0fTtcblxuXG5cdFx0XHRzZWxlY3RvcltcIiRvclwiXSA9IFt7XG5cdFx0XHRcdFwibWV0YWRhdGEuaW5zdGFuY2VcIjogaW5zLl9pZFxuXHRcdFx0fSwge1xuXHRcdFx0XHRcIm1ldGFkYXRhLmluc3RhbmNlXCI6IHtcblx0XHRcdFx0XHQkaW46IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzXG5cdFx0XHRcdH0sXG5cdFx0XHRcdFwibWV0YWRhdGEuaXNfcHJpdmF0ZVwiOiB7XG5cdFx0XHRcdFx0JG5lOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH1dXG5cblx0XHRcdC8vIOWmguaenOWOn+eUs+ivt+WNleacieato+aWh+S9huaYr+WIhuWPkeWQjuayoeacieato+aWh+adg+mZkO+8jOWImeWOn+eUs+ivt+WNleato+aWh+aYvuekuuWcqOmZhOS7tuagj1xuXHRcdFx0dmFyIHN0YXJ0X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0U3RhcnRTdGVwKCk7XG5cdFx0XHRpZiAoc3RhcnRfc3RlcCAmJiBzdGFydF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoICE9IHRydWUpIHtcblx0XHRcdFx0dmFyIGRpc3RyaWJ1dGVfbWFpbiA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZSh7XG5cdFx0XHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHRcdFx0JGluOiBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlc1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChkaXN0cmlidXRlX21haW4pIHtcblx0XHRcdFx0XHR2YXIgZmlyc3RWZXJzaW9uTWFpbiA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZShkaXN0cmlidXRlX21haW4ubWV0YWRhdGEucGFyZW50KTtcblx0XHRcdFx0XHRkaXN0cmlidXRlX21haW4uYXR0YWNobWVudFVwbG9hZGVkQXQgPSBmaXJzdFZlcnNpb25NYWluID8gZmlyc3RWZXJzaW9uTWFpbi51cGxvYWRlZEF0IDogZGlzdHJpYnV0ZV9tYWluLnVwbG9hZGVkQXQ7XG5cdFx0XHRcdFx0YXR0cy5wdXNoKGRpc3RyaWJ1dGVfbWFpbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c2VsZWN0b3JbJ21ldGFkYXRhLmluc3RhbmNlJ10gPSBpbnMuX2lkO1xuXHRcdH1cblxuXHRcdGNmcy5pbnN0YW5jZXMuZmluZChzZWxlY3RvcikuZm9yRWFjaChmdW5jdGlvbihjKSB7XG5cdFx0XHR2YXIgZmlyc3RWZXJzaW9uID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKGMubWV0YWRhdGEucGFyZW50KTtcblx0XHRcdGMuYXR0YWNobWVudFVwbG9hZGVkQXQgPSBmaXJzdFZlcnNpb24gPyBmaXJzdFZlcnNpb24udXBsb2FkZWRBdCA6IGMudXBsb2FkZWRBdDtcblx0XHRcdGF0dHMucHVzaChjKTtcblx0XHR9KVxuXG5cdFx0cmV0dXJuIF8uc29ydEJ5KGF0dHMsICdhdHRhY2htZW50VXBsb2FkZWRBdCcpO1xuXHR9LFxuXG5cdHNob3dBdHRhY2htZW50czogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8g5aaC5p6c5piv6KKr5YiG5Y+R55qE55Sz6K+35Y2V77yM5YiZ5pi+56S65Y6f55Sz6K+35Y2V5paH5Lu2IOWSjOWIhuWPkeWQjueUs+ivt+WNleaWh+S7tlxuXHRcdHZhciBpbnN0YW5jZUlkcyA9IF8uY2xvbmUoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMpIHx8IFtdO1xuXHRcdGluc3RhbmNlSWRzLnB1c2goaW5zLl9pZCk7XG5cdFx0dmFyIGF0dGFjaG1lbnRzX2NvdW50ID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZVxuXHRcdH0pLmNvdW50KCk7XG5cblx0XHRpZiAoU2Vzc2lvbiAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgJiYgYXR0YWNobWVudHNfY291bnQgPCAxKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gXCJkcmFmdFwiIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09IFwiaW5ib3hcIiB8fCBhdHRhY2htZW50c19jb3VudCA+IDApXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0X3Q6IGZ1bmN0aW9uKGtleSkge1xuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSlcblx0fSxcblxuXHRfOiBmdW5jdGlvbihrZXkpIHtcblx0XHR2YXIgbG9jYWxlO1xuXHRcdGlmIChNZXRlb3IuaXNDbGllbnQpIHtcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKGtleSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpO1xuXHRcdH1cblx0fSxcblxuXHRmbG93X2ZpbGVzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIGNmcy5maWxlcy5maW5kKHsgJ21ldGFkYXRhLnNwYWNlJzogaW5zLnNwYWNlLCAnbWV0YWRhdGEub2JqZWN0X25hbWUnOiAnZmxvd3MnLCAnbWV0YWRhdGEucmVjb3JkX2lkJzogaW5zLmZsb3cgfSk7XG5cdH0sXG5cblx0aXNEcmFmdEFuZEZsb3dmaWxlc0V4aXN0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIChTZXNzaW9uLmdldCgnYm94JykgPT0gJ2RyYWZ0JykgJiYgISFjZnMuZmlsZXMuZmluZCh7ICdtZXRhZGF0YS5zcGFjZSc6IGlucy5zcGFjZSwgJ21ldGFkYXRhLm9iamVjdF9uYW1lJzogJ2Zsb3dzJywgJ21ldGFkYXRhLnJlY29yZF9pZCc6IGlucy5mbG93IH0pLmNvdW50KCk7XG5cdH1cblxuXG59XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5fdCA9IGZ1bmN0aW9uKGtleSkge1xuXHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpXG5cdH1cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5lbmFibGVkX2FkZF9tYWluX2F0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fTtcblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5lbmFibGVkX2VkaXRfbm9ybWFsX2F0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fTtcblxuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLm1haW5fYXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZTtcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNvbXBhY3QoW2luc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSwgaW5zdGFuY2UuX2lkXSk7XG5cdFx0dmFyIGF0dGFjaG1lbnQgPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHQkaW46IGluc3RhbmNlSWRzXG5cdFx0XHR9LFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gYXR0YWNobWVudDtcblx0fTtcblxuXHRJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzLm5vcm1hbF9hdHRhY2htZW50cyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzdGVlZG9zRGF0YSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YVxuXHRcdHZhciBpbnN0YW5jZSA9IHN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuXHRcdHZhciBpbnN0YW5jZUlkcyA9IF8uY2xvbmUoaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcykgfHwgW107XG5cdFx0aW5zdGFuY2VJZHMucHVzaChpbnN0YW5jZS5faWQpO1xuXHRcdHZhciBhdHRhY2htZW50cyA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdCRpbjogaW5zdGFuY2VJZHNcblx0XHRcdH0sXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsXG5cdFx0XHQnbWV0YWRhdGEubWFpbic6IHtcblx0XHRcdFx0JG5lOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0JG9yOiBbe1xuXHRcdFx0XHQnbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHtcblx0XHRcdFx0XHQkbmU6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fSwge1xuXHRcdFx0XHQnbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHRydWUsXG5cdFx0XHRcdFwibWV0YWRhdGEub3duZXJcIjogc3RlZWRvc0RhdGEuc2Vzc2lvblVzZXJJZCB8fCBzdGVlZG9zRGF0YS51c2VySWQgfHwgJy0xJyAvLyDpmLLmraLmlbDmja7lvILluLjml7Ys5pi+56S65LqG56eB5pyJ6ZmE5Lu2XG5cdFx0XHR9XVxuXHRcdH0pLmZldGNoKCk7XG5cblx0XHRyZXR1cm4gYXR0YWNobWVudHM7XG5cdH07XG5cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5zaG93QXR0YWNobWVudHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG5cdFx0dmFyIGluc3RhbmNlSWRzID0gXy5jbG9uZShpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcblx0XHRpbnN0YW5jZUlkcy5wdXNoKGluc3RhbmNlLl9pZCk7XG5cblx0XHR2YXIgYXR0YWNobWVudHMgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHQkaW46IGluc3RhbmNlSWRzXG5cdFx0XHR9LFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlXG5cdFx0fSkuZmV0Y2goKTtcblxuXHRcdGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5zaG93TWFpblRpdGxlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuXHRcdHZhciBpbnN0YW5jZUlkcyA9IF8uY29tcGFjdChbaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlLCBpbnN0YW5jZS5faWRdKTtcblx0XHR2YXIgbWFpbl9hdHRhY2hfY291bnQgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHQkaW46IGluc3RhbmNlSWRzXG5cdFx0XHR9LFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0fSkuY291bnQoKTtcblxuXHRcdHJldHVybiBtYWluX2F0dGFjaF9jb3VudCA+IDBcblx0fVxufVxuIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuSW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzID1cblx0c2hvdzogKHN0ZXBOYW1lKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpZiBTZXNzaW9uLmdldCgnaW5zdGFuY2VQcmludCcpXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdFx0aWYgSW5zdGFuY2VNYW5hZ2VyLmlzSW5ib3goKVxuXHRcdFx0XHRteUFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKVxuXHRcdFx0XHRpZiBteUFwcHJvdmVcblx0XHRcdFx0XHRpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0XHRcdG15VHJhY2UgPSBpbnN0YW5jZT8udHJhY2VzPy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIG15QXBwcm92ZS50cmFjZSlcblx0XHRcdFx0XHRyZXR1cm4gbXlUcmFjZT8ubmFtZSA9PSBzdGVwTmFtZVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdGRlZmF1bHREZXNjcmlwdGlvbjogKCktPlxuI1x0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb24gfHwgVEFQaTE4bi5fXyhcImluc3RhbmNlX2RlZmF1bHRfb3BpbmlvblwiKVxuXHRcdHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEuZGVmYXVsdF9kZXNjcmlwdGlvblxuXG5cdHRyYWNlczogKCktPlxuXHRcdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudHJhY2VzKClcblxuXHR0cmFjZTogKHN0ZXBOYW1lLCBvbmx5X2NjX29waW5pb24sIGltYWdlX3NpZ24sIHRvcF9rZXl3b3JkcyktPlxuXHRcdGluc3RhbmNlID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnN0YW5jZSgpXG5cblx0XHRpc19jb21wbGV0ZWQgPSBpbnN0YW5jZT8uc3RhdGUgPT0gXCJjb21wbGV0ZWRcIlxuXG5cdFx0Y29tcGxldGVkX2RhdGUgPSBpZiBpc19jb21wbGV0ZWQgdGhlbiBfLmxhc3QoaW5zdGFuY2UudHJhY2VzKT8uZmluaXNoX2RhdGU/LmdldFRpbWUoKSBlbHNlIDBcblxuXHRcdGlmIGlzX2NvbXBsZXRlZCAmJiBpbnN0YW5jZS5maW5pc2hfZGF0ZVxuXHRcdFx0Y29tcGxldGVkX2RhdGUgPSBpbnN0YW5jZS5maW5pc2hfZGF0ZT8uZ2V0VGltZSgpXG5cblx0XHR0cmFjZXMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpXG5cblx0XHRhcHByb3ZlcyA9IF8uY2xvbmUodHJhY2VzW3N0ZXBOYW1lXSlcblxuXHRcdGFwcHJvdmVfc29ydCA9IChhcHByb3ZlcywgdG9wX2tleXdvcmRzKS0+XG5cbiPlr7lBcHByb3Zlc+aOkuW6j++8jCDmjInnhafmj5DkuqTml7bpl7TmjpLlgJLluo/vvIzlpoLmnpzmsqHmnInmj5DkuqTliJnmmL7npLrlnKjmnIDkuIrovrlcblx0XHRcdGFwcHJvdmVzX3NvcnRlZCA9IF8uc29ydEJ5IGFwcHJvdmVzLCAoYXBwcm92ZSktPlxuXHRcdFx0XHRyZXR1cm4gLShhcHByb3ZlLmZpbmlzaF9kYXRlIHx8IG5ldyBEYXRlKCkpLmdldFRpbWUoKVxuXG5cdFx0XHQj6YCa6L+H5YWz6ZSu5a2X5o6S5bqPXG5cdFx0XHRpZiB0b3Bfa2V5d29yZHNcblx0XHRcdFx0dG9wX2FwcHJvdmVzID0gbmV3IEFycmF5KClcblxuXHRcdFx0XHR0b3Bfa2V5d29yZHMuc3BsaXQoXCIsXCIpLmZvckVhY2ggKGtleSkgLT5cblx0XHRcdFx0XHR0b3BfYXBwcm92ZXMgPSBfLnVuaW9uIHRvcF9hcHByb3ZlcywgXy5maWx0ZXIoYXBwcm92ZXNfc29ydGVkLCAoYXBwcm92ZSktPlxuXHRcdFx0XHRcdFx0cmV0dXJuIGFwcHJvdmU/LmhhbmRsZXJfbmFtZT8uaW5kZXhPZihrZXkpID4gLTFcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCMg5a+5572u6aG25oSP6KeB5oyJ54Wn5aSE55CG5LqL5Lu25o6S5YCS5bqPXG5cdFx0XHRcdHRvcF9hcHByb3ZlcyA9IF8uc29ydEJ5IHRvcF9hcHByb3ZlcywgKHRvcF9hcHByb3ZlKS0+XG5cdFx0XHRcdFx0cmV0dXJuIC0odG9wX2FwcHJvdmUuZmluaXNoX2RhdGUgfHwgbmV3IERhdGUoKSkuZ2V0VGltZSgpXG5cblx0XHRcdFx0YXBwcm92ZXNfc29ydGVkID0gXy51bmlvbiB0b3BfYXBwcm92ZXMsIGFwcHJvdmVzX3NvcnRlZFxuXHRcdFx0cmV0dXJuIGFwcHJvdmVzX3NvcnRlZCB8fCBbXVxuXG5cdFx0YXBwcm92ZXMgPSBfLmZpbHRlciBhcHByb3ZlcywgKGEpLT5cblx0XHRcdHJldHVybiBhLnR5cGUgaXNudCBcImZvcndhcmRcIiBhbmQgYS50eXBlIGlzbnQgXCJkaXN0cmlidXRlXCIgYW5kIGEudHlwZSBpc250IFwidGVybWluYXRlZFwiXG5cblx0XHRpZiBvbmx5X2NjX29waW5pb25cblx0XHRcdGFwcHJvdmVzID0gYXBwcm92ZXM/LmZpbHRlclByb3BlcnR5KFwidHlwZVwiLCBcImNjXCIpXG5cblx0XHRhcHByb3Zlc19zb3J0ZWQgPSBhcHByb3ZlX3NvcnQoYXBwcm92ZXMsIHRvcF9rZXl3b3JkcylcblxuXHRcdGFwcHJvdmVzR3JvdXAgPSBfLmdyb3VwQnkoYXBwcm92ZXMsIFwiaGFuZGxlclwiKTtcblxuXHRcdGhhc05leHQgPSAoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkgLT5cblx0XHRcdGhhbmRsZXJBcHByb3ZlcyA9IGFwcHJvdmVzR3JvdXBbYXBwcm92ZS5oYW5kbGVyXVxuXHRcdFx0cmV0dXJuIF8uaW5kZXhPZihoYW5kbGVyQXBwcm92ZXMsIGFwcHJvdmUpICsgMSA8IGhhbmRsZXJBcHByb3Zlcy5sZW5ndGhcblxuXHRcdGhhdmVEZXNjcmlwdGlvbkFwcHJvdmUgPSAoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkgLT5cblx0XHRcdGhhbmRsZXJBcHByb3ZlcyA9IGFwcHJvdmVzR3JvdXBbYXBwcm92ZS5oYW5kbGVyXVxuXG5cdFx0XHRkZXNjcmlwdGlvbkFwcHJvdmVzID0gXy5maWx0ZXIgaGFuZGxlckFwcHJvdmVzLCAoYSktPlxuXHRcdFx0XHRpZiBhLmRlc2NyaXB0aW9uXG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRcdGlmIGRlc2NyaXB0aW9uQXBwcm92ZXMubGVuZ3RoID09IDBcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRcdHJldHVybiB0cnVlXG5cblxuXHRcdGFwcHJvdmVzX3NvcnRlZC5mb3JFYWNoIChhcHByb3ZlKSAtPlxuI1x0XHRcdOaciei+k+WFpeaEj+ingSDmiJYg5pyA5paw5LiA5p2h5bm25LiU55So5oi35rKh5pyJ6L6T5YWl6L+H5oSP6KeBXG4jXHRcdFx0aWYgIWFwcHJvdmUuaXNfZmluaXNoZWQgfHwgYXBwcm92ZS5kZXNjcmlwdGlvbiB8fCAoIWhhc05leHQoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkgJiYgIWhhdmVEZXNjcmlwdGlvbkFwcHJvdmUoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkpXG4jXHRcdFx0aWYgIWhhc05leHQoYXBwcm92ZSwgYXBwcm92ZXNHcm91cClcblx0XHRcdGlmIGFwcHJvdmUuc2lnbl9zaG93ICE9IGZhbHNlICYmIChhcHByb3ZlLmRlc2NyaXB0aW9uIHx8ICghYXBwcm92ZS5kZXNjcmlwdGlvbiAmJiAhaGFzTmV4dChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSAmJiAhYXBwcm92ZS5pc19maW5pc2hlZCkgfHwgTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53b3JrZmxvdz8uc2hvd0JsYW5rQXBwcm92ZURlc2NyaXB0aW9uKVxuXHRcdFx0XHRpZiBhcHByb3ZlLmp1ZGdlIGlzbnQgJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRcdFx0YXBwcm92ZS5fZGlzcGxheSA9IHRydWVcblxuXHRcdGFwcHJvdmVzX3NvcnRlZCA9IF8uZmlsdGVyIGFwcHJvdmVzX3NvcnRlZCwgKGEpIC0+XG5cdFx0XHRpZiBpc19jb21wbGV0ZWRcblx0XHRcdFx0cmV0dXJuIGEuX2Rpc3BsYXkgPT0gdHJ1ZSAmJiBhLmlzX2ZpbmlzaGVkICYmIGEuZmluaXNoX2RhdGU/LmdldFRpbWUoKSA8PSBjb21wbGV0ZWRfZGF0ZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gYS5fZGlzcGxheSA9PSB0cnVlXG5cdFx0cmV0dXJuIGFwcHJvdmVzX3NvcnRlZFxuXG5cdGluY2x1ZGU6IChhLCBiKSAtPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGUoYSwgYilcblxuXHR1bmVtcHR5OiAodmFsKS0+XG5cdFx0cmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudW5lbXB0eSh2YWwpIHx8IE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud29ya2Zsb3c/LnNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvblxuXG5cdGZvcm1hdERhdGU6IChkYXRlLCBvcHRpb25zKS0+XG5cdFx0aWYgIW9wdGlvbnNcblx0XHRcdG9wdGlvbnMgPSB7XCJmb3JtYXRcIjogXCJZWVlZLU1NLUREXCJ9XG5cblx0XHRyZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5mb3JtYXREYXRlKGRhdGUsIG9wdGlvbnMpXG5cblx0aXNNeUFwcHJvdmU6IChhcHByb3ZlLCBvbmx5X2NjX29waW5pb24pIC0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSAhPSAnaW5ib3gnXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0XHRjdXJyZW50QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpXG5cblx0XHRcdGlmICFhcHByb3ZlPy5faWRcblx0XHRcdFx0YXBwcm92ZSA9IGN1cnJlbnRBcHByb3ZlXG5cblx0XHRcdGlmIGFwcHJvdmUuX2lkID09IGN1cnJlbnRBcHByb3ZlPy5faWQgJiYgY3VycmVudEFwcHJvdmU/LnR5cGUgPT0gJ2NjJyAmJiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZVxuXHRcdFx0XHRpZiBfLmluZGV4T2YoY3VycmVudEFwcHJvdmU/Lm9waW5pb25fZmllbGRzX2NvZGUsIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSA+IC0xXG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XHRpZiAhKGN1cnJlbnRBcHByb3ZlPy50eXBlID09ICdjYycpICYmIG9ubHlfY2Nfb3BpbmlvblxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0aWYgY3VycmVudEFwcHJvdmUgJiYgYXBwcm92ZS5faWQgPT0gY3VycmVudEFwcHJvdmUuX2lkXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0bXlBcHByb3ZlRGVzY3JpcHRpb246IChhcHByb3ZlSWQpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0bXlBcHByb3ZlID0gVGVtcGxhdGUuaW5zdGFuY2UoKT8ubXlBcHByb3ZlPy5nZXQoKVxuXHRcdFx0XHRpZiBteUFwcHJvdmUgJiYgbXlBcHByb3ZlLmlkID09IGFwcHJvdmVJZFxuXHRcdFx0XHRcdGlmICFteUFwcHJvdmUuc2lnbl9maWVsZF9jb2RlIHx8IG15QXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgPT0gVGVtcGxhdGUuaW5zdGFuY2UoKT8uZGF0YT8ubmFtZVxuXHRcdFx0XHRcdFx0aWYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gbXlBcHByb3ZlPy5kZXNjcmlwdGlvbiB8fCBcIlwiXG5cdFx0XHRcdFx0XHRyZXR1cm4gU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpXG5cblx0bm93OiAoKS0+XG5cdFx0cmV0dXJuIG5ldyBEYXRlKCk7XG5cblx0aXNSZWFkT25seTogKCktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0cmV0dXJuIEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdGlzT3Bpbmlvbk9mRmllbGQ6IChhcHByb3ZlKS0+XG5cdFx0aWYgYXBwcm92ZS50eXBlID09IFwiY2NcIiAmJiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZVxuXHRcdFx0aWYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUgPT0gYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGVcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0bWFya0Rvd25Ub0h0bWw6IChtYXJrRG93blN0cmluZyktPlxuXHRcdGlmIG1hcmtEb3duU3RyaW5nXG5cdFx0XHQjIHJlbmRlcmVyID0gbmV3IE1hcmtkb3duLlJlbmRlcmVyKCk7XG5cdFx0XHQjIHJlbmRlcmVyLmxpbmsgPSAoaHJlZiwgdGl0bGUsIHRleHQpIC0+XG5cdFx0XHQjIFx0cmV0dXJuIFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyN7aHJlZn0nIHRpdGxlPScje3RpdGxlfSc+I3t0ZXh0fTwvYT5cIlxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKVxuXHRcdFx0cmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpXG5cblx0c3RlcHM6IChmaWVsZF9mb3JtdWxhLCBzdGVwLCBvbmx5X2NjX29waW5pb24sIGltYWdlX3NpZ24pLT5cblx0XHRzdGVwcyA9IFtdXG5cdFx0aWYgIXN0ZXBcblx0XHRcdGlmICFmaWVsZF9mb3JtdWxhXG5cdFx0XHRcdGZpZWxkX2Zvcm11bGEgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpPy5maWVsZHM/LmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIHRoaXMubmFtZSkuZm9ybXVsYVxuXHRcdFx0c3RlcHMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmdldE9waW5pb25GaWVsZFN0ZXBzTmFtZShmaWVsZF9mb3JtdWxhLCBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5kYXRhLnRvcF9rZXl3b3Jkcylcblx0XHRlbHNlXG5cdFx0XHRzdGVwcyA9IFt7c3RlcE5hbWU6IHN0ZXAsIG9ubHlfY2Nfb3Bpbmlvbjogb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduOiBpbWFnZV9zaWdufV1cblx0XHRyZXR1cm4gc3RlcHNcblxuXHRpbWFnZVNpZ25EYXRhOiAoaGFuZGxlcikgLT5cblx0XHRyZXR1cm4ge3VzZXI6IGhhbmRsZXJ9XG5cblx0c2hvd1NpZ25JbWFnZTogKGhhbmRsZXIsIGltYWdlX3NpZ24sIGp1ZGdlKSAtPlxuXHRcdGlmIFsncmV0dXJuZWQnLCAndGVybWluYXRlZCcsICdyZXRyaWV2ZWQnXS5pbmNsdWRlcyhqdWRnZSlcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKGhhbmRsZXIpXG5cblx0XHRpZiBzcGFjZVVzZXJTaWduPy5zaWduICYmIGltYWdlX3NpZ25cblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0Z2V0TGFzdFNpZ25BcHByb3ZlOiAoKS0+XG5cdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cblx0XHRyZXR1cm4gXy5sYXN0KFRyYWNlc01hbmFnZXIuZ2V0SGFuZGxlclNpZ25TaG93QXBwcm92ZXMgaW5zLCBNZXRlb3IudXNlcklkKCkpXG5cblxuXHRsYXN0TXlBcHByb3ZlRGVzY3JpcHRpb246ICgpLT5cblx0XHR0cmFjZXMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpXG5cdFx0Y3VycmVudFN0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblx0XHRhcHByb3ZlcyA9IF8uY2xvbmUodHJhY2VzW2N1cnJlbnRTdGVwLm5hbWVdKVxuXG5cdFx0YXBwcm92ZXMgPSBhcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcImhhbmRsZXJcIiwgTWV0ZW9yLnVzZXJJZCgpKVxuXG5cdFx0aWYgYXBwcm92ZXMubGVuZ3RoID4gMVxuXHRcdFx0cmV0dXJuIGFwcHJvdmVzW2FwcHJvdmVzLmxlbmd0aCAtIDJdPy5kZXNjcmlwdGlvblxuXG5cdFx0cmV0dXJuIFwiXCI7XG5cblx0c2hvd0FwcHJvdmU6IChhcHByb3ZlKS0+XG5cdFx0aWYgIWFwcHJvdmUuc2lnbl9maWVsZF9jb2RlIHx8IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlID09IFRlbXBsYXRlLmluc3RhbmNlKCk/LmRhdGE/Lm5hbWVcblx0XHRcdGlmIGFwcHJvdmU/LmlzX3JlYWRcblx0XHRcdFx0aWYgYXBwcm92ZS5pc19maW5pc2hlZFxuXHRcdFx0XHRcdHJldHVybiBbXCJhcHByb3ZlZFwiLCBcInJlamVjdGVkXCIsIFwic3VibWl0dGVkXCIsIFwicmVhZGVkXCJdLmluY2x1ZGVzKGFwcHJvdmUuanVkZ2UpXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdGp1ZGdlX2Rlc2NyaXB0aW9uOiAoanVkZ2UpLT5cblx0XHRyZXR1cm4gdChqdWRnZSArIFwiX2Rlc2NyaXB0aW9uXCIpXG5cblx0aXNfYXBwcm92ZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBcImFwcHJvdmVkXCIgPT0ganVkZ2VcblxuXHRpc19yZWplY3RlZDogKGp1ZGdlKS0+XG5cdFx0cmV0dXJuIFwicmVqZWN0ZWRcIiA9PSBqdWRnZVxuXG5cdGlzX3JlYWRlZDogKGp1ZGdlKS0+XG5cdFx0cmV0dXJuIFtcImFwcHJvdmVkXCIsIFwicmVqZWN0ZWRcIiwgXCJzdWJtaXR0ZWRcIiwgXCJyZWFkZWRcIl0uaW5jbHVkZXMoanVkZ2UpXG5cblx0YWRkQ2xhc3M6ICgpLT5cblx0XHRuYW1lID0gVGVtcGxhdGUuaW5zdGFuY2UoKT8uZGF0YT8ubmFtZVxuXHRcdHNldFRpbWVvdXQgKCkgLT5cblx0XHRcdHRyeVxuXHRcdFx0XHRlbGVtZW50ID0gJChcIi5hdXRvbWF0aWMub3Bpbmlvbi1maWVsZC1cIiArIG5hbWUpXG5cdFx0XHRcdGlmIGVsZW1lbnQubGVuZ3RoID4gMFxuXHRcdFx0XHRcdGlmIGVsZW1lbnQ/LmlzKFwidGRcIilcblx0XHRcdFx0XHRcdGVsZW1lbnQuYWRkQ2xhc3MoJ2ZpZWxkLWVkaXRhYmxlJylcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHQkKFwiLmluc3RhbmNlLXNpZ25cIiwgZWxlbWVudCkuYWRkQ2xhc3MoJ2ZpZWxkLWVkaXRhYmxlJylcblx0XHRcdGNhdGNoIGVcblx0XHRcdFx0Y29uc29sZS5sb2cgZVxuXHRcdCwgMVxuXHRcdHJldHVybiAnJ1xuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0SW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzLmRlZmF1bHREZXNjcmlwdGlvbiA9IC0+XG5cdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEuZGVmYXVsdF9kZXNjcmlwdGlvbiB8fCBUQVBpMThuLl9fKFwiaW5zdGFuY2VfZGVmYXVsdF9vcGluaW9uXCIsIHt9LCBsb2NhbGUpIiwidmFyIG1hcmtlZDtcblxubWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKTtcblxuSW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzID0ge1xuICBzaG93OiBmdW5jdGlvbihzdGVwTmFtZSkge1xuICAgIHZhciBpbnN0YW5jZSwgbXlBcHByb3ZlLCBteVRyYWNlLCByZWY7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KCdpbnN0YW5jZVByaW50JykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKEluc3RhbmNlTWFuYWdlci5pc0luYm94KCkpIHtcbiAgICAgICAgbXlBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG4gICAgICAgIGlmIChteUFwcHJvdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgIG15VHJhY2UgPSBpbnN0YW5jZSAhPSBudWxsID8gKHJlZiA9IGluc3RhbmNlLnRyYWNlcykgIT0gbnVsbCA/IHJlZi5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIG15QXBwcm92ZS50cmFjZSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIChteVRyYWNlICE9IG51bGwgPyBteVRyYWNlLm5hbWUgOiB2b2lkIDApID09PSBzdGVwTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlZmF1bHREZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5kZWZhdWx0X2Rlc2NyaXB0aW9uO1xuICB9LFxuICB0cmFjZXM6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpO1xuICB9LFxuICB0cmFjZTogZnVuY3Rpb24oc3RlcE5hbWUsIG9ubHlfY2Nfb3BpbmlvbiwgaW1hZ2Vfc2lnbiwgdG9wX2tleXdvcmRzKSB7XG4gICAgdmFyIGFwcHJvdmVfc29ydCwgYXBwcm92ZXMsIGFwcHJvdmVzR3JvdXAsIGFwcHJvdmVzX3NvcnRlZCwgY29tcGxldGVkX2RhdGUsIGhhc05leHQsIGhhdmVEZXNjcmlwdGlvbkFwcHJvdmUsIGluc3RhbmNlLCBpc19jb21wbGV0ZWQsIHJlZiwgcmVmMSwgcmVmMiwgdHJhY2VzO1xuICAgIGluc3RhbmNlID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnN0YW5jZSgpO1xuICAgIGlzX2NvbXBsZXRlZCA9IChpbnN0YW5jZSAhPSBudWxsID8gaW5zdGFuY2Uuc3RhdGUgOiB2b2lkIDApID09PSBcImNvbXBsZXRlZFwiO1xuICAgIGNvbXBsZXRlZF9kYXRlID0gaXNfY29tcGxldGVkID8gKHJlZiA9IF8ubGFzdChpbnN0YW5jZS50cmFjZXMpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZmluaXNoX2RhdGUpICE9IG51bGwgPyByZWYxLmdldFRpbWUoKSA6IHZvaWQgMCA6IHZvaWQgMCA6IDA7XG4gICAgaWYgKGlzX2NvbXBsZXRlZCAmJiBpbnN0YW5jZS5maW5pc2hfZGF0ZSkge1xuICAgICAgY29tcGxldGVkX2RhdGUgPSAocmVmMiA9IGluc3RhbmNlLmZpbmlzaF9kYXRlKSAhPSBudWxsID8gcmVmMi5nZXRUaW1lKCkgOiB2b2lkIDA7XG4gICAgfVxuICAgIHRyYWNlcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudHJhY2VzKCk7XG4gICAgYXBwcm92ZXMgPSBfLmNsb25lKHRyYWNlc1tzdGVwTmFtZV0pO1xuICAgIGFwcHJvdmVfc29ydCA9IGZ1bmN0aW9uKGFwcHJvdmVzLCB0b3Bfa2V5d29yZHMpIHtcbiAgICAgIHZhciBhcHByb3Zlc19zb3J0ZWQsIHRvcF9hcHByb3ZlcztcbiAgICAgIGFwcHJvdmVzX3NvcnRlZCA9IF8uc29ydEJ5KGFwcHJvdmVzLCBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgIHJldHVybiAtKGFwcHJvdmUuZmluaXNoX2RhdGUgfHwgbmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgICAgfSk7XG4gICAgICBpZiAodG9wX2tleXdvcmRzKSB7XG4gICAgICAgIHRvcF9hcHByb3ZlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0b3Bfa2V5d29yZHMuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRvcF9hcHByb3ZlcyA9IF8udW5pb24odG9wX2FwcHJvdmVzLCBfLmZpbHRlcihhcHByb3Zlc19zb3J0ZWQsIGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgICAgIHZhciByZWYzO1xuICAgICAgICAgICAgcmV0dXJuIChhcHByb3ZlICE9IG51bGwgPyAocmVmMyA9IGFwcHJvdmUuaGFuZGxlcl9uYW1lKSAhPSBudWxsID8gcmVmMy5pbmRleE9mKGtleSkgOiB2b2lkIDAgOiB2b2lkIDApID4gLTE7XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdG9wX2FwcHJvdmVzID0gXy5zb3J0QnkodG9wX2FwcHJvdmVzLCBmdW5jdGlvbih0b3BfYXBwcm92ZSkge1xuICAgICAgICAgIHJldHVybiAtKHRvcF9hcHByb3ZlLmZpbmlzaF9kYXRlIHx8IG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcHJvdmVzX3NvcnRlZCA9IF8udW5pb24odG9wX2FwcHJvdmVzLCBhcHByb3Zlc19zb3J0ZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwcHJvdmVzX3NvcnRlZCB8fCBbXTtcbiAgICB9O1xuICAgIGFwcHJvdmVzID0gXy5maWx0ZXIoYXBwcm92ZXMsIGZ1bmN0aW9uKGEpIHtcbiAgICAgIHJldHVybiBhLnR5cGUgIT09IFwiZm9yd2FyZFwiICYmIGEudHlwZSAhPT0gXCJkaXN0cmlidXRlXCIgJiYgYS50eXBlICE9PSBcInRlcm1pbmF0ZWRcIjtcbiAgICB9KTtcbiAgICBpZiAob25seV9jY19vcGluaW9uKSB7XG4gICAgICBhcHByb3ZlcyA9IGFwcHJvdmVzICE9IG51bGwgPyBhcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcInR5cGVcIiwgXCJjY1wiKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgYXBwcm92ZXNfc29ydGVkID0gYXBwcm92ZV9zb3J0KGFwcHJvdmVzLCB0b3Bfa2V5d29yZHMpO1xuICAgIGFwcHJvdmVzR3JvdXAgPSBfLmdyb3VwQnkoYXBwcm92ZXMsIFwiaGFuZGxlclwiKTtcbiAgICBoYXNOZXh0ID0gZnVuY3Rpb24oYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkge1xuICAgICAgdmFyIGhhbmRsZXJBcHByb3ZlcztcbiAgICAgIGhhbmRsZXJBcHByb3ZlcyA9IGFwcHJvdmVzR3JvdXBbYXBwcm92ZS5oYW5kbGVyXTtcbiAgICAgIHJldHVybiBfLmluZGV4T2YoaGFuZGxlckFwcHJvdmVzLCBhcHByb3ZlKSArIDEgPCBoYW5kbGVyQXBwcm92ZXMubGVuZ3RoO1xuICAgIH07XG4gICAgaGF2ZURlc2NyaXB0aW9uQXBwcm92ZSA9IGZ1bmN0aW9uKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIHtcbiAgICAgIHZhciBkZXNjcmlwdGlvbkFwcHJvdmVzLCBoYW5kbGVyQXBwcm92ZXM7XG4gICAgICBoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl07XG4gICAgICBkZXNjcmlwdGlvbkFwcHJvdmVzID0gXy5maWx0ZXIoaGFuZGxlckFwcHJvdmVzLCBmdW5jdGlvbihhKSB7XG4gICAgICAgIGlmIChhLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBpZiAoZGVzY3JpcHRpb25BcHByb3Zlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBhcHByb3Zlc19zb3J0ZWQuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICB2YXIgcmVmMztcbiAgICAgIGlmIChhcHByb3ZlLnNpZ25fc2hvdyAhPT0gZmFsc2UgJiYgKGFwcHJvdmUuZGVzY3JpcHRpb24gfHwgKCFhcHByb3ZlLmRlc2NyaXB0aW9uICYmICFoYXNOZXh0KGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApICYmICFhcHByb3ZlLmlzX2ZpbmlzaGVkKSB8fCAoKHJlZjMgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud29ya2Zsb3cpICE9IG51bGwgPyByZWYzLnNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbiA6IHZvaWQgMCkpKSB7XG4gICAgICAgIGlmIChhcHByb3ZlLmp1ZGdlICE9PSAndGVybWluYXRlZCcpIHtcbiAgICAgICAgICByZXR1cm4gYXBwcm92ZS5fZGlzcGxheSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhcHByb3Zlc19zb3J0ZWQgPSBfLmZpbHRlcihhcHByb3Zlc19zb3J0ZWQsIGZ1bmN0aW9uKGEpIHtcbiAgICAgIHZhciByZWYzO1xuICAgICAgaWYgKGlzX2NvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm4gYS5fZGlzcGxheSA9PT0gdHJ1ZSAmJiBhLmlzX2ZpbmlzaGVkICYmICgocmVmMyA9IGEuZmluaXNoX2RhdGUpICE9IG51bGwgPyByZWYzLmdldFRpbWUoKSA6IHZvaWQgMCkgPD0gY29tcGxldGVkX2RhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYS5fZGlzcGxheSA9PT0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYXBwcm92ZXNfc29ydGVkO1xuICB9LFxuICBpbmNsdWRlOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5jbHVkZShhLCBiKTtcbiAgfSxcbiAgdW5lbXB0eTogZnVuY3Rpb24odmFsKSB7XG4gICAgdmFyIHJlZjtcbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy51bmVtcHR5KHZhbCkgfHwgKChyZWYgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud29ya2Zsb3cpICE9IG51bGwgPyByZWYuc2hvd0JsYW5rQXBwcm92ZURlc2NyaXB0aW9uIDogdm9pZCAwKTtcbiAgfSxcbiAgZm9ybWF0RGF0ZTogZnVuY3Rpb24oZGF0ZSwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgXCJmb3JtYXRcIjogXCJZWVlZLU1NLUREXCJcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZvcm1hdERhdGUoZGF0ZSwgb3B0aW9ucyk7XG4gIH0sXG4gIGlzTXlBcHByb3ZlOiBmdW5jdGlvbihhcHByb3ZlLCBvbmx5X2NjX29waW5pb24pIHtcbiAgICB2YXIgY3VycmVudEFwcHJvdmUsIGlucztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgIT09ICdpbmJveCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjdXJyZW50QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuICAgICAgaWYgKCEoYXBwcm92ZSAhPSBudWxsID8gYXBwcm92ZS5faWQgOiB2b2lkIDApKSB7XG4gICAgICAgIGFwcHJvdmUgPSBjdXJyZW50QXBwcm92ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcHByb3ZlLl9pZCA9PT0gKGN1cnJlbnRBcHByb3ZlICE9IG51bGwgPyBjdXJyZW50QXBwcm92ZS5faWQgOiB2b2lkIDApICYmIChjdXJyZW50QXBwcm92ZSAhPSBudWxsID8gY3VycmVudEFwcHJvdmUudHlwZSA6IHZvaWQgMCkgPT09ICdjYycgJiYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUpIHtcbiAgICAgICAgaWYgKF8uaW5kZXhPZihjdXJyZW50QXBwcm92ZSAhPSBudWxsID8gY3VycmVudEFwcHJvdmUub3Bpbmlvbl9maWVsZHNfY29kZSA6IHZvaWQgMCwgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUpID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghKChjdXJyZW50QXBwcm92ZSAhPSBudWxsID8gY3VycmVudEFwcHJvdmUudHlwZSA6IHZvaWQgMCkgPT09ICdjYycpICYmIG9ubHlfY2Nfb3Bpbmlvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudEFwcHJvdmUgJiYgYXBwcm92ZS5faWQgPT09IGN1cnJlbnRBcHByb3ZlLl9pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBteUFwcHJvdmVEZXNjcmlwdGlvbjogZnVuY3Rpb24oYXBwcm92ZUlkKSB7XG4gICAgdmFyIG15QXBwcm92ZSwgcmVmLCByZWYxLCByZWYyLCByZWYzO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICBteUFwcHJvdmUgPSAocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLm15QXBwcm92ZSkgIT0gbnVsbCA/IHJlZjEuZ2V0KCkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIGlmIChteUFwcHJvdmUgJiYgbXlBcHByb3ZlLmlkID09PSBhcHByb3ZlSWQpIHtcbiAgICAgICAgICBpZiAoIW15QXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgfHwgbXlBcHByb3ZlLnNpZ25fZmllbGRfY29kZSA9PT0gKChyZWYyID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYzID0gcmVmMi5kYXRhKSAhPSBudWxsID8gcmVmMy5uYW1lIDogdm9pZCAwIDogdm9pZCAwKSkge1xuICAgICAgICAgICAgaWYgKCFTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChteUFwcHJvdmUgIT0gbnVsbCA/IG15QXBwcm92ZS5kZXNjcmlwdGlvbiA6IHZvaWQgMCkgfHwgXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBub3c6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICB9LFxuICBpc1JlYWRPbmx5OiBmdW5jdGlvbigpIHtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzT3Bpbmlvbk9mRmllbGQ6IGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICBpZiAoYXBwcm92ZS50eXBlID09PSBcImNjXCIgJiYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUpIHtcbiAgICAgIGlmIChUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSA9PT0gYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgbWFya0Rvd25Ub0h0bWw6IGZ1bmN0aW9uKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgaWYgKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKTtcbiAgICB9XG4gIH0sXG4gIHN0ZXBzOiBmdW5jdGlvbihmaWVsZF9mb3JtdWxhLCBzdGVwLCBvbmx5X2NjX29waW5pb24sIGltYWdlX3NpZ24pIHtcbiAgICB2YXIgcmVmLCByZWYxLCByZWYyLCBzdGVwcztcbiAgICBzdGVwcyA9IFtdO1xuICAgIGlmICghc3RlcCkge1xuICAgICAgaWYgKCFmaWVsZF9mb3JtdWxhKSB7XG4gICAgICAgIGZpZWxkX2Zvcm11bGEgPSAocmVmID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmZpZWxkcykgIT0gbnVsbCA/IHJlZjEuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgdGhpcy5uYW1lKS5mb3JtdWxhIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgfVxuICAgICAgc3RlcHMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmdldE9waW5pb25GaWVsZFN0ZXBzTmFtZShmaWVsZF9mb3JtdWxhLCAocmVmMiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyByZWYyLmRhdGEudG9wX2tleXdvcmRzIDogdm9pZCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RlcHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGVwTmFtZTogc3RlcCxcbiAgICAgICAgICBvbmx5X2NjX29waW5pb246IG9ubHlfY2Nfb3BpbmlvbixcbiAgICAgICAgICBpbWFnZV9zaWduOiBpbWFnZV9zaWduXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBzdGVwcztcbiAgfSxcbiAgaW1hZ2VTaWduRGF0YTogZnVuY3Rpb24oaGFuZGxlcikge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyOiBoYW5kbGVyXG4gICAgfTtcbiAgfSxcbiAgc2hvd1NpZ25JbWFnZTogZnVuY3Rpb24oaGFuZGxlciwgaW1hZ2Vfc2lnbiwganVkZ2UpIHtcbiAgICB2YXIgc3BhY2VVc2VyU2lnbjtcbiAgICBpZiAoWydyZXR1cm5lZCcsICd0ZXJtaW5hdGVkJywgJ3JldHJpZXZlZCddLmluY2x1ZGVzKGp1ZGdlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbihoYW5kbGVyKTtcbiAgICBpZiAoKHNwYWNlVXNlclNpZ24gIT0gbnVsbCA/IHNwYWNlVXNlclNpZ24uc2lnbiA6IHZvaWQgMCkgJiYgaW1hZ2Vfc2lnbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGdldExhc3RTaWduQXBwcm92ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlucztcbiAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gXy5sYXN0KFRyYWNlc01hbmFnZXIuZ2V0SGFuZGxlclNpZ25TaG93QXBwcm92ZXMoaW5zLCBNZXRlb3IudXNlcklkKCkpKTtcbiAgfSxcbiAgbGFzdE15QXBwcm92ZURlc2NyaXB0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXBwcm92ZXMsIGN1cnJlbnRTdGVwLCByZWYsIHRyYWNlcztcbiAgICB0cmFjZXMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpO1xuICAgIGN1cnJlbnRTdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgYXBwcm92ZXMgPSBfLmNsb25lKHRyYWNlc1tjdXJyZW50U3RlcC5uYW1lXSk7XG4gICAgYXBwcm92ZXMgPSBhcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcImhhbmRsZXJcIiwgTWV0ZW9yLnVzZXJJZCgpKTtcbiAgICBpZiAoYXBwcm92ZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIChyZWYgPSBhcHByb3Zlc1thcHByb3Zlcy5sZW5ndGggLSAyXSkgIT0gbnVsbCA/IHJlZi5kZXNjcmlwdGlvbiA6IHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0sXG4gIHNob3dBcHByb3ZlOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgdmFyIHJlZiwgcmVmMTtcbiAgICBpZiAoIWFwcHJvdmUuc2lnbl9maWVsZF9jb2RlIHx8IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlID09PSAoKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5kYXRhKSAhPSBudWxsID8gcmVmMS5uYW1lIDogdm9pZCAwIDogdm9pZCAwKSkge1xuICAgICAgaWYgKGFwcHJvdmUgIT0gbnVsbCA/IGFwcHJvdmUuaXNfcmVhZCA6IHZvaWQgMCkge1xuICAgICAgICBpZiAoYXBwcm92ZS5pc19maW5pc2hlZCkge1xuICAgICAgICAgIHJldHVybiBbXCJhcHByb3ZlZFwiLCBcInJlamVjdGVkXCIsIFwic3VibWl0dGVkXCIsIFwicmVhZGVkXCJdLmluY2x1ZGVzKGFwcHJvdmUuanVkZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAganVkZ2VfZGVzY3JpcHRpb246IGZ1bmN0aW9uKGp1ZGdlKSB7XG4gICAgcmV0dXJuIHQoanVkZ2UgKyBcIl9kZXNjcmlwdGlvblwiKTtcbiAgfSxcbiAgaXNfYXBwcm92ZWQ6IGZ1bmN0aW9uKGp1ZGdlKSB7XG4gICAgcmV0dXJuIFwiYXBwcm92ZWRcIiA9PT0ganVkZ2U7XG4gIH0sXG4gIGlzX3JlamVjdGVkOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiBcInJlamVjdGVkXCIgPT09IGp1ZGdlO1xuICB9LFxuICBpc19yZWFkZWQ6IGZ1bmN0aW9uKGp1ZGdlKSB7XG4gICAgcmV0dXJuIFtcImFwcHJvdmVkXCIsIFwicmVqZWN0ZWRcIiwgXCJzdWJtaXR0ZWRcIiwgXCJyZWFkZWRcIl0uaW5jbHVkZXMoanVkZ2UpO1xuICB9LFxuICBhZGRDbGFzczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5hbWUsIHJlZiwgcmVmMTtcbiAgICBuYW1lID0gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5kYXRhKSAhPSBudWxsID8gcmVmMS5uYW1lIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSwgZWxlbWVudDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVsZW1lbnQgPSAkKFwiLmF1dG9tYXRpYy5vcGluaW9uLWZpZWxkLVwiICsgbmFtZSk7XG4gICAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5pcyhcInRkXCIpIDogdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5hZGRDbGFzcygnZmllbGQtZWRpdGFibGUnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICQoXCIuaW5zdGFuY2Utc2lnblwiLCBlbGVtZW50KS5hZGRDbGFzcygnZmllbGQtZWRpdGFibGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfVxuICAgIH0sIDEpO1xuICAgIHJldHVybiAnJztcbiAgfVxufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBJbnN0YW5jZVNpZ25UZXh0LmhlbHBlcnMuZGVmYXVsdERlc2NyaXB0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEuZGVmYXVsdF9kZXNjcmlwdGlvbiB8fCBUQVBpMThuLl9fKFwiaW5zdGFuY2VfZGVmYXVsdF9vcGluaW9uXCIsIHt9LCBsb2NhbGUpO1xuICB9O1xufVxuIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuVHJhY2VzVGVtcGxhdGUuaGVscGVycyA9XG5cdHRyYWNlU2hvd1NpZ25JbWFnZTogKCktPlxuXHRcdHJldHVybiBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndvcmtmbG93LnRyYWNlU2hvd1NpZ25JbWFnZSAhPSBmYWxzZSAmJiBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndvcmtmbG93LnRyYWNlU2hvd1NpZ25JbWFnZSAhPSAnZmFsc2UnXG5cdGVxdWFsczogKGEsIGIpIC0+XG5cdFx0YSA9PSBiXG5cdGVtcHR5OiAoYSkgLT5cblx0XHRpZiBhXG5cdFx0XHRhLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA8IDFcblx0XHRlbHNlXG5cdFx0XHR0cnVlXG5cdHVuZW1wdHk6IChhKSAtPlxuXHRcdGlmIGFcblx0XHRcdGEudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoID4gMFxuXHRcdGVsc2Vcblx0XHRcdGZhbHNlXG5cblx0YXBwZW5kOiAoYSwgYikgLT5cblx0XHRhICsgYlxuXG5cdGRhdGVGb3JtYXQ6IChkYXRlKSAtPlxuXHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpICYmIGRhdGU/LmdldEZ1bGxZZWFyKCkgPT0gKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpXG5cdFx0XHRcdHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdNTS1ERCBISDptbScpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXG5cdGdldFN0ZXBOYW1lOiAoc3RlcElkKSAtPlxuXHRcdHN0ZXAgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VTdGVwKHN0ZXBJZClcblx0XHRpZiBzdGVwXG5cdFx0XHRyZXR1cm4gc3RlcC5uYW1lXG5cdFx0bnVsbFxuXHRzaG93RGVsZXRlQnV0dG9uOiAoYXBwcm92ZWQpIC0+XG5cdFx0aWYgYXBwcm92ZWQgYW5kIGFwcHJvdmVkLnR5cGUgPT0gJ2NjJyBhbmQgYXBwcm92ZWQuZnJvbV91c2VyID09IE1ldGVvci51c2VySWQoKSBhbmQgYXBwcm92ZWQuaXNfZmluaXNoZWQgIT0gdHJ1ZSBhbmQgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKVxuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRmYWxzZVxuXHRpc1Nob3dNb2RpZmljYXRpb25CdXR0b246IChhcHByb3ZlZCkgLT5cblx0XHRhcHByb3ZlX2FkbWlucyA9IE1ldGVvci5zZXR0aW5ncz8ucHVibGljPy53b3JrZmxvdz8uYXBwcm92ZV9hZG1pbnNcblx0XHRpZiBhcHByb3ZlX2FkbWlucz8ubGVuZ3RoXG5cdFx0XHRpc1Nob3cgPSBhcHByb3ZlX2FkbWlucz8uY29udGFpbnMgTWV0ZW9yLnVzZXJJZCgpXG5cdFx0dW5sZXNzIGlzU2hvd1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0cmV0dXJuIGFwcHJvdmVkLmhhbmRsZXIgPT0gTWV0ZW9yLnVzZXJJZCgpXG5cdGlzRWRpdGluZzogKCkgLT5cblx0XHQgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuaXNfZWRpdGluZz8uZ2V0KClcblx0aXNTaG93RGVzY3JpcHRpb246IChhcHByb3ZlZCktPlxuXHRcdCMgZGVidWdnZXJcblx0XHRpZiBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLmlzU2hvd01vZGlmaWNhdGlvbkJ1dHRvbiBhcHByb3ZlZFxuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRyZXR1cm4gYXBwcm92ZWQuZGVzY3JpcHRpb24/LnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA+IDBcblx0aXNDQzogKGFwcHJvdmVkKSAtPlxuXHRcdGlmIGFwcHJvdmVkIGFuZCBhcHByb3ZlZC50eXBlID09ICdjYydcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZmFsc2Vcblx0Z2V0QXBwcm92ZVN0YXR1c0ljb246IChhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIC0+XG5cdFx0aWYgYXV0b1N1Ym1pdHRlZCA9PSB0cnVlXG5cdFx0XHRyZXR1cm4gJ2lvbiBpb24tYW5kcm9pZC1hbGFybS1jbG9jaydcblx0XHQj5bey57uT5p2f55qE5pi+56S65Li65qC45YeGL+mps+Wbni/lj5bmtojnlLPor7fvvIzlubbmmL7npLrlpITnkIbnirbmgIHlm77moIdcblx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9IHVuZGVmaW5lZFxuXHRcdHN3aXRjaCBhcHByb3ZlSnVkZ2Vcblx0XHRcdHdoZW4gJ2FwcHJvdmVkJ1xuXHRcdFx0XHQjIOW3suaguOWHhlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWNoZWNrbWFyay1yb3VuZCdcblx0XHRcdHdoZW4gJ3JlamVjdGVkJ1xuXHRcdFx0XHQjIOW3sumps+WbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWNsb3NlLXJvdW5kJ1xuXHRcdFx0d2hlbiAndGVybWluYXRlZCdcblx0XHRcdFx0IyDlt7Llj5bmtohcblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnZmEgZmEtYmFuJ1xuXHRcdFx0d2hlbiAncmVhc3NpZ25lZCdcblx0XHRcdFx0IyDovaznrb7moLhcblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1hbmRyb2lkLWNvbnRhY3QnXG5cdFx0XHR3aGVuICdyZWxvY2F0ZWQnXG5cdFx0XHRcdCMg6YeN5a6a5L2NXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tYXJyb3ctc2hyaW5rJ1xuXHRcdFx0d2hlbiAncmV0cmlldmVkJ1xuXHRcdFx0XHQjIOW3suWPluWbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdmYSBmYS11bmRvJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICcnXG5cdFx0XHRcdGJyZWFrXG5cdFx0YXBwcm92ZVN0YXR1c0ljb25cblx0Z2V0QXBwcm92ZVN0YXR1c1RleHQ6IChhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIC0+XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0XHRpZiBsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnemgtY24nXG5cdFx0XHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRcdGVsc2Vcblx0XHRcdGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIilcblx0XHQj5bey57uT5p2f55qE5pi+56S65Li65qC45YeGL+mps+Wbni/lj5bmtojnlLPor7fvvIzlubbmmL7npLrlpITnkIbnirbmgIHlm77moIdcblx0XHRpZiBhdXRvU3VibWl0dGVkID09IHRydWVcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX3RpbWVvdXRfYXV0b19zdWJtaXR0ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gdW5kZWZpbmVkXG5cdFx0c3dpdGNoIGFwcHJvdmVKdWRnZVxuXHRcdFx0d2hlbiAnYXBwcm92ZWQnXG5cdFx0XHRcdCMg5bey5qC45YeGXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgYXBwcm92ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmVqZWN0ZWQnXG5cdFx0XHRcdCMg5bey6amz5ZueXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVqZWN0ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAndGVybWluYXRlZCdcblx0XHRcdFx0IyDlt7Llj5bmtohcblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSB0ZXJtaW5hdGVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JlYXNzaWduZWQnXG5cdFx0XHRcdCMg6L2s562+5qC4XG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVhc3NpZ25lZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZWxvY2F0ZWQnXG5cdFx0XHRcdCMg6YeN5a6a5L2NXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVsb2NhdGVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JldHJpZXZlZCdcblx0XHRcdFx0IyDlt7Llj5blm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZXRyaWV2ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmV0dXJuZWQnXG5cdFx0XHRcdCMg5bey6YCA5ZueXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmV0dXJuZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmVhZGVkJ1xuXHRcdFx0XHQjIOW3sumYhVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlYWRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gJydcblx0XHRcdFx0YnJlYWtcblx0XHRhcHByb3ZlU3RhdHVzVGV4dFxuXHRcblx0Z2V0QXBwcm92ZUp1ZGdlQ2xhc3M6IChhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIC0+XG5cdFx0aWYgYXV0b1N1Ym1pdHRlZCA9PSB0cnVlXG5cdFx0XHRyZXR1cm4gJ2F1dG9TdWJtaXR0ZWQnXG5cdFx0cmV0dXJuIGFwcHJvdmVKdWRnZVxuXG5cdF90OiAoa2V5KS0+XG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KVxuXG5cdG15QXBwcm92ZURlc2NyaXB0aW9uOiAoYXBwcm92ZUlkKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdG15QXBwcm92ZSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/Lm15QXBwcm92ZT8uZ2V0KClcblx0XHRcdFx0aWYgbXlBcHByb3ZlICYmIG15QXBwcm92ZS5pZCA9PSBhcHByb3ZlSWRcblx0XHRcdFx0XHRpZiAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpXG5cdFx0XHRcdFx0XHRyZXR1cm4gbXlBcHByb3ZlPy5kZXNjcmlwdGlvbiB8fCBcIlwiXG5cdFx0XHRcdFx0cmV0dXJuIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKVxuXHRpc0ZvcndhcmQ6IChhcHByb3ZlZCkgLT5cblx0XHRpZiBhcHByb3ZlZCBhbmQgYXBwcm92ZWQudHlwZSA9PSAnZm9yd2FyZCdcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZmFsc2Vcblx0c2hvd0ZvcndhcmREZWxldGVCdXR0b246IChhcHByb3ZlKSAtPlxuXHRcdGlmIGRiLmluc3RhbmNlcy5maW5kKGFwcHJvdmUuZm9yd2FyZF9pbnN0YW5jZSkuY291bnQoKSBpcyAwXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRpZiBhcHByb3ZlIGFuZCBhcHByb3ZlLnR5cGUgPT0gJ2ZvcndhcmQnIGFuZCBhcHByb3ZlLmZyb21fdXNlciA9PSBNZXRlb3IudXNlcklkKCkgYW5kICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgYW5kIGFwcHJvdmUuanVkZ2UgaXNudCAndGVybWluYXRlZCdcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZmFsc2Vcblx0bWFya0Rvd25Ub0h0bWw6IChtYXJrRG93blN0cmluZyktPlxuXHRcdGlmIG1hcmtEb3duU3RyaW5nXG5cdFx0XHQjIHJlbmRlcmVyID0gbmV3IE1hcmtkb3duLlJlbmRlcmVyKCk7XG5cdFx0XHQjIHJlbmRlcmVyLmxpbmsgPSAoIGhyZWYsIHRpdGxlLCB0ZXh0ICkgLT5cblx0XHRcdCMgXHRyZXR1cm4gXCI8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0nI3tocmVmfScgdGl0bGU9JyN7dGl0bGV9Jz4je3RleHR9PC9hPlwiXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0bWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpXG5cdFx0XHRyZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSlcblx0aXNEaXN0cmlidXRlOiAoYXBwcm92ZSkgLT5cblx0XHRpZiBhcHByb3ZlIGFuZCBhcHByb3ZlLnR5cGUgPT0gJ2Rpc3RyaWJ1dGUnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdHNob3dEaXN0cmlidXRlRGVsZXRlQnV0dG9uOiAoYXBwcm92ZSkgLT5cblx0XHRpZiBkYi5pbnN0YW5jZXMuZmluZChhcHByb3ZlLmZvcndhcmRfaW5zdGFuY2UpLmNvdW50KCkgaXMgMFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiBhcHByb3ZlIGFuZCBhcHByb3ZlLnR5cGUgPT0gJ2Rpc3RyaWJ1dGUnIGFuZCAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpIGFuZCBhcHByb3ZlLmp1ZGdlIGlzbnQgJ3Rlcm1pbmF0ZWQnXG5cdFx0XHQjIOa1geeoi+euoeeQhuWRmOWSjOezu+e7n+euoeeQhuWRmO+8jOWPr+S7peaJp+ihjOS7u+S9leaDheWGteS4i+eahOaWh+S7tuWPlua2iOWIhuWPkVxuXHRcdFx0aW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogYXBwcm92ZS5pbnN0YW5jZX0sIHtmaWVsZHM6IHtmbG93OiAxLCBzcGFjZTogMX19KVxuXHRcdFx0aWYgaW5zIGFuZCBpbnMuZmxvdyBhbmQgaW5zLnNwYWNlXG5cdFx0XHRcdGlmIFdvcmtmbG93TWFuYWdlci5oYXNGbG93QWRtaW5QZXJtaXNzaW9uKGlucy5mbG93LCBpbnMuc3BhY2UsIE1ldGVvci51c2VySWQoKSlcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0XHRpZiBhcHByb3ZlLmZyb21fdXNlciA9PSBNZXRlb3IudXNlcklkKClcblx0XHRcdFx0cmV0dXJuIHRydWVcblxuXHRcdGZhbHNlXG5cblx0ZmluaXNoRGF0ZVNjaGVtYTogKCkgLT5cblx0XHRpZiBTdGVlZG9zLmlzQW5kcm9pZE9ySU9TKClcblx0XHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKHtcblx0XHRcdFx0ZmluaXNoX2RhdGU6IHtcblx0XHRcdFx0XHRhdXRvZm9ybToge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJkYXRldGltZS1sb2NhbFwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvcHRpb25hbDogZmFsc2UsXG5cdFx0XHRcdFx0dHlwZTogRGF0ZVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKHtcblx0XHRcdFx0ZmluaXNoX2RhdGU6IHtcblx0XHRcdFx0XHRhdXRvZm9ybToge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJib290c3RyYXAtZGF0ZXRpbWVwaWNrZXJcIlxuXHRcdFx0XHRcdFx0cmVhZG9ubHk6IHRydWVcblx0XHRcdFx0XHRcdGRhdGVUaW1lUGlja2VyT3B0aW9uczp7XG5cdFx0XHRcdFx0XHRcdGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tXCIsXG5cdFx0XHRcdFx0XHRcdGlnbm9yZVJlYWRvbmx5OnRydWUsXG5cdFx0XHRcdFx0XHRcdGxvY2FsZTogU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKSxcblx0XHRcdFx0XHRcdFx0d2lkZ2V0UG9zaXRpb25pbmc6e1xuXHRcdFx0XHRcdFx0XHRcdGhvcml6b250YWw6ICdyaWdodCdcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b3B0aW9uYWw6IGZhbHNlLFxuXHRcdFx0XHRcdHR5cGU6IERhdGVcblx0XHRcdFx0fVxuXHRcdFx0fSlcblxuXHRmaW5pc2hEYXRlVmFsdWVzOiAoKSAtPlxuXHRcdHJldHVybiB7XG5cdFx0XHRmaW5pc2hfZGF0ZTp0aGlzLmZpbmlzaF9kYXRlXG5cdFx0fTtcblxuXHQjIyNcbiAgICBcdOatpOWHveaVsOeUqOS6juaOp+WItuaYr+WQpuaYvuekunRyYWNlcyB2aWV3XG4gICAgXHR0cnVlOiDmmL7npLp0cmFjZXMgdmlldyznrb7moLjljobnqIvmjInpkq7ngrnlh7vlkI7mmK/nm7TmjqXlrprkvY3liLB0cmFjZXMgdmlld1xuICAgIFx0ZmFsc2U6IOS4jeaYvuekunRyYWNlcyB2aWV377yM562+5qC45Y6G56iL5oyJ6ZKu54K55Ye75ZCOLOS7pU1vZGFsIOaWueW8j+aYvuekunRyYWNlcyB2aWV3XG5cdCMjI1xuXHRzaG93VHJhY2VzVmlldzogKGZvcm0sIGZvcm1fdmVyc2lvbiktPlxuI1x0XHRyZXR1cm4gIShJbnN0YW5jZU1hbmFnZXIuaXNUYWJsZVN0eWxlKGZvcm0pICYmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5jbHVkZXNPcGluaW9uRmllbGQoZm9ybSwgZm9ybV92ZXJzaW9uKSlcblxuXHRcdHNob3dfbW9kYWxfdHJhY2VzX2xpc3QgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHtzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLCBrZXk6IFwic2hvd19tb2RhbF90cmFjZXNfbGlzdFwifSk/LnZhbHVlcyB8fCBmYWxzZVxuXG5cdFx0cmV0dXJuICFzaG93X21vZGFsX3RyYWNlc19saXN0XG5cblx0Z2V0SW5zdGFuY2VTdGF0ZVRleHQ6IChpbnN0YW5jZV9pZCktPlxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdFx0aWYgbG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRlbHNlXG5cdFx0XHRsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpXG5cblx0XHRpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZV9pZH0sIHtmaWVsZHM6IHtzdGF0ZTogMSwgaXNfcmVhZDogMX19KVxuXHRcdGlmIG5vdCBpbnNcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKCdpbnN0YW5jZV9kZWxldGVkJywge30sIGxvY2FsZSlcblxuXHRcdHRleHQgPSAnJ1xuXHRcdGlmIGlucy5zdGF0ZSBpcyAnY29tcGxldGVkJ1xuXHRcdFx0dGV4dCA9IFRBUGkxOG4uX18oJ2NvbXBsZXRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0ZWxzZSBpZiBpbnMuc3RhdGUgaXMgJ3BlbmRpbmcnXG5cdFx0XHR0ZXh0ID0gVEFQaTE4bi5fXygncGVuZGluZycsIHt9LCBsb2NhbGUpXG5cdFx0ZWxzZSBpZiBpbnMuc3RhdGUgaXMgJ2RyYWZ0J1xuXHRcdFx0aWYgaW5zLmlzX3JlYWRcblx0XHRcdFx0dGV4dCA9IFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfcmVhZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX25vdF95ZXRfaGFuZGxlZCcsIHt9LCBsb2NhbGUpXG5cblx0XHRyZXR1cm4gdGV4dFxuXG5cdGdldEluc3RhbmNlU3RhdGVDb2xvcjogKGluc3RhbmNlX2lkKS0+XG5cdFx0aW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VfaWR9LCB7ZmllbGRzOiB7c3RhdGU6IDEsIGlzX3JlYWQ6IDF9fSlcblx0XHRpZiBub3QgaW5zXG5cdFx0XHRyZXR1cm4gXCJcIlxuXG5cdFx0Y2xhID0gJydcblx0XHRpZiBpbnMuc3RhdGUgaXMgJ2RyYWZ0J1xuXHRcdFx0aWYgaW5zLmlzX3JlYWRcblx0XHRcdFx0Y2xhID0gJ2JsdWUnXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNsYSA9ICdyZWQnXG5cdFx0cmV0dXJuIGNsYVxuXG5cdGZpcnN0VHJhY2U6IChpbmRleCktPlxuXHRcdHJldHVybiBpbmRleCBpcyAwXG5cblx0bGFzdF9kaXN0cmlidXRlX2Zyb206IChpbnN0YW5jZV9pZCktPlxuXHRcdGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlX2lkLCBkaXN0cmlidXRlX2Zyb21faW5zdGFuY2U6IHskZXhpc3RzOiB0cnVlfX0se2ZpZWxkczp7Y3JlYXRlZDogMSwgY3JlYXRlZF9ieTogMX19KVxuXHRcdGlmIGluc1xuXHRcdFx0ZGlzX2luZm8gPSB7fVxuXHRcdFx0dXNlciA9IHt9XG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0dXNlciA9IFVVZmxvd19hcGkuZ2V0TmFtZUZvclVzZXIoaW5zLmNyZWF0ZWRfYnkpXG5cdFx0XHRlbHNlIGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiBpbnMuY3JlYXRlZF9ieX0sIHtmaWVsZHM6IHtuYW1lOiAxfX0pXG5cblx0XHRcdGlmIHVzZXIubmFtZVxuXHRcdFx0XHRkaXNfaW5mby5mcm9tX3VzZXIgPSB1c2VyLl9pZFxuXHRcdFx0XHRkaXNfaW5mby5mcm9tX3VzZXJfbmFtZSA9IHVzZXIubmFtZVxuXHRcdFx0XHRkaXNfaW5mby5jcmVhdGVkID0gaW5zLmNyZWF0ZWRcblxuXHRcdFx0aWYgbm90IF8uaXNFbXB0eShkaXNfaW5mbylcblx0XHRcdFx0cmV0dXJuIGRpc19pbmZvXG5cdFx0cmV0dXJuXG5cblx0aXNDQ09yRGlzdHJpYnV0ZU9yRm9yd2FyZFRlcm1pbmF0ZWQ6IChhcHByb3ZlKS0+XG5cdFx0aWYgKGFwcHJvdmUudHlwZSBpcyAnY2MnIG9yIGFwcHJvdmUudHlwZSBpcyAnZGlzdHJpYnV0ZScgb3IgYXBwcm92ZS50eXBlIGlzICdmb3J3YXJkJykgYW5kIGFwcHJvdmUuanVkZ2UgaXMgJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdGp1ZGdlVGVybWluYXRlZDogKGp1ZGdlKS0+XG5cdFx0cmV0dXJuIGp1ZGdlIGlzICd0ZXJtaW5hdGVkJ1xuXG5cdGluc3RhbmNlRXhpc3RzOiAoaW5zdGFuY2VfaWQpLT5cblx0XHRyZXR1cm4gISFkYi5pbnN0YW5jZXMuZmluZChpbnN0YW5jZV9pZCkuY291bnQoKVxuXG5cdGFnZW50RGVzY3JpcHRpb246ICh1c2VyTmFtZSktPlxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdFx0aWYgbG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRlbHNlXG5cdFx0XHRsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpXG5cblx0XHRyZXR1cm4gVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge3VzZXJOYW1lOiB1c2VyTmFtZX0sIGxvY2FsZSlcblx0XG5cdHRyYWNlTmFtZTogKGluc3RhbmNlX2lkLCB0cmFjZUlkKS0+XG5cdFx0cmV0dXJuIF8uZmluZChkYi5pbnN0YW5jZXMuZmluZE9uZShpbnN0YW5jZV9pZCwge2ZpZWxkczoge3RyYWNlczogMX19KT8udHJhY2VzLCAodHJhY2UpLT5cblx0XHRcdFx0XHRyZXR1cm4gdHJhY2UuX2lkID09ICB0cmFjZUlkXG5cdFx0KT8ubmFtZVxuXG5cdG9iamVjdFVybDogKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCktPlxuXHRcdHJldHVybiBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpXG5cblx0aGFuZGxlckRvYzogKGhhbmRsZXJJZCktPlxuXHRcdHVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gPSBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy53b3JrZmxvdz8udXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mb1xuXHRcdGlmICF1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIG9yICF1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvLmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSlcblx0XHRcdHJldHVyblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0cmV0dXJuIFVVZmxvd19hcGkuZ2V0Q29udGFjdEluZm9Gb3JVc2VyKGhhbmRsZXJJZCwgU2Vzc2lvbi5nZXQoJ3NwYWNlSWQnKSlcblx0XHRlbHNlIGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0cmV0dXJuIGRiLnVzZXJzLmZpbmRPbmUoaGFuZGxlcklkKVxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0VHJhY2VzVGVtcGxhdGUuaGVscGVycy5kYXRlRm9ybWF0ID0gKGRhdGUpLT5cblx0XHRpZiBkYXRlXG5cdFx0XHR1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0XG5cdFx0XHRyZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdERhdGUoZGF0ZSwgdXRjT2Zmc2V0KTtcblxuXHRUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLl90ID0gKGtleSktPlxuXHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpXG5cblx0VHJhY2VzVGVtcGxhdGUuaGVscGVycy5zaG93RGVsZXRlQnV0dG9uID0gKGFwcHJvdmVkKSAtPlxuXHRcdHJldHVybiBmYWxzZTtcblxuVHJhY2VzVGVtcGxhdGUuZXZlbnRzID1cblx0J2NsaWNrIC5jYy1hcHByb3ZlLXJlbW92ZSc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcblx0XHRpZiBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyAqIDEgIT0gMVxuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgPSAxXG5cdFx0XHQkKFwiaVwiLGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKFwiZmEtc3BpblwiKVxuXHRcdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRcdGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmVcblx0XHRcdCMgQ0FMTCDliKDpmaRhcHByb3Zl5Ye95pWw44CCXG5cdFx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIilcblx0XHRcdE1ldGVvci5jYWxsICdjY19yZW1vdmUnLCBpbnN0YW5jZUlkLCBhcHByb3ZlSWQsIChlcnIsIHJlc3VsdCkgLT5cblx0XHRcdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRcdGlmIGVyclxuXHRcdFx0XHRcdHRvYXN0ci5lcnJvciBlcnJcblx0XHRcdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyA9IDBcblx0XHRcdFx0XHQkKFwiaVwiLGV2ZW50LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKFwiZmEtc3BpblwiKVxuXHRcdFx0XHRpZiByZXN1bHQgPT0gdHJ1ZVxuXHRcdFx0XHRcdHRvYXN0ci5zdWNjZXNzKFRBUGkxOG4uX18oXCJyZW1vdmVfY2NfYXBwcm92ZVwiKSk7XG5cdFx0XHRcdFx0aWYgJChcIi5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWxcIikubGVuZ3RoXG5cdFx0XHRcdFx0XHRNb2RhbC5oaWRlIFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCJcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRyZXR1cm5cblxuXHQnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWNjLWFwcHJvdmUtcmVtb3ZlJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHRpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKVxuXHRcdGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmVcblx0XHQjICMgQ0FMTCDliKDpmaRhcHByb3Zl5Ye95pWw44CCXG5cdFx0IyAkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIilcblx0XHQjIE1ldGVvci5jYWxsICdjY19yZW1vdmUnLCBpbnN0YW5jZUlkLCBhcHByb3ZlSWQsIChlcnIsIHJlc3VsdCkgLT5cblx0XHQjIFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0IyBcdGlmIGVyclxuXHRcdCMgXHRcdHRvYXN0ci5lcnJvciBlcnJcblx0XHQjIFx0aWYgcmVzdWx0ID09IHRydWVcblx0XHQjIFx0XHR0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwicmVtb3ZlX2NjX2FwcHJvdmVcIikpO1xuXHRcdCMgXHRcdE1vZGFsLmhpZGUgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIlxuXHRcdCMgXHRyZXR1cm5cblx0XHQjIHJldHVyblxuXHRcdE1vZGFsLmFsbG93TXVsdGlwbGUgPSB0cnVlXG5cdFx0TW9kYWwuc2hvdyAnY2FuY2VsX2NjX21vZGFsJ1xuXG5cdCdjbGljayAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIFBD5LiK6ZO+5o6l5YWB6K6455u05o6l54K55byA77yM5LiN5YaN5omT5byA562+5om55Y6G56iL6K+m57uGXG5cdFx0dW5sZXNzICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGhcblx0XHRcdE1vZGFsLnNob3cgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIiwgdGhpc1xuXG5cdCd0YXBob2xkIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMg5omL5py65LiK6ZW/5oyJ5omT5byA562+5om55Y6G56iL6K+m57uG77yM5aaC5p6c5piv6ZO+5o6l6ZW/5oyJ5omT5byA5ZCO5LiA5pS+5omL56qX5Y+j5bCx5Y+I5YWz5o6J5LqG77yM5omA5Lul5LiN6K6p6ZO+5o6l5omT5byA562+5om55Y6G56iL6K+m57uGXG5cdFx0dW5sZXNzICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGhcblx0XHRcdE1vZGFsLnNob3cgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIiwgdGhpc1xuXG5cdCdjbGljayAuYXBwcm92ZS1pdGVtIGEuYnRuLWxpbmssLmFwcHJvdmUtZGVzY3JpcHRpb24gYS5idG4tbGluaywuYXBwcm92ZS1pdGVtLWRpc3RyaWJ1dGUgYS5idG4tbGluayc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0IyDmiYvmnLrkuIrngrnlh7vpk77mjqXvvIzlvLnlh7rmlrDnqpflj6PvvIzkuI3mlK/mjIHvvIzlm6DkuLphbmRyb2lk5LiK5Lya5by55Ye655m75b2V55WM6Z2iXG5cdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHR1c2VySWQgPSBldmVudC50YXJnZXQuZGF0YXNldD8udGFyZ2V0X3VzZXJfaWRcblx0XHRcdENyZWF0b3Iub3BlblNhZmVPYmplY3RVcmwoJ3VzZXJzJywgdXNlcklkKVxuXG5cdCd0YXBlbmQgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0IyDkuIrov7Dplb/mjInmiZPlvIBhcHByb3Zl6K+m57uG56qX5Y+j55qE5LqL5Lu2dGFwaG9sZOS8muinpuWPkeaJk+W8gOeql+WPo+WQjueahHRvdWNoZW5k5LqL5Lu277yM6YCg5oiQ6ZW/5oyJ5omT5byA56qX5Y+j5ZCO5LiA5pS+5omL56qX5Y+j5bCx5Y+I5YWz5o6J5LqGXG5cdFx0IyDov5nph4zlj6rog73pgJrov4fpmLvmraJ0YXBlbmTkuovku7Yo5LiN5Y+v5Lul55SodG91Y2hlbmTkuovku7bvvIzlm6DkuLrkvJrlvbHlk410YXBob2xk5Yqf6IO977yM6YCg5oiQ5rKh5pyJ6ZW/5oyJ5pWI5p6c5pe25Lmf5Lya6Kem5Y+RdGFwaG9sZOS6i+S7tinlhpLms6HmnaXpgb/lhY3pl67popjjgIJcblx0XHQjIOmTvuaOpeWFgeiuuOebtOaOpeeCueW8gFxuXHRcdHVubGVzcyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0J2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1mb3J3YXJkLWFwcHJvdmUtcmVtb3ZlJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHRpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKVxuXHRcdGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmVcblx0XHR0cmFjZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudHJhY2Vcblx0XHQjIENBTEwg5Yig6ZmkYXBwcm92ZeWHveaVsOOAglxuXHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKVxuXHRcdE1ldGVvci5jYWxsICdmb3J3YXJkX3JlbW92ZScsIGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgKGVyciwgcmVzdWx0KSAtPlxuXHRcdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRpZiBlcnJcblx0XHRcdFx0dG9hc3RyLmVycm9yIFRBUGkxOG4uX18oZXJyLnJlYXNvbilcblx0XHRcdGlmIHJlc3VsdCA9PSB0cnVlXG5cdFx0XHRcdHRvYXN0ci5zdWNjZXNzKFRBUGkxOG4uX18oXCJpbnN0YW5jZV9hcHByb3ZlX2ZvcndhcmRfcmVtb3ZlX3N1Y2Nlc3NcIikpO1xuXHRcdFx0XHRNb2RhbC5oaWRlIFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCJcblx0XHRcdHJldHVyblxuXHRcdHJldHVyblxuXG5cdCdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZm9yd2FyZC1pbnN0YW5jZS1sb29rJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHRmb3J3YXJkX3NwYWNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuZm9yd2FyZHNwYWNlXG5cdFx0Zm9yd2FyZF9pbnN0YW5jZSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmZvcndhcmRpbnN0YW5jZVxuXHRcdFN0ZWVkb3Mub3BlbldpbmRvdyhTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBmb3J3YXJkX3NwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGZvcndhcmRfaW5zdGFuY2UpKVxuXG5cdCdjbGljayAuYnRuLW1vZGlmaWNhdGlvbidcdDogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHR0ZW1wbGF0ZS5pc19lZGl0aW5nLnNldCghdGVtcGxhdGUuaXNfZWRpdGluZy5nZXQoKSk7XG5cdFx0dW5sZXNzIFN0ZWVkb3MuaXNBbmRyb2lkT3JJT1MoKVxuXHRcdFx0VHJhY2tlci5hZnRlckZsdXNoIC0+XG5cdFx0XHRcdCMg5pi+56S65pel5b+X55qE5pe25YCZ5oqK5rua5Yqo5p2h5b6A5LiL56e754K577yM6K6p5pel5pyf5o6n5Lu25pi+56S65Ye65LiA6YOo5YiG77yM5Lul6YG/5YWN55So5oi355yL5LiN5Yiw5pel5pyf5o6n5Lu2XG5cdFx0XHRcdCQoXCIjaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsICNmaW5pc2hfaW5wdXRcIikub24gXCJkcC5zaG93XCIsICgpIC0+XG5cdFx0XHRcdFx0JChcIi5tb2RhbC1ib2R5XCIpLnNjcm9sbFRvcCgxMDApXG5cblx0J2NsaWNrIC5idG4tY2FuY2VsQnV0JyA6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cblx0XHR0ZW1wbGF0ZS5pc19lZGl0aW5nLnNldCghdGVtcGxhdGUuaXNfZWRpdGluZy5nZXQoKSk7XG5cblx0J2NsaWNrIC5idG4tc2F2ZUJ1dCcgOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMgdGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpXG5cblx0XHRpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKVxuXHRcdGFwcHJvdmVJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmFwcHJvdmVcblx0XHR0cmFjZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudHJhY2Vcblx0XHRvcGluaW9uX2lucHV0ID0gJCgnI29waW5pb25faW5wdXQnKS52YWwoKVxuXHRcdGZpbmlzaF9pbnB1dCA9IEF1dG9Gb3JtLmdldEZpZWxkVmFsdWUoXCJmaW5pc2hfZGF0ZVwiLCBcImZpbmlzaERhdGVBdXRvRm9ybVwiKVxuXG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0TWV0ZW9yLmNhbGwgJ2NoYW5nZV9hcHByb3ZlX2luZm8nLCBpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIG9waW5pb25faW5wdXQsIGZpbmlzaF9pbnB1dCwgKGVyciwgcmVzdWx0KS0+XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImxvYWRpbmdcIilcblx0XHRcdGlmIGVyclxuXHRcdFx0XHR0b2FzdHIuZXJyb3IgVEFQaTE4bi5fXyhlcnIucmVhc29uKVxuXHRcdFx0aWYgcmVzdWx0ID09IHRydWVcblx0XHRcdFx0dG9hc3RyLnN1Y2Nlc3ModChcImluc3RhbmNlX2FwcHJvdmVfbW9kYWxfbW9kaWZpY2F0aW9uc2F2ZVwiKSlcblx0XHRcdFx0TW9kYWwuaGlkZSBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiXG5cdFx0XHRyZXR1cm5cblxuXHQnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWRpc3RyaWJ1dGUtYXBwcm92ZS1yZW1vdmUnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdE1vZGFsLmFsbG93TXVsdGlwbGUgPSB0cnVlXG5cdFx0TW9kYWwuc2hvdyAnY2FuY2VsX2Rpc3RyaWJ1dGVfbW9kYWwnXG4iLCJ2YXIgbWFya2VkO1xuXG5tYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpO1xuXG5UcmFjZXNUZW1wbGF0ZS5oZWxwZXJzID0ge1xuICB0cmFjZVNob3dTaWduSW1hZ2U6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud29ya2Zsb3cudHJhY2VTaG93U2lnbkltYWdlICE9PSBmYWxzZSAmJiBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud29ya2Zsb3cudHJhY2VTaG93U2lnbkltYWdlICE9PSAnZmFsc2UnO1xuICB9LFxuICBlcXVhbHM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uKGEpIHtcbiAgICBpZiAoYSkge1xuICAgICAgcmV0dXJuIGEudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoIDwgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICB1bmVtcHR5OiBmdW5jdGlvbihhKSB7XG4gICAgaWYgKGEpIHtcbiAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGFwcGVuZDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBhICsgYjtcbiAgfSxcbiAgZGF0ZUZvcm1hdDogZnVuY3Rpb24oZGF0ZSkge1xuICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkgJiYgKGRhdGUgIT0gbnVsbCA/IGRhdGUuZ2V0RnVsbFllYXIoKSA6IHZvaWQgMCkgPT09IChuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSkge1xuICAgICAgcmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoJ01NLUREIEhIOm1tJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgfVxuICB9LFxuICBnZXRTdGVwTmFtZTogZnVuY3Rpb24oc3RlcElkKSB7XG4gICAgdmFyIHN0ZXA7XG4gICAgc3RlcCA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZVN0ZXAoc3RlcElkKTtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgcmV0dXJuIHN0ZXAubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHNob3dEZWxldGVCdXR0b246IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgaWYgKGFwcHJvdmVkICYmIGFwcHJvdmVkLnR5cGUgPT09ICdjYycgJiYgYXBwcm92ZWQuZnJvbV91c2VyID09PSBNZXRlb3IudXNlcklkKCkgJiYgYXBwcm92ZWQuaXNfZmluaXNoZWQgIT09IHRydWUgJiYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgaXNTaG93TW9kaWZpY2F0aW9uQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIHZhciBhcHByb3ZlX2FkbWlucywgaXNTaG93LCByZWYsIHJlZjEsIHJlZjI7XG4gICAgYXBwcm92ZV9hZG1pbnMgPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzKSAhPSBudWxsID8gKHJlZjEgPSByZWZbXCJwdWJsaWNcIl0pICE9IG51bGwgPyAocmVmMiA9IHJlZjEud29ya2Zsb3cpICE9IG51bGwgPyByZWYyLmFwcHJvdmVfYWRtaW5zIDogdm9pZCAwIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIGlmIChhcHByb3ZlX2FkbWlucyAhPSBudWxsID8gYXBwcm92ZV9hZG1pbnMubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgICBpc1Nob3cgPSBhcHByb3ZlX2FkbWlucyAhPSBudWxsID8gYXBwcm92ZV9hZG1pbnMuY29udGFpbnMoTWV0ZW9yLnVzZXJJZCgpKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKCFpc1Nob3cpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVkLmhhbmRsZXIgPT09IE1ldGVvci51c2VySWQoKTtcbiAgfSxcbiAgaXNFZGl0aW5nOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVmO1xuICAgIHJldHVybiAocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKS5pc19lZGl0aW5nKSAhPSBudWxsID8gcmVmLmdldCgpIDogdm9pZCAwO1xuICB9LFxuICBpc1Nob3dEZXNjcmlwdGlvbjogZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICB2YXIgcmVmO1xuICAgIGlmIChUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLmlzU2hvd01vZGlmaWNhdGlvbkJ1dHRvbihhcHByb3ZlZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKChyZWYgPSBhcHByb3ZlZC5kZXNjcmlwdGlvbikgIT0gbnVsbCA/IHJlZi50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggOiB2b2lkIDApID4gMDtcbiAgfSxcbiAgaXNDQzogZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICBpZiAoYXBwcm92ZWQgJiYgYXBwcm92ZWQudHlwZSA9PT0gJ2NjJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZ2V0QXBwcm92ZVN0YXR1c0ljb246IGZ1bmN0aW9uKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkge1xuICAgIHZhciBhcHByb3ZlU3RhdHVzSWNvbjtcbiAgICBpZiAoYXV0b1N1Ym1pdHRlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuICdpb24gaW9uLWFuZHJvaWQtYWxhcm0tY2xvY2snO1xuICAgIH1cbiAgICBhcHByb3ZlU3RhdHVzSWNvbiA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKGFwcHJvdmVKdWRnZSkge1xuICAgICAgY2FzZSAnYXBwcm92ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWNoZWNrbWFyay1yb3VuZCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVqZWN0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWNsb3NlLXJvdW5kJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXJtaW5hdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnZmEgZmEtYmFuJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWFzc2lnbmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1hbmRyb2lkLWNvbnRhY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlbG9jYXRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tYXJyb3ctc2hyaW5rJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXRyaWV2ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdmYSBmYS11bmRvJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVTdGF0dXNJY29uO1xuICB9LFxuICBnZXRBcHByb3ZlU3RhdHVzVGV4dDogZnVuY3Rpb24oYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSB7XG4gICAgdmFyIGFwcHJvdmVTdGF0dXNUZXh0LCBsb2NhbGU7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICAgIGlmIChsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIik7XG4gICAgfVxuICAgIGlmIChhdXRvU3VibWl0dGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV90aW1lb3V0X2F1dG9fc3VibWl0dGVkJywge30sIGxvY2FsZSk7XG4gICAgfVxuICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gdm9pZCAwO1xuICAgIHN3aXRjaCAoYXBwcm92ZUp1ZGdlKSB7XG4gICAgICBjYXNlICdhcHByb3ZlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgYXBwcm92ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWplY3RlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVqZWN0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXJtaW5hdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSB0ZXJtaW5hdGVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVhc3NpZ25lZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVhc3NpZ25lZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlbG9jYXRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmVsb2NhdGVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmV0cmlldmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZXRyaWV2ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXR1cm5lZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmV0dXJuZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWFkZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlYWRlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gYXBwcm92ZVN0YXR1c1RleHQ7XG4gIH0sXG4gIGdldEFwcHJvdmVKdWRnZUNsYXNzOiBmdW5jdGlvbihhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIHtcbiAgICBpZiAoYXV0b1N1Ym1pdHRlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuICdhdXRvU3VibWl0dGVkJztcbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVKdWRnZTtcbiAgfSxcbiAgX3Q6IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBUQVBpMThuLl9fKGtleSk7XG4gIH0sXG4gIG15QXBwcm92ZURlc2NyaXB0aW9uOiBmdW5jdGlvbihhcHByb3ZlSWQpIHtcbiAgICB2YXIgbXlBcHByb3ZlLCByZWYsIHJlZjE7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgIG15QXBwcm92ZSA9IChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYubXlBcHByb3ZlKSAhPSBudWxsID8gcmVmMS5nZXQoKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKG15QXBwcm92ZSAmJiBteUFwcHJvdmUuaWQgPT09IGFwcHJvdmVJZCkge1xuICAgICAgICAgIGlmICghU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gKG15QXBwcm92ZSAhPSBudWxsID8gbXlBcHByb3ZlLmRlc2NyaXB0aW9uIDogdm9pZCAwKSB8fCBcIlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpc0ZvcndhcmQ6IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgaWYgKGFwcHJvdmVkICYmIGFwcHJvdmVkLnR5cGUgPT09ICdmb3J3YXJkJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2hvd0ZvcndhcmREZWxldGVCdXR0b246IGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICBpZiAoZGIuaW5zdGFuY2VzLmZpbmQoYXBwcm92ZS5mb3J3YXJkX2luc3RhbmNlKS5jb3VudCgpID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PT0gJ2ZvcndhcmQnICYmIGFwcHJvdmUuZnJvbV91c2VyID09PSBNZXRlb3IudXNlcklkKCkgJiYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSAmJiBhcHByb3ZlLmp1ZGdlICE9PSAndGVybWluYXRlZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIG1hcmtEb3duVG9IdG1sOiBmdW5jdGlvbihtYXJrRG93blN0cmluZykge1xuICAgIGlmIChtYXJrRG93blN0cmluZykge1xuICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICBtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSk7XG4gICAgfVxuICB9LFxuICBpc0Rpc3RyaWJ1dGU6IGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICBpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT09ICdkaXN0cmlidXRlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2hvd0Rpc3RyaWJ1dGVEZWxldGVCdXR0b246IGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICB2YXIgaW5zO1xuICAgIGlmIChkYi5pbnN0YW5jZXMuZmluZChhcHByb3ZlLmZvcndhcmRfaW5zdGFuY2UpLmNvdW50KCkgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFwcHJvdmUgJiYgYXBwcm92ZS50eXBlID09PSAnZGlzdHJpYnV0ZScgJiYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSAmJiBhcHByb3ZlLmp1ZGdlICE9PSAndGVybWluYXRlZCcpIHtcbiAgICAgIGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBhcHByb3ZlLmluc3RhbmNlXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGZsb3c6IDEsXG4gICAgICAgICAgc3BhY2U6IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoaW5zICYmIGlucy5mbG93ICYmIGlucy5zcGFjZSkge1xuICAgICAgICBpZiAoV29ya2Zsb3dNYW5hZ2VyLmhhc0Zsb3dBZG1pblBlcm1pc3Npb24oaW5zLmZsb3csIGlucy5zcGFjZSwgTWV0ZW9yLnVzZXJJZCgpKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXBwcm92ZS5mcm9tX3VzZXIgPT09IE1ldGVvci51c2VySWQoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBmaW5pc2hEYXRlU2NoZW1hOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoU3RlZWRvcy5pc0FuZHJvaWRPcklPUygpKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG4gICAgICAgIGZpbmlzaF9kYXRlOiB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IERhdGVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKHtcbiAgICAgICAgZmluaXNoX2RhdGU6IHtcbiAgICAgICAgICBhdXRvZm9ybToge1xuICAgICAgICAgICAgdHlwZTogXCJib290c3RyYXAtZGF0ZXRpbWVwaWNrZXJcIixcbiAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgICAgICAgZGF0ZVRpbWVQaWNrZXJPcHRpb25zOiB7XG4gICAgICAgICAgICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tXCIsXG4gICAgICAgICAgICAgIGlnbm9yZVJlYWRvbmx5OiB0cnVlLFxuICAgICAgICAgICAgICBsb2NhbGU6IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIiksXG4gICAgICAgICAgICAgIHdpZGdldFBvc2l0aW9uaW5nOiB7XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbDogJ3JpZ2h0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgICAgdHlwZTogRGF0ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGZpbmlzaERhdGVWYWx1ZXM6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmaW5pc2hfZGF0ZTogdGhpcy5maW5pc2hfZGF0ZVxuICAgIH07XG4gIH0sXG5cbiAgLypcbiAgICAgXHTmraTlh73mlbDnlKjkuo7mjqfliLbmmK/lkKbmmL7npLp0cmFjZXMgdmlld1xuICAgICBcdHRydWU6IOaYvuekunRyYWNlcyB2aWV3LOetvuaguOWOhueoi+aMiemSrueCueWHu+WQjuaYr+ebtOaOpeWumuS9jeWIsHRyYWNlcyB2aWV3XG4gICAgIFx0ZmFsc2U6IOS4jeaYvuekunRyYWNlcyB2aWV377yM562+5qC45Y6G56iL5oyJ6ZKu54K55Ye75ZCOLOS7pU1vZGFsIOaWueW8j+aYvuekunRyYWNlcyB2aWV3XG4gICAqL1xuICBzaG93VHJhY2VzVmlldzogZnVuY3Rpb24oZm9ybSwgZm9ybV92ZXJzaW9uKSB7XG4gICAgdmFyIHJlZiwgc2hvd19tb2RhbF90cmFjZXNfbGlzdDtcbiAgICBzaG93X21vZGFsX3RyYWNlc19saXN0ID0gKChyZWYgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBTZXNzaW9uLmdldChcInNwYWNlSWRcIiksXG4gICAgICBrZXk6IFwic2hvd19tb2RhbF90cmFjZXNfbGlzdFwiXG4gICAgfSkpICE9IG51bGwgPyByZWYudmFsdWVzIDogdm9pZCAwKSB8fCBmYWxzZTtcbiAgICByZXR1cm4gIXNob3dfbW9kYWxfdHJhY2VzX2xpc3Q7XG4gIH0sXG4gIGdldEluc3RhbmNlU3RhdGVUZXh0OiBmdW5jdGlvbihpbnN0YW5jZV9pZCkge1xuICAgIHZhciBpbnMsIGxvY2FsZSwgdGV4dDtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgICAgaWYgKGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSAnemgtY24nKSB7XG4gICAgICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKTtcbiAgICB9XG4gICAgaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnN0YW5jZV9pZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBzdGF0ZTogMSxcbiAgICAgICAgaXNfcmVhZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghaW5zKSB7XG4gICAgICByZXR1cm4gVEFQaTE4bi5fXygnaW5zdGFuY2VfZGVsZXRlZCcsIHt9LCBsb2NhbGUpO1xuICAgIH1cbiAgICB0ZXh0ID0gJyc7XG4gICAgaWYgKGlucy5zdGF0ZSA9PT0gJ2NvbXBsZXRlZCcpIHtcbiAgICAgIHRleHQgPSBUQVBpMThuLl9fKCdjb21wbGV0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICB9IGVsc2UgaWYgKGlucy5zdGF0ZSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICB0ZXh0ID0gVEFQaTE4bi5fXygncGVuZGluZycsIHt9LCBsb2NhbGUpO1xuICAgIH0gZWxzZSBpZiAoaW5zLnN0YXRlID09PSAnZHJhZnQnKSB7XG4gICAgICBpZiAoaW5zLmlzX3JlYWQpIHtcbiAgICAgICAgdGV4dCA9IFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfcmVhZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfbm90X3lldF9oYW5kbGVkJywge30sIGxvY2FsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9LFxuICBnZXRJbnN0YW5jZVN0YXRlQ29sb3I6IGZ1bmN0aW9uKGluc3RhbmNlX2lkKSB7XG4gICAgdmFyIGNsYSwgaW5zO1xuICAgIGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VfaWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgc3RhdGU6IDEsXG4gICAgICAgIGlzX3JlYWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWlucykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNsYSA9ICcnO1xuICAgIGlmIChpbnMuc3RhdGUgPT09ICdkcmFmdCcpIHtcbiAgICAgIGlmIChpbnMuaXNfcmVhZCkge1xuICAgICAgICBjbGEgPSAnYmx1ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGEgPSAncmVkJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYTtcbiAgfSxcbiAgZmlyc3RUcmFjZTogZnVuY3Rpb24oaW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXggPT09IDA7XG4gIH0sXG4gIGxhc3RfZGlzdHJpYnV0ZV9mcm9tOiBmdW5jdGlvbihpbnN0YW5jZV9pZCkge1xuICAgIHZhciBkaXNfaW5mbywgaW5zLCB1c2VyO1xuICAgIGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VfaWQsXG4gICAgICBkaXN0cmlidXRlX2Zyb21faW5zdGFuY2U6IHtcbiAgICAgICAgJGV4aXN0czogdHJ1ZVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBjcmVhdGVkOiAxLFxuICAgICAgICBjcmVhdGVkX2J5OiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlucykge1xuICAgICAgZGlzX2luZm8gPSB7fTtcbiAgICAgIHVzZXIgPSB7fTtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgdXNlciA9IFVVZmxvd19hcGkuZ2V0TmFtZUZvclVzZXIoaW5zLmNyZWF0ZWRfYnkpO1xuICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICAgIF9pZDogaW5zLmNyZWF0ZWRfYnlcbiAgICAgICAgfSwge1xuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodXNlci5uYW1lKSB7XG4gICAgICAgIGRpc19pbmZvLmZyb21fdXNlciA9IHVzZXIuX2lkO1xuICAgICAgICBkaXNfaW5mby5mcm9tX3VzZXJfbmFtZSA9IHVzZXIubmFtZTtcbiAgICAgICAgZGlzX2luZm8uY3JlYXRlZCA9IGlucy5jcmVhdGVkO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzRW1wdHkoZGlzX2luZm8pKSB7XG4gICAgICAgIHJldHVybiBkaXNfaW5mbztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGlzQ0NPckRpc3RyaWJ1dGVPckZvcndhcmRUZXJtaW5hdGVkOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKChhcHByb3ZlLnR5cGUgPT09ICdjYycgfHwgYXBwcm92ZS50eXBlID09PSAnZGlzdHJpYnV0ZScgfHwgYXBwcm92ZS50eXBlID09PSAnZm9yd2FyZCcpICYmIGFwcHJvdmUuanVkZ2UgPT09ICd0ZXJtaW5hdGVkJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAganVkZ2VUZXJtaW5hdGVkOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiBqdWRnZSA9PT0gJ3Rlcm1pbmF0ZWQnO1xuICB9LFxuICBpbnN0YW5jZUV4aXN0czogZnVuY3Rpb24oaW5zdGFuY2VfaWQpIHtcbiAgICByZXR1cm4gISFkYi5pbnN0YW5jZXMuZmluZChpbnN0YW5jZV9pZCkuY291bnQoKTtcbiAgfSxcbiAgYWdlbnREZXNjcmlwdGlvbjogZnVuY3Rpb24odXNlck5hbWUpIHtcbiAgICB2YXIgbG9jYWxlO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgICBpZiAobG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd6aC1jbicpIHtcbiAgICAgICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpO1xuICAgIH1cbiAgICByZXR1cm4gVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgdXNlck5hbWU6IHVzZXJOYW1lXG4gICAgfSwgbG9jYWxlKTtcbiAgfSxcbiAgdHJhY2VOYW1lOiBmdW5jdGlvbihpbnN0YW5jZV9pZCwgdHJhY2VJZCkge1xuICAgIHZhciByZWYsIHJlZjE7XG4gICAgcmV0dXJuIChyZWYgPSBfLmZpbmQoKHJlZjEgPSBkYi5pbnN0YW5jZXMuZmluZE9uZShpbnN0YW5jZV9pZCwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHRyYWNlczogMVxuICAgICAgfVxuICAgIH0pKSAhPSBudWxsID8gcmVmMS50cmFjZXMgOiB2b2lkIDAsIGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICByZXR1cm4gdHJhY2UuX2lkID09PSB0cmFjZUlkO1xuICAgIH0pKSAhPSBudWxsID8gcmVmLm5hbWUgOiB2b2lkIDA7XG4gIH0sXG4gIG9iamVjdFVybDogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCk7XG4gIH0sXG4gIGhhbmRsZXJEb2M6IGZ1bmN0aW9uKGhhbmRsZXJJZCkge1xuICAgIHZhciByZWYsIHJlZjEsIHVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm87XG4gICAgdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbyA9IChyZWYgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0pICE9IG51bGwgPyAocmVmMSA9IHJlZi53b3JrZmxvdykgIT0gbnVsbCA/IHJlZjEudXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICBpZiAoIXVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gfHwgIXVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8uaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gVVVmbG93X2FwaS5nZXRDb250YWN0SW5mb0ZvclVzZXIoaGFuZGxlcklkLCBTZXNzaW9uLmdldCgnc3BhY2VJZCcpKTtcbiAgICB9IGVsc2UgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgcmV0dXJuIGRiLnVzZXJzLmZpbmRPbmUoaGFuZGxlcklkKTtcbiAgICB9XG4gIH1cbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgVHJhY2VzVGVtcGxhdGUuaGVscGVycy5kYXRlRm9ybWF0ID0gZnVuY3Rpb24oZGF0ZSkge1xuICAgIHZhciB1dGNPZmZzZXQ7XG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIHV0Y09mZnNldCA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS51dGNPZmZzZXQ7XG4gICAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdERhdGUoZGF0ZSwgdXRjT2Zmc2V0KTtcbiAgICB9XG4gIH07XG4gIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuX3QgPSBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgbG9jYWxlO1xuICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKTtcbiAgfTtcbiAgVHJhY2VzVGVtcGxhdGUuaGVscGVycy5zaG93RGVsZXRlQnV0dG9uID0gZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cblRyYWNlc1RlbXBsYXRlLmV2ZW50cyA9IHtcbiAgJ2NsaWNrIC5jYy1hcHByb3ZlLXJlbW92ZSc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBhcHByb3ZlSWQsIGluc3RhbmNlSWQ7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nICogMSAhPT0gMSkge1xuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgPSAxO1xuICAgICAgJChcImlcIiwgZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJmYS1zcGluXCIpO1xuICAgICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgICBhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlO1xuICAgICAgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgICAgTWV0ZW9yLmNhbGwoJ2NjX3JlbW92ZScsIGluc3RhbmNlSWQsIGFwcHJvdmVJZCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgJChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdG9hc3RyLmVycm9yKGVycik7XG4gICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgPSAwO1xuICAgICAgICAgICQoXCJpXCIsIGV2ZW50LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKFwiZmEtc3BpblwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdG9hc3RyLnN1Y2Nlc3MoVEFQaTE4bi5fXyhcInJlbW92ZV9jY19hcHByb3ZlXCIpKTtcbiAgICAgICAgICBpZiAoJChcIi5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWxcIikubGVuZ3RoKSB7XG4gICAgICAgICAgICBNb2RhbC5oaWRlKFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWNjLWFwcHJvdmUtcmVtb3ZlJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIGFwcHJvdmVJZCwgaW5zdGFuY2VJZDtcbiAgICBpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKTtcbiAgICBhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlO1xuICAgIE1vZGFsLmFsbG93TXVsdGlwbGUgPSB0cnVlO1xuICAgIHJldHVybiBNb2RhbC5zaG93KCdjYW5jZWxfY2NfbW9kYWwnKTtcbiAgfSxcbiAgJ2NsaWNrIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICBpZiAoISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBNb2RhbC5zaG93KFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgJ3RhcGhvbGQgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIGlmICghJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIE1vZGFsLnNob3coXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIiwgdGhpcyk7XG4gICAgfVxuICB9LFxuICAnY2xpY2sgLmFwcHJvdmUtaXRlbSBhLmJ0bi1saW5rLC5hcHByb3ZlLWRlc2NyaXB0aW9uIGEuYnRuLWxpbmssLmFwcHJvdmUtaXRlbS1kaXN0cmlidXRlIGEuYnRuLWxpbmsnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgcmVmLCB1c2VySWQ7XG4gICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgdXNlcklkID0gKHJlZiA9IGV2ZW50LnRhcmdldC5kYXRhc2V0KSAhPSBudWxsID8gcmVmLnRhcmdldF91c2VyX2lkIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIENyZWF0b3Iub3BlblNhZmVPYmplY3RVcmwoJ3VzZXJzJywgdXNlcklkKTtcbiAgICB9XG4gIH0sXG4gICd0YXBlbmQgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIGlmICghJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1mb3J3YXJkLWFwcHJvdmUtcmVtb3ZlJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIGFwcHJvdmVJZCwgaW5zdGFuY2VJZCwgdHJhY2VJZDtcbiAgICBpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKTtcbiAgICBhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlO1xuICAgIHRyYWNlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC50cmFjZTtcbiAgICAkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgTWV0ZW9yLmNhbGwoJ2ZvcndhcmRfcmVtb3ZlJywgaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAgJChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0b2FzdHIuZXJyb3IoVEFQaTE4bi5fXyhlcnIucmVhc29uKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIHRvYXN0ci5zdWNjZXNzKFRBUGkxOG4uX18oXCJpbnN0YW5jZV9hcHByb3ZlX2ZvcndhcmRfcmVtb3ZlX3N1Y2Nlc3NcIikpO1xuICAgICAgICBNb2RhbC5oaWRlKFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICAnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWZvcndhcmQtaW5zdGFuY2UtbG9vayc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBmb3J3YXJkX2luc3RhbmNlLCBmb3J3YXJkX3NwYWNlO1xuICAgIGZvcndhcmRfc3BhY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5mb3J3YXJkc3BhY2U7XG4gICAgZm9yd2FyZF9pbnN0YW5jZSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmZvcndhcmRpbnN0YW5jZTtcbiAgICByZXR1cm4gU3RlZWRvcy5vcGVuV2luZG93KFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGZvcndhcmRfc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgZm9yd2FyZF9pbnN0YW5jZSkpO1xuICB9LFxuICAnY2xpY2sgLmJ0bi1tb2RpZmljYXRpb24nOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB0ZW1wbGF0ZS5pc19lZGl0aW5nLnNldCghdGVtcGxhdGUuaXNfZWRpdGluZy5nZXQoKSk7XG4gICAgaWYgKCFTdGVlZG9zLmlzQW5kcm9pZE9ySU9TKCkpIHtcbiAgICAgIHJldHVybiBUcmFja2VyLmFmdGVyRmx1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAkKFwiI2luc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbCAjZmluaXNoX2lucHV0XCIpLm9uKFwiZHAuc2hvd1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gJChcIi5tb2RhbC1ib2R5XCIpLnNjcm9sbFRvcCgxMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgJ2NsaWNrIC5idG4tY2FuY2VsQnV0JzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmlzX2VkaXRpbmcuc2V0KCF0ZW1wbGF0ZS5pc19lZGl0aW5nLmdldCgpKTtcbiAgfSxcbiAgJ2NsaWNrIC5idG4tc2F2ZUJ1dCc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBhcHByb3ZlSWQsIGZpbmlzaF9pbnB1dCwgaW5zdGFuY2VJZCwgb3Bpbmlvbl9pbnB1dCwgdHJhY2VJZDtcbiAgICBpbnN0YW5jZUlkID0gU2Vzc2lvbi5nZXQoJ2luc3RhbmNlSWQnKTtcbiAgICBhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlO1xuICAgIHRyYWNlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC50cmFjZTtcbiAgICBvcGluaW9uX2lucHV0ID0gJCgnI29waW5pb25faW5wdXQnKS52YWwoKTtcbiAgICBmaW5pc2hfaW5wdXQgPSBBdXRvRm9ybS5nZXRGaWVsZFZhbHVlKFwiZmluaXNoX2RhdGVcIiwgXCJmaW5pc2hEYXRlQXV0b0Zvcm1cIik7XG4gICAgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgIHJldHVybiBNZXRlb3IuY2FsbCgnY2hhbmdlX2FwcHJvdmVfaW5mbycsIGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgb3Bpbmlvbl9pbnB1dCwgZmluaXNoX2lucHV0LCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAgJChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0b2FzdHIuZXJyb3IoVEFQaTE4bi5fXyhlcnIucmVhc29uKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIHRvYXN0ci5zdWNjZXNzKHQoXCJpbnN0YW5jZV9hcHByb3ZlX21vZGFsX21vZGlmaWNhdGlvbnNhdmVcIikpO1xuICAgICAgICBNb2RhbC5oaWRlKFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICAnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWRpc3RyaWJ1dGUtYXBwcm92ZS1yZW1vdmUnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICBNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZTtcbiAgICByZXR1cm4gTW9kYWwuc2hvdygnY2FuY2VsX2Rpc3RyaWJ1dGVfbW9kYWwnKTtcbiAgfVxufTtcbiIsIlJlbGF0ZWRJbnN0YW5jZXMuaGVscGVycyA9XG5cdHNob3dSZWxhdGVkSW5zdGFjZXM6IC0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRlbHNlXG5cdFx0XHRpbnMgPSB0aGlzLmluc3RhbmNlXG5cdFx0aWYgaW5zPy5yZWxhdGVkX2luc3RhbmNlcyAmJiBfLmlzQXJyYXkoaW5zPy5yZWxhdGVkX2luc3RhbmNlcylcblx0XHRcdGlmIGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IHskaW46IGlucy5yZWxhdGVkX2luc3RhbmNlc319LCB7ZmllbGRzOiB7c3BhY2U6IDEsIG5hbWU6IDF9fSkuY291bnQoKSA+IDBcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdHJlbGF0ZWRfaW5zdGFjZXM6IC0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRlbHNlXG5cdFx0XHRpbnMgPSB0aGlzLmluc3RhbmNlXG5cdFx0aWYgaW5zPy5yZWxhdGVkX2luc3RhbmNlcyAmJiBfLmlzQXJyYXkoaW5zPy5yZWxhdGVkX2luc3RhbmNlcylcblx0XHRcdHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluOiBpbnMucmVsYXRlZF9pbnN0YW5jZXN9fSwge2ZpZWxkczoge3NwYWNlOiAxLCBuYW1lOiAxfX0pLmZldGNoKClcblxuXHRyZWxhdGVkX2luc3RhY2VfdXJsOiAoaW5zKSAtPlxuXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSlcblx0XHRcdHJldHVybiAnJ1xuXG5cdFx0YWJzb2x1dGUgPSBmYWxzZVxuXG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGVcblx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0cmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiK2lucy5zcGFjZStcIi92aWV3L3JlYWRvbmx5L1wiICsgaW5zLl9pZCArICc/aGlkZV90cmFjZXM9MCcpXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIitpbnMuc3BhY2UrXCIvdmlldy9yZWFkb25seS9cIiArIGlucy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKVxuXG5cdF90OiAoa2V5KS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpXG5cdFx0ZWxzZVxuXHRcdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKVxuXG5cdHNob3dfZGVsZXRlOiAoKS0+XG5cdFx0aWYgIU1ldGVvci5pc0NsaWVudFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gXCJkcmFmdFwiIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0Y3VycmVudF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKClcblx0XHRcdFx0aWYgY3VycmVudF9zdGVwXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB0cnVlIHx8IGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlIiwiUmVsYXRlZEluc3RhbmNlcy5oZWxwZXJzID0ge1xuICBzaG93UmVsYXRlZEluc3RhY2VzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5zO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnMgPSB0aGlzLmluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAoKGlucyAhPSBudWxsID8gaW5zLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwKSAmJiBfLmlzQXJyYXkoaW5zICE9IG51bGwgPyBpbnMucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDApKSB7XG4gICAgICBpZiAoZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IGlucy5yZWxhdGVkX2luc3RhbmNlc1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgfVxuICAgICAgfSkuY291bnQoKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIHJlbGF0ZWRfaW5zdGFjZXM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnM7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucyA9IHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICgoaW5zICE9IG51bGwgPyBpbnMucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDApICYmIF8uaXNBcnJheShpbnMgIT0gbnVsbCA/IGlucy5yZWxhdGVkX2luc3RhbmNlcyA6IHZvaWQgMCkpIHtcbiAgICAgIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogaW5zLnJlbGF0ZWRfaW5zdGFuY2VzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgbmFtZTogMVxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgfSxcbiAgcmVsYXRlZF9pbnN0YWNlX3VybDogZnVuY3Rpb24oaW5zKSB7XG4gICAgdmFyIGFic29sdXRlO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBhYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZTtcbiAgICB9XG4gICAgaWYgKGFic29sdXRlKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBpbnMuc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgaW5zLl9pZCArICc/aGlkZV90cmFjZXM9MCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgaW5zLnNwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGlucy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKTtcbiAgICB9XG4gIH0sXG4gIF90OiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgbG9jYWxlO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHJldHVybiBUQVBpMThuLl9fKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpO1xuICAgIH1cbiAgfSxcbiAgc2hvd19kZWxldGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjdXJyZW50X3N0ZXA7XG4gICAgaWYgKCFNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSBcImRyYWZ0XCIgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgY3VycmVudF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgICAgIGlmIChjdXJyZW50X3N0ZXApIHtcbiAgICAgICAgICBpZiAoY3VycmVudF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoIHx8IGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09PSB0cnVlIHx8IGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiIsIlJlbGF0ZWRSZWNvcmRzLmhlbHBlcnMgPVxuXHRzaG93UmVsYXRlZFJlY29yZHM6ICgpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGVsc2Vcblx0XHRcdGlucyA9IHRoaXMuaW5zdGFuY2Vcblx0XHRpZiAhaW5zXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRyZXR1cm4gIV8uaXNFbXB0eShpbnMucmVjb3JkX2lkcylcblx0cmVsYXRlZFJlY29yZFVybDogKCktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpXG5cdFx0XHRyZXR1cm4gJydcblxuXHRcdGFic29sdXRlID0gZmFsc2Vcblx0XHRcblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGlucyA9IHRoaXMuaW5zdGFuY2Vcblx0XHRcdGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZVxuXHRcdGVsc2Vcblx0XHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcblx0XHRvYmpjZXROYW1lID0gaW5zLnJlY29yZF9pZHNbMF0ub1xuXHRcdGlkID0gaW5zLnJlY29yZF9pZHNbMF0uaWRzWzBdXG5cblx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0cmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcImFwcC8tLyN7b2JqY2V0TmFtZX0vdmlldy8je2lkfVwiKVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiYXBwLy0vI3tvYmpjZXROYW1lfS92aWV3LyN7aWR9XCIpIiwiUmVsYXRlZFJlY29yZHMuaGVscGVycyA9IHtcbiAgc2hvd1JlbGF0ZWRSZWNvcmRzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5zO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnMgPSB0aGlzLmluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAoIWlucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIV8uaXNFbXB0eShpbnMucmVjb3JkX2lkcyk7XG4gIH0sXG4gIHJlbGF0ZWRSZWNvcmRVcmw6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhYnNvbHV0ZSwgaWQsIGlucywgb2JqY2V0TmFtZTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBpbnMgPSB0aGlzLmluc3RhbmNlO1xuICAgICAgYWJzb2x1dGUgPSB0aGlzLmFic29sdXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG4gICAgb2JqY2V0TmFtZSA9IGlucy5yZWNvcmRfaWRzWzBdLm87XG4gICAgaWQgPSBpbnMucmVjb3JkX2lkc1swXS5pZHNbMF07XG4gICAgaWYgKGFic29sdXRlKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBwLy0vXCIgKyBvYmpjZXROYW1lICsgXCIvdmlldy9cIiArIGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJhcHAvLS9cIiArIG9iamNldE5hbWUgKyBcIi92aWV3L1wiICsgaWQpO1xuICAgIH1cbiAgfVxufTtcbiIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDE1OjI5OjIyXG4gKiBARGVzY3JpcHRpb246IFxuICovXG4vLyBKc29uUm91dGVzLmFkZChcInBvc3RcIiwgXCIvYXBpL3dvcmtmbG93L2dldFNwYWNlVXNlcnNcIiwgZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4vLyAgIHZhclxuLy8gICAgIHVzZXJJZHMgPSByZXEuYm9keS51c2VySWRzLFxuLy8gICAgIHNwYWNlSWQgPSByZXEucXVlcnkuc3BhY2VJZCxcbi8vICAgICBzcGFjZVVzZXJzID0gW11cbi8vICAgO1xuXG4vLyAgIGlmICghdXNlcklkcyB8fCAhc3BhY2VJZCkge1xuLy8gICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vICAgICAgIGNvZGU6IDIwMCxcbi8vICAgICAgIGRhdGE6IHtcbi8vICAgICAgICAgJ2Vycm9ycyc6ICfnvLrlsJHlj4LmlbAnXG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgIH1cblxuLy8gICBzcGFjZVVzZXJzID0gV29ya2Zsb3dNYW5hZ2VyLmdldFVzZXJzKHNwYWNlSWQsIHVzZXJJZHMpO1xuXG4vLyAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vICAgICBjb2RlOiAyMDAsXG4vLyAgICAgZGF0YToge1xuLy8gICAgICAgJ3NwYWNlVXNlcnMnOiBzcGFjZVVzZXJzXG4vLyAgICAgfVxuLy8gICB9KTtcbi8vIH0pXG5cblxuICBcbiAgIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIxLTA1LTI0IDEyOjMyOjU2XG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMjQgMTU6MjM6MTRcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbi8vIEpzb25Sb3V0ZXMuYWRkKFwicG9zdFwiLCBcIi9hcGkvd29ya2Zsb3cvZ2V0Rm9ybXVsYVVzZXJPYmplY3RzXCIsIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuLy8gICB2YXJcbi8vICAgICB1c2VySWRzID0gcmVxLmJvZHkudXNlcklkcyxcbi8vICAgICBzcGFjZUlkID0gcmVxLnF1ZXJ5LnNwYWNlSWQsXG4vLyAgICAgc3BhY2VVc2VycyA9IFtdXG4vLyAgIDtcblxuLy8gICBpZiAoIXVzZXJJZHMgfHwgIXNwYWNlSWQpIHtcbi8vICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgICBjb2RlOiAyMDAsXG4vLyAgICAgICBkYXRhOiB7XG4vLyAgICAgICAgICdlcnJvcnMnOiAn57y65bCR5Y+C5pWwJ1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9XG5cbi8vICAgdmFyIHVzZXJzID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm11bGFVc2VyT2JqZWN0KHNwYWNlSWQsIHVzZXJJZHMpO1xuXG4vLyAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vICAgICBjb2RlOiAyMDAsXG4vLyAgICAgZGF0YToge1xuLy8gICAgICAgJ3NwYWNlVXNlcnMnOiB1c2Vyc1xuLy8gICAgIH1cbi8vICAgfSk7XG4vLyB9KVxuXG5cbiAgXG4gICIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDE1OjM4OjU0XG4gKiBARGVzY3JpcHRpb246IFxuICovXG4vLyBKc29uUm91dGVzLmFkZChcInBvc3RcIiwgXCIvYXBpL3dvcmtmbG93L2luaXRfZm9ybXVsYV92YWx1ZXNcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbi8vIFx0dmFyXG4vLyBcdFx0ZmllbGRzID0gcmVxLmJvZHkuZmllbGRzLFxuLy8gXHRcdGF1dG9Gb3JtRG9jID0gcmVxLmJvZHkuYXV0b0Zvcm1Eb2MsXG4vLyBcdFx0YXBwcm92ZXIgPSByZXEuYm9keS5hcHByb3Zlcixcbi8vIFx0XHRhcHBsaWNhbnQgPSByZXEuYm9keS5hcHBsaWNhbnQsXG5cbi8vIFx0XHRzcGFjZUlkID0gcmVxLnF1ZXJ5LnNwYWNlSWQsXG5cbi8vIFx0XHRzcGFjZVVzZXJzID0gW107XG5cbi8vIFx0aWYgKCFmaWVsZHMgfHwgIXNwYWNlSWQgfHwgIWF1dG9Gb3JtRG9jIHx8ICFhcHByb3ZlciB8fCAhYXBwbGljYW50KSB7XG4vLyBcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gXHRcdFx0Y29kZTogMjAwLFxuLy8gXHRcdFx0ZGF0YToge1xuLy8gXHRcdFx0XHQnZXJyb3JzJzogJ+e8uuWwkeWPguaVsCdcbi8vIFx0XHRcdH1cbi8vIFx0XHR9KTtcbi8vIFx0XHRyZXR1cm47XG4vLyBcdH1cblxuLy8gXHRmb3JtdWxhX3ZhbHVlcyA9IEZvcm1fZm9ybXVsYS5pbml0X2Zvcm11bGFfdmFsdWVzKGZpZWxkcywgYXV0b0Zvcm1Eb2MsIGFwcHJvdmVyLCBhcHBsaWNhbnQsIHNwYWNlSWQpO1xuXG4vLyBcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRjb2RlOiAyMDAsXG4vLyBcdFx0ZGF0YToge1xuLy8gXHRcdFx0J2Zvcm11bGFfdmFsdWVzJzogZm9ybXVsYV92YWx1ZXNcbi8vIFx0XHR9XG4vLyBcdH0pO1xuLy8gfSlcbiIsIi8vIEpzb25Sb3V0ZXMuYWRkKCdwb3N0JywgJy9hcGkvd29ya2Zsb3cvZm9yd2FyZCcsIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuLy8gXHR0cnkge1xuLy8gXHRcdHZhciBjdXJyZW50X3VzZXJfaW5mbyA9IHV1Zmxvd01hbmFnZXIuY2hlY2tfYXV0aG9yaXphdGlvbihyZXEpO1xuLy8gXHRcdHZhciBjdXJyZW50X3VzZXJfaWQgPSBjdXJyZW50X3VzZXJfaW5mby5faWQ7XG5cbi8vIFx0XHR2YXIgaGFzaERhdGEgPSByZXEuYm9keTtcbi8vIFx0XHR2YXIgaW5zdGFuY2VfaWQgPSBoYXNoRGF0YS5pbnN0YW5jZV9pZDtcbi8vIFx0XHR2YXIgc3BhY2VfaWQgPSBoYXNoRGF0YS5zcGFjZV9pZDtcbi8vIFx0XHR2YXIgZmxvd19pZCA9IGhhc2hEYXRhLmZsb3dfaWQ7XG4vLyBcdFx0dmFyIGhhc1NhdmVJbnN0YW5jZVRvQXR0YWNobWVudCA9IGhhc2hEYXRhLmhhc1NhdmVJbnN0YW5jZVRvQXR0YWNobWVudDtcbi8vIFx0XHR2YXIgZGVzY3JpcHRpb24gPSBoYXNoRGF0YS5kZXNjcmlwdGlvbjtcbi8vIFx0XHR2YXIgaXNGb3J3YXJkQXR0YWNobWVudHMgPSBoYXNoRGF0YS5pc0ZvcndhcmRBdHRhY2htZW50cztcbi8vIFx0XHR2YXIgc2VsZWN0ZWRVc2VycyA9IGhhc2hEYXRhLnNlbGVjdGVkVXNlcnM7XG4vLyBcdFx0dmFyIGFjdGlvbl90eXBlID0gaGFzaERhdGEuYWN0aW9uX3R5cGU7XG4vLyBcdFx0dmFyIHJlbGF0ZWQgPSBoYXNoRGF0YS5yZWxhdGVkO1xuLy8gXHRcdHZhciBmcm9tX2FwcHJvdmVfaWQgPSBoYXNoRGF0YS5mcm9tX2FwcHJvdmVfaWQ7XG5cbi8vIFx0XHRjaGVjayhpbnN0YW5jZV9pZCwgU3RyaW5nKTtcbi8vIFx0XHRjaGVjayhzcGFjZV9pZCwgU3RyaW5nKTtcbi8vIFx0XHRjaGVjayhmbG93X2lkLCBTdHJpbmcpO1xuLy8gXHRcdGNoZWNrKGhhc1NhdmVJbnN0YW5jZVRvQXR0YWNobWVudCwgQm9vbGVhbik7XG4vLyBcdFx0Y2hlY2soZGVzY3JpcHRpb24sIFN0cmluZyk7XG4vLyBcdFx0Y2hlY2soaXNGb3J3YXJkQXR0YWNobWVudHMsIEJvb2xlYW4pO1xuLy8gXHRcdGNoZWNrKHNlbGVjdGVkVXNlcnMsIEFycmF5KTtcbi8vIFx0XHRjaGVjayhhY3Rpb25fdHlwZSwgTWF0Y2guT25lT2YoJ2ZvcndhcmQnLCAnZGlzdHJpYnV0ZScpKTtcblxuLy8gXHRcdGlmIChhY3Rpb25fdHlwZSA9PSBcImRpc3RyaWJ1dGVcIilcbi8vIFx0XHRcdGNoZWNrKGZyb21fYXBwcm92ZV9pZCwgU3RyaW5nKTtcblxuLy8gXHRcdHZhciBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZShpbnN0YW5jZV9pZCk7XG4vLyBcdFx0dmFyIG9sZF9zcGFjZV9pZCA9IGlucy5zcGFjZTtcblxuLy8gXHRcdHZhciBmbG93ID0gZGIuZmxvd3MuZmluZE9uZShmbG93X2lkKTtcblxuLy8gXHRcdHZhciBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlX2lkKTtcblxuLy8gXHRcdGlmICghaW5zIHx8ICFmbG93IHx8ICFzcGFjZSkge1xuLy8gXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcigncGFyYW1zIGVycm9yIScsICdyZWNvcmQgbm90IGV4aXN0cyEnKTtcbi8vIFx0XHR9XG5cbi8vIFx0XHR2YXIgZm9yd2FyZF91c2VycyA9IG5ldyBBcnJheTtcbi8vIFx0XHRpZiAoXy5pc0VtcHR5KHNlbGVjdGVkVXNlcnMpKSB7XG4vLyBcdFx0XHRmb3J3YXJkX3VzZXJzID0gW2N1cnJlbnRfdXNlcl9pZF07XG4vLyBcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdGZvcndhcmRfdXNlcnMgPSBzZWxlY3RlZFVzZXJzO1xuLy8gXHRcdH1cblxuLy8gXHRcdC8vIOagoemqjOWIhuWPkeWvueixoeaYr+WQpuacieWIhuWPkea1geeoi+eahOaPkOS6pOadg+mZkFxuLy8gXHRcdHZhciBub19wZXJtaXNzaW9uX3VzZXJfaWRzID0gbmV3IEFycmF5KCk7XG4vLyBcdFx0Xy5lYWNoKGZvcndhcmRfdXNlcnMsIGZ1bmN0aW9uICh1aWQpIHtcbi8vIFx0XHRcdHZhciBwZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25NYW5hZ2VyLmdldEZsb3dQZXJtaXNzaW9ucyhmbG93X2lkLCB1aWQpO1xuLy8gXHRcdFx0aWYgKCFwZXJtaXNzaW9ucy5pbmNsdWRlcyhcImFkZFwiKSkge1xuLy8gXHRcdFx0XHQvLyB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcIuivpeeUs+ivt+S6uuayoeacieaPkOS6pOatpOeUs+ivt+WNleeahOadg+mZkOOAglwiKVxuLy8gXHRcdFx0XHRub19wZXJtaXNzaW9uX3VzZXJfaWRzLnB1c2godWlkKTtcbi8vIFx0XHRcdH1cbi8vIFx0XHR9KVxuLy8gXHRcdGlmICghXy5pc0VtcHR5KG5vX3Blcm1pc3Npb25fdXNlcl9pZHMpKSB7XG4vLyBcdFx0XHR2YXIgbm9fcGVybWlzc2lvbl91c2Vyc19uYW1lID0gbmV3IEFycmF5KCk7XG4vLyBcdFx0XHRkYi51c2Vycy5maW5kKHtcbi8vIFx0XHRcdFx0X2lkOiB7XG4vLyBcdFx0XHRcdFx0JGluOiBub19wZXJtaXNzaW9uX3VzZXJfaWRzXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0sIHtcbi8vIFx0XHRcdFx0ZmllbGRzOiB7XG4vLyBcdFx0XHRcdFx0bmFtZTogMVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KS5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7XG4vLyBcdFx0XHRcdG5vX3Blcm1pc3Npb25fdXNlcnNfbmFtZS5wdXNoKHUubmFtZSk7XG4vLyBcdFx0XHR9KTtcbi8vIFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ25vX3Blcm1pc3Npb24nLCBcIuivpeaPkOS6pOS6uuayoeacieaPkOS6pOatpOeUs+ivt+WNleeahOadg+mZkOOAglwiLCBub19wZXJtaXNzaW9uX3VzZXJzX25hbWUuam9pbignLCcpKVxuLy8gXHRcdH1cblxuLy8gXHRcdHZhciBuZXdfaW5zX2lkcyA9IG5ldyBBcnJheTtcblxuLy8gXHRcdHZhciBjdXJyZW50X3RyYWNlID0gbnVsbDtcbi8vIFx0XHRpZiAoYWN0aW9uX3R5cGUgPT0gXCJkaXN0cmlidXRlXCIpIHtcbi8vIFx0XHRcdF8uZWFjaChpbnMudHJhY2VzLCBmdW5jdGlvbiAodCkge1xuLy8gXHRcdFx0XHRpZiAoIWN1cnJlbnRfdHJhY2UpIHtcbi8vIFx0XHRcdFx0XHRfLmVhY2godC5hcHByb3ZlcywgZnVuY3Rpb24gKGEpIHtcbi8vIFx0XHRcdFx0XHRcdGlmICghY3VycmVudF90cmFjZSkge1xuLy8gXHRcdFx0XHRcdFx0XHRpZiAoYS5faWQgPT0gZnJvbV9hcHByb3ZlX2lkKVxuLy8gXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRfdHJhY2UgPSB0O1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pXG4vLyBcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdGN1cnJlbnRfdHJhY2UgPSBfLmxhc3QoaW5zLnRyYWNlcyk7XG4vLyBcdFx0fVxuLy8gXHRcdHZhciBjdXJyZW50X3RyYWNlX2lkID0gY3VycmVudF90cmFjZS5faWQ7XG4vLyBcdFx0dmFyIGZvcndhcmRfYXBwcm92ZXMgPSBbXTtcbi8vIFx0XHR2YXIgZnJvbV91c2VyX25hbWUgPSBkYi51c2Vycy5maW5kT25lKGN1cnJlbnRfdXNlcl9pZCwge1xuLy8gXHRcdFx0ZmllbGRzOiB7XG4vLyBcdFx0XHRcdG5hbWU6IDFcbi8vIFx0XHRcdH1cbi8vIFx0XHR9KS5uYW1lXG4vLyBcdFx0dmFyIHNldF9vYmogPSBuZXcgT2JqZWN0O1xuXG4vLyBcdFx0Ly8g6K6h566XdmFsdWVzXG4vLyBcdFx0dmFyIG9sZF92YWx1ZXMgPSBpbnMudmFsdWVzLFxuLy8gXHRcdFx0bmV3X3ZhbHVlcyA9IHt9O1xuLy8gXHRcdHZhciBmb3JtID0gZGIuZm9ybXMuZmluZE9uZShmbG93LmZvcm0pO1xuLy8gXHRcdHZhciBmaWVsZHMgPSBmb3JtLmN1cnJlbnQuZmllbGRzIHx8IFtdO1xuXG4vLyBcdFx0dmFyIG9sZF9mb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnMuZm9ybSk7XG4vLyBcdFx0dmFyIG9sZF9mb3JtX3ZlcnNpb24gPSBpbnMuZm9ybV92ZXJzaW9uLFxuLy8gXHRcdFx0b2xkX2ZpZWxkcyA9IFtdLFxuLy8gXHRcdFx0Y29tbW9uX2ZpZWxkcyA9IFtdO1xuXG4vLyBcdFx0dmFyIHNlbGVjdF90b19pbnB1dF9maWVsZHMgPSBbXTtcblxuLy8gXHRcdGlmIChvbGRfZm9ybS5jdXJyZW50Ll9pZCA9PSBvbGRfZm9ybV92ZXJzaW9uKSB7XG4vLyBcdFx0XHRvbGRfZmllbGRzID0gb2xkX2Zvcm0uY3VycmVudC5maWVsZHM7XG4vLyBcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdGlmIChvbGRfZm9ybS5oaXN0b3J5cykge1xuLy8gXHRcdFx0XHRvbGRfZm9ybS5oaXN0b3J5cy5mb3JFYWNoKGZ1bmN0aW9uIChoKSB7XG4vLyBcdFx0XHRcdFx0aWYgKGguX2lkID09IG9sZF9mb3JtX3ZlcnNpb24pXG4vLyBcdFx0XHRcdFx0XHRvbGRfZmllbGRzID0gaC5maWVsZHM7XG4vLyBcdFx0XHRcdH0pXG4vLyBcdFx0XHR9XG4vLyBcdFx0fVxuXG4vLyBcdFx0ZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4vLyBcdFx0XHR2YXIgZXhpc3RzX2ZpZWxkID0gXy5maW5kKG9sZF9maWVsZHMsIGZ1bmN0aW9uIChmKSB7XG4vLyBcdFx0XHRcdHJldHVybiBmLnR5cGUgPT0gZmllbGQudHlwZSAmJiBmLmNvZGUgPT0gZmllbGQuY29kZTtcbi8vIFx0XHRcdH0pXG4vLyBcdFx0XHRpZiAoZXhpc3RzX2ZpZWxkKVxuLy8gXHRcdFx0XHRjb21tb25fZmllbGRzLnB1c2goZmllbGQpO1xuLy8gXHRcdFx0dmFyIHNlbGVjdF9pbnB1dF9maWVsZCA9IF8uZmluZChvbGRfZmllbGRzLCBmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRyZXR1cm4gZi50eXBlID09ICdzZWxlY3QnICYmIGZpZWxkLnR5cGUgPT0gJ2lucHV0JyAmJiBmLmNvZGUgPT0gZmllbGQuY29kZTtcbi8vIFx0XHRcdH0pXG4vLyBcdFx0XHRpZiAoc2VsZWN0X2lucHV0X2ZpZWxkKVxuLy8gXHRcdFx0XHRzZWxlY3RfdG9faW5wdXRfZmllbGRzLnB1c2goc2VsZWN0X2lucHV0X2ZpZWxkKTtcbi8vIFx0XHR9KVxuXG4vLyBcdFx0c2VsZWN0X3RvX2lucHV0X2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuLy8gXHRcdFx0aWYgKG9sZF92YWx1ZXNbZmllbGQuY29kZV0pIHtcbi8vIFx0XHRcdFx0bmV3X3ZhbHVlc1tmaWVsZC5jb2RlXSA9IG9sZF92YWx1ZXNbZmllbGQuY29kZV07XG4vLyBcdFx0XHR9XG4vLyBcdFx0fSlcblxuLy8gXHRcdGNvbW1vbl9maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbi8vIFx0XHRcdGlmIChmaWVsZC50eXBlID09ICdzZWN0aW9uJykge1xuLy8gXHRcdFx0XHRpZiAoZmllbGQuZmllbGRzKSB7XG4vLyBcdFx0XHRcdFx0ZmllbGQuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0XHRcdC8vIOi3qOW3peS9nOWMuui9rOWPkeS4jeWkjeWItumAieS6uumAiee7hFxuLy8gXHRcdFx0XHRcdFx0aWYgKFsnZ3JvdXAnLCAndXNlciddLmluY2x1ZGVzKGYudHlwZSkgJiYgb2xkX3NwYWNlX2lkICE9IHNwYWNlX2lkKSB7XG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdHZhciBrZXkgPSBmLmNvZGU7XG4vLyBcdFx0XHRcdFx0XHR2YXIgb2xkX3YgPSBvbGRfdmFsdWVzW2tleV07XG4vLyBcdFx0XHRcdFx0XHRpZiAob2xkX3YpIHtcbi8vIFx0XHRcdFx0XHRcdFx0dmFyIGZpZWxkT3B0aW9ucyA9IGYub3B0aW9ucyAmJiBmLm9wdGlvbnMuc3BsaXQgJiYgZi5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihuKXtcbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIgaXRlbVNwbGl0cyA9IG4uc3BsaXQoXCI6XCIpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogaXRlbVNwbGl0c1swXSxcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cbi8vIFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0XHQvLyDmoKHpqowg5Y2V6YCJ77yM5aSa6YCJ77yM5LiL5ouJ5qGGIOWtl+auteWAvOaYr+WQpuWcqOaWsOihqOWNleWvueW6lOWtl+auteeahOWPr+mAieWAvOiMg+WbtOWGhVxuLy8gXHRcdFx0XHRcdFx0XHRpZiAoZi50eXBlID09ICdzZWxlY3QnIHx8IGYudHlwZSA9PSAncmFkaW8nKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0udmFsdWUgPT09IG9sZF92O1xuLy8gXHRcdFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0XHRcdGlmKCFzZWxlY3RlZE9wdGlvbil7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdFx0aWYgKGYudHlwZSA9PSAnbXVsdGlTZWxlY3QnKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIG9sZF9tdWx0aVNlbGVjdGVkID0gb2xkX3Yuc3BsaXQoJywnKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIgbmV3X211bHRpU2VsZWN0ZWQgPSBfLmludGVyc2VjdGlvbihmaWVsZE9wdGlvbnMubWFwKGZ1bmN0aW9uKG4peyByZXR1cm4gbi52YWx1ZTsgfSksIG9sZF9tdWx0aVNlbGVjdGVkKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRvbGRfdiA9IG5ld19tdWx0aVNlbGVjdGVkLmpvaW4oJywnKTtcbi8vIFx0XHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRcdG5ld192YWx1ZXNba2V5XSA9IG9sZF92O1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PSAndGFibGUnKSB7XG4vLyBcdFx0XHRcdGlmICghXy5pc0VtcHR5KG9sZF92YWx1ZXNbZmllbGQuY29kZV0pKSB7XG4vLyBcdFx0XHRcdFx0bmV3X3ZhbHVlc1tmaWVsZC5jb2RlXSA9IG5ldyBBcnJheTtcbi8vIFx0XHRcdFx0XHRvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdLmZvckVhY2goZnVuY3Rpb24gKG9sZF90YWJsZV9yb3dfdmFsdWVzKSB7XG4vLyBcdFx0XHRcdFx0XHR2YXIgbmV3X3RhYmxlX3Jvd192YWx1ZXMgPSB7fTtcblxuLy8gXHRcdFx0XHRcdFx0aWYgKCFfLmlzRW1wdHkoZmllbGQuZmllbGRzKSkge1xuLy8gXHRcdFx0XHRcdFx0XHRmaWVsZC5maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRcdFx0XHRcdC8vIOi3qOW3peS9nOWMuui9rOWPkeS4jeWkjeWItumAieS6uumAiee7hFxuLy8gXHRcdFx0XHRcdFx0XHRcdGlmIChbJ2dyb3VwJywgJ3VzZXInXS5pbmNsdWRlcyhmLnR5cGUpICYmIG9sZF9zcGFjZV9pZCAhPSBzcGFjZV9pZCkge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIga2V5ID0gZi5jb2RlO1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBvbGRfdiA9IG9sZF90YWJsZV9yb3dfdmFsdWVzW2tleV07XG4vLyBcdFx0XHRcdFx0XHRcdFx0aWYgKG9sZF92KSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR2YXIgZmllbGRPcHRpb25zID0gZi5vcHRpb25zICYmIGYub3B0aW9ucy5zcGxpdCAmJiBmLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pe1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgaXRlbVNwbGl0cyA9IG4uc3BsaXQoXCI6XCIpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHQvLyDmoKHpqowg5Y2V6YCJ77yM5aSa6YCJ77yM5LiL5ouJ5qGGIOWtl+auteWAvOaYr+WQpuWcqOaWsOihqOWNleWvueW6lOWtl+auteeahOWPr+mAieWAvOiMg+WbtOWGhVxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGYudHlwZSA9PSAnc2VsZWN0JyB8fCBmLnR5cGUgPT0gJ3JhZGlvJykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0udmFsdWUgPT09IG9sZF92O1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYoIXNlbGVjdGVkT3B0aW9uKXtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGYudHlwZSA9PSAnbXVsdGlTZWxlY3QnKSB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBvbGRfbXVsdGlTZWxlY3RlZCA9IG9sZF92LnNwbGl0KCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBuZXdfbXVsdGlTZWxlY3RlZCA9IF8uaW50ZXJzZWN0aW9uKGZpZWxkT3B0aW9ucy5tYXAoZnVuY3Rpb24obil7IHJldHVybiBuLnZhbHVlOyB9KSwgb2xkX211bHRpU2VsZWN0ZWQpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRvbGRfdiA9IG5ld19tdWx0aVNlbGVjdGVkLmpvaW4oJywnKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0XHRcdFx0bmV3X3RhYmxlX3Jvd192YWx1ZXNba2V5XSA9IG9sZF92O1xuLy8gXHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0aWYgKG9sZF90YWJsZV9yb3dfdmFsdWVzLl9pZCkge1xuLy8gXHRcdFx0XHRcdFx0XHRuZXdfdGFibGVfcm93X3ZhbHVlcy5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyO1xuLy8gXHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRpZiAoIV8uaXNFbXB0eShuZXdfdGFibGVfcm93X3ZhbHVlcykpIHtcbi8vIFx0XHRcdFx0XHRcdFx0bmV3X3ZhbHVlc1tmaWVsZC5jb2RlXS5wdXNoKG5ld190YWJsZV9yb3dfdmFsdWVzKTtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0XHQvLyDot6jlt6XkvZzljLrovazlj5HkuI3lpI3liLbpgInkurrpgInnu4Rcbi8vIFx0XHRcdFx0aWYgKFsnZ3JvdXAnLCAndXNlciddLmluY2x1ZGVzKGZpZWxkLnR5cGUpICYmIG9sZF9zcGFjZV9pZCAhPSBzcGFjZV9pZCkge1xuLy8gXHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0XHR2YXIga2V5ID0gZmllbGQuY29kZTtcbi8vIFx0XHRcdFx0dmFyIG9sZF92ID0gb2xkX3ZhbHVlc1trZXldO1xuLy8gXHRcdFx0XHRpZiAob2xkX3YpIHtcbi8vIFx0XHRcdFx0XHQvLyDmoKHpqowg5Y2V6YCJ77yM5aSa6YCJ77yM5LiL5ouJ5qGGIOWtl+auteWAvOaYr+WQpuWcqOaWsOihqOWNleWvueW6lOWtl+auteeahOWPr+mAieWAvOiMg+WbtOWGhVxuLy8gXHRcdFx0XHRcdHZhciBmaWVsZE9wdGlvbnMgPSBmaWVsZC5vcHRpb25zICYmIGZpZWxkLm9wdGlvbnMuc3BsaXQgJiYgZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obil7XG4vLyBcdFx0XHRcdFx0XHR2YXIgaXRlbVNwbGl0cyA9IG4uc3BsaXQoXCI6XCIpO1xuLy8gXHRcdFx0XHRcdFx0cmV0dXJuIHtcbi8vIFx0XHRcdFx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG4vLyBcdFx0XHRcdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRpZiAoZmllbGQudHlwZSA9PSAnc2VsZWN0JyB8fCBmaWVsZC50eXBlID09ICdyYWRpbycpIHtcbi8vIFx0XHRcdFx0XHRcdHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbi8vIFx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0udmFsdWUgPT09IG9sZF92O1xuLy8gXHRcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0XHRpZighc2VsZWN0ZWRPcHRpb24pe1xuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT0gJ211bHRpU2VsZWN0Jykge1xuLy8gXHRcdFx0XHRcdFx0dmFyIG9sZF9tdWx0aVNlbGVjdGVkID0gb2xkX3Yuc3BsaXQoJywnKTtcbi8vIFx0XHRcdFx0XHRcdHZhciBuZXdfbXVsdGlTZWxlY3RlZCA9IF8uaW50ZXJzZWN0aW9uKGZpZWxkT3B0aW9ucy5tYXAoZnVuY3Rpb24obil7IHJldHVybiBuLnZhbHVlOyB9KSwgb2xkX211bHRpU2VsZWN0ZWQpO1xuLy8gXHRcdFx0XHRcdFx0b2xkX3YgPSBuZXdfbXVsdGlTZWxlY3RlZC5qb2luKCcsJyk7XG4vLyBcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0bmV3X3ZhbHVlc1trZXldID0gb2xkX3Y7XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH1cblxuLy8gXHRcdH0pXG5cbi8vIFx0XHQvL+WmguaenOaYr+WIhuWPke+8jOWImXZhbHVl5Lit55qEcmVjb3JkX25lZWTjgIFGT05EU0lE5LiN6ZyA6KaB5YiG5Y+R5Yiw5paw55Sz6K+35Y2V5LitXG4vLyBcdFx0aWYgKGFjdGlvbl90eXBlID09PSAnZGlzdHJpYnV0ZScpIHtcbi8vIFx0XHRcdGRlbGV0ZSBuZXdfdmFsdWVzLnJlY29yZF9uZWVkO1xuLy8gXHRcdFx0ZGVsZXRlIG5ld192YWx1ZXMuRk9ORFNJRDtcbi8vIFx0XHR9XG5cbi8vIFx0XHQvLyDorqHnrpfnlLPor7fljZXmoIfpophcbi8vIFx0XHR2YXIgaW5zdGFuY2VfbmFtZSA9IFwiXCI7XG4vLyBcdFx0dmFyIG5hbWVfZm9ydW1sYSA9IGZvcm0uY3VycmVudC5uYW1lX2ZvcnVtbGE7XG4vLyBcdFx0aWYgKG5hbWVfZm9ydW1sYSkge1xuLy8gXHRcdFx0dHJ5IHtcbi8vIFx0XHRcdFx0dmFyIGlzY3JpcHQgPSBuYW1lX2ZvcnVtbGEucmVwbGFjZSgvXFx7L2csIFwiKG5ld192YWx1ZXNbJ1wiKS5yZXBsYWNlKC9cXH0vZywgXCInXSB8fCAnJylcIik7XG4vLyBcdFx0XHRcdHZhciByZXYgPSBldmFsKGlzY3JpcHQpO1xuLy8gXHRcdFx0XHRpbnN0YW5jZV9uYW1lID0gcmV2IHx8IGZsb3cubmFtZTtcbi8vIFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG4vLyBcdFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2NhY3VsYXRlX2luc3RhbmNlX25hbWUnLCBcIuiuoeeul+eUs+ivt+WNleagh+mimOWHuumUmeivt+ajgOafpeihqOWNleagh+mimOiEmuacrOOAglwiKTtcbi8vIFx0XHRcdH1cbi8vIFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0aW5zdGFuY2VfbmFtZSA9IGZsb3cubmFtZTtcbi8vIFx0XHR9XG5cbi8vIFx0XHQvLyBpbnN0YW5jZeS4reiusOW9leW9k+WJjeatpemqpOWQjeensCAjMTMxNFxuLy8gXHRcdHZhciBzdGFydF9zdGVwID0gXy5maW5kKGZsb3cuY3VycmVudC5zdGVwcywgZnVuY3Rpb24gKHN0ZXApIHtcbi8vIFx0XHRcdHJldHVybiBzdGVwLnN0ZXBfdHlwZSA9PSAnc3RhcnQnO1xuLy8gXHRcdH0pXG5cbi8vIFx0XHQvLyDmtYHnqIvovazlj5Hlip/og73kv67mlLnkuLrvvIzlvIDlp4voioLngrnmnInnvJbovpHmnYPpmZDnmoTlrZfmrrXnmoTlgLzov5vooYzlpI3liLbvvIzml6DnvJbovpHmnYPpmZDnmoTlrZfmrrXlgLzkuI3ov5vooYzlpI3liLYgIzM3NDhcbi8vIFx0XHRpZiAoYWN0aW9uX3R5cGUgPT09ICdmb3J3YXJkJykge1xuLy8gXHRcdFx0bmV3X3ZhbHVlcyA9IHV1Zmxvd01hbmFnZXIuZ2V0QXBwcm92ZVZhbHVlcyhuZXdfdmFsdWVzLCBzdGFydF9zdGVwLnBlcm1pc3Npb25zLCBmbG93LmZvcm0sIGZsb3cuY3VycmVudC5mb3JtX3ZlcnNpb24pO1xuLy8gXHRcdH1cblxuLy8gXHRcdC8vIOaWsOW7uueUs+ivt+WNleaXtu+8jGluc3RhbmNlc+iusOW9lea1geeoi+WQjeensOOAgea1geeoi+WIhuexu+WQjeensCAjMTMxM1xuLy8gXHRcdHZhciBjYXRlZ29yeV9uYW1lID0gXCJcIjtcbi8vIFx0XHRpZiAoZm9ybS5jYXRlZ29yeSkge1xuLy8gXHRcdFx0dmFyIGNhdGVnb3J5ID0gdXVmbG93TWFuYWdlci5nZXRDYXRlZ29yeShmb3JtLmNhdGVnb3J5KTtcbi8vIFx0XHRcdGlmIChjYXRlZ29yeSlcbi8vIFx0XHRcdFx0Y2F0ZWdvcnlfbmFtZSA9IGNhdGVnb3J5Lm5hbWU7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Xy5lYWNoKGZvcndhcmRfdXNlcnMsIGZ1bmN0aW9uICh1c2VyX2lkKSB7XG5cbi8vIFx0XHRcdHZhciB1c2VyX2luZm8gPSBkYi51c2Vycy5maW5kT25lKHVzZXJfaWQpO1xuXG4vLyBcdFx0XHR2YXIgc3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuLy8gXHRcdFx0XHRzcGFjZTogc3BhY2VfaWQsXG4vLyBcdFx0XHRcdHVzZXI6IHVzZXJfaWRcbi8vIFx0XHRcdH0sIHtcbi8vIFx0XHRcdFx0ZmllbGRzOiB7XG4vLyBcdFx0XHRcdFx0b3JnYW5pemF0aW9uOiAxXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pO1xuLy8gXHRcdFx0dmFyIHNwYWNlX3VzZXJfb3JnX2luZm8gPSBkYi5vcmdhbml6YXRpb25zLmZpbmRPbmUoe1xuLy8gXHRcdFx0XHRfaWQ6IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uXG4vLyBcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRcdG5hbWU6IDEsXG4vLyBcdFx0XHRcdFx0ZnVsbG5hbWU6IDFcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSk7XG5cbi8vIFx0XHRcdHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuLy8gXHRcdFx0dmFyIGluc19vYmogPSB7fTtcblxuLy8gXHRcdFx0dmFyIGFnZW50ID0gdXVmbG93TWFuYWdlci5nZXRBZ2VudChzcGFjZV9pZCwgdXNlcl9pZCk7XG4vLyBcdFx0XHR2YXIgaGFuZGxlcl9pZCA9IHVzZXJfaWQ7XG4vLyBcdFx0XHR2YXIgaGFuZGxlcl9pbmZvID0gdXNlcl9pbmZvO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfc3BhY2VfdXNlciA9IHNwYWNlX3VzZXI7XG4vLyBcdFx0XHR2YXIgaGFuZGxlcl9vcmdfaW5mbyA9IHNwYWNlX3VzZXJfb3JnX2luZm87XG4vLyBcdFx0XHRpZiAoYWdlbnQpIHtcbi8vIFx0XHRcdFx0aGFuZGxlcl9pZCA9IGFnZW50O1xuLy8gXHRcdFx0XHRoYW5kbGVyX2luZm8gPSBkYi51c2Vycy5maW5kT25lKGFnZW50KTtcbi8vIFx0XHRcdFx0aGFuZGxlcl9zcGFjZV91c2VyID0gdXVmbG93TWFuYWdlci5nZXRTcGFjZVVzZXIoc3BhY2VfaWQsIGFnZW50KTtcbi8vIFx0XHRcdFx0aGFuZGxlcl9vcmdfaW5mbyA9IHV1Zmxvd01hbmFnZXIuZ2V0U3BhY2VVc2VyT3JnSW5mbyhoYW5kbGVyX3NwYWNlX3VzZXIpO1xuLy8gXHRcdFx0fVxuLy8gXHRcdFx0aW5zX29iai5faWQgPSBkYi5pbnN0YW5jZXMuX21ha2VOZXdJRCgpO1xuLy8gXHRcdFx0aW5zX29iai5zcGFjZSA9IHNwYWNlX2lkO1xuLy8gXHRcdFx0aW5zX29iai5mbG93ID0gZmxvd19pZDtcbi8vIFx0XHRcdGluc19vYmouZmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50Ll9pZDtcbi8vIFx0XHRcdGluc19vYmouZm9ybSA9IGZsb3cuZm9ybTtcbi8vIFx0XHRcdGluc19vYmouZm9ybV92ZXJzaW9uID0gZmxvdy5jdXJyZW50LmZvcm1fdmVyc2lvbjtcbi8vIFx0XHRcdGluc19vYmoubmFtZSA9IGluc3RhbmNlX25hbWU7XG4vLyBcdFx0XHRpbnNfb2JqLnN1Ym1pdHRlciA9IGhhbmRsZXJfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLnN1Ym1pdHRlcl9uYW1lID0gaGFuZGxlcl9pbmZvLm5hbWU7XG4vLyBcdFx0XHRpbnNfb2JqLmFwcGxpY2FudCA9IHVzZXJfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmFwcGxpY2FudF9uYW1lID0gdXNlcl9pbmZvLm5hbWU7XG4vLyBcdFx0XHRpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb24gPSBzcGFjZV91c2VyLm9yZ2FuaXphdGlvbjtcbi8vIFx0XHRcdGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lID0gc3BhY2VfdXNlcl9vcmdfaW5mby5uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gc3BhY2VfdXNlcl9vcmdfaW5mby5mdWxsbmFtZTtcbi8vIFx0XHRcdGluc19vYmouc3RhdGUgPSBcImRyYWZ0XCI7XG4vLyBcdFx0XHRpbnNfb2JqLmNvZGUgPSBcIlwiO1xuLy8gXHRcdFx0aW5zX29iai5pc19hcmNoaXZlZCA9IGZhbHNlO1xuLy8gXHRcdFx0aW5zX29iai5pc19kZWxldGVkID0gZmFsc2U7XG4vLyBcdFx0XHRpbnNfb2JqLmNyZWF0ZWQgPSBub3c7XG4vLyBcdFx0XHRpbnNfb2JqLmNyZWF0ZWRfYnkgPSBjdXJyZW50X3VzZXJfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLm1vZGlmaWVkID0gbm93O1xuLy8gXHRcdFx0aW5zX29iai5tb2RpZmllZF9ieSA9IGN1cnJlbnRfdXNlcl9pZDtcbi8vIFx0XHRcdGluc19vYmouaW5ib3hfdXNlcnMgPSBbaGFuZGxlcl9pZF07XG4vLyBcdFx0XHRpbnNfb2JqLnZhbHVlcyA9IG5ld192YWx1ZXM7XG4vLyBcdFx0XHRpZiAoYWN0aW9uX3R5cGUgPT0gJ2Rpc3RyaWJ1dGUnKSB7XG4vLyBcdFx0XHRcdC8vIOino+WGs+WkmuasoeWIhuWPkeeci+S4jeWIsOato+aWh+OAgemZhOS7tumXrumimFxuLy8gXHRcdFx0XHRpZiAoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSkge1xuLy8gXHRcdFx0XHRcdGluc19vYmouZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlID0gaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZTtcbi8vIFx0XHRcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdFx0XHRpbnNfb2JqLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSA9IGluc3RhbmNlX2lkO1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHRcdGluc19vYmouZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcyA9IF8uY2xvbmUoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMpIHx8IFtdO1xuLy8gXHRcdFx0XHRpbnNfb2JqLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMucHVzaChpbnN0YW5jZV9pZCk7XG5cbi8vIFx0XHRcdFx0aWYgKHJlbGF0ZWQpIHtcbi8vIFx0XHRcdFx0XHRpbnNfb2JqLnJlbGF0ZWRfaW5zdGFuY2VzID0gW2luc3RhbmNlX2lkXVxuLy8gXHRcdFx0XHR9XG5cbi8vIFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uX3R5cGUgPT0gJ2ZvcndhcmQnKSB7XG4vLyBcdFx0XHRcdGluc19vYmouZm9yd2FyZF9mcm9tX2luc3RhbmNlID0gaW5zdGFuY2VfaWRcbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0Ly8g5paw5bu6VHJhY2Vcbi8vIFx0XHRcdHZhciB0cmFjZV9vYmogPSB7fTtcbi8vIFx0XHRcdHRyYWNlX29iai5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyO1xuLy8gXHRcdFx0dHJhY2Vfb2JqLmluc3RhbmNlID0gaW5zX29iai5faWQ7XG4vLyBcdFx0XHR0cmFjZV9vYmouaXNfZmluaXNoZWQgPSBmYWxzZTtcblxuLy8gXHRcdFx0Ly8g5b2T5YmN5pyA5paw54mIZmxvd+S4reW8gOWni+iKgueCueeahHN0ZXBfaWRcbi8vIFx0XHRcdHZhciBzdGVwX2lkLCBzdGVwX25hbWUsIGNhbl9lZGl0X21haW5fYXR0YWNoLCBjYW5fZWRpdF9ub3JtYWxfYXR0YWNoO1xuLy8gXHRcdFx0Zmxvdy5jdXJyZW50LnN0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0ZXApIHtcbi8vIFx0XHRcdFx0aWYgKHN0ZXAuc3RlcF90eXBlID09IFwic3RhcnRcIikge1xuLy8gXHRcdFx0XHRcdHN0ZXBfaWQgPSBzdGVwLl9pZDtcbi8vIFx0XHRcdFx0XHRzdGVwX25hbWUgPSBzdGVwLm5hbWU7XG4vLyBcdFx0XHRcdFx0Y2FuX2VkaXRfbWFpbl9hdHRhY2ggPSBzdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoO1xuLy8gXHRcdFx0XHRcdGNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPSBzdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2g7XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pXG4vLyBcdFx0XHR0cmFjZV9vYmouc3RlcCA9IHN0ZXBfaWQ7XG4vLyBcdFx0XHR0cmFjZV9vYmouc3RhcnRfZGF0ZSA9IG5vdztcbi8vIFx0XHRcdHRyYWNlX29iai5uYW1lID0gc3RlcF9uYW1lO1xuXG4vLyBcdFx0XHQvLyDmlrDlu7pBcHByb3ZlXG4vLyBcdFx0XHR2YXIgYXBwcl9vYmogPSB7fTtcbi8vIFx0XHRcdGFwcHJfb2JqLl9pZCA9IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHI7XG4vLyBcdFx0XHRhcHByX29iai5pbnN0YW5jZSA9IGluc19vYmouX2lkO1xuLy8gXHRcdFx0YXBwcl9vYmoudHJhY2UgPSB0cmFjZV9vYmouX2lkO1xuLy8gXHRcdFx0YXBwcl9vYmouaXNfZmluaXNoZWQgPSBmYWxzZTtcbi8vIFx0XHRcdGFwcHJfb2JqLnVzZXIgPSB1c2VyX2lkO1xuLy8gXHRcdFx0YXBwcl9vYmoudXNlcl9uYW1lID0gdXNlcl9pbmZvLm5hbWU7XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyID0gaGFuZGxlcl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXJfbmFtZSA9IGhhbmRsZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0YXBwcl9vYmouaGFuZGxlcl9vcmdhbml6YXRpb24gPSBoYW5kbGVyX3NwYWNlX3VzZXIub3JnYW5pemF0aW9uO1xuLy8gXHRcdFx0YXBwcl9vYmouaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZSA9IGhhbmRsZXJfb3JnX2luZm8ubmFtZTtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lID0gaGFuZGxlcl9vcmdfaW5mby5mdWxsbmFtZTtcbi8vIFx0XHRcdGFwcHJfb2JqLnR5cGUgPSBcImRyYWZ0XCI7XG4vLyBcdFx0XHRhcHByX29iai5zdGFydF9kYXRlID0gbm93O1xuLy8gXHRcdFx0YXBwcl9vYmoucmVhZF9kYXRlID0gbm93O1xuLy8gXHRcdFx0YXBwcl9vYmouaXNfcmVhZCA9IGZhbHNlO1xuLy8gXHRcdFx0YXBwcl9vYmouaXNfZXJyb3IgPSBmYWxzZTtcblxuLy8gXHRcdFx0YXBwcl9vYmoudmFsdWVzID0gbmV3X3ZhbHVlcztcblxuLy8gXHRcdFx0aWYgKGFnZW50KSB7XG4vLyBcdFx0XHRcdGFwcHJfb2JqLmFnZW50ID0gYWdlbnQ7XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdHRyYWNlX29iai5hcHByb3ZlcyA9IFthcHByX29ial07XG4vLyBcdFx0XHRpbnNfb2JqLnRyYWNlcyA9IFt0cmFjZV9vYmpdO1xuXG4vLyBcdFx0XHRpZiAoZmxvdy5hdXRvX3JlbWluZCA9PSB0cnVlKVxuLy8gXHRcdFx0XHRpbnNfb2JqLmF1dG9fcmVtaW5kID0gdHJ1ZTtcblxuLy8gXHRcdFx0aW5zX29iai5jdXJyZW50X3N0ZXBfbmFtZSA9IHN0YXJ0X3N0ZXAubmFtZTtcblxuLy8gXHRcdFx0aW5zX29iai5mbG93X25hbWUgPSBmbG93Lm5hbWU7XG4vLyBcdFx0XHRpZiAoY2F0ZWdvcnlfbmFtZSkge1xuLy8gXHRcdFx0XHRpbnNfb2JqLmNhdGVnb3J5X25hbWUgPSBjYXRlZ29yeS5uYW1lO1xuLy8gXHRcdFx0XHRpbnNfb2JqLmNhdGVnb3J5ID0gY2F0ZWdvcnkuX2lkO1xuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHRuZXdfaW5zX2lkID0gZGIuaW5zdGFuY2VzLmluc2VydChpbnNfb2JqKTtcblxuLy8gXHRcdFx0Ly8g5aSN5Yi26ZmE5Lu2XG4vLyBcdFx0XHR2YXIgY29sbGVjdGlvbiA9IGNmcy5pbnN0YW5jZXM7XG5cbi8vIFx0XHRcdC8v5bCG5Y6f6KGo5Y2V5YaF5a655a2Y5YKo5Li656ys5LiA5Liq6ZmE5Lu2XG4vLyBcdFx0XHRpZiAoaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50KSB7XG4vLyBcdFx0XHRcdC8vIHRyeSB7XG5cbi8vIFx0XHRcdFx0aW5zdGFuY2VIdG1sID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCh1c2VyX2luZm8sIHNwYWNlX2lkLCBpbnMsIHtcbi8vIFx0XHRcdFx0XHRhYnNvbHV0ZTogdHJ1ZSxcbi8vIFx0XHRcdFx0XHRzaG93VHJhY2U6IHRydWVcbi8vIFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0dmFyIGluc3RhbmNlRmlsZSA9IG5ldyBGUy5GaWxlKCk7XG4vLyBcdFx0XHRcdGluc3RhbmNlRmlsZS5hdHRhY2hEYXRhKEJ1ZmZlci5mcm9tKGluc3RhbmNlSHRtbCwgXCJ1dGYtOFwiKSwge1xuLy8gXHRcdFx0XHRcdHR5cGU6IFwidGV4dC9odG1sXCJcbi8vIFx0XHRcdFx0fSwgZnVuY3Rpb24gKGVycm9yKSB7XG4vLyBcdFx0XHRcdFx0aWYgKGVycm9yKSB7XG4vLyBcdFx0XHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVycm9yLmVycm9yLCBlcnJvci5yZWFzb24pO1xuLy8gXHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdGluc3RhbmNlRmlsZS5uYW1lKGlucy5uYW1lICsgXCIuaHRtbFwiKTtcbi8vIFx0XHRcdFx0XHRpbnN0YW5jZUZpbGUuc2l6ZShpbnN0YW5jZUh0bWwubGVuZ3RoKTtcblxuLy8gXHRcdFx0XHRcdHZhciBtZXRhZGF0YSA9IHtcbi8vIFx0XHRcdFx0XHRcdG93bmVyOiB1c2VyX2lkLFxuLy8gXHRcdFx0XHRcdFx0b3duZXJfbmFtZTogdXNlcl9pbmZvLm5hbWUsXG4vLyBcdFx0XHRcdFx0XHRzcGFjZTogc3BhY2VfaWQsXG4vLyBcdFx0XHRcdFx0XHRpbnN0YW5jZTogbmV3X2luc19pZCxcbi8vIFx0XHRcdFx0XHRcdGFwcHJvdmU6IGFwcHJfb2JqLl9pZCxcbi8vIFx0XHRcdFx0XHRcdGN1cnJlbnQ6IHRydWVcbi8vIFx0XHRcdFx0XHR9O1xuLy8gXHRcdFx0XHRcdGluc3RhbmNlRmlsZS5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuLy8gXHRcdFx0XHRcdHZhciBmaWxlT2JqID0gY29sbGVjdGlvbi5pbnNlcnQoaW5zdGFuY2VGaWxlKTtcbi8vIFx0XHRcdFx0XHRmaWxlT2JqLnVwZGF0ZSh7XG4vLyBcdFx0XHRcdFx0XHQkc2V0OiB7XG4vLyBcdFx0XHRcdFx0XHRcdCdtZXRhZGF0YS5wYXJlbnQnOiBmaWxlT2JqLl9pZFxuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdH0pXG5cbi8vIFx0XHRcdFx0Ly8gfSBjYXRjaCAoZSkge1xuLy8gXHRcdFx0XHQvLyAgICAgY29uc29sZS5lcnJvcihlKTtcbi8vIFx0XHRcdFx0Ly8gfVxuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHRpZiAoaXNGb3J3YXJkQXR0YWNobWVudHMgJiYgYWN0aW9uX3R5cGUgPT0gJ2ZvcndhcmQnKSB7XG4vLyBcdFx0XHRcdHZhciBmaWxlcyA9IGNvbGxlY3Rpb24uZmluZCh7XG4vLyBcdFx0XHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzogaW5zdGFuY2VfaWQsXG4vLyBcdFx0XHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlXG4vLyBcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4vLyBcdFx0XHRcdFx0Ly8g5Yik5pat5paw55qE5rWB56iL5byA5aeL6IqC54K55piv5ZCm5pyJ57yW6L6R5q2j5paH5ZKM57yW6L6R6ZmE5Lu25p2D6ZmQXG4vLyBcdFx0XHRcdFx0aWYgKGYubWV0YWRhdGEubWFpbiA9PSB0cnVlKSB7XG4vLyBcdFx0XHRcdFx0XHRpZiAoY2FuX2VkaXRfbWFpbl9hdHRhY2ggIT0gdHJ1ZSAmJiBjYW5fZWRpdF9ub3JtYWxfYXR0YWNoICE9IHRydWUpXG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHR9IGVsc2Uge1xuLy8gXHRcdFx0XHRcdFx0aWYgKGNhbl9lZGl0X25vcm1hbF9hdHRhY2ggIT0gdHJ1ZSlcbi8vIFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdHZhciBuZXdGaWxlID0gbmV3IEZTLkZpbGUoKTtcbi8vIFx0XHRcdFx0XHRuZXdGaWxlLmF0dGFjaERhdGEoZi5jcmVhdGVSZWFkU3RyZWFtKCdpbnN0YW5jZXMnKSwge1xuLy8gXHRcdFx0XHRcdFx0dHlwZTogZi5vcmlnaW5hbC50eXBlXG4vLyBcdFx0XHRcdFx0fSwgZnVuY3Rpb24gKGVycikge1xuLy8gXHRcdFx0XHRcdFx0aWYgKGVycikge1xuLy8gXHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKGVyci5lcnJvciwgZXJyLnJlYXNvbik7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRuZXdGaWxlLm5hbWUoZi5uYW1lKCkpO1xuLy8gXHRcdFx0XHRcdFx0bmV3RmlsZS5zaXplKGYuc2l6ZSgpKTtcbi8vIFx0XHRcdFx0XHRcdHZhciBtZXRhZGF0YSA9IHtcbi8vIFx0XHRcdFx0XHRcdFx0b3duZXI6IHVzZXJfaWQsXG4vLyBcdFx0XHRcdFx0XHRcdG93bmVyX25hbWU6IHVzZXJfaW5mby5uYW1lLFxuLy8gXHRcdFx0XHRcdFx0XHRzcGFjZTogc3BhY2VfaWQsXG4vLyBcdFx0XHRcdFx0XHRcdGluc3RhbmNlOiBuZXdfaW5zX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRhcHByb3ZlOiBhcHByX29iai5faWQsXG4vLyBcdFx0XHRcdFx0XHRcdGN1cnJlbnQ6IHRydWVcbi8vIFx0XHRcdFx0XHRcdH07XG4vLyBcdFx0XHRcdFx0XHRpZiAoZi5tZXRhZGF0YS5tYWluID09IHRydWUgJiYgY2FuX2VkaXRfbWFpbl9hdHRhY2ggPT0gdHJ1ZSkge1xuLy8gXHRcdFx0XHRcdFx0XHRtZXRhZGF0YS5tYWluID0gdHJ1ZTtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdG5ld0ZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YTtcbi8vIFx0XHRcdFx0XHRcdHZhciBmaWxlT2JqID0gY29sbGVjdGlvbi5pbnNlcnQobmV3RmlsZSk7XG4vLyBcdFx0XHRcdFx0XHRmaWxlT2JqLnVwZGF0ZSh7XG4vLyBcdFx0XHRcdFx0XHRcdCRzZXQ6IHtcbi8vIFx0XHRcdFx0XHRcdFx0XHQnbWV0YWRhdGEucGFyZW50JzogZmlsZU9iai5faWRcbi8vIFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0XHR9KVxuXG4vLyBcdFx0XHRcdH0pXG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdGlmIChhY3Rpb25fdHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnKSB7XG4vLyBcdFx0XHRcdC8vIOe7meW9k+WJjeeahOeUs+ivt+WNleWinuWKoOWIhuWPkeiusOW9lVxuLy8gXHRcdFx0XHR2YXIgYXBwciA9IHtcbi8vIFx0XHRcdFx0XHQnX2lkJzogbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0cixcbi8vIFx0XHRcdFx0XHQnaW5zdGFuY2UnOiBpbnN0YW5jZV9pZCxcbi8vIFx0XHRcdFx0XHQndHJhY2UnOiBjdXJyZW50X3RyYWNlX2lkLFxuLy8gXHRcdFx0XHRcdCdpc19maW5pc2hlZCc6IHRydWUsXG4vLyBcdFx0XHRcdFx0J3VzZXInOiB1c2VyX2lkLFxuLy8gXHRcdFx0XHRcdCd1c2VyX25hbWUnOiB1c2VyX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcic6IHVzZXJfaWQsXG4vLyBcdFx0XHRcdFx0J2hhbmRsZXJfbmFtZSc6IHVzZXJfaW5mby5uYW1lLFxuLy8gXHRcdFx0XHRcdCdoYW5kbGVyX29yZ2FuaXphdGlvbic6IHNwYWNlX3VzZXIub3JnYW5pemF0aW9uLFxuLy8gXHRcdFx0XHRcdCdoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lJzogc3BhY2VfdXNlcl9vcmdfaW5mby5uYW1lLFxuLy8gXHRcdFx0XHRcdCdoYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZSc6IHNwYWNlX3VzZXJfb3JnX2luZm8uZnVsbG5hbWUsXG4vLyBcdFx0XHRcdFx0J3R5cGUnOiBhY3Rpb25fdHlwZSxcbi8vIFx0XHRcdFx0XHQnc3RhcnRfZGF0ZSc6IG5ldyBEYXRlKCksXG4vLyBcdFx0XHRcdFx0J2ZpbmlzaF9kYXRlJzogbmV3IERhdGUoKSxcbi8vIFx0XHRcdFx0XHQnaXNfcmVhZCc6IGZhbHNlLFxuLy8gXHRcdFx0XHRcdCdqdWRnZSc6ICdzdWJtaXR0ZWQnLFxuLy8gXHRcdFx0XHRcdCdmcm9tX3VzZXInOiBjdXJyZW50X3VzZXJfaWQsXG4vLyBcdFx0XHRcdFx0J2Zyb21fdXNlcl9uYW1lJzogZnJvbV91c2VyX25hbWUsXG4vLyBcdFx0XHRcdFx0J2ZvcndhcmRfc3BhY2UnOiBzcGFjZV9pZCxcbi8vIFx0XHRcdFx0XHQnZm9yd2FyZF9pbnN0YW5jZSc6IG5ld19pbnNfaWQsXG4vLyBcdFx0XHRcdFx0J2Rlc2NyaXB0aW9uJzogZGVzY3JpcHRpb24sXG4vLyBcdFx0XHRcdFx0J2Zyb21fYXBwcm92ZV9pZCc6IGZyb21fYXBwcm92ZV9pZFxuLy8gXHRcdFx0XHR9O1xuXG4vLyBcdFx0XHRcdGZvcndhcmRfYXBwcm92ZXMucHVzaChhcHByKTtcbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0bmV3X2luc19pZHMucHVzaChuZXdfaW5zX2lkKTtcbi8vIFx0XHRcdHB1c2hNYW5hZ2VyLnNlbmRfbWVzc2FnZV90b19zcGVjaWZ5VXNlcihcImN1cnJlbnRfdXNlclwiLCB1c2VyX2lkKTtcbi8vIFx0XHR9KVxuXG4vLyBcdFx0aWYgKCFfLmlzRW1wdHkoZm9yd2FyZF9hcHByb3ZlcykpIHtcbi8vIFx0XHRcdHNldF9vYmoubW9kaWZpZWQgPSBuZXcgRGF0ZSgpO1xuLy8gXHRcdFx0c2V0X29iai5tb2RpZmllZF9ieSA9IGN1cnJlbnRfdXNlcl9pZDtcbi8vIFx0XHRcdHZhciByID0gZGIuaW5zdGFuY2VzLnVwZGF0ZSh7XG4vLyBcdFx0XHRcdF9pZDogaW5zdGFuY2VfaWQsXG4vLyBcdFx0XHRcdFwidHJhY2VzLl9pZFwiOiBjdXJyZW50X3RyYWNlX2lkXG4vLyBcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdCRzZXQ6IHNldF9vYmosXG4vLyBcdFx0XHRcdCRhZGRUb1NldDoge1xuLy8gXHRcdFx0XHRcdCd0cmFjZXMuJC5hcHByb3Zlcyc6IHtcbi8vIFx0XHRcdFx0XHRcdCRlYWNoOiBmb3J3YXJkX2FwcHJvdmVzXG4vLyBcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KTtcbi8vIFx0XHR9XG5cblxuLy8gXHRcdGlmIChyKSB7XG4vLyBcdFx0XHRfLmVhY2goY3VycmVudF90cmFjZS5hcHByb3ZlcywgZnVuY3Rpb24gKGEsIGlkeCkge1xuLy8gXHRcdFx0XHRpZiAoYS5faWQgPT0gZnJvbV9hcHByb3ZlX2lkKSB7XG4vLyBcdFx0XHRcdFx0dmFyIHVwZGF0ZV9yZWFkID0ge307XG4vLyBcdFx0XHRcdFx0dXBkYXRlX3JlYWRbXCJ0cmFjZXMuJC5hcHByb3Zlcy5cIiArIGlkeCArIFwiLnJlYWRfZGF0ZVwiXSA9IG5ldyBEYXRlKCk7XG4vLyBcdFx0XHRcdFx0ZGIuaW5zdGFuY2VzLnVwZGF0ZSh7XG4vLyBcdFx0XHRcdFx0XHRfaWQ6IGluc3RhbmNlX2lkLFxuLy8gXHRcdFx0XHRcdFx0XCJ0cmFjZXMuX2lkXCI6IGN1cnJlbnRfdHJhY2VfaWRcbi8vIFx0XHRcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdFx0XHQkc2V0OiB1cGRhdGVfcmVhZFxuLy8gXHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KVxuXG4vLyBcdFx0fVxuXG4vLyBcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gXHRcdFx0Y29kZTogMjAwLFxuLy8gXHRcdFx0ZGF0YTogeyBuZXdfaW5zX2lkczogbmV3X2luc19pZHMgfVxuLy8gXHRcdH0pXG4vLyBcdH0gY2F0Y2ggKGUpIHtcbi8vIFx0XHRjb25zb2xlLmVycm9yKGUuc3RhY2spXG4vLyBcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gXHRcdFx0Y29kZTogMjAwLFxuLy8gXHRcdFx0ZGF0YToge1xuLy8gXHRcdFx0XHRlcnJvcnM6IFtlXVxuLy8gXHRcdFx0fVxuLy8gXHRcdH0pXG4vLyBcdH1cblxuLy8gfSkiLCJpZiBwcm9jZXNzLmVudi5DUkVBVE9SX05PREVfRU5WID09ICdkZXZlbG9wbWVudCdcbiAgICBKc29uUm91dGVzLmFkZCAncG9zdCcsICcvdGVzdC93ZWJob29rJywgKHJlcSwgcmVzLCBuZXh0KSAtPlxuICAgICAgICB0cnlcblxuICAgICAgICAgICAgaGFzaERhdGEgPSByZXEuYm9keVxuICAgICAgICAgICAgY29uc29sZS5sb2cgJ2FjdGlvbjogJywgaGFzaERhdGEuYWN0aW9uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyAnZnJvbV91c2VyOiAnLCBoYXNoRGF0YS5mcm9tX3VzZXJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nICd0b191c2VyczogJywgaGFzaERhdGEudG9fdXNlcnNcblxuXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAyMDBcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge31cbiAgICAgICAgY2F0Y2ggZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvciBlLnN0YWNrXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgICAgIGNvZGU6IDIwMFxuICAgICAgICAgICAgICAgIGRhdGE6IHsgZXJyb3JzOiBbe2Vycm9yTWVzc2FnZTogZS5tZXNzYWdlfV0gfSIsImlmIChwcm9jZXNzLmVudi5DUkVBVE9SX05PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gIEpzb25Sb3V0ZXMuYWRkKCdwb3N0JywgJy90ZXN0L3dlYmhvb2snLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICAgIHZhciBlLCBoYXNoRGF0YTtcbiAgICB0cnkge1xuICAgICAgaGFzaERhdGEgPSByZXEuYm9keTtcbiAgICAgIGNvbnNvbGUubG9nKCdhY3Rpb246ICcsIGhhc2hEYXRhLmFjdGlvbik7XG4gICAgICBjb25zb2xlLmxvZygnZnJvbV91c2VyOiAnLCBoYXNoRGF0YS5mcm9tX3VzZXIpO1xuICAgICAgY29uc29sZS5sb2coJ3RvX3VzZXJzOiAnLCBoYXNoRGF0YS50b191c2Vycyk7XG4gICAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgIGRhdGE6IHt9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZSA9IGVycm9yO1xuICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgIHJldHVybiBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDIwMCxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGVycm9yczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGUubWVzc2FnZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRzZXRfaW5zdGFuY2Vfc3RlcF9hcHByb3ZlOiAoaW5zX2lkLCBzdGVwX2FwcHJvdmUsIHN0ZXBzQXBwcm92ZXNPcHRpb25zKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5zZXRfaW5zdGFuY2Vfc3RlcF9hcHByb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0c2V0X2luc3RhbmNlX3NraXBfc3RlcHM6IChpbnNfaWQsIHN0ZXBJZCwgYWN0aW9uKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5zZXRfaW5zdGFuY2Vfc2tpcF9zdGVwcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIxLTA1LTI0IDEyOjMyOjU2XG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMjIgMTU6MTg6NTlcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbmNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG5cblx0Z2V0X2luc3RhbmNlX2RhdGE6IGZ1bmN0aW9uIChpbnN0YW5jZV9pZCwgZm9ybUNhY2hlZCwgZmxvd0NhY2hlZCkge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X2luc3RhbmNlX2RhdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9XG5cbn0pO1xuIiwiY29uc3QgeyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzKHtcblxuXHRkcmFmdF9zYXZlX2luc3RhbmNlOiBmdW5jdGlvbiAoaW5zKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5kcmFmdF9zYXZlX2luc3RhbmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRpbmJveF9zYXZlX2luc3RhbmNlOiBmdW5jdGlvbiAoYXBwcm92ZSkge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuaW5ib3hfc2F2ZV9pbnN0YW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH1cblxufSkiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjMtMDEtMTMgMTc6MzU6MTNcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMy0wMy0xMSAxMDo1MToyOVxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuY29uc3QgeyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzKHtcblx0Y2NfZG86IGZ1bmN0aW9uIChhcHByb3ZlLCBjY191c2VyX2lkcywgZGVzY3JpcHRpb24pIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX2RvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRjY19yZWFkOiBmdW5jdGlvbiAoYXBwcm92ZSkge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2NfcmVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2Nfc3VibWl0OiBmdW5jdGlvbiAoaW5zX2lkLCBkZXNjcmlwdGlvbiwgbXlBcHByb3ZlLCBjY0hhc0VkaXRQZXJtaXNzaW9uKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jY19zdWJtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNjX3JlbW92ZTogZnVuY3Rpb24gKGluc3RhbmNlSWQsIGFwcHJvdmVJZCkge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2NfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRiYXRjaF9jYW5jZWxfY2M6IGZ1bmN0aW9uIChpbnN0YW5jZV9pZCwgYXBwcm92ZV9pZHMpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmJhdGNoX2NhbmNlbF9jYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2Nfc2F2ZTogZnVuY3Rpb24gKGluc19pZCwgZGVzY3JpcHRpb24sIG15QXBwcm92ZSwgY2NIYXNFZGl0UGVybWlzc2lvbikge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2Nfc2F2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH1cbn0pIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIxLTA1LTI0IDEyOjMyOjU2XG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMjIgMTU6MTg6MzhcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbmNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG5cdC8vIOaUueS4uumAmui/h2Fwaeiwg+eUqFxuXHRmb3J3YXJkX2luc3RhbmNlOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIHNwYWNlX2lkLCBmbG93X2lkLCBoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQsIGRlc2NyaXB0aW9uLCBpc0ZvcndhcmRBdHRhY2htZW50cywgc2VsZWN0ZWRVc2VycywgYWN0aW9uX3R5cGUsIHJlbGF0ZWQsIGZyb21fYXBwcm92ZV9pZCkge1xuXHRcdGlmICghdGhpcy51c2VySWQpXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdub3QtYXV0aG9yaXplZCcpO1xuXG5cdFx0cmV0dXJuO1xuXHR9LFxuXG5cblx0Zm9yd2FyZF9yZW1vdmU6IGZ1bmN0aW9uIChpbnN0YW5jZV9pZCwgdHJhY2VfaWQsIGFwcHJvdmVfaWQpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmZvcndhcmRfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRjYW5jZWxEaXN0cmlidXRlOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIGFwcHJvdmVfaWRzKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jYW5jZWxEaXN0cmlidXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fVxuXG5cbn0pIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIxLTA1LTI0IDEyOjMyOjU2XG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjItMTItMjIgMTU6MTc6NTRcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbmNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG4gICAgY2ZzX2luc3RhbmNlc19yZW1vdmU6IGZ1bmN0aW9uIChmaWxlX2lkKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2ZzX2luc3RhbmNlc19yZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH0sXG5cbiAgICBjZnNfaW5zdGFuY2VzX3NldF9jdXJyZW50OiBmdW5jdGlvbiAoZmlsZV9pZCkge1xuICAgICAgICByZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNmc19pbnN0YW5jZXNfc2V0X2N1cnJlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH0sXG5cbiAgICBjZnNfaW5zdGFuY2VzX2xvY2s6IGZ1bmN0aW9uIChmaWxlX2lkLCB1c2VyX2lkLCB1c2VyX25hbWUpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jZnNfaW5zdGFuY2VzX2xvY2suYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH0sXG5cbiAgICBjZnNfaW5zdGFuY2VzX3VubG9jazogZnVuY3Rpb24gKGZpbGVfaWQpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jZnNfaW5zdGFuY2VzX3VubG9jay5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfSxcblxuICAgIGRvd25sb2FkX3NwYWNlX2luc3RhbmNlX2F0dGFjaG1lbnRzX3RvX2Rpc2s6IGZ1bmN0aW9uIChzcGFjZUlkLCBjZnNSZWNvcmRJZHMpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93TWV0aG9kcy5kb3dubG9hZF9zcGFjZV9pbnN0YW5jZV9hdHRhY2htZW50c190b19kaXNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9XG59KSIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRzZXRfYXBwcm92ZV9oYXZlX3JlYWQ6IChpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5zZXRfYXBwcm92ZV9oYXZlX3JlYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cdGNoYW5nZV9hcHByb3ZlX2luZm86IChpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIGRlc2NyaXB0aW9uLCBmaW5pc2hfZGF0ZSkgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNoYW5nZV9hcHByb3ZlX2luZm8uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cdHVwZGF0ZV9hcHByb3ZlX3NpZ246IChpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIHNpZ25fZmllbGRfY29kZSwgZGVzY3JpcHRpb24sIHNpZ25fdHlwZSwgbGFzdFNpZ25BcHByb3ZlKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy51cGRhdGVfYXBwcm92ZV9zaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXG5cdHVwZGF0ZV9zaWduX3Nob3c6IChvYmpzLCBteUFwcHJvdmVfaWQpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy51cGRhdGVfc2lnbl9zaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRpbnN0YW5jZV9yZXR1cm46IChhcHByb3ZlLCByZWFzb24pLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmluc3RhbmNlX3JldHVybi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdGluc3RhbmNlX3JlbWluZDogKHJlbWluZF91c2VycywgcmVtaW5kX2NvdW50LCByZW1pbmRfZGVhZGxpbmUsIGluc3RhbmNlX2lkLCBhY3Rpb25fdHlwZXMsIHRyYWNlX2lkKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5pbnN0YW5jZV9yZW1pbmQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdG5leHRfc3RlcF91c2Vyc19ub3RfZm91bmQ6IChkZWFsX3R5cGUsIHN0ZXBfbmFtZSwgcGFyYW1zKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMubmV4dF9zdGVwX3VzZXJzX25vdF9mb3VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuX2V2YWwgPSByZXF1aXJlKCdldmFsJylcblxuTWV0ZW9yLm1ldGhvZHNcblx0aW5zdGFuY2VOdW1iZXJCdWlsZGVyOiAoc3BhY2VJZCwgbmFtZSktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuaW5zdGFuY2VOdW1iZXJCdWlsZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRjaGVja19tYWluX2F0dGFjaDogKGluc19pZCwgbmFtZSktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2hlY2tfbWFpbl9hdHRhY2guYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdHJlbW92ZV9yZWxhdGVkOiAoaW5zX2lkLCByZV9pbnNfaWQpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnJlbW92ZV9yZWxhdGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHR1cGRhdGVfaW5zdGFuY2VfcmVsYXRlZDogKGluc19pZCwgcmVsYXRlZF9pbnN0YW5jZXMpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnVwZGF0ZV9pbnN0YW5jZV9yZWxhdGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHR1cGRhdGVGbG93UG9zaXRpb246IChkYXRhKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlRmxvd1Bvc2l0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHR1cGRhdGVGbG93Um9sZTogKGRhdGEpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy51cGRhdGVGbG93Um9sZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdHN0YXJ0X2Zsb3c6IChzcGFjZSwgZmxvd0lkLCBzdGFydCkgLT5cblxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc3RhcnRfZmxvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRnZXRfaW5zdGFuY2VfdHJhY2VzOiAoaW5zX2lkKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRfaW5zdGFuY2VfdHJhY2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0J2dldF9iYXRjaF9pbnN0YW5jZXMnOiAoc3BhY2UsIGNhdGVnb3J5SWQsIGZsb3dJZHMpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldF9iYXRjaF9pbnN0YW5jZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cdCdnZXRfYmF0Y2hfaW5zdGFuY2VzX2NvdW50JzogKHNwYWNlLCBjYXRlZ29yeUlkLCBmbG93SWRzKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRfYmF0Y2hfaW5zdGFuY2VzX2NvdW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHQnZ2V0X215X2FwcHJvdmVzJzogKGluc3RhbmNlSWRzKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRfbXlfYXBwcm92ZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cblxuXG5cblxuXG5cblxuXG5cbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRjaGFuZ2VfZmxvd19zdGF0ZTogKGZsb3dzKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2hhbmdlX2Zsb3dfc3RhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG5cblxuXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblxuXHRoaWRlX2luc3RhbmNlOiAoaW5zSWQsIGlzX2hpZGRlbikgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmhpZGVfaW5zdGFuY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdGdldEluc3RhbmNlVmFsdWVzOiAoaW5zSWQpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldEluc3RhbmNlVmFsdWVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykiLCJDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIilcblxuZ2V0SW5zdGFuY2VSZWFkT25seSA9IChyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykgLT5cblxuXHR1c2VyID0gU3RlZWRvcy5nZXRBUElMb2dpblVzZXIocmVxLCByZXMpXG5cblx0aWYgcmVxPy5xdWVyeT8uYWNjZXNzX3Rva2VuXG5cdFx0dXNlcklkID0gU3RlZWRvcy5nZXRVc2VySWRGcm9tQWNjZXNzVG9rZW4ocmVxLnF1ZXJ5LmFjY2Vzc190b2tlbilcblx0XHRpZiB1c2VySWRcblx0XHRcdHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdHNwYWNlSWQgPSByZXEucGFyYW1zLnNwYWNlXG5cblx0aW5zdGFuY2VJZCA9IHJlcS5wYXJhbXMuaW5zdGFuY2VfaWRcblxuXHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlSWR9KTtcblxuXHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHtfaWQ6IHNwYWNlSWR9KTtcblxuXHRoaWRlX3RyYWNlcyA9IHJlcS5xdWVyeT8uaGlkZV90cmFjZXNcblxuXHRpZiAhb3B0aW9uc1xuXHRcdG9wdGlvbnMgPSB7c2hvd1RyYWNlOiB0cnVlfVxuXHRlbHNlXG5cdFx0b3B0aW9ucy5zaG93VHJhY2UgPSB0cnVlXG5cblx0aWYgaGlkZV90cmFjZXMgaXMgXCIxXCJcblx0XHRpZiBvcHRpb25zXG5cdFx0XHRvcHRpb25zLnNob3dUcmFjZSA9IGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0b3B0aW9ucyA9IHtzaG93VHJhY2U6IGZhbHNlfVxuXG5cdGlmICFvcHRpb25zLnNob3dBdHRhY2htZW50c1xuXHRcdG9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzID0gdHJ1ZVxuXG5cdGlmICFzcGFjZVxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNwYWNlXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRpZiAgIWluc3RhbmNlXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgaW5zdGFuY2VcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdGlmICF1c2VyXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZFwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0aWYgaW5zdGFuY2Uuc3BhY2UgIT0gc3BhY2VJZFxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNwYWNlIG9yIGluc3RhbmNlXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXG5cblx0c3BhY2VVc2VyQ291bnQgPSBkYi5zcGFjZV91c2Vycy5maW5kKHsgdXNlcjogdXNlci5faWQsIHNwYWNlOiBzcGFjZUlkIH0pLmNvdW50KClcblxuXHRpZiBzcGFjZVVzZXJDb3VudCBpcyAwXG5cdFx0aWYgIXNwYWNlXG5cdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRcdGRhdGE6XG5cdFx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzYXBjZVVzZXJcIixcblx0XHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRcdHJldHVybjtcblxuXHQj5qCh6aqMdXNlcuaYr+WQpuWvuWluc3RhbmNl5pyJ5p+l55yL5p2D6ZmQXG5cdF9oYXNQZXJtaXNzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmhhc0luc3RhbmNlUGVybWlzc2lvbnModXNlciwgaW5zdGFuY2UpXG5cblx0aWYgIV9oYXNQZXJtaXNzaW9uICAmJiBpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2Vcblx0XHRfcGFyZW50X2luc3RhbmNlcyA9IF8udW5pb24oW2luc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZV0sIGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMgfHwgW10pXG5cblx0XHRfaGFzUGVybWlzc2lvbiA9IF8uZmluZCBfcGFyZW50X2luc3RhbmNlcywgKF9wYXJlbnRfaWQpLT5cblx0XHRcdF9wYXJlbnRfaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDpfcGFyZW50X2lkfSwge2ZpZWxkczoge3RyYWNlczogMH19KVxuXG5cdFx0XHRyZXR1cm4gV29ya2Zsb3dNYW5hZ2VyLmhhc0luc3RhbmNlUGVybWlzc2lvbnModXNlciwgX3BhcmVudF9pbnMpXG5cblx0aWYgIV9oYXNQZXJtaXNzaW9uXG5cdFx0X2xvY2FsZSA9IFN0ZWVkb3MubG9jYWxlKHVzZXIuX2lkLCB0cnVlKVxuXHRcdGVycm9yID0gVEFQaTE4bi5fXyhcImluc3RhbmNlX3Blcm1pc3Npb25zX2Vycm9yXCIsIHt9LCBfbG9jYWxlKVxuXHRcdHJlcy5jaGFyc2V0ID0gXCJ1dGYtOFwiXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogZXJyb3IsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRodG1sID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cdGRhdGFCdWYgPSBuZXcgQnVmZmVyKGh0bWwpO1xuXHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7XG5cdHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJywgZGF0YUJ1Zi5sZW5ndGgpXG5cdHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtcmFuZ2UnLCBcImJ5dGVzIDAtI3tkYXRhQnVmLmxlbmd0aCAtIDF9LyN7ZGF0YUJ1Zi5sZW5ndGh9XCIpXG5cdHJlcy5zdGF0dXNDb2RlID0gMjAwXG5cdHJlcy5lbmQoaHRtbClcblxuSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvcmVhZG9ubHkvOmluc3RhbmNlX2lkXCIsIGdldEluc3RhbmNlUmVhZE9ubHlcblxuSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvcmVhZG9ubHkvOmluc3RhbmNlX2lkLzppbnN0YW5jZV9uYW1lXCIsIChyZXEsIHJlcywgbmV4dCktPlxuXHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC1tc2Rvd25sb2FkJyk7XG5cdHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudDtmaWxlbmFtZT0nK2VuY29kZVVSSShyZXEucGFyYW1zLmluc3RhbmNlX25hbWUpKTtcblx0cmVzLnNldEhlYWRlcignVHJhbnNmZXItRW5jb2RpbmcnLCAnJylcblxuXHRvcHRpb25zID0ge2Fic29sdXRlOiB0cnVlfVxuXG5cdHJldHVybiBnZXRJbnN0YW5jZVJlYWRPbmx5KHJlcSwgcmVzLCBuZXh0LCBvcHRpb25zKVxuIyMjXG5cdOiOt+WPlueUs+ivt+WNleWIl+ihqO+8mlxuICAgIGZpbmFsX2RlY2lzaW9u77ya5a6h5om557uT5p6cXG4gICAgc3RhdGU6IOeUs+ivt+WNleeKtuaAgVxuIyMjXG5Kc29uUm91dGVzLmFkZCBcImdldFwiLCBcIi9hcGkvd29ya2Zsb3cvaW5zdGFuY2VzXCIsIChyZXEsIHJlcywgbmV4dCkgLT5cblxuXHRpZiAhU3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrKHJlcSwgcmVzKVxuXHRcdHJldHVybiA7XG5cblx0dXNlcl9pZCA9IHJlcS51c2VySWRcblxuXHRzcGFjZUlkID0gcmVxLmhlYWRlcnNbXCJ4LXNwYWNlLWlkXCJdXG5cblx0aWYgbm90IHNwYWNlSWRcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLVNwYWNlLUlkXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRmbG93SWQgPSByZXEucXVlcnk/LmZsb3dJZFxuXG5cdGlmICFmbG93SWRcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAwLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBmbG93SWRcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdHF1ZXJ5ID0ge31cblxuXHRyZXRfc3luY190b2tlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG5cblx0Zmxvd0lkcyA9IGZsb3dJZC5zcGxpdChcIixcIilcblxuXG5cdGZsb3dzID0gZGIuZmxvd3MuZmluZCh7X2lkOiB7JGluOiBmbG93SWRzfX0pLmZldGNoKClcblxuXHRpID0gMFxuXHR3aGlsZSBpIDwgZmxvd3MubGVuZ3RoXG5cdFx0ZiA9IGZsb3dzW2ldXG5cdFx0c3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7c3BhY2U6IGYuc3BhY2UsIHVzZXI6IHVzZXJfaWR9KVxuXHRcdGlmICFzcGFjZVVzZXJcblx0XHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0ZGF0YTpcblx0XHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBObyBwZXJtaXNzaW9uLCBmbG93IGlzICN7Zi5faWR9XCIsXG5cdFx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0XHRyZXR1cm47XG5cdFx0ZWxzZVxuXG5cdCNcdOaYr+WQpuW3peS9nOWMuueuoeeQhuWRmFxuXHRcdGlmICFTdGVlZG9zLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VyX2lkKVxuXHRcdFx0c3BhY2VVc2VyT3JnYW5pemF0aW9ucyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG5cdFx0XHRcdF9pZDoge1xuXHRcdFx0XHRcdCRpbjogc3BhY2VVc2VyLm9yZ2FuaXphdGlvbnNcblx0XHRcdFx0fVxuXHRcdFx0fSkuZmV0Y2goKTtcblxuXHRcdFx0aWYgIVdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGYsIHNwYWNlVXNlciwgc3BhY2VVc2VyT3JnYW5pemF0aW9ucykgJiYgIVdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMpXG5cdFx0XHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0XHRcdGRhdGE6XG5cdFx0XHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBObyBwZXJtaXNzaW9uLCBmbG93IGlzICN7Zi5faWR9XCIsXG5cdFx0XHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRcdFx0cmV0dXJuO1xuXHRcdGkrK1xuXG5cblx0cXVlcnkuZmxvdyA9IHskaW46IGZsb3dJZHN9XG5cblx0cXVlcnkuc3BhY2UgPSBzcGFjZUlkXG5cblx0aWYgcmVxLnF1ZXJ5Py5zeW5jX3Rva2VuXG5cdFx0c3luY190b2tlbiA9IG5ldyBEYXRlKE51bWJlcihyZXEucXVlcnkuc3luY190b2tlbikpXG5cdFx0cXVlcnkubW9kaWZpZWQgPSB7JGd0OiBzeW5jX3Rva2VufVxuXG5cdGlmIHJlcS5xdWVyeT8uZmluYWxfZGVjaXNpb25cblx0XHRxdWVyeS5maW5hbF9kZWNpc2lvbiA9IHskaW4gOiByZXEucXVlcnkuZmluYWxfZGVjaXNpb24uc3BsaXQoXCIsXCIpfVxuXHRlbHNlXG5cdFx0cXVlcnkuZmluYWxfZGVjaXNpb24gPSB7JG5pbjogW1widGVybWluYXRlZFwiLCBcInJlamVjdGVkXCJdfVxuXG5cdGlmIHJlcS5xdWVyeT8uc3RhdGVcblx0XHRxdWVyeS5zdGF0ZSA9IHskaW46IHJlcS5xdWVyeS5zdGF0ZS5zcGxpdChcIixcIil9XG5cdGVsc2Vcblx0XHRxdWVyeS5zdGF0ZSA9IFwiY29tcGxldGVkXCJcblxuI1x05pyA5aSa6L+U5ZueNTAw5p2h5pWw5o2uXG5cdGluc3RhbmNlcyA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7ZmllbGRzOiB7aW5ib3hfdWVyczogMCwgY2NfdXNlcnM6IDAsIG91dGJveF91c2VyczogMCwgdHJhY2VzOiAwLCBhdHRhY2htZW50czogMH0sIHNraXA6IDAsIGxpbWl0OiA1MDB9KS5mZXRjaCgpXG5cdGluc3RhbmNlcy5mb3JFYWNoIChpbnN0YW5jZSktPlxuXG5cdFx0YXR0YWNobWVudHMgPSBjZnMuaW5zdGFuY2VzLmZpbmQoeydtZXRhZGF0YS5pbnN0YW5jZSc6IGluc3RhbmNlLl9pZCwnbWV0YWRhdGEuY3VycmVudCc6IHRydWUsIFwibWV0YWRhdGEuaXNfcHJpdmF0ZVwiOiB7JG5lOiB0cnVlfX0sIHtmaWVsZHM6IHtjb3BpZXM6IDB9fSkuZmV0Y2goKVxuXG5cdFx0aW5zdGFuY2UuYXR0YWNobWVudHMgPSBhdHRhY2htZW50c1xuXG5cblx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDIwMCxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwic3RhdHVzXCI6IFwic3VjY2Vzc1wiLFxuXHRcdFx0XHRcInN5bmNfdG9rZW5cIjogcmV0X3N5bmNfdG9rZW5cblx0XHRcdFx0XCJkYXRhXCI6IGluc3RhbmNlc1xuXHRyZXR1cm47XG4iLCJ2YXIgQ29va2llcywgZ2V0SW5zdGFuY2VSZWFkT25seTtcblxuQ29va2llcyA9IHJlcXVpcmUoXCJjb29raWVzXCIpO1xuXG5nZXRJbnN0YW5jZVJlYWRPbmx5ID0gZnVuY3Rpb24ocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpIHtcbiAgdmFyIF9oYXNQZXJtaXNzaW9uLCBfbG9jYWxlLCBfcGFyZW50X2luc3RhbmNlcywgZGF0YUJ1ZiwgZXJyb3IsIGhpZGVfdHJhY2VzLCBodG1sLCBpbnN0YW5jZSwgaW5zdGFuY2VJZCwgcmVmLCByZWYxLCBzcGFjZSwgc3BhY2VJZCwgc3BhY2VVc2VyQ291bnQsIHVzZXIsIHVzZXJJZDtcbiAgdXNlciA9IFN0ZWVkb3MuZ2V0QVBJTG9naW5Vc2VyKHJlcSwgcmVzKTtcbiAgaWYgKHJlcSAhPSBudWxsID8gKHJlZiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZi5hY2Nlc3NfdG9rZW4gOiB2b2lkIDAgOiB2b2lkIDApIHtcbiAgICB1c2VySWQgPSBTdGVlZG9zLmdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbihyZXEucXVlcnkuYWNjZXNzX3Rva2VuKTtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICB1c2VyID0gTWV0ZW9yLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHVzZXJJZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHNwYWNlSWQgPSByZXEucGFyYW1zLnNwYWNlO1xuICBpbnN0YW5jZUlkID0gcmVxLnBhcmFtcy5pbnN0YW5jZV9pZDtcbiAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgX2lkOiBpbnN0YW5jZUlkXG4gIH0pO1xuICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHtcbiAgICBfaWQ6IHNwYWNlSWRcbiAgfSk7XG4gIGhpZGVfdHJhY2VzID0gKHJlZjEgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYxLmhpZGVfdHJhY2VzIDogdm9pZCAwO1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgc2hvd1RyYWNlOiB0cnVlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLnNob3dUcmFjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGhpZGVfdHJhY2VzID09PSBcIjFcIikge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLnNob3dUcmFjZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBzaG93VHJhY2U6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAoIW9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzKSB7XG4gICAgb3B0aW9ucy5zaG93QXR0YWNobWVudHMgPSB0cnVlO1xuICB9XG4gIGlmICghc3BhY2UpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc3BhY2VcIixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgaW5zdGFuY2VcIixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdXNlcikge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLUF1dGgtVG9rZW4sWC1Vc2VyLUlkXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaW5zdGFuY2Uuc3BhY2UgIT09IHNwYWNlSWQpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc3BhY2Ugb3IgaW5zdGFuY2VcIixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNwYWNlVXNlckNvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgdXNlcjogdXNlci5faWQsXG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSkuY291bnQoKTtcbiAgaWYgKHNwYWNlVXNlckNvdW50ID09PSAwKSB7XG4gICAgaWYgKCFzcGFjZSkge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNhcGNlVXNlclwiLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgX2hhc1Blcm1pc3Npb24gPSBXb3JrZmxvd01hbmFnZXIuaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyh1c2VyLCBpbnN0YW5jZSk7XG4gIGlmICghX2hhc1Blcm1pc3Npb24gJiYgaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlKSB7XG4gICAgX3BhcmVudF9pbnN0YW5jZXMgPSBfLnVuaW9uKFtpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VdLCBpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzIHx8IFtdKTtcbiAgICBfaGFzUGVybWlzc2lvbiA9IF8uZmluZChfcGFyZW50X2luc3RhbmNlcywgZnVuY3Rpb24oX3BhcmVudF9pZCkge1xuICAgICAgdmFyIF9wYXJlbnRfaW5zO1xuICAgICAgX3BhcmVudF9pbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogX3BhcmVudF9pZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICB0cmFjZXM6IDBcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gV29ya2Zsb3dNYW5hZ2VyLmhhc0luc3RhbmNlUGVybWlzc2lvbnModXNlciwgX3BhcmVudF9pbnMpO1xuICAgIH0pO1xuICB9XG4gIGlmICghX2hhc1Blcm1pc3Npb24pIHtcbiAgICBfbG9jYWxlID0gU3RlZWRvcy5sb2NhbGUodXNlci5faWQsIHRydWUpO1xuICAgIGVycm9yID0gVEFQaTE4bi5fXyhcImluc3RhbmNlX3Blcm1pc3Npb25zX2Vycm9yXCIsIHt9LCBfbG9jYWxlKTtcbiAgICByZXMuY2hhcnNldCA9IFwidXRmLThcIjtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogZXJyb3IsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBodG1sID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICBkYXRhQnVmID0gbmV3IEJ1ZmZlcihodG1sKTtcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKTtcbiAgcmVzLnNldEhlYWRlcignY29udGVudC1yYW5nZScsIFwiYnl0ZXMgMC1cIiArIChkYXRhQnVmLmxlbmd0aCAtIDEpICsgXCIvXCIgKyBkYXRhQnVmLmxlbmd0aCk7XG4gIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICByZXR1cm4gcmVzLmVuZChodG1sKTtcbn07XG5cbkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZFwiLCBnZXRJbnN0YW5jZVJlYWRPbmx5KTtcblxuSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvcmVhZG9ubHkvOmluc3RhbmNlX2lkLzppbnN0YW5jZV9uYW1lXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBvcHRpb25zO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC1tc2Rvd25sb2FkJyk7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudDtmaWxlbmFtZT0nICsgZW5jb2RlVVJJKHJlcS5wYXJhbXMuaW5zdGFuY2VfbmFtZSkpO1xuICByZXMuc2V0SGVhZGVyKCdUcmFuc2Zlci1FbmNvZGluZycsICcnKTtcbiAgb3B0aW9ucyA9IHtcbiAgICBhYnNvbHV0ZTogdHJ1ZVxuICB9O1xuICByZXR1cm4gZ2V0SW5zdGFuY2VSZWFkT25seShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucyk7XG59KTtcblxuXG4vKlxuXHTojrflj5bnlLPor7fljZXliJfooajvvJpcbiAgICBmaW5hbF9kZWNpc2lvbu+8muWuoeaJuee7k+aenFxuICAgIHN0YXRlOiDnlLPor7fljZXnirbmgIFcbiAqL1xuXG5Kc29uUm91dGVzLmFkZChcImdldFwiLCBcIi9hcGkvd29ya2Zsb3cvaW5zdGFuY2VzXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBmLCBmbG93SWQsIGZsb3dJZHMsIGZsb3dzLCBpLCBpbnN0YW5jZXMsIHF1ZXJ5LCByZWYsIHJlZjEsIHJlZjIsIHJlZjMsIHJldF9zeW5jX3Rva2VuLCBzcGFjZUlkLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMsIHN5bmNfdG9rZW4sIHVzZXJfaWQ7XG4gIGlmICghU3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrKHJlcSwgcmVzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB1c2VyX2lkID0gcmVxLnVzZXJJZDtcbiAgc3BhY2VJZCA9IHJlcS5oZWFkZXJzW1wieC1zcGFjZS1pZFwiXTtcbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtU3BhY2UtSWRcIixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZsb3dJZCA9IChyZWYgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYuZmxvd0lkIDogdm9pZCAwO1xuICBpZiAoIWZsb3dJZCkge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBmbG93SWRcIixcbiAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHF1ZXJ5ID0ge307XG4gIHJldF9zeW5jX3Rva2VuID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIGZsb3dJZHMgPSBmbG93SWQuc3BsaXQoXCIsXCIpO1xuICBmbG93cyA9IGRiLmZsb3dzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBmbG93SWRzXG4gICAgfVxuICB9KS5mZXRjaCgpO1xuICBpID0gMDtcbiAgd2hpbGUgKGkgPCBmbG93cy5sZW5ndGgpIHtcbiAgICBmID0gZmxvd3NbaV07XG4gICAgc3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICBzcGFjZTogZi5zcGFjZSxcbiAgICAgIHVzZXI6IHVzZXJfaWRcbiAgICB9KTtcbiAgICBpZiAoIXNwYWNlVXNlcikge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBObyBwZXJtaXNzaW9uLCBmbG93IGlzIFwiICsgZi5faWQsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG5cbiAgICB9XG4gICAgaWYgKCFTdGVlZG9zLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VyX2lkKSkge1xuICAgICAgc3BhY2VVc2VyT3JnYW5pemF0aW9ucyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogc3BhY2VVc2VyLm9yZ2FuaXphdGlvbnNcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICAgIGlmICghV29ya2Zsb3dNYW5hZ2VyLmNhbk1vbml0b3IoZiwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zKSAmJiAhV29ya2Zsb3dNYW5hZ2VyLmNhbkFkbWluKGYsIHNwYWNlVXNlciwgc3BhY2VVc2VyT3JnYW5pemF0aW9ucykpIHtcbiAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBObyBwZXJtaXNzaW9uLCBmbG93IGlzIFwiICsgZi5faWQsXG4gICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGkrKztcbiAgfVxuICBxdWVyeS5mbG93ID0ge1xuICAgICRpbjogZmxvd0lkc1xuICB9O1xuICBxdWVyeS5zcGFjZSA9IHNwYWNlSWQ7XG4gIGlmICgocmVmMSA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjEuc3luY190b2tlbiA6IHZvaWQgMCkge1xuICAgIHN5bmNfdG9rZW4gPSBuZXcgRGF0ZShOdW1iZXIocmVxLnF1ZXJ5LnN5bmNfdG9rZW4pKTtcbiAgICBxdWVyeS5tb2RpZmllZCA9IHtcbiAgICAgICRndDogc3luY190b2tlblxuICAgIH07XG4gIH1cbiAgaWYgKChyZWYyID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmMi5maW5hbF9kZWNpc2lvbiA6IHZvaWQgMCkge1xuICAgIHF1ZXJ5LmZpbmFsX2RlY2lzaW9uID0ge1xuICAgICAgJGluOiByZXEucXVlcnkuZmluYWxfZGVjaXNpb24uc3BsaXQoXCIsXCIpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBxdWVyeS5maW5hbF9kZWNpc2lvbiA9IHtcbiAgICAgICRuaW46IFtcInRlcm1pbmF0ZWRcIiwgXCJyZWplY3RlZFwiXVxuICAgIH07XG4gIH1cbiAgaWYgKChyZWYzID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmMy5zdGF0ZSA6IHZvaWQgMCkge1xuICAgIHF1ZXJ5LnN0YXRlID0ge1xuICAgICAgJGluOiByZXEucXVlcnkuc3RhdGUuc3BsaXQoXCIsXCIpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBxdWVyeS5zdGF0ZSA9IFwiY29tcGxldGVkXCI7XG4gIH1cbiAgaW5zdGFuY2VzID0gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGluYm94X3VlcnM6IDAsXG4gICAgICBjY191c2VyczogMCxcbiAgICAgIG91dGJveF91c2VyczogMCxcbiAgICAgIHRyYWNlczogMCxcbiAgICAgIGF0dGFjaG1lbnRzOiAwXG4gICAgfSxcbiAgICBza2lwOiAwLFxuICAgIGxpbWl0OiA1MDBcbiAgfSkuZmV0Y2goKTtcbiAgaW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICB2YXIgYXR0YWNobWVudHM7XG4gICAgYXR0YWNobWVudHMgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuICAgICAgJ21ldGFkYXRhLmluc3RhbmNlJzogaW5zdGFuY2UuX2lkLFxuICAgICAgJ21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuICAgICAgXCJtZXRhZGF0YS5pc19wcml2YXRlXCI6IHtcbiAgICAgICAgJG5lOiB0cnVlXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGNvcGllczogMFxuICAgICAgfVxuICAgIH0pLmZldGNoKCk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gIH0pO1xuICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgY29kZTogMjAwLFxuICAgIGRhdGE6IHtcbiAgICAgIFwic3RhdHVzXCI6IFwic3VjY2Vzc1wiLFxuICAgICAgXCJzeW5jX3Rva2VuXCI6IHJldF9zeW5jX3Rva2VuLFxuICAgICAgXCJkYXRhXCI6IGluc3RhbmNlc1xuICAgIH1cbiAgfSk7XG59KTtcbiIsIlxuSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvc3RlZWRvcy1jc3NcIiwgKHJlcSwgcmVzLCBuZXh0KS0+XG5cdHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2NzcycpO1xuXHRhbGxDc3MgPSBXZWJBcHAuZ2V0UmVmcmVzaGFibGVBc3NldHMoKVxuXG5cdGFsbENzc0xpbmsgPSBcIlwiXG5cblx0YWxsQ3NzLmZvckVhY2ggKGNzcykgLT5cblx0XHRpZiBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYXG5cdFx0XHRyb290VXJsID0gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTFxuXHRcdFx0aWYgcm9vdFVybC5lbmRzV2l0aChcIi9cIilcblx0XHRcdFx0Y3NzSHJlZiA9IHJvb3RVcmwucmVwbGFjZShfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYICsgXCIvXCIsIFwiXCIpICsgY3NzLnVybFxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjc3NIcmVmID0gcm9vdFVybC5yZXBsYWNlKF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVgsIFwiXCIpICsgY3NzLnVybFxuXHRcdGVsc2Vcblx0XHRcdGNzc0hyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoY3NzLnVybClcblx0XHRhbGxDc3NMaW5rICs9IFwiQGltcG9ydCB1cmwoI3tjc3NIcmVmfSk7XCJcblxuXHRyZXMuc3RhdHVzQ29kZSA9IDIwMFxuXHRyZXMuZW5kKGFsbENzc0xpbmspIiwiSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvc3RlZWRvcy1jc3NcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGFsbENzcywgYWxsQ3NzTGluaztcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvY3NzJyk7XG4gIGFsbENzcyA9IFdlYkFwcC5nZXRSZWZyZXNoYWJsZUFzc2V0cygpO1xuICBhbGxDc3NMaW5rID0gXCJcIjtcbiAgYWxsQ3NzLmZvckVhY2goZnVuY3Rpb24oY3NzKSB7XG4gICAgdmFyIGNzc0hyZWYsIHJvb3RVcmw7XG4gICAgaWYgKF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVgpIHtcbiAgICAgIHJvb3RVcmwgPSBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMO1xuICAgICAgaWYgKHJvb3RVcmwuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIGNzc0hyZWYgPSByb290VXJsLnJlcGxhY2UoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCArIFwiL1wiLCBcIlwiKSArIGNzcy51cmw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjc3NIcmVmID0gcm9vdFVybC5yZXBsYWNlKF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVgsIFwiXCIpICsgY3NzLnVybDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3NzSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChjc3MudXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbENzc0xpbmsgKz0gXCJAaW1wb3J0IHVybChcIiArIGNzc0hyZWYgKyBcIik7XCI7XG4gIH0pO1xuICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgcmV0dXJuIHJlcy5lbmQoYWxsQ3NzTGluayk7XG59KTtcbiIsIkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL2FwaS93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9kcmFmdC86Zmxvd1wiLCAocmVxLCByZXMsIG5leHQpIC0+XG5cdGlmICFTdGVlZG9zLkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2socmVxLCByZXMpXG5cdFx0cmV0dXJuXG5cblx0dXNlcl9pZCA9IHJlcS51c2VySWRcblxuXHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7IF9pZDogdXNlcl9pZCB9KVxuXG5cdHNwYWNlSWQgPSByZXEucGFyYW1zLnNwYWNlXG5cblx0Zmxvd0lkID0gcmVxLnBhcmFtcy5mbG93XG5cblx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7IF9pZDogc3BhY2VJZCB9KVxuXG5cdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHsgX2lkOiBmbG93SWQgfSwgeyBmaWVsZHM6IHsgbmFtZTogMSwgJ2N1cnJlbnQuX2lkJzogMSwgZm9ybTogMSB9IH0pXG5cblx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoeyBfaWQ6IGZsb3cuZm9ybSB9LCB7IGZpZWxkczogeyAnY3VycmVudC5faWQnOiAxIH0gfSlcblxuXHRvcHRpb25zID0ge1xuXHRcdHNob3dUcmFjZTogZmFsc2UsXG5cdFx0c2hvd0F0dGFjaG1lbnRzOiBmYWxzZSxcblx0XHR0ZW1wbGF0ZU5hbWU6IFwiZGVmYXVsdFwiLFxuXHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRpbnN0YW5jZV9zdHlsZTogXCJpbnN0YW5jZS1kZWZhdWx0XCIsXG5cdFx0cGx1Z2luczogXCJcIlwiXG5cblx0XHRcdDxtZXRhIGh0dHAtZXF1aXY9XCJYLVVBLUNvbXBhdGlibGVcIiBjb250ZW50PVwiSUU9ZWRnZSxjaHJvbWU9MVwiIC8+XG5cdFx0XHQ8bWV0YSBuYW1lPVwiZm9ybWF0LWRldGVjdGlvblwiIGNvbnRlbnQ9XCJ0ZWxlcGhvbmU9bm9cIj5cblx0XHRcdDxtZXRhIGh0dHAtZXF1aXY9XCJ4LXJpbS1hdXRvLW1hdGNoXCIgY29udGVudD1cIm5vbmVcIj5cblx0XHRcdDx0aXRsZT4je2Zsb3cubmFtZX08L3RpdGxlPlxuXHRcdFx0PG1ldGEgY29udGVudD0nd2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9MCcgbmFtZT0ndmlld3BvcnQnIC8+XG5cdFx0XHQ8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoXCIgLz5cblxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvY3NzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci5taW4uY3NzXCI+XG5cblx0XHRcdDxzY3JpcHQgc3JjPVwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2pzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci5taW4uanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cblx0XHRcdDxzY3JpcHQgc3JjPVwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2pzL2xvY2FsZXMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLnpoLUNOLmpzXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIGNoYXJzZXQ9XCJVVEYtOFwiPjwvc2NyaXB0PlxuXG5cdFx0XHQ8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIi9wbHVnaW5zL3RvYXN0ci90b2FzdHIubWluLmNzc1wiPlxuXHRcdFx0PHNjcmlwdCBzcmM9XCIvcGx1Z2lucy90b2FzdHIvdG9hc3RyLm1pbi5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblx0XHRcdDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiL2pzL3dvcmtmbG93X2NsaWVudC5jc3NcIj5cblx0XHRcdDxzY3JpcHQgc3JjPVwiL2pzL3dvcmtmbG93X2NsaWVudC5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblx0XHRcIlwiXCJcblx0fVxuXG5cdGluc3RhbmNlID0ge1xuXHRcdGZsb3c6IGZsb3cuX2lkLFxuXHRcdGZsb3dfdmVyc2lvbjogZmxvdy5jdXJyZW50Ll9pZCxcblx0XHRmb3JtOiBmb3JtLl9pZCxcblx0XHRmb3JtX3ZlcnNpb246IGZvcm0uY3VycmVudC5faWQsXG5cdFx0dmFsdWVzOiB7fSxcblx0XHRuYW1lOiBmbG93Lm5hbWUsXG5cdFx0c3BhY2U6IHNwYWNlSWRcblx0fVxuXG5cdGh0bWwgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucylcblxuXHRkYXRhQnVmID0gbmV3IEJ1ZmZlcihodG1sKVxuXG5cdHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJywgZGF0YUJ1Zi5sZW5ndGgpXG5cblx0cmVzLnNldEhlYWRlcignY29udGVudC1yYW5nZScsIFwiYnl0ZXMgMC0je2RhdGFCdWYubGVuZ3RoIC0gMX0vI3tkYXRhQnVmLmxlbmd0aH1cIilcblxuXHRyZXMuc3RhdHVzQ29kZSA9IDIwMFxuXG5cdHJlcy5lbmQoaHRtbClcbiIsIkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL2FwaS93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9kcmFmdC86Zmxvd1wiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZGF0YUJ1ZiwgZmxvdywgZmxvd0lkLCBmb3JtLCBodG1sLCBpbnN0YW5jZSwgb3B0aW9ucywgc3BhY2UsIHNwYWNlSWQsIHVzZXIsIHVzZXJfaWQ7XG4gIGlmICghU3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrKHJlcSwgcmVzKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB1c2VyX2lkID0gcmVxLnVzZXJJZDtcbiAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgIF9pZDogdXNlcl9pZFxuICB9KTtcbiAgc3BhY2VJZCA9IHJlcS5wYXJhbXMuc3BhY2U7XG4gIGZsb3dJZCA9IHJlcS5wYXJhbXMuZmxvdztcbiAgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7XG4gICAgX2lkOiBzcGFjZUlkXG4gIH0pO1xuICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7XG4gICAgX2lkOiBmbG93SWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgICdjdXJyZW50Ll9pZCc6IDEsXG4gICAgICBmb3JtOiAxXG4gICAgfVxuICB9KTtcbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgIF9pZDogZmxvdy5mb3JtXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgICdjdXJyZW50Ll9pZCc6IDFcbiAgICB9XG4gIH0pO1xuICBvcHRpb25zID0ge1xuICAgIHNob3dUcmFjZTogZmFsc2UsXG4gICAgc2hvd0F0dGFjaG1lbnRzOiBmYWxzZSxcbiAgICB0ZW1wbGF0ZU5hbWU6IFwiZGVmYXVsdFwiLFxuICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICBpbnN0YW5jZV9zdHlsZTogXCJpbnN0YW5jZS1kZWZhdWx0XCIsXG4gICAgcGx1Z2luczogXCJcXG48bWV0YSBodHRwLWVxdWl2PVxcXCJYLVVBLUNvbXBhdGlibGVcXFwiIGNvbnRlbnQ9XFxcIklFPWVkZ2UsY2hyb21lPTFcXFwiIC8+XFxuPG1ldGEgbmFtZT1cXFwiZm9ybWF0LWRldGVjdGlvblxcXCIgY29udGVudD1cXFwidGVsZXBob25lPW5vXFxcIj5cXG48bWV0YSBodHRwLWVxdWl2PVxcXCJ4LXJpbS1hdXRvLW1hdGNoXFxcIiBjb250ZW50PVxcXCJub25lXFxcIj5cXG48dGl0bGU+XCIgKyBmbG93Lm5hbWUgKyBcIjwvdGl0bGU+XFxuPG1ldGEgY29udGVudD0nd2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgbWF4aW11bS1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9MCcgbmFtZT0ndmlld3BvcnQnIC8+XFxuPG1ldGEgbmFtZT1cXFwidmlld3BvcnRcXFwiIGNvbnRlbnQ9XFxcIndpZHRoPWRldmljZS13aWR0aFxcXCIgLz5cXG5cXG48bGluayByZWw9XFxcInN0eWxlc2hlZXRcXFwiIHR5cGU9XFxcInRleHQvY3NzXFxcIiBocmVmPVxcXCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvY3NzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci5taW4uY3NzXFxcIj5cXG5cXG48c2NyaXB0IHNyYz1cXFwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2pzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci5taW4uanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCI+PC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCBzcmM9XFxcIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9sb2NhbGVzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci56aC1DTi5qc1xcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIiBjaGFyc2V0PVxcXCJVVEYtOFxcXCI+PC9zY3JpcHQ+XFxuXFxuPGxpbmsgcmVsPVxcXCJzdHlsZXNoZWV0XFxcIiB0eXBlPVxcXCJ0ZXh0L2Nzc1xcXCIgaHJlZj1cXFwiL3BsdWdpbnMvdG9hc3RyL3RvYXN0ci5taW4uY3NzXFxcIj5cXG48c2NyaXB0IHNyYz1cXFwiL3BsdWdpbnMvdG9hc3RyL3RvYXN0ci5taW4uanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCI+PC9zY3JpcHQ+XFxuPGxpbmsgcmVsPVxcXCJzdHlsZXNoZWV0XFxcIiB0eXBlPVxcXCJ0ZXh0L2Nzc1xcXCIgaHJlZj1cXFwiL2pzL3dvcmtmbG93X2NsaWVudC5jc3NcXFwiPlxcbjxzY3JpcHQgc3JjPVxcXCIvanMvd29ya2Zsb3dfY2xpZW50LmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0PlwiXG4gIH07XG4gIGluc3RhbmNlID0ge1xuICAgIGZsb3c6IGZsb3cuX2lkLFxuICAgIGZsb3dfdmVyc2lvbjogZmxvdy5jdXJyZW50Ll9pZCxcbiAgICBmb3JtOiBmb3JtLl9pZCxcbiAgICBmb3JtX3ZlcnNpb246IGZvcm0uY3VycmVudC5faWQsXG4gICAgdmFsdWVzOiB7fSxcbiAgICBuYW1lOiBmbG93Lm5hbWUsXG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfTtcbiAgaHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgZGF0YUJ1ZiA9IG5ldyBCdWZmZXIoaHRtbCk7XG4gIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJywgZGF0YUJ1Zi5sZW5ndGgpO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXJhbmdlJywgXCJieXRlcyAwLVwiICsgKGRhdGFCdWYubGVuZ3RoIC0gMSkgKyBcIi9cIiArIGRhdGFCdWYubGVuZ3RoKTtcbiAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gIHJldHVybiByZXMuZW5kKGh0bWwpO1xufSk7XG4iLCJBcnJheS5wcm90b3R5cGUuZmlsdGVyUHJvcGVydHkgPSBmdW5jdGlvbihoLCBsKXtcbiAgICB2YXIgZyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih0KXtcbiAgICAgICAgdmFyIG0gPSB0PyB0W2hdOm51bGw7XG4gICAgICAgIHZhciBkID0gZmFsc2U7XG4gICAgICAgIGlmKG0gaW5zdGFuY2VvZiBBcnJheSl7XG4gICAgICAgICAgICBkID0gbS5pbmNsdWRlcyhsKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBkID0gKGwgPT09IHVuZGVmaW5lZCk/IGZhbHNlOm09PWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZCl7XG4gICAgICAgICAgICBnLnB1c2godCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZztcbn07XG5cbkFycmF5LnByb3RvdHlwZS5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKGspe1xuICAgIHZhciB2ID0gbmV3IEFycmF5KCk7XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe1xuICAgICAgICB2YXIgbSA9IHQ/IHRba106bnVsbDtcbiAgICAgICAgdi5wdXNoKG0pO1xuICAgIH0pO1xuICAgIHJldHVybiB2O1xufVxuXG5BcnJheS5wcm90b3R5cGUuZ2V0RWFjaCA9IGZ1bmN0aW9uKGNvZGUpe1xuICAgIHZhciByZXYgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwIDsgaSA8IHRoaXMubGVuZ3RoIDsgaSsrKXtcbiAgICAgICAgcmV2LnB1c2godGhpc1tpXVtjb2RlXSk7XG4gICAgfVxuICAgIHJldHVybiByZXY7XG59O1xuXG5BcnJheS5wcm90b3R5cGUudW5pcSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oYil7IFxuICAgICAgICBpZihhLmluZGV4T2YoYikgPCAwKVxuICAgICAgICAgICAge2FbYS5sZW5ndGhdID0gYn1cbiAgICB9KTtcbiAgICByZXR1cm4gYTtcbn07XG5cbkZvcm1fZm9ybXVsYSA9IHt9O1xuXG5cbkZvcm1fZm9ybXVsYS5taXhpbiA9IGZ1bmN0aW9uKGRlc3QsIHNyYyl7XG4gICAgZm9yKHZhciBrZXkgaW4gc3JjKXtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufTtcblxuXG5Gb3JtX2Zvcm11bGEuaGFuZGVyVXNlck9iamVjdCA9IGZ1bmN0aW9uKHUpe1xuXG4gICAgaWYodSBpbnN0YW5jZW9mIEFycmF5KXtcbiAgICAgICAgdmFyIHVzZXIgPSB7fTtcblxuICAgICAgICB1c2VyLm5hbWUgPSB1LmdldFByb3BlcnR5KFwibmFtZVwiKVxuICAgICAgICB1c2VyLm9yZ2FuaXphdGlvbiA9IHt9O1xuICAgICAgICB1c2VyLm9yZ2FuaXphdGlvbi5uYW1lID0gdS5nZXRQcm9wZXJ0eShcIm9yZ2FuaXphdGlvblwiKS5nZXRQcm9wZXJ0eShcIm5hbWVcIik7XG4gICAgICAgIHVzZXIub3JnYW5pemF0aW9uLmZ1bGxuYW1lID0gdS5nZXRQcm9wZXJ0eShcIm9yZ2FuaXphdGlvblwiKS5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpO1xuXG4gICAgICAgIHVzZXIuaHIgPSB1LmdldFByb3BlcnR5KFwiaHJcIilcblxuICAgICAgICB1c2VyLnNvcnRfbm8gPSB1LmdldFByb3BlcnR5KFwic29ydF9ub1wiKVxuXG5cdFx0dXNlci5tb2JpbGUgPSB1LmdldFByb3BlcnR5KFwibW9iaWxlXCIpXG5cblx0XHR1c2VyLndvcmtfcGhvbmUgPSB1LmdldFByb3BlcnR5KFwid29ya19waG9uZVwiKVxuXG5cdFx0dXNlci5wb3NpdGlvbiA9IHUuZ2V0UHJvcGVydHkoXCJwb3NpdGlvblwiKVxuXG4gICAgICAgIHZhciB1c2VyUm9sZXMgPSB1LmdldFByb3BlcnR5KFwicm9sZXNcIik7XG4gICAgICAgIHZhciByb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB1c2VyUm9sZXMuZm9yRWFjaChmdW5jdGlvbihpKXtcbiAgICAgICAgICAgIHJvbGVzID0gcm9sZXMuY29uY2F0KGkpO1xuICAgICAgICB9KTsgXG4gICAgICAgIHJvbGVzLnVuaXEoKTtcbiAgICAgICAgdXNlci5yb2xlcyA9IHJvbGVzO1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIHU7XG4gICAgfVxufVxuXG5Gb3JtX2Zvcm11bGEuaGFuZGVyT3JnT2JqZWN0ID0gZnVuY3Rpb24obyl7XG5cbiAgICBpZihvIGluc3RhbmNlb2YgQXJyYXkpe1xuICAgICAgICB2YXIgb3JnID0ge307XG5cdFx0b3JnLmlkID0gby5nZXRQcm9wZXJ0eShcIl9pZFwiKTtcbiAgICAgICAgb3JnLm5hbWUgPSBvLmdldFByb3BlcnR5KFwibmFtZVwiKTtcbiAgICAgICAgb3JnLmZ1bGxuYW1lID0gby5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpO1xuXG4gICAgICAgIHJldHVybiBvcmc7XG4gICAgfWVsc2V7XG4gICAgICAgIHJldHVybiBvO1xuICAgIH1cbn1cblxuXG5cbi8qKlxuICAgICog6I635b6X5YWs5byP6ZyA6KaB55So5Yiw55qE5Yid5aeL5YC8XG4gICAgKiDovpPlhaXvvJpmaWVsZHMsIHZhbHVlcywgYXBwbGljYW50XG4gICAgKiDovpPlh7rvvJpfX3ZhbHVlc1xuKiovXG5Gb3JtX2Zvcm11bGEuaW5pdF9mb3JtdWxhX3ZhbHVlcyA9IGZ1bmN0aW9uKGZpZWxkcywgYXV0b0Zvcm1Eb2MsIGFwcHJvdmVyLCBhcHBsaWNhbnQsIHNwYWNlSWQpe1xuICAgIHZhciBfX3ZhbHVlcyA9IHt9O1xuICAgIC8v55Sz6K+35Y2V5Lit5aGr55qE5YC85aSE55CGXG4gICAgaWYoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggJiYgYXV0b0Zvcm1Eb2MpIHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpe1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBmaWVsZC50eXBlO1xuICAgICAgICAgICAgaWYodHlwZSkge1xuICAgICAgICAgICAgICAgIGlmKHR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgKiDlsIbooajmoLzlrZfmrrXnmoTlgLzov5vooYzovazmjaLlkI7kvKDlhaVfX3ZhbHVlc+S4rVxuICAgICAgICAgICAgICAgICAgICAqIHZhbHVlc+S4reihqOagvOeahOWAvOagvOW8j+S4ulxuICAgICAgICAgICAgICAgICAgICAqIFt7XCJhXCI6MSxcImJcIjo0fSx7XCJhXCI6MixcImJcIjo1fSx7XCJhXCI6MyxcImJcIjo2fV1cbiAgICAgICAgICAgICAgICAgICAgKiBfX3ZhbHVlc+mcgOimgei9rOWMluS4uuS4i+mdouagvOW8j+S4lOWSjOS4u+ihqOeahOWAvOS4gOagt+aUvuWIsOesrOS4gOWxglxuICAgICAgICAgICAgICAgICAgICAqIHtcImFcIjpbMSwyLDNdLFwiYlwiOls0LDUsNl19XG4gICAgICAgICAgICAgICAgICAgICoqL1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVGaWVsZHMgPSBmaWVsZC5zZmllbGRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVWYWx1ZXMgPSBhdXRvRm9ybURvY1tmaWVsZC5jb2RlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFUYWJsZVZhbHVlcyA9IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgX190YWJsZVZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAvL+aMieWFrOW8j+eahOagvOW8j+i9rOaNouWAvOS4ul9fdGFibGVWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYodGFibGVGaWVsZHMgJiYgdGFibGVGaWVsZHMubGVuZ3RoICYmIHRhYmxlVmFsdWVzICYmIHRhYmxlVmFsdWVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlVmFsdWVzLmZvckVhY2goZnVuY3Rpb24odGFibGVWYWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYVRhYmxlVmFsdWVzLnB1c2goRm9ybV9mb3JtdWxhLmluaXRfZm9ybXVsYV92YWx1ZXModGFibGVGaWVsZHMsIHRhYmxlVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy/mjInkuLvooajnmoTmoLzlvI/ovazmjaJfX3RhYmxlVmFsdWVz5Yqg5YiwXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKHRhYmxlZmllbGQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGVWYWx1ZXNbdGFibGVmaWVsZC5jb2RlXSA9IGZvcm11bGFUYWJsZVZhbHVlcy5nZXRFYWNoKHRhYmxlZmllbGQuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fdmFsdWVzID0gRm9ybV9mb3JtdWxhLm1peGluKF9fdmFsdWVzLCBfX3RhYmxlVmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndXNlcicpe1xuICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlc1tmaWVsZC5jb2RlXSA9IEZvcm1fZm9ybXVsYS5oYW5kZXJVc2VyT2JqZWN0KFdvcmtmbG93TWFuYWdlci5nZXRGb3JtdWxhVXNlck9iamVjdHMoc3BhY2VJZCwgYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV0pKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZ3JvdXAnKXtcbiAgICAgICAgICAgICAgICAgICAgX192YWx1ZXNbZmllbGQuY29kZV0gPSBGb3JtX2Zvcm11bGEuaGFuZGVyT3JnT2JqZWN0KFdvcmtmbG93TWFuYWdlci5nZXRGb3JtdWxhT3JnT2JqZWN0cyhhdXRvRm9ybURvY1tmaWVsZC5jb2RlXSkpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdvZGF0YScpe1xuXHRcdFx0XHRcdF9fdmFsdWVzW2ZpZWxkLmNvZGVdID0gYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV0gfHwge31cblxuXHRcdFx0XHR9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL+atpOWkhOS8oHNwYWNlSWTnu5npgInkurrmjqfku7bnmoTml6fmlbDmja7orqHnrpdyb2xlc+WSjG9yZ2FuaXphdGlvblxuICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlc1tmaWVsZC5jb2RlXSA9IGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICAgIC8v5b2T5YmN5aSE55CG5Lq6XG4gICAgX192YWx1ZXNbXCJhcHByb3ZlclwiXSA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtdWxhVXNlck9iamVjdChzcGFjZUlkLCBhcHByb3Zlcik7XG4gICAgLy/nlLPor7fkurpcbiAgICBfX3ZhbHVlc1tcImFwcGxpY2FudFwiXSA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtdWxhVXNlck9iamVjdChzcGFjZUlkLCBhcHBsaWNhbnQpO1xuXG4gICAgcmV0dXJuIF9fdmFsdWVzO1xufTtcblxuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2NhdGVnb3JpZXMnLCAoc3BhY2VJZCkgLT5cblx0Y2hlY2sgc3BhY2VJZCwgU3RyaW5nXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmNhdGVnb3JpZXMuZmluZCh7IHNwYWNlOiBzcGFjZUlkIH0sIHsgZmllbGRzOiB7IG5hbWU6IDEsIHNwYWNlOiAxLCBzb3J0X25vOiAxLCBhcHA6IDEgfSB9KSIsIk1ldGVvci5wdWJsaXNoKCdjYXRlZ29yaWVzJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBjaGVjayhzcGFjZUlkLCBTdHJpbmcpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5jYXRlZ29yaWVzLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIHNvcnRfbm86IDEsXG4gICAgICBhcHA6IDFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJcbk1ldGVvci5wdWJsaXNoICdjZnNfaW5zdGFuY2VzJywgKGluc3RhbmNlSWRzKS0+XG5cdGNoZWNrKGluc3RhbmNlSWRzLCBBcnJheSlcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGluc3RhbmNlSWRzXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGNmcy5pbnN0YW5jZXMuZmluZCh7J21ldGFkYXRhLmluc3RhbmNlJzogeyRpbjogaW5zdGFuY2VJZHN9ICwgJG9yOiBbeydtZXRhZGF0YS5pc19wcml2YXRlJzogeyRuZTogdHJ1ZX19LHsnbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHRydWUsIFwibWV0YWRhdGEub3duZXJcIjogdGhpcy51c2VySWR9XX0pXG4iLCJNZXRlb3IucHVibGlzaCgnY2ZzX2luc3RhbmNlcycsIGZ1bmN0aW9uKGluc3RhbmNlSWRzKSB7XG4gIGNoZWNrKGluc3RhbmNlSWRzLCBBcnJheSk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghaW5zdGFuY2VJZHMpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuICAgICdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcbiAgICAgICRpbjogaW5zdGFuY2VJZHNcbiAgICB9LFxuICAgICRvcjogW1xuICAgICAge1xuICAgICAgICAnbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHtcbiAgICAgICAgICAkbmU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICAnbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHRydWUsXG4gICAgICAgIFwibWV0YWRhdGEub3duZXJcIjogdGhpcy51c2VySWRcbiAgICAgIH1cbiAgICBdXG4gIH0pO1xufSk7XG4iLCJcblxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfcG9zaXRpb25zJywgKHNwYWNlSWQpLT5cblx0XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBkYi5mbG93X3Bvc2l0aW9ucy5maW5kKHtzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtyb2xlOjEsIHVzZXJzOiAxLCBvcmc6IDF9fSk7XG4iLCJNZXRlb3IucHVibGlzaCgnZmxvd19wb3NpdGlvbnMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZsb3dfcG9zaXRpb25zLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHJvbGU6IDEsXG4gICAgICB1c2VyczogMSxcbiAgICAgIG9yZzogMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlICdmbG93X3Bvc2l0aW9uc190YWJ1bGFyJywgKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0Y2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuXHRjaGVjayhpZHMsIEFycmF5KTtcblx0Y2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dGhpcy51bmJsb2NrKClcblxuXHRmaW5kOiAtPlxuXHRcdHRoaXMudW5ibG9jaygpXG5cdFx0ZGIuZmxvd19wb3NpdGlvbnMuZmluZCB7X2lkOiB7JGluOiBpZHN9fSwgZmllbGRzOiBmaWVsZHNcblxuXHRjaGlsZHJlbjogW1xuXHRcdHtcblx0XHRcdGZpbmQ6IChwb3NpdGlvbikgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgZmxvd19yb2xlc1xuXHRcdFx0XHRkYi5mbG93X3JvbGVzLmZpbmQgeyBfaWQ6IHBvc2l0aW9uLnJvbGUgfSwgZmllbGRzOiBuYW1lOiAxXG5cdFx0fVxuXHRcdHtcblx0XHRcdGZpbmQ6IChwb3NpdGlvbikgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgb3JnYW5pemF0aW9uc1xuXHRcdFx0XHRkYi5vcmdhbml6YXRpb25zLmZpbmQgeyBfaWQ6IHBvc2l0aW9uLm9yZyB9LCBmaWVsZHM6IGZ1bGxuYW1lOiAxXG5cdFx0fVxuXHRcdHtcblx0XHRcdGZpbmQ6IChwb3NpdGlvbikgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgdXNlclxuXHRcdFx0XHRkYi5zcGFjZV91c2Vycy5maW5kIHtcblx0XHRcdFx0XHRzcGFjZTogcG9zaXRpb24uc3BhY2Vcblx0XHRcdFx0XHR1c2VyOiAkaW46IHBvc2l0aW9uLnVzZXJzXG5cdFx0XHRcdH0sIGZpZWxkczpcblx0XHRcdFx0XHRzcGFjZTogMVxuXHRcdFx0XHRcdHVzZXI6IDFcblx0XHRcdFx0XHRuYW1lOiAxXG5cdFx0fVxuXHRdIiwiTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUoJ2Zsb3dfcG9zaXRpb25zX3RhYnVsYXInLCBmdW5jdGlvbih0YWJsZU5hbWUsIGlkcywgZmllbGRzKSB7XG4gIGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHRoaXMudW5ibG9jaygpO1xuICByZXR1cm4ge1xuICAgIGZpbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICByZXR1cm4gZGIuZmxvd19wb3NpdGlvbnMuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogaWRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2hpbGRyZW46IFtcbiAgICAgIHtcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocG9zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIuZmxvd19yb2xlcy5maW5kKHtcbiAgICAgICAgICAgIF9pZDogcG9zaXRpb24ucm9sZVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBuYW1lOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocG9zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcbiAgICAgICAgICAgIF9pZDogcG9zaXRpb24ub3JnXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIGZ1bGxuYW1lOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmluZDogZnVuY3Rpb24ocG9zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgICAgICAgICBzcGFjZTogcG9zaXRpb24uc3BhY2UsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICRpbjogcG9zaXRpb24udXNlcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICAgIHVzZXI6IDEsXG4gICAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn0pO1xuIiwiXG5cblx0TWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfcm9sZXMnLCAoc3BhY2VJZCktPlxuXHRcdFxuXHRcdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXHRcdFxuXHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRcdHJldHVybiBkYi5mbG93X3JvbGVzLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczoge25hbWU6MX19KTtcbiIsIk1ldGVvci5wdWJsaXNoKCdmbG93X3JvbGVzJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93X3JvbGVzLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnZmxvd3MnLCAoc3BhY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0IyDnrKzkuIDmrKHorqLpmIXml7bliJ3lp4vljJblt6XkvZzljLpcblx0aWYgZGIuZmxvd3MuZmluZCh7c3BhY2U6IHNwYWNlSWR9KS5jb3VudCgpID09IDBcblx0XHRkYi5zcGFjZXMuY3JlYXRlVGVtcGxhdGVGb3JtQW5kRmxvdyhzcGFjZUlkKVxuXG5cdHJldHVybiBkYi5mbG93cy5maW5kKHtzcGFjZTogc3BhY2VJZH0sIHtcblx0XHRmaWVsZHM6IHtcblx0XHRcdG5hbWU6IDEsXG5cdFx0XHRmb3JtOiAxLFxuXHRcdFx0c3RhdGU6IDEsXG5cdFx0XHRwZXJtczogMSxcblx0XHRcdHNwYWNlOiAxLFxuXHRcdFx0Y29tcGFueV9pZDogMSxcblx0XHRcdHNvcnRfbm86IDEsXG5cdFx0XHRkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuXHRcdFx0ZW5hYmxlX2FtaXNmb3JtOiAxXG5cdFx0fVxuXHR9KVxuXG5NZXRlb3IucHVibGlzaCAnaW5zdGFuY2VfZmxvdycsIChzcGFjZUlkLCBmbG93SWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBmbG93SWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLmZsb3dzLmZpbmQoe19pZDogZmxvd0lkLCBzcGFjZTogc3BhY2VJZH0sIHtcblx0XHRmaWVsZHM6IHtcblx0XHRcdG5hbWU6IDEsXG5cdFx0XHRmb3JtOiAxLFxuXHRcdFx0c3RhdGU6IDEsXG5cdFx0XHRwZXJtczogMSxcblx0XHRcdHNwYWNlOiAxLFxuXHRcdFx0Y29tcGFueV9pZDogMSxcblx0XHRcdHNvcnRfbm86IDEsXG5cdFx0XHRkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuXHRcdFx0ZW5hYmxlX2FtaXNmb3JtOiAxXG5cdFx0fVxuXHR9KVxuXG5cbk1ldGVvci5wdWJsaXNoICdmbG93X3ZlcnNpb24nLCAoc3BhY2VJZCwgZmxvd0lkLCB2ZXJzaW9uSWQpIC0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyB2ZXJzaW9uSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRzZWxmID0gdGhpcztcblxuXHRnZXRGbG93VmVyc2lvbiA9IChpZCAsIHZlcnNpb25JZCktPlxuXHRcdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtfaWQgOiBpZH0pO1xuXHRcdGlmIGZsb3dcblx0XHRcdGZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudFxuXHRcdFx0Zmxvd192ZXJzaW9uLmxhdGVzdCA9IHRydWVcblxuXHRcdFx0aWYgZmxvd192ZXJzaW9uLl9pZCAhPSB2ZXJzaW9uSWRcblx0XHRcdFx0Zmxvd192ZXJzaW9uID0gZmxvdy5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZClcblx0XHRcdFx0Zmxvd192ZXJzaW9uLmxhdGVzdCA9IGZhbHNlXG5cblx0XHRcdHJldHVybiBmbG93X3ZlcnNpb25cblx0aGFuZGxlID0gZGIuZmxvd3MuZmluZCh7X2lkOiBmbG93SWR9LCB7ZmllbGRzOiB7X2lkOiAxLCBcImN1cnJlbnQubW9kaWZpZWRcIjogMX19KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRzZWxmLmNoYW5nZWQoXCJmbG93X3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rmxvd1ZlcnNpb24oaWQsIHZlcnNpb25JZCkpO1xuXHR9XG5cblxuXHRzZWxmLmFkZGVkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGZsb3dJZCwgdmVyc2lvbklkKSk7XG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcblxuTWV0ZW9yLnB1Ymxpc2ggJ2Rpc3RyaWJ1dGVfb3B0aW9uYWxfZmxvd3MnLCAoZmxvd19pZHMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBmbG93X2lkc1xuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gZGIuZmxvd3MuZmluZCh7X2lkOiB7JGluOiBmbG93X2lkc319LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRuYW1lOiAxLFxuXHRcdFx0Zm9ybTogMSxcblx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0cGVybXM6IDEsXG5cdFx0XHRzcGFjZTogMSxcblx0XHRcdGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG5cdFx0XHRkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG5cdFx0XHRkaXN0cmlidXRlX2VuZF9ub3RpZmljYXRpb246IDEsXG5cdFx0XHRjb21wYW55X2lkOiAxLFxuXHRcdFx0ZW5hYmxlX2FtaXNmb3JtOiAxXG5cdFx0fVxuXHR9KVxuXG5NZXRlb3IucHVibGlzaCAnZmxvdycsIChzcGFjZUlkLCBmbG93SWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBmbG93SWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRyZXR1cm4gZGIuZmxvd3MuZmluZCh7X2lkOiBmbG93SWQsIHNwYWNlOiBzcGFjZUlkfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0cHJpbnRfdGVtcGxhdGU6IDEsXG5cdFx0XHRpbnN0YW5jZV90ZW1wbGF0ZTogMSxcblx0XHRcdGV2ZW50czogMSxcblx0XHRcdGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG5cdFx0XHRkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG5cdFx0XHR1cGxvYWRfYWZ0ZXJfYmVpbmdfZGlzdHJpYnV0ZWQ6IDEsXG5cdFx0XHRkaXN0cmlidXRlX2VuZF9ub3RpZmljYXRpb246IDEsXG5cdFx0XHRjb21wYW55X2lkOiAxLFxuXHRcdFx0YWxsb3dfc2VsZWN0X3N0ZXA6IDEsXG5cdFx0XHRlbmFibGVfYW1pc2Zvcm06IDFcblx0XHR9XG5cdH0pXG5NZXRlb3IucHVibGlzaCAnZmxvd19maWxlcycsIChzcGFjZUlkLCBmbG93SWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBmbG93SWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGNmcy5maWxlcy5maW5kKHsgJ21ldGFkYXRhLnNwYWNlJzogc3BhY2VJZCwgJ21ldGFkYXRhLm9iamVjdF9uYW1lJzogJ2Zsb3dzJywgJ21ldGFkYXRhLnJlY29yZF9pZCc6IGZsb3dJZCB9KVxuXG5NZXRlb3IucHVibGlzaENvbXBvc2l0ZSAnZmxvd3NfdGFidWxhcicsICh0YWJsZU5hbWUsIGlkcywgZmllbGRzKS0+XG5cdGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHRoaXMudW5ibG9jaygpXG5cblx0ZmluZDogLT5cblx0XHR0aGlzLnVuYmxvY2soKVxuXHRcdGRiLmZsb3dzLmZpbmQge19pZDogeyRpbjogaWRzfX0sIGZpZWxkczogZmllbGRzXG5cblx0Y2hpbGRyZW46IFtcblx0XHR7XG5cdFx0XHRmaW5kOiAoZmxvdykgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgdXNlclxuXHRcdFx0XHRkYi5zcGFjZV91c2Vycy5maW5kIHtcblx0XHRcdFx0XHRzcGFjZTogZmxvdy5zcGFjZSxcblx0XHRcdFx0XHR1c2VyOiBmbG93LmN1cnJlbnQubW9kaWZpZWRfYnlcblx0XHRcdFx0fSwgZmllbGRzOlxuXHRcdFx0XHRcdHNwYWNlOiAxXG5cdFx0XHRcdFx0dXNlcjogMVxuXHRcdFx0XHRcdG5hbWU6IDFcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbmQ6IChmbG93KSAtPlxuXHRcdFx0XHRAdW5ibG9jaygpXG5cdFx0XHRcdCMgUHVibGlzaCB0aGUgcmVsYXRlZCB1c2VyXG5cdFx0XHRcdGRiLmZvcm1zLmZpbmQge1xuXHRcdFx0XHRcdHNwYWNlOiBmbG93LnNwYWNlLFxuXHRcdFx0XHRcdF9pZDogZmxvdy5mb3JtXG5cdFx0XHRcdH0sIGZpZWxkczpcblx0XHRcdFx0XHRzcGFjZTogMVxuXHRcdFx0XHRcdF9pZDogMVxuXHRcdFx0XHRcdG5hbWU6IDEsXG5cdFx0XHRcdFx0Y2F0ZWdvcnk6IDFcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbmQ6IChmbG93KSAtPlxuXHRcdFx0XHRAdW5ibG9jaygpXG5cdFx0XHRcdCMgUHVibGlzaCB0aGUgcmVsYXRlZCB1c2VyXG5cdFx0XHRcdGRiLmNhdGVnb3JpZXMuZmluZCB7XG5cdFx0XHRcdFx0c3BhY2U6IGZsb3cuc3BhY2Vcblx0XHRcdFx0fSwgZmllbGRzOlxuXHRcdFx0XHRcdHNwYWNlOiAxXG5cdFx0XHRcdFx0X2lkOiAxXG5cdFx0XHRcdFx0bmFtZTogMVxuXHRcdH1cblx0XSIsIk1ldGVvci5wdWJsaXNoKCdmbG93cycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoZGIuZmxvd3MuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSkuY291bnQoKSA9PT0gMCkge1xuICAgIGRiLnNwYWNlcy5jcmVhdGVUZW1wbGF0ZUZvcm1BbmRGbG93KHNwYWNlSWQpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgZm9ybTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgcGVybXM6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBzb3J0X25vOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIGVuYWJsZV9hbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlX2Zsb3cnLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZsb3dJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZsb3dzLmZpbmQoe1xuICAgIF9pZDogZmxvd0lkLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBmb3JtOiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBwZXJtczogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgY29tcGFueV9pZDogMSxcbiAgICAgIHNvcnRfbm86IDEsXG4gICAgICBkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuICAgICAgZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuICAgICAgZW5hYmxlX2FtaXNmb3JtOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnZmxvd192ZXJzaW9uJywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkLCB2ZXJzaW9uSWQpIHtcbiAgdmFyIGdldEZsb3dWZXJzaW9uLCBoYW5kbGUsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghdmVyc2lvbklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgZ2V0Rmxvd1ZlcnNpb24gPSBmdW5jdGlvbihpZCwgdmVyc2lvbklkKSB7XG4gICAgdmFyIGZsb3csIGZsb3dfdmVyc2lvbjtcbiAgICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7XG4gICAgICBfaWQ6IGlkXG4gICAgfSk7XG4gICAgaWYgKGZsb3cpIHtcbiAgICAgIGZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudDtcbiAgICAgIGZsb3dfdmVyc2lvbi5sYXRlc3QgPSB0cnVlO1xuICAgICAgaWYgKGZsb3dfdmVyc2lvbi5faWQgIT09IHZlcnNpb25JZCkge1xuICAgICAgICBmbG93X3ZlcnNpb24gPSBmbG93Lmhpc3RvcnlzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdmVyc2lvbklkKTtcbiAgICAgICAgZmxvd192ZXJzaW9uLmxhdGVzdCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZsb3dfdmVyc2lvbjtcbiAgICB9XG4gIH07XG4gIGhhbmRsZSA9IGRiLmZsb3dzLmZpbmQoe1xuICAgIF9pZDogZmxvd0lkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIFwiY3VycmVudC5tb2RpZmllZFwiOiAxXG4gICAgfVxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJmbG93X3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rmxvd1ZlcnNpb24oaWQsIHZlcnNpb25JZCkpO1xuICAgIH1cbiAgfSk7XG4gIHNlbGYuYWRkZWQoXCJmbG93X3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rmxvd1ZlcnNpb24oZmxvd0lkLCB2ZXJzaW9uSWQpKTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdkaXN0cmlidXRlX29wdGlvbmFsX2Zsb3dzJywgZnVuY3Rpb24oZmxvd19pZHMpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93X2lkcykge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZsb3dzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBmbG93X2lkc1xuICAgIH1cbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGZvcm06IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHBlcm1zOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuICAgICAgZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uOiAxLFxuICAgICAgY29tcGFueV9pZDogMSxcbiAgICAgIGVuYWJsZV9hbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zsb3cnLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZsb3dJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZsb3dzLmZpbmQoe1xuICAgIF9pZDogZmxvd0lkLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHByaW50X3RlbXBsYXRlOiAxLFxuICAgICAgaW5zdGFuY2VfdGVtcGxhdGU6IDEsXG4gICAgICBldmVudHM6IDEsXG4gICAgICBkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuICAgICAgZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuICAgICAgdXBsb2FkX2FmdGVyX2JlaW5nX2Rpc3RyaWJ1dGVkOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uOiAxLFxuICAgICAgY29tcGFueV9pZDogMSxcbiAgICAgIGFsbG93X3NlbGVjdF9zdGVwOiAxLFxuICAgICAgZW5hYmxlX2FtaXNmb3JtOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnZmxvd19maWxlcycsIGZ1bmN0aW9uKHNwYWNlSWQsIGZsb3dJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd0lkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gY2ZzLmZpbGVzLmZpbmQoe1xuICAgICdtZXRhZGF0YS5zcGFjZSc6IHNwYWNlSWQsXG4gICAgJ21ldGFkYXRhLm9iamVjdF9uYW1lJzogJ2Zsb3dzJyxcbiAgICAnbWV0YWRhdGEucmVjb3JkX2lkJzogZmxvd0lkXG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlKCdmbG93c190YWJ1bGFyJywgZnVuY3Rpb24odGFibGVOYW1lLCBpZHMsIGZpZWxkcykge1xuICBjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICB0aGlzLnVuYmxvY2soKTtcbiAgcmV0dXJuIHtcbiAgICBmaW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgcmV0dXJuIGRiLmZsb3dzLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IGlkc1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBbXG4gICAgICB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGZsb3cpIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgICAgICAgICBzcGFjZTogZmxvdy5zcGFjZSxcbiAgICAgICAgICAgIHVzZXI6IGZsb3cuY3VycmVudC5tb2RpZmllZF9ieVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgICAgdXNlcjogMSxcbiAgICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGZsb3cpIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIuZm9ybXMuZmluZCh7XG4gICAgICAgICAgICBzcGFjZTogZmxvdy5zcGFjZSxcbiAgICAgICAgICAgIF9pZDogZmxvdy5mb3JtXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgICAgIG5hbWU6IDEsXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmluZDogZnVuY3Rpb24oZmxvdykge1xuICAgICAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgICAgIHJldHVybiBkYi5jYXRlZ29yaWVzLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IGZsb3cuc3BhY2VcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICAgIF9pZDogMSxcbiAgICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnZm9ybXMnLCAoc3BhY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRyZXR1cm4gZGIuZm9ybXMuZmluZCh7c3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOiB7bmFtZTogMSwgY2F0ZWdvcnk6IDEsIHN0YXRlOiAxLCBkZXNjcmlwdGlvbjogMSwgaW5zdGFuY2Vfc3R5bGU6IDEsIGFtaXNfc2NoZW1hOiAxfX0pXG5cbk1ldGVvci5wdWJsaXNoICdpbnN0YW5jZV9mb3JtJywgKHNwYWNlSWQsIGZvcm1JZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRyZXR1cm4gZGIuZm9ybXMuZmluZCh7X2lkOiBmb3JtSWQsIHNwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczoge25hbWU6IDEsIGNhdGVnb3J5OiAxLCBzdGF0ZTogMSwgZGVzY3JpcHRpb246IDEsIGluc3RhbmNlX3N0eWxlOiAxLCBhbWlzX3NjaGVtYTogMX19KVxuXG5cbk1ldGVvci5wdWJsaXNoICdmb3JtX3ZlcnNpb24nLCAoc3BhY2VJZCwgZm9ybUlkLCB2ZXJzaW9uSWQpIC0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZm9ybUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyB2ZXJzaW9uSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRzZWxmID0gdGhpcztcblxuXHRnZXRGb3JtVmVyc2lvbiA9IChpZCAsIHZlcnNpb25JZCktPlxuXHRcdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtfaWQgOiBpZH0pO1xuXHRcdGlmICFmb3JtXG5cdFx0XHRyZXR1cm4ge31cblx0XHRmb3JtX3ZlcnNpb24gPSBmb3JtLmN1cnJlbnRcblx0XHRmb3JtX3ZlcnNpb24ubGF0ZXN0ID0gdHJ1ZVxuXHRcdGlmIGZvcm1fdmVyc2lvbi5faWQgIT0gdmVyc2lvbklkXG5cdFx0XHRmb3JtX3ZlcnNpb24gPSBmb3JtLmhpc3RvcnlzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdmVyc2lvbklkKVxuXHRcdFx0Zm9ybV92ZXJzaW9uLmxhdGVzdCA9IGZhbHNlXG5cdFx0cmV0dXJuIGZvcm1fdmVyc2lvblxuXG5cdGhhbmRsZSA9IGRiLmZvcm1zLmZpbmQoe19pZDogZm9ybUlkfSwge2ZpZWxkczoge19pZDogMSwgXCJjdXJyZW50Lm1vZGlmaWVkXCI6IDF9fSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiZm9ybV92ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZvcm1WZXJzaW9uKGlkLCB2ZXJzaW9uSWQpKTtcblx0fVxuXG5cdHNlbGYuYWRkZWQoXCJmb3JtX3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rm9ybVZlcnNpb24oZm9ybUlkLCB2ZXJzaW9uSWQpKTtcblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKSIsIk1ldGVvci5wdWJsaXNoKCdmb3JtcycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZm9ybXMuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGNhdGVnb3J5OiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBkZXNjcmlwdGlvbjogMSxcbiAgICAgIGluc3RhbmNlX3N0eWxlOiAxLFxuICAgICAgYW1pc19zY2hlbWE6IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZV9mb3JtJywgZnVuY3Rpb24oc3BhY2VJZCwgZm9ybUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZvcm1zLmZpbmQoe1xuICAgIF9pZDogZm9ybUlkLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBjYXRlZ29yeTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgZGVzY3JpcHRpb246IDEsXG4gICAgICBpbnN0YW5jZV9zdHlsZTogMSxcbiAgICAgIGFtaXNfc2NoZW1hOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnZm9ybV92ZXJzaW9uJywgZnVuY3Rpb24oc3BhY2VJZCwgZm9ybUlkLCB2ZXJzaW9uSWQpIHtcbiAgdmFyIGdldEZvcm1WZXJzaW9uLCBoYW5kbGUsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmb3JtSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghdmVyc2lvbklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgZ2V0Rm9ybVZlcnNpb24gPSBmdW5jdGlvbihpZCwgdmVyc2lvbklkKSB7XG4gICAgdmFyIGZvcm0sIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGlkXG4gICAgfSk7XG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGZvcm1fdmVyc2lvbiA9IGZvcm0uY3VycmVudDtcbiAgICBmb3JtX3ZlcnNpb24ubGF0ZXN0ID0gdHJ1ZTtcbiAgICBpZiAoZm9ybV92ZXJzaW9uLl9pZCAhPT0gdmVyc2lvbklkKSB7XG4gICAgICBmb3JtX3ZlcnNpb24gPSBmb3JtLmhpc3RvcnlzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdmVyc2lvbklkKTtcbiAgICAgIGZvcm1fdmVyc2lvbi5sYXRlc3QgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbiAgfTtcbiAgaGFuZGxlID0gZGIuZm9ybXMuZmluZCh7XG4gICAgX2lkOiBmb3JtSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgX2lkOiAxLFxuICAgICAgXCJjdXJyZW50Lm1vZGlmaWVkXCI6IDFcbiAgICB9XG4gIH0pLm9ic2VydmVDaGFuZ2VzKHtcbiAgICBjaGFuZ2VkOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImZvcm1fdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGb3JtVmVyc2lvbihpZCwgdmVyc2lvbklkKSk7XG4gICAgfVxuICB9KTtcbiAgc2VsZi5hZGRlZChcImZvcm1fdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGb3JtVmVyc2lvbihmb3JtSWQsIHZlcnNpb25JZCkpO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdpbnN0YW5jZV9kYXRhJywgKGluc3RhbmNlSWQsIGJveCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIChpbnN0YW5jZUlkICYmIGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IGluc3RhbmNlSWR9KS5jb3VudCgpKVxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRzZWxmID0gdGhpcztcblxuXHRtaW5pQXBwcm92ZUZpZWxkcyA9IFsnX2lkJywgJ2lzX2ZpbmlzaGVkJywgJ3VzZXInLCAnaGFuZGxlcicsICdoYW5kbGVyX25hbWUnLCAndHlwZScsICdzdGFydF9kYXRlJywgJ2Rlc2NyaXB0aW9uJyxcblx0XHQnaXNfcmVhZCcsICdqdWRnZScsICdmaW5pc2hfZGF0ZScsICdmcm9tX3VzZXJfbmFtZScsICdmcm9tX3VzZXInLCAnY2NfZGVzY3JpcHRpb24nLCAnYXV0b19zdWJtaXR0ZWQnXVxuXG5cdHRyaWdnZXJDaGFuZ2VGaWVsZHMgPSBbJ2Zvcm1fdmVyc2lvbicsICdmbG93X3ZlcnNpb24nLCAncmVsYXRlZF9pbnN0YW5jZXMnLCAnX215X2FwcHJvdmVfcmVhZF9kYXRlcycsICd2YWx1ZXMnLCAnY2hhbmdlX3RpbWUnXVxuXG5cdHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXMgPSB7fVxuXG5cdGluc3RhbmNlX2ZpZWxkc18wID0ge1xuXHRcdFwicmVjb3JkX3N5bmNlZFwiOiAwLFxuXG4jXHRcdFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uX2Z1bGxuYW1lXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuY29zdF90aW1lXCI6IDAsXG4jXHRcdFwidHJhY2VzLmFwcHJvdmVzLnJlYWRfZGF0ZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmlzX2Vycm9yXCI6IDAsXG5cdFx0IyBcInRyYWNlcy5hcHByb3Zlcy51c2VyX25hbWVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5kZWFkbGluZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLnJlbWluZF9kYXRlXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMucmVtaW5kZWRfY291bnRcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5tb2RpZmllZF9ieVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLm1vZGlmaWVkXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuZ2VvbG9jYXRpb25cIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5jY191c2Vyc1wiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmZyb21fYXBwcm92ZV9pZFwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLnZhbHVlc19oaXN0b3J5XCI6IDBcblx0fVxuXG5cdGdldE15YXBwcm92ZU1vZGlmaWVkID0gKHRyYWNlcyktPlxuXHRcdG15QXBwcm92ZU1vZGlmaWVkcyA9IG5ldyBBcnJheSgpXG5cblx0XHR0cmFjZXM/LmZvckVhY2ggKHRyYWNlKS0+XG5cdFx0XHR0cmFjZT8uYXBwcm92ZXM/LmZvckVhY2ggKGFwcHJvdmUpLT5cblx0XHRcdFx0aWYgKGFwcHJvdmUudXNlciA9PSBzZWxmLnVzZXJJZCB8fCBhcHByb3ZlLmhhbmRsZXIgPT0gc2VsZi51c2VySWQpXG5cdFx0XHRcdCMgJiYgIWFwcHJvdmUuaXNfZmluaXNoZWRcbiNcdFx0XHRcdFx0Y29uc29sZS5sb2coXCJhcHByb3ZlXCIsIGFwcHJvdmUuX2lkLCBhcHByb3ZlLnJlYWRfZGF0ZSlcblxuXHRcdFx0XHRcdG15QXBwcm92ZU1vZGlmaWVkcy5wdXNoKGFwcHJvdmUucmVhZF9kYXRlKVxuXG5cdFx0cmV0dXJuIG15QXBwcm92ZU1vZGlmaWVkc1xuXG5cblx0Z2V0TWluaUluc3RhbmNlID0gKF9pbnN0YW5jZUlkKS0+XG5cdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBfaW5zdGFuY2VJZH0sIHtmaWVsZHM6IGluc3RhbmNlX2ZpZWxkc18wfSlcblxuXHRcdGlmIGluc3RhbmNlXG5cblx0XHRcdHRyaWdnZXJDaGFuZ2VGaWVsZHMuZm9yRWFjaCAoa2V5KS0+XG5cdFx0XHRcdGlmIGtleSA9PSAnX215X2FwcHJvdmVfcmVhZF9kYXRlcydcblx0XHRcdFx0XHR0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0gPSBnZXRNeWFwcHJvdmVNb2RpZmllZChpbnN0YW5jZS50cmFjZXMpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0gPSBpbnN0YW5jZVtrZXldXG5cbiNcdFx0XHRoYXNPcGluaW9uRmllbGQgPSBJbnN0YW5jZVNpZ25UZXh0LmluY2x1ZGVzT3BpbmlvbkZpZWxkKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbilcblxuXHRcdFx0c2hvd19tb2RhbF90cmFjZXNfbGlzdCA9IGRiLnNwYWNlX3NldHRpbmdzLmZpbmRPbmUoeyBzcGFjZTogaW5zdGFuY2Uuc3BhY2UsIGtleTogXCJzaG93X21vZGFsX3RyYWNlc19saXN0XCIgfSwgeyBmaWVsZHM6IHsgdmFsdWVzOiAxIH0gfSk/LnZhbHVlcyB8fCBmYWxzZVxuXG5cdFx0XHRpZiBzaG93X21vZGFsX3RyYWNlc19saXN0XG5cblx0XHRcdFx0dHJhY2VzID0gbmV3IEFycmF5KCk7XG5cblx0XHRcdFx0aW5zdGFuY2U/LnRyYWNlcz8uZm9yRWFjaCAodHJhY2UpLT5cblx0XHRcdFx0XHRfdHJhY2UgPSBfLmNsb25lKHRyYWNlKVxuXG5cdFx0XHRcdFx0YXBwcm92ZXMgPSBuZXcgQXJyYXkoKVxuXG5cdFx0XHRcdFx0dHJhY2U/LmFwcHJvdmVzPy5mb3JFYWNoIChhcHByb3ZlKS0+XG5cdFx0XHRcdFx0XHRpZiBhcHByb3ZlLnR5cGUgIT0gJ2NjJyB8fCBhcHByb3ZlLnVzZXIgPT0gc2VsZi51c2VySWQgfHwgYXBwcm92ZS5oYW5kbGVyID09IHNlbGYudXNlcklkIHx8ICghXy5pc0VtcHR5KGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlKSlcblx0XHRcdFx0XHRcdFx0YXBwcm92ZXMucHVzaChhcHByb3ZlKVxuXG5cdFx0XHRcdFx0X3RyYWNlLmFwcHJvdmVzID0gYXBwcm92ZXNcblxuXHRcdFx0XHRcdHRyYWNlcy5wdXNoKF90cmFjZSlcblxuXHRcdFx0XHRpbnN0YW5jZS50cmFjZXMgPSB0cmFjZXM7XG5cblx0XHRyZXR1cm4gaW5zdGFuY2VcblxuXG5cdG5lZWRDaGFuZ2UgPSAoY2hhbmdlRmllbGRzKS0+XG5cdFx0aWYgY2hhbmdlRmllbGRzXG5cblx0XHRcdF9jaGFuZ2UgPSBmYWxzZVxuXG5cdFx0XHRfcmV2ID0gXy5maW5kIHRyaWdnZXJDaGFuZ2VGaWVsZHMsIChrZXkpLT5cblx0XHRcdFx0X2tleSA9IGtleVxuXG5cdFx0XHRcdGlmIGtleSA9PSAnX215X2FwcHJvdmVfcmVhZF9kYXRlcydcblx0XHRcdFx0XHRfa2V5ID0gJ3RyYWNlcydcblxuXHRcdFx0XHRpZiBfLmhhcyhjaGFuZ2VGaWVsZHMsIF9rZXkpXG5cblx0XHRcdFx0XHRpZiBrZXkgPT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnXG5cblx0XHRcdFx0XHRcdF9teV9hcHByb3ZlX21vZGlmaWVkcyA9IGdldE15YXBwcm92ZU1vZGlmaWVkKGNoYW5nZUZpZWxkcy50cmFjZXMpXG5cbiNcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyh0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0sIF9teV9hcHByb3ZlX21vZGlmaWVkcylcblxuXHRcdFx0XHRcdFx0cmV0dXJuICFfLmlzRXF1YWwodHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldLCBfbXlfYXBwcm92ZV9tb2RpZmllZHMpXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuICFfLmlzRXF1YWwodHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldLCBjaGFuZ2VGaWVsZHNba2V5XSlcblxuXHRcdFx0aWYgX3JldlxuXHRcdFx0XHRfY2hhbmdlID0gdHJ1ZVxuXG4jXHRcdFx0Y29uc29sZS5sb2coX3JldiwgX2NoYW5nZSlcblxuXHRcdFx0cmV0dXJuIF9jaGFuZ2VcblxuXHRcdHJldHVybiB0cnVlXG5cdCPmraTlpITkuI3og73mt7vliqBmaWVsZHPpmZDliLbvvIzlkKbliJnkvJrlr7zoh7TmlbDmja7kuI3lrp7ml7Zcblx0aGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogaW5zdGFuY2VJZH0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQsIGZpZWxkcyktPlxuXHRcdFx0aWYoYm94ICE9ICdpbmJveCcgfHwgbmVlZENoYW5nZShmaWVsZHMpKVxuXHRcdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGdldE1pbmlJbnN0YW5jZShpZCkpO1xuXHRcdHJlbW92ZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcblx0fVxuXG5cdGluc3RhbmNlID0gZ2V0TWluaUluc3RhbmNlKGluc3RhbmNlSWQpXG5cblx0c2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpbnN0YW5jZT8uX2lkLCBpbnN0YW5jZSk7XG5cblx0c2VsZi5yZWFkeSgpO1xuXG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG5cblxuTWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlX3RyYWNlcycsIChpbnN0YW5jZUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgaW5zdGFuY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRzZWxmID0gdGhpc1xuXG5cdGdldEluc3RhbmNlVHJhY2VzID0gKF9pbnNJZCktPlxuXHRcdHJldHVybiBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBfaW5zSWR9LCB7ZmllbGRzOiB7X2lkOiAxLCB0cmFjZXM6IDF9fSlcblxuXG5cdGhhbmRsZSA9ICBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiBpbnN0YW5jZUlkfSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcblx0fVxuXG5cdHNlbGYuYWRkZWQoXCJpbnN0YW5jZV90cmFjZXNcIiwgaW5zdGFuY2VJZCwgZ2V0SW5zdGFuY2VUcmFjZXMoaW5zdGFuY2VJZCkpO1xuXG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKCkiLCJNZXRlb3IucHVibGlzaCgnaW5zdGFuY2VfZGF0YScsIGZ1bmN0aW9uKGluc3RhbmNlSWQsIGJveCkge1xuICB2YXIgZ2V0TWluaUluc3RhbmNlLCBnZXRNeWFwcHJvdmVNb2RpZmllZCwgaGFuZGxlLCBpbnN0YW5jZSwgaW5zdGFuY2VfZmllbGRzXzAsIG1pbmlBcHByb3ZlRmllbGRzLCBuZWVkQ2hhbmdlLCBzZWxmLCB0cmlnZ2VyQ2hhbmdlRmllbGRzLCB0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIShpbnN0YW5jZUlkICYmIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IGluc3RhbmNlSWRcbiAgfSkuY291bnQoKSkpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBtaW5pQXBwcm92ZUZpZWxkcyA9IFsnX2lkJywgJ2lzX2ZpbmlzaGVkJywgJ3VzZXInLCAnaGFuZGxlcicsICdoYW5kbGVyX25hbWUnLCAndHlwZScsICdzdGFydF9kYXRlJywgJ2Rlc2NyaXB0aW9uJywgJ2lzX3JlYWQnLCAnanVkZ2UnLCAnZmluaXNoX2RhdGUnLCAnZnJvbV91c2VyX25hbWUnLCAnZnJvbV91c2VyJywgJ2NjX2Rlc2NyaXB0aW9uJywgJ2F1dG9fc3VibWl0dGVkJ107XG4gIHRyaWdnZXJDaGFuZ2VGaWVsZHMgPSBbJ2Zvcm1fdmVyc2lvbicsICdmbG93X3ZlcnNpb24nLCAncmVsYXRlZF9pbnN0YW5jZXMnLCAnX215X2FwcHJvdmVfcmVhZF9kYXRlcycsICd2YWx1ZXMnLCAnY2hhbmdlX3RpbWUnXTtcbiAgdHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlcyA9IHt9O1xuICBpbnN0YW5jZV9maWVsZHNfMCA9IHtcbiAgICBcInJlY29yZF9zeW5jZWRcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuaGFuZGxlcl9vcmdhbml6YXRpb25cIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5jb3N0X3RpbWVcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5pc19lcnJvclwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmRlYWRsaW5lXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMucmVtaW5kX2RhdGVcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5yZW1pbmRlZF9jb3VudFwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLm1vZGlmaWVkX2J5XCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMubW9kaWZpZWRcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5nZW9sb2NhdGlvblwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmNjX3VzZXJzXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuZnJvbV9hcHByb3ZlX2lkXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMudmFsdWVzX2hpc3RvcnlcIjogMFxuICB9O1xuICBnZXRNeWFwcHJvdmVNb2RpZmllZCA9IGZ1bmN0aW9uKHRyYWNlcykge1xuICAgIHZhciBteUFwcHJvdmVNb2RpZmllZHM7XG4gICAgbXlBcHByb3ZlTW9kaWZpZWRzID0gbmV3IEFycmF5KCk7XG4gICAgaWYgKHRyYWNlcyAhPSBudWxsKSB7XG4gICAgICB0cmFjZXMuZm9yRWFjaChmdW5jdGlvbih0cmFjZSkge1xuICAgICAgICB2YXIgcmVmO1xuICAgICAgICByZXR1cm4gdHJhY2UgIT0gbnVsbCA/IChyZWYgPSB0cmFjZS5hcHByb3ZlcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgICBpZiAoYXBwcm92ZS51c2VyID09PSBzZWxmLnVzZXJJZCB8fCBhcHByb3ZlLmhhbmRsZXIgPT09IHNlbGYudXNlcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gbXlBcHByb3ZlTW9kaWZpZWRzLnB1c2goYXBwcm92ZS5yZWFkX2RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG15QXBwcm92ZU1vZGlmaWVkcztcbiAgfTtcbiAgZ2V0TWluaUluc3RhbmNlID0gZnVuY3Rpb24oX2luc3RhbmNlSWQpIHtcbiAgICB2YXIgaW5zdGFuY2UsIHJlZiwgcmVmMSwgc2hvd19tb2RhbF90cmFjZXNfbGlzdCwgdHJhY2VzO1xuICAgIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBfaW5zdGFuY2VJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczogaW5zdGFuY2VfZmllbGRzXzBcbiAgICB9KTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIHRyaWdnZXJDaGFuZ2VGaWVsZHMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnKSB7XG4gICAgICAgICAgcmV0dXJuIHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSA9IGdldE15YXBwcm92ZU1vZGlmaWVkKGluc3RhbmNlLnRyYWNlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSA9IGluc3RhbmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc2hvd19tb2RhbF90cmFjZXNfbGlzdCA9ICgocmVmID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7XG4gICAgICAgIHNwYWNlOiBpbnN0YW5jZS5zcGFjZSxcbiAgICAgICAga2V5OiBcInNob3dfbW9kYWxfdHJhY2VzX2xpc3RcIlxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICB2YWx1ZXM6IDFcbiAgICAgICAgfVxuICAgICAgfSkpICE9IG51bGwgPyByZWYudmFsdWVzIDogdm9pZCAwKSB8fCBmYWxzZTtcbiAgICAgIGlmIChzaG93X21vZGFsX3RyYWNlc19saXN0KSB7XG4gICAgICAgIHRyYWNlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICgocmVmMSA9IGluc3RhbmNlLnRyYWNlcykgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVmMS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICAgICAgICAgIHZhciBfdHJhY2UsIGFwcHJvdmVzLCByZWYyO1xuICAgICAgICAgICAgICBfdHJhY2UgPSBfLmNsb25lKHRyYWNlKTtcbiAgICAgICAgICAgICAgYXBwcm92ZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgaWYgKHRyYWNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHJlZjIgPSB0cmFjZS5hcHByb3ZlcykgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgcmVmMi5mb3JFYWNoKGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcHJvdmUudHlwZSAhPT0gJ2NjJyB8fCBhcHByb3ZlLnVzZXIgPT09IHNlbGYudXNlcklkIHx8IGFwcHJvdmUuaGFuZGxlciA9PT0gc2VsZi51c2VySWQgfHwgKCFfLmlzRW1wdHkoYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHByb3Zlcy5wdXNoKGFwcHJvdmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX3RyYWNlLmFwcHJvdmVzID0gYXBwcm92ZXM7XG4gICAgICAgICAgICAgIHJldHVybiB0cmFjZXMucHVzaChfdHJhY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLnRyYWNlcyA9IHRyYWNlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xuICBuZWVkQ2hhbmdlID0gZnVuY3Rpb24oY2hhbmdlRmllbGRzKSB7XG4gICAgdmFyIF9jaGFuZ2UsIF9yZXY7XG4gICAgaWYgKGNoYW5nZUZpZWxkcykge1xuICAgICAgX2NoYW5nZSA9IGZhbHNlO1xuICAgICAgX3JldiA9IF8uZmluZCh0cmlnZ2VyQ2hhbmdlRmllbGRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgdmFyIF9rZXksIF9teV9hcHByb3ZlX21vZGlmaWVkcztcbiAgICAgICAgX2tleSA9IGtleTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnKSB7XG4gICAgICAgICAgX2tleSA9ICd0cmFjZXMnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmhhcyhjaGFuZ2VGaWVsZHMsIF9rZXkpKSB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnKSB7XG4gICAgICAgICAgICBfbXlfYXBwcm92ZV9tb2RpZmllZHMgPSBnZXRNeWFwcHJvdmVNb2RpZmllZChjaGFuZ2VGaWVsZHMudHJhY2VzKTtcbiAgICAgICAgICAgIHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgX215X2FwcHJvdmVfbW9kaWZpZWRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICFfLmlzRXF1YWwodHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldLCBjaGFuZ2VGaWVsZHNba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChfcmV2KSB7XG4gICAgICAgIF9jaGFuZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9jaGFuZ2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiBpbnN0YW5jZUlkXG4gIH0pLm9ic2VydmVDaGFuZ2VzKHtcbiAgICBjaGFuZ2VkOiBmdW5jdGlvbihpZCwgZmllbGRzKSB7XG4gICAgICBpZiAoYm94ICE9PSAnaW5ib3gnIHx8IG5lZWRDaGFuZ2UoZmllbGRzKSkge1xuICAgICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBnZXRNaW5pSW5zdGFuY2UoaWQpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcbiAgICB9XG4gIH0pO1xuICBpbnN0YW5jZSA9IGdldE1pbmlJbnN0YW5jZShpbnN0YW5jZUlkKTtcbiAgc2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpbnN0YW5jZSAhPSBudWxsID8gaW5zdGFuY2UuX2lkIDogdm9pZCAwLCBpbnN0YW5jZSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnaW5zdGFuY2VfdHJhY2VzJywgZnVuY3Rpb24oaW5zdGFuY2VJZCkge1xuICB2YXIgZ2V0SW5zdGFuY2VUcmFjZXMsIGhhbmRsZSwgc2VsZjtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFpbnN0YW5jZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgZ2V0SW5zdGFuY2VUcmFjZXMgPSBmdW5jdGlvbihfaW5zSWQpIHtcbiAgICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBfaW5zSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICB0cmFjZXM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDogaW5zdGFuY2VJZFxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZV90cmFjZXNcIiwgaW5zdGFuY2VJZCwgZ2V0SW5zdGFuY2VUcmFjZXMoaW5zdGFuY2VJZCkpO1xuICAgIH1cbiAgfSk7XG4gIHNlbGYuYWRkZWQoXCJpbnN0YW5jZV90cmFjZXNcIiwgaW5zdGFuY2VJZCwgZ2V0SW5zdGFuY2VUcmFjZXMoaW5zdGFuY2VJZCkpO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcbiIsIlxuXHRNZXRlb3IucHVibGlzaCAnaW5zdGFuY2VzX2xpc3QnLCAoc3BhY2VJZCwgYm94LCBmbG93SWQpLT5cblxuXHRcdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXHRcdFxuXHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0XHRxdWVyeSA9IHtzcGFjZTogc3BhY2VJZH1cblx0XHRpZiBib3ggPT0gXCJpbmJveFwiXG5cdFx0XHRxdWVyeS5pbmJveF91c2VycyA9IHRoaXMudXNlcklkO1xuXHRcdGVsc2UgaWYgYm94ID09IFwib3V0Ym94XCJcblx0XHRcdHF1ZXJ5Lm91dGJveF91c2VycyA9IHRoaXMudXNlcklkO1xuXHRcdGVsc2UgaWYgYm94ID09IFwiZHJhZnRcIlxuXHRcdFx0cXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwiZHJhZnRcIlxuXHRcdGVsc2UgaWYgYm94ID09IFwicGVuZGluZ1wiXG5cdFx0XHRxdWVyeS5zdWJtaXR0ZXIgPSB0aGlzLnVzZXJJZDtcblx0XHRcdHF1ZXJ5LnN0YXRlID0gXCJwZW5kaW5nXCJcblx0XHRlbHNlIGlmIGJveCA9PSBcImNvbXBsZXRlZFwiXG5cdFx0XHRxdWVyeS5zdWJtaXR0ZXIgPSB0aGlzLnVzZXJJZDtcblx0XHRcdHF1ZXJ5LnN0YXRlID0gXCJjb21wbGV0ZWRcIlxuXHRcdGVsc2UgaWYgYm94ID09IFwibW9uaXRvclwiXG5cdFx0XHRxdWVyeS5mbG93ID0gZmxvd0lkO1xuXHRcdFx0cXVlcnkuc3RhdGUgPSB7JGluOiBbXCJwZW5kaW5nXCIsXCJjb21wbGV0ZWRcIl19O1xuXHRcdGVsc2Vcblx0XHRcdHF1ZXJ5LnN0YXRlID0gXCJub25lXCJcblxuXHRcdHJldHVybiBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge2ZpZWxkczoge25hbWU6MSwgY3JlYXRlZDoxLCBmb3JtOjEsIGZsb3c6IDEsIHNwYWNlOjEsIG1vZGlmaWVkOjEsIGFwcGxpY2FudDogMSwgaXNfYXJjaGl2ZWQ6MSwgZm9ybV92ZXJzaW9uOiAxLCBmbG93X3ZlcnNpb246IDF9fSlcblxuIiwiTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlc19saXN0JywgZnVuY3Rpb24oc3BhY2VJZCwgYm94LCBmbG93SWQpIHtcbiAgdmFyIHF1ZXJ5O1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHF1ZXJ5ID0ge1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH07XG4gIGlmIChib3ggPT09IFwiaW5ib3hcIikge1xuICAgIHF1ZXJ5LmluYm94X3VzZXJzID0gdGhpcy51c2VySWQ7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcIm91dGJveFwiKSB7XG4gICAgcXVlcnkub3V0Ym94X3VzZXJzID0gdGhpcy51c2VySWQ7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcImRyYWZ0XCIpIHtcbiAgICBxdWVyeS5zdWJtaXR0ZXIgPSB0aGlzLnVzZXJJZDtcbiAgICBxdWVyeS5zdGF0ZSA9IFwiZHJhZnRcIjtcbiAgfSBlbHNlIGlmIChib3ggPT09IFwicGVuZGluZ1wiKSB7XG4gICAgcXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG4gICAgcXVlcnkuc3RhdGUgPSBcInBlbmRpbmdcIjtcbiAgfSBlbHNlIGlmIChib3ggPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICBxdWVyeS5zdWJtaXR0ZXIgPSB0aGlzLnVzZXJJZDtcbiAgICBxdWVyeS5zdGF0ZSA9IFwiY29tcGxldGVkXCI7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcIm1vbml0b3JcIikge1xuICAgIHF1ZXJ5LmZsb3cgPSBmbG93SWQ7XG4gICAgcXVlcnkuc3RhdGUgPSB7XG4gICAgICAkaW46IFtcInBlbmRpbmdcIiwgXCJjb21wbGV0ZWRcIl1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHF1ZXJ5LnN0YXRlID0gXCJub25lXCI7XG4gIH1cbiAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgY3JlYXRlZDogMSxcbiAgICAgIGZvcm06IDEsXG4gICAgICBmbG93OiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBtb2RpZmllZDogMSxcbiAgICAgIGFwcGxpY2FudDogMSxcbiAgICAgIGlzX2FyY2hpdmVkOiAxLFxuICAgICAgZm9ybV92ZXJzaW9uOiAxLFxuICAgICAgZmxvd192ZXJzaW9uOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuIiwibGFzdEZpbmlzaGVkQXBwcm92ZUFnZ3JlZ2F0ZSA9IChpbnN0YW5jZWlkLCB1c2VySWQsIGRhdGFNYXAsIGNhbGxiYWNrKS0+XG5cdG9wZXJhdGlvbiA9IFt7XG5cdFx0XCIkbWF0Y2hcIjoge1xuXHRcdFx0XCJfaWRcIjogaW5zdGFuY2VpZFxuXHRcdH1cblx0fSwge1wiJHByb2plY3RcIjoge1wibmFtZVwiOiAxLCBcIl9hcHByb3ZlXCI6IFwiJHRyYWNlcy5hcHByb3Zlc1wifX0sIHtcIiR1bndpbmRcIjogXCIkX2FwcHJvdmVcIn0sIHtcIiR1bndpbmRcIjogXCIkX2FwcHJvdmVcIn0sXG5cdFx0e1wiJG1hdGNoXCI6IHtcIl9hcHByb3ZlLmlzX2ZpbmlzaGVkXCI6IHRydWUsICRvcjpbe1wiX2FwcHJvdmUuaGFuZGxlclwiOiB1c2VySWR9LHtcIl9hcHByb3ZlLnVzZXJcIjogdXNlcklkfV19fSxcblx0XHR7XCIkZ3JvdXBcIjoge1wiX2lkXCI6IFwiJF9pZFwiLCBcImZpbmlzaF9kYXRlXCI6IHtcIiRsYXN0XCI6IFwiJF9hcHByb3ZlLmZpbmlzaF9kYXRlXCJ9fX1cblx0XVxuXG5cdGRiLmluc3RhbmNlcy5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKG9wZXJhdGlvbikudG9BcnJheSAoZXJyLCBkYXRhKS0+XG5cdFx0aWYgZXJyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyKVxuXG5cdFx0ZGF0YS5mb3JFYWNoIChkb2MpIC0+XG5cdFx0XHRkYXRhTWFwLnB1c2ggZG9jXG5cblx0XHRpZiBjYWxsYmFjayAmJiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spXG5cdFx0XHRjYWxsYmFjaygpXG5cdFx0cmV0dXJuXG5cbmFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZSA9IE1ldGVvci53cmFwQXN5bmMobGFzdEZpbmlzaGVkQXBwcm92ZUFnZ3JlZ2F0ZSlcblxuTWV0ZW9yLnB1Ymxpc2ggXCJpbnN0YW5jZV90YWJ1bGFyXCIsICh0YWJsZU5hbWUsIGlkcywgZmllbGRzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG5cblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cblx0Y2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKVxuXG5cdGZpZWxkcy5jY191c2VycyA9IDFcblxuXHRzZWxmID0gdGhpcztcblxuXHRnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUgPSAodXNlcklkLCBpbnN0YW5jZUlkKS0+XG5cdFx0ZGF0YSA9IFtdXG5cdFx0YXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlKGluc3RhbmNlSWQsIHVzZXJJZCwgZGF0YSlcblx0XHRpZiBkYXRhLmxlbmd0aCA+IDBcblx0XHRcdHJldHVybiBkYXRhWzBdXG5cblxuXHRnZXRNeUFwcHJvdmUgPSAodXNlcklkLCBpbnN0YW5jZUlkKS0+XG5cdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZUlkfSwge2ZpZWxkczoge3RyYWNlczogMX19KVxuXHRcdG15QXBwcm92ZSA9IG51bGxcblxuXHRcdGlmICFpbnN0YW5jZVxuXHRcdFx0cmV0dXJuXG5cblx0XHRpZiAhaW5zdGFuY2UudHJhY2VzIHx8IGluc3RhbmNlLnRyYWNlcy5sZW5ndGggPCAxXG5cdFx0XHRyZXR1cm5cblxuXHRcdG5vdEZpbmlzaGVkVHJhY2VzID0gaW5zdGFuY2UudHJhY2VzLmZpbHRlclByb3BlcnR5KFwiaXNfZmluaXNoZWRcIiwgZmFsc2UpXG5cblx0XHRpZiBub3RGaW5pc2hlZFRyYWNlcy5sZW5ndGggPiAwXG5cdFx0XHRhcHByb3ZlcyA9IG5vdEZpbmlzaGVkVHJhY2VzWzBdLmFwcHJvdmVzLmZpbHRlclByb3BlcnR5KFwiaXNfZmluaXNoZWRcIiwgZmFsc2UpLmZpbHRlclByb3BlcnR5KFwiaGFuZGxlclwiLCB1c2VySWQpO1xuXG5cdFx0XHRpZiBhcHByb3Zlcy5sZW5ndGggPiAwXG5cdFx0XHRcdGFwcHJvdmUgPSBhcHByb3Zlc1swXVxuXHRcdFx0XHRteUFwcHJvdmUgPSB7XG5cdFx0XHRcdFx0aWQ6IGFwcHJvdmUuX2lkLFxuXHRcdFx0XHRcdGluc3RhbmNlOiBhcHByb3ZlLmluc3RhbmNlLFxuXHRcdFx0XHRcdHRyYWNlOiBhcHByb3ZlLnRyYWNlLFxuXHRcdFx0XHRcdGlzX3JlYWQ6IGFwcHJvdmUuaXNfcmVhZCxcblx0XHRcdFx0XHRzdGFydF9kYXRlOiBhcHByb3ZlLnN0YXJ0X2RhdGVcblx0XHRcdFx0XHRhZ2VudDogYXBwcm92ZS5hZ2VudFxuXHRcdFx0XHRcdHVzZXJfbmFtZTogYXBwcm92ZS51c2VyX25hbWVcblx0XHRcdFx0fVxuXG5cdFx0aWYgIW15QXBwcm92ZVxuXHRcdFx0aXNfcmVhZCA9IGZhbHNlXG5cdFx0XHRpbnN0YW5jZS50cmFjZXMuZm9yRWFjaCAodHJhY2UpIC0+XG5cdFx0XHRcdHRyYWNlPy5hcHByb3Zlcz8uZm9yRWFjaCAoYXBwcm92ZSkgLT5cblx0XHRcdFx0XHRpZiBhcHByb3ZlLnR5cGUgPT0gJ2NjJyBhbmQgYXBwcm92ZS51c2VyID09IHVzZXJJZCBhbmQgYXBwcm92ZS5pc19maW5pc2hlZCA9PSBmYWxzZVxuXHRcdFx0XHRcdFx0aWYgYXBwcm92ZS5pc19yZWFkXG5cdFx0XHRcdFx0XHRcdGlzX3JlYWQgPSB0cnVlXG5cdFx0XHRcdFx0XHRteUFwcHJvdmUgPSB7aWQ6IGFwcHJvdmUuX2lkLCBpc19yZWFkOiBpc19yZWFkLCBzdGFydF9kYXRlOiBhcHByb3ZlLnN0YXJ0X2RhdGUsIGFnZW50OiBhcHByb3ZlLmFnZW50LCB1c2VyX25hbWU6IGFwcHJvdmUudXNlcl9uYW1lfVxuXG5cdFx0cmV0dXJuIG15QXBwcm92ZVxuXG5cdGdldFN0ZXBDdXJyZW50TmFtZSA9IChpbnN0YW5jZUlkKSAtPlxuXHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VJZH0sIHtmaWVsZHM6IHtcInRyYWNlcy5uYW1lXCI6IDEsIFwidHJhY2VzXCI6IHskc2xpY2U6IC0xfX19KVxuXHRcdGlmIGluc3RhbmNlXG5cdFx0XHRzdGVwQ3VycmVudE5hbWUgPSBpbnN0YW5jZS50cmFjZXM/WzBdPy5uYW1lXG5cblx0XHRyZXR1cm4gc3RlcEN1cnJlbnROYW1lXG5cblx0aGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbjogaWRzfX0sIHtmaWVsZHM6IHt0cmFjZXM6IDB9fSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRteUFwcHJvdmUgPSBnZXRNeUFwcHJvdmUoc2VsZi51c2VySWQsIGlkKVxuXHRcdFx0bXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlKHNlbGYudXNlcklkLCBpZClcblx0XHRcdGlmIG15QXBwcm92ZVxuXHRcdFx0XHRpbnN0YW5jZS5pc19yZWFkID0gbXlBcHByb3ZlLmlzX3JlYWRcblx0XHRcdFx0aW5zdGFuY2Uuc3RhcnRfZGF0ZSA9IG15QXBwcm92ZS5zdGFydF9kYXRlXG5cdFx0XHRcdGlmIG15QXBwcm92ZS5hZ2VudFxuXHRcdFx0XHRcdGluc3RhbmNlLmFnZW50X3VzZXJfbmFtZSA9IG15QXBwcm92ZS51c2VyX25hbWVcblx0XHRcdGVsc2Vcblx0XHRcdFx0aW5zdGFuY2UuaXNfcmVhZCA9IHRydWVcblxuXHRcdFx0aWYgbXlMYXN0RmluaXNoZWRBcHByb3ZlXG5cdFx0XHRcdGluc3RhbmNlLm15X2ZpbmlzaF9kYXRlID0gbXlMYXN0RmluaXNoZWRBcHByb3ZlLmZpbmlzaF9kYXRlXG5cblx0XHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdFx0aW5zdGFuY2UuY2NfY291bnQgPSBpbnN0YW5jZS5jY191c2Vycz8ubGVuZ3RoIHx8IDBcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0dHJ5XG5cdFx0XHRcdHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuXHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0Y29uc29sZS5sb2coJ2luc3RhbmNlIG9ic2VydmVDaGFuZ2VzIGVycm9yOiAnLCBlcnJvci5tZXNzYWdlKTtcblx0XHRcdFx0Y29uc29sZS5sb2coJ3NlbGYudXNlcklkOiAnLCBzZWxmLnVzZXJJZCk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCd0YWJsZU5hbWU6ICcsIHRhYmxlTmFtZSk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdpZHM6ICcsIEpTT04uc3RyaW5naWZ5KGlkcykpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnbXlBcHByb3ZlOiAnLCBKU09OLnN0cmluZ2lmeShteUFwcHJvdmUpKTtcblx0XHRyZW1vdmVkOiAoaWQpLT5cblx0XHRcdHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG5cdH1cblxuXHRpZHMuZm9yRWFjaCAoaWQpLT5cblx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0bXlBcHByb3ZlID0gZ2V0TXlBcHByb3ZlKHNlbGYudXNlcklkLCBpZClcblx0XHRteUxhc3RGaW5pc2hlZEFwcHJvdmUgPSBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUoc2VsZi51c2VySWQsIGlkKVxuXHRcdGlmIG15QXBwcm92ZVxuXHRcdFx0aW5zdGFuY2UuaXNfcmVhZCA9IG15QXBwcm92ZS5pc19yZWFkXG5cdFx0XHRpbnN0YW5jZS5zdGFydF9kYXRlID0gbXlBcHByb3ZlLnN0YXJ0X2RhdGVcblx0XHRcdGlmIG15QXBwcm92ZS5hZ2VudFxuXHRcdFx0XHRcdGluc3RhbmNlLmFnZW50X3VzZXJfbmFtZSA9IG15QXBwcm92ZS51c2VyX25hbWVcblx0XHRlbHNlXG5cdFx0XHRpbnN0YW5jZS5pc19yZWFkID0gdHJ1ZVxuXG5cdFx0aWYgbXlMYXN0RmluaXNoZWRBcHByb3ZlXG5cdFx0XHRpbnN0YW5jZS5teV9maW5pc2hfZGF0ZSA9IG15TGFzdEZpbmlzaGVkQXBwcm92ZS5maW5pc2hfZGF0ZVxuXG5cdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0aW5zdGFuY2UuY2NfY291bnQgPSBpbnN0YW5jZS5jY191c2Vycz8ubGVuZ3RoIHx8IDBcblx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRzZWxmLmFkZGVkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG5cblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuXG5NZXRlb3IucHVibGlzaCBcImluc3RhbmNlX3Rhc2tzX3RhYnVsYXJcIiwgKHRhYnVsYXJOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0Y2hlY2sodGFidWxhck5hbWUsIFN0cmluZyk7XG5cblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cblx0Y2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKVxuXG5cdCMgY29uc29sZS5sb2coJ3RhYnVsYXJOYW1lOiAnLCB0YWJ1bGFyTmFtZSk7XG5cdCMgY29uc29sZS5sb2coJ2lkczogJywgSlNPTi5zdHJpbmdpZnkoaWRzKSk7XG5cdCMgY29uc29sZS5sb2coJ2ZpZWxkczogJywgSlNPTi5zdHJpbmdpZnkoZmllbGRzKSk7XG5cblx0ZGIuaW5zdGFuY2VfdGFza3MuZmluZCh7XG5cdFx0X2lkOiB7XG5cdFx0XHQkaW46IGlkc1xuXHRcdH1cblx0fSwge1xuXHRcdGZpZWxkczogZmllbGRzXG5cdH0pXG5cbk1ldGVvci5wdWJsaXNoIFwiaW5zdGFuY2VzX3RhYnVsYXJcIiwgKHRhYnVsYXJOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0Y2hlY2sodGFidWxhck5hbWUsIFN0cmluZyk7XG5cblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cblx0Y2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKVxuXG5cdCMgY29uc29sZS5sb2coJ3RhYnVsYXJOYW1lOiAnLCB0YWJ1bGFyTmFtZSk7XG5cdCMgY29uc29sZS5sb2coJ2lkczogJywgSlNPTi5zdHJpbmdpZnkoaWRzKSk7XG5cdCMgY29uc29sZS5sb2coJ2ZpZWxkczogJywgSlNPTi5zdHJpbmdpZnkoZmllbGRzKSk7XG5cblx0ZGIuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdF9pZDoge1xuXHRcdFx0JGluOiBpZHNcblx0XHR9XG5cdH0sIHtcblx0XHRmaWVsZHM6IGZpZWxkc1xuXHR9KSIsInZhciBhc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUsIGxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGU7XG5cbmxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUgPSBmdW5jdGlvbihpbnN0YW5jZWlkLCB1c2VySWQsIGRhdGFNYXAsIGNhbGxiYWNrKSB7XG4gIHZhciBvcGVyYXRpb247XG4gIG9wZXJhdGlvbiA9IFtcbiAgICB7XG4gICAgICBcIiRtYXRjaFwiOiB7XG4gICAgICAgIFwiX2lkXCI6IGluc3RhbmNlaWRcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBcIiRwcm9qZWN0XCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IDEsXG4gICAgICAgIFwiX2FwcHJvdmVcIjogXCIkdHJhY2VzLmFwcHJvdmVzXCJcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBcIiR1bndpbmRcIjogXCIkX2FwcHJvdmVcIlxuICAgIH0sIHtcbiAgICAgIFwiJHVud2luZFwiOiBcIiRfYXBwcm92ZVwiXG4gICAgfSwge1xuICAgICAgXCIkbWF0Y2hcIjoge1xuICAgICAgICBcIl9hcHByb3ZlLmlzX2ZpbmlzaGVkXCI6IHRydWUsXG4gICAgICAgICRvcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiX2FwcHJvdmUuaGFuZGxlclwiOiB1c2VySWRcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBcIl9hcHByb3ZlLnVzZXJcIjogdXNlcklkXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgXCIkZ3JvdXBcIjoge1xuICAgICAgICBcIl9pZFwiOiBcIiRfaWRcIixcbiAgICAgICAgXCJmaW5pc2hfZGF0ZVwiOiB7XG4gICAgICAgICAgXCIkbGFzdFwiOiBcIiRfYXBwcm92ZS5maW5pc2hfZGF0ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIF07XG4gIHJldHVybiBkYi5pbnN0YW5jZXMucmF3Q29sbGVjdGlvbigpLmFnZ3JlZ2F0ZShvcGVyYXRpb24pLnRvQXJyYXkoZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgfVxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihkb2MpIHtcbiAgICAgIHJldHVybiBkYXRhTWFwLnB1c2goZG9jKTtcbiAgICB9KTtcbiAgICBpZiAoY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xufTtcblxuYXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlID0gTWV0ZW9yLndyYXBBc3luYyhsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlKTtcblxuTWV0ZW9yLnB1Ymxpc2goXCJpbnN0YW5jZV90YWJ1bGFyXCIsIGZ1bmN0aW9uKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpIHtcbiAgdmFyIGdldE15QXBwcm92ZSwgZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlLCBnZXRTdGVwQ3VycmVudE5hbWUsIGhhbmRsZSwgc2VsZjtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgY2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgZmllbGRzLmNjX3VzZXJzID0gMTtcbiAgc2VsZiA9IHRoaXM7XG4gIGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGZ1bmN0aW9uKHVzZXJJZCwgaW5zdGFuY2VJZCkge1xuICAgIHZhciBkYXRhO1xuICAgIGRhdGEgPSBbXTtcbiAgICBhc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUoaW5zdGFuY2VJZCwgdXNlcklkLCBkYXRhKTtcbiAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGF0YVswXTtcbiAgICB9XG4gIH07XG4gIGdldE15QXBwcm92ZSA9IGZ1bmN0aW9uKHVzZXJJZCwgaW5zdGFuY2VJZCkge1xuICAgIHZhciBhcHByb3ZlLCBhcHByb3ZlcywgaW5zdGFuY2UsIGlzX3JlYWQsIG15QXBwcm92ZSwgbm90RmluaXNoZWRUcmFjZXM7XG4gICAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgdHJhY2VzOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgbXlBcHByb3ZlID0gbnVsbDtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaW5zdGFuY2UudHJhY2VzIHx8IGluc3RhbmNlLnRyYWNlcy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5vdEZpbmlzaGVkVHJhY2VzID0gaW5zdGFuY2UudHJhY2VzLmZpbHRlclByb3BlcnR5KFwiaXNfZmluaXNoZWRcIiwgZmFsc2UpO1xuICAgIGlmIChub3RGaW5pc2hlZFRyYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHByb3ZlcyA9IG5vdEZpbmlzaGVkVHJhY2VzWzBdLmFwcHJvdmVzLmZpbHRlclByb3BlcnR5KFwiaXNfZmluaXNoZWRcIiwgZmFsc2UpLmZpbHRlclByb3BlcnR5KFwiaGFuZGxlclwiLCB1c2VySWQpO1xuICAgICAgaWYgKGFwcHJvdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXBwcm92ZSA9IGFwcHJvdmVzWzBdO1xuICAgICAgICBteUFwcHJvdmUgPSB7XG4gICAgICAgICAgaWQ6IGFwcHJvdmUuX2lkLFxuICAgICAgICAgIGluc3RhbmNlOiBhcHByb3ZlLmluc3RhbmNlLFxuICAgICAgICAgIHRyYWNlOiBhcHByb3ZlLnRyYWNlLFxuICAgICAgICAgIGlzX3JlYWQ6IGFwcHJvdmUuaXNfcmVhZCxcbiAgICAgICAgICBzdGFydF9kYXRlOiBhcHByb3ZlLnN0YXJ0X2RhdGUsXG4gICAgICAgICAgYWdlbnQ6IGFwcHJvdmUuYWdlbnQsXG4gICAgICAgICAgdXNlcl9uYW1lOiBhcHByb3ZlLnVzZXJfbmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW15QXBwcm92ZSkge1xuICAgICAgaXNfcmVhZCA9IGZhbHNlO1xuICAgICAgaW5zdGFuY2UudHJhY2VzLmZvckVhY2goZnVuY3Rpb24odHJhY2UpIHtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgcmV0dXJuIHRyYWNlICE9IG51bGwgPyAocmVmID0gdHJhY2UuYXBwcm92ZXMpICE9IG51bGwgPyByZWYuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgaWYgKGFwcHJvdmUudHlwZSA9PT0gJ2NjJyAmJiBhcHByb3ZlLnVzZXIgPT09IHVzZXJJZCAmJiBhcHByb3ZlLmlzX2ZpbmlzaGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKGFwcHJvdmUuaXNfcmVhZCkge1xuICAgICAgICAgICAgICBpc19yZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBteUFwcHJvdmUgPSB7XG4gICAgICAgICAgICAgIGlkOiBhcHByb3ZlLl9pZCxcbiAgICAgICAgICAgICAgaXNfcmVhZDogaXNfcmVhZCxcbiAgICAgICAgICAgICAgc3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlLFxuICAgICAgICAgICAgICBhZ2VudDogYXBwcm92ZS5hZ2VudCxcbiAgICAgICAgICAgICAgdXNlcl9uYW1lOiBhcHByb3ZlLnVzZXJfbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBteUFwcHJvdmU7XG4gIH07XG4gIGdldFN0ZXBDdXJyZW50TmFtZSA9IGZ1bmN0aW9uKGluc3RhbmNlSWQpIHtcbiAgICB2YXIgaW5zdGFuY2UsIHJlZiwgcmVmMSwgc3RlcEN1cnJlbnROYW1lO1xuICAgIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnN0YW5jZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIFwidHJhY2VzLm5hbWVcIjogMSxcbiAgICAgICAgXCJ0cmFjZXNcIjoge1xuICAgICAgICAgICRzbGljZTogLTFcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgc3RlcEN1cnJlbnROYW1lID0gKHJlZiA9IGluc3RhbmNlLnRyYWNlcykgIT0gbnVsbCA/IChyZWYxID0gcmVmWzBdKSAhPSBudWxsID8gcmVmMS5uYW1lIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcEN1cnJlbnROYW1lO1xuICB9O1xuICBoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGlkc1xuICAgIH1cbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgdHJhY2VzOiAwXG4gICAgfVxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBlcnJvciwgaW5zdGFuY2UsIG15QXBwcm92ZSwgbXlMYXN0RmluaXNoZWRBcHByb3ZlLCByZWYsIHJlZjE7XG4gICAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG15QXBwcm92ZSA9IGdldE15QXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpO1xuICAgICAgbXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlKHNlbGYudXNlcklkLCBpZCk7XG4gICAgICBpZiAobXlBcHByb3ZlKSB7XG4gICAgICAgIGluc3RhbmNlLmlzX3JlYWQgPSBteUFwcHJvdmUuaXNfcmVhZDtcbiAgICAgICAgaW5zdGFuY2Uuc3RhcnRfZGF0ZSA9IG15QXBwcm92ZS5zdGFydF9kYXRlO1xuICAgICAgICBpZiAobXlBcHByb3ZlLmFnZW50KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYWdlbnRfdXNlcl9uYW1lID0gbXlBcHByb3ZlLnVzZXJfbmFtZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2UuaXNfcmVhZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobXlMYXN0RmluaXNoZWRBcHByb3ZlKSB7XG4gICAgICAgIGluc3RhbmNlLm15X2ZpbmlzaF9kYXRlID0gbXlMYXN0RmluaXNoZWRBcHByb3ZlLmZpbmlzaF9kYXRlO1xuICAgICAgfVxuICAgICAgaW5zdGFuY2UuaXNfY2MgPSAoKHJlZiA9IGluc3RhbmNlLmNjX3VzZXJzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKHNlbGYudXNlcklkKSA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgICBpbnN0YW5jZS5jY19jb3VudCA9ICgocmVmMSA9IGluc3RhbmNlLmNjX3VzZXJzKSAhPSBudWxsID8gcmVmMS5sZW5ndGggOiB2b2lkIDApIHx8IDA7XG4gICAgICBkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnM7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbnN0YW5jZSBvYnNlcnZlQ2hhbmdlcyBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZWxmLnVzZXJJZDogJywgc2VsZi51c2VySWQpO1xuICAgICAgICBjb25zb2xlLmxvZygndGFibGVOYW1lOiAnLCB0YWJsZU5hbWUpO1xuICAgICAgICBjb25zb2xlLmxvZygnaWRzOiAnLCBKU09OLnN0cmluZ2lmeShpZHMpKTtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdteUFwcHJvdmU6ICcsIEpTT04uc3RyaW5naWZ5KG15QXBwcm92ZSkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiBzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuICAgIH1cbiAgfSk7XG4gIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGlkKSB7XG4gICAgdmFyIGluc3RhbmNlLCBteUFwcHJvdmUsIG15TGFzdEZpbmlzaGVkQXBwcm92ZSwgcmVmLCByZWYxO1xuICAgIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczogZmllbGRzXG4gICAgfSk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBteUFwcHJvdmUgPSBnZXRNeUFwcHJvdmUoc2VsZi51c2VySWQsIGlkKTtcbiAgICBteUxhc3RGaW5pc2hlZEFwcHJvdmUgPSBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUoc2VsZi51c2VySWQsIGlkKTtcbiAgICBpZiAobXlBcHByb3ZlKSB7XG4gICAgICBpbnN0YW5jZS5pc19yZWFkID0gbXlBcHByb3ZlLmlzX3JlYWQ7XG4gICAgICBpbnN0YW5jZS5zdGFydF9kYXRlID0gbXlBcHByb3ZlLnN0YXJ0X2RhdGU7XG4gICAgICBpZiAobXlBcHByb3ZlLmFnZW50KSB7XG4gICAgICAgIGluc3RhbmNlLmFnZW50X3VzZXJfbmFtZSA9IG15QXBwcm92ZS51c2VyX25hbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLmlzX3JlYWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobXlMYXN0RmluaXNoZWRBcHByb3ZlKSB7XG4gICAgICBpbnN0YW5jZS5teV9maW5pc2hfZGF0ZSA9IG15TGFzdEZpbmlzaGVkQXBwcm92ZS5maW5pc2hfZGF0ZTtcbiAgICB9XG4gICAgaW5zdGFuY2UuaXNfY2MgPSAoKHJlZiA9IGluc3RhbmNlLmNjX3VzZXJzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKHNlbGYudXNlcklkKSA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgaW5zdGFuY2UuY2NfY291bnQgPSAoKHJlZjEgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwKSB8fCAwO1xuICAgIGRlbGV0ZSBpbnN0YW5jZS5jY191c2VycztcbiAgICByZXR1cm4gc2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuICB9KTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKFwiaW5zdGFuY2VfdGFza3NfdGFidWxhclwiLCBmdW5jdGlvbih0YWJ1bGFyTmFtZSwgaWRzLCBmaWVsZHMpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgY2hlY2sodGFidWxhck5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICByZXR1cm4gZGIuaW5zdGFuY2VfdGFza3MuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGlkc1xuICAgIH1cbiAgfSwge1xuICAgIGZpZWxkczogZmllbGRzXG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKFwiaW5zdGFuY2VzX3RhYnVsYXJcIiwgZnVuY3Rpb24odGFidWxhck5hbWUsIGlkcywgZmllbGRzKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogaWRzXG4gICAgfVxuICB9LCB7XG4gICAgZmllbGRzOiBmaWVsZHNcbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdpbnN0YW5jZXNfZHJhZnQnLCAoc3BhY2VJZCkgLT5cblx0Y2hlY2sgc3BhY2VJZCwgU3RyaW5nXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVzZXJJZCA9IHRoaXMudXNlcklkXG5cdHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7c3RhdGU6XCJkcmFmdFwiLHNwYWNlOnNwYWNlSWQsc3VibWl0dGVyOnVzZXJJZCwkb3I6W3tpbmJveF91c2VyczogeyRleGlzdHM6ZmFsc2V9fSwge2luYm94X3VzZXJzOiBbXX1dfSwge2ZpZWxkczoge19pZDogMSwgc3RhdGU6IDEsIHNwYWNlOiAxLCBzdWJtaXR0ZXI6IDEsIGluYm94X3VzZXJzOiAxLCBtb2RpZmllZDogMSwgbmFtZTogMX0sIHNvcnQ6e21vZGlmaWVkOiAtMX19KSIsIk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZXNfZHJhZnQnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIHZhciB1c2VySWQ7XG4gIGNoZWNrKHNwYWNlSWQsIFN0cmluZyk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHVzZXJJZCA9IHRoaXMudXNlcklkO1xuICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIHN0YXRlOiBcImRyYWZ0XCIsXG4gICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgc3VibWl0dGVyOiB1c2VySWQsXG4gICAgJG9yOiBbXG4gICAgICB7XG4gICAgICAgIGluYm94X3VzZXJzOiB7XG4gICAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBpbmJveF91c2VyczogW11cbiAgICAgIH1cbiAgICBdXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBzdWJtaXR0ZXI6IDEsXG4gICAgICBpbmJveF91c2VyczogMSxcbiAgICAgIG1vZGlmaWVkOiAxLFxuICAgICAgbmFtZTogMVxuICAgIH0sXG4gICAgc29ydDoge1xuICAgICAgbW9kaWZpZWQ6IC0xXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2Rpc3RyaWJ1dGVkX2luc3RhbmNlc19zdGF0ZV9ieV9pZHMnLCAoaW5zdGFuY2VfaWRzKS0+XG5cdGNoZWNrKGluc3RhbmNlX2lkcywgQXJyYXkpXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXHRcblx0dW5sZXNzIGluc3RhbmNlX2lkc1xuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRpZiBfLmlzRW1wdHkoaW5zdGFuY2VfaWRzKVxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRzZWxmID0gdGhpc1xuXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IHskaW46IGluc3RhbmNlX2lkc319LCB7ZmllbGRzOiB7c3RhdGU6IDEsIHRyYWNlczp7JHNsaWNlOiAxfSB9IH0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRhZGRlZDogKGlkLCBmaWVsZHMpLT5cblx0XHRcdHNlbGYuYWRkZWQoJ2luc3RhbmNlcycsIGlkLCB7c3RhdGU6IGZpZWxkcy5zdGF0ZSwgaXNfcmVhZDogZmllbGRzLnRyYWNlc1swXS5hcHByb3Zlc1swXS5pc19yZWFkfSlcblxuXHRcdGNoYW5nZWQ6IChpZCwgZmllbGRzKS0+XG5cdFx0XHRpZiBmaWVsZHMuc3RhdGVcblx0XHRcdFx0c2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge3N0YXRlOiBmaWVsZHMuc3RhdGV9KVxuXHRcdFx0aWYgZmllbGRzLnRyYWNlc1xuXHRcdFx0XHRzZWxmLmNoYW5nZWQoJ2luc3RhbmNlcycsIGlkLCB7aXNfcmVhZDogZmllbGRzLnRyYWNlc1swXS5hcHByb3Zlc1swXS5pc19yZWFkfSlcblx0fVxuXG5cdHRoaXMucmVhZHkoKVxuXHR0aGlzLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Rpc3RyaWJ1dGVkX2luc3RhbmNlc19zdGF0ZV9ieV9pZHMnLCBmdW5jdGlvbihpbnN0YW5jZV9pZHMpIHtcbiAgdmFyIGhhbmRsZSwgc2VsZjtcbiAgY2hlY2soaW5zdGFuY2VfaWRzLCBBcnJheSk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghaW5zdGFuY2VfaWRzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoXy5pc0VtcHR5KGluc3RhbmNlX2lkcykpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGluc3RhbmNlX2lkc1xuICAgIH1cbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgc3RhdGU6IDEsXG4gICAgICB0cmFjZXM6IHtcbiAgICAgICAgJHNsaWNlOiAxXG4gICAgICB9XG4gICAgfVxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgYWRkZWQ6IGZ1bmN0aW9uKGlkLCBmaWVsZHMpIHtcbiAgICAgIHJldHVybiBzZWxmLmFkZGVkKCdpbnN0YW5jZXMnLCBpZCwge1xuICAgICAgICBzdGF0ZTogZmllbGRzLnN0YXRlLFxuICAgICAgICBpc19yZWFkOiBmaWVsZHMudHJhY2VzWzBdLmFwcHJvdmVzWzBdLmlzX3JlYWRcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQsIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkcy5zdGF0ZSkge1xuICAgICAgICBzZWxmLmNoYW5nZWQoJ2luc3RhbmNlcycsIGlkLCB7XG4gICAgICAgICAgc3RhdGU6IGZpZWxkcy5zdGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZHMudHJhY2VzKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoJ2luc3RhbmNlcycsIGlkLCB7XG4gICAgICAgICAgaXNfcmVhZDogZmllbGRzLnRyYWNlc1swXS5hcHByb3Zlc1swXS5pc19yZWFkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRoaXMucmVhZHkoKTtcbiAgcmV0dXJuIHRoaXMub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ3JlbGF0ZWRfaW5zdGFjZXMnLCAoaW5zdGFuY2VJZCwgcmVsYXRlZF9pbnN0YW5jZXMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBpbnN0YW5jZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJlbGF0ZWRfaW5zdGFuY2VfaWRzID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VJZCx7ZmllbGRzOiB7cmVsYXRlZF9pbnN0YW5jZXM6IDF9fSk/LnJlbGF0ZWRfaW5zdGFuY2VzXG5cblx0aWYgcmVsYXRlZF9pbnN0YW5jZV9pZHMgJiYgXy5pc0FycmF5KHJlbGF0ZWRfaW5zdGFuY2VfaWRzKVxuXHRcdHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluIDogcmVsYXRlZF9pbnN0YW5jZV9pZHN9fSwge2ZpZWxkczoge19pZDogMSwgbmFtZTogMSwgc3BhY2U6IDF9fSlcblx0ZWxzZVxuXHRcdHJldHVybiB0aGlzLnJlYWR5KCkiLCJNZXRlb3IucHVibGlzaCgncmVsYXRlZF9pbnN0YWNlcycsIGZ1bmN0aW9uKGluc3RhbmNlSWQsIHJlbGF0ZWRfaW5zdGFuY2VzKSB7XG4gIHZhciByZWYsIHJlbGF0ZWRfaW5zdGFuY2VfaWRzO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWluc3RhbmNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJlbGF0ZWRfaW5zdGFuY2VfaWRzID0gKHJlZiA9IGRiLmluc3RhbmNlcy5maW5kT25lKGluc3RhbmNlSWQsIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHJlbGF0ZWRfaW5zdGFuY2VzOiAxXG4gICAgfVxuICB9KSkgIT0gbnVsbCA/IHJlZi5yZWxhdGVkX2luc3RhbmNlcyA6IHZvaWQgMDtcbiAgaWYgKHJlbGF0ZWRfaW5zdGFuY2VfaWRzICYmIF8uaXNBcnJheShyZWxhdGVkX2luc3RhbmNlX2lkcykpIHtcbiAgICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgICAgX2lkOiB7XG4gICAgICAgICRpbjogcmVsYXRlZF9pbnN0YW5jZV9pZHNcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBuYW1lOiAxLFxuICAgICAgICBzcGFjZTogMVxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbn0pO1xuIiwiaWYgTWV0ZW9yLmlzU2VydmVyXG4gICAgTWV0ZW9yLnB1Ymxpc2ggJ3NwYWNlX3VzZXJfc2lnbnMnLCAoc3BhY2VJZCkgLT5cbiAgICAgICAgY2hlY2sgc3BhY2VJZCwgU3RyaW5nXG5cbiAgICAgICAgdW5sZXNzIHRoaXMudXNlcklkXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkeSgpXG5cbiAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJfc2lnbnMuZmluZCh7IHNwYWNlOiBzcGFjZUlkIH0sIHtmaWVsZHM6IHtjcmVhdGVkX2J5OiAwLCBjcmVhdGVkOiAwLCBtb2RpZmllZF9ieTogMH19KVxuIiwiaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBNZXRlb3IucHVibGlzaCgnc3BhY2VfdXNlcl9zaWducycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgICBjaGVjayhzcGFjZUlkLCBTdHJpbmcpO1xuICAgIGlmICghdGhpcy51c2VySWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gICAgfVxuICAgIHJldHVybiBkYi5zcGFjZV91c2VyX3NpZ25zLmZpbmQoe1xuICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgICAgY3JlYXRlZDogMCxcbiAgICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iLCIjIyNcbk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlIFwidXNlcl9pbmJveF9pbnN0YW5jZVwiLCAoKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1c2VyU3BhY2VJZHMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcblx0XHR1c2VyOiB0aGlzLnVzZXJJZCxcblx0XHR1c2VyX2FjY2VwdGVkOiB0cnVlXG5cdH0sIHtmaWVsZHM6IHtzcGFjZTogMX19KS5mZXRjaCgpLmdldEVhY2goXCJzcGFjZVwiKTtcblx0cXVlcnkgPSB7c3BhY2U6IHskaW46IHVzZXJTcGFjZUlkc319XG5cblx0cXVlcnkuJG9yID0gW3tpbmJveF91c2VyczogdGhpcy51c2VySWR9LCB7Y2NfdXNlcnM6IHRoaXMudXNlcklkfV1cblxuXHRmaW5kOiAtPlxuXHRcdGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7XG5cdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0c3BhY2U6IDEsXG5cdFx0XHRcdGFwcGxpY2FudF9uYW1lOiAxLFxuXHRcdFx0XHRmbG93OiAxLFxuXHRcdFx0XHRpbmJveF91c2VyczogMSxcblx0XHRcdFx0Y2NfdXNlcnM6IDEsXG5cdFx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0XHRuYW1lOiAxLFxuXHRcdFx0XHRtb2RpZmllZDogMSxcblx0XHRcdFx0Zm9ybTogMVxuXHRcdFx0fSwgc29ydDoge21vZGlmaWVkOiAtMX0sIHNraXA6IDAsIGxpbWl0OiAyMDBcblx0XHR9KTtcblx0Y2hpbGRyZW46IFtcblx0XHR7XG5cdFx0XHRmaW5kOiAoaW5zdGFuY2UsIHBvc3QpLT5cblx0XHRcdFx0ZGIuZmxvd3MuZmluZCh7X2lkOiBpbnN0YW5jZS5mbG93fSwge2ZpZWxkczoge25hbWU6IDEsIHNwYWNlOiAxfX0pO1xuXHRcdH1cblx0XVxuIyMjXG5cbiMjI1xuTWV0ZW9yLnB1Ymxpc2ggJ215X2luYm94X2luc3RhbmNlcycsIChzcGFjZUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRzZWxmID0gdGhpcztcblxuXHQjXHR1c2VyU3BhY2VJZHMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcblx0I1x0XHR1c2VyOiB0aGlzLnVzZXJJZCxcblx0I1x0XHR1c2VyX2FjY2VwdGVkOiB0cnVlXG5cdCNcdH0sIHtmaWVsZHM6IHtzcGFjZTogMX19KS5mZXRjaCgpLmdldEVhY2goXCJzcGFjZVwiKTtcblxuXHRxdWVyeSA9IHtzcGFjZTogc3BhY2VJZH1cblxuXHRxdWVyeS4kb3IgPSBbe2luYm94X3VzZXJzOiB0aGlzLnVzZXJJZH0sIHtjY191c2VyczogdGhpcy51c2VySWR9XVxuXG5cdGZpZWxkcyA9IHtcblx0XHRzcGFjZTogMSxcbiNcdFx0YXBwbGljYW50X25hbWU6IDEsXG5cdFx0ZmxvdzogMSxcblx0XHRpbmJveF91c2VyczogMSxcblx0XHRjY191c2VyczogMSxcblx0XHRzdGF0ZTogMSxcbiNcdFx0bmFtZTogMSxcbiNcdFx0bW9kaWZpZWQ6IDEsXG5cdFx0Zm9ybTogMVxuXHR9XG5cblx0aGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtzb3J0OiB7bW9kaWZpZWQ6IC0xfSwgc2tpcDogMCwgbGltaXQ6IDUwMH0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRhZGRlZDogKGlkKS0+XG5cdFx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0XHRzZWxmLmFkZGVkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSlcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuXHRcdHJlbW92ZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcblx0fVxuXG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcbiMjI1xuXG5fZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSA9IChzcGFjZUlkLCB1c2VySWQsIF9pdGVtcywgY2FsbGJhY2spLT5cblx0ZGIuaW5zdGFuY2VzLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUoW1xuXHRcdHtcblx0XHRcdCRtYXRjaDoge1xuXHRcdFx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRcdFx0JG9yOiBbe2luYm94X3VzZXJzOiB1c2VySWR9LCB7Y2NfdXNlcnM6IHVzZXJJZH1dXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHQkZ3JvdXA6IHtcblx0XHRcdFx0X2lkOiB7ZmxvdzogXCIkZmxvd1wiLCBjYXRlZ29yeTogXCIkY2F0ZWdvcnlcIn0sIGNvdW50OiB7JHN1bTogMX1cblx0XHRcdH1cblx0XHR9XG5cdF0pLnRvQXJyYXkgKGVyciwgZGF0YSktPlxuXHRcdGlmIGVyclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGVycilcblxuXHRcdGRhdGEuZm9yRWFjaCAoZG9jKSAtPlxuXHRcdFx0X2l0ZW1zLnB1c2ggZG9jXG5cblx0XHRpZiBjYWxsYmFjayAmJiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spXG5cdFx0XHRjYWxsYmFjaygpXG5cdFx0cmV0dXJuXG5cbl9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlID0gTWV0ZW9yLndyYXBBc3luYyhfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSlcblxuTWV0ZW9yLnB1Ymxpc2ggJ215X2luYm94X2Zsb3dfaW5zdGFuY2VzX2NvdW50JywgKHNwYWNlSWQpLT5cblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0cXVlcnkgPSB7c3BhY2U6IHNwYWNlSWR9XG5cblx0cXVlcnkuJG9yID0gW3tpbmJveF91c2VyczogdGhpcy51c2VySWR9LCB7Y2NfdXNlcnM6IHRoaXMudXNlcklkfV1cblxuXHRkYXRhID0gW10gICPmlbDmja7moLzlvI/vvJpbe19pZDpmbG93SWQsIGNvdW50OiDlvoXlip7mlbDph499LCB7X2lkOmZsb3dJZDIsIGNvdW50OiDlvoXlip7mlbDph48yfV1cblx0X2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUoc3BhY2VJZCwgc2VsZi51c2VySWQsIGRhdGEpXG5cblx0X2Zsb3dzRGF0YSA9IFtdXG5cblx0Xy5lYWNoIGRhdGEsIChkYXRhSXRlbSktPlxuXHRcdF9mbG93c0RhdGEucHVzaCh7X2lkOiBkYXRhSXRlbS5faWQuZmxvdywgY2F0ZWdvcnk6IGRhdGFJdGVtLl9pZC5jYXRlZ29yeSwgY291bnQ6IGRhdGFJdGVtLmNvdW50fSlcblxuXHRzZWxmLmFkZGVkKFwiZmxvd19pbnN0YW5jZXNcIiwgc3BhY2VJZCwge2Zsb3dzOiBfZmxvd3NEYXRhfSk7XG5cblx0X2NoYW5nZURhdGEgPSAoZG9jLCBhY3Rpb24pLT5cblx0XHRmbG93X2luc3RhbmNlID0gXy5maW5kIF9mbG93c0RhdGEsIChmKS0+XG5cdFx0XHRyZXR1cm4gZi5faWQgPT0gZG9jLmZsb3dcblx0XHRpZiBmbG93X2luc3RhbmNlXG5cdFx0XHRpZiBhY3Rpb24gPT0gXCJhZGRlZFwiXG5cdFx0XHRcdGZsb3dfaW5zdGFuY2UuY291bnQrK1xuXHRcdFx0ZWxzZSBpZiBhY3Rpb24gPT0gXCJyZW1vdmVkXCJcblx0XHRcdFx0Zmxvd19pbnN0YW5jZS5jb3VudC0tXG5cdFx0ZWxzZSBpZiBhY3Rpb24gPT0gXCJhZGRlZFwiXG5cdFx0XHRfZmxvd3NEYXRhLnB1c2gge19pZDogZG9jLmZsb3csIGNhdGVnb3J5OiBkb2MuY2F0ZWdvcnksIGNvdW50OiAxfVxuXG5cdFx0c2VsZi5jaGFuZ2VkKFwiZmxvd19pbnN0YW5jZXNcIiwgc3BhY2VJZCwge2Zsb3dzOiBfZmxvd3NEYXRhfSk7XG5cblx0X2luaXQgPSB0cnVlXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7ZmllbGRzOiB7X2lkOiAxLCBpbmJveF91c2VyczogMSwgY2NfdXNlcnM6IDEsIGZsb3c6IDEsIGNhdGVnb3J5OiAxfX0pLm9ic2VydmUge1xuXHRcdGFkZGVkOiAoZG9jKS0+XG5cdFx0XHRpZiAhX2luaXRcblx0XHRcdFx0X2NoYW5nZURhdGEoZG9jLCBcImFkZGVkXCIpXG5cdFx0cmVtb3ZlZDogKGRvYyktPlxuXHRcdFx0aWYgIV9pbml0XG5cdFx0XHRcdF9jaGFuZ2VEYXRhKGRvYywgXCJyZW1vdmVkXCIpXG5cdH1cblx0X2luaXQgPSBmYWxzZVxuXG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKCkiLCJcbi8qXG5NZXRlb3IucHVibGlzaENvbXBvc2l0ZSBcInVzZXJfaW5ib3hfaW5zdGFuY2VcIiwgKCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dXNlclNwYWNlSWRzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG5cdFx0dXNlcjogdGhpcy51c2VySWQsXG5cdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKS5nZXRFYWNoKFwic3BhY2VcIik7XG5cdHF1ZXJ5ID0ge3NwYWNlOiB7JGluOiB1c2VyU3BhY2VJZHN9fVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZmluZDogLT5cblx0XHRkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuXHRcdFx0ZmllbGRzOiB7XG5cdFx0XHRcdHNwYWNlOiAxLFxuXHRcdFx0XHRhcHBsaWNhbnRfbmFtZTogMSxcblx0XHRcdFx0ZmxvdzogMSxcblx0XHRcdFx0aW5ib3hfdXNlcnM6IDEsXG5cdFx0XHRcdGNjX3VzZXJzOiAxLFxuXHRcdFx0XHRzdGF0ZTogMSxcblx0XHRcdFx0bmFtZTogMSxcblx0XHRcdFx0bW9kaWZpZWQ6IDEsXG5cdFx0XHRcdGZvcm06IDFcblx0XHRcdH0sIHNvcnQ6IHttb2RpZmllZDogLTF9LCBza2lwOiAwLCBsaW1pdDogMjAwXG5cdFx0fSk7XG5cdGNoaWxkcmVuOiBbXG5cdFx0e1xuXHRcdFx0ZmluZDogKGluc3RhbmNlLCBwb3N0KS0+XG5cdFx0XHRcdGRiLmZsb3dzLmZpbmQoe19pZDogaW5zdGFuY2UuZmxvd30sIHtmaWVsZHM6IHtuYW1lOiAxLCBzcGFjZTogMX19KTtcblx0XHR9XG5cdF1cbiAqL1xuXG4vKlxuTWV0ZW9yLnB1Ymxpc2ggJ215X2luYm94X2luc3RhbmNlcycsIChzcGFjZUlkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRzZWxmID0gdGhpcztcblxuXHQgKlx0dXNlclNwYWNlSWRzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG5cdCAqXHRcdHVzZXI6IHRoaXMudXNlcklkLFxuXHQgKlx0XHR1c2VyX2FjY2VwdGVkOiB0cnVlXG5cdCAqXHR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKS5nZXRFYWNoKFwic3BhY2VcIik7XG5cblx0cXVlcnkgPSB7c3BhY2U6IHNwYWNlSWR9XG5cblx0cXVlcnkuJG9yID0gW3tpbmJveF91c2VyczogdGhpcy51c2VySWR9LCB7Y2NfdXNlcnM6IHRoaXMudXNlcklkfV1cblxuXHRmaWVsZHMgPSB7XG5cdFx0c3BhY2U6IDEsXG4gKlx0XHRhcHBsaWNhbnRfbmFtZTogMSxcblx0XHRmbG93OiAxLFxuXHRcdGluYm94X3VzZXJzOiAxLFxuXHRcdGNjX3VzZXJzOiAxLFxuXHRcdHN0YXRlOiAxLFxuICpcdFx0bmFtZTogMSxcbiAqXHRcdG1vZGlmaWVkOiAxLFxuXHRcdGZvcm06IDFcblx0fVxuXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7c29ydDoge21vZGlmaWVkOiAtMX0sIHNraXA6IDAsIGxpbWl0OiA1MDB9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0YWRkZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0c2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpXG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcblx0XHRyZW1vdmVkOiAoaWQpLT5cblx0XHRcdHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG5cdH1cblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG4gKi9cbnZhciBfYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSwgX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGU7XG5cbl9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlID0gZnVuY3Rpb24oc3BhY2VJZCwgdXNlcklkLCBfaXRlbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBkYi5pbnN0YW5jZXMucmF3Q29sbGVjdGlvbigpLmFnZ3JlZ2F0ZShbXG4gICAge1xuICAgICAgJG1hdGNoOiB7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAkb3I6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbmJveF91c2VyczogdXNlcklkXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgY2NfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgICRncm91cDoge1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICBmbG93OiBcIiRmbG93XCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiJGNhdGVnb3J5XCJcbiAgICAgICAgfSxcbiAgICAgICAgY291bnQ6IHtcbiAgICAgICAgICAkc3VtOiAxXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIF0pLnRvQXJyYXkoZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycik7XG4gICAgfVxuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihkb2MpIHtcbiAgICAgIHJldHVybiBfaXRlbXMucHVzaChkb2MpO1xuICAgIH0pO1xuICAgIGlmIChjYWxsYmFjayAmJiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5fYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSA9IE1ldGVvci53cmFwQXN5bmMoX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUpO1xuXG5NZXRlb3IucHVibGlzaCgnbXlfaW5ib3hfZmxvd19pbnN0YW5jZXNfY291bnQnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIHZhciBfY2hhbmdlRGF0YSwgX2Zsb3dzRGF0YSwgX2luaXQsIGRhdGEsIGhhbmRsZSwgcXVlcnksIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBxdWVyeSA9IHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9O1xuICBxdWVyeS4kb3IgPSBbXG4gICAge1xuICAgICAgaW5ib3hfdXNlcnM6IHRoaXMudXNlcklkXG4gICAgfSwge1xuICAgICAgY2NfdXNlcnM6IHRoaXMudXNlcklkXG4gICAgfVxuICBdO1xuICBkYXRhID0gW107XG4gIF9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlKHNwYWNlSWQsIHNlbGYudXNlcklkLCBkYXRhKTtcbiAgX2Zsb3dzRGF0YSA9IFtdO1xuICBfLmVhY2goZGF0YSwgZnVuY3Rpb24oZGF0YUl0ZW0pIHtcbiAgICByZXR1cm4gX2Zsb3dzRGF0YS5wdXNoKHtcbiAgICAgIF9pZDogZGF0YUl0ZW0uX2lkLmZsb3csXG4gICAgICBjYXRlZ29yeTogZGF0YUl0ZW0uX2lkLmNhdGVnb3J5LFxuICAgICAgY291bnQ6IGRhdGFJdGVtLmNvdW50XG4gICAgfSk7XG4gIH0pO1xuICBzZWxmLmFkZGVkKFwiZmxvd19pbnN0YW5jZXNcIiwgc3BhY2VJZCwge1xuICAgIGZsb3dzOiBfZmxvd3NEYXRhXG4gIH0pO1xuICBfY2hhbmdlRGF0YSA9IGZ1bmN0aW9uKGRvYywgYWN0aW9uKSB7XG4gICAgdmFyIGZsb3dfaW5zdGFuY2U7XG4gICAgZmxvd19pbnN0YW5jZSA9IF8uZmluZChfZmxvd3NEYXRhLCBmdW5jdGlvbihmKSB7XG4gICAgICByZXR1cm4gZi5faWQgPT09IGRvYy5mbG93O1xuICAgIH0pO1xuICAgIGlmIChmbG93X2luc3RhbmNlKSB7XG4gICAgICBpZiAoYWN0aW9uID09PSBcImFkZGVkXCIpIHtcbiAgICAgICAgZmxvd19pbnN0YW5jZS5jb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwicmVtb3ZlZFwiKSB7XG4gICAgICAgIGZsb3dfaW5zdGFuY2UuY291bnQtLTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gXCJhZGRlZFwiKSB7XG4gICAgICBfZmxvd3NEYXRhLnB1c2goe1xuICAgICAgICBfaWQ6IGRvYy5mbG93LFxuICAgICAgICBjYXRlZ29yeTogZG9jLmNhdGVnb3J5LFxuICAgICAgICBjb3VudDogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJmbG93X2luc3RhbmNlc1wiLCBzcGFjZUlkLCB7XG4gICAgICBmbG93czogX2Zsb3dzRGF0YVxuICAgIH0pO1xuICB9O1xuICBfaW5pdCA9IHRydWU7XG4gIGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBfaWQ6IDEsXG4gICAgICBpbmJveF91c2VyczogMSxcbiAgICAgIGNjX3VzZXJzOiAxLFxuICAgICAgZmxvdzogMSxcbiAgICAgIGNhdGVnb3J5OiAxXG4gICAgfVxuICB9KS5vYnNlcnZlKHtcbiAgICBhZGRlZDogZnVuY3Rpb24oZG9jKSB7XG4gICAgICBpZiAoIV9pbml0KSB7XG4gICAgICAgIHJldHVybiBfY2hhbmdlRGF0YShkb2MsIFwiYWRkZWRcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICByZW1vdmVkOiBmdW5jdGlvbihkb2MpIHtcbiAgICAgIGlmICghX2luaXQpIHtcbiAgICAgICAgcmV0dXJuIF9jaGFuZ2VEYXRhKGRvYywgXCJyZW1vdmVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIF9pbml0ID0gZmFsc2U7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuIiwiXG5NZXRlb3IucHVibGlzaCAnZmxvd19tYWluX2F0dGFjaF90ZW1wbGF0ZScsIChzcGFjZUlkLCBmbG93SWQpLT5cblx0Y2hlY2soc3BhY2VJZCwgU3RyaW5nKVxuXHRjaGVjayhmbG93SWQsIFN0cmluZylcblxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWQgJiYgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Ntc19maWxlcycpLmZpbmQoeyBzcGFjZTogc3BhY2VJZCwgJ3BhcmVudC5vJzogJ2Zsb3dzJywgJ3BhcmVudC5pZHMnOiBmbG93SWQsICBuYW1lOiAn5q2j5paHLmRvY3gnIH0pXG4iLCJNZXRlb3IucHVibGlzaCgnZmxvd19tYWluX2F0dGFjaF90ZW1wbGF0ZScsIGZ1bmN0aW9uKHNwYWNlSWQsIGZsb3dJZCkge1xuICBjaGVjayhzcGFjZUlkLCBTdHJpbmcpO1xuICBjaGVjayhmbG93SWQsIFN0cmluZyk7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghKHNwYWNlSWQgJiYgZmxvd0lkKSkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbignY21zX2ZpbGVzJykuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgJ3BhcmVudC5vJzogJ2Zsb3dzJyxcbiAgICAncGFyZW50Lmlkcyc6IGZsb3dJZCxcbiAgICBuYW1lOiAn5q2j5paHLmRvY3gnXG4gIH0pO1xufSk7XG4iLCJ3b3JrZmxvd1RlbXBsYXRlID0ge31cblxuI+WPr+eUqOatpOiEmuacrOS7juaooeadv+W3peS9nOWMuuWBmuaJuemHj+WvvOWHuu+8mlxuI+S9v+eUqOeuoeeQhuWRmOi0puaIt+eZu+W9leWQju+8jOi/m+WFpUZsb3dNb2R1bGVz77yM5Zyo5o6n5Yi25Y+w5omn6KGM5Lul5LiL6ISa5pys5Y2z5Y+vXG4jZGIuZm9ybXMuZmluZCh7c3RhdGU6XCJlbmFibGVkXCJ9KS5mb3JFYWNoKGZ1bmN0aW9uKGZvcm0pe3dpbmRvdy5vcGVuKE1ldGVvci5hYnNvbHV0ZVVybChcImFwaS93b3JrZmxvdy9leHBvcnQvZm9ybT9mb3JtPVwiK2Zvcm0uX2lkKSl9KVxud29ya2Zsb3dUZW1wbGF0ZVtcImVuXCJdID1bXVxuXG4j5Y+v55So5q2k6ISa5pys5LuO5qih5p2/5bel5L2c5Yy65YGa5om56YeP5a+85Ye677yaXG4j5L2/55So566h55CG5ZGY6LSm5oi355m75b2V5ZCO77yM6L+b5YWl5qih5p2/5LiT5Yy677yM5Zyo5o6n5Yi25Y+w5omn6KGM5Lul5LiL6ISa5pys5Y2z5Y+vXG4jZGIuZm9ybXMuZmluZCh7c3RhdGU6XCJlbmFibGVkXCJ9KS5mb3JFYWNoKGZ1bmN0aW9uKGZvcm0pe3dpbmRvdy5vcGVuKE1ldGVvci5hYnNvbHV0ZVVybChcImFwaS93b3JrZmxvdy9leHBvcnQvZm9ybT9mb3JtPVwiK2Zvcm0uX2lkKSl9KVxud29ya2Zsb3dUZW1wbGF0ZVtcInpoLUNOXCJdID1bXVxuXG5NZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdGZzID0gcmVxdWlyZSgnZnMnKVxuXHRwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cdG1pbWUgPSByZXF1aXJlKCdtaW1lJylcblx0cmVhZEZpbGVMaXN0ID0gKHBhdGhEaXIsIGZpbGVzTGlzdCktPlxuXHRcdGZpbGVzID0gZnMucmVhZGRpclN5bmMocGF0aERpcilcblx0XHRmaWxlcy5mb3JFYWNoIChuYW1lLCBpbmRleCktPlxuXHRcdFx0c3RhdCA9IGZzLnN0YXRTeW5jKHBhdGguam9pbihwYXRoRGlyLCBuYW1lKSlcblx0XHRcdGlmIHN0YXQuaXNEaXJlY3RvcnkoKVxuXHRcdFx0XHQjIOmAkuW9kuivu+WPluaWh+S7tlxuXHRcdFx0XHRyZWFkRmlsZUxpc3QocGF0aC5qb2luKHBhdGhEaXIsIG5hbWUpLCBmaWxlc0xpc3QpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdG9iaiA9IHt9XG5cdFx0XHRcdG9iai5wYXRoID0gcGF0aERpclxuXHRcdFx0XHRvYmoubmFtZSA9IG5hbWVcblx0XHRcdFx0ZmlsZXNMaXN0LnB1c2gob2JqKVxuXG5cdCPojrflj5Z6aC1jbuaWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlxuXHRmaWxlc0xpc3RfY24gPSBbXVxuXHRwYXRoX2NuID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzPy5wYXRoX2NuXG5cdGlmIHBhdGhfY25cblx0XHRhYnNvbHV0ZV9wYXRoX2NuID0gcGF0aC5yZXNvbHZlKHBhdGhfY24pXG5cdFx0Y29uc29sZS5sb2cgXCJhYnNvbHV0ZV9wYXRoX2NuXCIsIGFic29sdXRlX3BhdGhfY25cblx0XHRpZiBmcy5leGlzdHNTeW5jKGFic29sdXRlX3BhdGhfY24pXG5cdFx0XHRyZWFkRmlsZUxpc3QoYWJzb2x1dGVfcGF0aF9jbiwgZmlsZXNMaXN0X2NuKVxuXHRcdFx0ZmlsZXNMaXN0X2NuLmZvckVhY2ggKGZpbGUpLT5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0aWYgbWltZS5nZXRUeXBlKGZpbGUubmFtZSkgaXMgXCJhcHBsaWNhdGlvbi9qc29uXCJcblx0XHRcdFx0XHRcdGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSwgJ3V0ZjgnKVxuXHRcdFx0XHRcdFx0d29ya2Zsb3dUZW1wbGF0ZVtcInpoLUNOXCJdLnB1c2goSlNPTi5wYXJzZShkYXRhKSlcblx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCLojrflj5Z6aC1jbuaWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlwiLCBwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cblx0I+iOt+WPlmVuLXVz5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2XG5cdGZpbGVzTGlzdF91cyA9IFtdXG5cdHBhdGhfdXMgPSBNZXRlb3Iuc2V0dGluZ3Mud29ya2Zsb3dUZW1wbGF0ZXM/LnBhdGhfdXNcblx0aWYgcGF0aF91c1xuXHRcdGFic29sdXRlX3BhdGhfdXMgPSBwYXRoLnJlc29sdmUocGF0aF91cylcblx0XHRjb25zb2xlLmxvZyBcImFic29sdXRlX3BhdGhfdXNcIiwgYWJzb2x1dGVfcGF0aF91c1xuXHRcdGlmIGZzLmV4aXN0c1N5bmMoYWJzb2x1dGVfcGF0aF91cylcblx0XHRcdHJlYWRGaWxlTGlzdChhYnNvbHV0ZV9wYXRoX3VzLCBmaWxlc0xpc3RfdXMpXG5cdFx0XHRmaWxlc0xpc3RfdXMuZm9yRWFjaCAoZmlsZSktPlxuXHRcdFx0XHR0cnlcblx0XHRcdFx0XHRpZiBtaW1lLmdldFR5cGUoZmlsZS5uYW1lKSBpcyBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdFx0XHRcdFx0ZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpLCAndXRmOCcpXG5cdFx0XHRcdFx0XHR3b3JrZmxvd1RlbXBsYXRlW1wiZW5cIl0ucHVzaChKU09OLnBhcnNlKGRhdGEpKVxuXHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcIuiOt+WPlmVuLXVz5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2XCIsIHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSlcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblx0XHRcdFx0XG5cdFx0XHRcdFx0XG5cblxuIiwiICAgICAgICAgICAgICAgICAgICAgXG5cbndvcmtmbG93VGVtcGxhdGUgPSB7fTtcblxud29ya2Zsb3dUZW1wbGF0ZVtcImVuXCJdID0gW107XG5cbndvcmtmbG93VGVtcGxhdGVbXCJ6aC1DTlwiXSA9IFtdO1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdmFyIGFic29sdXRlX3BhdGhfY24sIGFic29sdXRlX3BhdGhfdXMsIGZpbGVzTGlzdF9jbiwgZmlsZXNMaXN0X3VzLCBmcywgbWltZSwgcGF0aCwgcGF0aF9jbiwgcGF0aF91cywgcmVhZEZpbGVMaXN0LCByZWYsIHJlZjE7XG4gIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiAgbWltZSA9IHJlcXVpcmUoJ21pbWUnKTtcbiAgcmVhZEZpbGVMaXN0ID0gZnVuY3Rpb24ocGF0aERpciwgZmlsZXNMaXN0KSB7XG4gICAgdmFyIGZpbGVzO1xuICAgIGZpbGVzID0gZnMucmVhZGRpclN5bmMocGF0aERpcik7XG4gICAgcmV0dXJuIGZpbGVzLmZvckVhY2goZnVuY3Rpb24obmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciBvYmosIHN0YXQ7XG4gICAgICBzdGF0ID0gZnMuc3RhdFN5bmMocGF0aC5qb2luKHBhdGhEaXIsIG5hbWUpKTtcbiAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRGaWxlTGlzdChwYXRoLmpvaW4ocGF0aERpciwgbmFtZSksIGZpbGVzTGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmogPSB7fTtcbiAgICAgICAgb2JqLnBhdGggPSBwYXRoRGlyO1xuICAgICAgICBvYmoubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBmaWxlc0xpc3QucHVzaChvYmopO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBmaWxlc0xpc3RfY24gPSBbXTtcbiAgcGF0aF9jbiA9IChyZWYgPSBNZXRlb3Iuc2V0dGluZ3Mud29ya2Zsb3dUZW1wbGF0ZXMpICE9IG51bGwgPyByZWYucGF0aF9jbiA6IHZvaWQgMDtcbiAgaWYgKHBhdGhfY24pIHtcbiAgICBhYnNvbHV0ZV9wYXRoX2NuID0gcGF0aC5yZXNvbHZlKHBhdGhfY24pO1xuICAgIGNvbnNvbGUubG9nKFwiYWJzb2x1dGVfcGF0aF9jblwiLCBhYnNvbHV0ZV9wYXRoX2NuKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhhYnNvbHV0ZV9wYXRoX2NuKSkge1xuICAgICAgcmVhZEZpbGVMaXN0KGFic29sdXRlX3BhdGhfY24sIGZpbGVzTGlzdF9jbik7XG4gICAgICBmaWxlc0xpc3RfY24uZm9yRWFjaChmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHZhciBkYXRhLCBlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtaW1lLmdldFR5cGUoZmlsZS5uYW1lKSA9PT0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIHtcbiAgICAgICAgICAgIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd1RlbXBsYXRlW1wiemgtQ05cIl0ucHVzaChKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLojrflj5Z6aC1jbuaWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlwiLCBwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpKTtcbiAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZpbGVzTGlzdF91cyA9IFtdO1xuICBwYXRoX3VzID0gKHJlZjEgPSBNZXRlb3Iuc2V0dGluZ3Mud29ya2Zsb3dUZW1wbGF0ZXMpICE9IG51bGwgPyByZWYxLnBhdGhfdXMgOiB2b2lkIDA7XG4gIGlmIChwYXRoX3VzKSB7XG4gICAgYWJzb2x1dGVfcGF0aF91cyA9IHBhdGgucmVzb2x2ZShwYXRoX3VzKTtcbiAgICBjb25zb2xlLmxvZyhcImFic29sdXRlX3BhdGhfdXNcIiwgYWJzb2x1dGVfcGF0aF91cyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYWJzb2x1dGVfcGF0aF91cykpIHtcbiAgICAgIHJlYWRGaWxlTGlzdChhYnNvbHV0ZV9wYXRoX3VzLCBmaWxlc0xpc3RfdXMpO1xuICAgICAgcmV0dXJuIGZpbGVzTGlzdF91cy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgdmFyIGRhdGEsIGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG1pbWUuZ2V0VHlwZShmaWxlLm5hbWUpID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgICAgICAgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpLCAndXRmOCcpO1xuICAgICAgICAgICAgcmV0dXJuIHdvcmtmbG93VGVtcGxhdGVbXCJlblwiXS5wdXNoKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIuiOt+WPlmVuLXVz5paH5Lu25aS55LiL55qE5omA5pyJ5paH5Lu2XCIsIHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSkpO1xuICAgICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiIyMjXG4qICAgICogICAgKiAgICAqICAgICogICAgKlxu4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAgfFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJQgZGF5IG9mIHdlZWsgKDAgLSA3KSAoMCBvciA3IGlzIFN1bilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIAgbW9udGggKDEgLSAxMilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBkYXkgb2YgbW9udGggKDEgLSAzMSlcbuKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGhvdXIgKDAgLSAyMylcbuKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgbWludXRlICgwIC0gNTkpXG7ilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2Vjb25kICgwIC0gNTksIE9QVElPTkFMKVxuIyMjXG5NZXRlb3Iuc3RhcnR1cCAtPlxuXHRpZiBNZXRlb3Iuc2V0dGluZ3MuY3Jvbj8uYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uXG5cdFx0c2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJylcblx0XHQjIOWumuaXtuaJp+ihjOWQjOatpVxuXHRcdHJ1bGUgPSBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi5hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb25cblx0XHRnb19uZXh0ID0gdHJ1ZVxuXHRcdHNjaGVkdWxlLnNjaGVkdWxlSm9iIHJ1bGUsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQgKCktPlxuXHRcdFx0dHJ5XG5cdFx0XHRcdGlmICFnb19uZXh0XG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGdvX25leHQgPSBmYWxzZVxuXHRcdFx0XHRjb25zb2xlLnRpbWUgJ2F1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbidcblxuXHRcdFx0XHRub3cgPSBuZXcgRGF0ZVxuXG5cdFx0XHRcdCMg5bCG5aeU5omY6KeE5YiZ6K6+572u5Li65LiN5Y+v55SoXG5cdFx0XHRcdGRiLnByb2Nlc3NfZGVsZWdhdGlvbl9ydWxlcy51cGRhdGUoeyBlbmFibGVkOiB0cnVlLCBlbmRfdGltZTogeyAkbHRlOiBub3cgfSB9LCB7ICRzZXQ6IHsgZW5hYmxlZDogZmFsc2UgfSB9LCB7IG11bHRpIDp0cnVlIH0pXG5cblx0XHRcdFx0Y29uc29sZS50aW1lRW5kICdhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24nXG5cdFx0XHRcdGdvX25leHQgPSB0cnVlXG5cblx0XHRcdGNhdGNoIGVcblx0XHRcdFx0Y29uc29sZS5lcnJvciBcIkFVVE8gQVVUT19GSU5JU0hfUFJPQ0VTU19ERUxFR0FUSU9OIEVSUk9SOiBcIlxuXHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblx0XHRcdFx0Z29fbmV4dCA9IHRydWVcblxuXHRcdCwgKGUpLT5cblx0XHRcdGNvbnNvbGUubG9nICdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZSdcblx0XHRcdGNvbnNvbGUubG9nIGUuc3RhY2tcbiIsIlxuLypcbiogICAgKiAgICAqICAgICogICAgKiAgICAqXG7ilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICB8XG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlCBkYXkgb2Ygd2VlayAoMCAtIDcpICgwIG9yIDcgaXMgU3VuKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgCBtb250aCAoMSAtIDEyKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGRheSBvZiBtb250aCAoMSAtIDMxKVxu4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgaG91ciAoMCAtIDIzKVxu4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBtaW51dGUgKDAgLSA1OSlcbuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBzZWNvbmQgKDAgLSA1OSwgT1BUSU9OQUwpXG4gKi9cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICB2YXIgZ29fbmV4dCwgcmVmLCBydWxlLCBzY2hlZHVsZTtcbiAgaWYgKChyZWYgPSBNZXRlb3Iuc2V0dGluZ3MuY3JvbikgIT0gbnVsbCA/IHJlZi5hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24gOiB2b2lkIDApIHtcbiAgICBzY2hlZHVsZSA9IHJlcXVpcmUoJ25vZGUtc2NoZWR1bGUnKTtcbiAgICBydWxlID0gTWV0ZW9yLnNldHRpbmdzLmNyb24uYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uO1xuICAgIGdvX25leHQgPSB0cnVlO1xuICAgIHJldHVybiBzY2hlZHVsZS5zY2hlZHVsZUpvYihydWxlLCBNZXRlb3IuYmluZEVudmlyb25tZW50KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUsIG5vdztcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZ29fbmV4dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnb19uZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUudGltZSgnYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uJyk7XG4gICAgICAgIG5vdyA9IG5ldyBEYXRlO1xuICAgICAgICBkYi5wcm9jZXNzX2RlbGVnYXRpb25fcnVsZXMudXBkYXRlKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGVuZF90aW1lOiB7XG4gICAgICAgICAgICAkbHRlOiBub3dcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2F1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbicpO1xuICAgICAgICByZXR1cm4gZ29fbmV4dCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBVVRPIEFVVE9fRklOSVNIX1BST0NFU1NfREVMRUdBVElPTiBFUlJPUjogXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgICByZXR1cm4gZ29fbmV4dCA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oZSkge1xuICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCB0byBiaW5kIGVudmlyb25tZW50OiBhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24uY29mZmVlJyk7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coZS5zdGFjayk7XG4gICAgfSkpO1xuICB9XG59KTtcbiIsIiMjI1xuKiAgICAqICAgICogICAgKiAgICAqICAgICpcbuKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIHxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSUIGRheSBvZiB3ZWVrICgwIC0gNykgKDAgb3IgNyBpcyBTdW4pXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSAIG1vbnRoICgxIC0gMTIpXG7ilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgZGF5IG9mIG1vbnRoICgxIC0gMzEpXG7ilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBob3VyICgwIC0gMjMpXG7ilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIG1pbnV0ZSAoMCAtIDU5KVxu4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHNlY29uZCAoMCAtIDU5LCBPUFRJT05BTClcbiMjI1xuTWV0ZW9yLnN0YXJ0dXAgLT5cblx0aWYgTWV0ZW9yLnNldHRpbmdzLmNyb24/LnRpbWVvdXRfYXV0b19zdWJtaXRcblx0XHRzY2hlZHVsZSA9IHJlcXVpcmUoJ25vZGUtc2NoZWR1bGUnKVxuXHRcdCMg5a6a5pe25omn6KGM5ZCM5q2lXG5cdFx0cnVsZSA9IE1ldGVvci5zZXR0aW5ncy5jcm9uLnRpbWVvdXRfYXV0b19zdWJtaXRcblx0XHRnb19uZXh0ID0gdHJ1ZVxuXHRcdHNjaGVkdWxlLnNjaGVkdWxlSm9iIHJ1bGUsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQgKCktPlxuXHRcdFx0dHJ5XG5cdFx0XHRcdGlmICFnb19uZXh0XG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGdvX25leHQgPSBmYWxzZVxuXHRcdFx0XHRjb25zb2xlLnRpbWUgJ3RpbWVvdXRfYXV0b19zdWJtaXQnXG5cblx0XHRcdFx0dXVmbG93TWFuYWdlci50aW1lb3V0QXV0b1N1Ym1pdCgpXG5cblx0XHRcdFx0Y29uc29sZS50aW1lRW5kICd0aW1lb3V0X2F1dG9fc3VibWl0J1xuXHRcdFx0XHRnb19uZXh0ID0gdHJ1ZVxuXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJBVVRPIFRJTUVPVVRfQVVUT19TVUJNSVQgRVJST1I6IFwiXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXHRcdFx0XHRnb19uZXh0ID0gdHJ1ZVxuXG5cdFx0LCAoZSktPlxuXHRcdFx0Y29uc29sZS5sb2cgJ0ZhaWxlZCB0byBiaW5kIGVudmlyb25tZW50OiB0aW1lb3V0X2F1dG9fc3VibWl0LmNvZmZlZSdcblx0XHRcdGNvbnNvbGUubG9nIGUuc3RhY2tcblxuTWV0ZW9yLm1ldGhvZHNcblx0dGltZW91dF9hdXRvX3N1Ym1pdDogKGluc19pZCktPlxuXHRcdHV1Zmxvd01hbmFnZXIudGltZW91dEF1dG9TdWJtaXQoaW5zX2lkKVxuXHRcdHJldHVybiB0cnVlXG5cblxuIiwiXG4vKlxuKiAgICAqICAgICogICAgKiAgICAqICAgICpcbuKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIHxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSUIGRheSBvZiB3ZWVrICgwIC0gNykgKDAgb3IgNyBpcyBTdW4pXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSAIG1vbnRoICgxIC0gMTIpXG7ilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgZGF5IG9mIG1vbnRoICgxIC0gMzEpXG7ilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBob3VyICgwIC0gMjMpXG7ilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIG1pbnV0ZSAoMCAtIDU5KVxu4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHNlY29uZCAoMCAtIDU5LCBPUFRJT05BTClcbiAqL1xuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHZhciBnb19uZXh0LCByZWYsIHJ1bGUsIHNjaGVkdWxlO1xuICBpZiAoKHJlZiA9IE1ldGVvci5zZXR0aW5ncy5jcm9uKSAhPSBudWxsID8gcmVmLnRpbWVvdXRfYXV0b19zdWJtaXQgOiB2b2lkIDApIHtcbiAgICBzY2hlZHVsZSA9IHJlcXVpcmUoJ25vZGUtc2NoZWR1bGUnKTtcbiAgICBydWxlID0gTWV0ZW9yLnNldHRpbmdzLmNyb24udGltZW91dF9hdXRvX3N1Ym1pdDtcbiAgICBnb19uZXh0ID0gdHJ1ZTtcbiAgICByZXR1cm4gc2NoZWR1bGUuc2NoZWR1bGVKb2IocnVsZSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFnb19uZXh0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdvX25leHQgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS50aW1lKCd0aW1lb3V0X2F1dG9fc3VibWl0Jyk7XG4gICAgICAgIHV1Zmxvd01hbmFnZXIudGltZW91dEF1dG9TdWJtaXQoKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCd0aW1lb3V0X2F1dG9fc3VibWl0Jyk7XG4gICAgICAgIHJldHVybiBnb19uZXh0ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkFVVE8gVElNRU9VVF9BVVRPX1NVQk1JVCBFUlJPUjogXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgICByZXR1cm4gZ29fbmV4dCA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oZSkge1xuICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCB0byBiaW5kIGVudmlyb25tZW50OiB0aW1lb3V0X2F1dG9fc3VibWl0LmNvZmZlZScpO1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKGUuc3RhY2spO1xuICAgIH0pKTtcbiAgfVxufSk7XG5cbk1ldGVvci5tZXRob2RzKHtcbiAgdGltZW91dF9hdXRvX3N1Ym1pdDogZnVuY3Rpb24oaW5zX2lkKSB7XG4gICAgdXVmbG93TWFuYWdlci50aW1lb3V0QXV0b1N1Ym1pdChpbnNfaWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59KTtcbiIsIk1ldGVvci5zdGFydHVwICgpLT5cblx0VGFidWxhclRhYmxlcy5yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyID0gbmV3IFRhYnVsYXIuVGFibGVcblx0XHRuYW1lOiBcInJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXJcIlxuXHRcdGNvbGxlY3Rpb246IGRiLmluc3RhbmNlc1xuXHRcdGNvbHVtbnM6IFtcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJfaWRcIixcblx0XHRcdFx0dGl0bGU6ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInJldmVyc2VcIiBpZD1cInJldmVyc2VcIj4nLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlLFxuXHRcdFx0XHR3aWR0aDogJzFweCcsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlucHV0ID0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInJlbGF0ZWQtaW5zdGFuY2VzLWxpc3QtY2hlY2tib3hcIiBuYW1lPVwicmVsYXRlZF9pbnN0YW5jZXNfaWRzXCIgaWQ9XCJyZWxhdGVkX2luc3RhbmNlc19pZHNcIiB2YWx1ZT1cIicgKyBkb2MuX2lkICsgJ1wiJ1xuXG5cdFx0XHRcdFx0aWYgVGFidWxhclRhYmxlcy5yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLnJlbGF0ZWRfaW5zdGFuY2VzPy5pbmNsdWRlcyhkb2MuX2lkKVxuXHRcdFx0XHRcdFx0aW5wdXQgKz0gXCIgY2hlY2tlZCBcIlxuXG5cdFx0XHRcdFx0aW5wdXQgKz0gXCI+XCJcblx0XHRcdFx0XHRyZXR1cm4gaW5wdXRcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibmFtZVwiLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlLFxuXHRcdFx0XHR3aWR0aDogJzQ1JScsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGhyZWYgPSAnJztcblx0XHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKVxuXHRcdFx0XHRcdFx0aHJlZiA9ICcnXG5cblx0XHRcdFx0XHRhYnNvbHV0ZSA9IGZhbHNlXG5cblx0XHRcdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRcdGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZVxuXHRcdFx0XHRcdGlmIGFic29sdXRlXG5cdFx0XHRcdFx0XHRocmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIrZG9jLnNwYWNlK1wiL3ZpZXcvcmVhZG9ubHkvXCIgKyBkb2MuX2lkICsgJz9oaWRlX3RyYWNlcz0wJylcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRocmVmID0gU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiK2RvYy5zcGFjZStcIi92aWV3L3JlYWRvbmx5L1wiICsgZG9jLl9pZCArICc/aGlkZV90cmFjZXM9MCcpXG5cdFx0XHRcdFx0cmV0dXJuIFwiPGEgZGF0YS1pZD0nI3tkb2MuX2lkfScgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J1wiK2hyZWYrXCInPlwiICsgZG9jLm5hbWUgKyBcIjwvYT5cIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJmbG93X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJjdXJyZW50X3N0ZXBfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3RhdGUgPT0gXCJjb21wbGV0ZWRcIlxuXHRcdFx0XHRcdFx0anVkZ2UgPSBkb2MuZmluYWxfZGVjaXNpb24gfHwgXCJhcHByb3ZlZFwiXG5cblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5jdXJyZW50X3N0ZXBfbmFtZSB8fCAnJ1xuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcC1jdXJyZW50LXN0YXRlICN7anVkZ2V9XCI+I3tzdGVwX2N1cnJlbnRfbmFtZX08L2Rpdj5cblx0XHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0fVxuXHRcdF1cblxuXHRcdGRvbTogXCJ0cFwiLFxuXHRcdGxlbmd0aENoYW5nZTogZmFsc2UsXG5cdFx0ZXh0cmFGaWVsZHM6IFtcInN0YXRlXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJzcGFjZVwiLCBcImtleXdvcmRzXCJdLFxuXHRcdHBhZ2VMZW5ndGg6IDEwLFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdHNlYXJjaGluZzogdHJ1ZSxcblx0XHRyZXNwb25zaXZlOlxuXHRcdFx0ZGV0YWlsczogZmFsc2Vcblx0XHRhdXRvV2lkdGg6IGZhbHNlLFxuXHRcdGNoYW5nZVNlbGVjdG9yOiAoc2VsZWN0b3IsIHVzZXJJZCkgLT5cblx0XHRcdHVubGVzcyB1c2VySWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXG5cdFx0XHRzcGFjZUlkID0gc2VsZWN0b3Iuc3BhY2Vcblx0XHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c3BhY2VJZCA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF1cblx0XHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRcdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZClcblx0XHRcdGlmICFzcGFjZVxuXHRcdFx0XHRzZWxlY3Rvci5zdGF0ZSA9IFwibm9uZVwiXG5cdFx0XHRpZiAhc3BhY2UuYWRtaW5zLmluY2x1ZGVzKHVzZXJJZClcblxuXHRcdFx0XHRmbG93X2lkcyA9IFtdXG5cdFx0XHRcdGN1clNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuXHRcdFx0XHRcdHNwYWNlOiBzcGFjZUlkLFxuXHRcdFx0XHRcdCd1c2VyJzogdXNlcklkXG5cdFx0XHRcdH0pXG5cdFx0XHRcdGlmIGN1clNwYWNlVXNlclxuXHRcdFx0XHRcdG9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuXHRcdFx0XHRcdFx0X2lkOiB7XG5cdFx0XHRcdFx0XHRcdCRpbjogY3VyU3BhY2VVc2VyLm9yZ2FuaXphdGlvbnNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KS5mZXRjaCgpXG5cdFx0XHRcdFx0Zmxvd3MgPSBkYi5mbG93cy5maW5kKHsgc3BhY2U6IHNwYWNlSWQgfSlcblx0XHRcdFx0XHRmbG93cy5mb3JFYWNoIChmbCktPlxuXHRcdFx0XHRcdFx0aWYgV29ya2Zsb3dNYW5hZ2VyLmNhbk1vbml0b3IoZmwsIGN1clNwYWNlVXNlciwgb3JnYW5pemF0aW9ucykgfHwgV29ya2Zsb3dNYW5hZ2VyLmNhbkFkbWluKGZsLCBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMpXG5cdFx0XHRcdFx0XHRcdGZsb3dfaWRzLnB1c2goZmwuX2lkKVxuXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c2VsZWN0b3IuJGFuZFswXS4kb3IgPSBbe3N1Ym1pdHRlcjogdXNlcklkfSwge2FwcGxpY2FudDogdXNlcklkfSwge2luYm94X3VzZXJzOiB1c2VySWR9LCB7b3V0Ym94X3VzZXJzOiB1c2VySWR9LFxuXHRcdFx0XHRcdFx0XHR7Y2NfdXNlcnM6IHVzZXJJZH0sIHsgZmxvdzogeyAkaW46IGZsb3dfaWRzIH0gfV1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdF8uZXh0ZW5kIHNlbGVjdG9yLCB7XG5cdFx0XHRcdFx0XHQkb3I6IFt7c3VibWl0dGVyOiB1c2VySWR9LCB7YXBwbGljYW50OiB1c2VySWR9LCB7aW5ib3hfdXNlcnM6IHVzZXJJZH0sIHtvdXRib3hfdXNlcnM6IHVzZXJJZH0sXG5cdFx0XHRcdFx0XHRcdHtjY191c2VyczogdXNlcklkfSwgeyBmbG93OiB7ICRpbjogZmxvd19pZHMgfSB9XVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBUYWJ1bGFyVGFibGVzLnJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIgPSBuZXcgVGFidWxhci5UYWJsZSh7XG4gICAgbmFtZTogXCJyZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyXCIsXG4gICAgY29sbGVjdGlvbjogZGIuaW5zdGFuY2VzLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHtcbiAgICAgICAgZGF0YTogXCJfaWRcIixcbiAgICAgICAgdGl0bGU6ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInJldmVyc2VcIiBpZD1cInJldmVyc2VcIj4nLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICB3aWR0aDogJzFweCcsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgaW5wdXQsIHJlZjtcbiAgICAgICAgICBpbnB1dCA9ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJyZWxhdGVkLWluc3RhbmNlcy1saXN0LWNoZWNrYm94XCIgbmFtZT1cInJlbGF0ZWRfaW5zdGFuY2VzX2lkc1wiIGlkPVwicmVsYXRlZF9pbnN0YW5jZXNfaWRzXCIgdmFsdWU9XCInICsgZG9jLl9pZCArICdcIic7XG4gICAgICAgICAgaWYgKChyZWYgPSBUYWJ1bGFyVGFibGVzLnJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIucmVsYXRlZF9pbnN0YW5jZXMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoZG9jLl9pZCkgOiB2b2lkIDApIHtcbiAgICAgICAgICAgIGlucHV0ICs9IFwiIGNoZWNrZWQgXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0ICs9IFwiPlwiO1xuICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm5hbWVcIixcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd2lkdGg6ICc0NSUnLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFic29sdXRlLCBocmVmO1xuICAgICAgICAgIGhyZWYgPSAnJztcbiAgICAgICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSkpIHtcbiAgICAgICAgICAgIGhyZWYgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgICAgICBhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgICAgICAgaHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgZG9jLnNwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGRvYy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHJlZiA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGRvYy5zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBkb2MuX2lkICsgJz9oaWRlX3RyYWNlcz0wJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAoXCI8YSBkYXRhLWlkPSdcIiArIGRvYy5faWQgKyBcIicgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J1wiKSArIGhyZWYgKyBcIic+XCIgKyBkb2MubmFtZSArIFwiPC9hPlwiO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJmbG93X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImN1cnJlbnRfc3RlcF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIganVkZ2UsIHN0ZXBfY3VycmVudF9uYW1lO1xuICAgICAgICAgIGlmIChkb2Muc3RhdGUgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICAgIGp1ZGdlID0gZG9jLmZpbmFsX2RlY2lzaW9uIHx8IFwiYXBwcm92ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWUgPSBkb2MuY3VycmVudF9zdGVwX25hbWUgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwic3RlcC1jdXJyZW50LXN0YXRlIFwiICsganVkZ2UgKyBcIlxcXCI+XCIgKyBzdGVwX2N1cnJlbnRfbmFtZSArIFwiPC9kaXY+XCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdLFxuICAgIGRvbTogXCJ0cFwiLFxuICAgIGxlbmd0aENoYW5nZTogZmFsc2UsXG4gICAgZXh0cmFGaWVsZHM6IFtcInN0YXRlXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJzcGFjZVwiLCBcImtleXdvcmRzXCJdLFxuICAgIHBhZ2VMZW5ndGg6IDEwLFxuICAgIGluZm86IGZhbHNlLFxuICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiB7XG4gICAgICBkZXRhaWxzOiBmYWxzZVxuICAgIH0sXG4gICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICBjaGFuZ2VTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IsIHVzZXJJZCkge1xuICAgICAgdmFyIGN1clNwYWNlVXNlciwgZmxvd19pZHMsIGZsb3dzLCBvcmdhbml6YXRpb25zLCByZWYsIHJlZjEsIHNwYWNlLCBzcGFjZUlkO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZUlkID0gc2VsZWN0b3Iuc3BhY2U7XG4gICAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgICAgaWYgKChzZWxlY3RvciAhPSBudWxsID8gKHJlZiA9IHNlbGVjdG9yLiRhbmQpICE9IG51bGwgPyByZWYubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICAgICAgICBzcGFjZUlkID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKTtcbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgc2VsZWN0b3Iuc3RhdGUgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICAgIGlmICghc3BhY2UuYWRtaW5zLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgZmxvd19pZHMgPSBbXTtcbiAgICAgICAgY3VyU3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgICAgJ3VzZXInOiB1c2VySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdXJTcGFjZVVzZXIpIHtcbiAgICAgICAgICBvcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcbiAgICAgICAgICAgIF9pZDoge1xuICAgICAgICAgICAgICAkaW46IGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkuZmV0Y2goKTtcbiAgICAgICAgICBmbG93cyA9IGRiLmZsb3dzLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmbG93cy5mb3JFYWNoKGZ1bmN0aW9uKGZsKSB7XG4gICAgICAgICAgICBpZiAoV29ya2Zsb3dNYW5hZ2VyLmNhbk1vbml0b3IoZmwsIGN1clNwYWNlVXNlciwgb3JnYW5pemF0aW9ucykgfHwgV29ya2Zsb3dNYW5hZ2VyLmNhbkFkbWluKGZsLCBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmbG93X2lkcy5wdXNoKGZsLl9pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzZWxlY3RvciAhPSBudWxsID8gKHJlZjEgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmMS5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApID4gMCkge1xuICAgICAgICAgIHNlbGVjdG9yLiRhbmRbMF0uJG9yID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJtaXR0ZXI6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBhcHBsaWNhbnQ6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBpbmJveF91c2VyczogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIG91dGJveF91c2VyczogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGNjX3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZmxvdzoge1xuICAgICAgICAgICAgICAgICRpbjogZmxvd19pZHNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgXy5leHRlbmQoc2VsZWN0b3IsIHtcbiAgICAgICAgICAgICRvcjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3VibWl0dGVyOiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGFwcGxpY2FudDogdXNlcklkXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBpbmJveF91c2VyczogdXNlcklkXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBvdXRib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgY2NfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgZmxvdzoge1xuICAgICAgICAgICAgICAgICAgJGluOiBmbG93X2lkc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiU3RlZWRvcy5zdWJzW1wiSW5zdGFuY2VUYWJ1bGFyXCJdID0gbmV3IFN1YnNNYW5hZ2VyKClcblxuXG5faGFuZGxlTGlzdEZpZWxkcyA9IChmaWVsZHMpIC0+XG5cdGluc19maWVsZHMgPSBuZXcgQXJyYXkoKTtcblxuXHRmaWVsZHM/LmZvckVhY2ggKGYpLT5cblx0XHRpZiBmLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0Y29uc29sZS5sb2cgJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJ1xuXHRcdGVsc2UgaWYgZi50eXBlID09ICdzZWN0aW9uJ1xuXHRcdFx0Zj8uZmllbGRzPy5mb3JFYWNoIChmMSktPlxuXHRcdFx0XHRpbnNfZmllbGRzLnB1c2ggZjFcblx0XHRlbHNlXG5cdFx0XHRpbnNfZmllbGRzLnB1c2ggZlxuXG5cdHJldHVybiBpbnNfZmllbGRzXG5cblxudXBkYXRlVGFidWxhclRpdGxlID0gKCktPlxuXG4jIOWmguaenGNvbHVtbnPmnInliqDlh4/vvIzor7fkv67mlLlUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMg5Ye95pWwXG5pbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyID0gKGZsb3dJZCwgZmllbGRzKS0+XG5cdG9wdGlvbnMgPSB7XG5cdFx0bmFtZTogXCJpbnN0YW5jZXNcIixcblx0XHRjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZXMsXG5cdFx0cHViOiBcImluc3RhbmNlX3RhYnVsYXJcIixcblx0XHRvblVubG9hZDogKCktPlxuXHRcdFx0TWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApXG5cblx0XHRkcmF3Q2FsbGJhY2s6IChzZXR0aW5ncyktPlxuXHRcdFx0ZW1wdHlUZCA9ICQoXCIuZGF0YVRhYmxlc19lbXB0eVwiKVxuXHRcdFx0aWYgZW1wdHlUZC5sZW5ndGhcblx0XHRcdFx0ZW1wdHlUZFswXS5jb2xTcGFuID0gXCI2XCJcblx0XHRcdGlmICFTdGVlZG9zLmlzTW9iaWxlKCkgJiYgIVN0ZWVkb3MuaXNQYWQoKVxuXHRcdFx0XHRNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MClcblx0XHRcdFx0JChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKS5yZWFkeSAtPlxuXHRcdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5wZXJmZWN0U2Nyb2xsYmFyKFwidXBkYXRlXCIpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMClcblxuXHRcdFx0dGl0bGUgPSB0IFwicGFnZXJfaW5wdXRfaGludFwiXG5cdFx0XHRlbGxpcHNpc0xpbmsgPSBzZXR0aW5ncy5vSW5zdGFuY2UucGFyZW50KCkuZmluZCgnLnBhZ2luZ19udW1iZXJzIC5wYWdpbmF0aW9uIC5kaXNhYmxlZCBhJylcblx0XHRcdGVsbGlwc2lzTGluay5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmNzcyhcImN1cnNvclwiLCBcInBvaW50ZXJcIikuY2xpY2sgLT5cblx0XHRcdFx0aWYgISQodGhpcykuZmluZCgnaW5wdXQnKS5sZW5ndGhcblx0XHRcdFx0XHRpbnB1dCA9ICQoJzxpbnB1dCBjbGFzcz1cInBhZ2luYXRlX2lucHV0IGZvcm0tY29udHJvbCBpbnB1dC1zbVwiIHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJib3JkZXI6IG5vbmU7IHBhZGRpbmc6MCAycHg7XCIvPicpXG5cdFx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRcdFx0XHRpbnB1dC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR3aWR0aDpcIjUycHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMjBweFwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlucHV0LmNzcyh7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOlwiNTJweFwiXG5cdFx0XHRcdFx0XHRcdGhlaWdodDogXCIxNnB4XCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0aW5wdXQuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgdGl0bGUpXG5cdFx0XHRcdFx0JCh0aGlzKS5lbXB0eSgpLmFwcGVuZCBpbnB1dFxuXHRcdFx0XHRcdGdvUGFnZSA9IChpbmRleCktPlxuXHRcdFx0XHRcdFx0aWYgaW5kZXggPiAwXG5cdFx0XHRcdFx0XHRcdHBhZ2VzID0gTWF0aC5jZWlsKHNldHRpbmdzLmZuUmVjb3Jkc0Rpc3BsYXkoKSAvIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aClcblx0XHRcdFx0XHRcdFx0aWYgaW5kZXggPiBwYWdlc1xuXHRcdFx0XHRcdFx0XHRcdCMg6aG156CB6LaF5Ye657Si5byV5pe26Lez6L2s5Yiw5pyA5ZCO5LiA6aG1XG5cdFx0XHRcdFx0XHRcdFx0aW5kZXggPSBwYWdlc1xuXHRcdFx0XHRcdFx0XHRpbmRleC0tXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLm9JbnN0YW5jZS5EYXRhVGFibGUoKS5wYWdlKGluZGV4KS5kcmF3KCdwYWdlJylcblx0XHRcdFx0XHRpbnB1dC5ibHVyIChlKS0+XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKClcblx0XHRcdFx0XHRcdGdvUGFnZSBjdXJyZW50UGFnZVxuXHRcdFx0XHRcdFx0JCh0aGlzKS5wYXJlbnQoKS5odG1sICcuLi4nXG5cdFx0XHRcdFx0aW5wdXQua2V5ZG93biAoZSktPlxuXHRcdFx0XHRcdFx0aWYoZS5rZXlDb2RlLnRvU3RyaW5nKCkgPT0gXCIxM1wiKVxuXHRcdFx0XHRcdFx0XHRjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKClcblx0XHRcdFx0XHRcdFx0Z29QYWdlIGN1cnJlbnRQYWdlXG5cblx0XHRjcmVhdGVkUm93OiAocm93LCBkYXRhLCBkYXRhSW5kZXgpIC0+XG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0aWYgZGF0YS5faWQgPT0gRmxvd1JvdXRlci5jdXJyZW50KCkucGFyYW1zLmluc3RhbmNlSWRcblx0XHRcdFx0XHRyb3cuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3RlZFwiKVxuXHRcdGNvbHVtbnM6IFtcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJfaWRcIixcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRtb2RpZmllZFN0cmluZyA9IG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2MubW9kaWZpZWRcblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5zdGF0ZSAhPSAnZHJhZnQnXG5cdFx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5zdGFydF9kYXRlIHx8IGRvYy5tb2RpZmllZFxuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ291dGJveCcgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InXG5cdFx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5zdWJtaXRfZGF0ZSB8fCBkb2Muc3VibWl0X2RhdGVcblxuXHRcdFx0XHRcdG1vZGlmaWVkRnJvbU5vdyA9IFN0ZWVkb3MubW9tZW50UmVhY3RpdmVGcm9tTm93KG1vZGlmaWVkKTtcblx0XHRcdFx0XHRmbG93X25hbWUgPSBkb2MuZmxvd19uYW1lXG5cdFx0XHRcdFx0Y2NfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0IyDlvZPliY3nlKjmiLflnKhjYyB1c2Vy5Lit77yM5L2G5piv5LiN5ZyoaW5ib3ggdXNlcnPml7bmiY3mmL7npLon5Lyg6ZiFJ+aWh+Wtl1xuXHRcdFx0XHRcdGlmIGRvYy5pc19jYyAmJiAhZG9jLmluYm94X3VzZXJzPy5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiXG5cdFx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPiN7Zmxvd19uYW1lfTxzcGFuPigje2RvYy5jdXJyZW50X3N0ZXBfbmFtZX0pPC9zcGFuPjwvZGl2PlwiXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gJ2RyYWZ0JyAmJiBkb2MuY3VycmVudF9zdGVwX25hbWVcblx0XHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08c3Bhbj4oI3tkb2MuY3VycmVudF9zdGVwX25hbWV9KTwvc3Bhbj48L2Rpdj5cIlxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPiN7Zmxvd19uYW1lfTwvZGl2PlwiXG5cblx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRpZiBkb2MuYWdlbnRfdXNlcl9uYW1lICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZX0pICsgXCIpPC9sYWJlbD5cIlxuXG5cdFx0XHRcdFx0dW5yZWFkID0gJydcblxuXHRcdFx0XHRcdCMgaXNGYXZvcml0ZVNlbGVjdGVkID0gRmF2b3JpdGVzLmlzUmVjb3JkU2VsZWN0ZWQoXCJpbnN0YW5jZXNcIiwgZG9jLl9pZClcblx0XHRcdFx0XHQjIGlmIEZhdm9yaXRlcy5pc1JlY29yZFNlbGVjdGVkKFwiaW5zdGFuY2VzXCIsIGRvYy5faWQpXG5cdFx0XHRcdFx0IyBcdHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24taW9zLXN0YXItb3V0bGluZSBpbnN0YW5jZS1mYXZvcml0ZS1zZWxlY3RlZFwiPjwvaT4nXG5cdFx0XHRcdFx0IyBlbHNlIFxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nXG5cdFx0XHRcdFx0ZWxzZSBpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PSB0cnVlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPidcblxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbiA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eVZhbHVlID0gZG9jLnZhbHVlcz8ucHJpb3JpdHlcblx0XHRcdFx0XHRzd2l0Y2ggcHJpb3JpdHlWYWx1ZVxuXHRcdFx0XHRcdFx0d2hlbiBcIueJueaApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIue0p+aApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLlip7mlodcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIlxuXHRcdFx0XHRcdGlmIHByaW9yaXR5SWNvbkNsYXNzXG5cdFx0XHRcdFx0XHRpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS0je3ByaW9yaXR5SWNvbkNsYXNzfVwiXG5cblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPiN7dW5yZWFkfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgI3tpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzfSc+I3tkb2MubmFtZX0je2NjX3ZpZXd9I3thZ2VudF92aWV3fVxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+I3tkb2MuYXBwbGljYW50X25hbWV9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLWRldGFpbCc+I3tzdGVwX2N1cnJlbnRfbmFtZV92aWV3fVxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9J2luc3RhbmNlLW1vZGlmaWVkJyB0aXRsZT0nI3ttb2RpZmllZFN0cmluZ30nPiN7bW9kaWZpZWRGcm9tTm93fTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJuYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX25hbWVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGNjX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdCMg5b2T5YmN55So5oi35ZyoY2MgdXNlcuS4re+8jOS9huaYr+S4jeWcqGluYm94IHVzZXJz5pe25omN5pi+56S6J+S8oOmYhSfmloflrZdcblx0XHRcdFx0XHRpZiBkb2MuaXNfY2MgJiYgIWRvYy5pbmJveF91c2Vycz8uaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIlxuXG5cdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgZG9jLmFnZW50X3VzZXJfbmFtZVxuXHRcdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge3VzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lfSkgKyBcIik8L2xhYmVsPlwiXG5cblx0XHRcdFx0XHR1bnJlYWQgPSAnJ1xuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PSBmYWxzZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPidcblx0XHRcdFx0XHRlbHNlIGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09IHRydWVcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+J1xuXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlWYWx1ZSA9IGRvYy52YWx1ZXM/LnByaW9yaXR5XG5cdFx0XHRcdFx0c3dpdGNoIHByaW9yaXR5VmFsdWVcblx0XHRcdFx0XHRcdHdoZW4gXCLnibnmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLntKfmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiXG5cdFx0XHRcdFx0XHR3aGVuIFwi5Yqe5paHXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCJcblx0XHRcdFx0XHRpZiBwcmlvcml0eUljb25DbGFzc1xuXHRcdFx0XHRcdFx0aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktI3twcmlvcml0eUljb25DbGFzc31cIlxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPiN7dW5yZWFkfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lICN7aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzc30nPiN7ZG9jLm5hbWV9I3tjY192aWV3fSN7YWdlbnRfdmlld308L2Rpdj5cblx0XHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwic3VibWl0X2RhdGVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfc3VibWl0X2RhdGVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdWJtaXRfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2Muc3VibWl0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiZmxvd19uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImN1cnJlbnRfc3RlcF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0ZXBfY3VycmVudF9uYW1lXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3RhdGUgPT0gXCJjb21wbGV0ZWRcIlxuXHRcdFx0XHRcdFx0anVkZ2UgPSBkb2MuZmluYWxfZGVjaXNpb24gfHwgXCJhcHByb3ZlZFwiXG5cblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5jdXJyZW50X3N0ZXBfbmFtZSB8fCAnJ1xuXG5cdFx0XHRcdFx0Y2NfdGFnID0gJydcblxuXHRcdFx0XHRcdGlmIGRvYy5jY19jb3VudCA+IDBcblx0XHRcdFx0XHRcdGNjX3RhZyA9IFRBUGkxOG4uX18oJ2NjX3RhZycpXG5cblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcC1jdXJyZW50LXN0YXRlICN7anVkZ2V9XCI+I3tzdGVwX2N1cnJlbnRfbmFtZX0je2NjX3RhZ308L2Rpdj5cblx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibW9kaWZpZWRcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfbW9kaWZpZWRcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcInN0YXJ0X2RhdGVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RhcnRfZGF0ZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN0YXJ0X2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLnN0YXJ0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibXlfZmluaXNoX2RhdGVcIixcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLm15X2ZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5teV9maW5pc2hfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJtb2RpZmllZFwiLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJrZXl3b3Jkc1wiLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJpc19hcmNoaXZlZFwiLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2M/LnZhbHVlcz8ucmVjb3JkX25lZWQgJiYgZG9jLnZhbHVlcy5yZWNvcmRfbmVlZCA9PSBcInRydWVcIlxuXHRcdFx0XHRcdFx0aWYgZG9jPy5pc19hcmNoaXZlZFxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdChcIllFU1wiKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHQoXCJOT1wiKVxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHRkb206IGRvIC0+XG5cdFx0XHQjIOaJi+acuuS4iuS4jeaYvuekuuS4gOmhteaYvuekuuWkmuWwkeadoeiusOW9lemAiemhuVxuXHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRcdCd0cCdcblx0XHRcdGVsc2Vcblx0XHRcdFx0J3RwbCdcblx0XHRvcmRlcjogW1s0LCBcImRlc2NcIl1dLFxuXHRcdGV4dHJhRmllbGRzOiBbXCJmb3JtXCIsIFwiZmxvd1wiLCBcImluYm94X3VzZXJzXCIsIFwic3RhdGVcIiwgXCJzcGFjZVwiLCBcImFwcGxpY2FudFwiLCBcImZvcm1fdmVyc2lvblwiLFxuXHRcdFx0XCJmbG93X3ZlcnNpb25cIiwgXCJpc19jY1wiLCBcImNjX2NvdW50XCIsIFwiaXNfcmVhZFwiLCBcImN1cnJlbnRfc3RlcF9uYW1lXCIsIFwidmFsdWVzXCIsIFwia2V5d29yZHNcIiwgXCJmaW5hbF9kZWNpc2lvblwiLCBcImZsb3dfbmFtZVwiLCBcImlzX2hpZGRlblwiLCBcImFnZW50X3VzZXJfbmFtZVwiXSxcblx0XHRsZW5ndGhDaGFuZ2U6IHRydWUsXG5cdFx0bGVuZ3RoTWVudTogWzEwLDE1LDIwLDI1LDUwLDEwMF0sXG5cdFx0cGFnZUxlbmd0aDogMTAsXG5cdFx0aW5mbzogZmFsc2UsXG5cdFx0c2VhcmNoaW5nOiB0cnVlLFxuXHRcdHJlc3BvbnNpdmU6XG5cdFx0XHRkZXRhaWxzOiBmYWxzZVxuXHRcdGF1dG9XaWR0aDogZmFsc2UsXG5cdFx0Y2hhbmdlU2VsZWN0b3I6IChzZWxlY3RvciwgdXNlcklkKSAtPlxuXHRcdFx0dW5sZXNzIHVzZXJJZFxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZSA9IHNlbGVjdG9yLnNwYWNlXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0aWYgc2VsZWN0b3I/LiRhbmQ/Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRzcGFjZSA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF1cblx0XHRcdHVubGVzcyBzcGFjZVxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7dXNlcjogdXNlcklkLCBzcGFjZTogc3BhY2V9LCB7ZmllbGRzOiB7X2lkOiAxfX0pXG5cdFx0XHR1bmxlc3Mgc3BhY2VfdXNlclxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRyZXR1cm4gc2VsZWN0b3Jcblx0XHRwYWdpbmdUeXBlOiBcIm51bWJlcnNcIlxuXHRcdFxuXHRcdCMgZ2V0U29ydDogKHNlbGVjdG9yLCBzb3J0KSAtPiBcblx0XHQjIFx0Y29uc29sZS5sb2coJ3NlbGVjdG9yOicsc2VsZWN0b3IpXG5cdFx0IyBcdGNvbnNvbGUubG9nKCdzb3J0Oicsc29ydClcblx0XHQjIFx0bmV3U29ydCA9IFtdXG5cdFx0IyBcdF8uZWFjaCBzZWxlY3RvciwgKHYsIGspIC0+XG5cdFx0IyBcdFx0bmV3U29ydC5wdXNoKFtrLCAxXSlcblx0XHQjIFx0bmV3U29ydCA9IG5ld1NvcnQuY29uY2F0KHNvcnQpXG5cdFx0IyBcdGNvbnNvbGUubG9nKCduZXdTb3J0OicsbmV3U29ydClcblx0XHQjIFx0cmV0dXJuIG5ld1NvcnRcblx0fVxuXG5cdGlmIGZsb3dJZFxuXHRcdGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBmbG93SWRcblxuXHRcdG9wdGlvbnMubmFtZSA9IGtleVxuXG5cdFx0VGFidWxhclRhYmxlcy5pbnN0YW5jZXMuZmllbGRzID0gZmllbGRzXG5cblx0XHRpbnNfZmllbGRzID0gX2hhbmRsZUxpc3RGaWVsZHMgVGFidWxhclRhYmxlcy5pbnN0YW5jZXMuZmllbGRzXG5cblx0XHRpbnNfZmllbGRzLmZvckVhY2ggKGYpLT5cblx0XHRcdGlmIGYudHlwZSAhPSAndGFibGUnICYmIGYuaXNfbGlzdF9kaXNwbGF5XG5cdFx0XHRcdG9wdGlvbnMuY29sdW1ucy5wdXNoXG5cdFx0XHRcdFx0ZGF0YTogKGYubmFtZSB8fCBmLmNvZGUpLFxuXHRcdFx0XHRcdHRpdGxlOiB0KGYubmFtZSB8fCBmLmNvZGUpLFxuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblxuXHRcdFx0XHRcdFx0dmFsdWVzID0gZG9jLnZhbHVlcyB8fCB7fVxuXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlc1tmLmNvZGVdXG5cblx0XHRcdFx0XHRcdHN3aXRjaCBmLnR5cGVcblx0XHRcdFx0XHRcdFx0d2hlbiAndXNlcidcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5uYW1lXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2dyb3VwJ1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWU/LmZ1bGxuYW1lXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2RhdGUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuXHRcdFx0XHRcdFx0XHR3aGVuICdkYXRlVGltZSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlID09IHRydWUgfHwgdmFsdWUgPT0gJ3RydWUnXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuXHRcdFx0XHRcdFx0XHR3aGVuICdvZGF0YSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgXy5pc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbJ0BsYWJlbCddXG5cblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZVxuXG5cblx0cmV0dXJuIG9wdGlvbnM7XG5cblxuIyDlpoLmnpxjb2x1bW5z5pyJ5Yqg5YeP77yM6K+35L+u5pS5VGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zIOWHveaVsFxuaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIgPSAoZmxvd0lkLCBmaWVsZHMpLT5cblx0b3B0aW9ucyA9IHtcblx0XHRuYW1lOiBcImluc3RhbmNlX3Rhc2tzXCIsXG5cdFx0Y29sbGVjdGlvbjogZGIuaW5zdGFuY2VfdGFza3MsXG5cdFx0cHViOiBcImluc3RhbmNlX3Rhc2tzX3RhYnVsYXJcIixcblx0XHRvblVubG9hZDogKCktPlxuXHRcdFx0TWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApXG5cblx0XHRkcmF3Q2FsbGJhY2s6IChzZXR0aW5ncyktPlxuXHRcdFx0ZW1wdHlUZCA9ICQoXCIuZGF0YVRhYmxlc19lbXB0eVwiKVxuXHRcdFx0aWYgZW1wdHlUZC5sZW5ndGhcblx0XHRcdFx0ZW1wdHlUZFswXS5jb2xTcGFuID0gXCI2XCJcblx0XHRcdGlmICFTdGVlZG9zLmlzTW9iaWxlKCkgJiYgIVN0ZWVkb3MuaXNQYWQoKVxuXHRcdFx0XHRNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MClcblx0XHRcdFx0JChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKS5yZWFkeSAtPlxuXHRcdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5wZXJmZWN0U2Nyb2xsYmFyKFwidXBkYXRlXCIpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMClcblxuXHRcdFx0dGl0bGUgPSB0IFwicGFnZXJfaW5wdXRfaGludFwiXG5cdFx0XHRlbGxpcHNpc0xpbmsgPSBzZXR0aW5ncy5vSW5zdGFuY2UucGFyZW50KCkuZmluZCgnLnBhZ2luZ19udW1iZXJzIC5wYWdpbmF0aW9uIC5kaXNhYmxlZCBhJylcblx0XHRcdGVsbGlwc2lzTGluay5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmNzcyhcImN1cnNvclwiLCBcInBvaW50ZXJcIikuY2xpY2sgLT5cblx0XHRcdFx0aWYgISQodGhpcykuZmluZCgnaW5wdXQnKS5sZW5ndGhcblx0XHRcdFx0XHRpbnB1dCA9ICQoJzxpbnB1dCBjbGFzcz1cInBhZ2luYXRlX2lucHV0IGZvcm0tY29udHJvbCBpbnB1dC1zbVwiIHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJib3JkZXI6IG5vbmU7IHBhZGRpbmc6MCAycHg7XCIvPicpXG5cdFx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRcdFx0XHRpbnB1dC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR3aWR0aDpcIjUycHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMjBweFwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlucHV0LmNzcyh7XG5cdFx0XHRcdFx0XHRcdHdpZHRoOlwiNTJweFwiXG5cdFx0XHRcdFx0XHRcdGhlaWdodDogXCIxNnB4XCJcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0aW5wdXQuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgdGl0bGUpXG5cdFx0XHRcdFx0JCh0aGlzKS5lbXB0eSgpLmFwcGVuZCBpbnB1dFxuXHRcdFx0XHRcdGdvUGFnZSA9IChpbmRleCktPlxuXHRcdFx0XHRcdFx0aWYgaW5kZXggPiAwXG5cdFx0XHRcdFx0XHRcdHBhZ2VzID0gTWF0aC5jZWlsKHNldHRpbmdzLmZuUmVjb3Jkc0Rpc3BsYXkoKSAvIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aClcblx0XHRcdFx0XHRcdFx0aWYgaW5kZXggPiBwYWdlc1xuXHRcdFx0XHRcdFx0XHRcdCMg6aG156CB6LaF5Ye657Si5byV5pe26Lez6L2s5Yiw5pyA5ZCO5LiA6aG1XG5cdFx0XHRcdFx0XHRcdFx0aW5kZXggPSBwYWdlc1xuXHRcdFx0XHRcdFx0XHRpbmRleC0tXG5cdFx0XHRcdFx0XHRcdHNldHRpbmdzLm9JbnN0YW5jZS5EYXRhVGFibGUoKS5wYWdlKGluZGV4KS5kcmF3KCdwYWdlJylcblx0XHRcdFx0XHRpbnB1dC5ibHVyIChlKS0+XG5cdFx0XHRcdFx0XHRjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKClcblx0XHRcdFx0XHRcdGdvUGFnZSBjdXJyZW50UGFnZVxuXHRcdFx0XHRcdFx0JCh0aGlzKS5wYXJlbnQoKS5odG1sICcuLi4nXG5cdFx0XHRcdFx0aW5wdXQua2V5ZG93biAoZSktPlxuXHRcdFx0XHRcdFx0aWYoZS5rZXlDb2RlLnRvU3RyaW5nKCkgPT0gXCIxM1wiKVxuXHRcdFx0XHRcdFx0XHRjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKClcblx0XHRcdFx0XHRcdFx0Z29QYWdlIGN1cnJlbnRQYWdlXG5cblx0XHRjcmVhdGVkUm93OiAocm93LCBkYXRhLCBkYXRhSW5kZXgpIC0+XG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0aWYgZGF0YS5pbnN0YW5jZSA9PSBGbG93Um91dGVyLmN1cnJlbnQoKS5wYXJhbXMuaW5zdGFuY2VJZFxuXHRcdFx0XHRcdHJvdy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInNlbGVjdGVkXCIpXG5cdFx0Y29sdW1uczogW1xuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIl9pZFwiLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdG1vZGlmaWVkU3RyaW5nID0gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG5cblx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5tb2RpZmllZFxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLmluc3RhbmNlX3N0YXRlICE9ICdkcmFmdCdcblx0XHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLnN0YXJ0X2RhdGUgfHwgZG9jLm1vZGlmaWVkXG5cblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnb3V0Ym94J1xuXHRcdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLm1vZGlmaWVkXG5cblx0XHRcdFx0XHRtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG5cdFx0XHRcdFx0Zmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZVxuXHRcdFx0XHRcdGNjX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdCMg5b2T5YmN55So5oi35ZyoY2MgdXNlcuS4re+8jOS9huaYr+S4jeWcqGluYm94IHVzZXJz5pe25omN5pi+56S6J+S8oOmYhSfmloflrZdcblx0XHRcdFx0XHRpZiBkb2MudHlwZSA9PSAnY2MnICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiXG5cdFx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPiN7Zmxvd19uYW1lfTxzcGFuPigje2RvYy5zdGVwX25hbWV9KTwvc3Bhbj48L2Rpdj5cIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlmIGRvYy5zdGVwX25hbWVcblx0XHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08c3Bhbj4oI3tkb2Muc3RlcF9uYW1lfSk8L3NwYW4+PC9kaXY+XCJcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08L2Rpdj5cIlxuXG5cdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgZG9jLmFnZW50X3VzZXJfbmFtZSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWV9KSArIFwiKTwvbGFiZWw+XCJcblxuXHRcdFx0XHRcdHVucmVhZCA9ICcnXG5cblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09IGZhbHNlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+J1xuXHRcdFx0XHRcdGVsc2UgaWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nXG5cblx0XHRcdFx0XHRwcmlvcml0eUljb24gPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlWYWx1ZSA9IGRvYy52YWx1ZXM/LnByaW9yaXR5XG5cdFx0XHRcdFx0c3dpdGNoIHByaW9yaXR5VmFsdWVcblx0XHRcdFx0XHRcdHdoZW4gXCLnibnmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLntKfmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiXG5cdFx0XHRcdFx0XHR3aGVuIFwi5Yqe5paHXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCJcblx0XHRcdFx0XHRpZiBwcmlvcml0eUljb25DbGFzc1xuXHRcdFx0XHRcdFx0aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktI3twcmlvcml0eUljb25DbGFzc31cIlxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz4je3VucmVhZH08L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lICN7aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzc30nPiN7ZG9jLmluc3RhbmNlX25hbWV9I3tjY192aWV3fSN7YWdlbnRfdmlld31cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPiN7ZG9jLmFwcGxpY2FudF9uYW1lfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1kZXRhaWwnPiN7c3RlcF9jdXJyZW50X25hbWVfdmlld31cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPSdpbnN0YW5jZS1tb2RpZmllZCcgdGl0bGU9JyN7bW9kaWZpZWRTdHJpbmd9Jz4je21vZGlmaWVkRnJvbU5vd308L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiaW5zdGFuY2VfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19uYW1lXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRjY192aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHQjIOW9k+WJjeeUqOaIt+WcqGNjIHVzZXLkuK3vvIzkvYbmmK/kuI3lnKhpbmJveCB1c2Vyc+aXtuaJjeaYvuekuifkvKDpmIUn5paH5a2XXG5cdFx0XHRcdFx0aWYgZG9jLmlzX2NjICYmICFkb2MuaW5ib3hfdXNlcnM/LmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0Y2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCJcblxuXHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdGlmIGRvYy5hZ2VudF91c2VyX25hbWVcblx0XHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZX0pICsgXCIpPC9sYWJlbD5cIlxuXG5cdFx0XHRcdFx0dW5yZWFkID0gJydcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nXG5cdFx0XHRcdFx0ZWxzZSBpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PSB0cnVlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPidcblxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5VmFsdWUgPSBkb2MudmFsdWVzPy5wcmlvcml0eVxuXHRcdFx0XHRcdHN3aXRjaCBwcmlvcml0eVZhbHVlXG5cdFx0XHRcdFx0XHR3aGVuIFwi54m55oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiXG5cdFx0XHRcdFx0XHR3aGVuIFwi57Sn5oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIuWKnuaWh1wiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiXG5cdFx0XHRcdFx0aWYgcHJpb3JpdHlJY29uQ2xhc3Ncblx0XHRcdFx0XHRcdGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LSN7cHJpb3JpdHlJY29uQ2xhc3N9XCJcblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz4je3VucmVhZH08L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSAje2luc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3N9Jz4je2RvYy5pbnN0YW5jZV9uYW1lfSN7Y2Nfdmlld30je2FnZW50X3ZpZXd9PC9kaXY+XG5cdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcInN1Ym1pdF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N1Ym1pdF9kYXRlXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3VibWl0X2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLnN1Ym1pdF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImZsb3dfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdGVwX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RlcF9jdXJyZW50X25hbWVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5pbnN0YW5jZV9zdGF0ZSA9PSBcImNvbXBsZXRlZFwiXG5cdFx0XHRcdFx0XHRqdWRnZSA9IGRvYy5qdWRnZSB8fCBcImFwcHJvdmVkXCJcblxuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLnN0ZXBfbmFtZSB8fCAnJ1xuXG5cdFx0XHRcdFx0Y2NfdGFnID0gJydcblxuXHRcdFx0XHRcdGlmIGRvYy5jY19jb3VudCA+IDBcblx0XHRcdFx0XHRcdGNjX3RhZyA9IFRBUGkxOG4uX18oJ2NjX3RhZycpXG5cblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcC1jdXJyZW50LXN0YXRlICN7anVkZ2V9XCI+I3tzdGVwX2N1cnJlbnRfbmFtZX0je2NjX3RhZ308L2Rpdj5cblx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibW9kaWZpZWRcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfbW9kaWZpZWRcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcInN0YXJ0X2RhdGVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RhcnRfZGF0ZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN0YXJ0X2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLnN0YXJ0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiZmluaXNoX2RhdGVcIixcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5maW5pc2hfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJtb2RpZmllZFwiLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJrZXl3b3Jkc1wiLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJpc19hcmNoaXZlZFwiLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2M/LnZhbHVlcz8ucmVjb3JkX25lZWQgJiYgZG9jLnZhbHVlcy5yZWNvcmRfbmVlZCA9PSBcInRydWVcIlxuXHRcdFx0XHRcdFx0aWYgZG9jPy5pc19hcmNoaXZlZFxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdChcIllFU1wiKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHQoXCJOT1wiKVxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZVxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHRkb206IGRvIC0+XG5cdFx0XHQjIOaJi+acuuS4iuS4jeaYvuekuuS4gOmhteaYvuekuuWkmuWwkeadoeiusOW9lemAiemhuVxuXHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRcdCd0cCdcblx0XHRcdGVsc2Vcblx0XHRcdFx0J3RwbCdcblx0XHRvcmRlcjogW1s0LCBcImRlc2NcIl1dLFxuXHRcdGV4dHJhRmllbGRzOiBbXCJpbnN0YW5jZVwiLCBcImZvcm1cIiwgXCJmbG93XCIsIFwiaW5ib3hfdXNlcnNcIiwgXCJpbnN0YW5jZV9zdGF0ZVwiLCBcInNwYWNlXCIsIFwiYXBwbGljYW50XCIsIFwiZm9ybV92ZXJzaW9uXCIsXG5cdFx0XHRcImZsb3dfdmVyc2lvblwiLCBcInR5cGVcIiwgXCJpc19yZWFkXCIsIFwic3RlcF9uYW1lXCIsIFwidmFsdWVzXCIsIFwia2V5d29yZHNcIiwgXCJmaW5hbF9kZWNpc2lvblwiLCBcImZsb3dfbmFtZVwiLCBcImlzX2hpZGRlblwiLCBcImFnZW50X3VzZXJfbmFtZVwiXSxcblx0XHRsZW5ndGhDaGFuZ2U6IHRydWUsXG5cdFx0bGVuZ3RoTWVudTogWzEwLDE1LDIwLDI1LDUwLDEwMF0sXG5cdFx0cGFnZUxlbmd0aDogMTAsXG5cdFx0aW5mbzogZmFsc2UsXG5cdFx0c2VhcmNoaW5nOiB0cnVlLFxuXHRcdHJlc3BvbnNpdmU6XG5cdFx0XHRkZXRhaWxzOiBmYWxzZVxuXHRcdGF1dG9XaWR0aDogZmFsc2UsXG5cdFx0Y2hhbmdlU2VsZWN0b3I6IChzZWxlY3RvciwgdXNlcklkKSAtPlxuXHRcdFx0dW5sZXNzIHVzZXJJZFxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZSA9IHNlbGVjdG9yLnNwYWNlXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0aWYgc2VsZWN0b3I/LiRhbmQ/Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRzcGFjZSA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF1cblx0XHRcdHVubGVzcyBzcGFjZVxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7dXNlcjogdXNlcklkLCBzcGFjZTogc3BhY2V9LCB7ZmllbGRzOiB7X2lkOiAxfX0pXG5cdFx0XHR1bmxlc3Mgc3BhY2VfdXNlclxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRyZXR1cm4gc2VsZWN0b3Jcblx0XHRwYWdpbmdUeXBlOiBcIm51bWJlcnNcIlxuXG5cdH1cblxuXHRpZiBmbG93SWRcblx0XHRrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgZmxvd0lkXG5cblx0XHRvcHRpb25zLm5hbWUgPSBrZXlcblxuXHRcdFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MuZmllbGRzID0gZmllbGRzXG5cblx0XHRpbnNfZmllbGRzID0gX2hhbmRsZUxpc3RGaWVsZHMgVGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcy5maWVsZHNcblxuXHRcdGluc19maWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdFx0aWYgZi50eXBlICE9ICd0YWJsZScgJiYgZi5pc19saXN0X2Rpc3BsYXlcblx0XHRcdFx0b3B0aW9ucy5jb2x1bW5zLnB1c2hcblx0XHRcdFx0XHRkYXRhOiAoZi5uYW1lIHx8IGYuY29kZSksXG5cdFx0XHRcdFx0dGl0bGU6IHQoZi5uYW1lIHx8IGYuY29kZSksXG5cdFx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXG5cdFx0XHRcdFx0XHR2YWx1ZXMgPSBkb2MudmFsdWVzIHx8IHt9XG5cblx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVzW2YuY29kZV1cblxuXHRcdFx0XHRcdFx0c3dpdGNoIGYudHlwZVxuXHRcdFx0XHRcdFx0XHR3aGVuICd1c2VyJ1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWU/Lm5hbWVcblx0XHRcdFx0XHRcdFx0d2hlbiAnZ3JvdXAnXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZnVsbG5hbWVcblx0XHRcdFx0XHRcdFx0d2hlbiAnZGF0ZSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2RhdGVUaW1lJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJylcblx0XHRcdFx0XHRcdFx0d2hlbiAnY2hlY2tib3gnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWUgPT0gdHJ1ZSB8fCB2YWx1ZSA9PSAndHJ1ZSdcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfeWVzXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfbm9cIik7XG5cdFx0XHRcdFx0XHRcdHdoZW4gJ29kYXRhJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBfLmlzQXJyYXkodmFsdWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gXy5wbHVjayh2YWx1ZSwgJ0BsYWJlbCcpLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ11cblxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cblxuXHRyZXR1cm4gb3B0aW9ucztcblxuXG5NZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUgaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhcigpXG5cdFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MgPSBuZXcgVGFidWxhci5UYWJsZSBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcigpXG5cdFRhYnVsYXJUYWJsZXMuaW5ib3hfaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUgR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoXCJpbmJveFwiKVxuXHRUYWJ1bGFyVGFibGVzLm91dGJveF9pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZSBHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhcIm91dGJveFwiKVxuXG5cbkdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zID0gKGJveCwgZmxvd0lkLCBmaWVsZHMpLT5cblx0a2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGJveCArIGZsb3dJZFxuXHRpZiBib3ggPT0gXCJpbmJveFwiXG5cdFx0b3B0aW9ucyA9IF9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyhmbG93SWQsIGZpZWxkcylcblx0ZWxzZSBpZiBib3ggPT0gXCJvdXRib3hcIlxuXHRcdG9wdGlvbnMgPSBfZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zKGZsb3dJZCwgZmllbGRzKVxuXHRlbHNlXG5cdFx0b3B0aW9ucyA9IGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpXG5cdFx0aWYgIWZsb3dJZFxuXHRcdFx0b3B0aW9ucy5uYW1lID0gXCJpbmJveF9pbnN0YW5jZXNcIlxuXHRpZiBmbG93SWRcblx0XHRvcHRpb25zLm5hbWUgPSBrZXlcblx0cmV0dXJuIG9wdGlvbnNcblxuX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zID0gKGZsb3dJZCwgZmllbGRzKS0+XG5cdG9wdGlvbnMgPSBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcylcblxuXHRpZiAhZmxvd0lkXG5cdFx0b3B0aW9ucy5uYW1lID0gXCJpbmJveF9pbnN0YW5jZXNcIlxuXG5cdG9wdGlvbnMub3JkZXIgPSBbWzgsIFwiZGVzY1wiXV1cblxuXHRvcHRpb25zLmdldFNvcnQgPSAoc2VsZWN0b3IsIHNvcnQpIC0+IFxuXHRcdGNvbnNvbGUubG9nKCdpbmJveF9pbnN0YW5jZXM6Jyxzb3J0KVxuXHRcdHJldHVybiBzb3J0XG5cblx0cmV0dXJuIG9wdGlvbnNcblxuX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyA9IChmbG93SWQsIGZpZWxkcyktPlxuXHRvcHRpb25zID0gaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpXG5cblx0aWYgIWZsb3dJZFxuXHRcdG9wdGlvbnMubmFtZSA9IFwib3V0Ym94X2luc3RhbmNlc1wiXG5cblx0b3B0aW9ucy5vcmRlciA9IFtbOSwgLTFdXVxuXG5cdG9wdGlvbnMuZ2V0U29ydCA9IChzZWxlY3Rvciwgc29ydCkgLT4gXG5cdFx0Y29uc29sZS5sb2coJ291dGJveF9pbnN0YW5jZXM6Jyxzb3J0KVxuXHRcdCMgbmV3U29ydCA9IFsgXG5cdFx0IyBcdFsnc3BhY2UnLCAxXSxcblx0XHQjIFx0WydoYW5kbGVyJywgMV0sXG5cdFx0IyBcdFsnaXNfZmluaXNoZWQnLCAxXSxcblx0XHQjIF1cblx0XHQjIG5ld1NvcnQgPSBuZXdTb3J0LmNvbmNhdChzb3J0KVxuXHRcdCMgcmV0dXJuIG5ld1NvcnRcblx0XHRyZXR1cm4gc29ydFxuXG5cdHJldHVybiBvcHRpb25zXG5cbmlmIE1ldGVvci5pc0NsaWVudFxuXHRUYWJ1bGFyVGFibGVzLmZsb3dJbnN0YW5jZXMgPSBuZXcgUmVhY3RpdmVWYXIoKVxuXG5NZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdFRyYWNrZXIuYXV0b3J1biAoYykgLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnQgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJmbG93SWRcIikgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gJ2RyYWZ0J1xuXHRcdFx0XHRNZXRlb3IuY2FsbCBcIm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyXCIsIFNlc3Npb24uZ2V0KFwiYm94XCIpLCBTZXNzaW9uLmdldChcImZsb3dJZFwiKSwgKGVycm9yLCByZXN1bHQpIC0+XG5cdFx0XHRcdFx0bmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIgU2Vzc2lvbi5nZXQoXCJib3hcIiksIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpLCByZXN1bHRcblx0XHRcdFx0XHRUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll9jaGFuZ2VPcmRlcigpXG5cblxubmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIgPSAoYm94LCBmbG93SWQsIGZpZWxkcyktPlxuXHRpZiAhZmllbGRzXG5cdFx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe19pZDogZmxvd0lkfSwge2ZpZWxkczoge2Zvcm06IDF9fSlcblx0XHRmaWVsZHMgPSBkYi5mb3Jtcy5maW5kT25lKHsgX2lkOiBmbG93Py5mb3JtIH0sIHsgZmllbGRzOiB7ICdjdXJyZW50LmZpZWxkcyc6IDEgfSB9KT8uY3VycmVudD8uZmllbGRzXG5cblx0ZmllbGRzID0gX2hhbmRsZUxpc3RGaWVsZHMgZmllbGRzXG5cblx0aWYgZmllbGRzPy5maWx0ZXJQcm9wZXJ0eShcImlzX2xpc3RfZGlzcGxheVwiLCB0cnVlKT8ubGVuZ3RoID4gMFxuXHRcdGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBib3ggKyBmbG93SWRcblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFRhYnVsYXJUYWJsZXMuZmxvd0luc3RhbmNlcy5zZXQobmV3IFRhYnVsYXIuVGFibGUgR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoYm94LCBmbG93SWQsIGZpZWxkcykpXG5cdFx0ZWxzZVxuXHRcdFx0bmV3IFRhYnVsYXIuVGFibGUgR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoYm94LCBmbG93SWQsIGZpZWxkcylcblx0XHRjb25zb2xlLmxvZyBcIm5ldyBUYWJ1bGFyVGFibGVzIFwiLCBrZXlcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdE1ldGVvci5tZXRob2RzXG5cdFx0bmV3SW5zdGFuY2VzTGlzdFRhYnVsYXI6IChib3gsIGZsb3dJZCktPlxuXHRcdFx0bmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIoYm94LCBmbG93SWQpXG5cblx0XHRcdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtfaWQ6IGZsb3dJZH0sIHtmaWVsZHM6IHtmb3JtOiAxfX0pXG5cdFx0XHRmaWVsZHMgPSBkYi5mb3Jtcy5maW5kT25lKHsgX2lkOiBmbG93Py5mb3JtIH0sIHsgZmllbGRzOiB7ICdjdXJyZW50LmZpZWxkcyc6IDEgfSB9KT8uY3VycmVudD8uZmllbGRzXG5cdFx0XHRyZXR1cm4gZmllbGRzXG5cblxuIiwidmFyIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zLCBfZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMsIF9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMsIF9oYW5kbGVMaXN0RmllbGRzLCBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhciwgaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciwgbmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIsIHVwZGF0ZVRhYnVsYXJUaXRsZTtcblxuU3RlZWRvcy5zdWJzW1wiSW5zdGFuY2VUYWJ1bGFyXCJdID0gbmV3IFN1YnNNYW5hZ2VyKCk7XG5cbl9oYW5kbGVMaXN0RmllbGRzID0gZnVuY3Rpb24oZmllbGRzKSB7XG4gIHZhciBpbnNfZmllbGRzO1xuICBpbnNfZmllbGRzID0gbmV3IEFycmF5KCk7XG4gIGlmIChmaWVsZHMgIT0gbnVsbCkge1xuICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgIHZhciByZWY7XG4gICAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZygnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoZi50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYgPSBmLmZpZWxkcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGYxKSB7XG4gICAgICAgICAgcmV0dXJuIGluc19maWVsZHMucHVzaChmMSk7XG4gICAgICAgIH0pIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGluc19maWVsZHMucHVzaChmKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaW5zX2ZpZWxkcztcbn07XG5cbnVwZGF0ZVRhYnVsYXJUaXRsZSA9IGZ1bmN0aW9uKCkge307XG5cbmluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIgPSBmdW5jdGlvbihmbG93SWQsIGZpZWxkcykge1xuICB2YXIgaW5zX2ZpZWxkcywga2V5LCBvcHRpb25zO1xuICBvcHRpb25zID0ge1xuICAgIG5hbWU6IFwiaW5zdGFuY2VzXCIsXG4gICAgY29sbGVjdGlvbjogZGIuaW5zdGFuY2VzLFxuICAgIHB1YjogXCJpbnN0YW5jZV90YWJ1bGFyXCIsXG4gICAgb25VbmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKTtcbiAgICB9LFxuICAgIGRyYXdDYWxsYmFjazogZnVuY3Rpb24oc2V0dGluZ3MpIHtcbiAgICAgIHZhciBlbGxpcHNpc0xpbmssIGVtcHR5VGQsIHRpdGxlO1xuICAgICAgZW1wdHlUZCA9ICQoXCIuZGF0YVRhYmxlc19lbXB0eVwiKTtcbiAgICAgIGlmIChlbXB0eVRkLmxlbmd0aCkge1xuICAgICAgICBlbXB0eVRkWzBdLmNvbFNwYW4gPSBcIjZcIjtcbiAgICAgIH1cbiAgICAgIGlmICghU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzUGFkKCkpIHtcbiAgICAgICAgTWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApO1xuICAgICAgICAkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiAkKFwiLmluc3RhbmNlLWxpc3RcIikucGVyZmVjdFNjcm9sbGJhcihcInVwZGF0ZVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApO1xuICAgICAgfVxuICAgICAgdGl0bGUgPSB0KFwicGFnZXJfaW5wdXRfaGludFwiKTtcbiAgICAgIGVsbGlwc2lzTGluayA9IHNldHRpbmdzLm9JbnN0YW5jZS5wYXJlbnQoKS5maW5kKCcucGFnaW5nX251bWJlcnMgLnBhZ2luYXRpb24gLmRpc2FibGVkIGEnKTtcbiAgICAgIHJldHVybiBlbGxpcHNpc0xpbmsuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZ29QYWdlLCBpbnB1dDtcbiAgICAgICAgaWYgKCEkKHRoaXMpLmZpbmQoJ2lucHV0JykubGVuZ3RoKSB7XG4gICAgICAgICAgaW5wdXQgPSAkKCc8aW5wdXQgY2xhc3M9XCJwYWdpbmF0ZV9pbnB1dCBmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiYm9yZGVyOiBub25lOyBwYWRkaW5nOjAgMnB4O1wiLz4nKTtcbiAgICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICBpbnB1dC5jc3Moe1xuICAgICAgICAgICAgICB3aWR0aDogXCI1MnB4XCIsXG4gICAgICAgICAgICAgIGhlaWdodDogXCIyMHB4XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dC5jc3Moe1xuICAgICAgICAgICAgICB3aWR0aDogXCI1MnB4XCIsXG4gICAgICAgICAgICAgIGhlaWdodDogXCIxNnB4XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnB1dC5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCB0aXRsZSk7XG4gICAgICAgICAgJCh0aGlzKS5lbXB0eSgpLmFwcGVuZChpbnB1dCk7XG4gICAgICAgICAgZ29QYWdlID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBwYWdlcztcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgcGFnZXMgPSBNYXRoLmNlaWwoc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpIC8gc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gcGFnZXMpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHBhZ2VzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5vSW5zdGFuY2UuRGF0YVRhYmxlKCkucGFnZShpbmRleCkuZHJhdygncGFnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaW5wdXQuYmx1cihmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFBhZ2U7XG4gICAgICAgICAgICBjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICBnb1BhZ2UoY3VycmVudFBhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuICQodGhpcykucGFyZW50KCkuaHRtbCgnLi4uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGlucHV0LmtleWRvd24oZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZS50b1N0cmluZygpID09PSBcIjEzXCIpIHtcbiAgICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgICByZXR1cm4gZ29QYWdlKGN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVkUm93OiBmdW5jdGlvbihyb3csIGRhdGEsIGRhdGFJbmRleCkge1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICBpZiAoZGF0YS5faWQgPT09IEZsb3dSb3V0ZXIuY3VycmVudCgpLnBhcmFtcy5pbnN0YW5jZUlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInNlbGVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIGRhdGE6IFwiX2lkXCIsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgYWdlbnRfdmlldywgY2NfdmlldywgZmxvd19uYW1lLCBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzLCBtb2RpZmllZCwgbW9kaWZpZWRGcm9tTm93LCBtb2RpZmllZFN0cmluZywgcHJpb3JpdHlJY29uLCBwcmlvcml0eUljb25DbGFzcywgcHJpb3JpdHlWYWx1ZSwgcmVmLCByZWYxLCBzdGVwX2N1cnJlbnRfbmFtZV92aWV3LCB1bnJlYWQ7XG4gICAgICAgICAgbW9kaWZpZWRTdHJpbmcgPSBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICBtb2RpZmllZCA9IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLnN0YXRlICE9PSAnZHJhZnQnKSB7XG4gICAgICAgICAgICBtb2RpZmllZCA9IGRvYy5zdGFydF9kYXRlIHx8IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnb3V0Ym94JyB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ21vbml0b3InKSB7XG4gICAgICAgICAgICBtb2RpZmllZCA9IGRvYy5zdWJtaXRfZGF0ZSB8fCBkb2Muc3VibWl0X2RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGlmaWVkRnJvbU5vdyA9IFN0ZWVkb3MubW9tZW50UmVhY3RpdmVGcm9tTm93KG1vZGlmaWVkKTtcbiAgICAgICAgICBmbG93X25hbWUgPSBkb2MuZmxvd19uYW1lO1xuICAgICAgICAgIGNjX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuaXNfY2MgJiYgISgocmVmID0gZG9jLmluYm94X3VzZXJzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgOiB2b2lkIDApICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIjtcbiAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjxzcGFuPihcIiArIGRvYy5jdXJyZW50X3N0ZXBfbmFtZSArIFwiKTwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpICE9PSAnZHJhZnQnICYmIGRvYy5jdXJyZW50X3N0ZXBfbmFtZSkge1xuICAgICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8c3Bhbj4oXCIgKyBkb2MuY3VycmVudF9zdGVwX25hbWUgKyBcIik8L3NwYW4+PC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYWdlbnRfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5hZ2VudF91c2VyX25hbWUgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHtcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWVcbiAgICAgICAgICAgIH0pICsgXCIpPC9sYWJlbD5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5yZWFkID0gJyc7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPic7XG4gICAgICAgICAgfSBlbHNlIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpb3JpdHlJY29uID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlWYWx1ZSA9IChyZWYxID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZjEucHJpb3JpdHkgOiB2b2lkIDA7XG4gICAgICAgICAgc3dpdGNoIChwcmlvcml0eVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwi54m55oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi57Sn5oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIuWKnuaWh1wiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaW9yaXR5SWNvbkNsYXNzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS1cIiArIHByaW9yaXR5SWNvbkNsYXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+XCIgKyB1bnJlYWQgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgXCIgKyBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzICsgXCInPlwiICsgZG9jLm5hbWUgKyBjY192aWV3ICsgYWdlbnRfdmlldyArIFwiXFxuXHQ8c3Bhbj5cIiArIGRvYy5hcHBsaWNhbnRfbmFtZSArIFwiPC9zcGFuPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLWRldGFpbCc+XCIgKyBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ICsgXCJcXG5cdDxzcGFuIGNsYXNzPSdpbnN0YW5jZS1tb2RpZmllZCcgdGl0bGU9J1wiICsgbW9kaWZpZWRTdHJpbmcgKyBcIic+XCIgKyBtb2RpZmllZEZyb21Ob3cgKyBcIjwvc3Bhbj5cXG48L2Rpdj5cIjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19uYW1lXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFnZW50X3ZpZXcsIGNjX3ZpZXcsIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MsIHByaW9yaXR5SWNvbkNsYXNzLCBwcmlvcml0eVZhbHVlLCByZWYsIHJlZjEsIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcsIHVucmVhZDtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmlzX2NjICYmICEoKHJlZiA9IGRvYy5pbmJveF91c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpIDogdm9pZCAwKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgY2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuYWdlbnRfdXNlcl9uYW1lKSB7XG4gICAgICAgICAgICBhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lXG4gICAgICAgICAgICB9KSArIFwiKTwvbGFiZWw+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVucmVhZCA9ICcnO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eVZhbHVlID0gKHJlZjEgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmMS5wcmlvcml0eSA6IHZvaWQgMDtcbiAgICAgICAgICBzd2l0Y2ggKHByaW9yaXR5VmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCLnibnmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLntKfmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi5Yqe5paHXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJpb3JpdHlJY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LVwiICsgcHJpb3JpdHlJY29uQ2xhc3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz5cIiArIHVucmVhZCArIFwiPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSBcIiArIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgKyBcIic+XCIgKyBkb2MubmFtZSArIGNjX3ZpZXcgKyBhZ2VudF92aWV3ICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdWJtaXRfZGF0ZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdWJtaXRfZGF0ZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2Muc3VibWl0X2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLnN1Ym1pdF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJmbG93X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJjdXJyZW50X3N0ZXBfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdGVwX2N1cnJlbnRfbmFtZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBjY190YWcsIGp1ZGdlLCBzdGVwX2N1cnJlbnRfbmFtZTtcbiAgICAgICAgICBpZiAoZG9jLnN0YXRlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBqdWRnZSA9IGRvYy5maW5hbF9kZWNpc2lvbiB8fCBcImFwcHJvdmVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLmN1cnJlbnRfc3RlcF9uYW1lIHx8ICcnO1xuICAgICAgICAgIGNjX3RhZyA9ICcnO1xuICAgICAgICAgIGlmIChkb2MuY2NfY291bnQgPiAwKSB7XG4gICAgICAgICAgICBjY190YWcgPSBUQVBpMThuLl9fKCdjY190YWcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwic3RlcC1jdXJyZW50LXN0YXRlIFwiICsganVkZ2UgKyBcIlxcXCI+XCIgKyBzdGVwX2N1cnJlbnRfbmFtZSArIGNjX3RhZyArIFwiPC9kaXY+XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibW9kaWZpZWRcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfbW9kaWZpZWRcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdGFydF9kYXRlXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0YXJ0X2RhdGVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLnN0YXJ0X2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLnN0YXJ0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm15X2ZpbmlzaF9kYXRlXCIsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLm15X2ZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5teV9maW5pc2hfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwibW9kaWZpZWRcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJrZXl3b3Jkc1wiLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImlzX2FyY2hpdmVkXCIsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgIGlmICgoZG9jICE9IG51bGwgPyAocmVmID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZi5yZWNvcmRfbmVlZCA6IHZvaWQgMCA6IHZvaWQgMCkgJiYgZG9jLnZhbHVlcy5yZWNvcmRfbmVlZCA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCA/IGRvYy5pc19hcmNoaXZlZCA6IHZvaWQgMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdChcIllFU1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0KFwiTk9cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfVxuICAgIF0sXG4gICAgZG9tOiAoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgIHJldHVybiAndHAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICd0cGwnO1xuICAgICAgfVxuICAgIH0pKCksXG4gICAgb3JkZXI6IFtbNCwgXCJkZXNjXCJdXSxcbiAgICBleHRyYUZpZWxkczogW1wiZm9ybVwiLCBcImZsb3dcIiwgXCJpbmJveF91c2Vyc1wiLCBcInN0YXRlXCIsIFwic3BhY2VcIiwgXCJhcHBsaWNhbnRcIiwgXCJmb3JtX3ZlcnNpb25cIiwgXCJmbG93X3ZlcnNpb25cIiwgXCJpc19jY1wiLCBcImNjX2NvdW50XCIsIFwiaXNfcmVhZFwiLCBcImN1cnJlbnRfc3RlcF9uYW1lXCIsIFwidmFsdWVzXCIsIFwia2V5d29yZHNcIiwgXCJmaW5hbF9kZWNpc2lvblwiLCBcImZsb3dfbmFtZVwiLCBcImlzX2hpZGRlblwiLCBcImFnZW50X3VzZXJfbmFtZVwiXSxcbiAgICBsZW5ndGhDaGFuZ2U6IHRydWUsXG4gICAgbGVuZ3RoTWVudTogWzEwLCAxNSwgMjAsIDI1LCA1MCwgMTAwXSxcbiAgICBwYWdlTGVuZ3RoOiAxMCxcbiAgICBpbmZvOiBmYWxzZSxcbiAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgcmVzcG9uc2l2ZToge1xuICAgICAgZGV0YWlsczogZmFsc2VcbiAgICB9LFxuICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgY2hhbmdlU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1c2VySWQpIHtcbiAgICAgIHZhciByZWYsIHNwYWNlLCBzcGFjZV91c2VyO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZSA9IHNlbGVjdG9yLnNwYWNlO1xuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICBpZiAoKHNlbGVjdG9yICE9IG51bGwgPyAocmVmID0gc2VsZWN0b3IuJGFuZCkgIT0gbnVsbCA/IHJlZi5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApID4gMCkge1xuICAgICAgICAgIHNwYWNlID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgICBzcGFjZTogc3BhY2VcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFzcGFjZV91c2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH0sXG4gICAgcGFnaW5nVHlwZTogXCJudW1iZXJzXCJcbiAgfTtcbiAgaWYgKGZsb3dJZCkge1xuICAgIGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBmbG93SWQ7XG4gICAgb3B0aW9ucy5uYW1lID0ga2V5O1xuICAgIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkcyA9IGZpZWxkcztcbiAgICBpbnNfZmllbGRzID0gX2hhbmRsZUxpc3RGaWVsZHMoVGFidWxhclRhYmxlcy5pbnN0YW5jZXMuZmllbGRzKTtcbiAgICBpbnNfZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZikge1xuICAgICAgaWYgKGYudHlwZSAhPT0gJ3RhYmxlJyAmJiBmLmlzX2xpc3RfZGlzcGxheSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgIGRhdGE6IGYubmFtZSB8fCBmLmNvZGUsXG4gICAgICAgICAgdGl0bGU6IHQoZi5uYW1lIHx8IGYuY29kZSksXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUsIHZhbHVlcztcbiAgICAgICAgICAgIHZhbHVlcyA9IGRvYy52YWx1ZXMgfHwge307XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tmLmNvZGVdO1xuICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAndXNlcic6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUubmFtZSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmZ1bGxuYW1lIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfbm9cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdvZGF0YSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5pbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhciA9IGZ1bmN0aW9uKGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBpbnNfZmllbGRzLCBrZXksIG9wdGlvbnM7XG4gIG9wdGlvbnMgPSB7XG4gICAgbmFtZTogXCJpbnN0YW5jZV90YXNrc1wiLFxuICAgIGNvbGxlY3Rpb246IGRiLmluc3RhbmNlX3Rhc2tzLFxuICAgIHB1YjogXCJpbnN0YW5jZV90YXNrc190YWJ1bGFyXCIsXG4gICAgb25VbmxvYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKTtcbiAgICB9LFxuICAgIGRyYXdDYWxsYmFjazogZnVuY3Rpb24oc2V0dGluZ3MpIHtcbiAgICAgIHZhciBlbGxpcHNpc0xpbmssIGVtcHR5VGQsIHRpdGxlO1xuICAgICAgZW1wdHlUZCA9ICQoXCIuZGF0YVRhYmxlc19lbXB0eVwiKTtcbiAgICAgIGlmIChlbXB0eVRkLmxlbmd0aCkge1xuICAgICAgICBlbXB0eVRkWzBdLmNvbFNwYW4gPSBcIjZcIjtcbiAgICAgIH1cbiAgICAgIGlmICghU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzUGFkKCkpIHtcbiAgICAgICAgTWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApO1xuICAgICAgICAkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiAkKFwiLmluc3RhbmNlLWxpc3RcIikucGVyZmVjdFNjcm9sbGJhcihcInVwZGF0ZVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApO1xuICAgICAgfVxuICAgICAgdGl0bGUgPSB0KFwicGFnZXJfaW5wdXRfaGludFwiKTtcbiAgICAgIGVsbGlwc2lzTGluayA9IHNldHRpbmdzLm9JbnN0YW5jZS5wYXJlbnQoKS5maW5kKCcucGFnaW5nX251bWJlcnMgLnBhZ2luYXRpb24gLmRpc2FibGVkIGEnKTtcbiAgICAgIHJldHVybiBlbGxpcHNpc0xpbmsuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZ29QYWdlLCBpbnB1dDtcbiAgICAgICAgaWYgKCEkKHRoaXMpLmZpbmQoJ2lucHV0JykubGVuZ3RoKSB7XG4gICAgICAgICAgaW5wdXQgPSAkKCc8aW5wdXQgY2xhc3M9XCJwYWdpbmF0ZV9pbnB1dCBmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiYm9yZGVyOiBub25lOyBwYWRkaW5nOjAgMnB4O1wiLz4nKTtcbiAgICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICBpbnB1dC5jc3Moe1xuICAgICAgICAgICAgICB3aWR0aDogXCI1MnB4XCIsXG4gICAgICAgICAgICAgIGhlaWdodDogXCIyMHB4XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dC5jc3Moe1xuICAgICAgICAgICAgICB3aWR0aDogXCI1MnB4XCIsXG4gICAgICAgICAgICAgIGhlaWdodDogXCIxNnB4XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnB1dC5hdHRyKFwidGl0bGVcIiwgdGl0bGUpLmF0dHIoXCJwbGFjZWhvbGRlclwiLCB0aXRsZSk7XG4gICAgICAgICAgJCh0aGlzKS5lbXB0eSgpLmFwcGVuZChpbnB1dCk7XG4gICAgICAgICAgZ29QYWdlID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBwYWdlcztcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgcGFnZXMgPSBNYXRoLmNlaWwoc2V0dGluZ3MuZm5SZWNvcmRzRGlzcGxheSgpIC8gc2V0dGluZ3MuX2lEaXNwbGF5TGVuZ3RoKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gcGFnZXMpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHBhZ2VzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGluZGV4LS07XG4gICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5vSW5zdGFuY2UuRGF0YVRhYmxlKCkucGFnZShpbmRleCkuZHJhdygncGFnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaW5wdXQuYmx1cihmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFBhZ2U7XG4gICAgICAgICAgICBjdXJyZW50UGFnZSA9ICQodGhpcykudmFsKCk7XG4gICAgICAgICAgICBnb1BhZ2UoY3VycmVudFBhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuICQodGhpcykucGFyZW50KCkuaHRtbCgnLi4uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGlucHV0LmtleWRvd24oZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZS50b1N0cmluZygpID09PSBcIjEzXCIpIHtcbiAgICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgICByZXR1cm4gZ29QYWdlKGN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVkUm93OiBmdW5jdGlvbihyb3csIGRhdGEsIGRhdGFJbmRleCkge1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICBpZiAoZGF0YS5pbnN0YW5jZSA9PT0gRmxvd1JvdXRlci5jdXJyZW50KCkucGFyYW1zLmluc3RhbmNlSWQpIHtcbiAgICAgICAgICByZXR1cm4gcm93LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic2VsZWN0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHtcbiAgICAgICAgZGF0YTogXCJfaWRcIixcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhZ2VudF92aWV3LCBjY192aWV3LCBmbG93X25hbWUsIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MsIG1vZGlmaWVkLCBtb2RpZmllZEZyb21Ob3csIG1vZGlmaWVkU3RyaW5nLCBwcmlvcml0eUljb24sIHByaW9yaXR5SWNvbkNsYXNzLCBwcmlvcml0eVZhbHVlLCByZWYsIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcsIHVucmVhZDtcbiAgICAgICAgICBtb2RpZmllZFN0cmluZyA9IG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgIG1vZGlmaWVkID0gZG9jLm1vZGlmaWVkO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaW5zdGFuY2Vfc3RhdGUgIT09ICdkcmFmdCcpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkID0gZG9jLnN0YXJ0X2RhdGUgfHwgZG9jLm1vZGlmaWVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdvdXRib3gnKSB7XG4gICAgICAgICAgICBtb2RpZmllZCA9IGRvYy5zdWJtaXRfZGF0ZSB8fCBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGlmaWVkRnJvbU5vdyA9IFN0ZWVkb3MubW9tZW50UmVhY3RpdmVGcm9tTm93KG1vZGlmaWVkKTtcbiAgICAgICAgICBmbG93X25hbWUgPSBkb2MuZmxvd19uYW1lO1xuICAgICAgICAgIGNjX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MudHlwZSA9PT0gJ2NjJyAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgY2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCI7XG4gICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8c3Bhbj4oXCIgKyBkb2Muc3RlcF9uYW1lICsgXCIpPC9zcGFuPjwvZGl2PlwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9jLnN0ZXBfbmFtZSkge1xuICAgICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8c3Bhbj4oXCIgKyBkb2Muc3RlcF9uYW1lICsgXCIpPC9zcGFuPjwvZGl2PlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuYWdlbnRfdXNlcl9uYW1lICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lXG4gICAgICAgICAgICB9KSArIFwiKTwvbGFiZWw+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVucmVhZCA9ICcnO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW9yaXR5SWNvbiA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5VmFsdWUgPSAocmVmID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZi5wcmlvcml0eSA6IHZvaWQgMDtcbiAgICAgICAgICBzd2l0Y2ggKHByaW9yaXR5VmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCLnibnmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLntKfmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi5Yqe5paHXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJpb3JpdHlJY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LVwiICsgcHJpb3JpdHlJY29uQ2xhc3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz5cIiArIHVucmVhZCArIFwiPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSBcIiArIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgKyBcIic+XCIgKyBkb2MuaW5zdGFuY2VfbmFtZSArIGNjX3ZpZXcgKyBhZ2VudF92aWV3ICsgXCJcXG5cdDxzcGFuPlwiICsgZG9jLmFwcGxpY2FudF9uYW1lICsgXCI8L3NwYW4+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtZGV0YWlsJz5cIiArIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgKyBcIlxcblx0PHNwYW4gY2xhc3M9J2luc3RhbmNlLW1vZGlmaWVkJyB0aXRsZT0nXCIgKyBtb2RpZmllZFN0cmluZyArIFwiJz5cIiArIG1vZGlmaWVkRnJvbU5vdyArIFwiPC9zcGFuPlxcbjwvZGl2PlwiO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJpbnN0YW5jZV9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX25hbWVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgYWdlbnRfdmlldywgY2NfdmlldywgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcywgcHJpb3JpdHlJY29uQ2xhc3MsIHByaW9yaXR5VmFsdWUsIHJlZiwgcmVmMSwgc3RlcF9jdXJyZW50X25hbWVfdmlldywgdW5yZWFkO1xuICAgICAgICAgIGNjX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuaXNfY2MgJiYgISgocmVmID0gZG9jLmluYm94X3VzZXJzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgOiB2b2lkIDApICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWdlbnRfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5hZ2VudF91c2VyX25hbWUpIHtcbiAgICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHtcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWVcbiAgICAgICAgICAgIH0pICsgXCIpPC9sYWJlbD5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5yZWFkID0gJyc7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPic7XG4gICAgICAgICAgfSBlbHNlIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+JztcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5VmFsdWUgPSAocmVmMSA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYxLnByaW9yaXR5IDogdm9pZCAwO1xuICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcIueJueaApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIue0p+aApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLlip7mlodcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmlvcml0eUljb25DbGFzcykge1xuICAgICAgICAgICAgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktXCIgKyBwcmlvcml0eUljb25DbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPlwiICsgdW5yZWFkICsgXCI8L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lIFwiICsgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyArIFwiJz5cIiArIGRvYy5pbnN0YW5jZV9uYW1lICsgY2NfdmlldyArIGFnZW50X3ZpZXcgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcInN1Ym1pdF9kYXRlXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N1Ym1pdF9kYXRlXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5zdWJtaXRfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2Muc3VibWl0X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImZsb3dfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcInN0ZXBfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdGVwX2N1cnJlbnRfbmFtZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBjY190YWcsIGp1ZGdlLCBzdGVwX2N1cnJlbnRfbmFtZTtcbiAgICAgICAgICBpZiAoZG9jLmluc3RhbmNlX3N0YXRlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBqdWRnZSA9IGRvYy5qdWRnZSB8fCBcImFwcHJvdmVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLnN0ZXBfbmFtZSB8fCAnJztcbiAgICAgICAgICBjY190YWcgPSAnJztcbiAgICAgICAgICBpZiAoZG9jLmNjX2NvdW50ID4gMCkge1xuICAgICAgICAgICAgY2NfdGFnID0gVEFQaTE4bi5fXygnY2NfdGFnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInN0ZXAtY3VycmVudC1zdGF0ZSBcIiArIGp1ZGdlICsgXCJcXFwiPlwiICsgc3RlcF9jdXJyZW50X25hbWUgKyBjY190YWcgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm1vZGlmaWVkXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgcmV0dXJuIG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3RhcnRfZGF0ZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdGFydF9kYXRlXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5zdGFydF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJmaW5pc2hfZGF0ZVwiLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2MuZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm1vZGlmaWVkXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwia2V5d29yZHNcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJpc19hcmNoaXZlZFwiLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICBpZiAoKGRvYyAhPSBudWxsID8gKHJlZiA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYucmVjb3JkX25lZWQgOiB2b2lkIDAgOiB2b2lkIDApICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICBpZiAoZG9jICE9IG51bGwgPyBkb2MuaXNfYXJjaGl2ZWQgOiB2b2lkIDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQoXCJZRVNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdChcIk5PXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH1cbiAgICBdLFxuICAgIGRvbTogKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICByZXR1cm4gJ3RwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAndHBsJztcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIG9yZGVyOiBbWzQsIFwiZGVzY1wiXV0sXG4gICAgZXh0cmFGaWVsZHM6IFtcImluc3RhbmNlXCIsIFwiZm9ybVwiLCBcImZsb3dcIiwgXCJpbmJveF91c2Vyc1wiLCBcImluc3RhbmNlX3N0YXRlXCIsIFwic3BhY2VcIiwgXCJhcHBsaWNhbnRcIiwgXCJmb3JtX3ZlcnNpb25cIiwgXCJmbG93X3ZlcnNpb25cIiwgXCJ0eXBlXCIsIFwiaXNfcmVhZFwiLCBcInN0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG4gICAgbGVuZ3RoQ2hhbmdlOiB0cnVlLFxuICAgIGxlbmd0aE1lbnU6IFsxMCwgMTUsIDIwLCAyNSwgNTAsIDEwMF0sXG4gICAgcGFnZUxlbmd0aDogMTAsXG4gICAgaW5mbzogZmFsc2UsXG4gICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgIGRldGFpbHM6IGZhbHNlXG4gICAgfSxcbiAgICBhdXRvV2lkdGg6IGZhbHNlLFxuICAgIGNoYW5nZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvciwgdXNlcklkKSB7XG4gICAgICB2YXIgcmVmLCBzcGFjZSwgc3BhY2VfdXNlcjtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2UgPSBzZWxlY3Rvci5zcGFjZTtcbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgaWYgKChzZWxlY3RvciAhPSBudWxsID8gKHJlZiA9IHNlbGVjdG9yLiRhbmQpICE9IG51bGwgPyByZWYubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICAgICAgICBzcGFjZSA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3BhY2U6IHNwYWNlXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghc3BhY2VfdXNlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9LFxuICAgIHBhZ2luZ1R5cGU6IFwibnVtYmVyc1wiXG4gIH07XG4gIGlmIChmbG93SWQpIHtcbiAgICBrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgZmxvd0lkO1xuICAgIG9wdGlvbnMubmFtZSA9IGtleTtcbiAgICBUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzLmZpZWxkcyA9IGZpZWxkcztcbiAgICBpbnNfZmllbGRzID0gX2hhbmRsZUxpc3RGaWVsZHMoVGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcy5maWVsZHMpO1xuICAgIGluc19maWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgICBpZiAoZi50eXBlICE9PSAndGFibGUnICYmIGYuaXNfbGlzdF9kaXNwbGF5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgZGF0YTogZi5uYW1lIHx8IGYuY29kZSxcbiAgICAgICAgICB0aXRsZTogdChmLm5hbWUgfHwgZi5jb2RlKSxcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSwgdmFsdWVzO1xuICAgICAgICAgICAgdmFsdWVzID0gZG9jLnZhbHVlcyB8fCB7fTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2YuY29kZV07XG4gICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5uYW1lIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdncm91cCc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUuZnVsbG5hbWUgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZGF0ZVRpbWUnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ29kYXRhJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChfLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXy5wbHVjayh2YWx1ZSwgJ0BsYWJlbCcpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWydAbGFiZWwnXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICBUYWJ1bGFyVGFibGVzLmluc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlKGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIoKSk7XG4gIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MgPSBuZXcgVGFidWxhci5UYWJsZShpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcigpKTtcbiAgVGFidWxhclRhYmxlcy5pbmJveF9pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZShHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhcImluYm94XCIpKTtcbiAgcmV0dXJuIFRhYnVsYXJUYWJsZXMub3V0Ym94X2luc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlKEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKFwib3V0Ym94XCIpKTtcbn0pO1xuXG5HZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyA9IGZ1bmN0aW9uKGJveCwgZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIGtleSwgb3B0aW9ucztcbiAga2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGJveCArIGZsb3dJZDtcbiAgaWYgKGJveCA9PT0gXCJpbmJveFwiKSB7XG4gICAgb3B0aW9ucyA9IF9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyhmbG93SWQsIGZpZWxkcyk7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcIm91dGJveFwiKSB7XG4gICAgb3B0aW9ucyA9IF9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMoZmxvd0lkLCBmaWVsZHMpO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKTtcbiAgICBpZiAoIWZsb3dJZCkge1xuICAgICAgb3B0aW9ucy5uYW1lID0gXCJpbmJveF9pbnN0YW5jZXNcIjtcbiAgICB9XG4gIH1cbiAgaWYgKGZsb3dJZCkge1xuICAgIG9wdGlvbnMubmFtZSA9IGtleTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbl9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyA9IGZ1bmN0aW9uKGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBvcHRpb25zO1xuICBvcHRpb25zID0gaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpO1xuICBpZiAoIWZsb3dJZCkge1xuICAgIG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCI7XG4gIH1cbiAgb3B0aW9ucy5vcmRlciA9IFtbOCwgXCJkZXNjXCJdXTtcbiAgb3B0aW9ucy5nZXRTb3J0ID0gZnVuY3Rpb24oc2VsZWN0b3IsIHNvcnQpIHtcbiAgICBjb25zb2xlLmxvZygnaW5ib3hfaW5zdGFuY2VzOicsIHNvcnQpO1xuICAgIHJldHVybiBzb3J0O1xuICB9O1xuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbl9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMgPSBmdW5jdGlvbihmbG93SWQsIGZpZWxkcykge1xuICB2YXIgb3B0aW9ucztcbiAgb3B0aW9ucyA9IGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKTtcbiAgaWYgKCFmbG93SWQpIHtcbiAgICBvcHRpb25zLm5hbWUgPSBcIm91dGJveF9pbnN0YW5jZXNcIjtcbiAgfVxuICBvcHRpb25zLm9yZGVyID0gW1s5LCAtMV1dO1xuICBvcHRpb25zLmdldFNvcnQgPSBmdW5jdGlvbihzZWxlY3Rvciwgc29ydCkge1xuICAgIGNvbnNvbGUubG9nKCdvdXRib3hfaW5zdGFuY2VzOicsIHNvcnQpO1xuICAgIHJldHVybiBzb3J0O1xuICB9O1xuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgVGFidWxhclRhYmxlcy5mbG93SW5zdGFuY2VzID0gbmV3IFJlYWN0aXZlVmFyKCk7XG59XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gVHJhY2tlci5hdXRvcnVuKGZ1bmN0aW9uKGMpIHtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50ICYmICFTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImZsb3dJZFwiKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSAhPT0gJ2RyYWZ0Jykge1xuICAgICAgICByZXR1cm4gTWV0ZW9yLmNhbGwoXCJuZXdJbnN0YW5jZXNMaXN0VGFidWxhclwiLCBTZXNzaW9uLmdldChcImJveFwiKSwgU2Vzc2lvbi5nZXQoXCJmbG93SWRcIiksIGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICBuZXdJbnN0YW5jZXNMaXN0VGFidWxhcihTZXNzaW9uLmdldChcImJveFwiKSwgU2Vzc2lvbi5nZXQoXCJmbG93SWRcIiksIHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX2NoYW5nZU9yZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59KTtcblxubmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIgPSBmdW5jdGlvbihib3gsIGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBmbG93LCBrZXksIHJlZiwgcmVmMSwgcmVmMjtcbiAgaWYgKCFmaWVsZHMpIHtcbiAgICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZsb3dJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBmb3JtOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgZmllbGRzID0gKHJlZiA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmbG93ICE9IG51bGwgPyBmbG93LmZvcm0gOiB2b2lkIDBcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgJ2N1cnJlbnQuZmllbGRzJzogMVxuICAgICAgfVxuICAgIH0pKSAhPSBudWxsID8gKHJlZjEgPSByZWYuY3VycmVudCkgIT0gbnVsbCA/IHJlZjEuZmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICB9XG4gIGZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzKGZpZWxkcyk7XG4gIGlmICgoZmllbGRzICE9IG51bGwgPyAocmVmMiA9IGZpZWxkcy5maWx0ZXJQcm9wZXJ0eShcImlzX2xpc3RfZGlzcGxheVwiLCB0cnVlKSkgIT0gbnVsbCA/IHJlZjIubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICBrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgYm94ICsgZmxvd0lkO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIFRhYnVsYXJUYWJsZXMuZmxvd0luc3RhbmNlcy5zZXQobmV3IFRhYnVsYXIuVGFibGUoR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoYm94LCBmbG93SWQsIGZpZWxkcykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IFRhYnVsYXIuVGFibGUoR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoYm94LCBmbG93SWQsIGZpZWxkcykpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc29sZS5sb2coXCJuZXcgVGFidWxhclRhYmxlcyBcIiwga2V5KTtcbiAgfVxufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBNZXRlb3IubWV0aG9kcyh7XG4gICAgbmV3SW5zdGFuY2VzTGlzdFRhYnVsYXI6IGZ1bmN0aW9uKGJveCwgZmxvd0lkKSB7XG4gICAgICB2YXIgZmllbGRzLCBmbG93LCByZWYsIHJlZjE7XG4gICAgICBuZXdJbnN0YW5jZXNMaXN0VGFidWxhcihib3gsIGZsb3dJZCk7XG4gICAgICBmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7XG4gICAgICAgIF9pZDogZmxvd0lkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGZvcm06IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmaWVsZHMgPSAocmVmID0gZGIuZm9ybXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogZmxvdyAhPSBudWxsID8gZmxvdy5mb3JtIDogdm9pZCAwXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICdjdXJyZW50LmZpZWxkcyc6IDFcbiAgICAgICAgfVxuICAgICAgfSkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5jdXJyZW50KSAhPSBudWxsID8gcmVmMS5maWVsZHMgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZmllbGRzO1xuICAgIH1cbiAgfSk7XG59XG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jaGVja05wbS5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9saWIvVVJJLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvaW5zdGFuY2VfdGFza3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2xpYi9tb2RlbHMvYXV0aF90b2tlbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC9saWIvaW5zdGFuY2VfcmVhZG9ubHlfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL2luc3RhbmNlX3JlYWRvbmx5X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvbGliL3RlbXBsYXRlX21hbmFnZXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L2NsaWVudC9jb3JlZm9ybS9pbnB1dFR5cGVzL2NvcmVmb3JtLXRhYmxlL3N0ZWVkb3MtdGFibGUuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbWFnZV9zaWduLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oYW5kbGVyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL190cmFjZXNfaGFuZGxlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9mb3JtLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX2luc3RhbmNlX2F0dGFjaG1lbnRzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9faW5zdGFuY2Vfc2lnbl90ZXh0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19pbnN0YW5jZV9zaWduX3RleHQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L2NsaWVudC92aWV3cy9pbnN0YW5jZS9fdHJhY2VzX2hlbHAuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3RyYWNlc19oZWxwLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX2luc3RhbmNlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvY2xpZW50L3ZpZXdzL2luc3RhbmNlL19yZWxhdGVkX3JlY29yZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jbGllbnQvdmlld3MvaW5zdGFuY2UvX3JlbGF0ZWRfcmVjb3Jkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldFNwYWNlVXNlcnMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvcm91dGVzL2dldEZvcm11bGFVc2VyT2JqZWN0cy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvaW5pdF9mb3JtdWxhX3ZhbHVlcy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9yb3V0ZXMvYXBpX3dvcmtmbG93X2ZvcndhcmQuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvcm91dGVzL3Rlc3Rfd2ViaG9vay5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3JvdXRlcy90ZXN0X3dlYmhvb2suY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3NldF9pbnN0YW5jZV9zdGVwX2FwcHJvdmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2dldF9pbnN0YW5jZV9kYXRhLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL3NhdmVfaW5zdGFuY2UuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6d29ya2Zsb3cvc2VydmVyL21ldGhvZHMvdHJhY2VfYXBwcm92ZV9jYy5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczp3b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mb3J3YXJkX2luc3RhbmNlLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9tZXRob2RzL2Nmc19pbnN0YW5jZXMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfYXBwcm92ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvaW5zdGFuY2VfcmV0dXJuLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV9yZW1pbmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL25leHRfc3RlcF91c2Vyc19ub3RfZm91bmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX251bWJlcl9ydWxlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL21ldGhvZHMvY2hlY2tfbWFpbl9hdHRhY2guY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL3JlbGF0ZWRfaW5zdGFuY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9lZGl0X2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9zdGFydF9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV90cmFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9tZXRob2RzL2luc3RhbmNlX2JhdGNoLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9mbG93LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9oaWRlX2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvbWV0aG9kcy9pbnN0YW5jZV92YWx1ZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3JvdXRlcy9pbnN0YW5jZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9yb3V0ZXMvaW5zdGFuY2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9yb3V0ZXMvc3RlZWRvc19jc3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL3N0ZWVkb3NfY3NzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcm91dGVzL2luc3RhbmNlX2RyYWZ0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOndvcmtmbG93L3NlcnZlci9saWIvMV9mb3JtX2Zvcm11bGEuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9jYXRlZ29yaWVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Nmc19pbnN0YW5jZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19wb3NpdGlvbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfcG9zaXRpb25zX3RhYnVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd19yb2xlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9mbG93cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvZmxvd3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvZm9ybXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zvcm1zLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RhdGEuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvaW5zdGFuY2VfbGlzdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2luc3RhbmNlX2RyYWZ0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9pbnN0YW5jZV9kcmFmdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9kaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL3JlbGF0ZWRfaW5zdGFjZXMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfdXNlcl9zaWducy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy91c2VyX2luYm94X2luc3RhbmNlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvcHVibGljYXRpb25zL2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9mbG93LXRlbXBsYXRlL3dvcmtmbG93X3RlbXBsYXRlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL2Zsb3ctdGVtcGxhdGUvd29ya2Zsb3dfdGVtcGxhdGUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX3dvcmtmbG93L3NlcnZlci9zY2hlZHVsZS9hdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc2NoZWR1bGUvYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9zZXJ2ZXIvc2NoZWR1bGUvdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zY2hlZHVsZS90aW1lb3V0X2F1dG9fc3VibWl0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc193b3JrZmxvdy9yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfd29ya2Zsb3cvdGFidWxhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3RhYnVsYXIuY29mZmVlIl0sIm5hbWVzIjpbImNoZWNrTnBtVmVyc2lvbnMiLCJtb2R1bGUiLCJsaW5rIiwidiIsInJvb3QiLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiVVJJIiwicHVueWNvZGUiLCJJUHY2IiwiU2Vjb25kTGV2ZWxEb21haW5zIiwiU0xEIiwiX1VSSSIsInVybCIsImJhc2UiLCJfdXJsU3VwcGxpZWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJfYmFzZVN1cHBsaWVkIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwibG9jYXRpb24iLCJocmVmIiwiYWJzb2x1dGVUbyIsInZlcnNpb24iLCJwIiwicHJvdG90eXBlIiwiaGFzT3duIiwiT2JqZWN0IiwiaGFzT3duUHJvcGVydHkiLCJlc2NhcGVSZWdFeCIsInN0cmluZyIsInJlcGxhY2UiLCJnZXRUeXBlIiwidmFsdWUiLCJTdHJpbmciLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsImlzQXJyYXkiLCJvYmoiLCJmaWx0ZXJBcnJheVZhbHVlcyIsImRhdGEiLCJsb29rdXAiLCJpIiwiX21hdGNoIiwidGVzdCIsInNwbGljZSIsImFycmF5Q29udGFpbnMiLCJsaXN0IiwiX3R5cGUiLCJtYXRjaCIsImFycmF5c0VxdWFsIiwib25lIiwidHdvIiwic29ydCIsImwiLCJ0cmltU2xhc2hlcyIsInRleHQiLCJ0cmltX2V4cHJlc3Npb24iLCJfcGFydHMiLCJwcm90b2NvbCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJob3N0bmFtZSIsInVybiIsInBvcnQiLCJwYXRoIiwicXVlcnkiLCJmcmFnbWVudCIsImR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyIsImVzY2FwZVF1ZXJ5U3BhY2UiLCJwcm90b2NvbF9leHByZXNzaW9uIiwiaWRuX2V4cHJlc3Npb24iLCJwdW55Y29kZV9leHByZXNzaW9uIiwiaXA0X2V4cHJlc3Npb24iLCJpcDZfZXhwcmVzc2lvbiIsImZpbmRfdXJpX2V4cHJlc3Npb24iLCJmaW5kVXJpIiwic3RhcnQiLCJlbmQiLCJ0cmltIiwiZGVmYXVsdFBvcnRzIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwid3MiLCJ3c3MiLCJpbnZhbGlkX2hvc3RuYW1lX2NoYXJhY3RlcnMiLCJkb21BdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlIiwibm9kZSIsIm5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJ0eXBlIiwiZXNjYXBlRm9yRHVtYkZpcmVmb3gzNiIsImVzY2FwZSIsInN0cmljdEVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSUNvbXBvbmVudCIsImVuY29kZSIsImRlY29kZSIsImRlY29kZVVSSUNvbXBvbmVudCIsImlzbzg4NTkiLCJ1bmVzY2FwZSIsInVuaWNvZGUiLCJjaGFyYWN0ZXJzIiwicGF0aG5hbWUiLCJleHByZXNzaW9uIiwibWFwIiwicmVzZXJ2ZWQiLCJ1cm5wYXRoIiwiZW5jb2RlUXVlcnkiLCJlc2NhcGVkIiwiZGVjb2RlUXVlcnkiLCJlIiwiX3BhcnQiLCJnZW5lcmF0ZUFjY2Vzc29yIiwiX2dyb3VwIiwiYyIsImdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uIiwiX3NlcCIsIl9jb2RpbmdGdW5jTmFtZSIsIl9pbm5lckNvZGluZ0Z1bmNOYW1lIiwiYWN0dWFsQ29kaW5nRnVuYyIsInNlZ21lbnRzIiwic3BsaXQiLCJqb2luIiwiZGVjb2RlUGF0aCIsImRlY29kZVVyblBhdGgiLCJyZWNvZGVQYXRoIiwicmVjb2RlVXJuUGF0aCIsImVuY29kZVJlc2VydmVkIiwicGFyc2UiLCJwYXJ0cyIsInBvcyIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJwYXJzZUF1dGhvcml0eSIsInBhcnNlSG9zdCIsImJyYWNrZXRQb3MiLCJ0IiwiY2hhckF0IiwiZmlyc3RDb2xvbiIsImZpcnN0U2xhc2giLCJuZXh0Q29sb24iLCJwYXJzZVVzZXJpbmZvIiwibGFzdEluZGV4T2YiLCJzaGlmdCIsInBhcnNlUXVlcnkiLCJpdGVtcyIsInNwbGl0cyIsIm5hbWUiLCJwdXNoIiwiYnVpbGQiLCJidWlsZEF1dGhvcml0eSIsImJ1aWxkSG9zdCIsImJ1aWxkVXNlcmluZm8iLCJidWlsZFF1ZXJ5IiwidW5pcXVlIiwia2V5IiwiYnVpbGRRdWVyeVBhcmFtZXRlciIsImFkZFF1ZXJ5IiwiY29uY2F0IiwicmVtb3ZlUXVlcnkiLCJoYXNRdWVyeSIsIndpdGhpbkFycmF5IiwiX2Jvb2x5IiwiQm9vbGVhbiIsIm9wIiwiY29tbW9uUGF0aCIsIk1hdGgiLCJtaW4iLCJ3aXRoaW5TdHJpbmciLCJjYWxsYmFjayIsIm9wdGlvbnMiLCJfc3RhcnQiLCJfZW5kIiwiX3RyaW0iLCJfYXR0cmlidXRlT3BlbiIsImxhc3RJbmRleCIsImV4ZWMiLCJpbmRleCIsImlnbm9yZUh0bWwiLCJhdHRyaWJ1dGVPcGVuIiwibWF4Iiwic2VhcmNoIiwiaWdub3JlIiwicmVzdWx0IiwiZW5zdXJlVmFsaWRIb3N0bmFtZSIsInRvQVNDSUkiLCJub0NvbmZsaWN0IiwicmVtb3ZlQWxsIiwidW5jb25mbGljdGVkIiwiVVJJVGVtcGxhdGUiLCJkZWZlckJ1aWxkIiwiX2RlZmVycmVkX2J1aWxkIiwiX3N0cmluZyIsImNsb25lIiwidmFsdWVPZiIsImdlbmVyYXRlU2ltcGxlQWNjZXNzb3IiLCJnZW5lcmF0ZVByZWZpeEFjY2Vzc29yIiwiX2tleSIsImhhc2giLCJyZXMiLCJfb2JqZWN0IiwiYXR0cmlidXRlIiwic3JjIiwiaXMiLCJ3aGF0IiwiaXAiLCJpcDQiLCJpcDYiLCJzbGQiLCJpZG4iLCJyZWxhdGl2ZSIsImhhcyIsIl9wcm90b2NvbCIsIl9wb3J0IiwiX2hvc3RuYW1lIiwic2NoZW1lIiwieCIsIm9yaWdpbiIsImF1dGhvcml0eSIsImhvc3QiLCJ1c2VyaW5mbyIsInJlc291cmNlIiwic3ViZG9tYWluIiwiZG9tYWluIiwic3ViIiwiUmVnRXhwIiwidGxkIiwiZ2V0IiwiUmVmZXJlbmNlRXJyb3IiLCJkaXJlY3RvcnkiLCJmaWxlbmFtZSIsImRlY29kZVBhdGhTZWdtZW50IiwibXV0YXRlZERpcmVjdG9yeSIsIm5vcm1hbGl6ZVBhdGgiLCJzdWZmaXgiLCJzIiwic2VnbWVudCIsInNlcGFyYXRvciIsImFic29sdXRlIiwiRXJyb3IiLCJwb3AiLCJ1bnNoaWZ0Iiwic2VnbWVudENvZGVkIiwicSIsInNldFF1ZXJ5Iiwic2V0U2VhcmNoIiwiYWRkU2VhcmNoIiwicmVtb3ZlU2VhcmNoIiwiaGFzU2VhcmNoIiwibm9ybWFsaXplIiwibm9ybWFsaXplUHJvdG9jb2wiLCJub3JtYWxpemVRdWVyeSIsIm5vcm1hbGl6ZUZyYWdtZW50Iiwibm9ybWFsaXplSG9zdG5hbWUiLCJub3JtYWxpemVQb3J0IiwiYmVzdCIsIl9wYXRoIiwiX3dhc19yZWxhdGl2ZSIsIl9sZWFkaW5nUGFyZW50cyIsIl9wYXJlbnQiLCJfcG9zIiwibm9ybWFsaXplUGF0aG5hbWUiLCJub3JtYWxpemVTZWFyY2giLCJub3JtYWxpemVIYXNoIiwiZCIsInJlYWRhYmxlIiwidXJpIiwidG9Vbmljb2RlIiwicXAiLCJrdiIsInJlc29sdmVkIiwicHJvcGVydGllcyIsImJhc2VkaXIiLCJyZWxhdGl2ZVRvIiwicmVsYXRpdmVQYXJ0cyIsImJhc2VQYXJ0cyIsImNvbW1vbiIsInJlbGF0aXZlUGF0aCIsImJhc2VQYXRoIiwicGFyZW50cyIsImVxdWFscyIsIm9uZV9tYXAiLCJ0d29fbWFwIiwiY2hlY2tlZCIsIm9uZV9xdWVyeSIsInR3b19xdWVyeSIsIldvcmtmbG93IiwiSW1hZ2VTaWduIiwiVHJhY2VzSGFuZGxlciIsIlRyYWNlc1RlbXBsYXRlIiwiSW5zdGFuY2Vmb3JtVGVtcGxhdGUiLCJJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSIsIkluc3RhbmNlU2lnblRleHQiLCJSZWxhdGVkSW5zdGFuY2VzIiwiUmVsYXRlZFJlY29yZHMiLCJJbnN0YW5jZU1hY3JvIiwiY29udGV4dCIsIlRyYWNlc01hbmFnZXIiLCJpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyIsImZpZWxkX2Zvcm11bGEiLCJpbmNsdWRlc09waW5pb25GaWVsZCIsImZvcm0iLCJmb3JtX3ZlcnNpb24iLCJfZm9ybV92ZXJzaW9uIiwiZmllbGRfZm9ybXVsYXMiLCJmaWVsZHMiLCJBcnJheSIsIk1ldGVvciIsImlzU2VydmVyIiwidXVmbG93TWFuYWdlciIsImdldEZvcm1WZXJzaW9uIiwiZGIiLCJmb3JtcyIsImZpbmRPbmUiLCJfaWQiLCJmb3JtX3ZlcnNpb25zIiwiZm9yRWFjaCIsImYiLCJyZWYiLCJjb25zb2xlIiwibG9nIiwiZjEiLCJmb3JtdWxhIiwiXyIsInNvbWUiLCJoZWxwZXJzIiwiaW5zdGFuY2VfdGFza3MiLCJDb2xsZWN0aW9uIiwiX3NpbXBsZVNjaGVtYSIsIlNpbXBsZVNjaGVtYSIsImluc3RhbmNlIiwidHJhY2UiLCJpc19maW5pc2hlZCIsInVzZXIiLCJ1c2VyX25hbWUiLCJoYW5kbGVyIiwiaGFuZGxlcl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb24iLCJoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lIiwiaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUiLCJzdGFydF9kYXRlIiwiRGF0ZSIsImR1ZV9kYXRlIiwiaXNfcmVhZCIsImlzX2Vycm9yIiwidmFsdWVzIiwiZGVhZGxpbmUiLCJyZW1pbmRfZGF0ZSIsInJlbWluZGVkX2NvdW50IiwiTnVtYmVyIiwicmVhZF9kYXRlIiwiZGVzY3JpcHRpb24iLCJtb2RpZmllZCIsIm1vZGlmaWVkX2J5Iiwic2lnbl9zaG93IiwianVkZ2UiLCJuZXh0X3N0ZXBzIiwiZmluaXNoX2RhdGUiLCJjb3N0X3RpbWUiLCJzcGFjZSIsImluc3RhbmNlX25hbWUiLCJzdWJtaXR0ZXIiLCJzdWJtaXR0ZXJfbmFtZSIsImFwcGxpY2FudCIsImFwcGxpY2FudF9uYW1lIiwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lIiwic3VibWl0X2RhdGUiLCJmbG93IiwiZmxvd19uYW1lIiwic3RlcCIsInN0ZXBfbmFtZSIsImNhdGVnb3J5X25hbWUiLCJpbnN0YW5jZV9zdGF0ZSIsImRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSIsImZvcndhcmRfZnJvbV9pbnN0YW5jZSIsImtleXdvcmRzIiwiaXNfYXJjaGl2ZWQiLCJjYXRlZ29yeSIsImF1dGhfdG9rZW5zIiwiX2dldExvY2FsZSIsIl9nZXRSZXF1aXJlZEZpZWxkcyIsIl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsIl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyIsIl9nZXRUZW1wbGF0ZURhdGEiLCJfZ2V0Vmlld0h0bWwiLCJnZXRMaW5rVGV4dCIsIm1hcmtlZCIsInJlcXVpcmUiLCJJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUiLCJpbnN0YW5jZV9hdHRhY2htZW50IiwiYWZTZWxlY3RVc2VyUmVhZCIsImFmRm9ybUdyb3VwUmVhZCIsImFmRm9ybUdyb3VwIiwiY3JlYXRlIiwidGVtcGFsdGVOYW1lIiwic3RlZWRvc0RhdGEiLCJ0ZW1wbGF0ZSIsInRlbXBsYXRlQ29tcGlsZWQiLCJ0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uIiwiU3BhY2ViYXJzQ29tcGlsZXIiLCJjb21waWxlIiwiaXNCb2R5IiwiZXZhbCIsIlRlbXBsYXRlIiwiQmxhemUiLCJjcmVhdGVJbnN0YW5jZVNpZ25UZXh0IiwiaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkIiwiaW5zdGFuY2VTaWduVGV4dEh0bWwiLCJpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVNpZ25UZXh0IiwiY3JlYXRlSW1hZ2VTaWduIiwiaW1hZ2VTaWduQ29tcGlsZWQiLCJpbWFnZVNpZ25IdG1sIiwiaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24iLCJpbWFnZVNpZ24iLCJjcmVhdGVUcmFjZXNIYW5sZGVyIiwidHJhY2VzSGFubGRlckNvbXBpbGVkIiwidHJhY2VzSGFubGRlckh0bWwiLCJ0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZV90cmFjZXNfaGFuZGxlciIsImluaXQiLCJpdGVtIiwibGFiZWwiLCJkZXRhaWxfdXJsIiwiU3RlZWRvcyIsImFic29sdXRlVXJsIiwiZ2V0VmFsdWUiLCJmaWVsZCIsImxvY2FsZSIsInV0Y09mZnNldCIsImRhdGUiLCJmaWVsZE9wdGlvbnMiLCJob3VycyIsIm1vbnRoIiwibmFtZUZpZWxkIiwicmVjb3JkcyIsInNlY29uZHMiLCJzZWxlY3RlZE9wdGlvbiIsInNlbGVjdGVkT3B0aW9ucyIsInNwbGl0ZWRWYWx1ZXMiLCJ0MCIsInQxIiwidWlTY2hlbWEiLCJ5ZWFyIiwibiIsIml0ZW1TcGxpdHMiLCJlbmNvZGVVUkkiLCJlcnJvciIsImlzX211bHRpc2VsZWN0IiwiZ2V0UHJvcGVydHkiLCJmdWxsbmFtZSIsIlRBUGkxOG4iLCJfXyIsImZvcm1hdERhdGUiLCJmb3JtYXRUaW1lIiwiaXNfdGV4dGFyZWEiLCJmaW5kIiwiZmlsdGVyIiwiaXNfcGVyY2VudCIsIm51bWJlclRvUGVyY2VudFN0cmluZyIsImRpZ2l0cyIsIm51bWJlclRvU3RyaW5nIiwiaXNDbGllbnQiLCJhdXRoUmVxdWVzdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhc3luYyIsIm9iamVjdEZpbmQiLCJmaWx0ZXJzIiwiZmlsZU5hbWUiLCJmaWxlUHJldmlld0h0bWwiLCJmaWxlVXJsIiwib3JpZ2luYWwiLCJDcmVhdG9yIiwiZ2V0T2JqZWN0IiwicmVmZXJlbmNlX3RvIiwiTkFNRV9GSUVMRF9LRVkiLCJyZWZlcmVuY2VfdG9fZmllbGQiLCJnZXRPYmplY3ROYW1lRmllbGRLZXkiLCJnZXRMYWJlbCIsImNvZGUiLCJmaW5kUHJvcGVydHlCeVBLIiwiZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbiIsImZvcm1fZmllbGRzIiwiY3VycmVudCIsIndoZXJlIiwiaGlzdG9yeXMiLCJnZXRGbG93VmVyc2lvbiIsImZsb3dfdmVyc2lvbiIsImZsb3dzIiwidmlld0h0bWwiLCJBc3NldHMiLCJnZXRUZXh0IiwicmVmMSIsInRvTG9jYWxlTG93ZXJDYXNlIiwicmV2IiwiaXNfcmVxdWlyZWQiLCJzdGVwcyIsImVkaXRhYmxlQ29kZSIsInN0YXJ0U3RlcCIsImtleXMiLCJwZXJtaXNzaW9ucyIsInJlcXVpcmVkRmllbGRzIiwiaW50ZXJzZWN0aW9uIiwiV29ya2Zsb3dNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdCIsImdldEF1dG9mb3JtU2NoZW1hVmFsdWVzIiwiaW5zbmFtZSIsImluc19zdGF0ZSIsInN0YXRlIiwiaW5zX2ZpbmFsX2RlY2lzaW9uIiwiaW5zX2NvZGUiLCJpbnNfaXNfYXJjaGl2ZWQiLCJpbnNfaXNfZGVsZXRlZCIsImFwcGxpY2FudENvbnRleHQiLCJzZXNzaW9uVXNlcklkIiwiZWRpdGFibGUiLCJzdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyIsInBhc3NpbmciLCJtb21lbnQiLCJmb3JtYXQiLCJnZXRJbnN0YW5jZVZpZXciLCJib2R5IiwiaW5zdGFuY2VDb21waWxlZCIsImluc3RhbmNlUmVuZGVyRnVuY3Rpb24iLCJpbnN0YW5jZVRlbXBsYXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZ2V0VGVtcGxhdGUiLCJ0ZW1wbGF0ZU5hbWUiLCJpbnN0YW5jZV9yZWFkb25seV92aWV3IiwidG9IVE1MV2l0aERhdGEiLCJnZXRUcmFjZXNWaWV3IiwidHJhY2VDb21waWxlZCIsInRyYWNlUmVuZGVyRnVuY3Rpb24iLCJ0cmFjZXNIdG1sIiwiaW5zdGFuY2Vfc3R5bGUiLCJ0cmFjZV9yZWFkb25seV92aWV3IiwidHJhY2VzIiwiZ2V0QXR0YWNobWVudFZpZXciLCJhdHRhY2htZW50Q29tcGlsZWQiLCJhdHRhY2htZW50SHRtbCIsImF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbiIsImF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXciLCJnZXRSZWxhdGVkSW5zdGFuY2VzVmlldyIsInJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCIsInJlbGF0ZWRJbnN0YW5jZXNIdG1sIiwicmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uIiwicmVsYXRlZF9pbnN0YW5jZXNfdmlldyIsImdldFJlbGF0ZWRSZWNvcmRzVmlldyIsInJlbGF0ZWRSZWNvcmRzQ29tcGlsZWQiLCJyZWxhdGVkUmVjb3Jkc0h0bWwiLCJyZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uIiwicmVsYXRlZF9yZWNvcmRzX3ZpZXciLCJnZXRPbkxvYWRTY3JpcHQiLCJmb3JtX3NjcmlwdCIsImdldEluc3RhbmNlSHRtbCIsImFsbENzc0xpbmsiLCJhdHRhY2htZW50IiwiY3JlYXRvclNlcnZpY2UiLCJjc3NIcmVmIiwiZm9ybURlc2NyaXB0aW9uIiwiZm9ybURlc2NyaXB0aW9uSHRtbCIsImh0bWwiLCJpbnNfcmVjb3JkX2lkcyIsImluc3RhbmNlQm94U3R5bGUiLCJqcUhyZWYiLCJvbkxvYWRTY3JpcHQiLCJvcGVuRmlsZVNjcmlwdCIsInJlbGF0ZWRfaW5zdGFuY2VzIiwicmVsYXRlZF9yZWNvcmRzIiwic2hvd1RyYWNlc0J0biIsInNob3dUcmFjZXNTY3JpcHQiLCJ0cmFjZUNoZWNrIiwid2lkdGgiLCJzZXR0aW5ncyIsIndlYnNlcnZpY2VzIiwiY3JlYXRvciIsInJlY29yZF9pZHMiLCJpc01vYmlsZSIsInNob3dUcmFjZSIsImZpbmFsX2RlY2lzaW9uIiwic2hvd0F0dGFjaG1lbnRzIiwiaXNFbXB0eSIsInRhZ2dlciIsInN0eWxlcyIsInBsdWdpbnMiLCJhZGRfc3R5bGVzIiwiZm9ybUlkIiwiaW5zdGFuY2VfdGl0bGUiLCJwYWdlVGl0bGUiLCJwYWdlVGl0bGVUckNsYXNzIiwidmFsIiwiQ29yZUZvcm0iLCJwYWdlVGl0bGVGaWVsZE5hbWUiLCJoYW5kbGVUYWJsZVRlbXBsYXRlIiwiX2V4cG9ydCIsInRhYmxlX2ZpZWxkcyIsInRhYmxlX2ZpZWxkIiwiZmllbGRfcGVybWlzc2lvbiIsInB1cmVDb2RlIiwicmVxdWlyZWQiLCJ0aXRsZV9wZXJtaXNzaW9uIiwicmVtb3ZlU3BlY2lhbENoYXJhY3RlciIsImlzT3BpbmlvbkZpZWxkIiwidHJfc3RhcnQiLCJ0ZF9jb2xzcGFuIiwidHJfZW5kIiwiaW5jbHVkZXMiLCJwZXJtaXNzaW9uIiwiX3RlbXBsYXRlIiwidGFibGUiLCJfdGVtcGxhdGVIZWxwcyIsInN0ZWVkb3NfaW5zdGFuY2UiLCJnZXRJbnN0YW5jZSIsImF0dHMiLCJpZCIsInN0eWxlIiwiZGlzYWJsZWQiLCJpbnN0YW5jZUlkIiwiZm9ybV90eXBlcyIsIkFwcHJvdmVNYW5hZ2VyIiwiaXNSZWFkT25seSIsInN0ZWVkb3NfZm9ybSIsImlubmVyc3ViZm9ybUNvbnRleHQiLCJkb2NfdmFsdWVzIiwiU2Vzc2lvbiIsImEiLCJiIiwiZ2V0QXV0b2Zvcm1TY2hlbWEiLCJpbnN0YW5jZV9ib3hfc3R5bGUiLCJib3giLCJpbnMiLCJwcmludF90ZW1wbGF0ZSIsImluc3RhbmNlX3RlbXBsYXRlIiwiU3RlZWRvc1RhYmxlIiwiY2hlY2tJdGVtIiwiaXRlbV9pbmRleCIsImZpZWxkT2JqIiwiZ2V0RmllbGQiLCJmaWVsZFZhbCIsImdldEl0ZW1Nb2RhbFZhbHVlIiwic2ZfbmFtZSIsInNmaWVsZHMiLCJzZiIsIkluc3RhbmNlTWFuYWdlciIsImNoZWNrRm9ybUZpZWxkVmFsdWUiLCIkIiwic2V0VGFibGVJdGVtVmFsdWUiLCJpdGVtX3ZhbHVlIiwidGFibGVWYWx1ZSIsImdldFRhYmxlVmFsdWUiLCJnZXRUYWJsZUl0ZW1WYWx1ZSIsInJlbW92ZVRhYmxlSXRlbSIsInJlbW92ZWQiLCJzZXRUYWJsZVZhbHVlIiwiZ2V0VmFsaWRWYWx1ZSIsInZhbGlkVmFsdWUiLCJoYW5kbGVEYXRhIiwiaW5zdGFuY2VGaWVsZHMiLCJnZXRJbnN0YW5jZUZpZWxkcyIsImdldE1vZGFsRGF0YSIsIkZvcm1fZm9ybXVsYSIsImdldEZvcm11bGFGaWVsZFZhcmlhYmxlIiwiQXV0b0Zvcm0iLCJnZXRGb3JtVmFsdWVzIiwiaW5zZXJ0RG9jIiwiYWRkSXRlbSIsIl9pdGVtX3ZhbHVlIiwiZ2V0S2V5cyIsImFwcGVuZCIsImdldFRyIiwidXBkYXRlSXRlbSIsInRkcyIsImdldFJlbW92ZVRkIiwic2ZpZWxkIiwiZ2V0VGQiLCJlbXB0eSIsInJ1bkZvcm11bGEiLCJyZW1vdmVJdGVtIiwiaGlkZSIsInNob3dNb2RhbCIsIm1ldGhvZCIsIm1vZGFsRGF0YSIsInNldFRpbWVvdXQiLCJNb2RhbCIsInNob3ciLCJnZXRDdXJyZW50RGF0YUZvckZvcm0iLCJzcyIsImdldEZvcm1TY2hlbWEiLCJzY2hlbWEiLCJvYmplY3RLZXlzIiwiX21ha2VHZW5lcmljIiwiZ2V0VGhlYWQiLCJpc09iamVjdCIsInRoZWFkIiwidHJzIiwic2ZfbGVuZ3RoIiwid2lkZV9maWVsZHMiLCJmaWx0ZXJQcm9wZXJ0eSIsImlzX3dpZGUiLCJnZXRUYm9keSIsInNmaWVsZHNFZGl0YWJsZSIsInRib2R5IiwidHIiLCJ0ZCIsInRkX3ZhbHVlIiwiZ2V0VERWYWx1ZSIsInZpZXciLCJDRkRhdGFNYW5hZ2VyIiwiZ2V0Rm9ybXVsYVNwYWNlVXNlcnMiLCJ1IiwiZ2V0Rm9ybXVsYU9yZ2FuaXphdGlvbnMiLCJvIiwiZ2V0Rm9ybXVsYU9yZ2FuaXphdGlvbiIsInBsdWNrIiwiYWRkSW5wdXRUeXBlIiwidmFsdWVPdXQiLCJ2YWx1ZUNvbnZlcnRlcnMiLCJzdHJpbmdUb1N0cmluZ0FycmF5Iiwic3RyaW5nVG9OdW1iZXIiLCJzdHJpbmdUb051bWJlckFycmF5Iiwic3RyaW5nVG9Cb29sZWFuIiwic3RyaW5nVG9Cb29sZWFuQXJyYXkiLCJzdHJpbmdUb0RhdGUiLCJzdHJpbmdUb0RhdGVBcnJheSIsImNvbnRleHRBZGp1c3QiLCJtYXhsZW5ndGgiLCJhZlRhYmxlIiwiZXZlbnRzIiwiZXZlbnQiLCJuZXdfaXRlbV9pbmRleCIsImN1cnJlbnRUYXJnZXQiLCJkYXRhc2V0Iiwic2V0IiwicmVuZGVyZWQiLCJzdHIiLCJhZGRJdGVtVHIiLCJnZXRDdXJyZW50U3RlcCIsInN0ZXBfdHlwZSIsImNjSGFzRWRpdFBlcm1pc3Npb24iLCJhdXRvcnVuIiwiY3VycmVudERhdGEiLCJzcGFjZVVzZXJTaWduIiwidXNlcklkIiwic3BhY2VfdXNlcl9zaWducyIsImltYWdlVVJMIiwic2lnbiIsInNob3dTaWduSW1hZ2UiLCJ0cmFjZVNob3dTaWduSW1hZ2UiLCJvYmplY3RVcmwiLCJvYmplY3RfbmFtZSIsInJlY29yZF9pZCIsImFwcF9pZCIsImdldE9iamVjdFVybCIsInVuZW1wdHkiLCJ1bmVxdWFscyIsImluY2x1ZGUiLCJyZWYyIiwicmVmMyIsImdldEluc3RhbmNlRmxvd1ZlcnNpb24iLCJhcHByb3ZlcyIsInJlZjQiLCJhcHByb3ZlIiwianVkZ2VfbmFtZSIsIm9waW5pb25fZmllbGRzX2NvZGUiLCJzaWduX2ZpZWxkX2NvZGUiLCJhZnRlcl9maWVsZCIsImJlZm9yZV9maWVsZCIsInByZV9maWVsZHMiLCJwcmVfd2lkZV9maWVsZHMiLCJzb3J0X2FwcHJvdmUiLCJvcmRlciIsInAxIiwicDIiLCJfcDEiLCJfcDIiLCJnZXRUaW1lIiwiX3QiLCJpc1RleHRhcmVhIiwiZ2V0Q2ZDbGFzcyIsImdldFRhYmxlVGhlYWQiLCJnZXRUYWJsZUJvZHkiLCJzaG93TGFiZWwiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRPcGluaW9uRmllbGRTdGVwc05hbWUiLCJ0b3Bfa2V5d29yZHMiLCJmb28xIiwib3BpbmlvbkZpZWxkcyIsImZvbyIsImpzb25fZm9ybXVsYSIsInMxIiwiZXJyb3IxIiwieWlqaWFubGFuIiwic3RlcE5hbWUiLCJpbWFnZV9zaWduIiwib25seV9jY19vcGluaW9uIiwib25seV9jYyIsImRlZmF1bHRfZGVzY3JpcHRpb24iLCJvbmx5X2hhbmRsZXIiLCJzaG93Q0NPcGluaW9uIiwibWFya0Rvd25Ub0h0bWwiLCJtYXJrRG93blN0cmluZyIsIk5wbSIsIlNwYWNlYmFycyIsIlNhZmVTdHJpbmciLCJmX2xhYmVsIiwidGhhdCIsImlzU2VjdGlvbiIsInJlZ2lzdGVySGVscGVyIiwiaW5zX2F0dGFjaF9kb3dubG9hZF91cmwiLCJnZXRQZXJtaXNzaW9ucyIsImluc3RhbmNlZm9ybUNoYW5nZUV2ZW50IiwicHJldmVudERlZmF1bHQiLCJvcGVuV2luZG93IiwidGFyZ2V0Iiwib25DcmVhdGVkIiwiY29tcGlsZWQiLCJpbnN0YW5jZUN1c3RvbVRlbXBsYXRlIiwiaW5zdGFuY2VWaWV3IiwicmVuZGVyRnVuY3Rpb24iLCJWaWV3IiwiaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlIiwib25SZW5kZXJlZCIsImN1cnJlbnRBcHByb3ZlIiwiY3VycmVudFN0ZXAiLCJmb3JtdWxhX2ZpZWxkcyIsImluc3RhbmNlTnVtYmVyRmllbGRzIiwic2V0SW5zdGFuY2VGb3JtQXBwbGljYW50IiwibmV4dFN0ZXBzIiwibmV4dFN0ZXBVc2VycyIsIkluc3RhbmNlRXZlbnQiLCJpbml0RXZlbnRzIiwiZ2V0Q3VycmVudEFwcHJvdmUiLCJlYWNoIiwiZWxlbWVudCIsInNjaGVtYUtleSIsInRvYXN0ciIsInJlYXNvbiIsImdldEZpZWxkVmFsdWUiLCJJbnN0YW5jZU51bWJlclJ1bGVzIiwiaW5zdGFuY2VOdW1iZXJCdWlsZGVyIiwidHJpZ2dlciIsInJ1biIsInNob3dNYWluVGl0bGUiLCJ3b3JrZmxvd01haW5BdHRhY2hUaXRsZSIsImVuYWJsZWRfYWRkX21haW5fYXR0YWNobWVudCIsImN1cnJlbnRfc3RlcCIsImN1cnJlbnRUcmFjZSIsImdldEN1cnJlbnRUcmFjZSIsIm1haW5fYXR0YWNoX2NvdW50IiwiY2ZzIiwiaW5zdGFuY2VzIiwiY291bnQiLCJkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50Iiwic3RhcnRfc3RlcCIsImdldFN0YXJ0U3RlcCIsImNhbl9lZGl0X21haW5fYXR0YWNoIiwiZW5hYmxlZF9lZGl0X25vcm1hbF9hdHRhY2htZW50IiwiZ2V0RmxvdyIsInVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZCIsImlzQ0MiLCJnZXRDQ1N0ZXAiLCJjYW5fZWRpdF9ub3JtYWxfYXR0YWNoIiwibWFpbl9hdHRhY2htZW50IiwibWFpbl9hdHRhY2giLCJub3JtYWxfYXR0YWNobWVudHMiLCJzZWxlY3RvciIsIiRuZSIsImRmaXMiLCJkaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzIiwiJGluIiwiZGlzdHJpYnV0ZV9tYWluIiwiZmlyc3RWZXJzaW9uTWFpbiIsIm1ldGFkYXRhIiwicGFyZW50IiwiYXR0YWNobWVudFVwbG9hZGVkQXQiLCJ1cGxvYWRlZEF0IiwiZmlyc3RWZXJzaW9uIiwic29ydEJ5IiwiaW5zdGFuY2VJZHMiLCJhdHRhY2htZW50c19jb3VudCIsImZsb3dfZmlsZXMiLCJmaWxlcyIsImlzRHJhZnRBbmRGbG93ZmlsZXNFeGlzdCIsImNvbXBhY3QiLCJhdHRhY2htZW50cyIsIiRvciIsImZldGNoIiwibXlBcHByb3ZlIiwibXlUcmFjZSIsImlzSW5ib3giLCJkZWZhdWx0RGVzY3JpcHRpb24iLCJhcHByb3ZlX3NvcnQiLCJhcHByb3Zlc0dyb3VwIiwiYXBwcm92ZXNfc29ydGVkIiwiY29tcGxldGVkX2RhdGUiLCJoYXNOZXh0IiwiaGF2ZURlc2NyaXB0aW9uQXBwcm92ZSIsImlzX2NvbXBsZXRlZCIsImxhc3QiLCJ0b3BfYXBwcm92ZXMiLCJ1bmlvbiIsInRvcF9hcHByb3ZlIiwiZ3JvdXBCeSIsImhhbmRsZXJBcHByb3ZlcyIsImRlc2NyaXB0aW9uQXBwcm92ZXMiLCJ3b3JrZmxvdyIsInNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbiIsIl9kaXNwbGF5IiwiaXNNeUFwcHJvdmUiLCJteUFwcHJvdmVEZXNjcmlwdGlvbiIsImFwcHJvdmVJZCIsIm5vdyIsImlzT3Bpbmlvbk9mRmllbGQiLCJpbWFnZVNpZ25EYXRhIiwiZ2V0TGFzdFNpZ25BcHByb3ZlIiwiZ2V0SGFuZGxlclNpZ25TaG93QXBwcm92ZXMiLCJsYXN0TXlBcHByb3ZlRGVzY3JpcHRpb24iLCJzaG93QXBwcm92ZSIsImp1ZGdlX2Rlc2NyaXB0aW9uIiwiaXNfYXBwcm92ZWQiLCJpc19yZWplY3RlZCIsImlzX3JlYWRlZCIsImFkZENsYXNzIiwiZGF0ZUZvcm1hdCIsImdldEZ1bGxZZWFyIiwiZ2V0U3RlcE5hbWUiLCJzdGVwSWQiLCJnZXRJbnN0YW5jZVN0ZXAiLCJzaG93RGVsZXRlQnV0dG9uIiwiYXBwcm92ZWQiLCJmcm9tX3VzZXIiLCJpc1Nob3dNb2RpZmljYXRpb25CdXR0b24iLCJhcHByb3ZlX2FkbWlucyIsImlzU2hvdyIsImNvbnRhaW5zIiwiaXNFZGl0aW5nIiwiaXNfZWRpdGluZyIsImlzU2hvd0Rlc2NyaXB0aW9uIiwiZ2V0QXBwcm92ZVN0YXR1c0ljb24iLCJhcHByb3ZlSnVkZ2UiLCJhdXRvU3VibWl0dGVkIiwiYXBwcm92ZVN0YXR1c0ljb24iLCJnZXRBcHByb3ZlU3RhdHVzVGV4dCIsImFwcHJvdmVTdGF0dXNUZXh0IiwiZ2V0QXBwcm92ZUp1ZGdlQ2xhc3MiLCJpc0ZvcndhcmQiLCJzaG93Rm9yd2FyZERlbGV0ZUJ1dHRvbiIsImZvcndhcmRfaW5zdGFuY2UiLCJpc0Rpc3RyaWJ1dGUiLCJzaG93RGlzdHJpYnV0ZURlbGV0ZUJ1dHRvbiIsImhhc0Zsb3dBZG1pblBlcm1pc3Npb24iLCJmaW5pc2hEYXRlU2NoZW1hIiwiaXNBbmRyb2lkT3JJT1MiLCJhdXRvZm9ybSIsIm9wdGlvbmFsIiwicmVhZG9ubHkiLCJkYXRlVGltZVBpY2tlck9wdGlvbnMiLCJpZ25vcmVSZWFkb25seSIsIndpZGdldFBvc2l0aW9uaW5nIiwiaG9yaXpvbnRhbCIsImZpbmlzaERhdGVWYWx1ZXMiLCJzaG93VHJhY2VzVmlldyIsInNob3dfbW9kYWxfdHJhY2VzX2xpc3QiLCJzcGFjZV9zZXR0aW5ncyIsImdldEluc3RhbmNlU3RhdGVUZXh0IiwiaW5zdGFuY2VfaWQiLCJnZXRJbnN0YW5jZVN0YXRlQ29sb3IiLCJjbGEiLCJmaXJzdFRyYWNlIiwibGFzdF9kaXN0cmlidXRlX2Zyb20iLCJkaXNfaW5mbyIsIiRleGlzdHMiLCJjcmVhdGVkIiwiY3JlYXRlZF9ieSIsIlVVZmxvd19hcGkiLCJnZXROYW1lRm9yVXNlciIsInVzZXJzIiwiZnJvbV91c2VyX25hbWUiLCJpc0NDT3JEaXN0cmlidXRlT3JGb3J3YXJkVGVybWluYXRlZCIsImp1ZGdlVGVybWluYXRlZCIsImluc3RhbmNlRXhpc3RzIiwiYWdlbnREZXNjcmlwdGlvbiIsInVzZXJOYW1lIiwidHJhY2VOYW1lIiwidHJhY2VJZCIsImhhbmRsZXJEb2MiLCJoYW5kbGVySWQiLCJ1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIiwiZ2V0Q29udGFjdEluZm9Gb3JVc2VyIiwic3RvcFByb3BhZ2F0aW9uIiwiY2FsbGluZyIsImVyciIsInJlbW92ZUNsYXNzIiwic3VjY2VzcyIsImFsbG93TXVsdGlwbGUiLCJjbG9zZXN0IiwidGFyZ2V0X3VzZXJfaWQiLCJvcGVuU2FmZU9iamVjdFVybCIsImZvcndhcmRfc3BhY2UiLCJmb3J3YXJkc3BhY2UiLCJmb3J3YXJkaW5zdGFuY2UiLCJUcmFja2VyIiwiYWZ0ZXJGbHVzaCIsIm9uIiwic2Nyb2xsVG9wIiwiZmluaXNoX2lucHV0Iiwib3Bpbmlvbl9pbnB1dCIsInNob3dSZWxhdGVkSW5zdGFjZXMiLCJyZWxhdGVkX2luc3RhY2VzIiwicmVsYXRlZF9pbnN0YWNlX3VybCIsImlzQ29yZG92YSIsInNob3dfZGVsZXRlIiwic2hvd1JlbGF0ZWRSZWNvcmRzIiwicmVsYXRlZFJlY29yZFVybCIsIm9iamNldE5hbWUiLCJpZHMiLCJwcm9jZXNzIiwiZW52IiwiQ1JFQVRPUl9OT0RFX0VOViIsIkpzb25Sb3V0ZXMiLCJhZGQiLCJyZXEiLCJuZXh0IiwiaGFzaERhdGEiLCJhY3Rpb24iLCJ0b191c2VycyIsInNlbmRSZXN1bHQiLCJzdGFjayIsImVycm9ycyIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJ3b3JrZmxvd01ldGhvZHMiLCJtZXRob2RzIiwic2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZSIsImluc19pZCIsInN0ZXBfYXBwcm92ZSIsInN0ZXBzQXBwcm92ZXNPcHRpb25zIiwiYXBwbHkiLCJzZXRfaW5zdGFuY2Vfc2tpcF9zdGVwcyIsImdldF9pbnN0YW5jZV9kYXRhIiwiZm9ybUNhY2hlZCIsImZsb3dDYWNoZWQiLCJkcmFmdF9zYXZlX2luc3RhbmNlIiwiaW5ib3hfc2F2ZV9pbnN0YW5jZSIsImNjX2RvIiwiY2NfdXNlcl9pZHMiLCJjY19yZWFkIiwiY2Nfc3VibWl0IiwiY2NfcmVtb3ZlIiwiYmF0Y2hfY2FuY2VsX2NjIiwiYXBwcm92ZV9pZHMiLCJjY19zYXZlIiwic3BhY2VfaWQiLCJmbG93X2lkIiwiaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50IiwiaXNGb3J3YXJkQXR0YWNobWVudHMiLCJzZWxlY3RlZFVzZXJzIiwiYWN0aW9uX3R5cGUiLCJyZWxhdGVkIiwiZnJvbV9hcHByb3ZlX2lkIiwiZm9yd2FyZF9yZW1vdmUiLCJ0cmFjZV9pZCIsImFwcHJvdmVfaWQiLCJjYW5jZWxEaXN0cmlidXRlIiwiY2ZzX2luc3RhbmNlc19yZW1vdmUiLCJmaWxlX2lkIiwiY2ZzX2luc3RhbmNlc19zZXRfY3VycmVudCIsImNmc19pbnN0YW5jZXNfbG9jayIsInVzZXJfaWQiLCJjZnNfaW5zdGFuY2VzX3VubG9jayIsImRvd25sb2FkX3NwYWNlX2luc3RhbmNlX2F0dGFjaG1lbnRzX3RvX2Rpc2siLCJzcGFjZUlkIiwiY2ZzUmVjb3JkSWRzIiwic2V0X2FwcHJvdmVfaGF2ZV9yZWFkIiwiY2hhbmdlX2FwcHJvdmVfaW5mbyIsInVwZGF0ZV9hcHByb3ZlX3NpZ24iLCJzaWduX3R5cGUiLCJsYXN0U2lnbkFwcHJvdmUiLCJ1cGRhdGVfc2lnbl9zaG93Iiwib2JqcyIsIm15QXBwcm92ZV9pZCIsImluc3RhbmNlX3JldHVybiIsImluc3RhbmNlX3JlbWluZCIsInJlbWluZF91c2VycyIsInJlbWluZF9jb3VudCIsInJlbWluZF9kZWFkbGluZSIsImFjdGlvbl90eXBlcyIsIm5leHRfc3RlcF91c2Vyc19ub3RfZm91bmQiLCJkZWFsX3R5cGUiLCJwYXJhbXMiLCJfZXZhbCIsImNoZWNrX21haW5fYXR0YWNoIiwicmVtb3ZlX3JlbGF0ZWQiLCJyZV9pbnNfaWQiLCJ1cGRhdGVfaW5zdGFuY2VfcmVsYXRlZCIsInVwZGF0ZUZsb3dQb3NpdGlvbiIsInVwZGF0ZUZsb3dSb2xlIiwic3RhcnRfZmxvdyIsImZsb3dJZCIsImdldF9pbnN0YW5jZV90cmFjZXMiLCJjYXRlZ29yeUlkIiwiZmxvd0lkcyIsImdldF9iYXRjaF9pbnN0YW5jZXMiLCJnZXRfYmF0Y2hfaW5zdGFuY2VzX2NvdW50IiwiZ2V0X215X2FwcHJvdmVzIiwiY2hhbmdlX2Zsb3dfc3RhdGUiLCJoaWRlX2luc3RhbmNlIiwiaW5zSWQiLCJpc19oaWRkZW4iLCJnZXRJbnN0YW5jZVZhbHVlcyIsIkNvb2tpZXMiLCJnZXRJbnN0YW5jZVJlYWRPbmx5IiwiX2hhc1Blcm1pc3Npb24iLCJfbG9jYWxlIiwiX3BhcmVudF9pbnN0YW5jZXMiLCJkYXRhQnVmIiwiaGlkZV90cmFjZXMiLCJzcGFjZVVzZXJDb3VudCIsImdldEFQSUxvZ2luVXNlciIsImFjY2Vzc190b2tlbiIsImdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbiIsInNwYWNlcyIsInNwYWNlX3VzZXJzIiwiaGFzSW5zdGFuY2VQZXJtaXNzaW9ucyIsIl9wYXJlbnRfaWQiLCJfcGFyZW50X2lucyIsImNoYXJzZXQiLCJCdWZmZXIiLCJzZXRIZWFkZXIiLCJzdGF0dXNDb2RlIiwicmV0X3N5bmNfdG9rZW4iLCJzcGFjZVVzZXIiLCJzcGFjZVVzZXJPcmdhbml6YXRpb25zIiwic3luY190b2tlbiIsIkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2siLCJoZWFkZXJzIiwiaXNTcGFjZUFkbWluIiwib3JnYW5pemF0aW9ucyIsImNhbk1vbml0b3IiLCJjYW5BZG1pbiIsIiRndCIsIiRuaW4iLCJpbmJveF91ZXJzIiwiY2NfdXNlcnMiLCJvdXRib3hfdXNlcnMiLCJza2lwIiwibGltaXQiLCJjb3BpZXMiLCJhbGxDc3MiLCJXZWJBcHAiLCJnZXRSZWZyZXNoYWJsZUFzc2V0cyIsImNzcyIsInJvb3RVcmwiLCJfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fIiwiUk9PVF9VUkxfUEFUSF9QUkVGSVgiLCJST09UX1VSTCIsImVuZHNXaXRoIiwiaCIsImciLCJtIiwiayIsImdldEVhY2giLCJ1bmlxIiwibWl4aW4iLCJkZXN0IiwiaGFuZGVyVXNlck9iamVjdCIsIm9yZ2FuaXphdGlvbiIsImhyIiwic29ydF9ubyIsIm1vYmlsZSIsIndvcmtfcGhvbmUiLCJwb3NpdGlvbiIsInVzZXJSb2xlcyIsInJvbGVzIiwiaGFuZGVyT3JnT2JqZWN0Iiwib3JnIiwiaW5pdF9mb3JtdWxhX3ZhbHVlcyIsImF1dG9Gb3JtRG9jIiwiYXBwcm92ZXIiLCJfX3ZhbHVlcyIsInRhYmxlRmllbGRzIiwidGFibGVWYWx1ZXMiLCJmb3JtdWxhVGFibGVWYWx1ZXMiLCJfX3RhYmxlVmFsdWVzIiwidGFibGVmaWVsZCIsImdldEZvcm11bGFVc2VyT2JqZWN0cyIsImdldEZvcm11bGFPcmdPYmplY3RzIiwiZ2V0Rm9ybXVsYVVzZXJPYmplY3QiLCJwdWJsaXNoIiwiY2hlY2siLCJyZWFkeSIsImNhdGVnb3JpZXMiLCJhcHAiLCJmbG93X3Bvc2l0aW9ucyIsInJvbGUiLCJwdWJsaXNoQ29tcG9zaXRlIiwidGFibGVOYW1lIiwiTWF0Y2giLCJPcHRpb25hbCIsInVuYmxvY2siLCJjaGlsZHJlbiIsImZsb3dfcm9sZXMiLCJjcmVhdGVUZW1wbGF0ZUZvcm1BbmRGbG93IiwicGVybXMiLCJjb21wYW55X2lkIiwiZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VycyIsImRpc3RyaWJ1dGVfdG9fc2VsZiIsImVuYWJsZV9hbWlzZm9ybSIsInZlcnNpb25JZCIsImhhbmRsZSIsInNlbGYiLCJsYXRlc3QiLCJvYnNlcnZlQ2hhbmdlcyIsImNoYW5nZWQiLCJhZGRlZCIsIm9uU3RvcCIsInN0b3AiLCJmbG93X2lkcyIsImRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbiIsImFsbG93X3NlbGVjdF9zdGVwIiwiYW1pc19zY2hlbWEiLCJnZXRNaW5pSW5zdGFuY2UiLCJnZXRNeWFwcHJvdmVNb2RpZmllZCIsImluc3RhbmNlX2ZpZWxkc18wIiwibWluaUFwcHJvdmVGaWVsZHMiLCJuZWVkQ2hhbmdlIiwidHJpZ2dlckNoYW5nZUZpZWxkcyIsInRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXMiLCJteUFwcHJvdmVNb2RpZmllZHMiLCJfaW5zdGFuY2VJZCIsIl90cmFjZSIsImNoYW5nZUZpZWxkcyIsIl9jaGFuZ2UiLCJfcmV2IiwiX215X2FwcHJvdmVfbW9kaWZpZWRzIiwiaXNFcXVhbCIsImdldEluc3RhbmNlVHJhY2VzIiwiX2luc0lkIiwiaW5ib3hfdXNlcnMiLCJhc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUiLCJsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlIiwiaW5zdGFuY2VpZCIsImRhdGFNYXAiLCJvcGVyYXRpb24iLCJyYXdDb2xsZWN0aW9uIiwiYWdncmVnYXRlIiwidG9BcnJheSIsImRvYyIsImlzRnVuY3Rpb24iLCJ3cmFwQXN5bmMiLCJnZXRNeUFwcHJvdmUiLCJnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUiLCJnZXRTdGVwQ3VycmVudE5hbWUiLCJub3RGaW5pc2hlZFRyYWNlcyIsImFnZW50Iiwic3RlcEN1cnJlbnROYW1lIiwiJHNsaWNlIiwibXlMYXN0RmluaXNoZWRBcHByb3ZlIiwiYWdlbnRfdXNlcl9uYW1lIiwibXlfZmluaXNoX2RhdGUiLCJpc19jYyIsImNjX2NvdW50IiwidGFidWxhck5hbWUiLCJpbnN0YW5jZV9pZHMiLCJyZWxhdGVkX2luc3RhbmNlX2lkcyIsIl9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlIiwiX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUiLCJfaXRlbXMiLCIkbWF0Y2giLCIkZ3JvdXAiLCIkc3VtIiwiX2NoYW5nZURhdGEiLCJfZmxvd3NEYXRhIiwiX2luaXQiLCJkYXRhSXRlbSIsImZsb3dfaW5zdGFuY2UiLCJvYnNlcnZlIiwiZ2V0Q29sbGVjdGlvbiIsIndvcmtmbG93VGVtcGxhdGUiLCJzdGFydHVwIiwiYWJzb2x1dGVfcGF0aF9jbiIsImFic29sdXRlX3BhdGhfdXMiLCJmaWxlc0xpc3RfY24iLCJmaWxlc0xpc3RfdXMiLCJmcyIsIm1pbWUiLCJwYXRoX2NuIiwicGF0aF91cyIsInJlYWRGaWxlTGlzdCIsInBhdGhEaXIiLCJmaWxlc0xpc3QiLCJyZWFkZGlyU3luYyIsInN0YXQiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5Iiwid29ya2Zsb3dUZW1wbGF0ZXMiLCJyZXNvbHZlIiwiZXhpc3RzU3luYyIsImZpbGUiLCJyZWFkRmlsZVN5bmMiLCJnb19uZXh0IiwicnVsZSIsInNjaGVkdWxlIiwiY3JvbiIsImF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbiIsInNjaGVkdWxlSm9iIiwiYmluZEVudmlyb25tZW50IiwidGltZSIsInByb2Nlc3NfZGVsZWdhdGlvbl9ydWxlcyIsInVwZGF0ZSIsImVuYWJsZWQiLCJlbmRfdGltZSIsIiRsdGUiLCIkc2V0IiwibXVsdGkiLCJ0aW1lRW5kIiwidGltZW91dF9hdXRvX3N1Ym1pdCIsInRpbWVvdXRBdXRvU3VibWl0IiwiVGFidWxhclRhYmxlcyIsInJlbGF0ZWRfaW5zdGFuY2VzX3RhYnVsYXIiLCJUYWJ1bGFyIiwiVGFibGUiLCJjb2xsZWN0aW9uIiwiY29sdW1ucyIsInRpdGxlIiwib3JkZXJhYmxlIiwicmVuZGVyIiwiaW5wdXQiLCJzdGVwX2N1cnJlbnRfbmFtZSIsImN1cnJlbnRfc3RlcF9uYW1lIiwiZG9tIiwibGVuZ3RoQ2hhbmdlIiwiZXh0cmFGaWVsZHMiLCJwYWdlTGVuZ3RoIiwiaW5mbyIsInNlYXJjaGluZyIsInJlc3BvbnNpdmUiLCJkZXRhaWxzIiwiYXV0b1dpZHRoIiwiY2hhbmdlU2VsZWN0b3IiLCJjdXJTcGFjZVVzZXIiLCIkYW5kIiwiYWRtaW5zIiwiZmwiLCJleHRlbmQiLCJHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyIsIl9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyIsIl9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMiLCJfaGFuZGxlTGlzdEZpZWxkcyIsImluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyIiwiaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciIsIm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyIiwidXBkYXRlVGFidWxhclRpdGxlIiwic3VicyIsIlN1YnNNYW5hZ2VyIiwiaW5zX2ZpZWxkcyIsInB1YiIsIm9uVW5sb2FkIiwiaW5zdGFuY2VfbGlzdCIsIl90YWJsZUNvbHVtbnMiLCJkcmF3Q2FsbGJhY2siLCJlbGxpcHNpc0xpbmsiLCJlbXB0eVRkIiwiY29sU3BhbiIsImlzUGFkIiwicGVyZmVjdFNjcm9sbGJhciIsIm9JbnN0YW5jZSIsImF0dHIiLCJjbGljayIsImdvUGFnZSIsImhlaWdodCIsInBhZ2VzIiwiY2VpbCIsImZuUmVjb3Jkc0Rpc3BsYXkiLCJfaURpc3BsYXlMZW5ndGgiLCJEYXRhVGFibGUiLCJwYWdlIiwiZHJhdyIsImJsdXIiLCJjdXJyZW50UGFnZSIsImtleWRvd24iLCJrZXlDb2RlIiwiY3JlYXRlZFJvdyIsInJvdyIsImRhdGFJbmRleCIsIkZsb3dSb3V0ZXIiLCJzZXRBdHRyaWJ1dGUiLCJhZ2VudF92aWV3IiwiY2NfdmlldyIsImluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MiLCJtb2RpZmllZEZyb21Ob3ciLCJtb2RpZmllZFN0cmluZyIsInByaW9yaXR5SWNvbiIsInByaW9yaXR5SWNvbkNsYXNzIiwicHJpb3JpdHlWYWx1ZSIsInN0ZXBfY3VycmVudF9uYW1lX3ZpZXciLCJ1bnJlYWQiLCJtb21lbnRSZWFjdGl2ZUZyb21Ob3ciLCJwcmlvcml0eSIsInZpc2libGUiLCJjY190YWciLCJyZWNvcmRfbmVlZCIsImxlbmd0aE1lbnUiLCJzcGFjZV91c2VyIiwicGFnaW5nVHlwZSIsImlzX2xpc3RfZGlzcGxheSIsImluYm94X2luc3RhbmNlcyIsIm91dGJveF9pbnN0YW5jZXMiLCJnZXRTb3J0IiwiZmxvd0luc3RhbmNlcyIsIlJlYWN0aXZlVmFyIiwiX2NoYW5nZU9yZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsZ0JBQUo7QUFBcUJDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLG9DQUFaLEVBQWlEO0FBQUNGLGtCQUFnQixDQUFDRyxDQUFELEVBQUc7QUFBQ0gsb0JBQWdCLEdBQUNHLENBQWpCO0FBQW1COztBQUF4QyxDQUFqRCxFQUEyRixDQUEzRjtBQUNyQkgsZ0JBQWdCLENBQUM7QUFDaEIsbUJBQWlCLFFBREQ7QUFFaEIsWUFBVTtBQUZNLENBQUQsRUFHYixrQkFIYSxDQUFoQixDOzs7Ozs7Ozs7Ozs7QUNEQTs7Ozs7Ozs7Ozs7OztBQWFDLGFBQVVJLElBQVYsRUFBZ0JDLE9BQWhCLEVBQXlCO0FBQ3pCLGlCQUR5QixDQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFFBQUksT0FBT0MsTUFBUCxLQUFrQixVQUFsQixJQUFnQ0EsTUFBTSxDQUFDQyxHQUEzQyxFQUFnRDtBQUMvQztBQUNBRCxZQUFNLENBQUMsQ0FBQyxZQUFELEVBQWUsUUFBZixFQUF5QixzQkFBekIsQ0FBRCxFQUFtREQsT0FBbkQsQ0FBTjtBQUNBLEtBSEQsTUFHTztBQUNOO0FBQ0FELFVBQUksQ0FBQ0ksR0FBTCxHQUFXSCxPQUFPLENBQUNELElBQUksQ0FBQ0ssUUFBTixFQUFnQkwsSUFBSSxDQUFDTSxJQUFyQixFQUEyQk4sSUFBSSxDQUFDTyxrQkFBaEMsRUFBb0RQLElBQXBELENBQWxC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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7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bnRlbnQiOlsiaW1wb3J0IHsgY2hlY2tOcG1WZXJzaW9ucyB9IGZyb20gJ21ldGVvci90bWVhc2RheTpjaGVjay1ucG0tdmVyc2lvbnMnO1xuY2hlY2tOcG1WZXJzaW9ucyh7XG5cdFwibm9kZS1zY2hlZHVsZVwiOiBcIl4xLjMuMVwiLFxuXHRcInhtbDJqc1wiOiBcIl4wLjQuMTlcIixcbn0sICdzdGVlZG9zOndvcmtmbG93Jyk7IiwiLyohXG4gKiBVUkkuanMgLSBNdXRhdGluZyBVUkxzXG4gKlxuICogVmVyc2lvbjogMS4xNy4wXG4gKlxuICogQXV0aG9yOiBSb2RuZXkgUmVobVxuICogV2ViOiBodHRwOi8vbWVkaWFsaXplLmdpdGh1Yi5pby9VUkkuanMvXG4gKlxuICogTGljZW5zZWQgdW5kZXJcbiAqICAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZVxuICogICBHUEwgdjMgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0dQTC0zLjBcbiAqXG4gKi9cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHQndXNlIHN0cmljdCc7XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvcmV0dXJuRXhwb3J0cy5qc1xuXHQvLyBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG5cdC8vICAgLy8gTm9kZVxuXHQvLyAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuL3B1bnljb2RlJyksIHJlcXVpcmUoJy4vSVB2NicpLCByZXF1aXJlKCcuL1NlY29uZExldmVsRG9tYWlucycpKTtcblx0Ly8gfSBlbHNlXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKFsnLi9wdW55Y29kZScsICcuL0lQdjYnLCAnLi9TZWNvbmRMZXZlbERvbWFpbnMnXSwgZmFjdG9yeSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcblx0XHRyb290LlVSSSA9IGZhY3Rvcnkocm9vdC5wdW55Y29kZSwgcm9vdC5JUHY2LCByb290LlNlY29uZExldmVsRG9tYWlucywgcm9vdCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKHB1bnljb2RlLCBJUHY2LCBTTEQsIHJvb3QpIHtcblx0J3VzZSBzdHJpY3QnO1xuXHQvKmdsb2JhbCBsb2NhdGlvbiwgZXNjYXBlLCB1bmVzY2FwZSAqL1xuXHQvLyBGSVhNRTogdjIuMC4wIHJlbmFtY2Ugbm9uLWNhbWVsQ2FzZSBwcm9wZXJ0aWVzIHRvIHVwcGVyY2FzZVxuXHQvKmpzaGludCBjYW1lbGNhc2U6IGZhbHNlICovXG5cblx0Ly8gc2F2ZSBjdXJyZW50IFVSSSB2YXJpYWJsZSwgaWYgYW55XG5cdHZhciBfVVJJID0gcm9vdCAmJiByb290LlVSSTtcblxuXHRmdW5jdGlvbiBVUkkodXJsLCBiYXNlKSB7XG5cdFx0dmFyIF91cmxTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMTtcblx0XHR2YXIgX2Jhc2VTdXBwbGllZCA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjtcblxuXHRcdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRcdGlmICghKHRoaXMgaW5zdGFuY2VvZiBVUkkpKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdGlmIChfYmFzZVN1cHBsaWVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBVUkkodXJsLCBiYXNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXcgVVJJKHVybCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgVVJJKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoX3VybFN1cHBsaWVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZGVmaW5lZCBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCBmb3IgVVJJJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHVybCA9IGxvY2F0aW9uLmhyZWYgKyAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHVybCA9ICcnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaHJlZih1cmwpO1xuXG5cdFx0Ly8gcmVzb2x2ZSB0byBiYXNlIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbnN0cnVjdG9yXG5cdFx0aWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYWJzb2x1dGVUbyhiYXNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdFVSSS52ZXJzaW9uID0gJzEuMTcuMCc7XG5cblx0dmFyIHAgPSBVUkkucHJvdG90eXBlO1xuXHR2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBlc2NhcGVSZWdFeChzdHJpbmcpIHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9jb21taXQvODVhYzIxNzgzYzExZjhjY2FiMDYxMDZkYmE5NzM1YTMxYTg2OTI0ZCNjb21taXRjb21tZW50LTgyMTk2M1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXF1cXC9cXFxcXSkvZywgJ1xcXFwkMScpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VHlwZSh2YWx1ZSkge1xuXHRcdC8vIElFOCBkb2Vzbid0IHJldHVybiBbT2JqZWN0IFVuZGVmaW5lZF0gYnV0IFtPYmplY3QgT2JqZWN0XSBmb3IgdW5kZWZpbmVkIHZhbHVlXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnVW5kZWZpbmVkJztcblx0XHR9XG5cblx0XHRyZXR1cm4gU3RyaW5nKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkpLnNsaWNlKDgsIC0xKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG5cdFx0cmV0dXJuIGdldFR5cGUob2JqKSA9PT0gJ0FycmF5Jztcblx0fVxuXG5cdGZ1bmN0aW9uIGZpbHRlckFycmF5VmFsdWVzKGRhdGEsIHZhbHVlKSB7XG5cdFx0dmFyIGxvb2t1cCA9IHt9O1xuXHRcdHZhciBpLCBsZW5ndGg7XG5cblx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRsb29rdXAgPSBudWxsO1xuXHRcdH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGxvb2t1cFt2YWx1ZVtpXV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb29rdXBbdmFsdWVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogdHJ1ZSAqL1xuXHRcdFx0dmFyIF9tYXRjaCA9IGxvb2t1cCAmJiBsb29rdXBbZGF0YVtpXV0gIT09IHVuZGVmaW5lZFxuXHRcdFx0XHR8fCAhbG9va3VwICYmIHZhbHVlLnRlc3QoZGF0YVtpXSk7XG5cdFx0XHQvKmpzaGludCBsYXhicmVhazogZmFsc2UgKi9cblx0XHRcdGlmIChfbWF0Y2gpIHtcblx0XHRcdFx0ZGF0YS5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGxlbmd0aC0tO1xuXHRcdFx0XHRpLS07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXHRmdW5jdGlvbiBhcnJheUNvbnRhaW5zKGxpc3QsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aDtcblxuXHRcdC8vIHZhbHVlIG1heSBiZSBzdHJpbmcsIG51bWJlciwgYXJyYXksIHJlZ2V4cFxuXHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Ly8gTm90ZTogdGhpcyBjYW4gYmUgb3B0aW1pemVkIHRvIE8obikgKGluc3RlYWQgb2YgY3VycmVudCBPKG0gKiBuKSlcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICghYXJyYXlDb250YWlucyhsaXN0LCB2YWx1ZVtpXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIF90eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKF90eXBlID09PSAnUmVnRXhwJykge1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RbaV0gPT09ICdzdHJpbmcnICYmIGxpc3RbaV0ubWF0Y2godmFsdWUpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobGlzdFtpXSA9PT0gdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXJyYXlzRXF1YWwob25lLCB0d28pIHtcblx0XHRpZiAoIWlzQXJyYXkob25lKSB8fCAhaXNBcnJheSh0d28pKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gYXJyYXlzIGNhbid0IGJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50IG9mIGNvbnRlbnRcblx0XHRpZiAob25lLmxlbmd0aCAhPT0gdHdvLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdG9uZS5zb3J0KCk7XG5cdFx0dHdvLnNvcnQoKTtcblxuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gb25lLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0aWYgKG9uZVtpXSAhPT0gdHdvW2ldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZ1bmN0aW9uIHRyaW1TbGFzaGVzKHRleHQpIHtcblx0XHR2YXIgdHJpbV9leHByZXNzaW9uID0gL15cXC8rfFxcLyskL2c7XG5cdFx0cmV0dXJuIHRleHQucmVwbGFjZSh0cmltX2V4cHJlc3Npb24sICcnKTtcblx0fVxuXG5cdFVSSS5fcGFydHMgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvdG9jb2w6IG51bGwsXG5cdFx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdFx0aG9zdG5hbWU6IG51bGwsXG5cdFx0XHR1cm46IG51bGwsXG5cdFx0XHRwb3J0OiBudWxsLFxuXHRcdFx0cGF0aDogbnVsbCxcblx0XHRcdHF1ZXJ5OiBudWxsLFxuXHRcdFx0ZnJhZ21lbnQ6IG51bGwsXG5cdFx0XHQvLyBzdGF0ZVxuXHRcdFx0ZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzOiBVUkkuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLFxuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZTogVVJJLmVzY2FwZVF1ZXJ5U3BhY2Vcblx0XHR9O1xuXHR9O1xuXHQvLyBzdGF0ZTogYWxsb3cgZHVwbGljYXRlIHF1ZXJ5IHBhcmFtZXRlcnMgKGE9MSZhPTEpXG5cdFVSSS5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMgPSBmYWxzZTtcblx0Ly8gc3RhdGU6IHJlcGxhY2VzICsgd2l0aCAlMjAgKHNwYWNlIGluIHF1ZXJ5IHN0cmluZ3MpXG5cdFVSSS5lc2NhcGVRdWVyeVNwYWNlID0gdHJ1ZTtcblx0Ly8gc3RhdGljIHByb3BlcnRpZXNcblx0VVJJLnByb3RvY29sX2V4cHJlc3Npb24gPSAvXlthLXpdW2EtejAtOS4rLV0qJC9pO1xuXHRVUkkuaWRuX2V4cHJlc3Npb24gPSAvW15hLXowLTlcXC4tXS9pO1xuXHRVUkkucHVueWNvZGVfZXhwcmVzc2lvbiA9IC8oeG4tLSkvaTtcblx0Ly8gd2VsbCwgMzMzLjQ0NC41NTUuNjY2IG1hdGNoZXMsIGJ1dCBpdCBzdXJlIGFpbid0IG5vIElQdjQgLSBkbyB3ZSBjYXJlP1xuXHRVUkkuaXA0X2V4cHJlc3Npb24gPSAvXlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9JC87XG5cdC8vIGNyZWRpdHMgdG8gUmljaCBCcm93blxuXHQvLyBzb3VyY2U6IGh0dHA6Ly9mb3J1bXMuaW50ZXJtYXBwZXIuY29tL3ZpZXd0b3BpYy5waHA/cD0xMDk2IzEwOTZcblx0Ly8gc3BlY2lmaWNhdGlvbjogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDI5MS50eHRcblx0VVJJLmlwNl9leHByZXNzaW9uID0gL15cXHMqKCgoWzAtOUEtRmEtZl17MSw0fTopezd9KFswLTlBLUZhLWZdezEsNH18OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezZ9KDpbMC05QS1GYS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7NH0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOUEtRmEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezN9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNH0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7Mn0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKShcXC4oMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXsxfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKFxcLigyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkpezN9KSl8OikpfCg6KCgoOlswLTlBLUZhLWZdezEsNH0pezEsN30pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZCkoXFwuKDI1WzAtNV18MlswLTRdXFxkfDFcXGRcXGR8WzEtOV0/XFxkKSl7M30pKXw6KSkpKCUuKyk/XFxzKiQvO1xuXHQvLyBleHByZXNzaW9uIHVzZWQgaXMgXCJncnViZXIgcmV2aXNlZFwiIChAZ3J1YmVyIHYyKSBkZXRlcm1pbmVkIHRvIGJlIHRoZVxuXHQvLyBiZXN0IHNvbHV0aW9uIGluIGEgcmVnZXgtZ29sZiB3ZSBkaWQgYSBjb3VwbGUgb2YgYWdlcyBhZ28gYXRcblx0Ly8gKiBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9kZW1vL3VybC1yZWdleFxuXHQvLyAqIGh0dHA6Ly9yb2RuZXlyZWhtLmRlL3QvdXJsLXJlZ2V4Lmh0bWxcblx0VVJJLmZpbmRfdXJpX2V4cHJlc3Npb24gPSAvXFxiKCg/OlthLXpdW1xcdy1dKzooPzpcXC97MSwzfXxbYS16MC05JV0pfHd3d1xcZHswLDN9Wy5dfFthLXowLTkuXFwtXStbLl1bYS16XXsyLDR9XFwvKSg/OlteXFxzKCk8Pl0rfFxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCkpKyg/OlxcKChbXlxccygpPD5dK3woXFwoW15cXHMoKTw+XStcXCkpKSpcXCl8W15cXHNgISgpXFxbXFxde307OidcIi4sPD4/wqvCu+KAnOKAneKAmOKAmV0pKS9pZztcblx0VVJJLmZpbmRVcmkgPSB7XG5cdFx0Ly8gdmFsaWQgXCJzY2hlbWU6Ly9cIiBvciBcInd3dy5cIlxuXHRcdHN0YXJ0OiAvXFxiKD86KFthLXpdW2EtejAtOS4rLV0qOlxcL1xcLyl8d3d3XFwuKS9naSxcblx0XHQvLyBldmVyeXRoaW5nIHVwIHRvIHRoZSBuZXh0IHdoaXRlc3BhY2Vcblx0XHRlbmQ6IC9bXFxzXFxyXFxuXXwkLyxcblx0XHQvLyB0cmltIHRyYWlsaW5nIHB1bmN0dWF0aW9uIGNhcHR1cmVkIGJ5IGVuZCBSZWdFeHBcblx0XHR0cmltOiAvW2AhKClcXFtcXF17fTs6J1wiLiw8Pj/Cq8K74oCc4oCd4oCe4oCY4oCZXSskL1xuXHR9O1xuXHQvLyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3VyaS1zY2hlbWVzLmh0bWxcblx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1RDUF9hbmRfVURQX3BvcnRfbnVtYmVycyNXZWxsLWtub3duX3BvcnRzXG5cdFVSSS5kZWZhdWx0UG9ydHMgPSB7XG5cdFx0aHR0cDogJzgwJyxcblx0XHRodHRwczogJzQ0MycsXG5cdFx0ZnRwOiAnMjEnLFxuXHRcdGdvcGhlcjogJzcwJyxcblx0XHR3czogJzgwJyxcblx0XHR3c3M6ICc0NDMnXG5cdH07XG5cdC8vIGFsbG93ZWQgaG9zdG5hbWUgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0Ly8gQUxQSEEgRElHSVQgXCItXCIgXCIuXCIgXCJfXCIgXCJ+XCIgXCIhXCIgXCIkXCIgXCImXCIgXCInXCIgXCIoXCIgXCIpXCIgXCIqXCIgXCIrXCIgXCIsXCIgXCI7XCIgXCI9XCIgJWVuY29kZWRcblx0Ly8gSSd2ZSBuZXZlciBzZWVuIGEgKG5vbi1JRE4pIGhvc3RuYW1lIG90aGVyIHRoYW46IEFMUEhBIERJR0lUIC4gLVxuXHRVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzID0gL1teYS16QS1aMC05XFwuLV0vO1xuXHQvLyBtYXAgRE9NIEVsZW1lbnRzIHRvIHRoZWlyIFVSSSBhdHRyaWJ1dGVcblx0VVJJLmRvbUF0dHJpYnV0ZXMgPSB7XG5cdFx0J2EnOiAnaHJlZicsXG5cdFx0J2Jsb2NrcXVvdGUnOiAnY2l0ZScsXG5cdFx0J2xpbmsnOiAnaHJlZicsXG5cdFx0J2Jhc2UnOiAnaHJlZicsXG5cdFx0J3NjcmlwdCc6ICdzcmMnLFxuXHRcdCdmb3JtJzogJ2FjdGlvbicsXG5cdFx0J2ltZyc6ICdzcmMnLFxuXHRcdCdhcmVhJzogJ2hyZWYnLFxuXHRcdCdpZnJhbWUnOiAnc3JjJyxcblx0XHQnZW1iZWQnOiAnc3JjJyxcblx0XHQnc291cmNlJzogJ3NyYycsXG5cdFx0J3RyYWNrJzogJ3NyYycsXG5cdFx0J2lucHV0JzogJ3NyYycsIC8vIGJ1dCBvbmx5IGlmIHR5cGU9XCJpbWFnZVwiXG5cdFx0J2F1ZGlvJzogJ3NyYycsXG5cdFx0J3ZpZGVvJzogJ3NyYydcblx0fTtcblx0VVJJLmdldERvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRpZiAoIW5vZGUgfHwgIW5vZGUubm9kZU5hbWUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0dmFyIG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdC8vIDxpbnB1dD4gc2hvdWxkIG9ubHkgZXhwb3NlIHNyYyBmb3IgdHlwZT1cImltYWdlXCJcblx0XHRpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgbm9kZS50eXBlICE9PSAnaW1hZ2UnKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBVUkkuZG9tQXR0cmlidXRlc1tub2RlTmFtZV07XG5cdH07XG5cblx0ZnVuY3Rpb24gZXNjYXBlRm9yRHVtYkZpcmVmb3gzNih2YWx1ZSkge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy85MVxuXHRcdHJldHVybiBlc2NhcGUodmFsdWUpO1xuXHR9XG5cblx0Ly8gZW5jb2RpbmcgLyBkZWNvZGluZyBhY2NvcmRpbmcgdG8gUkZDMzk4NlxuXHRmdW5jdGlvbiBzdHJpY3RFbmNvZGVVUklDb21wb25lbnQoc3RyaW5nKSB7XG5cdFx0Ly8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZW5jb2RlVVJJQ29tcG9uZW50XG5cdFx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcpXG5cdFx0XHQucmVwbGFjZSgvWyEnKCkqXS9nLCBlc2NhcGVGb3JEdW1iRmlyZWZveDM2KVxuXHRcdFx0LnJlcGxhY2UoL1xcKi9nLCAnJTJBJyk7XG5cdH1cblx0VVJJLmVuY29kZSA9IHN0cmljdEVuY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcblx0VVJJLmlzbzg4NTkgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0fTtcblx0VVJJLnVuaWNvZGUgPSBmdW5jdGlvbigpIHtcblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdH07XG5cdFVSSS5jaGFyYWN0ZXJzID0ge1xuXHRcdHBhdGhuYW1lOiB7XG5cdFx0XHRlbmNvZGU6IHtcblx0XHRcdFx0Ly8gUkZDMzk4NiAyLjE6IEZvciBjb25zaXN0ZW5jeSwgVVJJIHByb2R1Y2VycyBhbmQgbm9ybWFsaXplcnMgc2hvdWxkXG5cdFx0XHRcdC8vIHVzZSB1cHBlcmNhc2UgaGV4YWRlY2ltYWwgZGlnaXRzIGZvciBhbGwgcGVyY2VudC1lbmNvZGluZ3MuXG5cdFx0XHRcdGV4cHJlc3Npb246IC8lKDI0fDI2fDJCfDJDfDNCfDNEfDNBfDQwKS9pZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Ly8gLS5ffiEnKCkqXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI2JzogJyYnLFxuXHRcdFx0XHRcdCclMkInOiAnKycsXG5cdFx0XHRcdFx0JyUyQyc6ICcsJyxcblx0XHRcdFx0XHQnJTNCJzogJzsnLFxuXHRcdFx0XHRcdCclM0QnOiAnPScsXG5cdFx0XHRcdFx0JyUzQSc6ICc6Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jXS9nLFxuXHRcdFx0XHRtYXA6IHtcblx0XHRcdFx0XHQnLyc6ICclMkYnLFxuXHRcdFx0XHRcdCc/JzogJyUzRicsXG5cdFx0XHRcdFx0JyMnOiAnJTIzJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZXNlcnZlZDoge1xuXHRcdFx0ZW5jb2RlOiB7XG5cdFx0XHRcdC8vIFJGQzM5ODYgMi4xOiBGb3IgY29uc2lzdGVuY3ksIFVSSSBwcm9kdWNlcnMgYW5kIG5vcm1hbGl6ZXJzIHNob3VsZFxuXHRcdFx0XHQvLyB1c2UgdXBwZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cyBmb3IgYWxsIHBlcmNlbnQtZW5jb2RpbmdzLlxuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyM3wyNHwyNnwyN3wyOHwyOXwyQXwyQnwyQ3wyRnwzQXwzQnwzRHwzRnw0MHw1Qnw1RCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdC8vIGdlbi1kZWxpbXNcblx0XHRcdFx0XHQnJTNBJzogJzonLFxuXHRcdFx0XHRcdCclMkYnOiAnLycsXG5cdFx0XHRcdFx0JyUzRic6ICc/Jyxcblx0XHRcdFx0XHQnJTIzJzogJyMnLFxuXHRcdFx0XHRcdCclNUInOiAnWycsXG5cdFx0XHRcdFx0JyU1RCc6ICddJyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnLFxuXHRcdFx0XHRcdC8vIHN1Yi1kZWxpbXNcblx0XHRcdFx0XHQnJTIxJzogJyEnLFxuXHRcdFx0XHRcdCclMjQnOiAnJCcsXG5cdFx0XHRcdFx0JyUyNic6ICcmJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9J1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR1cm5wYXRoOiB7XG5cdFx0XHQvLyBUaGUgY2hhcmFjdGVycyB1bmRlciBgZW5jb2RlYCBhcmUgdGhlIGNoYXJhY3RlcnMgY2FsbGVkIG91dCBieSBSRkMgMjE0MSBhcyBiZWluZyBhY2NlcHRhYmxlXG5cdFx0XHQvLyBmb3IgdXNhZ2UgaW4gYSBVUk4uIFJGQzIxNDEgYWxzbyBjYWxscyBvdXQgXCItXCIsIFwiLlwiLCBhbmQgXCJfXCIgYXMgYWNjZXB0YWJsZSBjaGFyYWN0ZXJzLCBidXRcblx0XHRcdC8vIHRoZXNlIGFyZW4ndCBlbmNvZGVkIGJ5IGVuY29kZVVSSUNvbXBvbmVudCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWxsIHRoZW0gb3V0IGhlcmUuIEFsc29cblx0XHRcdC8vIG5vdGUgdGhhdCB0aGUgY29sb24gY2hhcmFjdGVyIGlzIG5vdCBmZWF0dXJlZCBpbiB0aGUgZW5jb2RpbmcgbWFwOyB0aGlzIGlzIGJlY2F1c2UgVVJJLmpzXG5cdFx0XHQvLyBnaXZlcyB0aGUgY29sb25zIGluIFVSTnMgc2VtYW50aWMgbWVhbmluZyBhcyB0aGUgZGVsaW1pdGVycyBvZiBwYXRoIHNlZ2VtZW50cywgYW5kIHNvIGl0XG5cdFx0XHQvLyBzaG91bGQgbm90IGFwcGVhciB1bmVuY29kZWQgaW4gYSBzZWdtZW50IGl0c2VsZi5cblx0XHRcdC8vIFNlZSBhbHNvIHRoZSBub3RlIGFib3ZlIGFib3V0IFJGQzM5ODYgYW5kIGNhcGl0YWxhbGl6ZWQgaGV4IGRpZ2l0cy5cblx0XHRcdGVuY29kZToge1xuXHRcdFx0XHRleHByZXNzaW9uOiAvJSgyMXwyNHwyN3wyOHwyOXwyQXwyQnwyQ3wzQnwzRHw0MCkvaWcsXG5cdFx0XHRcdG1hcDoge1xuXHRcdFx0XHRcdCclMjEnOiAnIScsXG5cdFx0XHRcdFx0JyUyNCc6ICckJyxcblx0XHRcdFx0XHQnJTI3JzogJ1xcJycsXG5cdFx0XHRcdFx0JyUyOCc6ICcoJyxcblx0XHRcdFx0XHQnJTI5JzogJyknLFxuXHRcdFx0XHRcdCclMkEnOiAnKicsXG5cdFx0XHRcdFx0JyUyQic6ICcrJyxcblx0XHRcdFx0XHQnJTJDJzogJywnLFxuXHRcdFx0XHRcdCclM0InOiAnOycsXG5cdFx0XHRcdFx0JyUzRCc6ICc9Jyxcblx0XHRcdFx0XHQnJTQwJzogJ0AnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBUaGVzZSBjaGFyYWN0ZXJzIGFyZSB0aGUgY2hhcmFjdGVycyBjYWxsZWQgb3V0IGJ5IFJGQzIxNDEgYXMgXCJyZXNlcnZlZFwiIGNoYXJhY3RlcnMgdGhhdFxuXHRcdFx0Ly8gc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBhIFVSTiwgcGx1cyB0aGUgY29sb24gY2hhcmFjdGVyIChzZWUgbm90ZSBhYm92ZSkuXG5cdFx0XHRkZWNvZGU6IHtcblx0XHRcdFx0ZXhwcmVzc2lvbjogL1tcXC9cXD8jOl0vZyxcblx0XHRcdFx0bWFwOiB7XG5cdFx0XHRcdFx0Jy8nOiAnJTJGJyxcblx0XHRcdFx0XHQnPyc6ICclM0YnLFxuXHRcdFx0XHRcdCcjJzogJyUyMycsXG5cdFx0XHRcdFx0JzonOiAnJTNBJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRVUkkuZW5jb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHR2YXIgZXNjYXBlZCA9IFVSSS5lbmNvZGUoc3RyaW5nICsgJycpO1xuXHRcdGlmIChlc2NhcGVRdWVyeVNwYWNlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVzY2FwZVF1ZXJ5U3BhY2UgPSBVUkkuZXNjYXBlUXVlcnlTcGFjZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXNjYXBlUXVlcnlTcGFjZSA/IGVzY2FwZWQucmVwbGFjZSgvJTIwL2csICcrJykgOiBlc2NhcGVkO1xuXHR9O1xuXHRVUkkuZGVjb2RlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRzdHJpbmcgKz0gJyc7XG5cdFx0aWYgKGVzY2FwZVF1ZXJ5U3BhY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXNjYXBlUXVlcnlTcGFjZSA9IFVSSS5lc2NhcGVRdWVyeVNwYWNlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gVVJJLmRlY29kZShlc2NhcGVRdWVyeVNwYWNlID8gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTIwJykgOiBzdHJpbmcpO1xuXHRcdH0gY2F0Y2goZSkge1xuXHRcdFx0Ly8gd2UncmUgbm90IGdvaW5nIHRvIG1lc3Mgd2l0aCB3ZWlyZCBlbmNvZGluZ3MsXG5cdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvODdcblx0XHRcdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcy9pc3N1ZXMvOTJcblx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0fVxuXHR9O1xuXHQvLyBnZW5lcmF0ZSBlbmNvZGUvZGVjb2RlIHBhdGggZnVuY3Rpb25zXG5cdHZhciBfcGFydHMgPSB7J2VuY29kZSc6J2VuY29kZScsICdkZWNvZGUnOidkZWNvZGUnfTtcblx0dmFyIF9wYXJ0O1xuXHR2YXIgZ2VuZXJhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uKF9ncm91cCwgX3BhcnQpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gVVJJW19wYXJ0XShzdHJpbmcgKyAnJykucmVwbGFjZShVUkkuY2hhcmFjdGVyc1tfZ3JvdXBdW19wYXJ0XS5leHByZXNzaW9uLCBmdW5jdGlvbihjKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFVSSS5jaGFyYWN0ZXJzW19ncm91cF1bX3BhcnRdLm1hcFtjXTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIHdlJ3JlIG5vdCBnb2luZyB0byBtZXNzIHdpdGggd2VpcmQgZW5jb2RpbmdzLFxuXHRcdFx0XHQvLyBnaXZlIHVwIGFuZCByZXR1cm4gdGhlIHVuZGVjb2RlZCBvcmlnaW5hbCBzdHJpbmdcblx0XHRcdFx0Ly8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzL2lzc3Vlcy84N1xuXHRcdFx0XHQvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvaXNzdWVzLzkyXG5cdFx0XHRcdHJldHVybiBzdHJpbmc7XG5cdFx0XHR9XG5cdFx0fTtcblx0fTtcblxuXHRmb3IgKF9wYXJ0IGluIF9wYXJ0cykge1xuXHRcdFVSSVtfcGFydCArICdQYXRoU2VnbWVudCddID0gZ2VuZXJhdGVBY2Nlc3NvcigncGF0aG5hbWUnLCBfcGFydHNbX3BhcnRdKTtcblx0XHRVUklbX3BhcnQgKyAnVXJuUGF0aFNlZ21lbnQnXSA9IGdlbmVyYXRlQWNjZXNzb3IoJ3VybnBhdGgnLCBfcGFydHNbX3BhcnRdKTtcblx0fVxuXG5cdHZhciBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbiA9IGZ1bmN0aW9uKF9zZXAsIF9jb2RpbmdGdW5jTmFtZSwgX2lubmVyQ29kaW5nRnVuY05hbWUpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHQvLyBXaHkgcGFzcyBpbiBuYW1lcyBvZiBmdW5jdGlvbnMsIHJhdGhlciB0aGFuIHRoZSBmdW5jdGlvbiBvYmplY3RzIHRoZW1zZWx2ZXM/IFRoZVxuXHRcdFx0Ly8gZGVmaW5pdGlvbnMgb2Ygc29tZSBmdW5jdGlvbnMgKGJ1dCBpbiBwYXJ0aWN1bGFyLCBVUkkuZGVjb2RlKSB3aWxsIG9jY2FzaW9uYWxseSBjaGFuZ2UgZHVlXG5cdFx0XHQvLyB0byBVUkkuanMgaGF2aW5nIElTTzg4NTkgYW5kIFVuaWNvZGUgbW9kZXMuIFBhc3NpbmcgaW4gdGhlIG5hbWUgYW5kIGdldHRpbmcgaXQgd2lsbCBlbnN1cmVcblx0XHRcdC8vIHRoYXQgdGhlIGZ1bmN0aW9ucyB3ZSB1c2UgaGVyZSBhcmUgXCJmcmVzaFwiLlxuXHRcdFx0dmFyIGFjdHVhbENvZGluZ0Z1bmM7XG5cdFx0XHRpZiAoIV9pbm5lckNvZGluZ0Z1bmNOYW1lKSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBVUklbX2NvZGluZ0Z1bmNOYW1lXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdHVhbENvZGluZ0Z1bmMgPSBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gVVJJW19jb2RpbmdGdW5jTmFtZV0oVVJJW19pbm5lckNvZGluZ0Z1bmNOYW1lXShzdHJpbmcpKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHNlZ21lbnRzID0gKHN0cmluZyArICcnKS5zcGxpdChfc2VwKTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHNlZ21lbnRzW2ldID0gYWN0dWFsQ29kaW5nRnVuYyhzZWdtZW50c1tpXSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZWdtZW50cy5qb2luKF9zZXApO1xuXHRcdH07XG5cdH07XG5cblx0Ly8gVGhpcyB0YWtlcyBwbGFjZSBvdXRzaWRlIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCwgZS5nLiwgZW5jb2RlVXJuUGF0aCBmdW5jdGlvbnMuXG5cdFVSSS5kZWNvZGVQYXRoID0gZ2VuZXJhdGVTZWdtZW50ZWRQYXRoRnVuY3Rpb24oJy8nLCAnZGVjb2RlUGF0aFNlZ21lbnQnKTtcblx0VVJJLmRlY29kZVVyblBhdGggPSBnZW5lcmF0ZVNlZ21lbnRlZFBhdGhGdW5jdGlvbignOicsICdkZWNvZGVVcm5QYXRoU2VnbWVudCcpO1xuXHRVUkkucmVjb2RlUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCcvJywgJ2VuY29kZVBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXHRVUkkucmVjb2RlVXJuUGF0aCA9IGdlbmVyYXRlU2VnbWVudGVkUGF0aEZ1bmN0aW9uKCc6JywgJ2VuY29kZVVyblBhdGhTZWdtZW50JywgJ2RlY29kZScpO1xuXG5cdFVSSS5lbmNvZGVSZXNlcnZlZCA9IGdlbmVyYXRlQWNjZXNzb3IoJ3Jlc2VydmVkJywgJ2VuY29kZScpO1xuXG5cdFVSSS5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHR2YXIgcG9zO1xuXHRcdGlmICghcGFydHMpIHtcblx0XHRcdHBhcnRzID0ge307XG5cdFx0fVxuXHRcdC8vIFtwcm90b2NvbFwiOi8vXCJbdXNlcm5hbWVbXCI6XCJwYXNzd29yZF1cIkBcIl1ob3N0bmFtZVtcIjpcInBvcnRdXCIvXCI/XVtwYXRoXVtcIj9cInF1ZXJ5c3RyaW5nXVtcIiNcImZyYWdtZW50XVxuXG5cdFx0Ly8gZXh0cmFjdCBmcmFnbWVudFxuXHRcdHBvcyA9IHN0cmluZy5pbmRleE9mKCcjJyk7XG5cdFx0aWYgKHBvcyA+IC0xKSB7XG5cdFx0XHQvLyBlc2NhcGluZz9cblx0XHRcdHBhcnRzLmZyYWdtZW50ID0gc3RyaW5nLnN1YnN0cmluZyhwb3MgKyAxKSB8fCBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpO1xuXHRcdH1cblxuXHRcdC8vIGV4dHJhY3QgcXVlcnlcblx0XHRwb3MgPSBzdHJpbmcuaW5kZXhPZignPycpO1xuXHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0Ly8gZXNjYXBpbmc/XG5cdFx0XHRwYXJ0cy5xdWVyeSA9IHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSkgfHwgbnVsbDtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKTtcblx0XHR9XG5cblx0XHQvLyBleHRyYWN0IHByb3RvY29sXG5cdFx0aWYgKHN0cmluZy5zdWJzdHJpbmcoMCwgMikgPT09ICcvLycpIHtcblx0XHRcdC8vIHJlbGF0aXZlLXNjaGVtZVxuXHRcdFx0cGFydHMucHJvdG9jb2wgPSBudWxsO1xuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygyKTtcblx0XHRcdC8vIGV4dHJhY3QgXCJ1c2VyOnBhc3NAaG9zdDpwb3J0XCJcblx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zID0gc3RyaW5nLmluZGV4T2YoJzonKTtcblx0XHRcdGlmIChwb3MgPiAtMSkge1xuXHRcdFx0XHRwYXJ0cy5wcm90b2NvbCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAocGFydHMucHJvdG9jb2wgJiYgIXBhcnRzLnByb3RvY29sLm1hdGNoKFVSSS5wcm90b2NvbF9leHByZXNzaW9uKSkge1xuXHRcdFx0XHRcdC8vIDogbWF5IGJlIHdpdGhpbiB0aGUgcGF0aFxuXHRcdFx0XHRcdHBhcnRzLnByb3RvY29sID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHN0cmluZy5zdWJzdHJpbmcocG9zICsgMSwgcG9zICsgMykgPT09ICcvLycpIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDMpO1xuXG5cdFx0XHRcdFx0Ly8gZXh0cmFjdCBcInVzZXI6cGFzc0Bob3N0OnBvcnRcIlxuXHRcdFx0XHRcdHN0cmluZyA9IFVSSS5wYXJzZUF1dGhvcml0eShzdHJpbmcsIHBhcnRzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdFx0XHRcdHBhcnRzLnVybiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB3aGF0J3MgbGVmdCBtdXN0IGJlIHRoZSBwYXRoXG5cdFx0cGFydHMucGF0aCA9IHN0cmluZztcblxuXHRcdC8vIGFuZCB3ZSdyZSBkb25lXG5cdFx0cmV0dXJuIHBhcnRzO1xuXHR9O1xuXHRVUkkucGFyc2VIb3N0ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuXHRcdC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuXHRcdC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2Jsb2IvMzg2ZmQyNGY0OWIwZTlkMWE4YTA3NjU5MmE0MDQxNjhmYWVlY2MzNC9saWIvdXJsLmpzI0wxMTUtTDEyNFxuXHRcdC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMvcHVsbC8yMzNcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG5cdFx0Ly8gZXh0cmFjdCBob3N0OnBvcnRcblx0XHR2YXIgcG9zID0gc3RyaW5nLmluZGV4T2YoJy8nKTtcblx0XHR2YXIgYnJhY2tldFBvcztcblx0XHR2YXIgdDtcblxuXHRcdGlmIChwb3MgPT09IC0xKSB7XG5cdFx0XHRwb3MgPSBzdHJpbmcubGVuZ3RoO1xuXHRcdH1cblxuXHRcdGlmIChzdHJpbmcuY2hhckF0KDApID09PSAnWycpIHtcblx0XHRcdC8vIElQdjYgaG9zdCAtIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtNm1hbi10ZXh0LWFkZHItcmVwcmVzZW50YXRpb24tMDQjc2VjdGlvbi02XG5cdFx0XHQvLyBJIGNsYWltIG1vc3QgY2xpZW50IHNvZnR3YXJlIGJyZWFrcyBvbiBJUHY2IGFueXdheXMuIFRvIHNpbXBsaWZ5IHRoaW5ncywgVVJJIG9ubHkgYWNjZXB0c1xuXHRcdFx0Ly8gSVB2Nitwb3J0IGluIHRoZSBmb3JtYXQgWzIwMDE6ZGI4OjoxXTo4MCAoZm9yIHRoZSB0aW1lIGJlaW5nKVxuXHRcdFx0YnJhY2tldFBvcyA9IHN0cmluZy5pbmRleE9mKCddJyk7XG5cdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHN0cmluZy5zdWJzdHJpbmcoMSwgYnJhY2tldFBvcykgfHwgbnVsbDtcblx0XHRcdHBhcnRzLnBvcnQgPSBzdHJpbmcuc3Vic3RyaW5nKGJyYWNrZXRQb3MgKyAyLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRpZiAocGFydHMucG9ydCA9PT0gJy8nKSB7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZmlyc3RDb2xvbiA9IHN0cmluZy5pbmRleE9mKCc6Jyk7XG5cdFx0XHR2YXIgZmlyc3RTbGFzaCA9IHN0cmluZy5pbmRleE9mKCcvJyk7XG5cdFx0XHR2YXIgbmV4dENvbG9uID0gc3RyaW5nLmluZGV4T2YoJzonLCBmaXJzdENvbG9uICsgMSk7XG5cdFx0XHRpZiAobmV4dENvbG9uICE9PSAtMSAmJiAoZmlyc3RTbGFzaCA9PT0gLTEgfHwgbmV4dENvbG9uIDwgZmlyc3RTbGFzaCkpIHtcblx0XHRcdFx0Ly8gSVB2NiBob3N0IGNvbnRhaW5zIG11bHRpcGxlIGNvbG9ucyAtIGJ1dCBubyBwb3J0XG5cdFx0XHRcdC8vIHRoaXMgbm90YXRpb24gaXMgYWN0dWFsbHkgbm90IGFsbG93ZWQgYnkgUkZDIDM5ODYsIGJ1dCB3ZSdyZSBhIGxpYmVyYWwgcGFyc2VyXG5cdFx0XHRcdHBhcnRzLmhvc3RuYW1lID0gc3RyaW5nLnN1YnN0cmluZygwLCBwb3MpIHx8IG51bGw7XG5cdFx0XHRcdHBhcnRzLnBvcnQgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0XHRwYXJ0cy5ob3N0bmFtZSA9IHRbMF0gfHwgbnVsbDtcblx0XHRcdFx0cGFydHMucG9ydCA9IHRbMV0gfHwgbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocGFydHMuaG9zdG5hbWUgJiYgc3RyaW5nLnN1YnN0cmluZyhwb3MpLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRwb3MrKztcblx0XHRcdHN0cmluZyA9ICcvJyArIHN0cmluZztcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwb3MpIHx8ICcvJztcblx0fTtcblx0VVJJLnBhcnNlQXV0aG9yaXR5ID0gZnVuY3Rpb24oc3RyaW5nLCBwYXJ0cykge1xuXHRcdHN0cmluZyA9IFVSSS5wYXJzZVVzZXJpbmZvKHN0cmluZywgcGFydHMpO1xuXHRcdHJldHVybiBVUkkucGFyc2VIb3N0KHN0cmluZywgcGFydHMpO1xuXHR9O1xuXHRVUkkucGFyc2VVc2VyaW5mbyA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcblx0XHQvLyBleHRyYWN0IHVzZXJuYW1lOnBhc3N3b3JkXG5cdFx0dmFyIGZpcnN0U2xhc2ggPSBzdHJpbmcuaW5kZXhPZignLycpO1xuXHRcdHZhciBwb3MgPSBzdHJpbmcubGFzdEluZGV4T2YoJ0AnLCBmaXJzdFNsYXNoID4gLTEgPyBmaXJzdFNsYXNoIDogc3RyaW5nLmxlbmd0aCAtIDEpO1xuXHRcdHZhciB0O1xuXG5cdFx0Ly8gYXV0aG9yaXR5QCBtdXN0IGNvbWUgYmVmb3JlIC9wYXRoXG5cdFx0aWYgKHBvcyA+IC0xICYmIChmaXJzdFNsYXNoID09PSAtMSB8fCBwb3MgPCBmaXJzdFNsYXNoKSkge1xuXHRcdFx0dCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgcG9zKS5zcGxpdCgnOicpO1xuXHRcdFx0cGFydHMudXNlcm5hbWUgPSB0WzBdID8gVVJJLmRlY29kZSh0WzBdKSA6IG51bGw7XG5cdFx0XHR0LnNoaWZ0KCk7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IHRbMF0gPyBVUkkuZGVjb2RlKHQuam9pbignOicpKSA6IG51bGw7XG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKHBvcyArIDEpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJ0cy51c2VybmFtZSA9IG51bGw7XG5cdFx0XHRwYXJ0cy5wYXNzd29yZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblx0VVJJLnBhcnNlUXVlcnkgPSBmdW5jdGlvbihzdHJpbmcsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdC8vIHRocm93IG91dCB0aGUgZnVua3kgYnVzaW5lc3MgLSBcIj9cIltuYW1lXCI9XCJ2YWx1ZVwiJlwiXStcblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJisvZywgJyYnKS5yZXBsYWNlKC9eXFw/KiYqfCYrJC9nLCAnJyk7XG5cblx0XHRpZiAoIXN0cmluZykge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdHZhciBpdGVtcyA9IHt9O1xuXHRcdHZhciBzcGxpdHMgPSBzdHJpbmcuc3BsaXQoJyYnKTtcblx0XHR2YXIgbGVuZ3RoID0gc3BsaXRzLmxlbmd0aDtcblx0XHR2YXIgdiwgbmFtZSwgdmFsdWU7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2ID0gc3BsaXRzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHRuYW1lID0gVVJJLmRlY29kZVF1ZXJ5KHYuc2hpZnQoKSwgZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHQvLyBubyBcIj1cIiBpcyBudWxsIGFjY29yZGluZyB0byBodHRwOi8vZHZjcy53My5vcmcvaGcvdXJsL3Jhdy1maWxlL3RpcC9PdmVydmlldy5odG1sI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHRcdHZhbHVlID0gdi5sZW5ndGggPyBVUkkuZGVjb2RlUXVlcnkodi5qb2luKCc9JyksIGVzY2FwZVF1ZXJ5U3BhY2UpIDogbnVsbDtcblxuXHRcdFx0aWYgKGhhc093bi5jYWxsKGl0ZW1zLCBuYW1lKSkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW1zW25hbWVdID09PSAnc3RyaW5nJyB8fCBpdGVtc1tuYW1lXSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGl0ZW1zW25hbWVdID0gW2l0ZW1zW25hbWVdXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1zW25hbWVdLnB1c2godmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXRlbXNbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbXM7XG5cdH07XG5cblx0VVJJLmJ1aWxkID0gZnVuY3Rpb24ocGFydHMpIHtcblx0XHR2YXIgdCA9ICcnO1xuXG5cdFx0aWYgKHBhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHBhcnRzLnByb3RvY29sICsgJzonO1xuXHRcdH1cblxuXHRcdGlmICghcGFydHMudXJuICYmICh0IHx8IHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnLy8nO1xuXHRcdH1cblxuXHRcdHQgKz0gKFVSSS5idWlsZEF1dGhvcml0eShwYXJ0cykgfHwgJycpO1xuXG5cdFx0aWYgKHR5cGVvZiBwYXJ0cy5wYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHBhcnRzLnBhdGguY2hhckF0KDApICE9PSAnLycgJiYgdHlwZW9mIHBhcnRzLmhvc3RuYW1lID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHR0ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0dCArPSBwYXJ0cy5wYXRoO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMucXVlcnkgPT09ICdzdHJpbmcnICYmIHBhcnRzLnF1ZXJ5KSB7XG5cdFx0XHR0ICs9ICc/JyArIHBhcnRzLnF1ZXJ5O1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgcGFydHMuZnJhZ21lbnQgPT09ICdzdHJpbmcnICYmIHBhcnRzLmZyYWdtZW50KSB7XG5cdFx0XHR0ICs9ICcjJyArIHBhcnRzLmZyYWdtZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkSG9zdCA9IGZ1bmN0aW9uKHBhcnRzKSB7XG5cdFx0dmFyIHQgPSAnJztcblxuXHRcdGlmICghcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9IGVsc2UgaWYgKFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHBhcnRzLmhvc3RuYW1lKSkge1xuXHRcdFx0dCArPSAnWycgKyBwYXJ0cy5ob3N0bmFtZSArICddJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dCArPSBwYXJ0cy5ob3N0bmFtZTtcblx0XHR9XG5cblx0XHRpZiAocGFydHMucG9ydCkge1xuXHRcdFx0dCArPSAnOicgKyBwYXJ0cy5wb3J0O1xuXHRcdH1cblxuXHRcdHJldHVybiB0O1xuXHR9O1xuXHRVUkkuYnVpbGRBdXRob3JpdHkgPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHJldHVybiBVUkkuYnVpbGRVc2VyaW5mbyhwYXJ0cykgKyBVUkkuYnVpbGRIb3N0KHBhcnRzKTtcblx0fTtcblx0VVJJLmJ1aWxkVXNlcmluZm8gPSBmdW5jdGlvbihwYXJ0cykge1xuXHRcdHZhciB0ID0gJyc7XG5cblx0XHRpZiAocGFydHMudXNlcm5hbWUpIHtcblx0XHRcdHQgKz0gVVJJLmVuY29kZShwYXJ0cy51c2VybmFtZSk7XG5cblx0XHRcdGlmIChwYXJ0cy5wYXNzd29yZCkge1xuXHRcdFx0XHR0ICs9ICc6JyArIFVSSS5lbmNvZGUocGFydHMucGFzc3dvcmQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0ICs9ICdAJztcblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBkdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIGVzY2FwZVF1ZXJ5U3BhY2UpIHtcblx0XHQvLyBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiBvciBodHRwOi8vbGFicy5hcGFjaGUub3JnL3dlYmFyY2gvdXJpL3JmYy9yZmMzOTg2Lmh0bWxcblx0XHQvLyBiZWluZyDCuy0uX34hJCYnKCkqKyw7PTpALz/CqyAlSEVYIGFuZCBhbG51bSBhcmUgYWxsb3dlZFxuXHRcdC8vIHRoZSBSRkMgZXhwbGljaXRseSBzdGF0ZXMgPy9mb28gYmVpbmcgYSB2YWxpZCB1c2UgY2FzZSwgbm8gbWVudGlvbiBvZiBwYXJhbWV0ZXIgc3ludGF4IVxuXHRcdC8vIFVSSS5qcyB0cmVhdHMgdGhlIHF1ZXJ5IHN0cmluZyBhcyBiZWluZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9pbnRlcmFjdC9mb3Jtcy5odG1sI2Zvcm0tY29udGVudC10eXBlXG5cblx0XHR2YXIgdCA9ICcnO1xuXHRcdHZhciB1bmlxdWUsIGtleSwgaSwgbGVuZ3RoO1xuXHRcdGZvciAoa2V5IGluIGRhdGEpIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChkYXRhLCBrZXkpICYmIGtleSkge1xuXHRcdFx0XHRpZiAoaXNBcnJheShkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0dW5pcXVlID0ge307XG5cdFx0XHRcdFx0Zm9yIChpID0gMCwgbGVuZ3RoID0gZGF0YVtrZXldLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YVtrZXldW2ldICE9PSB1bmRlZmluZWQgJiYgdW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHQgKz0gJyYnICsgVVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIoa2V5LCBkYXRhW2tleV1baV0sIGVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0XHRcdFx0XHRpZiAoZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlW2RhdGFba2V5XVtpXSArICcnXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0ICs9ICcmJyArIFVSSS5idWlsZFF1ZXJ5UGFyYW1ldGVyKGtleSwgZGF0YVtrZXldLCBlc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0LnN1YnN0cmluZygxKTtcblx0fTtcblx0VVJJLmJ1aWxkUXVlcnlQYXJhbWV0ZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgZXNjYXBlUXVlcnlTcGFjZSkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNmb3JtLWNvbnRlbnQtdHlwZSAtLSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcblx0XHQvLyBkb24ndCBhcHBlbmQgXCI9XCIgZm9yIG51bGwgdmFsdWVzLCBhY2NvcmRpbmcgdG8gaHR0cDovL2R2Y3MudzMub3JnL2hnL3VybC9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbCN1cmwtcGFyYW1ldGVyLXNlcmlhbGl6YXRpb25cblx0XHRyZXR1cm4gVVJJLmVuY29kZVF1ZXJ5KG5hbWUsIGVzY2FwZVF1ZXJ5U3BhY2UpICsgKHZhbHVlICE9PSBudWxsID8gJz0nICsgVVJJLmVuY29kZVF1ZXJ5KHZhbHVlLCBlc2NhcGVRdWVyeVNwYWNlKSA6ICcnKTtcblx0fTtcblxuXHRVUkkuYWRkUXVlcnkgPSBmdW5jdGlvbihkYXRhLCBuYW1lLCB2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAoZGF0YVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRhdGFbbmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGF0YVtuYW1lXSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IFtkYXRhW25hbWVdXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHR2YWx1ZSA9IFt2YWx1ZV07XG5cdFx0XHR9XG5cblx0XHRcdGRhdGFbbmFtZV0gPSAoZGF0YVtuYW1lXSB8fCBbXSkuY29uY2F0KHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmFkZFF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZyBhcyB0aGUgbmFtZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlKSB7XG5cdFx0dmFyIGksIGxlbmd0aCwga2V5O1xuXG5cdFx0aWYgKGlzQXJyYXkobmFtZSkpIHtcblx0XHRcdGZvciAoaSA9IDAsIGxlbmd0aCA9IG5hbWUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0ZGF0YVtuYW1lW2ldXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGdldFR5cGUobmFtZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBkYXRhKSB7XG5cdFx0XHRcdGlmIChuYW1lLnRlc3Qoa2V5KSkge1xuXHRcdFx0XHRcdGRhdGFba2V5XSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0VVJJLnJlbW92ZVF1ZXJ5KGRhdGEsIGtleSwgbmFtZVtrZXldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pICYmIHZhbHVlLnRlc3QoZGF0YVtuYW1lXSkpIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFbbmFtZV0gPSBmaWx0ZXJBcnJheVZhbHVlcyhkYXRhW25hbWVdLCB2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGFbbmFtZV0gPT09IFN0cmluZyh2YWx1ZSkgJiYgKCFpc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDEpKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0ZGF0YVtuYW1lXSA9IGZpbHRlckFycmF5VmFsdWVzKGRhdGFbbmFtZV0sIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVtuYW1lXSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLnJlbW92ZVF1ZXJ5KCkgYWNjZXB0cyBhbiBvYmplY3QsIHN0cmluZywgUmVnRXhwIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cdFVSSS5oYXNRdWVyeSA9IGZ1bmN0aW9uKGRhdGEsIG5hbWUsIHZhbHVlLCB3aXRoaW5BcnJheSkge1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0aWYgKCFVUkkuaGFzUXVlcnkoZGF0YSwga2V5LCBuYW1lW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdVUkkuaGFzUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlcicpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoZ2V0VHlwZSh2YWx1ZSkpIHtcblx0XHRcdGNhc2UgJ1VuZGVmaW5lZCc6XG5cdFx0XHRcdC8vIHRydWUgaWYgZXhpc3RzIChidXQgbWF5IGJlIGVtcHR5KVxuXHRcdFx0XHRyZXR1cm4gbmFtZSBpbiBkYXRhOyAvLyBkYXRhW25hbWVdICE9PSB1bmRlZmluZWQ7XG5cblx0XHRcdGNhc2UgJ0Jvb2xlYW4nOlxuXHRcdFx0XHQvLyB0cnVlIGlmIGV4aXN0cyBhbmQgbm9uLWVtcHR5XG5cdFx0XHRcdHZhciBfYm9vbHkgPSBCb29sZWFuKGlzQXJyYXkoZGF0YVtuYW1lXSkgPyBkYXRhW25hbWVdLmxlbmd0aCA6IGRhdGFbbmFtZV0pO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IF9ib29seTtcblxuXHRcdFx0Y2FzZSAnRnVuY3Rpb24nOlxuXHRcdFx0XHQvLyBhbGxvdyBjb21wbGV4IGNvbXBhcmlzb25cblx0XHRcdFx0cmV0dXJuICEhdmFsdWUoZGF0YVtuYW1lXSwgbmFtZSwgZGF0YSk7XG5cblx0XHRcdGNhc2UgJ0FycmF5Jzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG9wID0gd2l0aGluQXJyYXkgPyBhcnJheUNvbnRhaW5zIDogYXJyYXlzRXF1YWw7XG5cdFx0XHRcdHJldHVybiBvcChkYXRhW25hbWVdLCB2YWx1ZSk7XG5cblx0XHRcdGNhc2UgJ1JlZ0V4cCc6XG5cdFx0XHRcdGlmICghaXNBcnJheShkYXRhW25hbWVdKSkge1xuXHRcdFx0XHRcdHJldHVybiBCb29sZWFuKGRhdGFbbmFtZV0gJiYgZGF0YVtuYW1lXS5tYXRjaCh2YWx1ZSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0Y2FzZSAnTnVtYmVyJzpcblx0XHRcdFx0dmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0LyogZmFsbHMgdGhyb3VnaCAqL1xuXHRcdFx0Y2FzZSAnU3RyaW5nJzpcblx0XHRcdFx0aWYgKCFpc0FycmF5KGRhdGFbbmFtZV0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGFbbmFtZV0gPT09IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF3aXRoaW5BcnJheSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheUNvbnRhaW5zKGRhdGFbbmFtZV0sIHZhbHVlKTtcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVVJJLmhhc1F1ZXJ5KCkgYWNjZXB0cyB1bmRlZmluZWQsIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyLCBSZWdFeHAsIEZ1bmN0aW9uIGFzIHRoZSB2YWx1ZSBwYXJhbWV0ZXInKTtcblx0XHR9XG5cdH07XG5cblxuXHRVUkkuY29tbW9uUGF0aCA9IGZ1bmN0aW9uKG9uZSwgdHdvKSB7XG5cdFx0dmFyIGxlbmd0aCA9IE1hdGgubWluKG9uZS5sZW5ndGgsIHR3by5sZW5ndGgpO1xuXHRcdHZhciBwb3M7XG5cblx0XHQvLyBmaW5kIGZpcnN0IG5vbi1tYXRjaGluZyBjaGFyYWN0ZXJcblx0XHRmb3IgKHBvcyA9IDA7IHBvcyA8IGxlbmd0aDsgcG9zKyspIHtcblx0XHRcdGlmIChvbmUuY2hhckF0KHBvcykgIT09IHR3by5jaGFyQXQocG9zKSkge1xuXHRcdFx0XHRwb3MtLTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHBvcyA8IDEpIHtcblx0XHRcdHJldHVybiBvbmUuY2hhckF0KDApID09PSB0d28uY2hhckF0KDApICYmIG9uZS5jaGFyQXQoMCkgPT09ICcvJyA/ICcvJyA6ICcnO1xuXHRcdH1cblxuXHRcdC8vIHJldmVydCB0byBsYXN0IC9cblx0XHRpZiAob25lLmNoYXJBdChwb3MpICE9PSAnLycgfHwgdHdvLmNoYXJBdChwb3MpICE9PSAnLycpIHtcblx0XHRcdHBvcyA9IG9uZS5zdWJzdHJpbmcoMCwgcG9zKS5sYXN0SW5kZXhPZignLycpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvbmUuc3Vic3RyaW5nKDAsIHBvcyArIDEpO1xuXHR9O1xuXG5cdFVSSS53aXRoaW5TdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblx0XHR2YXIgX3N0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCBVUkkuZmluZFVyaS5zdGFydDtcblx0XHR2YXIgX2VuZCA9IG9wdGlvbnMuZW5kIHx8IFVSSS5maW5kVXJpLmVuZDtcblx0XHR2YXIgX3RyaW0gPSBvcHRpb25zLnRyaW0gfHwgVVJJLmZpbmRVcmkudHJpbTtcblx0XHR2YXIgX2F0dHJpYnV0ZU9wZW4gPSAvW2EtejAtOS1dPVtcIiddPyQvaTtcblxuXHRcdF9zdGFydC5sYXN0SW5kZXggPSAwO1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHR2YXIgbWF0Y2ggPSBfc3RhcnQuZXhlYyhzdHJpbmcpO1xuXHRcdFx0aWYgKCFtYXRjaCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN0YXJ0ID0gbWF0Y2guaW5kZXg7XG5cdFx0XHRpZiAob3B0aW9ucy5pZ25vcmVIdG1sKSB7XG5cdFx0XHRcdC8vIGF0dHJpYnV0KGU9W1wiJ10/JClcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZU9wZW4gPSBzdHJpbmcuc2xpY2UoTWF0aC5tYXgoc3RhcnQgLSAzLCAwKSwgc3RhcnQpO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlT3BlbiAmJiBfYXR0cmlidXRlT3Blbi50ZXN0KGF0dHJpYnV0ZU9wZW4pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dmFyIGVuZCA9IHN0YXJ0ICsgc3RyaW5nLnNsaWNlKHN0YXJ0KS5zZWFyY2goX2VuZCk7XG5cdFx0XHR2YXIgc2xpY2UgPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGVuZCkucmVwbGFjZShfdHJpbSwgJycpO1xuXHRcdFx0aWYgKG9wdGlvbnMuaWdub3JlICYmIG9wdGlvbnMuaWdub3JlLnRlc3Qoc2xpY2UpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRlbmQgPSBzdGFydCArIHNsaWNlLmxlbmd0aDtcblx0XHRcdHZhciByZXN1bHQgPSBjYWxsYmFjayhzbGljZSwgc3RhcnQsIGVuZCwgc3RyaW5nKTtcblx0XHRcdHN0cmluZyA9IHN0cmluZy5zbGljZSgwLCBzdGFydCkgKyByZXN1bHQgKyBzdHJpbmcuc2xpY2UoZW5kKTtcblx0XHRcdF9zdGFydC5sYXN0SW5kZXggPSBzdGFydCArIHJlc3VsdC5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0X3N0YXJ0Lmxhc3RJbmRleCA9IDA7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fTtcblxuXHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSA9IGZ1bmN0aW9uKHYpIHtcblx0XHQvLyBUaGVvcmV0aWNhbGx5IFVSSXMgYWxsb3cgcGVyY2VudC1lbmNvZGluZyBpbiBIb3N0bmFtZXMgKGFjY29yZGluZyB0byBSRkMgMzk4Nilcblx0XHQvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBETlMgYW5kIHRoZXJlZm9yZSBpZ25vcmVkIGJ5IFVSSS5qc1xuXG5cdFx0aWYgKHYubWF0Y2goVVJJLmludmFsaWRfaG9zdG5hbWVfY2hhcmFjdGVycykpIHtcblx0XHRcdC8vIHRlc3QgcHVueWNvZGVcblx0XHRcdGlmICghcHVueWNvZGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXSBhbmQgUHVueWNvZGUuanMgaXMgbm90IGF2YWlsYWJsZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocHVueWNvZGUudG9BU0NJSSh2KS5tYXRjaChVUkkuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIG5vQ29uZmxpY3Rcblx0VVJJLm5vQ29uZmxpY3QgPSBmdW5jdGlvbihyZW1vdmVBbGwpIHtcblx0XHRpZiAocmVtb3ZlQWxsKSB7XG5cdFx0XHR2YXIgdW5jb25mbGljdGVkID0ge1xuXHRcdFx0XHRVUkk6IHRoaXMubm9Db25mbGljdCgpXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocm9vdC5VUklUZW1wbGF0ZSAmJiB0eXBlb2Ygcm9vdC5VUklUZW1wbGF0ZS5ub0NvbmZsaWN0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHVuY29uZmxpY3RlZC5VUklUZW1wbGF0ZSA9IHJvb3QuVVJJVGVtcGxhdGUubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdC5JUHY2ICYmIHR5cGVvZiByb290LklQdjYubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuSVB2NiA9IHJvb3QuSVB2Ni5ub0NvbmZsaWN0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290LlNlY29uZExldmVsRG9tYWlucyAmJiB0eXBlb2Ygcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR1bmNvbmZsaWN0ZWQuU2Vjb25kTGV2ZWxEb21haW5zID0gcm9vdC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5jb25mbGljdGVkO1xuXHRcdH0gZWxzZSBpZiAocm9vdC5VUkkgPT09IHRoaXMpIHtcblx0XHRcdHJvb3QuVVJJID0gX1VSSTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmJ1aWxkID0gZnVuY3Rpb24oZGVmZXJCdWlsZCkge1xuXHRcdGlmIChkZWZlckJ1aWxkID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChkZWZlckJ1aWxkID09PSB1bmRlZmluZWQgfHwgdGhpcy5fZGVmZXJyZWRfYnVpbGQpIHtcblx0XHRcdHRoaXMuX3N0cmluZyA9IFVSSS5idWlsZCh0aGlzLl9wYXJ0cyk7XG5cdFx0XHR0aGlzLl9kZWZlcnJlZF9idWlsZCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAuY2xvbmUgPSBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IFVSSSh0aGlzKTtcblx0fTtcblxuXHRwLnZhbHVlT2YgPSBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYnVpbGQoZmFsc2UpLl9zdHJpbmc7XG5cdH07XG5cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKF9wYXJ0KXtcblx0XHRyZXR1cm4gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzW19wYXJ0XSB8fCAnJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzW19wYXJ0XSA9IHYgfHwgbnVsbDtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVQcmVmaXhBY2Nlc3NvcihfcGFydCwgX2tleSl7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0c1tfcGFydF0gfHwgJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodiAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHYgPSB2ICsgJyc7XG5cdFx0XHRcdFx0aWYgKHYuY2hhckF0KDApID09PSBfa2V5KSB7XG5cdFx0XHRcdFx0XHR2ID0gdi5zdWJzdHJpbmcoMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fcGFydHNbX3BhcnRdID0gdjtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0cC5wcm90b2NvbCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3Byb3RvY29sJyk7XG5cdHAudXNlcm5hbWUgPSBnZW5lcmF0ZVNpbXBsZUFjY2Vzc29yKCd1c2VybmFtZScpO1xuXHRwLnBhc3N3b3JkID0gZ2VuZXJhdGVTaW1wbGVBY2Nlc3NvcigncGFzc3dvcmQnKTtcblx0cC5ob3N0bmFtZSA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ2hvc3RuYW1lJyk7XG5cdHAucG9ydCA9IGdlbmVyYXRlU2ltcGxlQWNjZXNzb3IoJ3BvcnQnKTtcblx0cC5xdWVyeSA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ3F1ZXJ5JywgJz8nKTtcblx0cC5mcmFnbWVudCA9IGdlbmVyYXRlUHJlZml4QWNjZXNzb3IoJ2ZyYWdtZW50JywgJyMnKTtcblxuXHRwLnNlYXJjaCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0dmFyIHQgPSB0aGlzLnF1ZXJ5KHYsIGJ1aWxkKTtcblx0XHRyZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnICYmIHQubGVuZ3RoID8gKCc/JyArIHQpIDogdDtcblx0fTtcblx0cC5oYXNoID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgdCA9IHRoaXMuZnJhZ21lbnQodiwgYnVpbGQpO1xuXHRcdHJldHVybiB0eXBlb2YgdCA9PT0gJ3N0cmluZycgJiYgdC5sZW5ndGggPyAoJyMnICsgdCkgOiB0O1xuXHR9O1xuXG5cdHAucGF0aG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGggfHwgKHRoaXMuX3BhcnRzLmhvc3RuYW1lID8gJy8nIDogJycpO1xuXHRcdFx0cmV0dXJuIHYgPyAodGhpcy5fcGFydHMudXJuID8gVVJJLmRlY29kZVVyblBhdGggOiBVUkkuZGVjb2RlUGF0aCkocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVVcm5QYXRoKHYpIDogJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdiA/IFVSSS5yZWNvZGVQYXRoKHYpIDogJy8nO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnBhdGggPSBwLnBhdGhuYW1lO1xuXHRwLmhyZWYgPSBmdW5jdGlvbihocmVmLCBidWlsZCkge1xuXHRcdHZhciBrZXk7XG5cblx0XHRpZiAoaHJlZiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3N0cmluZyA9ICcnO1xuXHRcdHRoaXMuX3BhcnRzID0gVVJJLl9wYXJ0cygpO1xuXG5cdFx0dmFyIF9VUkkgPSBocmVmIGluc3RhbmNlb2YgVVJJO1xuXHRcdHZhciBfb2JqZWN0ID0gdHlwZW9mIGhyZWYgPT09ICdvYmplY3QnICYmIChocmVmLmhvc3RuYW1lIHx8IGhyZWYucGF0aCB8fCBocmVmLnBhdGhuYW1lKTtcblx0XHRpZiAoaHJlZi5ub2RlTmFtZSkge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IFVSSS5nZXREb21BdHRyaWJ1dGUoaHJlZik7XG5cdFx0XHRocmVmID0gaHJlZlthdHRyaWJ1dGVdIHx8ICcnO1xuXHRcdFx0X29iamVjdCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIHdpbmRvdy5sb2NhdGlvbiBpcyByZXBvcnRlZCB0byBiZSBhbiBvYmplY3QsIGJ1dCBpdCdzIG5vdCB0aGUgc29ydFxuXHRcdC8vIG9mIG9iamVjdCB3ZSdyZSBsb29raW5nIGZvcjpcblx0XHQvLyAqIGxvY2F0aW9uLnByb3RvY29sIGVuZHMgd2l0aCBhIGNvbG9uXG5cdFx0Ly8gKiBsb2NhdGlvbi5xdWVyeSAhPSBvYmplY3Quc2VhcmNoXG5cdFx0Ly8gKiBsb2NhdGlvbi5oYXNoICE9IG9iamVjdC5mcmFnbWVudFxuXHRcdC8vIHNpbXBseSBzZXJpYWxpemluZyB0aGUgdW5rbm93biBvYmplY3Qgc2hvdWxkIGRvIHRoZSB0cmlja1xuXHRcdC8vIChmb3IgbG9jYXRpb24sIG5vdCBmb3IgZXZlcnl0aGluZy4uLilcblx0XHRpZiAoIV9VUkkgJiYgX29iamVjdCAmJiBocmVmLnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGhyZWYgPSBocmVmLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBocmVmID09PSAnc3RyaW5nJyB8fCBocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cyA9IFVSSS5wYXJzZShTdHJpbmcoaHJlZiksIHRoaXMuX3BhcnRzKTtcblx0XHR9IGVsc2UgaWYgKF9VUkkgfHwgX29iamVjdCkge1xuXHRcdFx0dmFyIHNyYyA9IF9VUkkgPyBocmVmLl9wYXJ0cyA6IGhyZWY7XG5cdFx0XHRmb3IgKGtleSBpbiBzcmMpIHtcblx0XHRcdFx0aWYgKGhhc093bi5jYWxsKHRoaXMuX3BhcnRzLCBrZXkpKSB7XG5cdFx0XHRcdFx0dGhpcy5fcGFydHNba2V5XSA9IHNyY1trZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgaW5wdXQnKTtcblx0XHR9XG5cblx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0Ly8gaWRlbnRpZmljYXRpb24gYWNjZXNzb3JzXG5cdHAuaXMgPSBmdW5jdGlvbih3aGF0KSB7XG5cdFx0dmFyIGlwID0gZmFsc2U7XG5cdFx0dmFyIGlwNCA9IGZhbHNlO1xuXHRcdHZhciBpcDYgPSBmYWxzZTtcblx0XHR2YXIgbmFtZSA9IGZhbHNlO1xuXHRcdHZhciBzbGQgPSBmYWxzZTtcblx0XHR2YXIgaWRuID0gZmFsc2U7XG5cdFx0dmFyIHB1bnljb2RlID0gZmFsc2U7XG5cdFx0dmFyIHJlbGF0aXZlID0gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0cmVsYXRpdmUgPSBmYWxzZTtcblx0XHRcdGlwNCA9IFVSSS5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwNiA9IFVSSS5pcDZfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlwID0gaXA0IHx8IGlwNjtcblx0XHRcdG5hbWUgPSAhaXA7XG5cdFx0XHRzbGQgPSBuYW1lICYmIFNMRCAmJiBTTEQuaGFzKHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdGlkbiA9IG5hbWUgJiYgVVJJLmlkbl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdFx0cHVueWNvZGUgPSBuYW1lICYmIFVSSS5wdW55Y29kZV9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAod2hhdC50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRjYXNlICdyZWxhdGl2ZSc6XG5cdFx0XHRcdHJldHVybiByZWxhdGl2ZTtcblxuXHRcdFx0Y2FzZSAnYWJzb2x1dGUnOlxuXHRcdFx0XHRyZXR1cm4gIXJlbGF0aXZlO1xuXG5cdFx0XHQvLyBob3N0bmFtZSBpZGVudGlmaWNhdGlvblxuXHRcdFx0Y2FzZSAnZG9tYWluJzpcblx0XHRcdGNhc2UgJ25hbWUnOlxuXHRcdFx0XHRyZXR1cm4gbmFtZTtcblxuXHRcdFx0Y2FzZSAnc2xkJzpcblx0XHRcdFx0cmV0dXJuIHNsZDtcblxuXHRcdFx0Y2FzZSAnaXAnOlxuXHRcdFx0XHRyZXR1cm4gaXA7XG5cblx0XHRcdGNhc2UgJ2lwNCc6XG5cdFx0XHRjYXNlICdpcHY0Jzpcblx0XHRcdGNhc2UgJ2luZXQ0Jzpcblx0XHRcdFx0cmV0dXJuIGlwNDtcblxuXHRcdFx0Y2FzZSAnaXA2Jzpcblx0XHRcdGNhc2UgJ2lwdjYnOlxuXHRcdFx0Y2FzZSAnaW5ldDYnOlxuXHRcdFx0XHRyZXR1cm4gaXA2O1xuXG5cdFx0XHRjYXNlICdpZG4nOlxuXHRcdFx0XHRyZXR1cm4gaWRuO1xuXG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0XHRyZXR1cm4gIXRoaXMuX3BhcnRzLnVybjtcblxuXHRcdFx0Y2FzZSAndXJuJzpcblx0XHRcdFx0cmV0dXJuICEhdGhpcy5fcGFydHMudXJuO1xuXG5cdFx0XHRjYXNlICdwdW55Y29kZSc6XG5cdFx0XHRcdHJldHVybiBwdW55Y29kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcblxuXHQvLyBjb21wb25lbnQgc3BlY2lmaWMgaW5wdXQgdmFsaWRhdGlvblxuXHR2YXIgX3Byb3RvY29sID0gcC5wcm90b2NvbDtcblx0dmFyIF9wb3J0ID0gcC5wb3J0O1xuXHR2YXIgX2hvc3RuYW1lID0gcC5ob3N0bmFtZTtcblxuXHRwLnByb3RvY29sID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHQvLyBhY2NlcHQgdHJhaWxpbmcgOi8vXG5cdFx0XHRcdHYgPSB2LnJlcGxhY2UoLzooXFwvXFwvKT8kLywgJycpO1xuXG5cdFx0XHRcdGlmICghdi5tYXRjaChVUkkucHJvdG9jb2xfZXhwcmVzc2lvbikpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm90b2NvbCBcIicgKyB2ICsgJ1wiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2VzblxcJ3Qgc3RhcnQgd2l0aCBbQS1aXScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBfcHJvdG9jb2wuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuc2NoZW1lID0gcC5wcm90b2NvbDtcblx0cC5wb3J0ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh2ID09PSAwKSB7XG5cdFx0XHRcdHYgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHR2ICs9ICcnO1xuXHRcdFx0XHRpZiAodi5jaGFyQXQoMCkgPT09ICc6Jykge1xuXHRcdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2Lm1hdGNoKC9bXjAtOV0vKSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1BvcnQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gWzAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gX3BvcnQuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cdHAuaG9zdG5hbWUgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFyIHggPSB7fTtcblx0XHRcdHZhciByZXMgPSBVUkkucGFyc2VIb3N0KHYsIHgpO1xuXHRcdFx0aWYgKHJlcyAhPT0gJy8nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0hvc3RuYW1lIFwiJyArIHYgKyAnXCIgY29udGFpbnMgY2hhcmFjdGVycyBvdGhlciB0aGFuIFtBLVowLTkuLV0nKTtcblx0XHRcdH1cblxuXHRcdFx0diA9IHguaG9zdG5hbWU7XG5cdFx0fVxuXHRcdHJldHVybiBfaG9zdG5hbWUuY2FsbCh0aGlzLCB2LCBidWlsZCk7XG5cdH07XG5cblx0Ly8gY29tcG91bmQgYWNjZXNzb3JzXG5cdHAub3JpZ2luID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2woKTtcblx0XHRcdHZhciBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eSgpO1xuXHRcdFx0aWYgKCFhdXRob3JpdHkpIHJldHVybiAnJztcblx0XHRcdHJldHVybiAocHJvdG9jb2wgPyBwcm90b2NvbCArICc6Ly8nIDogJycpICsgdGhpcy5hdXRob3JpdHkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG9yaWdpbiA9IFVSSSh2KTtcblx0XHRcdHRoaXNcblx0XHRcdFx0LnByb3RvY29sKG9yaWdpbi5wcm90b2NvbCgpKVxuXHRcdFx0XHQuYXV0aG9yaXR5KG9yaWdpbi5hdXRob3JpdHkoKSlcblx0XHRcdFx0LmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuaG9zdCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUgPyBVUkkuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKSA6ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgcmVzID0gVVJJLnBhcnNlSG9zdCh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuYXV0aG9yaXR5ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/IFVSSS5idWlsZEF1dGhvcml0eSh0aGlzLl9wYXJ0cykgOiAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHJlcyA9IFVSSS5wYXJzZUF1dGhvcml0eSh2LCB0aGlzLl9wYXJ0cyk7XG5cdFx0XHRpZiAocmVzICE9PSAnLycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSG9zdG5hbWUgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOS4tXScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAudXNlcmluZm8gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy51c2VybmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciB0ID0gVVJJLmJ1aWxkVXNlcmluZm8odGhpcy5fcGFydHMpO1xuXHRcdFx0cmV0dXJuIHQuc3Vic3RyaW5nKDAsIHQubGVuZ3RoIC0xKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHZbdi5sZW5ndGgtMV0gIT09ICdAJykge1xuXHRcdFx0XHR2ICs9ICdAJztcblx0XHRcdH1cblxuXHRcdFx0VVJJLnBhcnNlVXNlcmluZm8odiwgdGhpcy5fcGFydHMpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnJlc291cmNlID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHR2YXIgcGFydHM7XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXRoKCkgKyB0aGlzLnNlYXJjaCgpICsgdGhpcy5oYXNoKCk7XG5cdFx0fVxuXG5cdFx0cGFydHMgPSBVUkkucGFyc2Uodik7XG5cdFx0dGhpcy5fcGFydHMucGF0aCA9IHBhcnRzLnBhdGg7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBwYXJ0cy5xdWVyeTtcblx0XHR0aGlzLl9wYXJ0cy5mcmFnbWVudCA9IHBhcnRzLmZyYWdtZW50O1xuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvLyBmcmFjdGlvbiBhY2Nlc3NvcnNcblx0cC5zdWJkb21haW4gPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVuaWVuY2UsIHJldHVybiBcInd3d1wiIGZyb20gXCJ3d3cuZXhhbXBsZS5vcmdcIlxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGdyYWIgZG9tYWluIGFuZCBhZGQgYW5vdGhlciBzZWdtZW50XG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoIC0gdGhpcy5kb21haW4oKS5sZW5ndGggLSAxO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlbmQpIHx8ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aCAtIHRoaXMuZG9tYWluKCkubGVuZ3RoO1xuXHRcdFx0dmFyIHN1YiA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZygwLCBlKTtcblx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cCgnXicgKyBlc2NhcGVSZWdFeChzdWIpKTtcblxuXHRcdFx0aWYgKHYgJiYgdi5jaGFyQXQodi5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG5cdFx0XHRcdHYgKz0gJy4nO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLmRvbWFpbiA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBjb252ZW5pZW5jZSwgcmV0dXJuIFwiZXhhbXBsZS5vcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiBob3N0bmFtZSBjb25zaXN0cyBvZiAxIG9yIDIgc2VnbWVudHMsIGl0IG11c3QgYmUgdGhlIGRvbWFpblxuXHRcdFx0dmFyIHQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5tYXRjaCgvXFwuL2cpO1xuXHRcdFx0aWYgKHQgJiYgdC5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZ3JhYiB0bGQgYW5kIGFkZCBhbm90aGVyIHNlZ21lbnRcblx0XHRcdHZhciBlbmQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGggLSB0aGlzLnRsZChidWlsZCkubGVuZ3RoIC0gMTtcblx0XHRcdGVuZCA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKCcuJywgZW5kIC0xKSArIDE7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKGVuZCkgfHwgJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdikge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IGRvbWFpbiBlbXB0eScpO1xuXHRcdFx0fVxuXG5cdFx0XHRVUkkuZW5zdXJlVmFsaWRIb3N0bmFtZSh2KTtcblxuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZSB8fCB0aGlzLmlzKCdJUCcpKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciByZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCh0aGlzLmRvbWFpbigpKSArICckJyk7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHR9O1xuXHRwLnRsZCA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHYgPT09ICdib29sZWFuJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyByZXR1cm4gXCJvcmdcIiBmcm9tIFwid3d3LmV4YW1wbGUub3JnXCJcblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLmhvc3RuYW1lIHx8IHRoaXMuaXMoJ0lQJykpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMuaG9zdG5hbWUubGFzdEluZGV4T2YoJy4nKTtcblx0XHRcdHZhciB0bGQgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcocG9zICsgMSk7XG5cblx0XHRcdGlmIChidWlsZCAhPT0gdHJ1ZSAmJiBTTEQgJiYgU0xELmxpc3RbdGxkLnRvTG93ZXJDYXNlKCldKSB7XG5cdFx0XHRcdHJldHVybiBTTEQuZ2V0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSB8fCB0bGQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0bGQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciByZXBsYWNlO1xuXG5cdFx0XHRpZiAoIXYpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBUTEQgZW1wdHknKTtcblx0XHRcdH0gZWxzZSBpZiAodi5tYXRjaCgvW15hLXpBLVowLTktXS8pKSB7XG5cdFx0XHRcdGlmIChTTEQgJiYgU0xELmlzKHYpKSB7XG5cdFx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gdGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdUTEQgXCInICsgdiArICdcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOV0nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5fcGFydHMuaG9zdG5hbWUgfHwgdGhpcy5pcygnSVAnKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2Nhbm5vdCBzZXQgVExEIG9uIG5vbi1kb21haW4gaG9zdCcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy50bGQoKSkgKyAnJCcpO1xuXHRcdFx0XHR0aGlzLl9wYXJ0cy5ob3N0bmFtZSA9IHRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5kaXJlY3RvcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHJldHVybiB2ID09PSB1bmRlZmluZWQgPyAnJyA6IHRoaXM7XG5cdFx0fVxuXG5cdFx0aWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3BhcnRzLnBhdGggJiYgIXRoaXMuX3BhcnRzLmhvc3RuYW1lKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJy8nO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZW5kID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoIC0gMTtcblx0XHRcdHZhciByZXMgPSB0aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZygwLCBlbmQpIHx8ICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSA/ICcvJyA6ICcnKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aChyZXMpIDogcmVzO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBlID0gdGhpcy5fcGFydHMucGF0aC5sZW5ndGggLSB0aGlzLmZpbGVuYW1lKCkubGVuZ3RoO1xuXHRcdFx0dmFyIGRpcmVjdG9yeSA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKDAsIGUpO1xuXHRcdFx0dmFyIHJlcGxhY2UgPSBuZXcgUmVnRXhwKCdeJyArIGVzY2FwZVJlZ0V4KGRpcmVjdG9yeSkpO1xuXG5cdFx0XHQvLyBmdWxseSBxdWFsaWZpZXIgZGlyZWN0b3JpZXMgYmVnaW4gd2l0aCBhIHNsYXNoXG5cdFx0XHRpZiAoIXRoaXMuaXMoJ3JlbGF0aXZlJykpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0diA9ICcvJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2LmNoYXJBdCgwKSAhPT0gJy8nKSB7XG5cdFx0XHRcdFx0diA9ICcvJyArIHY7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGlyZWN0b3JpZXMgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcblx0XHRcdGlmICh2ICYmIHYuY2hhckF0KHYubGVuZ3RoIC0gMSkgIT09ICcvJykge1xuXHRcdFx0XHR2ICs9ICcvJztcblx0XHRcdH1cblxuXHRcdFx0diA9IFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0dGhpcy5fcGFydHMucGF0aCA9IHRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShyZXBsYWNlLCB2KTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5maWxlbmFtZSA9IGZ1bmN0aW9uKHYsIGJ1aWxkKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHYgPT09IHVuZGVmaW5lZCA/ICcnIDogdGhpcztcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IHRydWUpIHtcblx0XHRcdGlmICghdGhpcy5fcGFydHMucGF0aCB8fCB0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zID0gdGhpcy5fcGFydHMucGF0aC5sYXN0SW5kZXhPZignLycpO1xuXHRcdFx0dmFyIHJlcyA9IHRoaXMuX3BhcnRzLnBhdGguc3Vic3RyaW5nKHBvcysxKTtcblxuXHRcdFx0cmV0dXJuIHYgPyBVUkkuZGVjb2RlUGF0aFNlZ21lbnQocmVzKSA6IHJlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIG11dGF0ZWREaXJlY3RvcnkgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHYuY2hhckF0KDApID09PSAnLycpIHtcblx0XHRcdFx0diA9IHYuc3Vic3RyaW5nKDEpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodi5tYXRjaCgvXFwuP1xcLy8pKSB7XG5cdFx0XHRcdG11dGF0ZWREaXJlY3RvcnkgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXgodGhpcy5maWxlbmFtZSgpKSArICckJyk7XG5cdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gdGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKHJlcGxhY2UsIHYpO1xuXG5cdFx0XHRpZiAobXV0YXRlZERpcmVjdG9yeSkge1xuXHRcdFx0XHR0aGlzLm5vcm1hbGl6ZVBhdGgoYnVpbGQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdH07XG5cdHAuc3VmZml4ID0gZnVuY3Rpb24odiwgYnVpbGQpIHtcblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHRyZXR1cm4gdiA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5wYXRoIHx8IHRoaXMuX3BhcnRzLnBhdGggPT09ICcvJykge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmaWxlbmFtZSA9IHRoaXMuZmlsZW5hbWUoKTtcblx0XHRcdHZhciBwb3MgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpO1xuXHRcdFx0dmFyIHMsIHJlcztcblxuXHRcdFx0aWYgKHBvcyA9PT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBzdWZmaXggbWF5IG9ubHkgY29udGFpbiBhbG51bSBjaGFyYWN0ZXJzICh5dXAsIEkgbWFkZSB0aGlzIHVwLilcblx0XHRcdHMgPSBmaWxlbmFtZS5zdWJzdHJpbmcocG9zKzEpO1xuXHRcdFx0cmVzID0gKC9eW2EtejAtOSVdKyQvaSkudGVzdChzKSA/IHMgOiAnJztcblx0XHRcdHJldHVybiB2ID8gVVJJLmRlY29kZVBhdGhTZWdtZW50KHJlcykgOiByZXM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh2LmNoYXJBdCgwKSA9PT0gJy4nKSB7XG5cdFx0XHRcdHYgPSB2LnN1YnN0cmluZygxKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHN1ZmZpeCA9IHRoaXMuc3VmZml4KCk7XG5cdFx0XHR2YXIgcmVwbGFjZTtcblxuXHRcdFx0aWYgKCFzdWZmaXgpIHtcblx0XHRcdFx0aWYgKCF2KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9wYXJ0cy5wYXRoICs9ICcuJyArIFVSSS5yZWNvZGVQYXRoKHYpO1xuXHRcdFx0fSBlbHNlIGlmICghdikge1xuXHRcdFx0XHRyZXBsYWNlID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeCgnLicgKyBzdWZmaXgpICsgJyQnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4KHN1ZmZpeCkgKyAnJCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVwbGFjZSkge1xuXHRcdFx0XHR2ID0gVVJJLnJlY29kZVBhdGgodik7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSB0aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UocmVwbGFjZSwgdik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0fTtcblx0cC5zZWdtZW50ID0gZnVuY3Rpb24oc2VnbWVudCwgdiwgYnVpbGQpIHtcblx0XHR2YXIgc2VwYXJhdG9yID0gdGhpcy5fcGFydHMudXJuID8gJzonIDogJy8nO1xuXHRcdHZhciBwYXRoID0gdGhpcy5wYXRoKCk7XG5cdFx0dmFyIGFic29sdXRlID0gcGF0aC5zdWJzdHJpbmcoMCwgMSkgPT09ICcvJztcblx0XHR2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KHNlcGFyYXRvcik7XG5cblx0XHRpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzZWdtZW50ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YnVpbGQgPSB2O1xuXHRcdFx0diA9IHNlZ21lbnQ7XG5cdFx0XHRzZWdtZW50ID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHNlZ21lbnQgIT09ICdudW1iZXInKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0JhZCBzZWdtZW50IFwiJyArIHNlZ21lbnQgKyAnXCIsIG11c3QgYmUgMC1iYXNlZCBpbnRlZ2VyJyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFic29sdXRlKSB7XG5cdFx0XHRzZWdtZW50cy5zaGlmdCgpO1xuXHRcdH1cblxuXHRcdGlmIChzZWdtZW50IDwgMCkge1xuXHRcdFx0Ly8gYWxsb3cgbmVnYXRpdmUgaW5kZXhlcyB0byBhZGRyZXNzIGZyb20gdGhlIGVuZFxuXHRcdFx0c2VnbWVudCA9IE1hdGgubWF4KHNlZ21lbnRzLmxlbmd0aCArIHNlZ21lbnQsIDApO1xuXHRcdH1cblxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiB0cnVlICovXG5cdFx0XHRyZXR1cm4gc2VnbWVudCA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gc2VnbWVudHNcblx0XHRcdFx0OiBzZWdtZW50c1tzZWdtZW50XTtcblx0XHRcdC8qanNoaW50IGxheGJyZWFrOiBmYWxzZSAqL1xuXHRcdH0gZWxzZSBpZiAoc2VnbWVudCA9PT0gbnVsbCB8fCBzZWdtZW50c1tzZWdtZW50XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXNBcnJheSh2KSkge1xuXHRcdFx0XHRzZWdtZW50cyA9IFtdO1xuXHRcdFx0XHQvLyBjb2xsYXBzZSBlbXB0eSBlbGVtZW50cyB3aXRoaW4gYXJyYXlcblx0XHRcdFx0Zm9yICh2YXIgaT0wLCBsPXYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKCF2W2ldLmxlbmd0aCAmJiAoIXNlZ21lbnRzLmxlbmd0aCB8fCAhc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXS5sZW5ndGgpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoc2VnbWVudHMubGVuZ3RoICYmICFzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLTFdLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0c2VnbWVudHMucG9wKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh0cmltU2xhc2hlcyh2W2ldKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodiB8fCB0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0diA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0XHRpZiAoc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9PT0gJycpIHtcblx0XHRcdFx0XHQvLyBlbXB0eSB0cmFpbGluZyBlbGVtZW50cyBoYXZlIHRvIGJlIG92ZXJ3cml0dGVuXG5cdFx0XHRcdFx0Ly8gdG8gcHJldmVudCByZXN1bHRzIHN1Y2ggYXMgL2Zvby8vYmFyXG5cdFx0XHRcdFx0c2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0xXSA9IHY7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2VnbWVudHMucHVzaCh2KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodikge1xuXHRcdFx0XHRzZWdtZW50c1tzZWdtZW50XSA9IHRyaW1TbGFzaGVzKHYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VnbWVudHMuc3BsaWNlKHNlZ21lbnQsIDEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhYnNvbHV0ZSkge1xuXHRcdFx0c2VnbWVudHMudW5zaGlmdCgnJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGF0aChzZWdtZW50cy5qb2luKHNlcGFyYXRvciksIGJ1aWxkKTtcblx0fTtcblx0cC5zZWdtZW50Q29kZWQgPSBmdW5jdGlvbihzZWdtZW50LCB2LCBidWlsZCkge1xuXHRcdHZhciBzZWdtZW50cywgaSwgbDtcblxuXHRcdGlmICh0eXBlb2Ygc2VnbWVudCAhPT0gJ251bWJlcicpIHtcblx0XHRcdGJ1aWxkID0gdjtcblx0XHRcdHYgPSBzZWdtZW50O1xuXHRcdFx0c2VnbWVudCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWdtZW50cyA9IHRoaXMuc2VnbWVudChzZWdtZW50LCB2LCBidWlsZCk7XG5cdFx0XHRpZiAoIWlzQXJyYXkoc2VnbWVudHMpKSB7XG5cdFx0XHRcdHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IFVSSS5kZWNvZGUoc2VnbWVudHMpIDogdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgbCA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHNlZ21lbnRzW2ldID0gVVJJLmRlY29kZShzZWdtZW50c1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNlZ21lbnRzO1xuXHRcdH1cblxuXHRcdGlmICghaXNBcnJheSh2KSkge1xuXHRcdFx0diA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgfHwgdiBpbnN0YW5jZW9mIFN0cmluZykgPyBVUkkuZW5jb2RlKHYpIDogdjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChpID0gMCwgbCA9IHYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZbaV0gPSBVUkkuZW5jb2RlKHZbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnNlZ21lbnQoc2VnbWVudCwgdiwgYnVpbGQpO1xuXHR9O1xuXG5cdC8vIG11dGF0aW5nIHF1ZXJ5IHN0cmluZ1xuXHR2YXIgcSA9IHAucXVlcnk7XG5cdHAucXVlcnkgPSBmdW5jdGlvbih2LCBidWlsZCkge1xuXHRcdGlmICh2ID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFx0dmFyIHJlc3VsdCA9IHYuY2FsbCh0aGlzLCBkYXRhKTtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkocmVzdWx0IHx8IGRhdGEsIHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycywgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9IGVsc2UgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdiAhPT0gJ3N0cmluZycpIHtcblx0XHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkodiwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcS5jYWxsKHRoaXMsIHYsIGJ1aWxkKTtcblx0XHR9XG5cdH07XG5cdHAuc2V0UXVlcnkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgYnVpbGQpIHtcblx0XHR2YXIgZGF0YSA9IFVSSS5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHwgbmFtZSBpbnN0YW5jZW9mIFN0cmluZykge1xuXHRcdFx0ZGF0YVtuYW1lXSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGtleSBpbiBuYW1lKSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChuYW1lLCBrZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YVtrZXldID0gbmFtZVtrZXldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1VSSS5hZGRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmFkZFF1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIGJ1aWxkKSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0VVJJLmFkZFF1ZXJ5KGRhdGEsIG5hbWUsIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWUpO1xuXHRcdHRoaXMuX3BhcnRzLnF1ZXJ5ID0gVVJJLmJ1aWxkUXVlcnkoZGF0YSwgdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRidWlsZCA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5yZW1vdmVRdWVyeSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBidWlsZCkge1xuXHRcdHZhciBkYXRhID0gVVJJLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdFVSSS5yZW1vdmVRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSk7XG5cdFx0dGhpcy5fcGFydHMucXVlcnkgPSBVUkkuYnVpbGRRdWVyeShkYXRhLCB0aGlzLl9wYXJ0cy5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnMsIHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xuXHRcdGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGJ1aWxkID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLmhhc1F1ZXJ5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHdpdGhpbkFycmF5KSB7XG5cdFx0dmFyIGRhdGEgPSBVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7XG5cdFx0cmV0dXJuIFVSSS5oYXNRdWVyeShkYXRhLCBuYW1lLCB2YWx1ZSwgd2l0aGluQXJyYXkpO1xuXHR9O1xuXHRwLnNldFNlYXJjaCA9IHAuc2V0UXVlcnk7XG5cdHAuYWRkU2VhcmNoID0gcC5hZGRRdWVyeTtcblx0cC5yZW1vdmVTZWFyY2ggPSBwLnJlbW92ZVF1ZXJ5O1xuXHRwLmhhc1NlYXJjaCA9IHAuaGFzUXVlcnk7XG5cblx0Ly8gc2FuaXRpemluZyBVUkxzXG5cdHAubm9ybWFsaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX3BhcnRzLnVybikge1xuXHRcdFx0cmV0dXJuIHRoaXNcblx0XHRcdFx0Lm5vcm1hbGl6ZVByb3RvY29sKGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplUGF0aChmYWxzZSlcblx0XHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0XHQubm9ybWFsaXplRnJhZ21lbnQoZmFsc2UpXG5cdFx0XHRcdC5idWlsZCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQubm9ybWFsaXplUHJvdG9jb2woZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplSG9zdG5hbWUoZmFsc2UpXG5cdFx0XHQubm9ybWFsaXplUG9ydChmYWxzZSlcblx0XHRcdC5ub3JtYWxpemVQYXRoKGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZVF1ZXJ5KGZhbHNlKVxuXHRcdFx0Lm5vcm1hbGl6ZUZyYWdtZW50KGZhbHNlKVxuXHRcdFx0LmJ1aWxkKCk7XG5cdH07XG5cdHAubm9ybWFsaXplUHJvdG9jb2wgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wcm90b2NvbCA9IHRoaXMuX3BhcnRzLnByb3RvY29sLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplSG9zdG5hbWUgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICh0aGlzLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHRoaXMuaXMoJ0lETicpICYmIHB1bnljb2RlKSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLl9wYXJ0cy5ob3N0bmFtZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXMoJ0lQdjYnKSAmJiBJUHY2KSB7XG5cdFx0XHRcdHRoaXMuX3BhcnRzLmhvc3RuYW1lID0gSVB2Ni5iZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fcGFydHMuaG9zdG5hbWUgPSB0aGlzLl9wYXJ0cy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBvcnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdC8vIHJlbW92ZSBwb3J0IG9mIGl0J3MgdGhlIHByb3RvY29sJ3MgZGVmYXVsdFxuXHRcdGlmICh0eXBlb2YgdGhpcy5fcGFydHMucHJvdG9jb2wgPT09ICdzdHJpbmcnICYmIHRoaXMuX3BhcnRzLnBvcnQgPT09IFVSSS5kZWZhdWx0UG9ydHNbdGhpcy5fcGFydHMucHJvdG9jb2xdKSB7XG5cdFx0XHR0aGlzLl9wYXJ0cy5wb3J0ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVQYXRoID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHR2YXIgX3BhdGggPSB0aGlzLl9wYXJ0cy5wYXRoO1xuXHRcdGlmICghX3BhdGgpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRoaXMuX3BhcnRzLnBhdGggPSBVUkkucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKTtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wYXJ0cy5wYXRoID09PSAnLycpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdHZhciBfd2FzX3JlbGF0aXZlO1xuXHRcdHZhciBfbGVhZGluZ1BhcmVudHMgPSAnJztcblx0XHR2YXIgX3BhcmVudCwgX3BvcztcblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRoc1xuXHRcdGlmIChfcGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0X3dhc19yZWxhdGl2ZSA9IHRydWU7XG5cdFx0XHRfcGF0aCA9ICcvJyArIF9wYXRoO1xuXHRcdH1cblxuXHRcdC8vIGhhbmRsZSByZWxhdGl2ZSBmaWxlcyAoYXMgb3Bwb3NlZCB0byBkaXJlY3Rvcmllcylcblx0XHRpZiAoX3BhdGguc2xpY2UoLTMpID09PSAnLy4uJyB8fCBfcGF0aC5zbGljZSgtMikgPT09ICcvLicpIHtcblx0XHRcdF9wYXRoICs9ICcvJztcblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHNpbXBsZXNcblx0XHRfcGF0aCA9IF9wYXRoXG5cdFx0XHQucmVwbGFjZSgvKFxcLyhcXC5cXC8pKyl8KFxcL1xcLiQpL2csICcvJylcblx0XHRcdC5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG5cblx0XHQvLyByZW1lbWJlciBsZWFkaW5nIHBhcmVudHNcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSkge1xuXHRcdFx0X2xlYWRpbmdQYXJlbnRzID0gX3BhdGguc3Vic3RyaW5nKDEpLm1hdGNoKC9eKFxcLlxcLlxcLykrLykgfHwgJyc7XG5cdFx0XHRpZiAoX2xlYWRpbmdQYXJlbnRzKSB7XG5cdFx0XHRcdF9sZWFkaW5nUGFyZW50cyA9IF9sZWFkaW5nUGFyZW50c1swXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHBhcmVudHNcblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0X3BhcmVudCA9IF9wYXRoLmluZGV4T2YoJy8uLicpO1xuXHRcdFx0aWYgKF9wYXJlbnQgPT09IC0xKSB7XG5cdFx0XHRcdC8vIG5vIG1vcmUgLi4vIHRvIHJlc29sdmVcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9IGVsc2UgaWYgKF9wYXJlbnQgPT09IDApIHtcblx0XHRcdFx0Ly8gdG9wIGxldmVsIGNhbm5vdCBiZSByZWxhdGl2ZSwgc2tpcCBpdFxuXHRcdFx0XHRfcGF0aCA9IF9wYXRoLnN1YnN0cmluZygzKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdF9wb3MgPSBfcGF0aC5zdWJzdHJpbmcoMCwgX3BhcmVudCkubGFzdEluZGV4T2YoJy8nKTtcblx0XHRcdGlmIChfcG9zID09PSAtMSkge1xuXHRcdFx0XHRfcG9zID0gX3BhcmVudDtcblx0XHRcdH1cblx0XHRcdF9wYXRoID0gX3BhdGguc3Vic3RyaW5nKDAsIF9wb3MpICsgX3BhdGguc3Vic3RyaW5nKF9wYXJlbnQgKyAzKTtcblx0XHR9XG5cblx0XHQvLyByZXZlcnQgdG8gcmVsYXRpdmVcblx0XHRpZiAoX3dhc19yZWxhdGl2ZSAmJiB0aGlzLmlzKCdyZWxhdGl2ZScpKSB7XG5cdFx0XHRfcGF0aCA9IF9sZWFkaW5nUGFyZW50cyArIF9wYXRoLnN1YnN0cmluZygxKTtcblx0XHR9XG5cblx0XHRfcGF0aCA9IFVSSS5yZWNvZGVQYXRoKF9wYXRoKTtcblx0XHR0aGlzLl9wYXJ0cy5wYXRoID0gX3BhdGg7XG5cdFx0dGhpcy5idWlsZCghYnVpbGQpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXHRwLm5vcm1hbGl6ZVBhdGhuYW1lID0gcC5ub3JtYWxpemVQYXRoO1xuXHRwLm5vcm1hbGl6ZVF1ZXJ5ID0gZnVuY3Rpb24oYnVpbGQpIHtcblx0XHRpZiAodHlwZW9mIHRoaXMuX3BhcnRzLnF1ZXJ5ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKCF0aGlzLl9wYXJ0cy5xdWVyeS5sZW5ndGgpIHtcblx0XHRcdFx0dGhpcy5fcGFydHMucXVlcnkgPSBudWxsO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5xdWVyeShVUkkucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSwgdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJ1aWxkKCFidWlsZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cdHAubm9ybWFsaXplRnJhZ21lbnQgPSBmdW5jdGlvbihidWlsZCkge1xuXHRcdGlmICghdGhpcy5fcGFydHMuZnJhZ21lbnQpIHtcblx0XHRcdHRoaXMuX3BhcnRzLmZyYWdtZW50ID0gbnVsbDtcblx0XHRcdHRoaXMuYnVpbGQoIWJ1aWxkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblx0cC5ub3JtYWxpemVTZWFyY2ggPSBwLm5vcm1hbGl6ZVF1ZXJ5O1xuXHRwLm5vcm1hbGl6ZUhhc2ggPSBwLm5vcm1hbGl6ZUZyYWdtZW50O1xuXG5cdHAuaXNvODg1OSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCB1bmljb2RlIGlucHV0LCBpc284ODU5IG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gZXNjYXBlO1xuXHRcdFVSSS5kZWNvZGUgPSBkZWNvZGVVUklDb21wb25lbnQ7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMubm9ybWFsaXplKCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdFVSSS5lbmNvZGUgPSBlO1xuXHRcdFx0VVJJLmRlY29kZSA9IGQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdHAudW5pY29kZSA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGV4cGVjdCBpc284ODU5IGlucHV0LCB1bmljb2RlIG91dHB1dFxuXHRcdHZhciBlID0gVVJJLmVuY29kZTtcblx0XHR2YXIgZCA9IFVSSS5kZWNvZGU7XG5cblx0XHRVUkkuZW5jb2RlID0gc3RyaWN0RW5jb2RlVVJJQ29tcG9uZW50O1xuXHRcdFVSSS5kZWNvZGUgPSB1bmVzY2FwZTtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0VVJJLmVuY29kZSA9IGU7XG5cdFx0XHRVUkkuZGVjb2RlID0gZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0cC5yZWFkYWJsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB1cmkgPSB0aGlzLmNsb25lKCk7XG5cdFx0Ly8gcmVtb3ZpbmcgdXNlcm5hbWUsIHBhc3N3b3JkLCBiZWNhdXNlIHRoZXkgc2hvdWxkbid0IGJlIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gUkZDIDM5ODZcblx0XHR1cmkudXNlcm5hbWUoJycpLnBhc3N3b3JkKCcnKS5ub3JtYWxpemUoKTtcblx0XHR2YXIgdCA9ICcnO1xuXHRcdGlmICh1cmkuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHR0ICs9IHVyaS5fcGFydHMucHJvdG9jb2wgKyAnOi8vJztcblx0XHR9XG5cblx0XHRpZiAodXJpLl9wYXJ0cy5ob3N0bmFtZSkge1xuXHRcdFx0aWYgKHVyaS5pcygncHVueWNvZGUnKSAmJiBwdW55Y29kZSkge1xuXHRcdFx0XHR0ICs9IHB1bnljb2RlLnRvVW5pY29kZSh1cmkuX3BhcnRzLmhvc3RuYW1lKTtcblx0XHRcdFx0aWYgKHVyaS5fcGFydHMucG9ydCkge1xuXHRcdFx0XHRcdHQgKz0gJzonICsgdXJpLl9wYXJ0cy5wb3J0O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0ICs9IHVyaS5ob3N0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHVyaS5fcGFydHMuaG9zdG5hbWUgJiYgdXJpLl9wYXJ0cy5wYXRoICYmIHVyaS5fcGFydHMucGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dCArPSAnLyc7XG5cdFx0fVxuXG5cdFx0dCArPSB1cmkucGF0aCh0cnVlKTtcblx0XHRpZiAodXJpLl9wYXJ0cy5xdWVyeSkge1xuXHRcdFx0dmFyIHEgPSAnJztcblx0XHRcdGZvciAodmFyIGkgPSAwLCBxcCA9IHVyaS5fcGFydHMucXVlcnkuc3BsaXQoJyYnKSwgbCA9IHFwLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR2YXIga3YgPSAocXBbaV0gfHwgJycpLnNwbGl0KCc9Jyk7XG5cdFx0XHRcdHEgKz0gJyYnICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzBdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdC5yZXBsYWNlKC8mL2csICclMjYnKTtcblxuXHRcdFx0XHRpZiAoa3ZbMV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHEgKz0gJz0nICsgVVJJLmRlY29kZVF1ZXJ5KGt2WzFdLCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyYvZywgJyUyNicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0ICs9ICc/JyArIHEuc3Vic3RyaW5nKDEpO1xuXHRcdH1cblxuXHRcdHQgKz0gVVJJLmRlY29kZVF1ZXJ5KHVyaS5oYXNoKCksIHRydWUpO1xuXHRcdHJldHVybiB0O1xuXHR9O1xuXG5cdC8vIHJlc29sdmluZyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgVVJMc1xuXHRwLmFic29sdXRlVG8gPSBmdW5jdGlvbihiYXNlKSB7XG5cdFx0dmFyIHJlc29sdmVkID0gdGhpcy5jbG9uZSgpO1xuXHRcdHZhciBwcm9wZXJ0aWVzID0gWydwcm90b2NvbCcsICd1c2VybmFtZScsICdwYXNzd29yZCcsICdob3N0bmFtZScsICdwb3J0J107XG5cdFx0dmFyIGJhc2VkaXIsIGksIHA7XG5cblx0XHRpZiAodGhpcy5fcGFydHMudXJuKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoYmFzZSBpbnN0YW5jZW9mIFVSSSkpIHtcblx0XHRcdGJhc2UgPSBuZXcgVVJJKGJhc2UpO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnByb3RvY29sKSB7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucHJvdG9jb2wgPSBiYXNlLl9wYXJ0cy5wcm90b2NvbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcGFydHMuaG9zdG5hbWUpIHtcblx0XHRcdHJldHVybiByZXNvbHZlZDtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyAocCA9IHByb3BlcnRpZXNbaV0pOyBpKyspIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0c1twXSA9IGJhc2UuX3BhcnRzW3BdO1xuXHRcdH1cblxuXHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnBhdGgpIHtcblx0XHRcdHJlc29sdmVkLl9wYXJ0cy5wYXRoID0gYmFzZS5fcGFydHMucGF0aDtcblx0XHRcdGlmICghcmVzb2x2ZWQuX3BhcnRzLnF1ZXJ5KSB7XG5cdFx0XHRcdHJlc29sdmVkLl9wYXJ0cy5xdWVyeSA9IGJhc2UuX3BhcnRzLnF1ZXJ5O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocmVzb2x2ZWQuX3BhcnRzLnBhdGguc3Vic3RyaW5nKC0yKSA9PT0gJy4uJykge1xuXHRcdFx0cmVzb2x2ZWQuX3BhcnRzLnBhdGggKz0gJy8nO1xuXHRcdH1cblxuXHRcdGlmIChyZXNvbHZlZC5wYXRoKCkuY2hhckF0KDApICE9PSAnLycpIHtcblx0XHRcdGJhc2VkaXIgPSBiYXNlLmRpcmVjdG9yeSgpO1xuXHRcdFx0YmFzZWRpciA9IGJhc2VkaXIgPyBiYXNlZGlyIDogYmFzZS5wYXRoKCkuaW5kZXhPZignLycpID09PSAwID8gJy8nIDogJyc7XG5cdFx0XHRyZXNvbHZlZC5fcGFydHMucGF0aCA9IChiYXNlZGlyID8gKGJhc2VkaXIgKyAnLycpIDogJycpICsgcmVzb2x2ZWQuX3BhcnRzLnBhdGg7XG5cdFx0XHRyZXNvbHZlZC5ub3JtYWxpemVQYXRoKCk7XG5cdFx0fVxuXG5cdFx0cmVzb2x2ZWQuYnVpbGQoKTtcblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH07XG5cdHAucmVsYXRpdmVUbyA9IGZ1bmN0aW9uKGJhc2UpIHtcblx0XHR2YXIgcmVsYXRpdmUgPSB0aGlzLmNsb25lKCkubm9ybWFsaXplKCk7XG5cdFx0dmFyIHJlbGF0aXZlUGFydHMsIGJhc2VQYXJ0cywgY29tbW9uLCByZWxhdGl2ZVBhdGgsIGJhc2VQYXRoO1xuXG5cdFx0aWYgKHJlbGF0aXZlLl9wYXJ0cy51cm4pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHMnKTtcblx0XHR9XG5cblx0XHRiYXNlID0gbmV3IFVSSShiYXNlKS5ub3JtYWxpemUoKTtcblx0XHRyZWxhdGl2ZVBhcnRzID0gcmVsYXRpdmUuX3BhcnRzO1xuXHRcdGJhc2VQYXJ0cyA9IGJhc2UuX3BhcnRzO1xuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlLnBhdGgoKTtcblx0XHRiYXNlUGF0aCA9IGJhc2UucGF0aCgpO1xuXG5cdFx0aWYgKHJlbGF0aXZlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVUkkgaXMgYWxyZWFkeSByZWxhdGl2ZScpO1xuXHRcdH1cblxuXHRcdGlmIChiYXNlUGF0aC5jaGFyQXQoMCkgIT09ICcvJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsY3VsYXRlIGEgVVJJIHJlbGF0aXZlIHRvIGFub3RoZXIgcmVsYXRpdmUgVVJJJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMucHJvdG9jb2wgPT09IGJhc2VQYXJ0cy5wcm90b2NvbCkge1xuXHRcdFx0cmVsYXRpdmVQYXJ0cy5wcm90b2NvbCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IGJhc2VQYXJ0cy51c2VybmFtZSB8fCByZWxhdGl2ZVBhcnRzLnBhc3N3b3JkICE9PSBiYXNlUGFydHMucGFzc3dvcmQpIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhcnRzLnByb3RvY29sICE9PSBudWxsIHx8IHJlbGF0aXZlUGFydHMudXNlcm5hbWUgIT09IG51bGwgfHwgcmVsYXRpdmVQYXJ0cy5wYXNzd29yZCAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbGF0aXZlUGFydHMuaG9zdG5hbWUgPT09IGJhc2VQYXJ0cy5ob3N0bmFtZSAmJiByZWxhdGl2ZVBhcnRzLnBvcnQgPT09IGJhc2VQYXJ0cy5wb3J0KSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLmhvc3RuYW1lID0gbnVsbDtcblx0XHRcdHJlbGF0aXZlUGFydHMucG9ydCA9IG51bGw7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZVBhdGggPT09IGJhc2VQYXRoKSB7XG5cdFx0XHRyZWxhdGl2ZVBhcnRzLnBhdGggPSAnJztcblx0XHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSBjb21tb24gc3ViIHBhdGhcblx0XHRjb21tb24gPSBVUkkuY29tbW9uUGF0aChyZWxhdGl2ZVBhdGgsIGJhc2VQYXRoKTtcblxuXHRcdC8vIElmIHRoZSBwYXRocyBoYXZlIG5vdGhpbmcgaW4gY29tbW9uLCByZXR1cm4gYSByZWxhdGl2ZSBVUkwgd2l0aCB0aGUgYWJzb2x1dGUgcGF0aC5cblx0XHRpZiAoIWNvbW1vbikge1xuXHRcdFx0cmV0dXJuIHJlbGF0aXZlLmJ1aWxkKCk7XG5cdFx0fVxuXG5cdFx0dmFyIHBhcmVudHMgPSBiYXNlUGFydHMucGF0aFxuXHRcdFx0LnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKVxuXHRcdFx0LnJlcGxhY2UoL1teXFwvXSokLywgJycpXG5cdFx0XHQucmVwbGFjZSgvLio/XFwvL2csICcuLi8nKTtcblxuXHRcdHJlbGF0aXZlUGFydHMucGF0aCA9IChwYXJlbnRzICsgcmVsYXRpdmVQYXJ0cy5wYXRoLnN1YnN0cmluZyhjb21tb24ubGVuZ3RoKSkgfHwgJy4vJztcblxuXHRcdHJldHVybiByZWxhdGl2ZS5idWlsZCgpO1xuXHR9O1xuXG5cdC8vIGNvbXBhcmluZyBVUklzXG5cdHAuZXF1YWxzID0gZnVuY3Rpb24odXJpKSB7XG5cdFx0dmFyIG9uZSA9IHRoaXMuY2xvbmUoKTtcblx0XHR2YXIgdHdvID0gbmV3IFVSSSh1cmkpO1xuXHRcdHZhciBvbmVfbWFwID0ge307XG5cdFx0dmFyIHR3b19tYXAgPSB7fTtcblx0XHR2YXIgY2hlY2tlZCA9IHt9O1xuXHRcdHZhciBvbmVfcXVlcnksIHR3b19xdWVyeSwga2V5O1xuXG5cdFx0b25lLm5vcm1hbGl6ZSgpO1xuXHRcdHR3by5ub3JtYWxpemUoKTtcblxuXHRcdC8vIGV4YWN0IG1hdGNoXG5cdFx0aWYgKG9uZS50b1N0cmluZygpID09PSB0d28udG9TdHJpbmcoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gZXh0cmFjdCBxdWVyeSBzdHJpbmdcblx0XHRvbmVfcXVlcnkgPSBvbmUucXVlcnkoKTtcblx0XHR0d29fcXVlcnkgPSB0d28ucXVlcnkoKTtcblx0XHRvbmUucXVlcnkoJycpO1xuXHRcdHR3by5xdWVyeSgnJyk7XG5cblx0XHQvLyBkZWZpbml0ZWx5IG5vdCBlcXVhbCBpZiBub3QgZXZlbiBub24tcXVlcnkgcGFydHMgbWF0Y2hcblx0XHRpZiAob25lLnRvU3RyaW5nKCkgIT09IHR3by50b1N0cmluZygpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gcXVlcnkgcGFyYW1ldGVycyBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgZXZlbiBpZiB0aGV5J3JlIHBlcm11dGVkXG5cdFx0aWYgKG9uZV9xdWVyeS5sZW5ndGggIT09IHR3b19xdWVyeS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRvbmVfbWFwID0gVVJJLnBhcnNlUXVlcnkob25lX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblx0XHR0d29fbWFwID0gVVJJLnBhcnNlUXVlcnkodHdvX3F1ZXJ5LCB0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcblxuXHRcdGZvciAoa2V5IGluIG9uZV9tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbChvbmVfbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghaXNBcnJheShvbmVfbWFwW2tleV0pKSB7XG5cdFx0XHRcdFx0aWYgKG9uZV9tYXBba2V5XSAhPT0gdHdvX21hcFtrZXldKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKCFhcnJheXNFcXVhbChvbmVfbWFwW2tleV0sIHR3b19tYXBba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjaGVja2VkW2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoa2V5IGluIHR3b19tYXApIHtcblx0XHRcdGlmIChoYXNPd24uY2FsbCh0d29fbWFwLCBrZXkpKSB7XG5cdFx0XHRcdGlmICghY2hlY2tlZFtrZXldKSB7XG5cdFx0XHRcdFx0Ly8gdHdvIGNvbnRhaW5zIGEgcGFyYW1ldGVyIG5vdCBwcmVzZW50IGluIG9uZVxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xuXG5cdC8vIHN0YXRlXG5cdHAuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzID0gZnVuY3Rpb24odikge1xuXHRcdHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRwLmVzY2FwZVF1ZXJ5U3BhY2UgPSBmdW5jdGlvbih2KSB7XG5cdFx0dGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSA9ICEhdjtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHRyZXR1cm4gVVJJO1xufSkpOyIsIldvcmtmbG93ID0ge31cblxuQEltYWdlU2lnbiA9IHt9O1xuXG5AVHJhY2VzSGFuZGxlciA9IHt9O1xuXG5AVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxuQEluc3RhbmNlZm9ybVRlbXBsYXRlID0ge307XG5cbkBJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZSA9IHt9O1xuXG5ASW5zdGFuY2VTaWduVGV4dCA9IHt9XG5cbkBSZWxhdGVkSW5zdGFuY2VzID0ge31cblxuQFJlbGF0ZWRSZWNvcmRzID0ge31cblxuQEluc3RhbmNlTWFjcm8gPSB7Y29udGV4dDoge319XG5cbkBUcmFjZXNNYW5hZ2VyID0ge307XG5cbkluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcgPSAoZmllbGRfZm9ybXVsYSktPlxuXHRyZXR1cm4gKGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3lpamlhbmxhbjpcIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA+IC0xIHx8IGZpZWxkX2Zvcm11bGE/LmluZGV4T2YoXCJ7J3lpamlhbmxhbic6XCIpID4gLTEpXG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSAoZm9ybSwgZm9ybV92ZXJzaW9uKS0+XG5cdGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG5cblx0X2Zvcm1fdmVyc2lvbiA9IHt9XG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0X2Zvcm1fdmVyc2lvbiA9IHV1Zmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oZGIuZm9ybXMuZmluZE9uZSh7X2lkOiBmb3JtfSksIGZvcm1fdmVyc2lvbilcblx0ZWxzZVxuXHRcdF9mb3JtX3ZlcnNpb24gPSBkYi5mb3JtX3ZlcnNpb25zLmZpbmRPbmUoe19pZDogZm9ybV92ZXJzaW9uLCBmb3JtOiBmb3JtfSlcblxuXHRmaWVsZHMgPSBfZm9ybV92ZXJzaW9uPy5maWVsZHMgfHwgW11cblxuXHRmaWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdGlmIGYudHlwZSA9PSAndGFibGUnXG5cdFx0XHRjb25zb2xlLmxvZyAnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnXG5cdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRmPy5maWVsZHM/LmZvckVhY2ggKGYxKS0+XG5cdFx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZjEuZm9ybXVsYVxuXHRcdGVsc2Vcblx0XHRcdGZpZWxkX2Zvcm11bGFzLnB1c2ggZi5mb3JtdWxhXG5cblx0Xy5zb21lIGZpZWxkX2Zvcm11bGFzLCAoZmllbGRfZm9ybXVsYSktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cbiIsIiAgICAgICAgICAgICBcblxuV29ya2Zsb3cgPSB7fTtcblxudGhpcy5JbWFnZVNpZ24gPSB7fTtcblxudGhpcy5UcmFjZXNIYW5kbGVyID0ge307XG5cbnRoaXMuVHJhY2VzVGVtcGxhdGUgPSB7fTtcblxudGhpcy5JbnN0YW5jZWZvcm1UZW1wbGF0ZSA9IHt9O1xuXG50aGlzLkluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlID0ge307XG5cbnRoaXMuSW5zdGFuY2VTaWduVGV4dCA9IHt9O1xuXG50aGlzLlJlbGF0ZWRJbnN0YW5jZXMgPSB7fTtcblxudGhpcy5SZWxhdGVkUmVjb3JkcyA9IHt9O1xuXG50aGlzLkluc3RhbmNlTWFjcm8gPSB7XG4gIGNvbnRleHQ6IHt9XG59O1xuXG50aGlzLlRyYWNlc01hbmFnZXIgPSB7fTtcblxuSW5zdGFuY2VTaWduVGV4dC5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyA9IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgcmV0dXJuIChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpIDogdm9pZCAwKSA+IC0xIHx8IChmaWVsZF9mb3JtdWxhICE9IG51bGwgPyBmaWVsZF9mb3JtdWxhLmluZGV4T2YoXCJ7eWlqaWFubGFuOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie1xcXCJ5aWppYW5sYW5cXFwiOlwiKSA6IHZvaWQgMCkgPiAtMSB8fCAoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwieyd5aWppYW5sYW4nOlwiKSA6IHZvaWQgMCkgPiAtMTtcbn07XG5cbkluc3RhbmNlU2lnblRleHQuaW5jbHVkZXNPcGluaW9uRmllbGQgPSBmdW5jdGlvbihmb3JtLCBmb3JtX3ZlcnNpb24pIHtcbiAgdmFyIF9mb3JtX3ZlcnNpb24sIGZpZWxkX2Zvcm11bGFzLCBmaWVsZHM7XG4gIGZpZWxkX2Zvcm11bGFzID0gbmV3IEFycmF5KCk7XG4gIF9mb3JtX3ZlcnNpb24gPSB7fTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIF9mb3JtX3ZlcnNpb24gPSB1dWZsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmb3JtXG4gICAgfSksIGZvcm1fdmVyc2lvbik7XG4gIH0gZWxzZSB7XG4gICAgX2Zvcm1fdmVyc2lvbiA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGZvcm1fdmVyc2lvbixcbiAgICAgIGZvcm06IGZvcm1cbiAgICB9KTtcbiAgfVxuICBmaWVsZHMgPSAoX2Zvcm1fdmVyc2lvbiAhPSBudWxsID8gX2Zvcm1fdmVyc2lvbi5maWVsZHMgOiB2b2lkIDApIHx8IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgfSBlbHNlIGlmIChmLnR5cGUgPT09ICdzZWN0aW9uJykge1xuICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYgPSBmLmZpZWxkcykgIT0gbnVsbCA/IHJlZi5mb3JFYWNoKGZ1bmN0aW9uKGYxKSB7XG4gICAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYxLmZvcm11bGEpO1xuICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZF9mb3JtdWxhcy5wdXNoKGYuZm9ybXVsYSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIF8uc29tZShmaWVsZF9mb3JtdWxhcywgZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICB9KTtcbn07XG4iLCJkYi5pbnN0YW5jZV90YXNrcyA9IG5ldyBNZXRlb3IuQ29sbGVjdGlvbignaW5zdGFuY2VfdGFza3MnKVxuXG5kYi5pbnN0YW5jZV90YXNrcy5fc2ltcGxlU2NoZW1hID0gbmV3IFNpbXBsZVNjaGVtYVxuICAgIGluc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICB0cmFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaXNfZmluaXNoZWQ6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXI6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHVzZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBoYW5kbGVyX29yZ2FuaXphdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIHN0YXJ0X2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkdWVfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGlzX3JlYWQ6XG4gICAgICAgIHR5cGU6IEJvb2xlYW5cbiAgICBpc19lcnJvcjpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIHZhbHVlczpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgZGVhZGxpbmU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICByZW1pbmRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIHJlbWluZGVkX2NvdW50OlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICByZWFkX2RhdGU6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgbW9kaWZpZWQ6XG4gICAgICAgIHR5cGU6IERhdGVcbiAgICBtb2RpZmllZF9ieTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc2lnbl9zaG93OlxuICAgICAgICB0eXBlOiBCb29sZWFuXG4gICAganVkZ2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIG5leHRfc3RlcHM6XG4gICAgICAgIHR5cGU6IEFycmF5XG4gICAgXCJuZXh0X3N0ZXBzLiRcIjpcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgXCJuZXh0X3N0ZXBzLiQuc3RlcFwiOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBcIm5leHRfc3RlcHMuJC51c2Vyc1wiOlxuICAgICAgICB0eXBlOiBbU3RyaW5nXVxuICAgIGZpbmlzaF9kYXRlOlxuICAgICAgICB0eXBlOiBEYXRlXG4gICAgY29zdF90aW1lOlxuICAgICAgICB0eXBlOiBOdW1iZXJcbiAgICBzcGFjZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgaW5zdGFuY2VfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3VibWl0dGVyOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXR0ZXJfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBhcHBsaWNhbnRfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBzdWJtaXRfZGF0ZTpcbiAgICAgICAgdHlwZTogRGF0ZVxuICAgIGZsb3c6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGZsb3dfbmFtZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZm9ybTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcDpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgc3RlcF9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBjYXRlZ29yeV9uYW1lOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpbnN0YW5jZV9zdGF0ZTpcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBmb3J3YXJkX2Zyb21faW5zdGFuY2U6XG4gICAgICAgIHR5cGU6IFN0cmluZ1xuICAgIGtleXdvcmRzOlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiAgICBpc19hcmNoaXZlZDpcbiAgICAgICAgdHlwZTogQm9vbGVhblxuICAgIGNhdGVnb3J5OlxuICAgICAgICB0eXBlOiBTdHJpbmdcbiIsImRiLmF1dGhfdG9rZW5zID0gbmV3IE1ldGVvci5Db2xsZWN0aW9uKCdhdXRoX3Rva2VucycpIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUgPSB7fTtcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5zdGFuY2VfYXR0YWNobWVudCA9IFwiXCJcIlxuXHQ8dHI+XG5cdFx0PHRkIGNsYXNzPVwiaW5zLWF0dGFjaC12aWV3XCI+XG5cdFx0XHQ8YSBocmVmPVwie3tpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCBfaWQgYWJzb2x1dGV9fVwiIGNsYXNzPVwiaW5zX2F0dGFjaF9ocmVmXCIgdGFyZ2V0PVwiX3BhcmVudFwiIGRhdGEtbmFtZT1cInt7dGhpcy5uYW1lfX1cIiBkYXRhLXR5cGU9XCJ7e3RoaXMub3JpZ2luYWwudHlwZX19XCIgZGF0YS1pZD1cInt7X2lkfX1cIj57e3RoaXMubmFtZX19PC9hPlxuXHRcdDwvdGQ+XG5cdDwvdHI+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmU2VsZWN0VXNlclJlYWQgPSBcIlwiXCJcblx0PGRpdiBjbGFzcz0nc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCc+e3t2YWx1ZX19PC9kaXY+XG5cIlwiXCJcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXBSZWFkID0gXCJcIlwiXG5cdDxkaXYgY2xhc3M9J2Zvcm0tZ3JvdXAnPlxuXHRcdHt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz0nc2VjdGlvbiBjYWxsb3V0IGNhbGxvdXQtZGVmYXVsdCc+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tmX2xhYmVsIHRoaXN9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCIgc3R5bGU9XCJwYWRkaW5nOjBweDtcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiA+XG5cdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJlYWRvbmx5LXRhYmxlXCIgc3R5bGU9XCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGFibGUgdHlwZT0ndGFibGUnIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cInt7dGhpcy5jb2RlfX1UYWJsZVwiIG5hbWU9XCJ7e3RoaXMuY29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3t0aGlzLm5hbWV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8dGhlYWQgaWQ9XCJ7e3RoaXMubmFtZX19VGhlYWRcIiBuYW1lPVwie3t0aGlzLm5hbWV9fVRoZWFkXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGhlYWQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cInt7dGhpcy5uYW1lfX1UYm9keVwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGJvZHlcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZUJvZHkgdGhpc319fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHR7eyNpZiBzaG93TGFiZWx9fVxuXHRcdFx0XHRcdFx0PGxhYmVsPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdFx0e3sjaWYgaXNUZXh0YXJlYSB0aGlzfX1cblx0XHRcdFx0XHRcdDxwIGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvcD5cblx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0ne3tnZXRDZkNsYXNzIHRoaXN9fSBmb3JtLWNvbnRyb2wnIHJlYWRvbmx5IGRpc2FibGVkPnt7e2dldFZhbHVlIGNvZGV9fX08L2Rpdj5cblx0XHRcdFx0XHR7ey9pZn19XG5cdFx0XHRcdHt7L2lmfX1cblx0XHRcdHt7L2lmfX1cblx0XHR7ey93aXRofX1cblx0PC9kaXY+XG5cIlwiXCJcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwID0gXCJcIlwiXG5cblx0e3sjd2l0aCBnZXRGaWVsZCB0aGlzLm5hbWV9fVxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cblx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cblx0XHRcdFx0XHRcdDxwPnt7e2Rlc2NyaXB0aW9ufX19PC9wPlxuXHRcdFx0XHRcdDwvZGl2PlxuICBcdFx0XHRcdDwvZGl2PlxuXHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgc3RlZWRvcy10YWJsZVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MHB4O1wiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiID5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImRlc2NyaXB0aW9uXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmVhZG9ubHktdGFibGVcIiBzdHlsZT1cInBhZGRpbmc6MHB4O292ZXJmbG93LXg6YXV0bztcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCB0YWJsZS1jb25kZW5zZWQgYXV0b2Zvcm0tdGFibGVcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVwie3t0aGlzLmNvZGV9fVRhYmxlXCIgbmFtZT1cInt7dGhpcy5jb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e3RoaXMubmFtZX19XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cInt7dGhpcy5uYW1lfX1UaGVhZFwiIG5hbWU9XCJ7e3RoaXMubmFtZX19VGhlYWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHRib2R5IGlkPVwie3t0aGlzLm5hbWV9fVRib2R5XCIgbmFtZT1cInt7dGhpcy5uYW1lfX1UYm9keVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdpbnB1dCd9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLXJlcXVpcmVkPVwie3sjaWYgaXNfcmVxdWlyZWR9fXRydWV7ey9pZn19XCI+XG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0e3sjaWYgaXNfdGV4dGFyZWF9fVxuXHRcdFx0XHRcdFx0XHRcdDx0ZXh0YXJlYSB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdGV4dGFyZWE+XG5cdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3sjdW5sZXNzIGlzX3RleHRhcmVhfX1cblx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHR7ey91bmxlc3N9fVxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdudW1iZXInfX1cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJudW1iZXJcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlJ319XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXR5cGU9XCJkYXRlXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdkYXRlVGltZSd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS10eXBlPSdkYXRldGltZScgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdwYXNzd29yZCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgdGl0bGU9XCJ7e2dldExhYmVsIGNvZGV9fVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGRhdGEtc2NoZW1hLWtleT1cInt7Z2V0TGFiZWwgY29kZX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VsZWN0J319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cInt7dmFsdWV9fVwiPnt7bGFiZWx9fTwvb3B0aW9uPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvc2VsZWN0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdyYWRpbyd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYWYtcmFkaW8tZ3JvdXBcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cbiAgICAgICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcIj48aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJ7e3ZhbHVlfX1cIiBuYW1lPVwie3suLi9jb2RlfX1cIiBjbGFzcz1cInJhZGlvLWlubGluZSBmaXgtaW5kZW50XCI+IHt7bGFiZWx9fTwvbGFiZWw+XG4gICAgXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9lYWNofX1cbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbXVsdGlTZWxlY3QnfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImFmLWNoZWNrYm94LWdyb3VwXCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWlubGluZSBmaXgtaW5kZW50XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwie3t2YWx1ZX19XCIgbmFtZT1cInt7Li4vY29kZX19XCIgY2xhc3M9XCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFwiPiB7e2xhYmVsfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3VybCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInVybFwiIHRpdGxlPVwie3tnZXRMYWJlbCBjb2RlfX1cIiBuYW1lPVwie3tjb2RlfX1cIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2VtYWlsJ319XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiN1pRbkRzWEJHb2haTWV0QTVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwiZW1haWxcIiB0aXRsZT1cInt7Z2V0TGFiZWwgY29kZX19XCIgbmFtZT1cInt7Y29kZX19XCIgZGF0YS1zY2hlbWEta2V5PVwie3tnZXRMYWJlbCBjb2RlfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdjaGVja2JveCd9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XCI3WlFuRHNYQkdvaFpNZXRBNVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLXNjaGVtYS1rZXk9XCJ7e2dldExhYmVsIGNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwidHJ1ZVwiIG5hbWU9XCJ7e2NvZGV9fVwiIGNsYXNzPVwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcIj48L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cIjdaUW5Ec1hCR29oWk1ldEE1XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0e3svaWZ9fVxuXHRcdHt7L3dpdGh9fVxuXCJcIlwiXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUgPSAodGVtcGFsdGVOYW1lLCBzdGVlZG9zRGF0YSkgLT5cblx0dGVtcGxhdGUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGVbdGVtcGFsdGVOYW1lXVxuXG5cdHRlbXBsYXRlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRlbXBsYXRlLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0dGVtcGxhdGVSZW5kZXJGdW5jdGlvbiA9IGV2YWwodGVtcGxhdGVDb21waWxlZCk7XG5cblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZSh0ZW1wYWx0ZU5hbWUsIHRlbXBsYXRlUmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQgPSAoc3RlZWRvc0RhdGEpLT5cblx0aW5zdGFuY2VTaWduVGV4dEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9zaWduX3RleHQuaHRtbCcpXG5cblx0aW5zdGFuY2VTaWduVGV4dENvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVNpZ25UZXh0SHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VTaWduVGV4dFwiLCBpbnN0YW5jZVNpZ25UZXh0UmVuZGVyRnVuY3Rpb24pO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZVNpZ25UZXh0LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzIEluc3RhbmNlU2lnblRleHQuaGVscGVyc1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduID0gKHN0ZWVkb3NEYXRhKSAtPlxuXHRpbWFnZVNpZ25IdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW1hZ2Vfc2lnbi5odG1sJylcblx0aW1hZ2VTaWduQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGltYWdlU2lnbkh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0aW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24gPSBldmFsKGltYWdlU2lnbkNvbXBpbGVkKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW1hZ2VTaWduXCIsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uKTtcblx0VGVtcGxhdGUuaW1hZ2VTaWduLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW1hZ2VTaWduLmhlbHBlcnMgSW1hZ2VTaWduLmhlbHBlcnNcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZVRyYWNlc0hhbmxkZXIgPSAoc3RlZWRvc0RhdGEpIC0+XG5cdHRyYWNlc0hhbmxkZXJIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX2hhbmRsZXIuaHRtbCcpXG5cdHRyYWNlc0hhbmxkZXJDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSGFubGRlckh0bWwsIHtpc0JvZHk6IHRydWV9KTtcblx0dHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uID0gZXZhbCh0cmFjZXNIYW5sZGVyQ29tcGlsZWQpO1xuXHRUZW1wbGF0ZS5pbnN0YW5jZV90cmFjZXNfaGFuZGxlciA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3RyYWNlc19oYW5kbGVyXCIsIHRyYWNlc0hhbmxkZXJSZW5kZXJGdW5jdGlvbik7XG5cdFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblx0VGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuaGVscGVycyBUcmFjZXNIYW5kbGVyLmhlbHBlcnNcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdCA9IChzdGVlZG9zRGF0YSkgLT5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmU2VsZWN0VXNlclJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuXG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJhZkZvcm1Hcm91cFwiLCBzdGVlZG9zRGF0YSk7XG5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwUmVhZFwiLCBzdGVlZG9zRGF0YSk7XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJpbnN0YW5jZV9hdHRhY2htZW50XCIsIHthYnNvbHV0ZTogc3RlZWRvc0RhdGEuYWJzb2x1dGV9KTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduKHN0ZWVkb3NEYXRhKVxuXHRcdEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyKHN0ZWVkb3NEYXRhKTtcblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW5zdGFuY2VTaWduVGV4dChzdGVlZG9zRGF0YSlcblxuZ2V0TGlua1RleHQgPSAoaXRlbSwgbGFiZWwsIGRldGFpbF91cmwpLT5cblx0aWYgZGV0YWlsX3VybFxuXHRcdGRldGFpbF91cmwgPSBkZXRhaWxfdXJsLnJlcGxhY2UoXCJ7X2lkfVwiLCBpdGVtLl9pZClcblx0XHRpZiAhL15odHRwKHM/KTpcXC9cXC8vLnRlc3QoZGV0YWlsX3VybClcblx0XHRcdGRldGFpbF91cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKGRldGFpbF91cmwpXG5cdFx0cmV0dXJuICc8YSBocmVmPVwiJytkZXRhaWxfdXJsKydcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nK2xhYmVsKyc8L2E+Jztcblx0ZWxzZVxuXHRcdHJldHVybiBsYWJlbFxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUgPSAodmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldCkgLT5cblx0aWYgIXZhbHVlICYmIHZhbHVlICE9IGZhbHNlXG5cdFx0cmV0dXJuICcnXG5cdGlmIFtcInNlbGVjdFwiLCBcIm11bHRpU2VsZWN0XCIsIFwicmFkaW9cIl0uaW5kZXhPZihmaWVsZC50eXBlKSA+IC0xXG5cdFx0ZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAgKG4pLT5cblx0XHRcdGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG5cdFx0XHRcdHZhbHVlOiBpdGVtU3BsaXRzWzFdIHx8IG5cblx0XHRcdH1cblx0c3dpdGNoIGZpZWxkLnR5cGVcblx0XHR3aGVuICdlbWFpbCdcblx0XHRcdHZhbHVlID0gaWYgdmFsdWUgdGhlbiAnPGEgaHJlZj1cXCdtYWlsdG86JyArIHZhbHVlICsgJ1xcJz4nICsgdmFsdWUgKyAnPC9hPicgZWxzZSAnJ1xuXHRcdHdoZW4gJ3VybCdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmIHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09IDBcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdHZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcblx0XHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0nJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR2YWx1ZSA9IFwiPGEgaHJlZj0naHR0cDovL1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9ICcnXG5cdFx0d2hlbiAnZ3JvdXAnXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZnVsbG5hbWVcblx0XHR3aGVuICd1c2VyJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8uZ2V0UHJvcGVydHkoXCJuYW1lXCIpLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdHdoZW4gJ3Bhc3N3b3JkJ1xuXHRcdFx0dmFsdWUgPSAnKioqKioqJ1xuXHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0aWYgdmFsdWUgJiYgdmFsdWUgIT0gJ2ZhbHNlJ1xuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIsIHt9LCBsb2NhbGUpXG5cdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKHZhbHVlLCB1dGNPZmZzZXQpO1xuXHRcdHdoZW4gJ3RpbWUnXG5cdFx0XHRpZiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPT0gMTZcblx0XHRcdFx0dCA9IHZhbHVlLnNwbGl0KFwiVFwiKVxuXHRcdFx0XHR0MCA9IHRbMF0uc3BsaXQoXCItXCIpO1xuXHRcdFx0XHR0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG5cdFx0XHRcdHllYXIgPSB0MFswXTtcblx0XHRcdFx0bW9udGggPSB0MFsxXTtcblx0XHRcdFx0ZGF0ZSA9IHQwWzJdO1xuXHRcdFx0XHRob3VycyA9IHQxWzBdO1xuXHRcdFx0XHRzZWNvbmRzID0gdDFbMV07XG5cblx0XHRcdFx0dmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuXG5cdFx0XHR2YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXRUaW1lKHZhbHVlKTtcblx0XHR3aGVuICdpbnB1dCdcblx0XHRcdGlmIGZpZWxkLmlzX3RleHRhcmVhXG5cdFx0XHRcdHZhbHVlID0gdmFsdWVcblx0XHR3aGVuICdzZWxlY3QnXG5cdFx0XHRzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKChpdGVtKSAtPiByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZSlcblx0XHRcdGlmIHNlbGVjdGVkT3B0aW9uXG5cdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcblx0XHR3aGVuICdyYWRpbydcblx0XHRcdHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoKGl0ZW0pIC0+IHJldHVybiBpdGVtLnZhbHVlID09IHZhbHVlKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25cblx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbFxuXHRcdHdoZW4gJ211bHRpU2VsZWN0J1xuXHRcdFx0c3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKVxuXHRcdFx0c2VsZWN0ZWRPcHRpb25zID0gZmllbGRPcHRpb25zLmZpbHRlcigoaXRlbSkgLT4gcmV0dXJuIHNwbGl0ZWRWYWx1ZXMuaW5kZXhPZihpdGVtLnZhbHVlKSA+IC0xKVxuXHRcdFx0aWYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFxuXHRcdFx0XHR2YWx1ZSA9IHNlbGVjdGVkT3B0aW9ucy5tYXAoKGl0ZW0pIC0+IHJldHVybiBpdGVtLmxhYmVsKS5qb2luKFwiLFwiKVxuXHRcdHdoZW4gJ251bWJlcidcblx0XHRcdGlmIHZhbHVlIG9yIHZhbHVlID09IDBcblx0XHRcdFx0aWYgZmllbGQuaXNfcGVyY2VudFxuXHRcdFx0XHRcdHZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcgdmFsdWUsIGZpZWxkLmRpZ2l0c1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dmFsdWUgPSBTdGVlZG9zLm51bWJlclRvU3RyaW5nIHZhbHVlLCBmaWVsZC5kaWdpdHNcblx0XHR3aGVuICdvZGF0YSdcblx0XHRcdGRldGFpbF91cmwgPSBmaWVsZC5kZXRhaWxfdXJsXG5cdFx0XHRpZiBmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHR2YWx1ZSA9IF8ubWFwIHZhbHVlLCAoaXRlbSktPlxuXHRcdFx0XHRcdHJldHVybiBnZXRMaW5rVGV4dChpdGVtLCBpdGVtWydAbGFiZWwnXSwgZGV0YWlsX3VybClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSBnZXRMaW5rVGV4dCh2YWx1ZSwgdmFsdWVbJ0BsYWJlbCddLCBkZXRhaWxfdXJsKVxuXHRcdHdoZW4gJ2ltYWdlJ1xuXHRcdFx0aWYgZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0dmFsdWUgPSBfLm1hcCB2YWx1ZSwgKGl0ZW0pLT5cblx0XHRcdFx0XHRyZXR1cm4gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZSBhbnRkLUltYWdlLS10aHVtYiBhbnRkLUltYWdlQ29udHJvbC1pbWFnZVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYldyYXBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJytpdGVtKydcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4nXG5cdFx0XHRcdHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dmFsdWUgPSAnPGRpdiBjbGFzcz1cImFudGQtSW1hZ2VDb250cm9sLWl0ZW0gaXMtdXBsb2FkZWRcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iXCI+PGltZyBjbGFzcz1cImFudGQtSW1hZ2UtaW1hZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzcmM9XCIvYXBpL2ZpbGVzL2ltYWdlcy8nK3ZhbHVlKydcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj4nXG5cdFx0d2hlbiAnZmlsZSdcblx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdGlmICFmaWVsZC5pc19tdWx0aXNlbGVjdFxuXHRcdFx0XHRcdHZhbHVlID0gW3ZhbHVlXVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRyZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxL2Nmc19maWxlc19maWxlcmVjb3JkP2ZpbHRlcnM9W1tcIl9pZFwiLFwiaW5cIiwgJytKU09OLnN0cmluZ2lmeSh2YWx1ZSkrJ11dJmZpZWxkcz1bXCJfaWRcIixcIm9yaWdpbmFsXCJdJywge2FzeW5jOmZhbHNlfSlcblx0XHRcdFx0XHRyZWNvcmRzID0gcmVzLmRhdGEuaXRlbXNcblx0XHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRyZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiwgeyBmaWx0ZXJzOiBbW1wiX2lkXCIsICdpbicsIHZhbHVlXV0sIGZpZWxkczogW1wiX2lkXCIsIFwib3JpZ2luYWxcIl0gfSk7XG5cblx0XHRcdFx0dmFsdWUgPSBfLm1hcCByZWNvcmRzLCAoaXRlbSktPlxuXHRcdFx0XHRcdGZpbGVOYW1lID0gaXRlbS5vcmlnaW5hbC5uYW1lO1xuXHRcdFx0XHRcdGZpbGVVcmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBpL2ZpbGVzL2ZpbGVzLycraXRlbS5faWQpO1xuXHRcdFx0XHRcdGZpbGVQcmV2aWV3SHRtbCA9ICcnO1xuXHRcdFx0XHRcdGlmIFtcIi5wZGZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiXS5pbmRleE9mKGZpbGVOYW1lLnNsaWNlKC00KSkgPiAtMVxuXHRcdFx0XHRcdFx0ZmlsZVByZXZpZXdIdG1sID0gXCImZW5zcDs8YSBocmVmPScje2ZpbGVVcmx9JyB0YXJnZXQ9J19ibGFuaycgY2xhc3M9J2FudGQtTGluayc+PHNwYW4gY2xhc3M9J2FudGQtVHBsRmllbGQnPjxzcGFuPumihOiniDwvc3Bhbj48L3NwYW4+PC9hPlwiXG5cdFx0XHRcdFx0cmV0dXJuIFwiPGRpdj48YSBocmVmPScje2ZpbGVVcmwrJz9kb3dubG9hZD10cnVlJ30nIHRhcmdldD0nX2JsYW5rJz4je2ZpbGVOYW1lfTwvYT4gI3tmaWxlUHJldmlld0h0bWwgPyBmaWxlUHJldmlld0h0bWwgOiAnJ308L2Rpdj5cIlxuXG5cdFx0XHRcdHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcblx0XHR3aGVuICdsb29rdXAnXG5cdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRpZiAhZmllbGQuaXNfbXVsdGlzZWxlY3Rcblx0XHRcdFx0XHR2YWx1ZSA9IFt2YWx1ZV1cblx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0dWlTY2hlbWEgPSBDcmVhdG9yLmdldE9iamVjdChmaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0bmFtZUZpZWxkID0gdWlTY2hlbWE/Lk5BTUVfRklFTERfS0VZIHx8ICduYW1lJ1xuXHRcdFx0XHRcdHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvJytmaWVsZC5yZWZlcmVuY2VfdG8rJz9maWx0ZXJzPVtbXCInKyhmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCcpKydcIixcImluXCIsICcrSlNPTi5zdHJpbmdpZnkodmFsdWUpKyddXSZmaWVsZHM9W1wiX2lkXCIsXCInK25hbWVGaWVsZCsnXCJdJywge2FzeW5jOmZhbHNlfSlcblx0XHRcdFx0XHRyZWNvcmRzID0gcmVzLmRhdGEuaXRlbXNcblx0XHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRuYW1lRmllbGQgPSBTdGVlZG9zLmdldE9iamVjdE5hbWVGaWVsZEtleShmaWVsZC5yZWZlcmVuY2VfdG8pO1xuXHRcdFx0XHRcdHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoZmllbGQucmVmZXJlbmNlX3RvLCB7IGZpbHRlcnM6IFtbKGZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJyksICdpbicsIHZhbHVlXV0sIGZpZWxkczogW1wiX2lkXCIsIG5hbWVGaWVsZF0gfSk7XG5cdFx0XHRcdHZhbHVlID0gXy5tYXAgcmVjb3JkcywgKGl0ZW0pLT5cblx0XHRcdFx0XHRyZXR1cm4gXCI8YSBocmVmPScje1N0ZWVkb3MuYWJzb2x1dGVVcmwoJy9hcHAvLS8nK2ZpZWxkLnJlZmVyZW5jZV90bysnL3ZpZXcvJytpdGVtLl9pZCl9JyB0YXJnZXQ9J19ibGFuayc+I3tpdGVtW25hbWVGaWVsZF19PC9hPlwiXG5cblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5qb2luKFwiICwgXCIpO1x0XG5cdFx0d2hlbiAnaHRtbCdcblx0XHRcdHZhbHVlID0gaWYgdmFsdWUgdGhlbiBcIjxkaXYgY2xhc3M9XFxcInN0ZWVkb3MtaHRtbFxcXCI+I3t2YWx1ZX08L2Rpdj5cIiBlbHNlICcnXG5cblx0cmV0dXJuIHZhbHVlO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgPSAoZmllbGRzLCBjb2RlKSAtPlxuXHRmaWVsZCA9IGZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKVxuXHRpZiBmaWVsZFxuXHRcdGlmIGZpZWxkLm5hbWVcblx0XHRcdHJldHVybiBmaWVsZC5uYW1lXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZpZWxkLmNvZGVcblxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbiA9IChpbnN0YW5jZSktPlxuXHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcblxuXHRmb3JtX3ZlcnNpb24gPSB7fVxuXG5cdGZvcm1fZmllbGRzID0gW107XG5cblx0aWYgZm9ybS5jdXJyZW50Ll9pZCA9PSBpbnN0YW5jZS5mb3JtX3ZlcnNpb25cblx0XHRmb3JtX3ZlcnNpb24gPSBmb3JtLmN1cnJlbnRcblx0ZWxzZVxuXHRcdGZvcm1fdmVyc2lvbiA9IF8ud2hlcmUoZm9ybS5oaXN0b3J5cywge19pZDogaW5zdGFuY2UuZm9ybV92ZXJzaW9ufSlbMF1cblxuXHRmb3JtX3ZlcnNpb24uZmllbGRzLmZvckVhY2ggKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuXHRcdFx0aWYgZmllbGQuZmllbGRzXG5cdFx0XHRcdGZpZWxkLmZpZWxkcy5mb3JFYWNoIChmKSAtPlxuXHRcdFx0XHRcdGZvcm1fZmllbGRzLnB1c2goZik7XG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRcdGZpZWxkWydzZmllbGRzJ10gPSBmaWVsZFsnZmllbGRzJ11cblx0XHRcdGRlbGV0ZSBmaWVsZFsnZmllbGRzJ11cblx0XHRcdGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuXHRcdGVsc2Vcblx0XHRcdGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuXG5cdGZvcm1fdmVyc2lvbi5maWVsZHMgPSBmb3JtX2ZpZWxkcztcblxuXHRyZXR1cm4gZm9ybV92ZXJzaW9uO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24gPSAoaW5zdGFuY2UpLT5cblx0ZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoaW5zdGFuY2UuZmxvdyk7XG5cdGZsb3dfdmVyc2lvbiA9IHt9XG5cdGlmIGZsb3cuY3VycmVudC5faWQgPT0gaW5zdGFuY2UuZmxvd192ZXJzaW9uXG5cdFx0Zmxvd192ZXJzaW9uID0gZmxvdy5jdXJyZW50XG5cdGVsc2Vcblx0XHRmbG93X3ZlcnNpb24gPSBfLndoZXJlKGZsb3cuaGlzdG9yeXMsIHtfaWQ6IGluc3RhbmNlLmZsb3dfdmVyc2lvbn0pWzBdXG5cblx0cmV0dXJuIGZsb3dfdmVyc2lvbjtcblxuXG5fZ2V0Vmlld0h0bWwgPSAocGF0aCkgLT5cblx0dmlld0h0bWwgPSBBc3NldHMuZ2V0VGV4dChwYXRoKVxuXG5cdGlmIHZpZXdIdG1sXG5cdFx0dmlld0h0bWwgPSB2aWV3SHRtbC5yZXBsYWNlKC88dGVtcGxhdGVbXFx3XFxzXFxcIlxcPSddKz4vaSxcIlwiKS5yZXBsYWNlKC88XFwvdGVtcGxhdGU+L2ksXCJcIilcblxuXHRyZXR1cm4gdmlld0h0bWw7XG5cbl9nZXRMb2NhbGUgPSAodXNlciktPlxuXHRpZiB1c2VyPy5sb2NhbGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXHRlbHNlIGlmIHVzZXI/LmxvY2FsZT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnZW4tdXMnXG5cdFx0bG9jYWxlID0gXCJlblwiXG5cdGVsc2Vcblx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0cmV0dXJuIGxvY2FsZVxuXG5cbl9nZXRSZXF1aXJlZEZpZWxkcyA9IChmaWVsZHMsIHJldiktPlxuXHRpZiAhcmV2XG5cdFx0cmV2ID0gW107XG5cblx0ZmllbGRzLmZvckVhY2ggKGZpZWxkKS0+XG5cdFx0aWYgZmllbGQudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdF9nZXRSZXF1aXJlZEZpZWxkcyhmaWVsZC5maWVsZHMsIHJldilcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXG5cdFx0ZWxzZVxuXHRcdFx0aWYgZmllbGQuaXNfcmVxdWlyZWRcblx0XHRcdFx0cmV2LnB1c2ggZmllbGQuY29kZVxuXHRyZXR1cm4gcmV2O1xuXG5fZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMgPSAoZmllbGRzLCBzdGVwcyktPlxuXHRzdGFydFN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcF90eXBlXCIsXCJzdGFydFwiKVxuXG5cdGVkaXRhYmxlQ29kZSA9IFtdXG5cblx0Xy5rZXlzKHN0YXJ0U3RlcC5wZXJtaXNzaW9ucykuZm9yRWFjaCAoa2V5KS0+XG5cdFx0aWYgc3RhcnRTdGVwLnBlcm1pc3Npb25zW2tleV0gPT0gJ2VkaXRhYmxlJ1xuXHRcdFx0ZWRpdGFibGVDb2RlLnB1c2gga2V5XG5cblx0cmV0dXJuIGVkaXRhYmxlQ29kZVxuXG5fZ2V0U3RhcnRTdGVwUmVxdWlyZWRGaWVsZHMgPSAoZmllbGRzLCBzdGVwcyktPlxuXHRyZXF1aXJlZEZpZWxkcyA9IF9nZXRSZXF1aXJlZEZpZWxkcyhmaWVsZHMpXG5cblx0ZWRpdGFibGVDb2RlID0gX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzKGZpZWxkcywgc3RlcHMpXG5cblx0cmV0dXJuIF8uaW50ZXJzZWN0aW9uKHJlcXVpcmVkRmllbGRzLCBlZGl0YWJsZUNvZGUpXG5cbl9nZXRUZW1wbGF0ZURhdGEgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdGZvcm1fdmVyc2lvbiA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKGluc3RhbmNlKVxuXHRlbHNlXG5cdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpXG5cblx0bG9jYWxlID0gX2dldExvY2FsZSh1c2VyKVxuXG5cdHN0ZWVkb3NEYXRhID0ge31cblxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRzdGVlZG9zRGF0YSA9IF8uY2xvbmUoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpKVxuXHRcdHN0ZWVkb3NEYXRhLmluc25hbWUgPSBpbnN0YW5jZS5uYW1lXG5cdFx0c3RlZWRvc0RhdGEuaW5zX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGVcblx0XHRzdGVlZG9zRGF0YS5pbnNfZmluYWxfZGVjaXNpb24gPSBpbnN0YW5jZS5pbnNfZmluYWxfZGVjaXNpb25cblx0XHRzdGVlZG9zRGF0YS5pbnNfY29kZSA9IGluc3RhbmNlLmNvZGVcblx0XHRzdGVlZG9zRGF0YS5pbnNfaXNfYXJjaGl2ZWQgPSBpbnN0YW5jZS5pc19hcmNoaXZlZFxuXHRcdHN0ZWVkb3NEYXRhLmluc19pc19kZWxldGVkID0gaW5zdGFuY2UuaW5zX2lzX2RlbGV0ZWRcblx0XHRzdGVlZG9zRGF0YS5hcHBsaWNhbnRfbmFtZSA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cdFx0c3RlZWRvc0RhdGEuYXBwbGljYW50Q29udGV4dCA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cblx0c3RlZWRvc0RhdGEuaW5zdGFuY2UgPSBpbnN0YW5jZVxuXHRzdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb24gPSBmb3JtX3ZlcnNpb25cblx0c3RlZWRvc0RhdGEubG9jYWxlID0gbG9jYWxlXG5cdHN0ZWVkb3NEYXRhLnV0Y09mZnNldCA9IHVzZXIudXRjT2Zmc2V0XG5cdHN0ZWVkb3NEYXRhLnNwYWNlID0gaW5zdGFuY2Uuc3BhY2Vcblx0c3RlZWRvc0RhdGEuc2Vzc2lvblVzZXJJZCA9IHVzZXIuX2lkXG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0aWYgb3B0aW9ucz8uZWRpdGFibGVcblx0XHRcdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlLmZvcm19KVxuXG5cdFx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkOiBpbnN0YW5jZS5mbG93fSlcblxuXHRcdFx0c3RlZWRvc0RhdGEuc3RhcnRTdGVwRWRpdGFibGVGaWVsZHMgPSBfZ2V0U3RhcnRTdGVwRWRpdGFibGVGaWVsZHMoZm9ybS5jdXJyZW50LmZpZWxkcywgZmxvdy5jdXJyZW50LnN0ZXBzKTtcblxuXHRyZXR1cm4gc3RlZWRvc0RhdGE7XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlID0gKGRhdGUsIHV0Y09mZnNldCktPlxuXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRwYXNzaW5nID0gZmFsc2U7XG5cdGVsc2Vcblx0XHRwYXNzaW5nID0gdHJ1ZTtcblxuXHRpZiAhdXRjT2Zmc2V0ICYmIHV0Y09mZnNldCAhPTBcblx0XHR1dGNPZmZzZXQgPSA4XG5cblx0cmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0LCBwYXNzaW5nKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tXCIpO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0VGltZSA9IChkYXRlKS0+XG5cdHV0Y09mZnNldCA9IDBcblx0cmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0KS5mb3JtYXQoXCJISDptbVwiKTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXG5cdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG5cblx0aWYgb3B0aW9ucz8uYWJzb2x1dGVcblx0XHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG5cblx0aW5zdGFuY2VUZW1wbGF0ZSA9IFRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZShpbnN0YW5jZSwgb3B0aW9ucz8udGVtcGxhdGVOYW1lKTtcblxuXHRpbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZS5yZXBsYWNlKC9hZlNlbGVjdFVzZXIvZyxcImFmU2VsZWN0VXNlclJlYWRcIilcblxuXHRpZiAhb3B0aW9ucz8uZWRpdGFibGVcblx0XHRpbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZS5yZXBsYWNlKC9hZkZvcm1Hcm91cC9nLFwiYWZGb3JtR3JvdXBSZWFkXCIpXG5cblx0aW5zdGFuY2VDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW5zdGFuY2VUZW1wbGF0ZSwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdGluc3RhbmNlUmVuZGVyRnVuY3Rpb24gPSBldmFsKGluc3RhbmNlQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJpbnN0YW5jZV9yZWFkb25seV92aWV3XCIsIGluc3RhbmNlUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuaGVscGVycyBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzXG5cblx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluaXQoc3RlZWRvc0RhdGEpO1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LCBzdGVlZG9zRGF0YSlcblxuXHRyZXR1cm4gXCJcIlwiXG5cdFx0PGRpdiBpZD0naW5zdGFuY2Vmb3JtJyA+XG5cdFx0XHQje2JvZHl9XG5cdFx0PC9kaXY+XG5cdFwiXCJcIlxuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuXHRpZiBmb3JtLmluc3RhbmNlX3N0eWxlID09IFwidGFibGVcIiB8fCBvcHRpb25zPy50ZW1wbGF0ZU5hbWUgPT0gXCJ0YWJsZVwiXG5cdFx0dHJhY2VzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3RyYWNlc190YWJsZS5odG1sJylcblx0ZWxzZVxuXHRcdHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXMuaHRtbCcpXG5cblx0dHJhY2VDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodHJhY2VzSHRtbCwge2lzQm9keTogdHJ1ZX0pO1xuXG5cdHRyYWNlUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRyYWNlQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJ0cmFjZV9yZWFkb25seV92aWV3XCIsIHRyYWNlUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YVxuXG5cdFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcuaGVscGVycyBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzXG5cblx0Ym9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnRyYWNlX3JlYWRvbmx5X3ZpZXcsIGluc3RhbmNlLnRyYWNlcylcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEF0dGFjaG1lbnRWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSktPlxuXG5cdHN0ZWVkb3NEYXRhID0gX2dldFRlbXBsYXRlRGF0YSh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpXG5cblx0YXR0YWNobWVudEh0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9pbnN0YW5jZV9hdHRhY2htZW50cy5odG1sJylcblxuXHRhdHRhY2htZW50Q29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGF0dGFjaG1lbnRIdG1sLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0YXR0YWNobWVudFJlbmRlckZ1bmN0aW9uID0gZXZhbChhdHRhY2htZW50Q29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJhdHRhY2htZW50c19yZWFkb25seV92aWV3XCIsIGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldy5oZWxwZXJzIEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnNcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldylcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRJbnN0YW5jZXNWaWV3ID0gKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyktPlxuXHRzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKVxuXG5cdHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG5cblx0aWYgb3B0aW9ucz8uYWJzb2x1dGVcblx0XHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG5cblx0cmVsYXRlZEluc3RhbmNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9yZWxhdGVkX2luc3RhbmNlcy5odG1sJylcblxuXHRyZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHJlbGF0ZWRJbnN0YW5jZXNIdG1sLCB7aXNCb2R5OiB0cnVlfSk7XG5cblx0cmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uID0gZXZhbChyZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQpO1xuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX2luc3RhbmNlc192aWV3XCIsIHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhXG5cblx0VGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5oZWxwZXJzIFJlbGF0ZWRJbnN0YW5jZXMuaGVscGVyc1xuXG5cdGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LCBzdGVlZG9zRGF0YSlcblxuXHRyZXR1cm4gYm9keTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRSZWNvcmRzVmlldyA9ICh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpLT5cblx0c3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblxuXHRzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IGZhbHNlO1xuXG5cdGlmIG9wdGlvbnM/LmFic29sdXRlXG5cdFx0c3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuXG5cdHJlbGF0ZWRSZWNvcmRzSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL3JlbGF0ZWRfcmVjb3Jkcy5odG1sJylcblxuXHRyZWxhdGVkUmVjb3Jkc0NvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShyZWxhdGVkUmVjb3Jkc0h0bWwsIHtpc0JvZHk6IHRydWV9KTtcblxuXHRyZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uID0gZXZhbChyZWxhdGVkUmVjb3Jkc0NvbXBpbGVkKTtcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInJlbGF0ZWRfcmVjb3Jkc192aWV3XCIsIHJlbGF0ZWRSZWNvcmRzUmVuZGVyRnVuY3Rpb24pO1xuXG5cdFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGFcblxuXHRUZW1wbGF0ZS5yZWxhdGVkX3JlY29yZHNfdmlldy5oZWxwZXJzIFJlbGF0ZWRSZWNvcmRzLmhlbHBlcnNcblxuXHRib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcsIHN0ZWVkb3NEYXRhKVxuXG5cdHJldHVybiBib2R5O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0T25Mb2FkU2NyaXB0ID0gKGluc3RhbmNlKS0+XG5cdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtVmVyc2lvbihpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pXG5cblx0Zm9ybV9zY3JpcHQgPSBmb3JtX3ZlcnNpb24uZm9ybV9zY3JpcHQ7XG5cblx0aWYgZm9ybV9zY3JpcHQgJiYgZm9ybV9zY3JpcHQucmVwbGFjZSgvXFxuL2csXCJcIikucmVwbGFjZSgvXFxzL2csXCJcIikubGVuZ3RoID4gMFxuXHRcdGZvcm1fc2NyaXB0ID0gXCJDb3JlRm9ybSA9IHt9O0NvcmVGb3JtLmluc3RhbmNlZm9ybSA9IHt9O1wiICsgZm9ybV9zY3JpcHRcblx0XHRmb3JtX3NjcmlwdCArPSBcIjtpZihDb3JlRm9ybS5mb3JtX09uTG9hZCl7d2luZG93Lm9ubG9hZCA9IENvcmVGb3JtLmZvcm1fT25Mb2FkKCk7fVwiXG5cdGVsc2Vcblx0XHRmb3JtX3NjcmlwdCA9IFwiXCJcblxuXG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwgPSAodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKS0+XG5cblx0Ym9keSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZVZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcblxuXHRvbkxvYWRTY3JpcHQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0T25Mb2FkU2NyaXB0KGluc3RhbmNlKTtcblxuXHRjcmVhdG9yU2VydmljZSA9IE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXM/LmNyZWF0b3I/LnVybFxuXHRpbnNfcmVjb3JkX2lkcyA9IGluc3RhbmNlLnJlY29yZF9pZHNcblx0bG9jYWxlID0gX2dldExvY2FsZSh1c2VyKTtcblx0b3BlbkZpbGVTY3JpcHQgPSBcIlwiXCJcblx0XHRcdGlmKHdpbmRvdy5pc05vZGUgJiYgaXNOb2RlKCkpe1xuXHRcdFx0XHRhdHRhY2hzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImluc19hdHRhY2hfaHJlZlwiKTtcblx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IGF0dGFjaHMubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdGF0dGFjaCA9IGF0dGFjaHNbaV07XG5cdFx0XHRcdFx0YXR0YWNoLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRcdGlmKGlzSW1hZ2UodGhpcy5kYXRhc2V0LnR5cGUpIHx8IGlzSHRtbCh0aGlzLmRhdGFzZXQudHlwZSkpe1xuXHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdG9wZW5XaW5kb3coXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cIiArIHRoaXMuZGF0YXNldC5pZCk7XG5cdFx0XHRcdFx0XHR9ZWxzZSBpZihud19jb3JlLmNhbk9wZW5GaWxlKHRoaXMuZGF0YXNldC5uYW1lKSl7XG5cdFx0XHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0bndfY29yZS5vcGVuRmlsZSh0aGlzLmhyZWYsIHRoaXMuZGF0YXNldC5uYW1lKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmbG93ID0gXCIje2luc3RhbmNlLmZsb3d9XCI7XG5cdFx0XHR2YXIgc3BhY2UgPSBcIiN7aW5zdGFuY2Uuc3BhY2V9XCI7XG5cblx0XHRcdGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKXtcblx0XHRcdFx0bGV0IHBhdHRlcm4gPSBSZWdFeHAobmFtZSArIFwiPS5bXjtdKlwiKVxuXHRcdFx0XHRsZXQgbWF0Y2hlZCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChwYXR0ZXJuKVxuXHRcdFx0XHRpZihtYXRjaGVkKXtcblx0XHRcdFx0XHRsZXQgY29va2llID0gbWF0Y2hlZFswXS5zcGxpdCgnPScpXG5cdFx0XHRcdFx0cmV0dXJuIGNvb2tpZVsxXVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAnJ1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVjb3JkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJpbnMtcmVsYXRlZC1yZWNvcmRzXCIpO1xuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspe1xuXHRcdFx0XHRcdHZhciByZWNvcmQgPSByZWNvcmRzW2ldO1xuXHRcdFx0XHRcdHJlY29yZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSl7XG5cdFx0XHRcdFx0XHR2YXIgY3JlYXRvclNlcnZpY2UgPSBcIiN7Y3JlYXRvclNlcnZpY2V9XCJcblx0XHRcdFx0XHRcdHZhciBpbnNfcmVjb3JkX2lkcyA9ICN7SlNPTi5zdHJpbmdpZnkoaW5zX3JlY29yZF9pZHMpfVxuXHRcdFx0XHRcdFx0aWYoY3JlYXRvclNlcnZpY2UgJiYgaW5zX3JlY29yZF9pZHMgJiYgaW5zX3JlY29yZF9pZHMubGVuZ3RoID4gMCl7XG5cdFx0XHRcdFx0XHRcdHZhciBvYmpjZXROYW1lID0gaW5zX3JlY29yZF9pZHNbMF0ub1xuXHRcdFx0XHRcdFx0XHR2YXIgaWQgPSBpbnNfcmVjb3JkX2lkc1swXS5pZHNbMF1cblx0XHRcdFx0XHRcdFx0dmFyIHVvYmogPSB7fTtcblx0XHRcdFx0XHRcdFx0dW9ialtcIlgtVXNlci1JZFwiXSA9IGdldENvb2tpZShcIlgtVXNlci1JZFwiKTtcblx0XHRcdFx0XHRcdFx0dW9ialtcIlgtQXV0aC1Ub2tlblwiXSA9IGdldENvb2tpZShcIlgtQXV0aC1Ub2tlblwiKTtcblx0XHRcdFx0XHRcdFx0cmVkaXJlY3RVcmwgPSBjcmVhdG9yU2VydmljZSArIFwiYXBwLy0vXCIgKyBvYmpjZXROYW1lICsgXCIvdmlldy9cIiArIGlkICsgXCI/XCIgKyAkLnBhcmFtKHVvYmopO1xuXHRcdFx0XHRcdFx0XHRvcGVuV2luZG93KHJlZGlyZWN0VXJsKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFwiXCJcIjtcblxuXG5cdGlmICFTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcblx0XHRpZiBmb3JtPy5pbnN0YW5jZV9zdHlsZSA9PSAndGFibGUnXG5cdFx0XHRpbnN0YW5jZV9zdHlsZSA9IFwiaW5zdGFuY2UtdGFibGVcIlxuXG5cdGlmIG9wdGlvbnM/LnRlbXBsYXRlTmFtZSA9PSAndGFibGUnXG5cdFx0aW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCJcblxuXHRpZiBvcHRpb25zPy5pbnN0YW5jZV9zdHlsZVxuXHRcdGluc3RhbmNlX3N0eWxlID0gb3B0aW9ucy5pbnN0YW5jZV9zdHlsZVxuXG5cdGlmICFvcHRpb25zIHx8IG9wdGlvbnMuc2hvd1RyYWNlID09IHRydWVcblx0XHR0cmFjZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRUcmFjZXNWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblx0ZWxzZVxuXHRcdHRyYWNlID0gXCJcIlxuXG5cdGluc3RhbmNlQm94U3R5bGUgPSBcIlwiO1xuXG5cdGlmIGluc3RhbmNlICYmIGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uXG5cdFx0aWYgaW5zdGFuY2UuZmluYWxfZGVjaXNpb24gPT0gXCJhcHByb3ZlZFwiXG5cdFx0XHRpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtc3VjY2Vzc1wiXG5cdFx0ZWxzZSBpZiAoaW5zdGFuY2UuZmluYWxfZGVjaXNpb24gPT0gXCJyZWplY3RlZFwiKVxuXHRcdFx0aW5zdGFuY2VCb3hTdHlsZSA9IFwiYm94LWRhbmdlclwiXG5cdGlmICFvcHRpb25zIHx8IG9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzID09IHRydWVcblx0XHRhdHRhY2htZW50ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEF0dGFjaG1lbnRWaWV3KHVzZXIsIHNwYWNlLCBpbnN0YW5jZSlcblx0XHRyZWxhdGVkX2luc3RhbmNlcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cdFx0cmVsYXRlZF9yZWNvcmRzID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRSZWNvcmRzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cdGVsc2Vcblx0XHRhdHRhY2htZW50ID0gXCJcIlxuXHRcdHJlbGF0ZWRfaW5zdGFuY2VzID0gXCJcIlxuXHRcdHJlbGF0ZWRfcmVjb3JkcyA9IFwiXCJcblxuXG5cdHdpZHRoID0gXCI5NjBweFwiXG5cdCNcdOWmguaenOe7mXRhYmxl55qEcGFyZW506K6+572ud2lkdGjvvIzliJnkvJrlr7zoh7TpmL/ph4zkupHpgq7nrrHmmL7npLp0YWJsZSDlvILluLhcblx0aWYgb3B0aW9ucz8ud2lkdGhcblx0XHR3aWR0aCA9IFwiXCJcblxuXHRjc3NIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKFwic3RlZWRvcy1jc3NcIilcblx0XG5cdGpxSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcIndlYnNpdGUvbGlicy9qcXVlcnkubWluLmpzXCIpXG5cblx0YWxsQ3NzTGluayA9IFwiXCJcIjxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBjbGFzcz1cIl9fbWV0ZW9yLWNzc19fXCIgaHJlZj1cIiN7Y3NzSHJlZn1cIj5cIlwiXCJcblxuXHR0cmFjZUNoZWNrID0gXCJcIlxuXHRpZiAhXy5pc0VtcHR5KHRyYWNlKVxuXHRcdHRyYWNlQ2hlY2sgPSBcImNoZWNrZWRcIlxuXHRpZiBvcHRpb25zPy50YWdnZXIgPT0gJ2VtYWlsJyB8fCBvcHRpb25zPy5lZGl0YWJsZVxuXHRcdHNob3dUcmFjZXNCdG4gPSBcIlwiXG5cdGVsc2Vcblx0XHRzaG93VHJhY2VzQnRuID0gXCJcIlwiXG5cdFx0XHQ8ZGl2IGNsYXNzPVwibmF2aWdhdGlvbi1iYXIgYnRuLWdyb3VwIG5vLXByaW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDYwMHB4OyB6LWluZGV4OiA5OTk7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJwcmludC10b29sXCI+XG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY2J4LWxhYmVsXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2J4LXByaW50IGNieC1wcmludC1hdHRhY2htZW50c1wiIGlkPVwiY2J4LXByaW50LWF0dGFjaG1lbnRzXCIgY2hlY2tlZD1cImNoZWNrZWRcIj48c3Bhbj4je1RBUGkxOG4uX18oJ2luc3RhbmNlX2F0dGFjaG1lbnQnLCB7fSwgbG9jYWxlKX08L3NwYW4+PC9sYWJlbD5cblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjYngtbGFiZWxcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjYngtcHJpbnQgY2J4LXByaW50LXRyYWNlc1wiIGlkPVwiY2J4LXByaW50LXRyYWNlc1wiIGNoZWNrZWQ9XCIje3RyYWNlQ2hlY2t9XCI+PHNwYW4+I3tUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZhbF9oaXN0b3J5Jywge30sIGxvY2FsZSl9PC9zcGFuPjwvbGFiZWw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHRcIlwiXCJcblxuXHRzaG93VHJhY2VzU2NyaXB0ID0gXCJcIlwiXG5cdFx0JCggZG9jdW1lbnQgKS5yZWFkeShmdW5jdGlvbigpe1xuXHRcdFx0dmFyIGIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2J4LXByaW50LXRyYWNlcycpO1xuXHRcdFx0dmFyIHQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnN0YW5jZS10cmFjZXMnKVswXTtcblx0XHRcdGlmIChiICYmIGIuY2hlY2tlZCAmJiB0KXtcblx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXG5cdFx0XHR9IGVsc2UgaWYodCl7XG5cdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXG5cdFx0XHR9XG5cdFx0XHRpZihiKXtcblx0XHRcdFx0Yi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcblx0XHRcdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XG5cdFx0XHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cblx0XHRcdHZhciBhdHRhY2htZW50c0NoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NieC1wcmludC1hdHRhY2htZW50cycpO1xuXHRcdFx0dmFyIGF0dGFjaG1lbnRzVmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2F0dGFjaG1lbnRzLXNlY3Rpb24nKVswXTtcblx0XHRcdGlmIChhdHRhY2htZW50c0NoZWNrYm94ICYmIGF0dGFjaG1lbnRzQ2hlY2tib3guY2hlY2tlZCAmJiBhdHRhY2htZW50c1ZpZXcpe1xuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xuXHRcdFx0fSBlbHNlIGlmKGF0dGFjaG1lbnRzVmlldyl7XG5cdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdH1cblx0XHRcdGlmKGF0dGFjaG1lbnRzQ2hlY2tib3gpe1xuXHRcdFx0XHRhdHRhY2htZW50c0NoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHRcdGlmIChlLnRhcmdldC5jaGVja2VkKXtcblx0XHRcdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBibG9jazsnXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGF0dGFjaG1lbnRzVmlldy5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFwiXCJcIlxuXG5cdGlmIG9wdGlvbnM/LnN0eWxlc1xuXHRcdGFsbENzc0xpbmsgPSBcIlwiXG5cblx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe19pZDogaW5zdGFuY2UuZm9ybX0pO1xuXHRmb3JtRGVzY3JpcHRpb25IdG1sID0gXCJcIlxuXHRpZiBmb3JtXG5cdFx0Zm9ybURlc2NyaXB0aW9uID0gZm9ybS5kZXNjcmlwdGlvblxuXHRcdGlmIGZvcm1EZXNjcmlwdGlvblxuXHRcdFx0Zm9ybURlc2NyaXB0aW9uID0gZm9ybURlc2NyaXB0aW9uLnJlcGxhY2UoL1xcbi9nLFwiPGJyLz5cIilcblx0XHRcdGZvcm1EZXNjcmlwdGlvbkh0bWwgPSBcIlwiXCJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImJveC1oZWFkZXIgIHdpdGgtYm9yZGVyIGluc3RhbmNlLWhlYWRlclwiPlxuXHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHQje2Zvcm1EZXNjcmlwdGlvbn1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFwiXCJcIlxuXG5cdGh0bWwgPSBcIlwiXCJcblx0XHQ8IURPQ1RZUEUgaHRtbD5cblx0XHQ8aHRtbD5cblx0XHRcdDxoZWFkPlxuXHRcdFx0XHQ8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiLz5cblx0XHRcdFx0I3thbGxDc3NMaW5rfVxuXHRcdFx0XHQ8c2NyaXB0IHNyYz1cIiN7anFIcmVmfVwiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblx0XHRcdFx0PHNjcmlwdCBzcmM9XCIvanMvbndfY29yZS5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cblx0XHRcdFx0I3tvcHRpb25zLnBsdWdpbnMgfHwgXCJcIn1cblxuXHRcdFx0XHQ8c3R5bGU+XG5cdFx0XHRcdFx0LnN0ZWVkb3N7XG5cdFx0XHRcdFx0XHR3aWR0aDogI3t3aWR0aH07XG5cdFx0XHRcdFx0XHRtYXJnaW4tbGVmdDogYXV0bztcblx0XHRcdFx0XHRcdG1hcmdpbi1yaWdodDogYXV0bztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuaW5zdGFuY2UtdmlldyAuaW5zdGFuY2UtbmFtZXtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5ib3gtdG9vbHN7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYm94LmNvbGxhcHNlZC1ib3ggLmJveC1ib2R5LC5ib3guY29sbGFwc2VkLWJveCAuYm94LWZvb3RlciB7XG5cdFx0XHRcdFx0ICBkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRib2R5e1xuXHRcdFx0XHRcdFx0YmFja2dyb3VuZDogYXp1cmUgIWltcG9ydGFudDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuaW5zdGFuY2UtdmlldyAuaW5zdGFuY2UtdHJhY2Vze1xuXHRcdFx0XHRcdFx0cGFkZGluZy1sZWZ0OiAxNXB4O1xuXHRcdFx0XHRcdFx0cGFkZGluZy1yaWdodDogMTVweDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbSB7XG5cdFx0XHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tSW1hZ2VDb250cm9sLWFkZEJ0bi1ib3JkZXJSYWRpdXMpO1xuXHRcdFx0XHRcdHZlcnRpY2FsLWFsaWduOiB0b3A7XG5cdFx0XHRcdFx0cGFkZGluZzogdmFyKC0tZ2FwLXhzKTtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiB2YXIoLS1nYXAtYmFzZSk7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogdmFyKC0tZ2FwLWJhc2UpO1xuXHRcdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdFx0XHR3aWR0aDogNy41cmVtO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkIHtcblx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogdmFyKC0tRmlsZUNvbnRyb2wtZGFuZ2VyLWNvbG9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0gc3ZnLmljb24tcmVmcmVzaCB7XG5cdFx0XHRcdFx0dHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0XHRcdFx0XHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRcdFx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdFx0Y29sb3I6IHZhcigtLUZpbGVDb250cm9sLWRhbmdlci1jb2xvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSA+IHN2Zy5pY29uLWltYWdlIHtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiA4cHg7XG5cdFx0XHRcdFx0d2lkdGg6IDI0cHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAyNHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUgPiBzcGFuIHtcblx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdFx0XHRcdHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaW1hZ2Uge1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XG5cdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdFx0XHR0b3A6IDVweDtcblx0XHRcdFx0XHRyaWdodDogNXB4O1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyID4gc3ZnIHtcblx0XHRcdFx0XHR0b3A6IDA7XG5cdFx0XHRcdFx0d2lkdGg6IDEwcHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUluZm8ge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRcdFx0XHRcdHdpZHRoOiAxMTBweDtcblx0XHRcdFx0XHRoZWlnaHQ6IDExMHB4O1xuXHRcdFx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdFx0YWxpZ24tY29udGVudDogY2VudGVyO1xuXHRcdFx0XHRcdGZsZXgtd3JhcDogd3JhcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1JbmZvID4gcCB7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRcdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1wcm9ncmVzcyB7XG5cdFx0XHRcdFx0d2lkdGg6IDcwcHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiA1cHg7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2ViZWJlYjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLXByb2dyZXNzVmFsdWUge1xuXHRcdFx0XHRcdGhlaWdodDogNXB4O1xuXHRcdFx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLUltYWdlQ29udHJvbC1wcm9ncmVzcy1ib3JkZXJSYWRpdXMpO1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdGJhY2tncm91bmQ6IHZhcigtLWluZm8pO1xuXHRcdFx0XHRcdG1pbi13aWR0aDogMTAlO1xuXHRcdFx0XHRcdHRyYW5zaXRpb246IGVhc2Utb3V0IHdpZHRoIHZhcigtLWFuaW1hdGlvbi1kdXJhdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XG5cdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZDpob3ZlciAuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbUNsZWFyIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWVycm9yTXNnIHtcblx0XHRcdFx0XHRjb2xvcjogdmFyKC0tZGFuZ2VyKTtcblx0XHRcdFx0XHRtYXJnaW46IDVweCAwIDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC11cGxvYWRCdG4ge1xuXHRcdFx0XHRcdG1hcmdpbi10b3A6IDVweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BwZXJXcmFwcGVyIHtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wcGVyV3JhcHBlciBpbWcge1xuXHRcdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdFx0XHRtYXgtaGVpZ2h0OiA0MDBweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRyaWdodDogMDtcblx0XHRcdFx0XHRib3R0b206IDA7XG5cdFx0XHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdFx0XHRhbGlnbi1pdGVtczogZmxleC1lbmQ7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdFx0XHRcdFx0bWFyZ2luOiAwLjVyZW07XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAwIDRweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIgPiBhIHtcblx0XHRcdFx0XHRjb2xvcjogdmFyKC0tRm9ybS1pdGVtLWZvbnRDb2xvcik7XG5cdFx0XHRcdFx0cGFkZGluZzogMnB4IDVweDtcblx0XHRcdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxOHB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcGVyVG9vbGJhciA+IGE6aG92ZXIge1xuXHRcdFx0XHRcdGNvbG9yOiB2YXIoLS1saW5rLWNvbG9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWFjY2VwdFRpcCB7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxMjBweDtcblx0XHRcdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdFx0XHRib3JkZXI6IDJweCBkYXNoZWQgdmFyKC0tYm9yZGVyQ29sb3IpO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogdmFyKC0taW5mbyk7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2YzZjlmZTtcblx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXJSYWRpdXMpO1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxMjBweDtcblx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maXhlZC1zaXplIHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpeGVkLXNpemUgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1PdmVybGF5IHtcblx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LmFudGQtSW1hZ2VzIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0XHRcdFx0XHRtYXJnaW46IGNhbGModmFyKC0tZ2FwLXhzKSAqIC0xKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlcy1pdGVtIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdFx0XHRtYXJnaW46IHZhcigtLWdhcC14cyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZSB7XG5cdFx0XHRcdFx0XHRib3JkZXI6IHZhcigtLWJvcmRlcldpZHRoKSBzb2xpZCB2YXIoLS1ib3JkZXJDb2xvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIge1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogdmFyKC0tZ2FwLXhzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iV3JhcCB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS1pbWFnZSB7XG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlLS1sb2FkaW5nIHtcblx0XHRcdFx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLS1vcmlnaW5hbCAuYW50ZC1JbWFnZS1pbWFnZSB7XG5cdFx0XHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdFx0d2lkdGg6IGF1dG87XG5cdFx0XHRcdFx0XHRtYXJnaW46IGF1dG87XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHRcdGxlZnQ6IDUwJTtcblx0XHRcdFx0XHRcdHRvcDogNTAlO1xuXHRcdFx0XHRcdFx0bWF4LWhlaWdodDogMTAwJTtcblx0XHRcdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS1pbmZvIHtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDVweCAxMHB4O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtLXRodW1iIC5hbnRkLUltYWdlLWluZm8ge1xuXHRcdFx0XHRcdFx0d2lkdGg6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS00LTMge1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiA1LjE1NjI1cmVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTE2LTkge1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAzLjg2NzE4NzVyZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSB7XG5cdFx0XHRcdFx0XHRtaW4td2lkdGg6IDYuODc1cmVtO1xuXHRcdFx0XHRcdFx0bWluLWhlaWdodDogNi44NzVyZW07XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tZml4ZWQtc2l6ZSAuYW50ZC1JbWFnZS10aHVtYiB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iID4gaW1nIHtcblx0XHRcdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLXctZnVsbCA+IGltZyB7XG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0XHRcdGhlaWdodDogYXV0bztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCN7b3B0aW9ucz8uc3R5bGVzIHx8IFwiXCJ9XG5cblx0XHRcdFx0XHQje29wdGlvbnM/LmFkZF9zdHlsZXMgfHwgXCJcIn1cblx0XHRcdFx0PC9zdHlsZT5cblx0XHRcdDwvaGVhZD5cblx0XHRcdDxib2R5PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlZWRvcyB3b3JrZmxvdyBpbnN0YW5jZS1wcmludFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJza2luLWdyZWVuIHNraW4tYWRtaW4tbHRlXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGVudC13cmFwcGVyXCI+XG5cdFx0XHRcdFx0XHRcdFx0I3tzaG93VHJhY2VzQnRufVxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnN0YW5jZS1wcmludFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImluc3RhbmNlICN7aW5zdGFuY2Vfc3R5bGV9XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxmb3JtIG5hbWU9XCJpbnN0YW5jZUZvcm1cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zdGFuY2UtZm9ybSBib3ggI3tpbnN0YW5jZUJveFN0eWxlfVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tmb3JtRGVzY3JpcHRpb25IdG1sfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJveC1ib2R5XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiBzdHlsZT1cImJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0nYXR0YWNobWVudHMtc2VjdGlvbic+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje2F0dGFjaG1lbnR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQje3JlbGF0ZWRfaW5zdGFuY2VzfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tyZWxhdGVkX3JlY29yZHN9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0I3tib2R5fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Zvcm0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCN7dHJhY2V9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvYm9keT5cblx0XHRcdDxzY3JpcHQ+I3tvcGVuRmlsZVNjcmlwdH07I3tvbkxvYWRTY3JpcHR9OyN7c2hvd1RyYWNlc1NjcmlwdH08L3NjcmlwdD5cblx0XHQ8L2h0bWw+XG5cdFwiXCJcIlxuXG5cdHJldHVybiBodG1sIiwidmFyIF9nZXRMb2NhbGUsIF9nZXRSZXF1aXJlZEZpZWxkcywgX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzLCBfZ2V0U3RhcnRTdGVwUmVxdWlyZWRGaWVsZHMsIF9nZXRUZW1wbGF0ZURhdGEsIF9nZXRWaWV3SHRtbCwgZ2V0TGlua1RleHQsIG1hcmtlZDsgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5tYXJrZWQgPSByZXF1aXJlKFwibWFya2VkXCIpO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUgPSB7fTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmluc3RhbmNlX2F0dGFjaG1lbnQgPSBcIjx0cj5cXG5cdDx0ZCBjbGFzcz1cXFwiaW5zLWF0dGFjaC12aWV3XFxcIj5cXG5cdFx0PGEgaHJlZj1cXFwie3tpbnNfYXR0YWNoX2Rvd25sb2FkX3VybCBfaWQgYWJzb2x1dGV9fVxcXCIgY2xhc3M9XFxcImluc19hdHRhY2hfaHJlZlxcXCIgdGFyZ2V0PVxcXCJfcGFyZW50XFxcIiBkYXRhLW5hbWU9XFxcInt7dGhpcy5uYW1lfX1cXFwiIGRhdGEtdHlwZT1cXFwie3t0aGlzLm9yaWdpbmFsLnR5cGV9fVxcXCIgZGF0YS1pZD1cXFwie3tfaWR9fVxcXCI+e3t0aGlzLm5hbWV9fTwvYT5cXG5cdDwvdGQ+XFxuPC90cj5cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmU2VsZWN0VXNlclJlYWQgPSBcIjxkaXYgY2xhc3M9J3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnPnt7dmFsdWV9fTwvZGl2PlwiO1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuYWZGb3JtR3JvdXBSZWFkID0gXCI8ZGl2IGNsYXNzPSdmb3JtLWdyb3VwJz5cXG5cdHt7I3dpdGggZ2V0RmllbGQgdGhpcy5uYW1lfX1cXG5cdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3NlY3Rpb24nfX1cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J3NlY3Rpb24gY2FsbG91dCBjYWxsb3V0LWRlZmF1bHQnPlxcblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Zl9sYWJlbCB0aGlzfX08L2xhYmVsPlxcblx0XHRcdFx0XHQ8cD57e3tkZXNjcmlwdGlvbn19fTwvcD5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHR7e2Vsc2V9fVxcblx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICd0YWJsZSd9fVxcblx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdCBzdGVlZG9zLXRhYmxlXFxcIj5cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwtYm9keVxcXCIgc3R5bGU9XFxcInBhZGRpbmc6MHB4O1xcXCI+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCIgPlxcblx0XHRcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPSdjb250cm9sLWxhYmVsJz57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cXFwiZGVzY3JpcHRpb25cXFwiPnt7e2Rlc2NyaXB0aW9ufX19PC9zcGFuPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcInJlYWRvbmx5LXRhYmxlXFxcIiBzdHlsZT1cXFwicGFkZGluZzowcHg7b3ZlcmZsb3cteDphdXRvO1xcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdDx0YWJsZSB0eXBlPSd0YWJsZScgY2xhc3M9XFxcInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWNvbmRlbnNlZCBhdXRvZm9ybS10YWJsZVxcXCIgc3R5bGU9J21hcmdpbi1ib3R0b206MHB4Oycge3t0aGlzLmF0dHN9fSBpZD1cXFwie3t0aGlzLmNvZGV9fVRhYmxlXFxcIiBuYW1lPVxcXCJ7e3RoaXMuY29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7dGhpcy5uYW1lfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdDx0aGVhZCBpZD1cXFwie3t0aGlzLm5hbWV9fVRoZWFkXFxcIiBuYW1lPVxcXCJ7e3RoaXMubmFtZX19VGhlYWRcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVUaGVhZCB0aGlzfX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC90aGVhZD5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dGJvZHkgaWQ9XFxcInt7dGhpcy5uYW1lfX1UYm9keVxcXCIgbmFtZT1cXFwie3t0aGlzLm5hbWV9fVRib2R5XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7e2dldFRhYmxlQm9keSB0aGlzfX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0PC90Ym9keT5cXG5cdFx0XHRcdFx0XHRcdFx0PC90YWJsZT5cXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0e3sjaWYgc2hvd0xhYmVsfX1cXG5cdFx0XHRcdFx0PGxhYmVsPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdHt7L2lmfX1cXG5cdFx0XHRcdHt7I2lmIGlzVGV4dGFyZWEgdGhpc319XFxuXHRcdFx0XHRcdDxwIGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvcD5cXG5cdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9J3t7Z2V0Q2ZDbGFzcyB0aGlzfX0gZm9ybS1jb250cm9sJyByZWFkb25seSBkaXNhYmxlZD57e3tnZXRWYWx1ZSBjb2RlfX19PC9kaXY+XFxuXHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0e3svaWZ9fVxcblx0XHR7ey9pZn19XFxuXHR7ey93aXRofX1cXG48L2Rpdj5cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmFmRm9ybUdyb3VwID0gXCJcXG57eyN3aXRoIGdldEZpZWxkIHRoaXMubmFtZX19XFxuXHRcdHt7I2lmIGVxdWFscyB0eXBlICdzZWN0aW9uJ319XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdzZWN0aW9uIGNhbGxvdXQgY2FsbG91dC1kZWZhdWx0Jz5cXG5cdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2ZfbGFiZWwgdGhpc319PC9sYWJlbD5cXG5cdFx0XHRcdFx0PHA+e3t7ZGVzY3JpcHRpb259fX08L3A+XFxuXHRcdFx0XHQ8L2Rpdj5cXG4gIFx0XHRcdFx0PC9kaXY+XFxuXHRcdHt7ZWxzZX19XFxuXHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3RhYmxlJ319XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0IHN0ZWVkb3MtdGFibGVcXFwiPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIiBzdHlsZT1cXFwicGFkZGluZzowcHg7XFxcIj5cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJwYW5lbC1oZWFkaW5nXFxcIiA+XFxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9J2NvbnRyb2wtbGFiZWwnPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVxcXCJkZXNjcmlwdGlvblxcXCI+e3t7ZGVzY3JpcHRpb259fX08L3NwYW4+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwicmVhZG9ubHktdGFibGVcXFwiIHN0eWxlPVxcXCJwYWRkaW5nOjBweDtvdmVyZmxvdy14OmF1dG87XFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PHRhYmxlIHR5cGU9J3RhYmxlJyBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtY29uZGVuc2VkIGF1dG9mb3JtLXRhYmxlXFxcIiBzdHlsZT0nbWFyZ2luLWJvdHRvbTowcHg7JyB7e3RoaXMuYXR0c319IGlkPVxcXCJ7e3RoaXMuY29kZX19VGFibGVcXFwiIG5hbWU9XFxcInt7dGhpcy5jb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3t0aGlzLm5hbWV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0PHRoZWFkIGlkPVxcXCJ7e3RoaXMubmFtZX19VGhlYWRcXFwiIG5hbWU9XFxcInt7dGhpcy5uYW1lfX1UaGVhZFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e3tnZXRUYWJsZVRoZWFkIHRoaXN9fX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3RoZWFkPlxcblx0XHRcdFx0XHRcdFx0XHRcdDx0Ym9keSBpZD1cXFwie3t0aGlzLm5hbWV9fVRib2R5XFxcIiBuYW1lPVxcXCJ7e3RoaXMubmFtZX19VGJvZHlcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3t7Z2V0VGFibGVCb2R5IHRoaXN9fX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3Rib2R5Plxcblx0XHRcdFx0XHRcdFx0XHQ8L3RhYmxlPlxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnaW5wdXQnfX1cXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1yZXF1aXJlZD1cXFwie3sjaWYgaXNfcmVxdWlyZWR9fXRydWV7ey9pZn19XFxcIj5cXG5cdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHR7eyNpZiBpc190ZXh0YXJlYX19XFxuXHRcdFx0XHRcdFx0XHQ8dGV4dGFyZWEgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIge3tnZXRQZXJtaXNzaW9ucyBjb2RlfX0gZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+PC90ZXh0YXJlYT5cXG5cdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0e3sjdW5sZXNzIGlzX3RleHRhcmVhfX1cXG5cdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiB7e2dldFBlcm1pc3Npb25zIGNvZGV9fSBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHR7ey91bmxlc3N9fVxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdudW1iZXInfX1cXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcIm51bWJlclxcXCIgdGl0bGU9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBuYW1lPVxcXCJ7e2NvZGV9fVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2RhdGUnfX1cXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInRleHRcXFwiIHRpdGxlPVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtdHlwZT1cXFwiZGF0ZVxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCI+XFxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ2RhdGVUaW1lJ319XFxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXR5cGU9J2RhdGV0aW1lJyBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAncGFzc3dvcmQnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcInBhc3N3b3JkXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnc2VsZWN0J319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzZWxlY3QgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2VhY2ggb3B0aW9ucyB0aGlzfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XFxcInt7dmFsdWV9fVxcXCI+e3tsYWJlbH19PC9vcHRpb24+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svZWFjaH19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvc2VsZWN0Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0e3tlbHNlfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7I2lmIGVxdWFscyB0eXBlICdyYWRpbyd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVxcXCI3WlFuRHNYQkdvaFpNZXRBNVxcXCIgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7Z2V0TGFiZWwgY29kZX19PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJhZi1yYWRpby1ncm91cFxcXCIgZGF0YS1zY2hlbWEta2V5PVxcXCJ7e2dldExhYmVsIGNvZGV9fVxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XFxuICAgICAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcInJhZGlvLWlubGluZSBmaXgtaW5kZW50XFxcIj48aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIHZhbHVlPVxcXCJ7e3ZhbHVlfX1cXFwiIG5hbWU9XFxcInt7Li4vY29kZX19XFxcIiBjbGFzcz1cXFwicmFkaW8taW5saW5lIGZpeC1pbmRlbnRcXFwiPiB7e2xhYmVsfX08L2xhYmVsPlxcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2VhY2h9fVxcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnbXVsdGlTZWxlY3QnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiYWYtY2hlY2tib3gtZ3JvdXBcXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNlYWNoIG9wdGlvbnMgdGhpc319XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwiY2hlY2tib3gtaW5saW5lIGZpeC1pbmRlbnRcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgdmFsdWU9XFxcInt7dmFsdWV9fVxcXCIgbmFtZT1cXFwie3suLi9jb2RlfX1cXFwiIGNsYXNzPVxcXCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFxcXCI+IHt7bGFiZWx9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7L2VhY2h9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3sjaWYgZXF1YWxzIHR5cGUgJ3VybCd9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cXFwidXJsXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHt7ZWxzZX19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnZW1haWwnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XFxcImVtYWlsXFxcIiB0aXRsZT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiIG5hbWU9XFxcInt7Y29kZX19XFxcIiBkYXRhLXNjaGVtYS1rZXk9XFxcInt7Z2V0TGFiZWwgY29kZX19XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7eyNpZiBlcXVhbHMgdHlwZSAnY2hlY2tib3gnfX1cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxsYWJlbCBmb3I9XFxcIjdaUW5Ec1hCR29oWk1ldEE1XFxcIiBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3tnZXRMYWJlbCBjb2RlfX08L2xhYmVsPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiY2hlY2tib3hcXFwiIGRhdGEtc2NoZW1hLWtleT1cXFwie3tnZXRMYWJlbCBjb2RlfX1cXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgc3R5bGU9XFxcIndpZHRoOiAxMDAlO1xcXCI+PGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiB2YWx1ZT1cXFwidHJ1ZVxcXCIgbmFtZT1cXFwie3tjb2RlfX1cXFwiIGNsYXNzPVxcXCJjaGVja2JveC1pbmxpbmUgZml4LWluZGVudFxcXCI+PC9sYWJlbD5cXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7e2Vsc2V9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGxhYmVsIGZvcj1cXFwiN1pRbkRzWEJHb2haTWV0QTVcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIj57e2dldExhYmVsIGNvZGV9fTwvbGFiZWw+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSd7e2dldENmQ2xhc3MgdGhpc319IGZvcm0tY29udHJvbCcgcmVhZG9ubHkgZGlzYWJsZWQ+e3t7Z2V0VmFsdWUgY29kZX19fTwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHRcdFx0e3svaWZ9fVxcblx0XHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0XHR7ey9pZn19XFxuXHRcdFx0e3svaWZ9fVxcblx0XHR7ey9pZn19XFxuXHR7ey93aXRofX1cIjtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZSA9IGZ1bmN0aW9uKHRlbXBhbHRlTmFtZSwgc3RlZWRvc0RhdGEpIHtcbiAgdmFyIHRlbXBsYXRlLCB0ZW1wbGF0ZUNvbXBpbGVkLCB0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uO1xuICB0ZW1wbGF0ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZVt0ZW1wYWx0ZU5hbWVdO1xuICB0ZW1wbGF0ZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZSh0ZW1wbGF0ZSwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgdGVtcGxhdGVSZW5kZXJGdW5jdGlvbiA9IGV2YWwodGVtcGxhdGVDb21waWxlZCk7XG4gIFRlbXBsYXRlW3RlbXBhbHRlTmFtZV0gPSBuZXcgQmxhemUuVGVtcGxhdGUodGVtcGFsdGVOYW1lLCB0ZW1wbGF0ZVJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICByZXR1cm4gVGVtcGxhdGVbdGVtcGFsdGVOYW1lXS5oZWxwZXJzKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQgPSBmdW5jdGlvbihzdGVlZG9zRGF0YSkge1xuICB2YXIgaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkLCBpbnN0YW5jZVNpZ25UZXh0SHRtbCwgaW5zdGFuY2VTaWduVGV4dFJlbmRlckZ1bmN0aW9uO1xuICBpbnN0YW5jZVNpZ25UZXh0SHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2luc3RhbmNlX3NpZ25fdGV4dC5odG1sJyk7XG4gIGluc3RhbmNlU2lnblRleHRDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW5zdGFuY2VTaWduVGV4dEh0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIGluc3RhbmNlU2lnblRleHRSZW5kZXJGdW5jdGlvbiA9IGV2YWwoaW5zdGFuY2VTaWduVGV4dENvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dCA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlU2lnblRleHRcIiwgaW5zdGFuY2VTaWduVGV4dFJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzKEluc3RhbmNlU2lnblRleHQuaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlSW1hZ2VTaWduID0gZnVuY3Rpb24oc3RlZWRvc0RhdGEpIHtcbiAgdmFyIGltYWdlU2lnbkNvbXBpbGVkLCBpbWFnZVNpZ25IdG1sLCBpbWFnZVNpZ25SZW5kZXJGdW5jdGlvbjtcbiAgaW1hZ2VTaWduSHRtbCA9IF9nZXRWaWV3SHRtbCgnY2xpZW50L3ZpZXdzL2luc3RhbmNlL2ltYWdlX3NpZ24uaHRtbCcpO1xuICBpbWFnZVNpZ25Db21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUoaW1hZ2VTaWduSHRtbCwge1xuICAgIGlzQm9keTogdHJ1ZVxuICB9KTtcbiAgaW1hZ2VTaWduUmVuZGVyRnVuY3Rpb24gPSBldmFsKGltYWdlU2lnbkNvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW1hZ2VTaWduID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW1hZ2VTaWduXCIsIGltYWdlU2lnblJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW1hZ2VTaWduLnN0ZWVkb3NEYXRhID0gc3RlZWRvc0RhdGE7XG4gIHJldHVybiBUZW1wbGF0ZS5pbWFnZVNpZ24uaGVscGVycyhJbWFnZVNpZ24uaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlVHJhY2VzSGFubGRlciA9IGZ1bmN0aW9uKHN0ZWVkb3NEYXRhKSB7XG4gIHZhciB0cmFjZXNIYW5sZGVyQ29tcGlsZWQsIHRyYWNlc0hhbmxkZXJIdG1sLCB0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb247XG4gIHRyYWNlc0hhbmxkZXJIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvdHJhY2VzX2hhbmRsZXIuaHRtbCcpO1xuICB0cmFjZXNIYW5sZGVyQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRyYWNlc0hhbmxkZXJIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICB0cmFjZXNIYW5sZGVyUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRyYWNlc0hhbmxkZXJDb21waWxlZCk7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyID0gbmV3IEJsYXplLlRlbXBsYXRlKFwiaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXJcIiwgdHJhY2VzSGFubGRlclJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfdHJhY2VzX2hhbmRsZXIuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgcmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlX3RyYWNlc19oYW5kbGVyLmhlbHBlcnMoVHJhY2VzSGFuZGxlci5oZWxwZXJzKTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5pbml0ID0gZnVuY3Rpb24oc3RlZWRvc0RhdGEpIHtcbiAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmU2VsZWN0VXNlclJlYWRcIiwgc3RlZWRvc0RhdGEpO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZShcImFmRm9ybUdyb3VwXCIsIHN0ZWVkb3NEYXRhKTtcbiAgfVxuICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuY3JlYXRlKFwiYWZGb3JtR3JvdXBSZWFkXCIsIHN0ZWVkb3NEYXRhKTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGUoXCJpbnN0YW5jZV9hdHRhY2htZW50XCIsIHtcbiAgICAgIGFic29sdXRlOiBzdGVlZG9zRGF0YS5hYnNvbHV0ZVxuICAgIH0pO1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVJbWFnZVNpZ24oc3RlZWRvc0RhdGEpO1xuICAgIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5jcmVhdGVUcmFjZXNIYW5sZGVyKHN0ZWVkb3NEYXRhKTtcbiAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmNyZWF0ZUluc3RhbmNlU2lnblRleHQoc3RlZWRvc0RhdGEpO1xuICB9XG59O1xuXG5nZXRMaW5rVGV4dCA9IGZ1bmN0aW9uKGl0ZW0sIGxhYmVsLCBkZXRhaWxfdXJsKSB7XG4gIGlmIChkZXRhaWxfdXJsKSB7XG4gICAgZGV0YWlsX3VybCA9IGRldGFpbF91cmwucmVwbGFjZShcIntfaWR9XCIsIGl0ZW0uX2lkKTtcbiAgICBpZiAoIS9eaHR0cChzPyk6XFwvXFwvLy50ZXN0KGRldGFpbF91cmwpKSB7XG4gICAgICBkZXRhaWxfdXJsID0gU3RlZWRvcy5hYnNvbHV0ZVVybChkZXRhaWxfdXJsKTtcbiAgICB9XG4gICAgcmV0dXJuICc8YSBocmVmPVwiJyArIGRldGFpbF91cmwgKyAnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JyArIGxhYmVsICsgJzwvYT4nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFZhbHVlID0gZnVuY3Rpb24odmFsdWUsIGZpZWxkLCBsb2NhbGUsIHV0Y09mZnNldCkge1xuICB2YXIgZGF0ZSwgZGV0YWlsX3VybCwgZSwgZmllbGRPcHRpb25zLCBob3VycywgbW9udGgsIG5hbWVGaWVsZCwgcmVjb3JkcywgcmVzLCBzZWNvbmRzLCBzZWxlY3RlZE9wdGlvbiwgc2VsZWN0ZWRPcHRpb25zLCBzcGxpdGVkVmFsdWVzLCB0LCB0MCwgdDEsIHVpU2NoZW1hLCB5ZWFyO1xuICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSBmYWxzZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBpZiAoW1wic2VsZWN0XCIsIFwibXVsdGlTZWxlY3RcIiwgXCJyYWRpb1wiXS5pbmRleE9mKGZpZWxkLnR5cGUpID4gLTEpIHtcbiAgICBmaWVsZE9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICB2YXIgaXRlbVNwbGl0cztcbiAgICAgIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuICAgICAgICB2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHZhbHVlID0gdmFsdWUgPyAnPGEgaHJlZj1cXCdtYWlsdG86JyArIHZhbHVlICsgJ1xcJz4nICsgdmFsdWUgKyAnPC9hPicgOiAnJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VybCc6XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09PSAwKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gXCI8YSBocmVmPSdcIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgICAgdmFsdWUgPSBcIjxhIGhyZWY9JycgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBcIjxhIGhyZWY9J2h0dHA6Ly9cIiArIGVuY29kZVVSSSh2YWx1ZSkgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgdmFsdWUgKyBcIjwvYT5cIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5nZXRQcm9wZXJ0eShcImZ1bGxuYW1lXCIpLnRvU3RyaW5nKCkgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5mdWxsbmFtZSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VzZXInOlxuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmdldFByb3BlcnR5KFwibmFtZVwiKS50b1N0cmluZygpIDogdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUubmFtZSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Bhc3N3b3JkJzpcbiAgICAgIHZhbHVlID0gJyoqKioqKic7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICdmYWxzZScpIHtcbiAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIiwge30sIGxvY2FsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGF0ZVRpbWUnOlxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdCA9IHZhbHVlLnNwbGl0KFwiVFwiKTtcbiAgICAgICAgdDAgPSB0WzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICBtb250aCA9IHQwWzFdO1xuICAgICAgICBkYXRlID0gdDBbMl07XG4gICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgIHNlY29uZHMgPSB0MVsxXTtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0RGF0ZSh2YWx1ZSwgdXRjT2Zmc2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdCA9IHZhbHVlLnNwbGl0KFwiVFwiKTtcbiAgICAgICAgdDAgPSB0WzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICBtb250aCA9IHQwWzFdO1xuICAgICAgICBkYXRlID0gdDBbMl07XG4gICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgIHNlY29uZHMgPSB0MVsxXTtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZm9ybWF0VGltZSh2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpZiAoZmllbGQuaXNfdGV4dGFyZWEpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWUgPT09IHZhbHVlO1xuICAgICAgfSk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgdmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkT3B0aW9uLmxhYmVsO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbXVsdGlTZWxlY3QnOlxuICAgICAgc3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgIHNlbGVjdGVkT3B0aW9ucyA9IGZpZWxkT3B0aW9ucy5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gc3BsaXRlZFZhbHVlcy5pbmRleE9mKGl0ZW0udmFsdWUpID4gLTE7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gc2VsZWN0ZWRPcHRpb25zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xuICAgICAgICBpZiAoZmllbGQuaXNfcGVyY2VudCkge1xuICAgICAgICAgIHZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1BlcmNlbnRTdHJpbmcodmFsdWUsIGZpZWxkLmRpZ2l0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBTdGVlZG9zLm51bWJlclRvU3RyaW5nKHZhbHVlLCBmaWVsZC5kaWdpdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvZGF0YSc6XG4gICAgICBkZXRhaWxfdXJsID0gZmllbGQuZGV0YWlsX3VybDtcbiAgICAgIGlmIChmaWVsZC5pc19tdWx0aXNlbGVjdCkge1xuICAgICAgICB2YWx1ZSA9IF8ubWFwKHZhbHVlLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGdldExpbmtUZXh0KGl0ZW0sIGl0ZW1bJ0BsYWJlbCddLCBkZXRhaWxfdXJsKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGdldExpbmtUZXh0KHZhbHVlLCB2YWx1ZVsnQGxhYmVsJ10sIGRldGFpbF91cmwpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgIHZhbHVlID0gXy5tYXAodmFsdWUsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPiA8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCIgc3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJyArIGl0ZW0gKyAnXCI+PC9kaXY+IDwvZGl2PiA8L2Rpdj4gPC9kaXY+JztcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJzxkaXYgY2xhc3M9XCJhbnRkLUltYWdlQ29udHJvbC1pdGVtIGlzLXVwbG9hZGVkXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlIGFudGQtSW1hZ2UtLXRodW1iIGFudGQtSW1hZ2VDb250cm9sLWltYWdlXCI+IDxkaXYgY2xhc3M9XCJhbnRkLUltYWdlLXRodW1iV3JhcFwiPiA8ZGl2IGNsYXNzPVwiYW50ZC1JbWFnZS10aHVtYlwiPjxpbWcgY2xhc3M9XCJhbnRkLUltYWdlLWltYWdlXCIgc3JjPVwiL2FwaS9maWxlcy9pbWFnZXMvJyArIHZhbHVlICsgJ1wiPjwvZGl2PiA8L2Rpdj4gPC9kaXY+IDwvZGl2Pic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICByZXMgPSBTdGVlZG9zLmF1dGhSZXF1ZXN0KCcvYXBpL3YxL2Nmc19maWxlc19maWxlcmVjb3JkP2ZpbHRlcnM9W1tcIl9pZFwiLFwiaW5cIiwgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICddXSZmaWVsZHM9W1wiX2lkXCIsXCJvcmlnaW5hbFwiXScsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlY29yZHMgPSByZXMuZGF0YS5pdGVtcztcbiAgICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICByZWNvcmRzID0gU3RlZWRvcy5vYmplY3RGaW5kKFwiY2ZzX2ZpbGVzX2ZpbGVyZWNvcmRcIiwge1xuICAgICAgICAgICAgZmlsdGVyczogW1tcIl9pZFwiLCAnaW4nLCB2YWx1ZV1dLFxuICAgICAgICAgICAgZmllbGRzOiBbXCJfaWRcIiwgXCJvcmlnaW5hbFwiXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gXy5tYXAocmVjb3JkcywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHZhciBmaWxlTmFtZSwgZmlsZVByZXZpZXdIdG1sLCBmaWxlVXJsO1xuICAgICAgICAgIGZpbGVOYW1lID0gaXRlbS5vcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIGZpbGVVcmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBpL2ZpbGVzL2ZpbGVzLycgKyBpdGVtLl9pZCk7XG4gICAgICAgICAgZmlsZVByZXZpZXdIdG1sID0gJyc7XG4gICAgICAgICAgaWYgKFtcIi5wZGZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiXS5pbmRleE9mKGZpbGVOYW1lLnNsaWNlKC00KSkgPiAtMSkge1xuICAgICAgICAgICAgZmlsZVByZXZpZXdIdG1sID0gXCImZW5zcDs8YSBocmVmPSdcIiArIGZpbGVVcmwgKyBcIicgdGFyZ2V0PSdfYmxhbmsnIGNsYXNzPSdhbnRkLUxpbmsnPjxzcGFuIGNsYXNzPSdhbnRkLVRwbEZpZWxkJz48c3Bhbj7pooTop4g8L3NwYW4+PC9zcGFuPjwvYT5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdj48YSBocmVmPSdcIiArIChmaWxlVXJsICsgJz9kb3dubG9hZD10cnVlJykgKyBcIicgdGFyZ2V0PSdfYmxhbmsnPlwiICsgZmlsZU5hbWUgKyBcIjwvYT4gXCIgKyAoZmlsZVByZXZpZXdIdG1sICE9IG51bGwgPyBmaWxlUHJldmlld0h0bWwgOiB7XG4gICAgICAgICAgICBmaWxlUHJldmlld0h0bWw6ICcnXG4gICAgICAgICAgfSkgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5qb2luKFwiXCIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbG9va3VwJzpcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoIWZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICB1aVNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0KGZpZWxkLnJlZmVyZW5jZV90byk7XG4gICAgICAgICAgbmFtZUZpZWxkID0gKHVpU2NoZW1hICE9IG51bGwgPyB1aVNjaGVtYS5OQU1FX0ZJRUxEX0tFWSA6IHZvaWQgMCkgfHwgJ25hbWUnO1xuICAgICAgICAgIHJlcyA9IFN0ZWVkb3MuYXV0aFJlcXVlc3QoJy9hcGkvdjEvJyArIGZpZWxkLnJlZmVyZW5jZV90byArICc/ZmlsdGVycz1bW1wiJyArIChmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQgfHwgJ19pZCcpICsgJ1wiLFwiaW5cIiwgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICddXSZmaWVsZHM9W1wiX2lkXCIsXCInICsgbmFtZUZpZWxkICsgJ1wiXScsIHtcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlY29yZHMgPSByZXMuZGF0YS5pdGVtcztcbiAgICAgICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgICBuYW1lRmllbGQgPSBTdGVlZG9zLmdldE9iamVjdE5hbWVGaWVsZEtleShmaWVsZC5yZWZlcmVuY2VfdG8pO1xuICAgICAgICAgIHJlY29yZHMgPSBTdGVlZG9zLm9iamVjdEZpbmQoZmllbGQucmVmZXJlbmNlX3RvLCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBbW2ZpZWxkLnJlZmVyZW5jZV90b19maWVsZCB8fCAnX2lkJywgJ2luJywgdmFsdWVdXSxcbiAgICAgICAgICAgIGZpZWxkczogW1wiX2lkXCIsIG5hbWVGaWVsZF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IF8ubWFwKHJlY29yZHMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gXCI8YSBocmVmPSdcIiArIChTdGVlZG9zLmFic29sdXRlVXJsKCcvYXBwLy0vJyArIGZpZWxkLnJlZmVyZW5jZV90byArICcvdmlldy8nICsgaXRlbS5faWQpKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyBpdGVtW25hbWVGaWVsZF0gKyBcIjwvYT5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuam9pbihcIiAsIFwiKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgdmFsdWUgPSB2YWx1ZSA/IFwiPGRpdiBjbGFzcz1cXFwic3RlZWRvcy1odG1sXFxcIj5cIiArIHZhbHVlICsgXCI8L2Rpdj5cIiA6ICcnO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRMYWJlbCA9IGZ1bmN0aW9uKGZpZWxkcywgY29kZSkge1xuICB2YXIgZmllbGQ7XG4gIGZpZWxkID0gZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpO1xuICBpZiAoZmllbGQpIHtcbiAgICBpZiAoZmllbGQubmFtZSkge1xuICAgICAgcmV0dXJuIGZpZWxkLm5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZC5jb2RlO1xuICAgIH1cbiAgfVxufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24gPSBmdW5jdGlvbihpbnN0YW5jZSkge1xuICB2YXIgZm9ybSwgZm9ybV9maWVsZHMsIGZvcm1fdmVyc2lvbjtcbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gIGZvcm1fdmVyc2lvbiA9IHt9O1xuICBmb3JtX2ZpZWxkcyA9IFtdO1xuICBpZiAoZm9ybS5jdXJyZW50Ll9pZCA9PT0gaW5zdGFuY2UuZm9ybV92ZXJzaW9uKSB7XG4gICAgZm9ybV92ZXJzaW9uID0gZm9ybS5jdXJyZW50O1xuICB9IGVsc2Uge1xuICAgIGZvcm1fdmVyc2lvbiA9IF8ud2hlcmUoZm9ybS5oaXN0b3J5cywge1xuICAgICAgX2lkOiBpbnN0YW5jZS5mb3JtX3ZlcnNpb25cbiAgICB9KVswXTtcbiAgfVxuICBmb3JtX3ZlcnNpb24uZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpIHtcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIGlmIChmaWVsZC5maWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybV9maWVsZHMucHVzaChmKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICBmaWVsZFsnc2ZpZWxkcyddID0gZmllbGRbJ2ZpZWxkcyddO1xuICAgICAgZGVsZXRlIGZpZWxkWydmaWVsZHMnXTtcbiAgICAgIHJldHVybiBmb3JtX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZvcm1fZmllbGRzLnB1c2goZmllbGQpO1xuICAgIH1cbiAgfSk7XG4gIGZvcm1fdmVyc2lvbi5maWVsZHMgPSBmb3JtX2ZpZWxkcztcbiAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRGbG93VmVyc2lvbiA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIHZhciBmbG93LCBmbG93X3ZlcnNpb247XG4gIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKGluc3RhbmNlLmZsb3cpO1xuICBmbG93X3ZlcnNpb24gPSB7fTtcbiAgaWYgKGZsb3cuY3VycmVudC5faWQgPT09IGluc3RhbmNlLmZsb3dfdmVyc2lvbikge1xuICAgIGZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudDtcbiAgfSBlbHNlIHtcbiAgICBmbG93X3ZlcnNpb24gPSBfLndoZXJlKGZsb3cuaGlzdG9yeXMsIHtcbiAgICAgIF9pZDogaW5zdGFuY2UuZmxvd192ZXJzaW9uXG4gICAgfSlbMF07XG4gIH1cbiAgcmV0dXJuIGZsb3dfdmVyc2lvbjtcbn07XG5cbl9nZXRWaWV3SHRtbCA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHZpZXdIdG1sO1xuICB2aWV3SHRtbCA9IEFzc2V0cy5nZXRUZXh0KHBhdGgpO1xuICBpZiAodmlld0h0bWwpIHtcbiAgICB2aWV3SHRtbCA9IHZpZXdIdG1sLnJlcGxhY2UoLzx0ZW1wbGF0ZVtcXHdcXHNcXFwiXFw9J10rPi9pLCBcIlwiKS5yZXBsYWNlKC88XFwvdGVtcGxhdGU+L2ksIFwiXCIpO1xuICB9XG4gIHJldHVybiB2aWV3SHRtbDtcbn07XG5cbl9nZXRMb2NhbGUgPSBmdW5jdGlvbih1c2VyKSB7XG4gIHZhciBsb2NhbGUsIHJlZiwgcmVmMTtcbiAgaWYgKCh1c2VyICE9IG51bGwgPyAocmVmID0gdXNlci5sb2NhbGUpICE9IG51bGwgPyByZWYudG9Mb2NhbGVMb3dlckNhc2UoKSA6IHZvaWQgMCA6IHZvaWQgMCkgPT09ICd6aC1jbicpIHtcbiAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gIH0gZWxzZSBpZiAoKHVzZXIgIT0gbnVsbCA/IChyZWYxID0gdXNlci5sb2NhbGUpICE9IG51bGwgPyByZWYxLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB2b2lkIDAgOiB2b2lkIDApID09PSAnZW4tdXMnKSB7XG4gICAgbG9jYWxlID0gXCJlblwiO1xuICB9IGVsc2Uge1xuICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgfVxuICByZXR1cm4gbG9jYWxlO1xufTtcblxuX2dldFJlcXVpcmVkRmllbGRzID0gZnVuY3Rpb24oZmllbGRzLCByZXYpIHtcbiAgaWYgKCFyZXYpIHtcbiAgICByZXYgPSBbXTtcbiAgfVxuICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCkge1xuICAgIGlmIChmaWVsZC50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgIHJldHVybiBfZ2V0UmVxdWlyZWRGaWVsZHMoZmllbGQuZmllbGRzLCByZXYpO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3RhYmxlJykge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWVsZC5pc19yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gcmV2LnB1c2goZmllbGQuY29kZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldjtcbn07XG5cbl9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgc3RlcHMpIHtcbiAgdmFyIGVkaXRhYmxlQ29kZSwgc3RhcnRTdGVwO1xuICBzdGFydFN0ZXAgPSBzdGVwcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcF90eXBlXCIsIFwic3RhcnRcIik7XG4gIGVkaXRhYmxlQ29kZSA9IFtdO1xuICBfLmtleXMoc3RhcnRTdGVwLnBlcm1pc3Npb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChzdGFydFN0ZXAucGVybWlzc2lvbnNba2V5XSA9PT0gJ2VkaXRhYmxlJykge1xuICAgICAgcmV0dXJuIGVkaXRhYmxlQ29kZS5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGVkaXRhYmxlQ29kZTtcbn07XG5cbl9nZXRTdGFydFN0ZXBSZXF1aXJlZEZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcywgc3RlcHMpIHtcbiAgdmFyIGVkaXRhYmxlQ29kZSwgcmVxdWlyZWRGaWVsZHM7XG4gIHJlcXVpcmVkRmllbGRzID0gX2dldFJlcXVpcmVkRmllbGRzKGZpZWxkcyk7XG4gIGVkaXRhYmxlQ29kZSA9IF9nZXRTdGFydFN0ZXBFZGl0YWJsZUZpZWxkcyhmaWVsZHMsIHN0ZXBzKTtcbiAgcmV0dXJuIF8uaW50ZXJzZWN0aW9uKHJlcXVpcmVkRmllbGRzLCBlZGl0YWJsZUNvZGUpO1xufTtcblxuX2dldFRlbXBsYXRlRGF0YSA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucykge1xuICB2YXIgZmxvdywgZm9ybSwgZm9ybV92ZXJzaW9uLCBsb2NhbGUsIHN0ZWVkb3NEYXRhO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgZm9ybV92ZXJzaW9uID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlRm9ybVZlcnNpb24oaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKGluc3RhbmNlKTtcbiAgfVxuICBsb2NhbGUgPSBfZ2V0TG9jYWxlKHVzZXIpO1xuICBzdGVlZG9zRGF0YSA9IHt9O1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgc3RlZWRvc0RhdGEgPSBfLmNsb25lKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKSk7XG4gICAgc3RlZWRvc0RhdGEuaW5zbmFtZSA9IGluc3RhbmNlLm5hbWU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG4gICAgc3RlZWRvc0RhdGEuaW5zX2ZpbmFsX2RlY2lzaW9uID0gaW5zdGFuY2UuaW5zX2ZpbmFsX2RlY2lzaW9uO1xuICAgIHN0ZWVkb3NEYXRhLmluc19jb2RlID0gaW5zdGFuY2UuY29kZTtcbiAgICBzdGVlZG9zRGF0YS5pbnNfaXNfYXJjaGl2ZWQgPSBpbnN0YW5jZS5pc19hcmNoaXZlZDtcbiAgICBzdGVlZG9zRGF0YS5pbnNfaXNfZGVsZXRlZCA9IGluc3RhbmNlLmluc19pc19kZWxldGVkO1xuICAgIHN0ZWVkb3NEYXRhLmFwcGxpY2FudF9uYW1lID0gaW5zdGFuY2UuYXBwbGljYW50X25hbWU7XG4gICAgc3RlZWRvc0RhdGEuYXBwbGljYW50Q29udGV4dCA9IGluc3RhbmNlLmFwcGxpY2FudF9uYW1lO1xuICB9XG4gIHN0ZWVkb3NEYXRhLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbiA9IGZvcm1fdmVyc2lvbjtcbiAgc3RlZWRvc0RhdGEubG9jYWxlID0gbG9jYWxlO1xuICBzdGVlZG9zRGF0YS51dGNPZmZzZXQgPSB1c2VyLnV0Y09mZnNldDtcbiAgc3RlZWRvc0RhdGEuc3BhY2UgPSBpbnN0YW5jZS5zcGFjZTtcbiAgc3RlZWRvc0RhdGEuc2Vzc2lvblVzZXJJZCA9IHVzZXIuX2lkO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApIHtcbiAgICAgIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpbnN0YW5jZS5mb3JtXG4gICAgICB9KTtcbiAgICAgIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtcbiAgICAgICAgX2lkOiBpbnN0YW5jZS5mbG93XG4gICAgICB9KTtcbiAgICAgIHN0ZWVkb3NEYXRhLnN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzID0gX2dldFN0YXJ0U3RlcEVkaXRhYmxlRmllbGRzKGZvcm0uY3VycmVudC5maWVsZHMsIGZsb3cuY3VycmVudC5zdGVwcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGVlZG9zRGF0YTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlID0gZnVuY3Rpb24oZGF0ZSwgdXRjT2Zmc2V0KSB7XG4gIHZhciBwYXNzaW5nO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgcGFzc2luZyA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHBhc3NpbmcgPSB0cnVlO1xuICB9XG4gIGlmICghdXRjT2Zmc2V0ICYmIHV0Y09mZnNldCAhPT0gMCkge1xuICAgIHV0Y09mZnNldCA9IDg7XG4gIH1cbiAgcmV0dXJuIG1vbWVudChkYXRlKS51dGNPZmZzZXQodXRjT2Zmc2V0LCBwYXNzaW5nKS5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tXCIpO1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmZvcm1hdFRpbWUgPSBmdW5jdGlvbihkYXRlKSB7XG4gIHZhciB1dGNPZmZzZXQ7XG4gIHV0Y09mZnNldCA9IDA7XG4gIHJldHVybiBtb21lbnQoZGF0ZSkudXRjT2Zmc2V0KHV0Y09mZnNldCkuZm9ybWF0KFwiSEg6bW1cIik7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCBpbnN0YW5jZUNvbXBpbGVkLCBpbnN0YW5jZVJlbmRlckZ1bmN0aW9uLCBpbnN0YW5jZVRlbXBsYXRlLCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIHN0ZWVkb3NEYXRhLmFic29sdXRlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFic29sdXRlIDogdm9pZCAwKSB7XG4gICAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSB0cnVlO1xuICB9XG4gIGluc3RhbmNlVGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0VGVtcGxhdGUoaW5zdGFuY2UsIG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMudGVtcGxhdGVOYW1lIDogdm9pZCAwKTtcbiAgaW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGUucmVwbGFjZSgvYWZTZWxlY3RVc2VyL2csIFwiYWZTZWxlY3RVc2VyUmVhZFwiKTtcbiAgaWYgKCEob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5lZGl0YWJsZSA6IHZvaWQgMCkpIHtcbiAgICBpbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZS5yZXBsYWNlKC9hZkZvcm1Hcm91cC9nLCBcImFmRm9ybUdyb3VwUmVhZFwiKTtcbiAgfVxuICBpbnN0YW5jZUNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShpbnN0YW5jZVRlbXBsYXRlLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICBpbnN0YW5jZVJlbmRlckZ1bmN0aW9uID0gZXZhbChpbnN0YW5jZUNvbXBpbGVkKTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcImluc3RhbmNlX3JlYWRvbmx5X3ZpZXdcIiwgaW5zdGFuY2VSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmluc3RhbmNlX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUuaW5zdGFuY2VfcmVhZG9ubHlfdmlldy5oZWxwZXJzKEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMpO1xuICBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuaW5pdChzdGVlZG9zRGF0YSk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS5pbnN0YW5jZV9yZWFkb25seV92aWV3LCBzdGVlZG9zRGF0YSk7XG4gIHJldHVybiBcIjxkaXYgaWQ9J2luc3RhbmNlZm9ybScgPlxcblx0XCIgKyBib2R5ICsgXCJcXG48L2Rpdj5cIjtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRUcmFjZXNWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCBmb3JtLCBzdGVlZG9zRGF0YSwgdHJhY2VDb21waWxlZCwgdHJhY2VSZW5kZXJGdW5jdGlvbiwgdHJhY2VzSHRtbDtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKGluc3RhbmNlLmZvcm0pO1xuICBpZiAoZm9ybS5pbnN0YW5jZV9zdHlsZSA9PT0gXCJ0YWJsZVwiIHx8IChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRlbXBsYXRlTmFtZSA6IHZvaWQgMCkgPT09IFwidGFibGVcIikge1xuICAgIHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXNfdGFibGUuaHRtbCcpO1xuICB9IGVsc2Uge1xuICAgIHRyYWNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS90cmFjZXMuaHRtbCcpO1xuICB9XG4gIHRyYWNlQ29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKHRyYWNlc0h0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIHRyYWNlUmVuZGVyRnVuY3Rpb24gPSBldmFsKHRyYWNlQ29tcGlsZWQpO1xuICBUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3ID0gbmV3IEJsYXplLlRlbXBsYXRlKFwidHJhY2VfcmVhZG9ubHlfdmlld1wiLCB0cmFjZVJlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUudHJhY2VfcmVhZG9ubHlfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICBUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LmhlbHBlcnMoVHJhY2VzVGVtcGxhdGUuaGVscGVycyk7XG4gIGJvZHkgPSBCbGF6ZS50b0hUTUxXaXRoRGF0YShUZW1wbGF0ZS50cmFjZV9yZWFkb25seV92aWV3LCBpbnN0YW5jZS50cmFjZXMpO1xuICByZXR1cm4gYm9keTtcbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRBdHRhY2htZW50VmlldyA9IGZ1bmN0aW9uKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSkge1xuICB2YXIgYXR0YWNobWVudENvbXBpbGVkLCBhdHRhY2htZW50SHRtbCwgYXR0YWNobWVudFJlbmRlckZ1bmN0aW9uLCBib2R5LCBzdGVlZG9zRGF0YTtcbiAgc3RlZWRvc0RhdGEgPSBfZ2V0VGVtcGxhdGVEYXRhKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSk7XG4gIGF0dGFjaG1lbnRIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvaW5zdGFuY2VfYXR0YWNobWVudHMuaHRtbCcpO1xuICBhdHRhY2htZW50Q29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKGF0dGFjaG1lbnRIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICBhdHRhY2htZW50UmVuZGVyRnVuY3Rpb24gPSBldmFsKGF0dGFjaG1lbnRDb21waWxlZCk7XG4gIFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJhdHRhY2htZW50c19yZWFkb25seV92aWV3XCIsIGF0dGFjaG1lbnRSZW5kZXJGdW5jdGlvbik7XG4gIFRlbXBsYXRlLmF0dGFjaG1lbnRzX3JlYWRvbmx5X3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldy5oZWxwZXJzKEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMpO1xuICBib2R5ID0gQmxhemUudG9IVE1MV2l0aERhdGEoVGVtcGxhdGUuYXR0YWNobWVudHNfcmVhZG9ubHlfdmlldyk7XG4gIHJldHVybiBib2R5O1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFJlbGF0ZWRJbnN0YW5jZXNWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCByZWxhdGVkSW5zdGFuY2VzQ29tcGlsZWQsIHJlbGF0ZWRJbnN0YW5jZXNIdG1sLCByZWxhdGVkSW5zdGFuY2VzUmVuZGVyRnVuY3Rpb24sIHN0ZWVkb3NEYXRhO1xuICBzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuYWJzb2x1dGUgOiB2b2lkIDApIHtcbiAgICBzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG4gIH1cbiAgcmVsYXRlZEluc3RhbmNlc0h0bWwgPSBfZ2V0Vmlld0h0bWwoJ2NsaWVudC92aWV3cy9pbnN0YW5jZS9yZWxhdGVkX2luc3RhbmNlcy5odG1sJyk7XG4gIHJlbGF0ZWRJbnN0YW5jZXNDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUocmVsYXRlZEluc3RhbmNlc0h0bWwsIHtcbiAgICBpc0JvZHk6IHRydWVcbiAgfSk7XG4gIHJlbGF0ZWRJbnN0YW5jZXNSZW5kZXJGdW5jdGlvbiA9IGV2YWwocmVsYXRlZEluc3RhbmNlc0NvbXBpbGVkKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldyA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShcInJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXdcIiwgcmVsYXRlZEluc3RhbmNlc1JlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9pbnN0YW5jZXNfdmlldy5zdGVlZG9zRGF0YSA9IHN0ZWVkb3NEYXRhO1xuICBUZW1wbGF0ZS5yZWxhdGVkX2luc3RhbmNlc192aWV3LmhlbHBlcnMoUmVsYXRlZEluc3RhbmNlcy5oZWxwZXJzKTtcbiAgYm9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnJlbGF0ZWRfaW5zdGFuY2VzX3ZpZXcsIHN0ZWVkb3NEYXRhKTtcbiAgcmV0dXJuIGJvZHk7XG59O1xuXG5JbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0UmVsYXRlZFJlY29yZHNWaWV3ID0gZnVuY3Rpb24odXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKSB7XG4gIHZhciBib2R5LCByZWxhdGVkUmVjb3Jkc0NvbXBpbGVkLCByZWxhdGVkUmVjb3Jkc0h0bWwsIHJlbGF0ZWRSZWNvcmRzUmVuZGVyRnVuY3Rpb24sIHN0ZWVkb3NEYXRhO1xuICBzdGVlZG9zRGF0YSA9IF9nZXRUZW1wbGF0ZURhdGEodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgc3RlZWRvc0RhdGEuYWJzb2x1dGUgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuYWJzb2x1dGUgOiB2b2lkIDApIHtcbiAgICBzdGVlZG9zRGF0YS5hYnNvbHV0ZSA9IHRydWU7XG4gIH1cbiAgcmVsYXRlZFJlY29yZHNIdG1sID0gX2dldFZpZXdIdG1sKCdjbGllbnQvdmlld3MvaW5zdGFuY2UvcmVsYXRlZF9yZWNvcmRzLmh0bWwnKTtcbiAgcmVsYXRlZFJlY29yZHNDb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUocmVsYXRlZFJlY29yZHNIdG1sLCB7XG4gICAgaXNCb2R5OiB0cnVlXG4gIH0pO1xuICByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uID0gZXZhbChyZWxhdGVkUmVjb3Jkc0NvbXBpbGVkKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcgPSBuZXcgQmxhemUuVGVtcGxhdGUoXCJyZWxhdGVkX3JlY29yZHNfdmlld1wiLCByZWxhdGVkUmVjb3Jkc1JlbmRlckZ1bmN0aW9uKTtcbiAgVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcuc3RlZWRvc0RhdGEgPSBzdGVlZG9zRGF0YTtcbiAgVGVtcGxhdGUucmVsYXRlZF9yZWNvcmRzX3ZpZXcuaGVscGVycyhSZWxhdGVkUmVjb3Jkcy5oZWxwZXJzKTtcbiAgYm9keSA9IEJsYXplLnRvSFRNTFdpdGhEYXRhKFRlbXBsYXRlLnJlbGF0ZWRfcmVjb3Jkc192aWV3LCBzdGVlZG9zRGF0YSk7XG4gIHJldHVybiBib2R5O1xufTtcblxuSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldE9uTG9hZFNjcmlwdCA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIHZhciBmb3JtX3NjcmlwdCwgZm9ybV92ZXJzaW9uO1xuICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybVZlcnNpb24oaW5zdGFuY2UuZm9ybSwgaW5zdGFuY2UuZm9ybV92ZXJzaW9uKTtcbiAgZm9ybV9zY3JpcHQgPSBmb3JtX3ZlcnNpb24uZm9ybV9zY3JpcHQ7XG4gIGlmIChmb3JtX3NjcmlwdCAmJiBmb3JtX3NjcmlwdC5yZXBsYWNlKC9cXG4vZywgXCJcIikucmVwbGFjZSgvXFxzL2csIFwiXCIpLmxlbmd0aCA+IDApIHtcbiAgICBmb3JtX3NjcmlwdCA9IFwiQ29yZUZvcm0gPSB7fTtDb3JlRm9ybS5pbnN0YW5jZWZvcm0gPSB7fTtcIiArIGZvcm1fc2NyaXB0O1xuICAgIHJldHVybiBmb3JtX3NjcmlwdCArPSBcIjtpZihDb3JlRm9ybS5mb3JtX09uTG9hZCl7d2luZG93Lm9ubG9hZCA9IENvcmVGb3JtLmZvcm1fT25Mb2FkKCk7fVwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmb3JtX3NjcmlwdCA9IFwiXCI7XG4gIH1cbn07XG5cbkluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwgPSBmdW5jdGlvbih1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGFsbENzc0xpbmssIGF0dGFjaG1lbnQsIGJvZHksIGNyZWF0b3JTZXJ2aWNlLCBjc3NIcmVmLCBmb3JtLCBmb3JtRGVzY3JpcHRpb24sIGZvcm1EZXNjcmlwdGlvbkh0bWwsIGh0bWwsIGluc19yZWNvcmRfaWRzLCBpbnN0YW5jZUJveFN0eWxlLCBpbnN0YW5jZV9zdHlsZSwganFIcmVmLCBsb2NhbGUsIG9uTG9hZFNjcmlwdCwgb3BlbkZpbGVTY3JpcHQsIHJlZiwgcmVmMSwgcmVsYXRlZF9pbnN0YW5jZXMsIHJlbGF0ZWRfcmVjb3Jkcywgc2hvd1RyYWNlc0J0biwgc2hvd1RyYWNlc1NjcmlwdCwgdHJhY2UsIHRyYWNlQ2hlY2ssIHdpZHRoO1xuICBib2R5ID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICBvbkxvYWRTY3JpcHQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0T25Mb2FkU2NyaXB0KGluc3RhbmNlKTtcbiAgY3JlYXRvclNlcnZpY2UgPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndlYnNlcnZpY2VzKSAhPSBudWxsID8gKHJlZjEgPSByZWYuY3JlYXRvcikgIT0gbnVsbCA/IHJlZjEudXJsIDogdm9pZCAwIDogdm9pZCAwO1xuICBpbnNfcmVjb3JkX2lkcyA9IGluc3RhbmNlLnJlY29yZF9pZHM7XG4gIGxvY2FsZSA9IF9nZXRMb2NhbGUodXNlcik7XG4gIG9wZW5GaWxlU2NyaXB0ID0gXCJpZih3aW5kb3cuaXNOb2RlICYmIGlzTm9kZSgpKXtcXG5cdGF0dGFjaHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxcXCJpbnNfYXR0YWNoX2hyZWZcXFwiKTtcXG5cdGZvcih2YXIgaSA9IDA7IGkgPCBhdHRhY2hzLmxlbmd0aDsgaSsrKXtcXG5cdFx0YXR0YWNoID0gYXR0YWNoc1tpXTtcXG5cdFx0YXR0YWNoLmFkZEV2ZW50TGlzdGVuZXIoXFxcImNsaWNrXFxcIiwgZnVuY3Rpb24oZSl7XFxuXHRcdFx0aWYoaXNJbWFnZSh0aGlzLmRhdGFzZXQudHlwZSkgfHwgaXNIdG1sKHRoaXMuZGF0YXNldC50eXBlKSl7XFxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XFxuXHRcdFx0XHRvcGVuV2luZG93KFxcXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cXFwiICsgdGhpcy5kYXRhc2V0LmlkKTtcXG5cdFx0XHR9ZWxzZSBpZihud19jb3JlLmNhbk9wZW5GaWxlKHRoaXMuZGF0YXNldC5uYW1lKSl7XFxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XFxuXHRcdFx0XHRud19jb3JlLm9wZW5GaWxlKHRoaXMuaHJlZiwgdGhpcy5kYXRhc2V0Lm5hbWUpXFxuXHRcdFx0fVxcblx0XHR9KTtcXG5cdH1cXG59XFxuXFxudmFyIGZsb3cgPSBcXFwiXCIgKyBpbnN0YW5jZS5mbG93ICsgXCJcXFwiO1xcbnZhciBzcGFjZSA9IFxcXCJcIiArIGluc3RhbmNlLnNwYWNlICsgXCJcXFwiO1xcblxcbmZ1bmN0aW9uIGdldENvb2tpZShuYW1lKXtcXG5cdGxldCBwYXR0ZXJuID0gUmVnRXhwKG5hbWUgKyBcXFwiPS5bXjtdKlxcXCIpXFxuXHRsZXQgbWF0Y2hlZCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChwYXR0ZXJuKVxcblx0aWYobWF0Y2hlZCl7XFxuXHRcdGxldCBjb29raWUgPSBtYXRjaGVkWzBdLnNwbGl0KCc9JylcXG5cdFx0cmV0dXJuIGNvb2tpZVsxXVxcblx0fVxcblx0cmV0dXJuICcnXFxufVxcblxcbnZhciByZWNvcmRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcXFwiaW5zLXJlbGF0ZWQtcmVjb3Jkc1xcXCIpO1xcbmZvcih2YXIgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKXtcXG5cdFx0dmFyIHJlY29yZCA9IHJlY29yZHNbaV07XFxuXHRcdHJlY29yZC5hZGRFdmVudExpc3RlbmVyKFxcXCJjbGlja1xcXCIsIGZ1bmN0aW9uKGUpe1xcblx0XHRcdHZhciBjcmVhdG9yU2VydmljZSA9IFxcXCJcIiArIGNyZWF0b3JTZXJ2aWNlICsgXCJcXFwiXFxuXHRcdFx0dmFyIGluc19yZWNvcmRfaWRzID0gXCIgKyAoSlNPTi5zdHJpbmdpZnkoaW5zX3JlY29yZF9pZHMpKSArIFwiXFxuXHRcdFx0aWYoY3JlYXRvclNlcnZpY2UgJiYgaW5zX3JlY29yZF9pZHMgJiYgaW5zX3JlY29yZF9pZHMubGVuZ3RoID4gMCl7XFxuXHRcdFx0XHR2YXIgb2JqY2V0TmFtZSA9IGluc19yZWNvcmRfaWRzWzBdLm9cXG5cdFx0XHRcdHZhciBpZCA9IGluc19yZWNvcmRfaWRzWzBdLmlkc1swXVxcblx0XHRcdFx0dmFyIHVvYmogPSB7fTtcXG5cdFx0XHRcdHVvYmpbXFxcIlgtVXNlci1JZFxcXCJdID0gZ2V0Q29va2llKFxcXCJYLVVzZXItSWRcXFwiKTtcXG5cdFx0XHRcdHVvYmpbXFxcIlgtQXV0aC1Ub2tlblxcXCJdID0gZ2V0Q29va2llKFxcXCJYLUF1dGgtVG9rZW5cXFwiKTtcXG5cdFx0XHRcdHJlZGlyZWN0VXJsID0gY3JlYXRvclNlcnZpY2UgKyBcXFwiYXBwLy0vXFxcIiArIG9iamNldE5hbWUgKyBcXFwiL3ZpZXcvXFxcIiArIGlkICsgXFxcIj9cXFwiICsgJC5wYXJhbSh1b2JqKTtcXG5cdFx0XHRcdG9wZW5XaW5kb3cocmVkaXJlY3RVcmwpO1xcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxuXCI7XG4gIGlmICghU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG4gICAgaWYgKChmb3JtICE9IG51bGwgPyBmb3JtLmluc3RhbmNlX3N0eWxlIDogdm9pZCAwKSA9PT0gJ3RhYmxlJykge1xuICAgICAgaW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCI7XG4gICAgfVxuICB9XG4gIGlmICgob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy50ZW1wbGF0ZU5hbWUgOiB2b2lkIDApID09PSAndGFibGUnKSB7XG4gICAgaW5zdGFuY2Vfc3R5bGUgPSBcImluc3RhbmNlLXRhYmxlXCI7XG4gIH1cbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuaW5zdGFuY2Vfc3R5bGUgOiB2b2lkIDApIHtcbiAgICBpbnN0YW5jZV9zdHlsZSA9IG9wdGlvbnMuaW5zdGFuY2Vfc3R5bGU7XG4gIH1cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuc2hvd1RyYWNlID09PSB0cnVlKSB7XG4gICAgdHJhY2UgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VHJhY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIHRyYWNlID0gXCJcIjtcbiAgfVxuICBpbnN0YW5jZUJveFN0eWxlID0gXCJcIjtcbiAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uKSB7XG4gICAgaWYgKGluc3RhbmNlLmZpbmFsX2RlY2lzaW9uID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgIGluc3RhbmNlQm94U3R5bGUgPSBcImJveC1zdWNjZXNzXCI7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5maW5hbF9kZWNpc2lvbiA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICBpbnN0YW5jZUJveFN0eWxlID0gXCJib3gtZGFuZ2VyXCI7XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnNob3dBdHRhY2htZW50cyA9PT0gdHJ1ZSkge1xuICAgIGF0dGFjaG1lbnQgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0QXR0YWNobWVudFZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlKTtcbiAgICByZWxhdGVkX2luc3RhbmNlcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkSW5zdGFuY2VzVmlldyh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpO1xuICAgIHJlbGF0ZWRfcmVjb3JkcyA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRSZWxhdGVkUmVjb3Jkc1ZpZXcodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBhdHRhY2htZW50ID0gXCJcIjtcbiAgICByZWxhdGVkX2luc3RhbmNlcyA9IFwiXCI7XG4gICAgcmVsYXRlZF9yZWNvcmRzID0gXCJcIjtcbiAgfVxuICB3aWR0aCA9IFwiOTYwcHhcIjtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMud2lkdGggOiB2b2lkIDApIHtcbiAgICB3aWR0aCA9IFwiXCI7XG4gIH1cbiAgY3NzSHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcInN0ZWVkb3MtY3NzXCIpO1xuICBqcUhyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3ZWJzaXRlL2xpYnMvanF1ZXJ5Lm1pbi5qc1wiKTtcbiAgYWxsQ3NzTGluayA9IFwiPGxpbmsgcmVsPVxcXCJzdHlsZXNoZWV0XFxcIiB0eXBlPVxcXCJ0ZXh0L2Nzc1xcXCIgY2xhc3M9XFxcIl9fbWV0ZW9yLWNzc19fXFxcIiBocmVmPVxcXCJcIiArIGNzc0hyZWYgKyBcIlxcXCI+XCI7XG4gIHRyYWNlQ2hlY2sgPSBcIlwiO1xuICBpZiAoIV8uaXNFbXB0eSh0cmFjZSkpIHtcbiAgICB0cmFjZUNoZWNrID0gXCJjaGVja2VkXCI7XG4gIH1cbiAgaWYgKChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnRhZ2dlciA6IHZvaWQgMCkgPT09ICdlbWFpbCcgfHwgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuZWRpdGFibGUgOiB2b2lkIDApKSB7XG4gICAgc2hvd1RyYWNlc0J0biA9IFwiXCI7XG4gIH0gZWxzZSB7XG4gICAgc2hvd1RyYWNlc0J0biA9IFwiPGRpdiBjbGFzcz1cXFwibmF2aWdhdGlvbi1iYXIgYnRuLWdyb3VwIG5vLXByaW50XFxcIiBzdHlsZT1cXFwibWluLXdpZHRoOiA2MDBweDsgei1pbmRleDogOTk5OyBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcXCI+XFxuXHQ8ZGl2IGNsYXNzPVxcXCJwcmludC10b29sXFxcIj5cXG5cdFx0PGxhYmVsIGNsYXNzPVxcXCJjYngtbGFiZWxcXFwiPjxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgY2xhc3M9XFxcImNieC1wcmludCBjYngtcHJpbnQtYXR0YWNobWVudHNcXFwiIGlkPVxcXCJjYngtcHJpbnQtYXR0YWNobWVudHNcXFwiIGNoZWNrZWQ9XFxcImNoZWNrZWRcXFwiPjxzcGFuPlwiICsgKFRBUGkxOG4uX18oJ2luc3RhbmNlX2F0dGFjaG1lbnQnLCB7fSwgbG9jYWxlKSkgKyBcIjwvc3Bhbj48L2xhYmVsPlxcblx0XHQ8bGFiZWwgY2xhc3M9XFxcImNieC1sYWJlbFxcXCI+PGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBjbGFzcz1cXFwiY2J4LXByaW50IGNieC1wcmludC10cmFjZXNcXFwiIGlkPVxcXCJjYngtcHJpbnQtdHJhY2VzXFxcIiBjaGVja2VkPVxcXCJcIiArIHRyYWNlQ2hlY2sgKyBcIlxcXCI+PHNwYW4+XCIgKyAoVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92YWxfaGlzdG9yeScsIHt9LCBsb2NhbGUpKSArIFwiPC9zcGFuPjwvbGFiZWw+XFxuXHQ8L2Rpdj5cXG48L2Rpdj5cIjtcbiAgfVxuICBzaG93VHJhY2VzU2NyaXB0ID0gXCIkKCBkb2N1bWVudCApLnJlYWR5KGZ1bmN0aW9uKCl7XFxuXHR2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYngtcHJpbnQtdHJhY2VzJyk7XFxuXHR2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2luc3RhbmNlLXRyYWNlcycpWzBdO1xcblx0aWYgKGIgJiYgYi5jaGVja2VkICYmIHQpe1xcblx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdH0gZWxzZSBpZih0KXtcXG5cdFx0dC5zdHlsZSA9ICdkaXNwbGF5OiBub25lOydcXG5cdH1cXG5cdGlmKGIpe1xcblx0XHRiLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGUpe1xcblx0XHRcdGlmIChlLnRhcmdldC5jaGVja2VkKXtcXG5cdFx0XHRcdHQuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xcblx0XHRcdH0gZWxzZSB7XFxuXHRcdFx0XHR0LnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmU7J1xcblx0XHRcdH1cXG5cdFx0fSk7XFxuXHR9XFxuXFxuXFxuXHR2YXIgYXR0YWNobWVudHNDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYngtcHJpbnQtYXR0YWNobWVudHMnKTtcXG5cdHZhciBhdHRhY2htZW50c1ZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdhdHRhY2htZW50cy1zZWN0aW9uJylbMF07XFxuXHRpZiAoYXR0YWNobWVudHNDaGVja2JveCAmJiBhdHRhY2htZW50c0NoZWNrYm94LmNoZWNrZWQgJiYgYXR0YWNobWVudHNWaWV3KXtcXG5cdFx0YXR0YWNobWVudHNWaWV3LnN0eWxlID0gJ2Rpc3BsYXk6IGJsb2NrOydcXG5cdH0gZWxzZSBpZihhdHRhY2htZW50c1ZpZXcpe1xcblx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXFxuXHR9XFxuXHRpZihhdHRhY2htZW50c0NoZWNrYm94KXtcXG5cdFx0YXR0YWNobWVudHNDaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbihlKXtcXG5cdFx0XHRpZiAoZS50YXJnZXQuY2hlY2tlZCl7XFxuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogYmxvY2s7J1xcblx0XHRcdH0gZWxzZSB7XFxuXHRcdFx0XHRhdHRhY2htZW50c1ZpZXcuc3R5bGUgPSAnZGlzcGxheTogbm9uZTsnXFxuXHRcdFx0fVxcblx0XHR9KTtcXG5cdH1cXG59KTtcXG5cIjtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuc3R5bGVzIDogdm9pZCAwKSB7XG4gICAgYWxsQ3NzTGluayA9IFwiXCI7XG4gIH1cbiAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgIF9pZDogaW5zdGFuY2UuZm9ybVxuICB9KTtcbiAgZm9ybURlc2NyaXB0aW9uSHRtbCA9IFwiXCI7XG4gIGlmIChmb3JtKSB7XG4gICAgZm9ybURlc2NyaXB0aW9uID0gZm9ybS5kZXNjcmlwdGlvbjtcbiAgICBpZiAoZm9ybURlc2NyaXB0aW9uKSB7XG4gICAgICBmb3JtRGVzY3JpcHRpb24gPSBmb3JtRGVzY3JpcHRpb24ucmVwbGFjZSgvXFxuL2csIFwiPGJyLz5cIik7XG4gICAgICBmb3JtRGVzY3JpcHRpb25IdG1sID0gXCI8ZGl2IGNsYXNzPVxcXCJib3gtaGVhZGVyICB3aXRoLWJvcmRlciBpbnN0YW5jZS1oZWFkZXJcXFwiPlxcblx0PGRpdj5cXG5cdFx0XCIgKyBmb3JtRGVzY3JpcHRpb24gKyBcIlxcblx0PC9kaXY+XFxuPC9kaXY+XCI7XG4gICAgfVxuICB9XG4gIGh0bWwgPSBcIjwhRE9DVFlQRSBodG1sPlxcbjxodG1sPlxcblx0PGhlYWQ+XFxuXHRcdDxtZXRhIGh0dHAtZXF1aXY9XFxcIkNvbnRlbnQtVHlwZVxcXCIgY29udGVudD1cXFwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XFxcIi8+XFxuXHRcdFwiICsgYWxsQ3NzTGluayArIFwiXFxuXHRcdDxzY3JpcHQgc3JjPVxcXCJcIiArIGpxSHJlZiArIFwiXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0Plxcblx0XHQ8c2NyaXB0IHNyYz1cXFwiL2pzL253X2NvcmUuanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCI+PC9zY3JpcHQ+XFxuXHRcdFwiICsgKG9wdGlvbnMucGx1Z2lucyB8fCBcIlwiKSArIFwiXFxuXFxuXHRcdDxzdHlsZT5cXG5cdFx0XHQuc3RlZWRvc3tcXG5cdFx0XHRcdHdpZHRoOiBcIiArIHdpZHRoICsgXCI7XFxuXHRcdFx0XHRtYXJnaW4tbGVmdDogYXV0bztcXG5cdFx0XHRcdG1hcmdpbi1yaWdodDogYXV0bztcXG5cdFx0XHR9XFxuXFxuXHRcdFx0Lmluc3RhbmNlLXZpZXcgLmluc3RhbmNlLW5hbWV7XFxuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudFxcblx0XHRcdH1cXG5cdFx0XHQuYm94LXRvb2xze1xcblx0XHRcdFx0ZGlzcGxheTogbm9uZTtcXG5cdFx0XHR9XFxuXHRcdFx0LmJveC5jb2xsYXBzZWQtYm94IC5ib3gtYm9keSwuYm94LmNvbGxhcHNlZC1ib3ggLmJveC1mb290ZXIge1xcblx0XHRcdCAgZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0fVxcblxcblx0XHRcdGJvZHl7XFxuXHRcdFx0XHRiYWNrZ3JvdW5kOiBhenVyZSAhaW1wb3J0YW50O1xcblx0XHRcdH1cXG5cXG5cdFx0XHQuaW5zdGFuY2UtdmlldyAuaW5zdGFuY2UtdHJhY2Vze1xcblx0XHRcdFx0cGFkZGluZy1sZWZ0OiAxNXB4O1xcblx0XHRcdFx0cGFkZGluZy1yaWdodDogMTVweDtcXG5cdFx0XHR9XFxuXFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0ge1xcblx0XHRcdGJvcmRlci1yYWRpdXM6IHZhcigtLUltYWdlQ29udHJvbC1hZGRCdG4tYm9yZGVyUmFkaXVzKTtcXG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcblx0XHRcdHBhZGRpbmc6IHZhcigtLWdhcC14cyk7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xcblx0XHRcdG1hcmdpbi1yaWdodDogdmFyKC0tZ2FwLWJhc2UpO1xcblx0XHRcdG1hcmdpbi1ib3R0b206IHZhcigtLWdhcC1iYXNlKTtcXG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXHRcdFx0d2lkdGg6IDcuNXJlbTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW0uaXMtaW52YWxpZCB7XFxuXHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRib3JkZXItY29sb3I6IHZhcigtLUZpbGVDb250cm9sLWRhbmdlci1jb2xvcik7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtIHN2Zy5pY29uLXJlZnJlc2gge1xcblx0XHRcdHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maWxlbmFtZSB7XFxuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xcblx0XHRcdGNvbG9yOiB2YXIoLS1GaWxlQ29udHJvbC1kYW5nZXItY29sb3IpO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZmlsZW5hbWUgPiBzdmcuaWNvbi1pbWFnZSB7XFxuXHRcdFx0bWFyZ2luLWJvdHRvbTogOHB4O1xcblx0XHRcdHdpZHRoOiAyNHB4O1xcblx0XHRcdGhlaWdodDogMjRweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWZpbGVuYW1lID4gc3BhbiB7XFxuXHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xcblx0XHRcdG92ZXJmbG93OiBoaWRkZW47XFxuXHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcXG5cdFx0XHR0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWltYWdlIHtcXG5cdFx0XHR3aWR0aDogMTAwJTtcXG5cdFx0XHRoZWlnaHQ6IDEwMCU7XFxuXHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRib3JkZXI6IG5vbmU7XFxuXHRcdFx0ZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XFxuXHRcdFx0Y29sb3I6ICM5OTk7XFxuXHRcdFx0dG9wOiA1cHg7XFxuXHRcdFx0cmlnaHQ6IDVweDtcXG5cdFx0XHRsaW5lLWhlaWdodDogMTtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciA+IHN2ZyB7XFxuXHRcdFx0dG9wOiAwO1xcblx0XHRcdHdpZHRoOiAxMHB4O1xcblx0XHRcdGhlaWdodDogMTBweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWl0ZW1JbmZvIHtcXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cdFx0XHR3aWR0aDogMTEwcHg7XFxuXHRcdFx0aGVpZ2h0OiAxMTBweDtcXG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xcblx0XHRcdGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcXG5cdFx0XHRmbGV4LXdyYXA6IHdyYXA7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtSW5mbyA+IHAge1xcblx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcXG5cdFx0XHRmb250LXNpemU6IDEycHg7XFxuXHRcdFx0bWFyZ2luLWJvdHRvbTogNXB4O1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3Mge1xcblx0XHRcdHdpZHRoOiA3MHB4O1xcblx0XHRcdGhlaWdodDogNXB4O1xcblx0XHRcdGJhY2tncm91bmQ6ICNlYmViZWI7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1wcm9ncmVzc1ZhbHVlIHtcXG5cdFx0XHRoZWlnaHQ6IDVweDtcXG5cdFx0XHRib3JkZXItcmFkaXVzOiB2YXIoLS1JbWFnZUNvbnRyb2wtcHJvZ3Jlc3MtYm9yZGVyUmFkaXVzKTtcXG5cdFx0XHRkaXNwbGF5OiBibG9jaztcXG5cdFx0XHRiYWNrZ3JvdW5kOiB2YXIoLS1pbmZvKTtcXG5cdFx0XHRtaW4td2lkdGg6IDEwJTtcXG5cdFx0XHR0cmFuc2l0aW9uOiBlYXNlLW91dCB3aWR0aCB2YXIoLS1hbmltYXRpb24tZHVyYXRpb24pO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtaXRlbS5pcy1pbnZhbGlkIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtQ2xlYXIge1xcblx0XHRcdGRpc3BsYXk6IG5vbmU7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1pdGVtLmlzLWludmFsaWQ6aG92ZXIgLmFudGQtSW1hZ2VDb250cm9sLWl0ZW1DbGVhciB7XFxuXHRcdFx0ZGlzcGxheTogYmxvY2s7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1lcnJvck1zZyB7XFxuXHRcdFx0Y29sb3I6IHZhcigtLWRhbmdlcik7XFxuXHRcdFx0bWFyZ2luOiA1cHggMCAwO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtdXBsb2FkQnRuIHtcXG5cdFx0XHRtYXJnaW4tdG9wOiA1cHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wcGVyV3JhcHBlciB7XFxuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtY3JvcHBlcldyYXBwZXIgaW1nIHtcXG5cdFx0XHRtYXgtd2lkdGg6IDEwMCU7XFxuXHRcdFx0bWF4LWhlaWdodDogNDAwcHg7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyIHtcXG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XFxuXHRcdFx0cmlnaHQ6IDA7XFxuXHRcdFx0Ym90dG9tOiAwO1xcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuXHRcdFx0YWxpZ24taXRlbXM6IGZsZXgtZW5kO1xcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XFxuXHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xcblx0XHRcdG1hcmdpbjogMC41cmVtO1xcblx0XHRcdGJveC1zaGFkb3c6IDAgMCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1jcm9wZXJUb29sYmFyID4gYSB7XFxuXHRcdFx0Y29sb3I6IHZhcigtLUZvcm0taXRlbS1mb250Q29sb3IpO1xcblx0XHRcdHBhZGRpbmc6IDJweCA1cHg7XFxuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xcblx0XHRcdGZvbnQtc2l6ZTogMThweDtcXG5cdFx0XHR9XFxuXHRcdFx0LmFudGQtSW1hZ2VDb250cm9sLWNyb3BlclRvb2xiYXIgPiBhOmhvdmVyIHtcXG5cdFx0XHRjb2xvcjogdmFyKC0tbGluay1jb2xvcik7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1hY2NlcHRUaXAge1xcblx0XHRcdGhlaWdodDogMTIwcHg7XFxuXHRcdFx0Y29sb3I6ICM5OTk7XFxuXHRcdFx0Ym9yZGVyOiAycHggZGFzaGVkIHZhcigtLWJvcmRlckNvbG9yKTtcXG5cdFx0XHRib3JkZXItY29sb3I6IHZhcigtLWluZm8pO1xcblx0XHRcdGJhY2tncm91bmQ6ICNmM2Y5ZmU7XFxuXHRcdFx0Ym9yZGVyLXJhZGl1czogdmFyKC0tYm9yZGVyUmFkaXVzKTtcXG5cdFx0XHRsaW5lLWhlaWdodDogMTIwcHg7XFxuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xcblx0XHRcdH1cXG5cdFx0XHQuYW50ZC1JbWFnZUNvbnRyb2wtZml4ZWQtc2l6ZSB7XFxuXHRcdFx0d2lkdGg6IDEwMCU7XFxuXHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdHBhZGRpbmc6IDA7XFxuXHRcdFx0fVxcblx0XHRcdC5hbnRkLUltYWdlQ29udHJvbC1maXhlZC1zaXplIC5hbnRkLUltYWdlQ29udHJvbC1pdGVtT3ZlcmxheSB7XFxuXHRcdFx0d2lkdGg6IDEwMCU7XFxuXHRcdFx0aGVpZ2h0OiAxMDAlO1xcblx0XHRcdH1cXG5cXG5cdFx0XHQuYW50ZC1JbWFnZXMge1xcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcXG5cdFx0XHRcdGZsZXgtd3JhcDogd3JhcDtcXG5cdFx0XHRcdG1hcmdpbjogY2FsYyh2YXIoLS1nYXAteHMpICogLTEpO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2VzLWl0ZW0ge1xcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcXG5cdFx0XHRcdG1hcmdpbjogdmFyKC0tZ2FwLXhzKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlIHtcXG5cdFx0XHRcdGJvcmRlcjogdmFyKC0tYm9yZGVyV2lkdGgpIHNvbGlkIHZhcigtLWJvcmRlckNvbG9yKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLS10aHVtYiB7XFxuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuXHRcdFx0XHRwYWRkaW5nOiB2YXIoLS1nYXAteHMpO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWJXcmFwIHtcXG5cdFx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLWltYWdlIHtcXG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtaW1hZ2UtLWxvYWRpbmcge1xcblx0XHRcdFx0dmlzaWJpbGl0eTogaGlkZGVuO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtLW9yaWdpbmFsIC5hbnRkLUltYWdlLWltYWdlIHtcXG5cdFx0XHRcdG1heC13aWR0aDogMTAwJTtcXG5cdFx0XHRcdG1heC1oZWlnaHQ6IDEwMCU7XFxuXHRcdFx0XHR3aWR0aDogYXV0bztcXG5cdFx0XHRcdG1hcmdpbjogYXV0bztcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iIHtcXG5cdFx0XHRcdHdpZHRoOiA2Ljg3NXJlbTtcXG5cdFx0XHRcdGhlaWdodDogNi44NzVyZW07XFxuXHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XFxuXHRcdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWIgPiBpbWcge1xcblx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xcblx0XHRcdFx0bGVmdDogNTAlO1xcblx0XHRcdFx0dG9wOiA1MCU7XFxuXHRcdFx0XHRtYXgtaGVpZ2h0OiAxMDAlO1xcblx0XHRcdFx0d2lkdGg6IGF1dG87XFxuXHRcdFx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLWluZm8ge1xcblx0XHRcdFx0cGFkZGluZzogNXB4IDEwcHg7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS0tdGh1bWIgLmFudGQtSW1hZ2UtaW5mbyB7XFxuXHRcdFx0XHR3aWR0aDogNi44NzVyZW07XFxuXHRcdFx0XHRwYWRkaW5nOiAwO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLTQtMyB7XFxuXHRcdFx0XHRoZWlnaHQ6IDUuMTU2MjVyZW07XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tMTYtOSB7XFxuXHRcdFx0XHRoZWlnaHQ6IDMuODY3MTg3NXJlbTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIHtcXG5cdFx0XHRcdG1pbi13aWR0aDogNi44NzVyZW07XFxuXHRcdFx0XHRtaW4taGVpZ2h0OiA2Ljg3NXJlbTtcXG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdFx0cGFkZGluZzogMDtcXG5cdFx0XHRcdGhlaWdodDogMTAwJTtcXG5cdFx0XHRcdH1cXG5cdFx0XHRcdC5hbnRkLUltYWdlLXRodW1iLS1maXhlZC1zaXplIC5hbnRkLUltYWdlLXRodW1iIHtcXG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdFx0fVxcblx0XHRcdFx0LmFudGQtSW1hZ2UtdGh1bWItLWZpeGVkLXNpemUgLmFudGQtSW1hZ2UtdGh1bWIgPiBpbWcge1xcblx0XHRcdFx0d2lkdGg6IGF1dG87XFxuXHRcdFx0XHRoZWlnaHQ6IDEwMCU7XFxuXHRcdFx0XHR9XFxuXHRcdFx0XHQuYW50ZC1JbWFnZS10aHVtYi0tdy1mdWxsID4gaW1nIHtcXG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xcblx0XHRcdFx0aGVpZ2h0OiBhdXRvO1xcblx0XHRcdFx0fVxcblxcblx0XHRcdFwiICsgKChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnN0eWxlcyA6IHZvaWQgMCkgfHwgXCJcIikgKyBcIlxcblxcblx0XHRcdFwiICsgKChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmFkZF9zdHlsZXMgOiB2b2lkIDApIHx8IFwiXCIpICsgXCJcXG5cdFx0PC9zdHlsZT5cXG5cdDwvaGVhZD5cXG5cdDxib2R5Plxcblx0XHQ8ZGl2IGNsYXNzPVxcXCJzdGVlZG9zIHdvcmtmbG93IGluc3RhbmNlLXByaW50XFxcIj5cXG5cdFx0XHQ8ZGl2IGNsYXNzPVxcXCJza2luLWdyZWVuIHNraW4tYWRtaW4tbHRlXFxcIj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9XFxcIndyYXBwZXJcXFwiPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjb250ZW50LXdyYXBwZXJcXFwiPlxcblx0XHRcdFx0XHRcdFwiICsgc2hvd1RyYWNlc0J0biArIFwiXFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiaW5zdGFuY2UtcHJpbnRcXFwiPlxcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiaW5zdGFuY2UgXCIgKyBpbnN0YW5jZV9zdHlsZSArIFwiXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0PGZvcm0gbmFtZT1cXFwiaW5zdGFuY2VGb3JtXFxcIj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJpbnN0YW5jZS1mb3JtIGJveCBcIiArIGluc3RhbmNlQm94U3R5bGUgKyBcIlxcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiArIGZvcm1EZXNjcmlwdGlvbkh0bWwgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiYm94LWJvZHlcXFwiPlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtMTJcXFwiIHN0eWxlPVxcXCJib3gtc2l6aW5nOiBib3JkZXItYm94O1xcXCI+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0nYXR0YWNobWVudHMtc2VjdGlvbic+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIiArIGF0dGFjaG1lbnQgKyBcIlxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyByZWxhdGVkX2luc3RhbmNlcyArIFwiXFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIiArIHJlbGF0ZWRfcmVjb3JkcyArIFwiXFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCIgKyBib2R5ICsgXCJcXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdFx0XHRcdFx0PC9mb3JtPlxcblx0XHRcdFx0XHRcdFx0XHRcIiArIHRyYWNlICsgXCJcXG5cdFx0XHRcdFx0XHRcdDwvZGl2Plxcblxcblx0XHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDwvZGl2Plxcblx0XHRcdDwvZGl2Plxcblx0XHQ8L2Rpdj5cXG5cdDwvYm9keT5cXG5cdDxzY3JpcHQ+XCIgKyBvcGVuRmlsZVNjcmlwdCArIFwiO1wiICsgb25Mb2FkU2NyaXB0ICsgXCI7XCIgKyBzaG93VHJhY2VzU2NyaXB0ICsgXCI8L3NjcmlwdD5cXG48L2h0bWw+XCI7XG4gIHJldHVybiBodG1sO1xufTtcbiIsIlRlbXBsYXRlTWFuYWdlciA9IHt9O1xuXG5mb3JtSWQgPSAnaW5zdGFuY2Vmb3JtJztcblxuXG5UZW1wbGF0ZU1hbmFnZXIuaW5zdGFuY2VfdGl0bGUgPSAoKS0+XG5cdHBhZ2VUaXRsZSA9IFwiXCJcIlxuXHRcdHt7aW5zdGFuY2UubmFtZX19XG5cdFwiXCJcIlxuXG5cdHBhZ2VUaXRsZVRyQ2xhc3MgPSBcImluc3RhbmNlLW5hbWVcIlxuXG5cdGlmIENvcmVGb3JtPy5wYWdlVGl0bGVGaWVsZE5hbWVcblx0XHRwYWdlVGl0bGUgPSBcIlwiXCJcblx0XHRcdFx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9XCIje0NvcmVGb3JtLnBhZ2VUaXRsZUZpZWxkTmFtZX1cIiBsYWJlbD1mYWxzZX19XG5cdFx0XCJcIlwiXG5cdFx0cGFnZVRpdGxlVHJDbGFzcyA9IFwiXCJcblxuXHRpZiBDb3JlRm9ybT8ucGFnZVRpdGxlXG5cdFx0cGFnZVRpdGxlID0gXCJcIlwiXG5cdFx0XHQje0NvcmVGb3JtLnBhZ2VUaXRsZX1cblx0XHRcIlwiXCJcblx0XHRwYWdlVGl0bGVUckNsYXNzID0gXCJcIlxuXG5cdHZhbCA9XG5cdFx0cGFnZVRpdGxlOiBwYWdlVGl0bGVcblx0XHRwYWdlVGl0bGVUckNsYXNzOiBwYWdlVGl0bGVUckNsYXNzXG5cblx0cmV0dXJuIHZhbFxuXG5UZW1wbGF0ZU1hbmFnZXIuaGFuZGxlVGFibGVUZW1wbGF0ZSA9IChpbnN0YW5jZSwgX2V4cG9ydCkgLT5cblxuXHR0ZW1wbGF0ZSA9IFwiXCJcIlxuXHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XG5cdFx0PHRhYmxlIGNsYXNzPVwidGFibGUtcGFnZS10aXRsZSBmb3JtLXRhYmxlIG5vLWJvcmRlciB0ZXh0LWFsaWduLWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7ZGlzcGxheTogaW5saW5lLXRhYmxlO1wiPlxuXHRcdFx0PHRyIGNsYXNzPVwiI3t0aGlzLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlVHJDbGFzc31cIj5cblx0XHRcdFx0PHRkIGNsYXNzPVwiaW5zdGFuY2UtdGFibGUtbmFtZS10ZCBwYWdlLXRpdGxlXCI+XG5cdFx0XHRcdFx0I3t0aGlzLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlfVxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0PC90cj5cblxuXHRcdDwvdGFibGU+XG5cdFx0PHRhYmxlIGNsYXNzPVwidGFibGUtcGFnZS1ib2R5IGZvcm0tdGFibGVcIj5cblx0XHRcdFx0PHRyIHN0eWxlPVwiaGVpZ2h0OjBweFwiPlxuXHRcdFx0XHRcdDx0aCBzdHlsZT0nd2lkdGg6IDE2JSc+PC90aD5cblx0XHRcdFx0XHQ8dGg+PC90aD5cblx0XHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XG5cdFx0XHRcdFx0PHRoPjwvdGg+XG5cdFx0XHRcdDwvdHI+XG5cdFwiXCJcIjtcblxuXHR0YWJsZV9maWVsZHMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRhYmxlX2ZpZWxkcyhpbnN0YW5jZSlcblxuXHR0YWJsZV9maWVsZHMgJiYgdGFibGVfZmllbGRzLmZvckVhY2ggKHRhYmxlX2ZpZWxkKS0+XG5cblx0XHRyZXF1aXJlZCA9IFwiXCJcblx0XHRpZiAhQ29yZUZvcm0/LnBhZ2VUaXRsZUZpZWxkTmFtZSB8fCBDb3JlRm9ybT8ucGFnZVRpdGxlRmllbGROYW1lICE9IHRhYmxlX2ZpZWxkLmNvZGVcblx0XHRcdGlmIHRhYmxlX2ZpZWxkLmlzX3JlcXVpcmVkXG5cdFx0XHRcdHJlcXVpcmVkID0gXCJpcy1yZXF1aXJlZFwiXG5cblx0XHRcdGlmIF9leHBvcnRcblx0XHRcdFx0cmVxdWlyZWQgPSBcIlwiO1xuXG5cdFx0XHRwdXJlQ29kZSA9IFN0ZWVkb3MucmVtb3ZlU3BlY2lhbENoYXJhY3Rlcih0YWJsZV9maWVsZC5jb2RlKTtcblxuXHRcdFx0aWYgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZCh0YWJsZV9maWVsZClcblx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnRcblx0XHRcdFx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtdGl0bGUgI3tyZXF1aXJlZH1cIj5cblx0XHRcdFx0XHRcdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwifX1cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLWZpZWxkIG9waW5pb24tZmllbGQgb3Bpbmlvbi1maWVsZC0je3B1cmVDb2RlfSBhdXRvbWF0aWNcIiBjb2xzcGFuID0gXCIje3RhYmxlX2ZpZWxkLnRkX2NvbHNwYW59XCI+XG5cdFx0XHRcdFx0XHR7ez4gaW5zdGFuY2VTaWduVGV4dCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwifX1cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5jbHVkZXModGFibGVfZmllbGQudHlwZSwgJ3NlY3Rpb24sdGFibGUnKVxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0XG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1jaGlsZGZpZWxkIHRkLWNoaWxkZmllbGQtI3twdXJlQ29kZX1cIiBjb2xzcGFuID0gXCIje3RhYmxlX2ZpZWxkLnRkX2NvbHNwYW59XCI+XG5cdFx0XHRcdFx0XHQgICB7ez4gYWZGb3JtR3JvdXAgbmFtZT1cIiN7dGFibGVfZmllbGQuY29kZX1cIiBsYWJlbD1mYWxzZX19XG5cdFx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0XHRcdHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZFxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnRcblxuXHRcdFx0XHRcdGlmIF9leHBvcnRcblx0XHRcdFx0XHRcdHRpdGxlX3Blcm1pc3Npb24gPSBcIlwiXG5cdFx0XHRcdFx0XHRmaWVsZF9wZXJtaXNzaW9uID0gXCJcIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRpdGxlX3Blcm1pc3Npb24gPSBcInRpdGxlLVwiICsgdGFibGVfZmllbGQucGVybWlzc2lvblxuXHRcdFx0XHRcdFx0ZmllbGRfcGVybWlzc2lvbiA9IFwiZmllbGQtXCIgKyB0YWJsZV9maWVsZC5wZXJtaXNzaW9uXG5cblx0XHRcdFx0XHR0ZW1wbGF0ZSArPSBcIlwiXCJcblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlIHRkLXRpdGxlLSN7cHVyZUNvZGV9ICN7dGl0bGVfcGVybWlzc2lvbn0gI3tyZXF1aXJlZH1cIj5cblx0XHRcdFx0XHRcdFx0e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9XCIje3RhYmxlX2ZpZWxkLmNvZGV9XCJ9fVxuXHRcdFx0XHRcdFx0PC90ZD5cblx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLWZpZWxkIHRkLWZpZWxkLSN7cHVyZUNvZGV9ICN7ZmllbGRfcGVybWlzc2lvbn1cIiBjb2xzcGFuID0gXCIje3RhYmxlX2ZpZWxkLnRkX2NvbHNwYW59XCI+XG5cdFx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPVwiI3t0YWJsZV9maWVsZC5jb2RlfVwiIGxhYmVsPWZhbHNlfX1cblx0XHRcdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdFx0dGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kXG5cblx0dGVtcGxhdGUgKz0gXCJcIlwiXG5cdFx0PC90YWJsZT5cblxuXHRcdDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2UtZm9vdGVyIGZvcm0tdGFibGUgbm8tYm9yZGVyXCI+XG5cdFx0XHQ8dHIgY2xhc3M9XCJhcHBsaWNhbnQtd3JhcHBlclwiPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJub3dyYXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtbGVmdCc+XG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3tfdCBcImluc3RhbmNlX2luaXRpYXRvclwifX3vvJo8L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXRhYmxlLXdyYXBwZXItdGQgaW5saW5lLWxlZnQnPlxuXHRcdFx0XHRcdFx0e3s+VGVtcGxhdGUuZHluYW1pYyAgdGVtcGxhdGU9XCJhZlNlbGVjdFVzZXJcIiBkYXRhPWFwcGxpY2FudENvbnRleHR9fVxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJub3dyYXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdwdWxsLWxlZnQnPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxuXHRcdFx0XHRcdFx0XHQ8bGFiZWw+e3tfdCBcImluc3RhbmNlX3N1Ym1pdF9kYXRlXCJ9fe+8mjwvbGFiZWw+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1yaWdodCc+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG5cdFx0XHRcdFx0XHRcdFx0e3tmb3JtYXREYXRlIGluc3RhbmNlLnN1Ym1pdF9kYXRlICd7XCJmb3JtYXRcIjpcIllZWVktTU0tRERcIn0nfX1cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+XG5cdFx0PC90YWJsZT5cblx0PC9kaXY+XG5cdFwiXCJcIlxuXHRyZXR1cm4gdGVtcGxhdGVcblxuI+atpOWkhOaooeadv+WFrOeUqOS4ju+8mmluc3RhbmNlIOe8lui+keOAgeafpeeci+OAgeaJk+WNsOOAgei9rOWPkeaXtueUn+aIkOmZhOS7tuOAgeWPkemAgemCruS7tmJvZHnpg6jliIYodGFibGUg5qih5p2/KVxuI+WmguaenOacieS/ruaUue+8jOivt+a1i+ivleehruiupOWFtuS7luWKn+iDveaYr+WQpuato+W4uOOAglxuVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZSA9XG5cdGRlZmF1bHQ6IChpbnN0YW5jZSktPlxuXG5cdFx0dGVtcGxhdGUgPSBcIlwiXCJcblx0XHRcdDxkaXYgY2xhc3M9XCJ3aXRoLWJvcmRlciBjb2wtbWQtMTJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImluc3RhbmNlLW5hbWVcIj5cblx0XHRcdFx0XHQ8aDMgY2xhc3M9XCJib3gtdGl0bGVcIj4je1RlbXBsYXRlTWFuYWdlci5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZX08L2gzPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaGVscC1ibG9ja1wiPjwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxzcGFuIGNsYXNzPVwiaGVscC1ibG9ja1wiPjwvc3Bhbj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0e3sjZWFjaCBzdGVlZG9zX2Zvcm0uZmllbGRzfX1cblx0XHRcdFx0e3sjaWYgaXNPcGluaW9uRmllbGQgdGhpc319XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYXV0b21hdGljIG9waW5pb24tZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9dGhpcy5jb2RlfX08L2xhYmVsPlxuXG5cdFx0XHRcdFx0XHRcdHt7PiBpbnN0YW5jZVNpZ25UZXh0IG5hbWU9dGhpcy5jb2RlfX1cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdHt7I2lmIGluY2x1ZGVzIHRoaXMudHlwZSAnc2VjdGlvbix0YWJsZSd9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMiBmaWVsZC17e3RoaXMuY29kZX19XCI+XG5cdFx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZSBsYWJlbD1mYWxzZX19XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHR7e2Vsc2V9fVxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVwiPlxuXHRcdFx0XHRcdFx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9dGhpcy5jb2RlfX1cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdHt7L2lmfX1cblx0XHRcdFx0e3svaWZ9fVxuXHRcdFx0e3svZWFjaH19XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJhcHBsaWNhbnQtd3JhcHBlciBmb3JtLWdyb3VwIGZvcm0taG9yaXpvbnRhbFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cblx0XHRcdFx0XHQgIHt7X3QgXCJpbnN0YW5jZV9pbml0aWF0b3JcIn19Jm5ic3A7OlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVwiYWZTZWxlY3RVc2VyXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cblx0XHRcdFx0ICA8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcIlwiXCJcblx0XHRyZXR1cm4gdGVtcGxhdGVcblxuXHR0YWJsZTogKGluc3RhbmNlKS0+XG5cdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5oYW5kbGVUYWJsZVRlbXBsYXRlKGluc3RhbmNlKVxuI1x0dGFibGU6ICcnJ1xuI1x0XHQ8dGFibGUgY2xhc3M9XCJib3gtaGVhZGVyICB3aXRoLWJvcmRlclwiIHN0eWxlPVwid2lkdGg6IDEwMCU7ZGlzcGxheTogaW5saW5lLXRhYmxlO1wiPlxuI1x0XHRcdDx0ciBjbGFzcz1cImluc3RhbmNlLW5hbWVcIj5cbiNcdFx0XHRcdDx0ZCBjbGFzcz1cImluc3RhbmNlLXRhYmxlLW5hbWUtdGRcIj5cbiNcdFx0XHRcdFx0PGgzIGNsYXNzPVwiYm94LXRpdGxlXCI+e3tpbnN0YW5jZS5uYW1lfX08L2gzPlxuI1x0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImhlbHAtYmxvY2tcIj48L3NwYW4+XG4jXHRcdFx0XHQ8L3RkPlxuI1x0XHRcdDwvdHI+XG4jICAgICAgICAgICAgPHRyIGNsYXNzPVwiYXBwbGljYW50LXdyYXBwZXJcIj5cbiNcdFx0XHRcdDx0ZCBjbGFzcz1cImluc3RhbmNlLXRhYmxlLXdyYXBwZXItdGRcIj5cbiNcdFx0XHRcdFx0PGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPnt7X3QgXCJpbnN0YW5jZV9pbml0aWF0b3JcIn19Jm5ic3A7OjwvbGFiZWw+XG4jXHRcdFx0XHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVwiYWZTZWxlY3RVc2VyXCIgZGF0YT1hcHBsaWNhbnRDb250ZXh0fX1cbiNcdFx0XHRcdDwvdGQ+XG4jXHRcdFx0PC90cj5cbiMgICAgICAgIDwvdGFibGU+XG4jXHRcdDx0YWJsZSBjbGFzcz1cImZvcm0tdGFibGVcIj5cbiNcdFx0ICAgIHt7I2VhY2ggdGFibGVfZmllbGRzfX1cbiNcdFx0XHRcdHt7I2lmIGlzT3BpbmlvbkZpZWxkIHRoaXN9fVxuI1x0XHRcdFx0XHR7e3t0cl9zdGFydH19fVxuI1x0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLXRpdGxlIHt7I2lmIGlzX3JlcXVpcmVkfX1pcy1yZXF1aXJlZHt7L2lmfX1cIj5cbiNcdFx0XHRcdFx0XHRcdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPXRoaXMuY29kZX19XG4jXHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1maWVsZCBvcGluaW9uLWZpZWxkXCIgY29sc3BhbiA9ICd7e3RkX2NvbHNwYW59fSc+XG4jXHRcdFx0XHRcdFx0XHR7ez4gaW5zdGFuY2VTaWduVGV4dCBzdGVwPShnZXRPcGluaW9uRmllbGRTdGVwTmFtZSB0aGlzKSBkZWZhdWx0PScnfX1cbiNcdFx0XHRcdFx0XHQ8L3RkPlxuI1x0XHRcdFx0XHR7e3t0cl9lbmR9fX1cbiNcdFx0XHRcdHt7ZWxzZX19XG4jXHRcdFx0XHRcdHt7I2lmIGluY2x1ZGVzIHRoaXMudHlwZSAnc2VjdGlvbix0YWJsZSd9fVxuI1x0XHRcdFx0XHRcdHt7e3RyX3N0YXJ0fX19XG4jXHRcdFx0XHRcdFx0XHQ8dGQgY2xhc3M9XCJ0ZC1jaGlsZGZpZWxkXCIgY29sc3BhbiA9ICd7e3RkX2NvbHNwYW59fSc+XG4jXHRcdFx0XHRcdFx0XHQgICB7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGUgbGFiZWw9ZmFsc2V9fVxuI1x0XHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHR7e3t0cl9lbmR9fX1cbiNcdFx0XHRcdFx0e3tlbHNlfX1cbiNcdFx0XHRcdFx0XHR7e3t0cl9zdGFydH19fVxuI1x0XHRcdFx0XHRcdFx0PHRkIGNsYXNzPVwidGQtdGl0bGUge3sjaWYgaXNfcmVxdWlyZWR9fWlzLXJlcXVpcmVke3svaWZ9fVwiPlxuI1x0XHRcdFx0XHRcdFx0XHR7e2FmRmllbGRMYWJlbFRleHQgbmFtZT10aGlzLmNvZGV9fVxuI1x0XHRcdFx0XHRcdFx0PC90ZD5cbiNcdFx0XHRcdFx0XHRcdDx0ZCBjbGFzcz1cInRkLWZpZWxkIHt7cGVybWlzc2lvbn19XCIgY29sc3BhbiA9ICd7e3RkX2NvbHNwYW59fSc+XG4jXHRcdFx0XHRcdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZSBsYWJlbD1mYWxzZX19XG4jXHRcdFx0XHRcdFx0XHQ8L3RkPlxuI1x0XHRcdFx0XHRcdHt7e3RyX2VuZH19fVxuI1x0XHRcdFx0XHR7ey9pZn19XG4jXHRcdFx0XHR7ey9pZn19XG4jXG4jXHRcdCAgICB7ey9lYWNofX1cbiNcdFx0PC90YWJsZT5cbiNcdCcnJ1xuXG5UZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlSGVscHMgPVxuXHRhcHBsaWNhbnRDb250ZXh0OiAtPlxuXHRcdHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRkYXRhID0ge1xuXHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0YXR0czoge1xuXHRcdFx0XHRuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRcdGlkOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRcdGNsYXNzOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wnLFxuXHRcdFx0XHRzdHlsZTogJ3BhZGRpbmc6NnB4IDEycHg7d2lkdGg6MTQwcHg7ZGlzcGxheTppbmxpbmUnXG5cdFx0XHR9XG5cdFx0fVxuI1x0XHRpZiBub3Qgc3RlZWRvc19pbnN0YW5jZSB8fCBzdGVlZG9zX2luc3RhbmNlLnN0YXRlICE9IFwiZHJhZnRcIlxuXHRcdGRhdGEuYXR0cy5kaXNhYmxlZCA9IHRydWVcblx0XHRyZXR1cm4gZGF0YTtcblxuaW5zdGFuY2VJZDogLT5cblx0cmV0dXJuICdpbnN0YW5jZWZvcm0nOyNcImluc3RhbmNlX1wiICsgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpO1xuXG5mb3JtX3R5cGVzOiAtPlxuXHRpZiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblx0XHRyZXR1cm4gJ2Rpc2FibGVkJztcblx0ZWxzZVxuXHRcdHJldHVybiAnbWV0aG9kJztcblxuc3RlZWRvc19mb3JtOiAtPlxuXHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRpZiBmb3JtX3ZlcnNpb25cblx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uXG5cbmlubmVyc3ViZm9ybUNvbnRleHQ6IChvYmopLT5cblx0ZG9jX3ZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblx0b2JqW1widGFibGVWYWx1ZXNcIl0gPSBpZiBkb2NfdmFsdWVzIHRoZW4gZG9jX3ZhbHVlc1tvYmouY29kZV0gZWxzZSBbXVxuXHRvYmpbXCJmb3JtSWRcIl0gPSBmb3JtSWQ7XG5cdHJldHVybiBvYmo7XG5cbmluc3RhbmNlOiAtPlxuXHRTZXNzaW9uLmdldChcImNoYW5nZV9kYXRlXCIpXG5cdGlmIChTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpXG5cdFx0c3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdHJldHVybiBzdGVlZG9zX2luc3RhbmNlO1xuXG5lcXVhbHM6IChhLCBiKSAtPlxuXHRyZXR1cm4gKGEgPT0gYilcblxuaW5jbHVkZXM6IChhLCBiKSAtPlxuXHRyZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuXG5maWVsZHM6IC0+XG5cdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cdGlmIGZvcm1fdmVyc2lvblxuXHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG5cbmRvY192YWx1ZXM6IC0+XG5cdFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblxuaW5zdGFuY2VfYm94X3N0eWxlOiAtPlxuXHRib3ggPSBTZXNzaW9uLmdldChcImJveFwiKVxuXHRpZiBib3ggPT0gXCJpbmJveFwiIHx8IGJveCA9PSBcImRyYWZ0XCJcblx0XHRqdWRnZSA9IFNlc3Npb24uZ2V0KFwianVkZ2VcIilcblx0XHRpZiBqdWRnZVxuXHRcdFx0aWYgKGp1ZGdlID09IFwiYXBwcm92ZWRcIilcblx0XHRcdFx0cmV0dXJuIFwiYm94LXN1Y2Nlc3NcIlxuXHRcdFx0ZWxzZSBpZiAoanVkZ2UgPT0gXCJyZWplY3RlZFwiKVxuXHRcdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdGlmIGlucyAmJiBpbnMuZmluYWxfZGVjaXNpb25cblx0XHRpZiBpbnMuZmluYWxfZGVjaXNpb24gPT0gXCJhcHByb3ZlZFwiXG5cdFx0XHRyZXR1cm4gXCJib3gtc3VjY2Vzc1wiXG5cdFx0ZWxzZSBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09IFwicmVqZWN0ZWRcIilcblx0XHRcdHJldHVybiBcImJveC1kYW5nZXJcIlxuXG5cblRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZSA9IChpbnN0YW5jZSwgdGVtcGxhdGVOYW1lKSAtPlxuXHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZShpbnN0YW5jZS5mbG93KTtcblx0Zm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zdGFuY2UuZm9ybSk7XG5cblx0aWYgdGVtcGxhdGVOYW1lXG5cdFx0aWYgdGVtcGxhdGVOYW1lID09ICd0YWJsZSdcblx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKVxuXHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLmRlZmF1bHQoaW5zdGFuY2UpXG5cblx0aWYgU2Vzc2lvbj8uZ2V0KFwiaW5zdGFuY2VQcmludFwiKVxuXHRcdGlmIGZsb3c/LnByaW50X3RlbXBsYXRlXG5cdFx0XHRyZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93LnByaW50X3RlbXBsYXRlICsgXCI8L2Rpdj5cIlxuXHRcdGVsc2Vcblx0XHRcdGlmIGZsb3c/Lmluc3RhbmNlX3RlbXBsYXRlXG5cdFx0XHRcdHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cIiArIGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgKyBcIjwvZGl2PlwiXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKVxuXHRlbHNlXG5cdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG5cdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS5kZWZhdWx0KGluc3RhbmNlKVxuXG5cdFx0aWYgZmxvdz8uaW5zdGFuY2VfdGVtcGxhdGVcblx0XHRcdHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXRlbXBsYXRlJz5cIiArIGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgKyBcIjwvZGl2PlwiXG5cblx0XHRpZiBmb3JtPy5pbnN0YW5jZV9zdHlsZVxuXHRcdFx0aWYgZm9ybS5pbnN0YW5jZV9zdHlsZSA9PSAndGFibGUnXG5cdFx0XHRcdHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKVxuXHRcdFx0cmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUuZGVmYXVsdChpbnN0YW5jZSlcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS5kZWZhdWx0KGluc3RhbmNlKVxuXG4jVGVtcGxhdGVNYW5hZ2VyLmV4cG9ydFRlbXBsYXRlID0gKGZsb3dJZCkgLT5cbiNcdHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGZsb3dJZCk7XG4jXG4jXHRmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZsb3coZmxvd0lkKTtcbiNcbiNcdGlmIGZsb3c/Lmluc3RhbmNlX3RlbXBsYXRlXG4jXHRcdHJldHVybiB0ZW1wbGF0ZTtcbiNcbiNcdHJldHVybiB0ZW1wbGF0ZTtcblxuIiwidmFyIGZvcm1JZDsgICAgICAgICAgICAgICAgIFxuXG5UZW1wbGF0ZU1hbmFnZXIgPSB7fTtcblxuZm9ybUlkID0gJ2luc3RhbmNlZm9ybSc7XG5cblRlbXBsYXRlTWFuYWdlci5pbnN0YW5jZV90aXRsZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGFnZVRpdGxlLCBwYWdlVGl0bGVUckNsYXNzLCB2YWw7XG4gIHBhZ2VUaXRsZSA9IFwie3tpbnN0YW5jZS5uYW1lfX1cIjtcbiAgcGFnZVRpdGxlVHJDbGFzcyA9IFwiaW5zdGFuY2UtbmFtZVwiO1xuICBpZiAodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSB7XG4gICAgcGFnZVRpdGxlID0gXCJ7ez4gYWZGb3JtR3JvdXAgbmFtZT1cXFwiXCIgKyBDb3JlRm9ybS5wYWdlVGl0bGVGaWVsZE5hbWUgKyBcIlxcXCIgbGFiZWw9ZmFsc2V9fVwiO1xuICAgIHBhZ2VUaXRsZVRyQ2xhc3MgPSBcIlwiO1xuICB9XG4gIGlmICh0eXBlb2YgQ29yZUZvcm0gIT09IFwidW5kZWZpbmVkXCIgJiYgQ29yZUZvcm0gIT09IG51bGwgPyBDb3JlRm9ybS5wYWdlVGl0bGUgOiB2b2lkIDApIHtcbiAgICBwYWdlVGl0bGUgPSBcIlwiICsgQ29yZUZvcm0ucGFnZVRpdGxlO1xuICAgIHBhZ2VUaXRsZVRyQ2xhc3MgPSBcIlwiO1xuICB9XG4gIHZhbCA9IHtcbiAgICBwYWdlVGl0bGU6IHBhZ2VUaXRsZSxcbiAgICBwYWdlVGl0bGVUckNsYXNzOiBwYWdlVGl0bGVUckNsYXNzXG4gIH07XG4gIHJldHVybiB2YWw7XG59O1xuXG5UZW1wbGF0ZU1hbmFnZXIuaGFuZGxlVGFibGVUZW1wbGF0ZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCBfZXhwb3J0KSB7XG4gIHZhciB0YWJsZV9maWVsZHMsIHRlbXBsYXRlO1xuICB0ZW1wbGF0ZSA9IFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlxcblx0PHRhYmxlIGNsYXNzPVxcXCJ0YWJsZS1wYWdlLXRpdGxlIGZvcm0tdGFibGUgbm8tYm9yZGVyIHRleHQtYWxpZ24tY2VudGVyXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCU7ZGlzcGxheTogaW5saW5lLXRhYmxlO1xcXCI+XFxuXHRcdDx0ciBjbGFzcz1cXFwiXCIgKyAodGhpcy5pbnN0YW5jZV90aXRsZSgpLnBhZ2VUaXRsZVRyQ2xhc3MpICsgXCJcXFwiPlxcblx0XHRcdDx0ZCBjbGFzcz1cXFwiaW5zdGFuY2UtdGFibGUtbmFtZS10ZCBwYWdlLXRpdGxlXFxcIj5cXG5cdFx0XHRcdFwiICsgKHRoaXMuaW5zdGFuY2VfdGl0bGUoKS5wYWdlVGl0bGUpICsgXCJcXG5cdFx0XHQ8L3RkPlxcblx0XHQ8L3RyPlxcblxcblx0PC90YWJsZT5cXG5cdDx0YWJsZSBjbGFzcz1cXFwidGFibGUtcGFnZS1ib2R5IGZvcm0tdGFibGVcXFwiPlxcblx0XHRcdDx0ciBzdHlsZT1cXFwiaGVpZ2h0OjBweFxcXCI+XFxuXHRcdFx0XHQ8dGggc3R5bGU9J3dpZHRoOiAxNiUnPjwvdGg+XFxuXHRcdFx0XHQ8dGg+PC90aD5cXG5cdFx0XHRcdDx0aCBzdHlsZT0nd2lkdGg6IDE2JSc+PC90aD5cXG5cdFx0XHRcdDx0aD48L3RoPlxcblx0XHRcdDwvdHI+XCI7XG4gIHRhYmxlX2ZpZWxkcyA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudGFibGVfZmllbGRzKGluc3RhbmNlKTtcbiAgdGFibGVfZmllbGRzICYmIHRhYmxlX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKHRhYmxlX2ZpZWxkKSB7XG4gICAgdmFyIGZpZWxkX3Blcm1pc3Npb24sIHB1cmVDb2RlLCByZXF1aXJlZCwgdGl0bGVfcGVybWlzc2lvbjtcbiAgICByZXF1aXJlZCA9IFwiXCI7XG4gICAgaWYgKCEodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSB8fCAodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSAhPT0gdGFibGVfZmllbGQuY29kZSkge1xuICAgICAgaWYgKHRhYmxlX2ZpZWxkLmlzX3JlcXVpcmVkKSB7XG4gICAgICAgIHJlcXVpcmVkID0gXCJpcy1yZXF1aXJlZFwiO1xuICAgICAgfVxuICAgICAgaWYgKF9leHBvcnQpIHtcbiAgICAgICAgcmVxdWlyZWQgPSBcIlwiO1xuICAgICAgfVxuICAgICAgcHVyZUNvZGUgPSBTdGVlZG9zLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXIodGFibGVfZmllbGQuY29kZSk7XG4gICAgICBpZiAoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZCh0YWJsZV9maWVsZCkpIHtcbiAgICAgICAgdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfc3RhcnQ7XG4gICAgICAgIHRlbXBsYXRlICs9IFwiPHRkIGNsYXNzPVxcXCJ0ZC10aXRsZSBcIiArIHJlcXVpcmVkICsgXCJcXFwiPlxcblx0e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIn19XFxuPC90ZD5cXG48dGQgY2xhc3M9XFxcInRkLWZpZWxkIG9waW5pb24tZmllbGQgb3Bpbmlvbi1maWVsZC1cIiArIHB1cmVDb2RlICsgXCIgYXV0b21hdGljXFxcIiBjb2xzcGFuID0gXFxcIlwiICsgdGFibGVfZmllbGQudGRfY29sc3BhbiArIFwiXFxcIj5cXG5cdHt7PiBpbnN0YW5jZVNpZ25UZXh0IG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIn19XFxuPC90ZD5cIjtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX2VuZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGVzKHRhYmxlX2ZpZWxkLnR5cGUsICdzZWN0aW9uLHRhYmxlJykpIHtcbiAgICAgICAgICB0ZW1wbGF0ZSArPSB0YWJsZV9maWVsZC50cl9zdGFydDtcbiAgICAgICAgICB0ZW1wbGF0ZSArPSBcIjx0ZCBjbGFzcz1cXFwidGQtY2hpbGRmaWVsZCB0ZC1jaGlsZGZpZWxkLVwiICsgcHVyZUNvZGUgKyBcIlxcXCIgY29sc3BhbiA9IFxcXCJcIiArIHRhYmxlX2ZpZWxkLnRkX2NvbHNwYW4gKyBcIlxcXCI+XFxuICAge3s+IGFmRm9ybUdyb3VwIG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIiBsYWJlbD1mYWxzZX19XFxuPC90ZD5cIjtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBsYXRlICs9IHRhYmxlX2ZpZWxkLnRyX3N0YXJ0O1xuICAgICAgICAgIGlmIChfZXhwb3J0KSB7XG4gICAgICAgICAgICB0aXRsZV9wZXJtaXNzaW9uID0gXCJcIjtcbiAgICAgICAgICAgIGZpZWxkX3Blcm1pc3Npb24gPSBcIlwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aXRsZV9wZXJtaXNzaW9uID0gXCJ0aXRsZS1cIiArIHRhYmxlX2ZpZWxkLnBlcm1pc3Npb247XG4gICAgICAgICAgICBmaWVsZF9wZXJtaXNzaW9uID0gXCJmaWVsZC1cIiArIHRhYmxlX2ZpZWxkLnBlcm1pc3Npb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHRlbXBsYXRlICs9IFwiPHRkIGNsYXNzPVxcXCJ0ZC10aXRsZSB0ZC10aXRsZS1cIiArIHB1cmVDb2RlICsgXCIgXCIgKyB0aXRsZV9wZXJtaXNzaW9uICsgXCIgXCIgKyByZXF1aXJlZCArIFwiXFxcIj5cXG5cdHt7YWZGaWVsZExhYmVsVGV4dCBuYW1lPVxcXCJcIiArIHRhYmxlX2ZpZWxkLmNvZGUgKyBcIlxcXCJ9fVxcbjwvdGQ+XFxuPHRkIGNsYXNzPVxcXCJ0ZC1maWVsZCB0ZC1maWVsZC1cIiArIHB1cmVDb2RlICsgXCIgXCIgKyBmaWVsZF9wZXJtaXNzaW9uICsgXCJcXFwiIGNvbHNwYW4gPSBcXFwiXCIgKyB0YWJsZV9maWVsZC50ZF9jb2xzcGFuICsgXCJcXFwiPlxcblx0e3s+IGFmRm9ybUdyb3VwIG5hbWU9XFxcIlwiICsgdGFibGVfZmllbGQuY29kZSArIFwiXFxcIiBsYWJlbD1mYWxzZX19XFxuPC90ZD5cIjtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGUgKz0gdGFibGVfZmllbGQudHJfZW5kO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGVtcGxhdGUgKz0gXCJcdDwvdGFibGU+XFxuXFxuXHQ8dGFibGUgY2xhc3M9XFxcInRhYmxlLXBhZ2UtZm9vdGVyIGZvcm0tdGFibGUgbm8tYm9yZGVyXFxcIj5cXG5cdFx0PHRyIGNsYXNzPVxcXCJhcHBsaWNhbnQtd3JhcHBlclxcXCI+XFxuXHRcdFx0PHRkIGNsYXNzPVxcXCJub3dyYXBcXFwiPlxcblx0XHRcdFx0PGRpdiBjbGFzcz0naW5saW5lLWxlZnQnPlxcblx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XFxcImNvbnRyb2wtbGFiZWxcXFwiPnt7X3QgXFxcImluc3RhbmNlX2luaXRpYXRvclxcXCJ9fe+8mjwvbGFiZWw+XFxuXHRcdFx0XHQ8L2Rpdj5cXG5cdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXRhYmxlLXdyYXBwZXItdGQgaW5saW5lLWxlZnQnPlxcblx0XHRcdFx0XHR7ez5UZW1wbGF0ZS5keW5hbWljICB0ZW1wbGF0ZT1cXFwiYWZTZWxlY3RVc2VyXFxcIiBkYXRhPWFwcGxpY2FudENvbnRleHR9fVxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0PC90ZD5cXG5cdFx0XHQ8dGQgY2xhc3M9XFxcIm5vd3JhcFxcXCI+XFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSdwdWxsLWxlZnQnPlxcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbmxpbmUtbGVmdCc+XFxuXHRcdFx0XHRcdFx0PGxhYmVsPnt7X3QgXFxcImluc3RhbmNlX3N1Ym1pdF9kYXRlXFxcIn1977yaPC9sYWJlbD5cXG5cdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9J2lubGluZS1yaWdodCc+XFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuXHRcdFx0XHRcdFx0XHR7e2Zvcm1hdERhdGUgaW5zdGFuY2Uuc3VibWl0X2RhdGUgJ3tcXFwiZm9ybWF0XFxcIjpcXFwiWVlZWS1NTS1ERFxcXCJ9J319XFxuXHRcdFx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0XHRcdDwvZGl2Plxcblx0XHRcdFx0PC9kaXY+XFxuXHRcdFx0PC90ZD5cXG5cdFx0PC90cj5cXG5cdDwvdGFibGU+XFxuPC9kaXY+XCI7XG4gIHJldHVybiB0ZW1wbGF0ZTtcbn07XG5cblRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGUgPSB7XG4gIFwiZGVmYXVsdFwiOiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgIHZhciB0ZW1wbGF0ZTtcbiAgICB0ZW1wbGF0ZSA9IFwiPGRpdiBjbGFzcz1cXFwid2l0aC1ib3JkZXIgY29sLW1kLTEyXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcImluc3RhbmNlLW5hbWVcXFwiPlxcblx0XHQ8aDMgY2xhc3M9XFxcImJveC10aXRsZVxcXCI+XCIgKyAoVGVtcGxhdGVNYW5hZ2VyLmluc3RhbmNlX3RpdGxlKCkucGFnZVRpdGxlKSArIFwiPC9oMz5cXG5cdFx0PHNwYW4gY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiPjwvc3Bhbj5cXG5cdDwvZGl2Plxcblx0PHNwYW4gY2xhc3M9XFxcImhlbHAtYmxvY2tcXFwiPjwvc3Bhbj5cXG48L2Rpdj5cXG57eyNlYWNoIHN0ZWVkb3NfZm9ybS5maWVsZHN9fVxcblx0e3sjaWYgaXNPcGluaW9uRmllbGQgdGhpc319XFxuXHRcdDxkaXYgY2xhc3M9XFxcInt7I2lmIHRoaXMuaXNfd2lkZX19Y29sLW1kLTEye3tlbHNlfX1jb2wtbWQtNnt7L2lmfX0gZmllbGQte3t0aGlzLmNvZGV9fVxcXCI+XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBhdXRvbWF0aWMgb3Bpbmlvbi1maWVsZC17e3RoaXMuY29kZX19XFxcIj5cXG5cdFx0XHRcdDxsYWJlbCBjbGFzcz1cXFwiY29udHJvbC1sYWJlbFxcXCI+e3thZkZpZWxkTGFiZWxUZXh0IG5hbWU9dGhpcy5jb2RlfX08L2xhYmVsPlxcblxcblx0XHRcdFx0e3s+IGluc3RhbmNlU2lnblRleHQgbmFtZT10aGlzLmNvZGV9fVxcblx0XHRcdDwvZGl2Plxcblx0XHQ8L2Rpdj5cXG5cdHt7ZWxzZX19XFxuXHRcdHt7I2lmIGluY2x1ZGVzIHRoaXMudHlwZSAnc2VjdGlvbix0YWJsZSd9fVxcblx0XHRcdDxkaXYgY2xhc3M9XFxcImNvbC1tZC0xMiBmaWVsZC17e3RoaXMuY29kZX19XFxcIj5cXG5cdFx0XHRcdHt7PiBhZkZvcm1Hcm91cCBuYW1lPXRoaXMuY29kZSBsYWJlbD1mYWxzZX19XFxuXHRcdFx0PC9kaXY+XFxuXHRcdHt7ZWxzZX19XFxuXHRcdFx0PGRpdiBjbGFzcz1cXFwie3sjaWYgdGhpcy5pc193aWRlfX1jb2wtbWQtMTJ7e2Vsc2V9fWNvbC1tZC02e3svaWZ9fSBmaWVsZC17e3RoaXMuY29kZX19XFxcIj5cXG5cdFx0XHR7ez4gYWZGb3JtR3JvdXAgbmFtZT10aGlzLmNvZGV9fVxcblx0XHRcdDwvZGl2Plxcblx0XHR7ey9pZn19XFxuXHR7ey9pZn19XFxue3svZWFjaH19XFxuPGRpdiBjbGFzcz1cXFwiY29sLW1kLTEyXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcImFwcGxpY2FudC13cmFwcGVyIGZvcm0tZ3JvdXAgZm9ybS1ob3Jpem9udGFsXFxcIj5cXG5cdDxkaXYgY2xhc3M9XFxcImlucHV0LWdyb3VwXFxcIj5cXG5cdFx0PGRpdiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb25cXFwiPlxcblx0XHQgIHt7X3QgXFxcImluc3RhbmNlX2luaXRpYXRvclxcXCJ9fSZuYnNwOzpcXG5cdFx0PC9kaXY+XFxuXHRcdHt7PlRlbXBsYXRlLmR5bmFtaWMgIHRlbXBsYXRlPVxcXCJhZlNlbGVjdFVzZXJcXFwiIGRhdGE9YXBwbGljYW50Q29udGV4dH19XFxuXHQgIDwvZGl2Plxcblx0PC9kaXY+XFxuPC9kaXY+XCI7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9LFxuICB0YWJsZTogZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLmhhbmRsZVRhYmxlVGVtcGxhdGUoaW5zdGFuY2UpO1xuICB9XG59O1xuXG5UZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlSGVscHMgPSB7XG4gIGFwcGxpY2FudENvbnRleHQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkYXRhLCBzdGVlZG9zX2luc3RhbmNlO1xuICAgIHN0ZWVkb3NfaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICBkYXRhID0ge1xuICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgYXR0czoge1xuICAgICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIGlkOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICAgIFwiY2xhc3NcIjogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sJyxcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4O3dpZHRoOjE0MHB4O2Rpc3BsYXk6aW5saW5lJ1xuICAgICAgfVxuICAgIH07XG4gICAgZGF0YS5hdHRzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufTtcblxuKHtcbiAgaW5zdGFuY2VJZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdpbnN0YW5jZWZvcm0nO1xuICB9LFxuICBmb3JtX3R5cGVzOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpKSB7XG4gICAgICByZXR1cm4gJ2Rpc2FibGVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdtZXRob2QnO1xuICAgIH1cbiAgfSxcbiAgc3RlZWRvc19mb3JtOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZvcm1fdmVyc2lvbjtcbiAgICB9XG4gIH0sXG4gIGlubmVyc3ViZm9ybUNvbnRleHQ6IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBkb2NfdmFsdWVzO1xuICAgIGRvY192YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gICAgb2JqW1widGFibGVWYWx1ZXNcIl0gPSBkb2NfdmFsdWVzID8gZG9jX3ZhbHVlc1tvYmouY29kZV0gOiBbXTtcbiAgICBvYmpbXCJmb3JtSWRcIl0gPSBmb3JtSWQ7XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcbiAgaW5zdGFuY2U6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGVlZG9zX2luc3RhbmNlO1xuICAgIFNlc3Npb24uZ2V0KFwiY2hhbmdlX2RhdGVcIik7XG4gICAgaWYgKFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSkge1xuICAgICAgc3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgcmV0dXJuIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgfVxuICB9LFxuICBlcXVhbHM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgfSxcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuICB9LFxuICBmaWVsZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuICAgIH1cbiAgfSxcbiAgZG9jX3ZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgfSxcbiAgaW5zdGFuY2VfYm94X3N0eWxlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYm94LCBpbnMsIGp1ZGdlO1xuICAgIGJveCA9IFNlc3Npb24uZ2V0KFwiYm94XCIpO1xuICAgIGlmIChib3ggPT09IFwiaW5ib3hcIiB8fCBib3ggPT09IFwiZHJhZnRcIikge1xuICAgICAganVkZ2UgPSBTZXNzaW9uLmdldChcImp1ZGdlXCIpO1xuICAgICAgaWYgKGp1ZGdlKSB7XG4gICAgICAgIGlmIChqdWRnZSA9PT0gXCJhcHByb3ZlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiYm94LXN1Y2Nlc3NcIjtcbiAgICAgICAgfSBlbHNlIGlmIChqdWRnZSA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiYm94LWRhbmdlclwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGlmIChpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uKSB7XG4gICAgICBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYm94LXN1Y2Nlc3NcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW5zLmZpbmFsX2RlY2lzaW9uID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYm94LWRhbmdlclwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSk7XG5cblRlbXBsYXRlTWFuYWdlci5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCB0ZW1wbGF0ZU5hbWUpIHtcbiAgdmFyIGZsb3csIGZvcm07XG4gIGZsb3cgPSBkYi5mbG93cy5maW5kT25lKGluc3RhbmNlLmZsb3cpO1xuICBmb3JtID0gZGIuZm9ybXMuZmluZE9uZShpbnN0YW5jZS5mb3JtKTtcbiAgaWYgKHRlbXBsYXRlTmFtZSkge1xuICAgIGlmICh0ZW1wbGF0ZU5hbWUgPT09ICd0YWJsZScpIHtcbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBsYXRlTWFuYWdlci5fdGVtcGxhdGVbXCJkZWZhdWx0XCJdKGluc3RhbmNlKTtcbiAgfVxuICBpZiAodHlwZW9mIFNlc3Npb24gIT09IFwidW5kZWZpbmVkXCIgJiYgU2Vzc2lvbiAhPT0gbnVsbCA/IFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSA6IHZvaWQgMCkge1xuICAgIGlmIChmbG93ICE9IG51bGwgPyBmbG93LnByaW50X3RlbXBsYXRlIDogdm9pZCAwKSB7XG4gICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93LnByaW50X3RlbXBsYXRlICsgXCI8L2Rpdj5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZsb3cgIT0gbnVsbCA/IGZsb3cuaW5zdGFuY2VfdGVtcGxhdGUgOiB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtdGVtcGxhdGUnPlwiICsgZmxvdy5pbnN0YW5jZV90ZW1wbGF0ZSArIFwiPC9kaXY+XCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVNYW5hZ2VyLl90ZW1wbGF0ZS50YWJsZShpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChmbG93ICE9IG51bGwgPyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlIDogdm9pZCAwKSB7XG4gICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS10ZW1wbGF0ZSc+XCIgKyBmbG93Lmluc3RhbmNlX3RlbXBsYXRlICsgXCI8L2Rpdj5cIjtcbiAgICB9XG4gICAgaWYgKGZvcm0gIT0gbnVsbCA/IGZvcm0uaW5zdGFuY2Vfc3R5bGUgOiB2b2lkIDApIHtcbiAgICAgIGlmIChmb3JtLmluc3RhbmNlX3N0eWxlID09PSAndGFibGUnKSB7XG4gICAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlLnRhYmxlKGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBUZW1wbGF0ZU1hbmFnZXIuX3RlbXBsYXRlW1wiZGVmYXVsdFwiXShpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59O1xuIiwiU3RlZWRvc1RhYmxlID0ge307XG5cblN0ZWVkb3NUYWJsZS5mb3JtSWQgPSBcImluc3RhbmNlZm9ybVwiO1xuXG5TdGVlZG9zVGFibGUuY2hlY2tJdGVtID0gZnVuY3Rpb24gKGZpZWxkLCBpdGVtX2luZGV4KSB7XG4gICAgdmFyIGZpZWxkT2JqID0gU3RlZWRvc1RhYmxlLmdldEZpZWxkKGZpZWxkKTtcblxuICAgIHZhciBmaWVsZFZhbCA9IFN0ZWVkb3NUYWJsZS5nZXRJdGVtTW9kYWxWYWx1ZShmaWVsZCwgaXRlbV9pbmRleCk7XG5cbiAgICB2YXIgc2ZfbmFtZSA9ICcnO1xuICAgIHZhciByZXYgPSB0cnVlO1xuICAgIGZpZWxkT2JqLnNmaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoc2YpIHtcbiAgICAgICAgaWYgKHNmLnBlcm1pc3Npb24gPT0gJ2VkaXRhYmxlJykge1xuICAgICAgICAgICAgc2ZfbmFtZSA9IGZpZWxkT2JqLmNvZGUgKyBcIi5cIiArIHNmLmNvZGU7XG4gICAgICAgICAgICBpZiAoIUluc3RhbmNlTWFuYWdlci5jaGVja0Zvcm1GaWVsZFZhbHVlKCQoXCJbbmFtZT0nXCIgKyBzZl9uYW1lICsgXCInXVwiKVswXSwgc2ZfbmFtZSwgZmllbGRWYWxbc2YuY29kZV0pKSB7XG4gICAgICAgICAgICAgICAgcmV2ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXY7XG59XG5cblN0ZWVkb3NUYWJsZS5zZXRUYWJsZUl0ZW1WYWx1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgaXRlbV9pbmRleCwgaXRlbV92YWx1ZSkge1xuXG4gICAgdmFyIHRhYmxlVmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCk7XG4gICAgdGFibGVWYWx1ZVtpdGVtX2luZGV4XSA9IGl0ZW1fdmFsdWU7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUYWJsZUl0ZW1WYWx1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgaXRlbV9pbmRleCkge1xuICAgIHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZClbaXRlbV9pbmRleF07XG59XG5cblN0ZWVkb3NUYWJsZS5yZW1vdmVUYWJsZUl0ZW0gPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgpIHtcbiAgICB2YXIgaXRlbV92YWx1ZSA9IFN0ZWVkb3NUYWJsZS5nZXRUYWJsZUl0ZW1WYWx1ZShmaWVsZCwgaXRlbV9pbmRleCk7XG4gICAgaXRlbV92YWx1ZS5yZW1vdmVkID0gdHJ1ZTtcbn1cblxuU3RlZWRvc1RhYmxlLnNldFRhYmxlVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIHZhbHVlKSB7XG4gICAgJChcInRhYmxlW25hbWU9J1wiICsgZmllbGQgKyBcIiddXCIpLnZhbCh7XG4gICAgICAgIHZhbDogdmFsdWVcbiAgICB9KTtcbn1cblxuU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICByZXR1cm4gJChcInRhYmxlW25hbWU9J1wiICsgZmllbGQgKyBcIiddXCIpLnZhbCgpLnZhbDtcbn1cblxuU3RlZWRvc1RhYmxlLmdldFZhbGlkVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgdmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCk7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciB2YWxpZFZhbHVlID0gW107XG5cbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGlmICghdi5yZW1vdmVkKSB7XG4gICAgICAgICAgICB2YWxpZFZhbHVlLnB1c2godik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsaWRWYWx1ZTtcbn1cblxuXG5TdGVlZG9zVGFibGUuaGFuZGxlRGF0YSA9IGZ1bmN0aW9uIChmaWVsZCwgdmFsdWVzKSB7XG5cbiAgICBpZiAoIXZhbHVlcyB8fCAhKHZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHZhciBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICBmaWVsZE9iai5zZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICAgIGlmIChmLnR5cGUgPT0gJ3VzZXInIHx8IGYudHlwZSA9PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdltmLmNvZGVdXG4gICAgICAgICAgICAgICAgaWYgKGYuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mICh2YWx1ZVswXSkgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbZi5jb2RlXSA9IHZbZi5jb2RlXS5nZXRQcm9wZXJ0eShcImlkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUpID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2W2YuY29kZV0gPSB2W2YuY29kZV0uaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGYudHlwZSA9PSAnZGF0ZVRpbWUnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdltmLmNvZGVdXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmFsdWUuc3BsaXQoXCJUXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQwID0gdFswXS5zcGxpdChcIi1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDEgPSB0WzFdLnNwbGl0KFwiOlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHQwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSB0MFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSB0MFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzID0gdDFbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0gdDFbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF0ZSwgaG91cnMsIHNlY29uZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdltmLmNvZGVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cblxuU3RlZWRvc1RhYmxlLmdldEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgdmFyIGluc3RhbmNlRmllbGRzID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRmllbGRzKCk7XG4gICAgaWYgKCFpbnN0YW5jZUZpZWxkcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGZpZWxkT2JqID0gaW5zdGFuY2VGaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgZmllbGQpO1xuXG4gICAgcmV0dXJuIGZpZWxkT2JqO1xufVxuXG5cblN0ZWVkb3NUYWJsZS5nZXRNb2RhbERhdGEgPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4KSB7XG5cbiAgICB2YXIgZGF0YSA9IHt9O1xuXG4gICAgdmFyIGZpZWxkT2JqID0gU3RlZWRvc1RhYmxlLmdldEZpZWxkKGZpZWxkKTtcblxuICAgIGlmICghZmllbGRPYmopIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRhdGEuZmllbGQgPSBmaWVsZE9iajtcblxuICAgIGRhdGEuZmllbGQuZm9ybXVsYSA9IEZvcm1fZm9ybXVsYS5nZXRGb3JtdWxhRmllbGRWYXJpYWJsZShcIkZvcm1fZm9ybXVsYS5maWVsZF92YWx1ZXNcIiwgZmllbGRPYmouc2ZpZWxkcyk7XG5cbiAgICBkYXRhLnZhbHVlID0ge307XG5cbiAgICBkYXRhLnZhbHVlW2ZpZWxkXSA9IFN0ZWVkb3NUYWJsZS5nZXRUYWJsZUl0ZW1WYWx1ZShmaWVsZCwgaW5kZXgpO1xuXG4gICAgZGF0YS5pbmRleCA9IGluZGV4O1xuXG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuXG5TdGVlZG9zVGFibGUuZ2V0SXRlbU1vZGFsVmFsdWUgPSBmdW5jdGlvbiAoZmllbGQsIGl0ZW1faW5kZXgpIHtcblxuICAgIGlmICghQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcInN0ZWVkb3NfdGFibGVfbW9kYWxfXCIgKyBmaWVsZCArIFwiX1wiICsgaXRlbV9pbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdmFyIGl0ZW1fdmFsdWUgPSBBdXRvRm9ybS5nZXRGb3JtVmFsdWVzKFwic3RlZWRvc190YWJsZV9tb2RhbF9cIiArIGZpZWxkICsgXCJfXCIgKyBpdGVtX2luZGV4KS5pbnNlcnREb2NbZmllbGRdO1xuICAgIHJldHVybiBpdGVtX3ZhbHVlO1xufVxuXG5cblN0ZWVkb3NUYWJsZS5hZGRJdGVtID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCwgX2l0ZW1fdmFsdWUpIHtcbiAgICB2YXIga2V5cyA9IFN0ZWVkb3NUYWJsZS5nZXRLZXlzKGZpZWxkKTtcbiAgICB2YXIgaXRlbV92YWx1ZSA9IF9pdGVtX3ZhbHVlIHx8IFN0ZWVkb3NUYWJsZS5nZXRJdGVtTW9kYWxWYWx1ZShmaWVsZCwgaW5kZXgpO1xuICAgICQoXCJ0Ym9keVtuYW1lPSdcIiArIGZpZWxkICsgXCJUYm9keSddXCIpLmFwcGVuZChTdGVlZG9zVGFibGUuZ2V0VHIoa2V5cywgaXRlbV92YWx1ZSwgaW5kZXgsIGZpZWxkLCB0cnVlKSlcblxufVxuXG5TdGVlZG9zVGFibGUudXBkYXRlSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgsIF9pdGVtX3ZhbHVlKSB7XG5cbiAgICB2YXIgaXRlbSA9ICQoXCJ0cltuYW1lPSdcIiArIGZpZWxkICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInXVwiKTtcblxuICAgIHZhciBpdGVtX3ZhbHVlID0gX2l0ZW1fdmFsdWUgfHwgU3RlZWRvc1RhYmxlLmdldEl0ZW1Nb2RhbFZhbHVlKGZpZWxkLCBpbmRleCk7XG5cbiAgICBpZiAoaXRlbSAmJiBpdGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgICAgIHZhciB0ZHMgPSBTdGVlZG9zVGFibGUuZ2V0UmVtb3ZlVGQoZmllbGQsIGluZGV4KTtcblxuICAgICAgICB2YXIgc2ZpZWxkcyA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCkuc2ZpZWxkcztcblxuICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHNmaWVsZCA9IHNmaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwga2V5KTtcblxuICAgICAgICAgICAgdmFyIHZhbHVlID0gaXRlbV92YWx1ZVtrZXldO1xuXG4gICAgICAgICAgICB0ZHMgPSB0ZHMgKyBTdGVlZG9zVGFibGUuZ2V0VGQoc2ZpZWxkLCBpbmRleCwgdmFsdWUpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW0uZW1wdHkoKTtcblxuICAgICAgICBpdGVtLmFwcGVuZCh0ZHMpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICBTdGVlZG9zVGFibGUuYWRkSXRlbShmaWVsZCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCkpIHtcblxuICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVJdGVtVmFsdWUoZmllbGQsIGluZGV4LCBpdGVtX3ZhbHVlKTtcblxuICAgICAgICAvL1N0ZWVkb3NUYWJsZS52YWx1ZUhhc2hbZmllbGRdW2luZGV4XSA9IGl0ZW1fdmFsdWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvL1N0ZWVkb3NUYWJsZS52YWx1ZUhhc2hbZmllbGRdID0gW2l0ZW1fdmFsdWVdO1xuXG4gICAgICAgIFN0ZWVkb3NUYWJsZS5zZXRUYWJsZVZhbHVlKGZpZWxkLCBbaXRlbV92YWx1ZV0pXG5cbiAgICB9XG5cbiAgICAvL+aJp+ihjOS4u+ihqOWFrOW8j+iuoeeul1xuICAgIEluc3RhbmNlTWFuYWdlci5ydW5Gb3JtdWxhKGZpZWxkKTtcblxufVxuXG5TdGVlZG9zVGFibGUucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgpIHtcblxuICAgICQoXCJ0cltuYW1lPSdcIiArIGZpZWxkICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInXVwiKS5oaWRlKCk7XG5cbiAgICBTdGVlZG9zVGFibGUucmVtb3ZlVGFibGVJdGVtKGZpZWxkLCBpbmRleCk7XG5cbiAgICBJbnN0YW5jZU1hbmFnZXIucnVuRm9ybXVsYShmaWVsZCk7XG59XG5cblN0ZWVkb3NUYWJsZS5zaG93TW9kYWwgPSBmdW5jdGlvbiAoZmllbGQsIGluZGV4LCBtZXRob2QpIHtcblxuXG4gICAgdmFyIG1vZGFsRGF0YSA9IFN0ZWVkb3NUYWJsZS5nZXRNb2RhbERhdGEoZmllbGQsIGluZGV4KTtcblxuICAgIG1vZGFsRGF0YS5tZXRob2QgPSBtZXRob2Q7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICBNb2RhbC5zaG93KFwic3RlZWRvc1RhYmxlTW9kYWxcIiwgbW9kYWxEYXRhKTtcbiAgICB9LCAzMDApXG59XG5cblN0ZWVkb3NUYWJsZS5nZXRLZXlzID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgaWYgKCFBdXRvRm9ybS5nZXRDdXJyZW50RGF0YUZvckZvcm0oU3RlZWRvc1RhYmxlLmZvcm1JZCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBzcyA9IEF1dG9Gb3JtLmdldEZvcm1TY2hlbWEoU3RlZWRvc1RhYmxlLmZvcm1JZCk7XG5cbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgaWYgKHNzLnNjaGVtYShmaWVsZCArIFwiLiRcIikudHlwZSA9PT0gT2JqZWN0KSB7XG4gICAgICAgIGtleXMgPSBzcy5vYmplY3RLZXlzKFNpbXBsZVNjaGVtYS5fbWFrZUdlbmVyaWMoZmllbGQpICsgJy4kJylcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5cztcblxufVxuXG5TdGVlZG9zVGFibGUuZ2V0VGhlYWQgPSBmdW5jdGlvbiAoZmllbGQsIGVkaXRhYmxlKSB7XG5cbiAgICB2YXIgZmllbGRPYmogPSBmaWVsZDtcbiAgICBpZiAoIV8uaXNPYmplY3QoZmllbGQpKVxuICAgICAgICBmaWVsZE9iaiA9IFN0ZWVkb3NUYWJsZS5nZXRGaWVsZChmaWVsZCk7XG5cbiAgICBpZiAoIWZpZWxkT2JqKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgdGhlYWQgPSAnJyxcbiAgICAgICAgdHJzID0gJycsXG4gICAgICAgIGxhYmVsID0gJycsXG4gICAgICAgIHdpZHRoID0gMTAwO1xuXG4gICAgaWYgKGVkaXRhYmxlKSB7XG4gICAgICAgIC8vIHRycyA9IFwiPHRoIGNsYXNzPSdyZW1vdmVkJz48L3RoPlwiXG4gICAgICAgIHRycyA9IFwiXCJcbiAgICB9XG5cbiAgICB2YXIgc2ZpZWxkcyA9IGZpZWxkT2JqLnNmaWVsZHM7XG5cbiAgICBpZiAoIXNmaWVsZHMpIHtcbiAgICAgICAgcmV0dXJuIHRoZWFkO1xuICAgIH1cblxuICAgIHZhciBzZl9sZW5ndGggPSBzZmllbGRzLmxlbmd0aDtcblxuICAgIGlmIChzZl9sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB3aWRlX2ZpZWxkcyA9IHNmaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJpc193aWRlXCIsIHRydWUpO1xuXG4gICAgICAgIHdpZHRoID0gMTAwIC8gKHNmX2xlbmd0aCArIHdpZGVfZmllbGRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgc2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChzZiwgaW5kZXgpIHtcblxuICAgICAgICBsYWJlbCA9IChzZi5uYW1lICE9IG51bGwgJiYgc2YubmFtZS5sZW5ndGggPiAwKSA/IHNmLm5hbWUgOiBzZi5jb2RlO1xuXG4gICAgICAgIHRycyA9IHRycyArIFwiPHRkIFwiOyAvLyBub3dyYXA9J25vd3JhcCdcblxuICAgICAgICB0cnMgPSB0cnMgKyBcIiBjbGFzcz0ndGl0bGUgXCIgKyBzZi50eXBlICsgXCInXCI7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IChzZl9sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgaWYgKHNmLmlzX3dpZGUpIHtcbiAgICAgICAgICAgICAgICB0cnMgPSB0cnMgKyBcInN0eWxlPSd3aWR0aDpcIiArIHdpZHRoICogMiArIFwiJSdcIlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnMgPSB0cnMgKyBcInN0eWxlPSd3aWR0aDpcIiArIHdpZHRoICsgXCIlJ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnMgPSB0cnMgKyBcIj5cIiArIGxhYmVsICsgXCI8L3RkPlwiXG4gICAgfSk7XG5cbiAgICB0aGVhZCA9ICc8dHI+JyArIHRycyArICc8L3RyPic7XG5cbiAgICByZXR1cm4gdGhlYWQ7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUYm9keSA9IGZ1bmN0aW9uIChrZXlzLCBmaWVsZCwgdmFsdWVzLCBlZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSB7XG4gICAgdmFyIHRib2R5ID0gXCJcIjtcblxuICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICB0Ym9keSA9IHRib2R5ICsgU3RlZWRvc1RhYmxlLmdldFRyKGtleXMsIHZhbHVlLCBpbmRleCwgZmllbGQsIGVkaXRhYmxlLCBzZmllbGRzRWRpdGFibGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGJvZHk7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRUciA9IGZ1bmN0aW9uIChrZXlzLCBpdGVtX3ZhbHVlLCBpbmRleCwgZmllbGQsIGVkaXRhYmxlLCBzZmllbGRzRWRpdGFibGUpIHtcblxuICAgIHZhciBmaWVsZE9iaiA9IGZpZWxkO1xuICAgIGlmICghXy5pc09iamVjdChmaWVsZCkpXG4gICAgICAgIGZpZWxkT2JqID0gU3RlZWRvc1RhYmxlLmdldEZpZWxkKGZpZWxkKTtcblxuICAgIHZhciB0ciA9IFwiPHRyIGlkPSdcIiArIGZpZWxkT2JqLmNvZGUgKyBcIl9pdGVtX1wiICsgaW5kZXggKyBcIicgbmFtZT0nXCIgKyBmaWVsZE9iai5jb2RlICsgXCJfaXRlbV9cIiArIGluZGV4ICsgXCInIGRhdGEtaW5kZXg9J1wiICsgaW5kZXggKyBcIidcIlxuXG4gICAgaWYgKGVkaXRhYmxlIHx8IHNmaWVsZHNFZGl0YWJsZSkge1xuICAgICAgICB0ciA9IHRyICsgXCInIGNsYXNzPSdpdGVtIGVkaXQnXCJcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICB0ciA9IHRyICsgXCIgY2xhc3M9J2l0ZW0gaXRlbS1yZWFkb25seSdcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHIgPSB0ciArIFwiIGNsYXNzPSdpdGVtICdcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW1fdmFsdWUucmVtb3ZlZCkge1xuICAgICAgICB0ciA9IHRyICsgXCIgc3R5bGU9J2Rpc3BsYXk6bm9uZScgXCI7XG4gICAgfVxuXG4gICAgdHIgPSB0ciArIFwiJz5cIjtcblxuICAgIHZhciB0ZHMgPSBcIlwiO1xuXG4gICAgaWYgKGVkaXRhYmxlKSB7XG4gICAgICAgIHRkcyA9IFN0ZWVkb3NUYWJsZS5nZXRSZW1vdmVUZChmaWVsZE9iai5jb2RlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgdmFyIHNmaWVsZHMgPSBmaWVsZE9iai5zZmllbGRzO1xuXG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHNmaWVsZCA9IHNmaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwga2V5KTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBpdGVtX3ZhbHVlW2tleV07XG5cbiAgICAgICAgdGRzID0gdGRzICsgU3RlZWRvc1RhYmxlLmdldFRkKHNmaWVsZCwgaW5kZXgsIHZhbHVlKTtcblxuICAgIH0pO1xuXG4gICAgdHIgPSB0ciArIHRkcyArIFwiPC90cj5cIjtcbiAgICByZXR1cm4gdHI7XG59XG5cblN0ZWVkb3NUYWJsZS5nZXRSZW1vdmVUZCA9IGZ1bmN0aW9uIChmaWVsZCwgaW5kZXgpIHtcbiAgICAvLyByZXR1cm4gXCI8dGQgY2xhc3M9J3N0ZWVkb3NUYWJsZS1pdGVtLXJlbW92ZSByZW1vdmVkJyBkYXRhLWluZGV4PSdcIiArIGluZGV4ICsgXCInPjxpIGNsYXNzPSdmYSBmYS10aW1lcycgYXJpYS1oaWRkZW49J3RydWUnPjwvdGQ+XCI7XG4gICAgcmV0dXJuIFwiXCJcbn1cblxuU3RlZWRvc1RhYmxlLmdldFRkID0gZnVuY3Rpb24gKGZpZWxkLCBpbmRleCwgdmFsdWUpIHtcbiAgICB2YXIgdGQgPSBcIjx0ZCBcIjtcblxuICAgIHRkID0gdGQgKyBcIiBjbGFzcz0nc3RlZWRvc1RhYmxlLWl0ZW0tZmllbGQgXCIgKyBmaWVsZC50eXBlICsgXCInIFwiO1xuXG4gICAgdmFyIHRkX3ZhbHVlID0gXCJcIjtcblxuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgdGRfdmFsdWUgPSBTdGVlZG9zVGFibGUuZ2V0VERWYWx1ZShmaWVsZCwgdmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXG4gICAgICAgIHV0Y09mZnNldCA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS51dGNPZmZzZXRcblxuICAgICAgICB0ZF92YWx1ZSA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRWYWx1ZSh2YWx1ZSwgZmllbGQsIGxvY2FsZSwgdXRjT2Zmc2V0KVxuICAgIH1cblxuICAgIHRkID0gdGQgKyBcIiBkYXRhLWluZGV4PSdcIiArIGluZGV4ICsgXCInPlwiICsgdGRfdmFsdWUgKyBcIjwvdGQ+XCJcblxuICAgIHJldHVybiB0ZDtcbn1cblxuXG5TdGVlZG9zVGFibGUuZ2V0VERWYWx1ZSA9IGZ1bmN0aW9uIChmaWVsZCwgdmFsdWUpIHtcbiAgICB2YXIgdGRfdmFsdWUgPSBcIlwiO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRkX3ZhbHVlXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHZhciBmaWVsZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgaWYoW1wic2VsZWN0XCIsIFwibXVsdGlTZWxlY3RcIiwgXCJyYWRpb1wiXS5pbmRleE9mKGZpZWxkLnR5cGUpID4gLTEpe1xuICAgICAgICAgICAgZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obil7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mICh2YWx1ZVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFTcGFjZVVzZXJzKHZhbHVlKS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlLmdldFByb3BlcnR5KFwibmFtZVwiKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFTcGFjZVVzZXJzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHUgPyB1Lm5hbWUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfbXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mICh2YWx1ZVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFPcmdhbml6YXRpb25zKHZhbHVlKS5nZXRQcm9wZXJ0eShcIm5hbWVcIikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlLmdldFByb3BlcnR5KFwibmFtZVwiKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiAodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBDRkRhdGFNYW5hZ2VyLmdldEZvcm11bGFPcmdhbml6YXRpb24odmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gbyA/IG8ubmFtZSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlID8gXCI8YSBocmVmPSdtYWlsdG86XCIgKyB2YWx1ZSArIFwiJz5cIiArIHZhbHVlICsgXCI8L2E+XCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCJodHRwXCIpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBcIjxhIGhyZWY9J1wiICsgZW5jb2RlVVJJKHZhbHVlKSArIFwiJyB0YXJnZXQ9J19ibGFuayc+XCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCI8YSBocmVmPScnIHRhcmdldD0nX2JsYW5rJz5cIiArIHZhbHVlICsgXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gXCI8YSBocmVmPSdodHRwOi8vXCIgKyBlbmNvZGVVUkkodmFsdWUpICsgXCInIHRhcmdldD0nX2JsYW5rJz5odHRwOi8vXCIgKyB2YWx1ZSArIFwiPC9hPlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9ICcqKioqKionO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmFsdWUuc3BsaXQoXCItXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IHRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IHRbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSAkLmZvcm1hdC5kYXRlKHZhbHVlLCAneXl5eS1NTS1kZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAxNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2YWx1ZS5zcGxpdChcIlRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDAgPSB0WzBdLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0MSA9IHRbMV0uc3BsaXQoXCI6XCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gdDBbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9IHQwWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IHQwWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnMgPSB0MVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgPSB0MVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRhdGUsIGhvdXJzLCBzZWNvbmRzKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gJC5mb3JtYXQuZGF0ZSh2YWx1ZSwgJ3l5eXktTU0tZGQgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbS52YWx1ZSA9PSB2YWx1ZTsgfSlcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gc2VsZWN0ZWRPcHRpb24ubGFiZWxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyYWRpbyc6XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSl7IHJldHVybiBpdGVtLnZhbHVlID09IHZhbHVlOyB9KVxuICAgICAgICAgICAgICAgIGlmKHNlbGVjdGVkT3B0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBzZWxlY3RlZE9wdGlvbi5sYWJlbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ211bHRpU2VsZWN0JzpcbiAgICAgICAgICAgICAgICB2YXIgc3BsaXRlZFZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRPcHRpb25zID0gZmllbGRPcHRpb25zLmZpbHRlcihmdW5jdGlvbihpdGVtKXsgcmV0dXJuIHNwbGl0ZWRWYWx1ZXMuaW5kZXhPZihpdGVtLnZhbHVlKSA+IC0xOyB9KTtcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBzZWxlY3RlZE9wdGlvbnMubWFwKGZ1bmN0aW9uKGl0ZW0peyByZXR1cm4gaXRlbS5sYWJlbDsgfSkuam9pbihcIixcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfcGVyY2VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBTdGVlZG9zLm51bWJlclRvUGVyY2VudFN0cmluZyh2YWx1ZSwgZmllbGQuZGlnaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkX3ZhbHVlID0gU3RlZWRvcy5udW1iZXJUb1N0cmluZyh2YWx1ZSwgZmllbGQuZGlnaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29kYXRhJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX211bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlWydAbGFiZWwnXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICBjYXNlICdsb29rdXAnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgdGRfdmFsdWUgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUodmFsdWUsIGZpZWxkKTtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0ZF92YWx1ZSA9IHZhbHVlID8gdmFsdWUgOiAnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZTtcblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0ZF92YWx1ZTtcbn07XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBBdXRvRm9ybS5hZGRJbnB1dFR5cGUoXCJ0YWJsZVwiLCB7XG4gICAgICAgIHRlbXBsYXRlOiBcImFmVGFibGVcIixcbiAgICAgICAgdmFsdWVPdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5kYXRhKFwic2NoZW1hS2V5XCIpO1xuICAgICAgICAgICAgcmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRWYWxpZFZhbHVlKG5hbWUpO1xuICAgICAgICB9LFxuICAgICAgICB2YWx1ZUNvbnZlcnRlcnM6IHtcbiAgICAgICAgICAgIFwic3RyaW5nQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvU3RyaW5nQXJyYXksXG4gICAgICAgICAgICBcIm51bWJlclwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9OdW1iZXIsXG4gICAgICAgICAgICBcIm51bWVyQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvTnVtYmVyQXJyYXksXG4gICAgICAgICAgICBcImJvb2xlYW5cIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvQm9vbGVhbixcbiAgICAgICAgICAgIFwiYm9vbGVhbkFycmF5XCI6IEF1dG9Gb3JtLnZhbHVlQ29udmVydGVycy5zdHJpbmdUb0Jvb2xlYW5BcnJheSxcbiAgICAgICAgICAgIFwiZGF0ZVwiOiBBdXRvRm9ybS52YWx1ZUNvbnZlcnRlcnMuc3RyaW5nVG9EYXRlLFxuICAgICAgICAgICAgXCJkYXRlQXJyYXlcIjogQXV0b0Zvcm0udmFsdWVDb252ZXJ0ZXJzLnN0cmluZ1RvRGF0ZUFycmF5XG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHRBZGp1c3Q6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQuYXR0cy5tYXhsZW5ndGggPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb250ZXh0Lm1heCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmF0dHMubWF4bGVuZ3RoID0gY29udGV4dC5tYXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVGVtcGxhdGUuYWZUYWJsZS5ldmVudHMoe1xuICAgICAgICAndGFwIC5zdGVlZG9zLXRhYmxlIC5zdGVlZG9zVGFibGUtaXRlbS1hZGQsLmFkZC1pdGVtLXRyJzogZnVuY3Rpb24gKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSB0ZW1wbGF0ZS5kYXRhLm5hbWU7XG5cbiAgICAgICAgICAgIHZhciB0YWJsZVZhbHVlID0gU3RlZWRvc1RhYmxlLmdldFRhYmxlVmFsdWUobmFtZSk7XG5cbiAgICAgICAgICAgIHZhciBuZXdfaXRlbV9pbmRleCA9IHRhYmxlVmFsdWUgPyB0YWJsZVZhbHVlLmxlbmd0aCA6IDA7XG5cbiAgICAgICAgICAgIFN0ZWVkb3NUYWJsZS5zaG93TW9kYWwobmFtZSwgbmV3X2l0ZW1faW5kZXgsIFwiYWRkXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgICd0YXAgLnN0ZWVkb3MtdGFibGUgLnN0ZWVkb3NUYWJsZS1pdGVtLWZpZWxkJzogZnVuY3Rpb24gKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlLmRhdGEuYXR0cy5lZGl0YWJsZSB8fCB0ZW1wbGF0ZS5kYXRhLmF0dHMuc2ZpZWxkc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGVtcGxhdGUuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICAgICAgICAgICAgICBTdGVlZG9zVGFibGUuc2hvd01vZGFsKGZpZWxkLCBpbmRleCwgXCJlZGl0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgICd0YXAgLnN0ZWVkb3MtdGFibGUgLnN0ZWVkb3NUYWJsZS1pdGVtLXJlbW92ZSc6IGZ1bmN0aW9uIChldmVudCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IHRlbXBsYXRlLmRhdGEubmFtZTtcbiAgICAgICAgICAgIHZhciBpdGVtX2luZGV4ID0gZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgICAgICAgICAgU2Vzc2lvbi5zZXQoXCJpbnN0YW5jZV9jaGFuZ2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBTdGVlZG9zVGFibGUucmVtb3ZlSXRlbShmaWVsZCwgaXRlbV9pbmRleCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3RhcCAuc3RlZWRvcy10YWJsZSAuaXRlbS1yZWFkb25seSc6IGZ1bmN0aW9uIChldmVudCwgdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGlmICghdGVtcGxhdGUuZGF0YS5hdHRzLmVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gdGVtcGxhdGUuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICAgICAgICAgICAgICBTdGVlZG9zVGFibGUuc2hvd01vZGFsKGZpZWxkLCBpbmRleCwgXCJyZWFkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cblxuXG4gICAgVGVtcGxhdGUuYWZUYWJsZS5yZW5kZXJlZCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmRhdGEubmFtZTtcblxuICAgICAgICB2YXIgc2ZpZWxkc0VkaXRhYmxlID0gdGhpcy5kYXRhLmF0dHMuc2ZpZWxkc0VkaXRhYmxlO1xuXG4gICAgICAgIHZhciBrZXlzID0gU3RlZWRvc1RhYmxlLmdldEtleXMoZmllbGQpO1xuICAgICAgICB2YXIgdmFsaWRWYWx1ZSA9IFN0ZWVkb3NUYWJsZS5oYW5kbGVEYXRhKGZpZWxkLCB0aGlzLmRhdGEudmFsdWUpO1xuICAgICAgICBTdGVlZG9zVGFibGUuc2V0VGFibGVWYWx1ZShmaWVsZCwgdmFsaWRWYWx1ZSk7XG5cbiAgICAgICAgJChcInRoZWFkW25hbWU9J1wiICsgZmllbGQgKyBcIlRoZWFkJ11cIikuaHRtbChTdGVlZG9zVGFibGUuZ2V0VGhlYWQoZmllbGQsIHRoaXMuZGF0YS5hdHRzLmVkaXRhYmxlKSk7XG5cbiAgICAgICAgJChcInRib2R5W25hbWU9J1wiICsgZmllbGQgKyBcIlRib2R5J11cIikuaHRtbChTdGVlZG9zVGFibGUuZ2V0VGJvZHkoa2V5cywgZmllbGQsIFN0ZWVkb3NUYWJsZS5nZXRUYWJsZVZhbHVlKGZpZWxkKSwgdGhpcy5kYXRhLmF0dHMuZWRpdGFibGUsIHNmaWVsZHNFZGl0YWJsZSkpO1xuXG4gICAgICAgIHN0ciA9IHQoXCJzdGVlZG9zX3RhYmxlX2FkZF9pdGVtXCIpO1xuICAgICAgICBhZGRJdGVtVHIgPSBcIjx0ciBjbGFzcz0nYWRkLWl0ZW0tdHInPjx0ZCBjb2xzcGFuPSdcIiArIGtleXMubGVuZ3RoICsgXCInPjxpIGNsYXNzPSdpb24gaW9uLXBsdXMtcm91bmQnPjwvaT5cIiArIHN0ciArIFwiPC90ZD48L3RyPlwiO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEuYXR0cy5lZGl0YWJsZSkge1xuICAgICAgICAgICAgJChcInRmb290W25hbWU9J1wiICsgZmllbGQgKyBcIlRmb290J11cIikuYXBwZW5kKGFkZEl0ZW1Ucik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgICAgICBpZiAoYy5zdGVwX3R5cGUgPT0gJ2NvdW50ZXJTaWduJyB8fCBJbnN0YW5jZU1hbmFnZXIuY2NIYXNFZGl0UGVybWlzc2lvbigpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9ydW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gVGVtcGxhdGUuY3VycmVudERhdGEoKTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFyIGtleXMgPSBTdGVlZG9zVGFibGUuZ2V0S2V5cyhmaWVsZCk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkVmFsdWUgPSBTdGVlZG9zVGFibGUuaGFuZGxlRGF0YShmaWVsZCwgZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgU3RlZWRvc1RhYmxlLnNldFRhYmxlVmFsdWUoZmllbGQsIHZhbGlkVmFsdWUpO1xuICAgICAgICAgICAgICAgICQoXCJ0Ym9keVtuYW1lPSdcIiArIGZpZWxkICsgXCJUYm9keSddXCIpLmh0bWwoU3RlZWRvc1RhYmxlLmdldFRib2R5KGtleXMsIGZpZWxkLCBTdGVlZG9zVGFibGUuZ2V0VGFibGVWYWx1ZShmaWVsZCksIGRhdGEuYXR0cy5lZGl0YWJsZSwgc2ZpZWxkc0VkaXRhYmxlKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICB9O1xufSIsIkltYWdlU2lnbi5oZWxwZXJzID1cblx0c3BhY2VVc2VyU2lnbjogKHVzZXJJZCktPlxuXHRcdHNwYWNlID0gXCJcIlxuXG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRzcGFjZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5zcGFjZVxuXHRcdGVsc2Vcblx0XHRcdHNwYWNlID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cblx0XHRzcGFjZVVzZXJTaWduID0gZGIuc3BhY2VfdXNlcl9zaWducy5maW5kT25lKHtzcGFjZTogc3BhY2UsIHVzZXI6IHVzZXJJZH0pO1xuXHRcdHJldHVybiBzcGFjZVVzZXJTaWduXG5cblx0aW1hZ2VVUkw6ICh1c2VySWQpLT5cblxuXHRcdHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKHVzZXJJZCk7XG5cblx0XHRhYnNvbHV0ZSA9IGZhbHNlXG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGFic29sdXRlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmFic29sdXRlXG5cblx0XHRpZiBzcGFjZVVzZXJTaWduPy5zaWduXG5cdFx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0XHRyZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyBzcGFjZVVzZXJTaWduLnNpZ24pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgc3BhY2VVc2VyU2lnbi5zaWduKTtcbiIsIkltYWdlU2lnbi5oZWxwZXJzID0ge1xuICBzcGFjZVVzZXJTaWduOiBmdW5jdGlvbih1c2VySWQpIHtcbiAgICB2YXIgc3BhY2UsIHNwYWNlVXNlclNpZ247XG4gICAgc3BhY2UgPSBcIlwiO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIHNwYWNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnNwYWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGFjZSA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB9XG4gICAgc3BhY2VVc2VyU2lnbiA9IGRiLnNwYWNlX3VzZXJfc2lnbnMuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2UsXG4gICAgICB1c2VyOiB1c2VySWRcbiAgICB9KTtcbiAgICByZXR1cm4gc3BhY2VVc2VyU2lnbjtcbiAgfSxcbiAgaW1hZ2VVUkw6IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgIHZhciBhYnNvbHV0ZSwgc3BhY2VVc2VyU2lnbjtcbiAgICBzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbih1c2VySWQpO1xuICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgYWJzb2x1dGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuYWJzb2x1dGU7XG4gICAgfVxuICAgIGlmIChzcGFjZVVzZXJTaWduICE9IG51bGwgPyBzcGFjZVVzZXJTaWduLnNpZ24gOiB2b2lkIDApIHtcbiAgICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyBzcGFjZVVzZXJTaWduLnNpZ24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJhcGkvZmlsZXMvYXZhdGFycy9cIiArIHNwYWNlVXNlclNpZ24uc2lnbik7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiVHJhY2VzSGFuZGxlci5oZWxwZXJzID1cblx0c2hvd1NpZ25JbWFnZTogKGhhbmRsZXIsIGlzX2ZpbmlzaGVkLCBqdWRnZSwgdHJhY2VTaG93U2lnbkltYWdlKSAtPlxuXHRcdGlmIHRyYWNlU2hvd1NpZ25JbWFnZSA9PSBmYWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgIWlzX2ZpbmlzaGVkXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRpZiBbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbihoYW5kbGVyKVxuXG5cdFx0aWYgc3BhY2VVc2VyU2lnbj8uc2lnblxuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRvYmplY3RVcmw6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpLT5cblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKSIsIlRyYWNlc0hhbmRsZXIuaGVscGVycyA9IHtcbiAgc2hvd1NpZ25JbWFnZTogZnVuY3Rpb24oaGFuZGxlciwgaXNfZmluaXNoZWQsIGp1ZGdlLCB0cmFjZVNob3dTaWduSW1hZ2UpIHtcbiAgICB2YXIgc3BhY2VVc2VyU2lnbjtcbiAgICBpZiAodHJhY2VTaG93U2lnbkltYWdlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWlzX2ZpbmlzaGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNwYWNlVXNlclNpZ24gPSBJbWFnZVNpZ24uaGVscGVycy5zcGFjZVVzZXJTaWduKGhhbmRsZXIpO1xuICAgIGlmIChzcGFjZVVzZXJTaWduICE9IG51bGwgPyBzcGFjZVVzZXJTaWduLnNpZ24gOiB2b2lkIDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBvYmplY3RVcmw6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkge1xuICAgIHJldHVybiBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpO1xuICB9XG59O1xuIiwibWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKVxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyA9XG5cdGFwcGxpY2FudENvbnRleHQ6IC0+XG5cdFx0c3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGRhdGEgPSB7XG5cdFx0XHRuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG5cdFx0XHRhdHRzOiB7bmFtZTogJ2luc19hcHBsaWNhbnQnLCBpZDogJ2luc19hcHBsaWNhbnQnLCBjbGFzczogJ3NlbGVjdFVzZXIgZm9ybS1jb250cm9sIGluc19hcHBsaWNhbnQnfSxcblx0XHRcdHZhbHVlOiBzdGVlZG9zX2luc3RhbmNlLmFwcGxpY2FudF9uYW1lXG5cdFx0fVxuXHRcdGlmIG5vdCBzdGVlZG9zX2luc3RhbmNlIHx8IHN0ZWVkb3NfaW5zdGFuY2Uuc3RhdGUgIT0gXCJkcmFmdFwiXG5cdFx0XHRkYXRhLmF0dHMuZGlzYWJsZWQgPSB0cnVlXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0aW5zdGFuY2VJZDogLT5cblx0XHRyZXR1cm4gJ2luc3RhbmNlZm9ybSc7I1wiaW5zdGFuY2VfXCIgKyBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIik7XG5cblx0Zm9ybV90eXBlczogLT5cblx0XHRpZiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblx0XHRcdHJldHVybiAnZGlzYWJsZWQnO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiAnbWV0aG9kJztcblxuXHRzdGVlZG9zX2Zvcm06IC0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVybiBmb3JtX3ZlcnNpb25cblxuXHRpbm5lcnN1YmZvcm1Db250ZXh0OiAob2JqKS0+XG5cdFx0ZG9jX3ZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblx0XHRvYmpbXCJ0YWJsZVZhbHVlc1wiXSA9IGlmIGRvY192YWx1ZXMgdGhlbiBkb2NfdmFsdWVzW29iai5jb2RlXSBlbHNlIFtdXG5cdFx0b2JqW1wiZm9ybUlkXCJdID0gXCJpbnN0YW5jZWZvcm1cIjtcblx0XHRyZXR1cm4gb2JqO1xuXG5cdGluc3RhbmNlOiAtPlxuXHRcdFNlc3Npb24uZ2V0KFwiY2hhbmdlX2RhdGVcIilcblx0XHRpZiAoU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKVxuXHRcdFx0c3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0cmV0dXJuIHN0ZWVkb3NfaW5zdGFuY2U7XG5cblx0ZW1wdHk6ICh2YWwpIC0+XG5cdFx0aWYgdmFsXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR1bmVtcHR5OiAodmFsKSAtPlxuXHRcdGlmIHZhbFxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdGVxdWFsczogKGEsIGIpIC0+XG5cdFx0cmV0dXJuIChhID09IGIpXG5cblx0dW5lcXVhbHM6IChhLCBiKSAtPlxuXHRcdHJldHVybiAhKGEgPT0gYilcblxuXHRpbmNsdWRlczogKGEsIGIpIC0+XG5cdFx0cmV0dXJuIGIuc3BsaXQoJywnKS5pbmNsdWRlcyhhKTtcblxuXHRpbmNsdWRlOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuXG5cdGZpZWxkczogLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXHRcdGlmIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYShmb3JtX3ZlcnNpb24pKTtcblxuXHRmb3JtYXREYXRlOiAoZGF0ZSwgb3B0aW9ucyktPlxuXHRcdGlmICFkYXRlXG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRpZiBvcHRpb25zICYmIHR5cGVvZihvcHRpb25zKSA9PSAnc3RyaW5nJ1xuXHRcdFx0b3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9ucyk7XG5cblx0XHRpZiAhb3B0aW9ucy5mb3JtYXRcblx0XHRcdG9wdGlvbnMgPSB7Zm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW1cIn1cblxuXHRcdHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KG9wdGlvbnMuZm9ybWF0KTtcblxuXHR0cmFjZXM6IC0+XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRzdGVlZG9zRGF0YSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/LnZpZXc/LnRlbXBsYXRlPy5zdGVlZG9zRGF0YVxuXHRcdFx0aW5zdGFuY2UgPSBzdGVlZG9zRGF0YT8uaW5zdGFuY2Vcblx0XHRcdGZsb3cgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24oaW5zdGFuY2UpO1xuXHRcdFx0bG9jYWxlID0gc3RlZWRvc0RhdGE/LmxvY2FsZVxuXHRcdFx0aWYgbG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRlbHNlXG5cdFx0XHRpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0XHRmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRmxvd1ZlcnNpb24oKVxuXG5cdFx0XHRsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpXG5cblx0XHRpZiAhaW5zdGFuY2UgfHwgIWZsb3dcblx0XHRcdHJldHVybiB7fTtcblxuXHRcdHN0ZXBzID0gZmxvdy5zdGVwcztcblxuXHRcdHRyYWNlcyA9IHt9O1xuXG5cdFx0aW5zdGFuY2UudHJhY2VzPy5mb3JFYWNoICh0cmFjZSktPlxuXHRcdFx0c3RlcCA9IHN0ZXBzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdHJhY2Uuc3RlcClcblxuXHRcdFx0YXBwcm92ZXMgPSBbXVxuXG5cdFx0XHR0cmFjZS5hcHByb3Zlcz8uZm9yRWFjaCAoYXBwcm92ZSkgLT5cblx0XHRcdFx0aWYgdHJhY2UuaXNfZmluaXNoZWQgPT0gdHJ1ZVxuIyDlt7Lnu5PmnZ/nmoTmmL7npLrkuLrmoLjlh4Yv6amz5ZueL+WPlua2iOeUs+ivt1xuXHRcdFx0XHRcdGlmIGFwcHJvdmUuanVkZ2UgPT0gJ2FwcHJvdmVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBhcHByb3ZlZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAncmVqZWN0ZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlamVjdGVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSB0ZXJtaW5hdGVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICdyZWFzc2lnbmVkJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWFzc2lnbmVkXCIsIHt9LCBsb2NhbGUpXG5cdFx0XHRcdFx0ZWxzZSBpZiBhcHByb3ZlLmp1ZGdlID09ICdyZWxvY2F0ZWQnXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHJlbG9jYXRlZFwiLCB7fSwgbG9jYWxlKVxuXHRcdFx0XHRcdGVsc2UgaWYgYXBwcm92ZS5qdWRnZSA9PSAnJ1xuXHRcdFx0XHRcdFx0anVkZ2VfbmFtZSA9IFwiXCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRqdWRnZV9uYW1lID0gXCJcIlxuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHBlbmRpbmdcIiwge30sIGxvY2FsZSlcblxuXHRcdFx0XHRhcHByb3Zlcy5wdXNoXG5cdFx0XHRcdFx0X2lkOiBhcHByb3ZlLl9pZFxuXHRcdFx0XHRcdGhhbmRsZXI6IGFwcHJvdmUudXNlclxuXHRcdFx0XHRcdGhhbmRsZXJfbmFtZTogYXBwcm92ZS5oYW5kbGVyX25hbWVcblx0XHRcdFx0XHRoYW5kbGVyX29yZ2FuaXphdGlvbl9uYW1lOiBhcHByb3ZlLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWVcblx0XHRcdFx0XHRoYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZTogYXBwcm92ZS5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZVxuXHRcdFx0XHRcdGZpbmlzaF9kYXRlOiBhcHByb3ZlLmZpbmlzaF9kYXRlXG5cdFx0XHRcdFx0anVkZ2U6IGFwcHJvdmUuanVkZ2Vcblx0XHRcdFx0XHRqdWRnZV9uYW1lOiBqdWRnZV9uYW1lXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IGFwcHJvdmUuZGVzY3JpcHRpb25cblx0XHRcdFx0XHRpc19maW5pc2hlZDogYXBwcm92ZS5pc19maW5pc2hlZFxuXHRcdFx0XHRcdHR5cGU6IGFwcHJvdmUudHlwZVxuXHRcdFx0XHRcdG9waW5pb25fZmllbGRzX2NvZGU6IGFwcHJvdmUub3Bpbmlvbl9maWVsZHNfY29kZVxuXHRcdFx0XHRcdHNpZ25fZmllbGRfY29kZTogYXBwcm92ZS5zaWduX2ZpZWxkX2NvZGVcblx0XHRcdFx0XHRpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWRcblx0XHRcdFx0XHRzaWduX3Nob3c6IGFwcHJvdmUuc2lnbl9zaG93XG5cblxuXHRcdFx0aWYgc3RlcFxuXHRcdFx0XHRpZiBzdGVwLm5hbWUgb2YgdHJhY2VzXG5cdFx0XHRcdFx0dHJhY2VzW3N0ZXAubmFtZV0gPSB0cmFjZXNbc3RlcC5uYW1lXS5jb25jYXQoYXBwcm92ZXMpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0cmFjZXNbc3RlcC5uYW1lXSA9IGFwcHJvdmVzXG5cblx0XHRyZXR1cm4gdHJhY2VzO1xuXG5cblxuXHRkb2NfdmFsdWVzOiAtPlxuXHRcdFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcblxuXHRpbnN0YW5jZV9ib3hfc3R5bGU6IC0+XG5cdFx0Ym94ID0gU2Vzc2lvbi5nZXQoXCJib3hcIilcblx0XHRpZiBib3ggPT0gXCJpbmJveFwiIHx8IGJveCA9PSBcImRyYWZ0XCJcblx0XHRcdGp1ZGdlID0gU2Vzc2lvbi5nZXQoXCJqdWRnZVwiKVxuXHRcdFx0aWYganVkZ2Vcblx0XHRcdFx0aWYgKGp1ZGdlID09IFwiYXBwcm92ZWRcIilcblx0XHRcdFx0XHRyZXR1cm4gXCJib3gtc3VjY2Vzc1wiXG5cdFx0XHRcdGVsc2UgaWYgKGp1ZGdlID09IFwicmVqZWN0ZWRcIilcblx0XHRcdFx0XHRyZXR1cm4gXCJib3gtZGFuZ2VyXCJcblx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiBpbnMgJiYgaW5zLmZpbmFsX2RlY2lzaW9uXG5cdFx0XHRpZiBpbnMuZmluYWxfZGVjaXNpb24gPT0gXCJhcHByb3ZlZFwiXG5cdFx0XHRcdHJldHVybiBcImJveC1zdWNjZXNzXCJcblx0XHRcdGVsc2UgaWYgKGlucy5maW5hbF9kZWNpc2lvbiA9PSBcInJlamVjdGVkXCIpXG5cdFx0XHRcdHJldHVybiBcImJveC1kYW5nZXJcIlxuXG4jaXNfZGlzYWJsZWQ6IC0+XG4jICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuIyAgICBpZiAhaW5zXG4jICAgICAgICByZXR1cm47XG4jICAgIGlmIGlucy5zdGF0ZSE9XCJkcmFmdFwiXG4jICAgICAgICByZXR1cm4gXCJkaXNhYmxlZFwiO1xuIyAgICByZXR1cm47XG5cblx0dGFibGVfZmllbGRzOiAoaW5zdGFuY2UpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG5cdFx0ZWxzZVxuXHRcdFx0Zm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZvcm1WZXJzaW9uKGluc3RhbmNlLmZvcm0sIGluc3RhbmNlLmZvcm1fdmVyc2lvbilcblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdGZpZWxkcyA9IF8uY2xvbmUoZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG5cblx0XHRcdGZpZWxkcy5mb3JFYWNoIChmaWVsZCwgaW5kZXgpIC0+XG5cdFx0XHRcdGZpZWxkLnRyX3N0YXJ0ID0gXCJcIjtcblx0XHRcdFx0ZmllbGQudHJfZW5kID0gXCJcIjtcblx0XHRcdFx0dGRfY29sc3BhbiA9IDE7XG4jXHRcdFx0XHTlvLrliLborr7nva7moIflpLTlrZfmrrXkuLrlrr3lrZfmrrVcblx0XHRcdFx0aWYgQ29yZUZvcm0/LnBhZ2VUaXRsZUZpZWxkTmFtZSA9PSBmaWVsZC5jb2RlXG5cdFx0XHRcdFx0ZmllbGQuaXNfd2lkZSA9IHRydWVcblxuXHRcdFx0XHRpZiBmaWVsZC5mb3JtdWxhICYmIGZpZWxkLnR5cGUgIT0gJ29kYXRhJ1xuXHRcdFx0XHRcdGZpZWxkLnBlcm1pc3Npb24gPSBcInJlYWRvbmx5XCI7XG5cblx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpXG4jIOWmguaenOW9k+WJjeWtl+auteaYr+WIhue7hOOAgeihqOagvOOAgeWuveWtl+autVxuXHRcdFx0XHRcdGlmIGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRcdFx0ZmllbGQudGRfY29sc3BhbiA9IDQ7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZmllbGQudGRfY29sc3BhbiA9IDM7XG5cblx0XHRcdFx0XHRpZiBpbmRleCAhPSAwXG5cdFx0XHRcdFx0XHRmaWVsZC50cl9zdGFydCA9IFwiPHRyPlwiO1xuXHRcdFx0XHRcdFx0ZmllbGQudHJfZW5kID0gXCI8L3RyPlwiO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cHJlX2ZpZWxkcyA9IGZpZWxkcy5zbGljZSgwLCBpbmRleCk7XG5cblx0XHRcdFx0XHRwcmVfd2lkZV9maWVsZHMgPSBwcmVfZmllbGRzLmZpbHRlclByb3BlcnR5KFwiaXNfd2lkZVwiLCB0cnVlKTtcblxuXHRcdFx0XHRcdHRyX3N0YXJ0ID0gXCJcIjtcblxuXHRcdFx0XHRcdHRyX2VuZCA9IFwiXCI7XG5cblx0XHRcdFx0XHQjIOWFiOiuoeeul+W9k+WJjeWtl+auteaYr+WQpuS4uuWuveWtl+autVxuXHRcdFx0XHRcdGJlZm9yZV9maWVsZCA9IG51bGw7XG5cdFx0XHRcdFx0YWZ0ZXJfZmllbGQgPSBudWxsO1xuXG5cdFx0XHRcdFx0aWYgaW5kZXggPiAwXG5cdFx0XHRcdFx0XHRiZWZvcmVfZmllbGQgPSBmaWVsZHNbaW5kZXggLSAxXVxuXG5cdFx0XHRcdFx0aWYgaW5kZXggPCBmaWVsZHMubGVuZ3RoIC0gMVxuXHRcdFx0XHRcdFx0YWZ0ZXJfZmllbGQgPSBmaWVsZHNbaW5kZXggKyAxXVxuXG5cdFx0XHRcdFx0IyDlpoLmnpzlvZPliY3lrZfmrrXmmK/liIbnu4TjgIHooajmoLzjgIHlrr3lrZfmrrVcblx0XHRcdFx0XHRpZiBmaWVsZC50eXBlID09ICdzZWN0aW9uJyB8fCBmaWVsZC50eXBlID09ICd0YWJsZSdcblx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSA0O1xuXHRcdFx0XHRcdGVsc2UgaWYgZmllbGQuaXNfd2lkZVxuXHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDM7XG5cdFx0XHRcdFx0ZWxzZVxuIyDliY3lkI7pg73mmK/lrr3lrZfmrrVcblx0XHRcdFx0XHRcdGlmIGJlZm9yZV9maWVsZCAmJiBhZnRlcl9maWVsZCAmJiBiZWZvcmVfZmllbGQuaXNfd2lkZSAmJiBhZnRlcl9maWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHRcdGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR0ZF9jb2xzcGFuID0gMztcblxuXHRcdFx0XHRcdFx0IyDlvZPliY3mmK90ciDkuIvnmoQg56ys5LiA5LiqdGQgJiDlkI7ovrnnmoTlrZfmrrXmmK/lrr3lrZfmrrVcblx0XHRcdFx0XHRcdGlmIChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PSAwICYmIGFmdGVyX2ZpZWxkICYmIGFmdGVyX2ZpZWxkLmlzX3dpZGVcblx0XHRcdFx0XHRcdFx0ZmllbGQuaXNfd2lkZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdHRkX2NvbHNwYW4gPSAzO1xuXG5cdFx0XHRcdFx0XHQjIOW9k+WJjeaYr3RyIOS4i+eahCDnrKzkuIDkuKp0ZCAmIOW9k+WJjeWtl+auteaYr+acgOWQjuS4gOS4quWtl+autVxuXHRcdFx0XHRcdFx0aWYgKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09IDAgJiYgYWZ0ZXJfZmllbGQgPT0gbnVsbFxuXHRcdFx0XHRcdFx0XHRmaWVsZC5pc193aWRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dGRfY29sc3BhbiA9IDM7XG5cblx0XHRcdFx0XHRmaWVsZC50ZF9jb2xzcGFuID0gdGRfY29sc3BhbjtcblxuXG5cdFx0XHRcdFx0aWYgaW5kZXggPT0gMFxuIyB0cl9zdGFydCA9IFwiPHRyPlwiOyDnlLHkuo5UZW1wbGF0ZeeahOe8luivkWJ1Z++8jOWvvOiHtOavj+asoee7meS4gOS4qnRy5byA5aeL5pe277yM5Lya6Ieq5Yqo6KGl5aS05oiW6KGl5bC+44CC5Zug5q2k5Zyo56ys5LiA6KGM6L+U5Zue5LiA5Liq56m65a2X56ym5LiyLlxuXHRcdFx0XHRcdFx0dHJfc3RhcnQgPSBcIjx0cj5cIjtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpZiAocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgPT0gMCB8fCBmaWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHRcdGlmIGZpZWxkLnR5cGUgPT0gJ3RhYmxlJ1xuXHRcdFx0XHRcdFx0XHRcdHRyX3N0YXJ0ID0gXCI8dHIgY2xhc3MgPSBcXFwidHItY2hpbGQtdGFibGVcXFwiPlwiO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0dHJfc3RhcnQgPSBcIjx0cj5cIjtcblxuXHRcdFx0XHRcdGZpZWxkLnRyX3N0YXJ0ID0gdHJfc3RhcnQ7XG5cblxuXHRcdFx0XHRcdGlmIGluZGV4ICsgMSA9PSBmaWVsZHMubGVuZ3RoIHx8IGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0gJ3RhYmxlJyB8fCBmaWVsZC5pc193aWRlXG5cdFx0XHRcdFx0XHR0cl9lbmQgPSBcIjwvdHI+XCI7XG5cblx0XHRcdFx0XHRpZiAocHJlX2ZpZWxkcy5sZW5ndGggKyBwcmVfd2lkZV9maWVsZHMubGVuZ3RoKSAlIDIgIT0gMFxuXHRcdFx0XHRcdFx0dHJfZW5kID0gXCI8L3RyPlwiO1xuXG5cdFx0XHRcdFx0ZmllbGQudHJfZW5kID0gdHJfZW5kO1xuXG5cdFx0XHRyZXR1cm4gZmllbGRzO1xuXG5cdHNvcnRfYXBwcm92ZTogKGFwcHJvdmVzLCBvcmRlciktPlxuXHRcdGlmICFhcHByb3Zlc1xuXHRcdFx0cmV0dXJuIFtdXG5cblx0XHRpZiAhYXBwcm92ZXMgaW5zdGFuY2VvZiBBcnJheVxuXHRcdFx0cmV0dXJuIFtdXG5cdFx0ZWxzZVxuXHRcdFx0aWYgb3JkZXIgPT0gJ2Rlc2MnXG5cdFx0XHRcdGFwcHJvdmVzLnNvcnQgKHAxLCBwMikgLT5cblx0XHRcdFx0XHRfcDEgPSAwXG5cdFx0XHRcdFx0X3AyID0gMFxuXG5cdFx0XHRcdFx0aWYgcDEuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdF9wMSA9IHAxLmZpbmlzaF9kYXRlLmdldFRpbWUoKVxuXG5cdFx0XHRcdFx0aWYgcDIuZmluaXNoX2RhdGVcblx0XHRcdFx0XHRcdF9wMiA9IHAyLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcblxuXHRcdFx0XHRcdHJldHVybiBfcDIgLSBfcDFcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXBwcm92ZXMuc29ydCAocDEsIHAyKSAtPlxuXHRcdFx0XHRcdF9wMSA9IDBcblx0XHRcdFx0XHRfcDIgPSAwXG5cblx0XHRcdFx0XHRpZiBwMS5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0X3AxID0gcDEuZmluaXNoX2RhdGUuZ2V0VGltZSgpXG5cblx0XHRcdFx0XHRpZiBwMi5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0X3AyID0gcDIuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIF9wMSAtIF9wMlxuXHRcdHJldHVybiBhcHByb3Zlc1xuXG5cdF90OiAoa2V5KS0+XG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KVxuXHRnZXRGaWVsZDogKGNvZGUpLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cdFx0aWYgZm9ybV92ZXJzaW9uXG5cdFx0XHRyZXR1cm4gZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKVxuXG5cdGdldFZhbHVlOiAoY29kZSktPlxuXHRcdGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlXG5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cblx0XHR1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0XG5cblx0XHR2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge31cblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0dmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpXG5cblx0XHRyZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldFZhbHVlIHZhbHVlc1tjb2RlXSwgZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKSwgbG9jYWxlLCB1dGNPZmZzZXRcblxuXHRnZXRMYWJlbDogKGNvZGUpLT5cblx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG5cdFx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsIGZvcm1fdmVyc2lvbi5maWVsZHMsIGNvZGVcblxuXHRpc1RleHRhcmVhOiAoZmllbGQpLT5cblx0XHRpZiBmaWVsZD8udHlwZSA9PSBcImlucHV0XCIgJiYgZmllbGQ/LmlzX3RleHRhcmVhXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdGdldENmQ2xhc3M6IChmaWVsZCktPlxuXHRcdGlmIGZpZWxkPy50eXBlID09IFwiaW5wdXRcIiAmJiBmaWVsZD8uaXNfdGV4dGFyZWFcblx0XHRcdHJldHVybiBcImNmVGV4dGFyZWFcIlxuXG5cdGdldFRhYmxlVGhlYWQ6IChmaWVsZCktPlxuXHRcdHJldHVybiBTdGVlZG9zVGFibGUuZ2V0VGhlYWQoZmllbGQsIGZhbHNlKVxuXG5cdGdldFRhYmxlQm9keTogKGZpZWxkKS0+XG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlXG5cdFx0XHR2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge31cblx0XHRlbHNlXG5cdFx0XHR2YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKClcblxuXHRcdHRhYmxlVmFsdWUgPSB2YWx1ZXNbZmllbGQuY29kZV07XG5cdFx0cmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRUYm9keShmaWVsZC5zZmllbGRzLmdldFByb3BlcnR5KFwiY29kZVwiKSwgZmllbGQsIHRhYmxlVmFsdWUsIGZhbHNlKVxuXG5cdHNob3dMYWJlbDogKGZpZWxkKS0+XG5cdFx0dGVtcGxhdGVEYXRhID0gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhXG5cdFx0aWYgdGVtcGxhdGVEYXRhLmxhYmVsID09IGZhbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRyZXR1cm4gdHJ1ZVxuXG4jXHRhZkZpZWxkTGFiZWxUZXh0OiAob3ApLT5cbiNcdFx0aWYgIVRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YVxuI1x0XHRcdHJldHVybiBBdXRvRm9ybS5nZXRMYWJlbEZvckZpZWxkKG9wLm5hbWUpXG4jXHRcdGVsc2VcbiNcdFx0XHRmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uXG4jXHRcdFx0SW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsIGZvcm1fdmVyc2lvbi5maWVsZHMsIG9wPy5oYXNoPy5uYW1lXG5cblx0aXNPcGluaW9uRmllbGQ6IChmaWVsZCktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkLmZvcm11bGEpXG5cblx0aXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmc6IChmaWVsZF9mb3JtdWxhKS0+XG5cdFx0cmV0dXJuIEluc3RhbmNlU2lnblRleHQuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSlcblxuXHRpbmNsdWRlc09waW5pb25GaWVsZDogKGZvcm0sIGZvcm1fdmVyc2lvbiktPlxuXG5cdFx0ZmllbGRfZm9ybXVsYXMgPSBuZXcgQXJyYXkoKTtcblxuXHRcdGZpZWxkcyA9IGRiLmZvcm1fdmVyc2lvbnMuZmluZE9uZSh7X2lkOiBmb3JtX3ZlcnNpb24sIGZvcm06IGZvcm19KT8uZmllbGRzIHx8IFtdXG5cblx0XHRmaWVsZHMuZm9yRWFjaCAoZiktPlxuXHRcdFx0aWYgZi50eXBlID09ICd0YWJsZSdcblx0XHRcdFx0Y29uc29sZS5sb2cgJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJ1xuXHRcdFx0ZWxzZSBpZiBmLnR5cGUgPT0gJ3NlY3Rpb24nXG5cdFx0XHRcdGY/LmZpZWxkcz8uZm9yRWFjaCAoZjEpLT5cblx0XHRcdFx0XHRmaWVsZF9mb3JtdWxhcy5wdXNoIGYxLmZvcm11bGFcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmllbGRfZm9ybXVsYXMucHVzaCBmLmZvcm11bGFcblxuXHRcdF8uc29tZSBmaWVsZF9mb3JtdWxhcywgKGZpZWxkX2Zvcm11bGEpLT5cblx0XHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpXG5cblx0Z2V0T3BpbmlvbkZpZWxkU3RlcHNOYW1lOiAoZmllbGRfZm9ybXVsYSwgdG9wX2tleXdvcmRzKS0+XG5cblx0XHRvcGluaW9uRmllbGRzID0gbmV3IEFycmF5KCk7XG4jXHRcdGNvbnNvbGUubG9nKFwiZmllbGRfZm9ybXVsYVwiLCBmaWVsZF9mb3JtdWxhKVxuXHRcdGlmIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNPcGluaW9uRmllbGRfZnJvbV9zdHJpbmcoZmllbGRfZm9ybXVsYSlcblx0XHRcdGlmIGZpZWxkX2Zvcm11bGFcblxuI1x0XHRcdFx0Zm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCIsXCIpXG5cdFx0XHRcdGZvbzEgPSBmaWVsZF9mb3JtdWxhLnNwbGl0KFwiO1wiKVxuXG4jXHRcdFx0XHRpZiB0b3Bfa2V5d29yZHNcbiNcdFx0XHRcdFx0Zm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCI7XCIpXG5cblx0XHRcdFx0Zm9vMS5mb3JFYWNoIChmb28pLT5cblx0XHRcdFx0XHRqc29uX2Zvcm11bGEgPSB7fVxuXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRqc29uX2Zvcm11bGEgPSBldmFsKFwiKFwiICsgZm9vICsgXCIpXCIpXG5cdFx0XHRcdFx0Y2F0Y2hcblx0XHRcdFx0XHRcdGpzb25fZm9ybXVsYSA9IHt9XG5cblx0XHRcdFx0XHRpZiBqc29uX2Zvcm11bGE/LnlpamlhbmxhblxuXHRcdFx0XHRcdFx0c2YgPSB7fVxuXG5cdFx0XHRcdFx0XHRzZi5zdGVwTmFtZSA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uc3RlcFxuXG5cdFx0XHRcdFx0XHRzZi5pbWFnZV9zaWduID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5pbWFnZV9zaWduIHx8IGZhbHNlXG5cblx0XHRcdFx0XHRcdHNmLm9ubHlfY2Nfb3BpbmlvbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9jYyB8fCBmYWxzZVxuXG5cdFx0XHRcdFx0XHRzZi5kZWZhdWx0X2Rlc2NyaXB0aW9uID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5kZWZhdWx0XG5cblx0XHRcdFx0XHRcdHNmLm9ubHlfaGFuZGxlciA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9oYW5kbGVyXG5cblx0XHRcdFx0XHRcdHNmLnRvcF9rZXl3b3JkcyA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4udG9wX2tleXdvcmRzIHx8IHRvcF9rZXl3b3Jkc1xuXG5cdFx0XHRcdFx0XHRvcGluaW9uRmllbGRzLnB1c2goc2YpO1xuXG5cdFx0XHRcdFx0ZWxzZSBpZihmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3RyYWNlcy5cIikgPiAtMSB8fCBmaWVsZF9mb3JtdWxhPy5pbmRleE9mKFwie3NpZ25hdHVyZS50cmFjZXMuXCIpID4gLTEpXG5cblx0XHRcdFx0XHRcdHNmID0ge29ubHlfY2Nfb3BpbmlvbjogZmFsc2UsIGltYWdlX3NpZ246IGZhbHNlLCB0b3Bfa2V5d29yZHM6IHRvcF9rZXl3b3Jkc31cblxuXHRcdFx0XHRcdFx0aWYgZm9vLmluZGV4T2YoXCJ7c2lnbmF0dXJlLlwiKSA+IC0xXG5cdFx0XHRcdFx0XHRcdHNmLmltYWdlX3NpZ24gPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGZvbyA9IGZvby5yZXBsYWNlKFwie3NpZ25hdHVyZS5cIixcIlwiKTtcblxuXHRcdFx0XHRcdFx0czEgPSBmb28ucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpXG5cdFx0XHRcdFx0XHRpZiBzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMVxuXHRcdFx0XHRcdFx0XHRzZi5zdGVwTmFtZSA9IHMxLnNwbGl0KFwiLlwiKVsxXVxuXHRcdFx0XHRcdFx0XHRpZiBvcGluaW9uRmllbGRzLmZpbHRlclByb3BlcnR5KFwic3RlcE5hbWVcIixzZi5zdGVwTmFtZSkubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0XHRcdG9waW5pb25GaWVsZHMuZmluZFByb3BlcnR5QnlQSyhcInN0ZXBOYW1lXCIsIHNmLnN0ZXBOYW1lKT8ub25seV9jY19vcGluaW9uID0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIHMxLnNwbGl0KFwiLlwiKVsyXT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PSAnY2MnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNmLm9ubHlfY2Nfb3BpbmlvbiA9IHRydWVcblx0XHRcdFx0XHRcdG9waW5pb25GaWVsZHMucHVzaChzZik7XG5cblx0XHRyZXR1cm4gb3BpbmlvbkZpZWxkc1xuXG5cdHNob3dDQ09waW5pb246IChmaWVsZCktPlxuXHRcdGlmIGZpZWxkLmZvcm11bGE/LmluZGV4T2YoXCJ7dHJhY2VzLlwiKSA+IC0xIHx8IGZpZWxkLmZvcm11bGE/LmluZGV4T2YoXCJ7c2lnbmF0dXJlLnRyYWNlcy5cIikgPiAtMVxuXHRcdFx0czEgPSBmaWVsZC5mb3JtdWxhLnJlcGxhY2UoXCJ7c2lnbmF0dXJlLlwiLFwiXCIpLnJlcGxhY2UoXCJ7XCIsXCJcIikucmVwbGFjZShcIn1cIixcIlwiKVxuXHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDJcblx0XHRcdFx0aWYgczEuc3BsaXQoXCIuXCIpWzJdPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICdjYydcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdG1hcmtEb3duVG9IdG1sOiAobWFya0Rvd25TdHJpbmcpLT5cblx0XHRpZiBtYXJrRG93blN0cmluZ1xuXHRcdFx0IyByZW5kZXJlciA9IG5ldyBNYXJrZG93bi5SZW5kZXJlcigpO1xuXHRcdFx0IyByZW5kZXJlci5saW5rID0gKCBocmVmLCB0aXRsZSwgdGV4dCApIC0+XG5cdFx0XHQjIFx0cmV0dXJuIFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyN7aHJlZn0nIHRpdGxlPScje3RpdGxlfSc+I3t0ZXh0fTwvYT5cIlxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKVxuXHRcdFx0cmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpXG5cblx0Zl9sYWJlbDogKHRoYXQpLT5cblx0XHRyZXR1cm4gdGhhdC5uYW1lIHx8IHRoYXQuY29kZVxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5zdGVlZG9zX2Zvcm0gPSAtPlxuXHRcdHJldHVybiB0aGlzLmZvcm1fdmVyc2lvblxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaXNTZWN0aW9uID0gKGNvZGUpLT5cblx0XHRmb3JtX3ZlcnNpb24gPSB0aGlzLmZvcm1fdmVyc2lvblxuXHRcdHJldHVybiBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpLnR5cGUgPT0gJ3NlY3Rpb24nXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5kb2NfdmFsdWVzID0gLT5cblx0XHRpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2U7XG5cdFx0cmV0dXJuIGluc3RhbmNlLnZhbHVlcztcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmFwcGxpY2FudENvbnRleHQgPSAtPlxuXHRcdGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcblx0XHRkYXRhID0ge1xuXHRcdFx0bmFtZTogJ2luc19hcHBsaWNhbnQnLFxuXHRcdFx0YXR0czoge25hbWU6ICdpbnNfYXBwbGljYW50JywgaWQ6ICdpbnNfYXBwbGljYW50JywgY2xhc3M6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50J30sXG5cdFx0XHR2YWx1ZTogaW5zdGFuY2UuYXBwbGljYW50X25hbWVcblx0XHR9XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnN0YW5jZSA9IC0+XG5cdFx0cmV0dXJuIHRoaXMuaW5zdGFuY2VcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZpZWxkcyA9IC0+XG5cdFx0Zm9ybV92ZXJzaW9uID0gdGhpcy5mb3JtX3ZlcnNpb25cblx0XHRpZiBmb3JtX3ZlcnNpb25cblx0XHRcdHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5mb3JtX3R5cGVzID0gLT5cblx0XHRyZXR1cm4gXCJkaXNhYmxlZFwiXG5cblx0VGVtcGxhdGUucmVnaXN0ZXJIZWxwZXIgXCJhZkZpZWxkTGFiZWxUZXh0XCIsIChvcCktPlxuXHRcdGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb25cblx0XHRJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwgZm9ybV92ZXJzaW9uLmZpZWxkcywgb3A/Lmhhc2g/Lm5hbWVcblxuXHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLl90ID0gKGtleSktPlxuXHRcdGxvY2FsZSA9IHRoaXMubG9jYWxlXG5cblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXksIHt9LCBsb2NhbGUpXG5cblx0SW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbnNfYXR0YWNoX2Rvd25sb2FkX3VybCA9IChfaWQsIGFic29sdXRlKS0+XG5cdFx0aWYgYWJzb2x1dGVcblx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy8je19pZH0/ZG93bmxvYWQ9dHJ1ZVwiKTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy8je19pZH0/ZG93bmxvYWQ9dHJ1ZVwiO1xuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMub3B0aW9ucyA9IChmaWVsZCktPlxuXHRcdG9wdGlvbnMgPSBmaWVsZD8ub3B0aW9ucz8uc3BsaXQoXCJcXG5cIilcblx0XHRyZXYgPSBbXVxuXHRcdG9wdGlvbnM/LmZvckVhY2ggKGl0ZW0pLT5cblx0XHRcdHJldi5wdXNoKHtsYWJlbDogaXRlbSwgdmFsdWU6IGl0ZW19KVxuXG5cdFx0cmV0dXJuIHJldlxuXG5cdEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZ2V0UGVybWlzc2lvbnMgPSAoY29kZSktPlxuXHRcdGlmICFUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuc3RhcnRTdGVwRWRpdGFibGVGaWVsZHM/LmluY2x1ZGVzKGNvZGUpXG5cdFx0XHRyZXR1cm4gXCJyZWFkb25seSBkaXNhYmxlZFwiXG5cdFx0cmV0dXJuIFwiXCJcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuZXZlbnRzID1cblx0J2NoYW5nZSAuZm9ybS1jb250cm9sLC5jaGVja2JveCBpbnB1dCwuYWYtcmFkaW8tZ3JvdXAgaW5wdXQsLmFmLWNoZWNrYm94LWdyb3VwIGlucHV0JzogKGV2ZW50KS0+XG5cdFx0SW5zdGFuY2VNYW5hZ2VyLmluc3RhbmNlZm9ybUNoYW5nZUV2ZW50KGV2ZW50KVxuXG5cdCd0eXBlYWhlYWQ6Y2hhbmdlIC5mb3JtLWNvbnRyb2wnOiAoZXZlbnQpIC0+XG5cdFx0SW5zdGFuY2VNYW5hZ2VyLmluc3RhbmNlZm9ybUNoYW5nZUV2ZW50KGV2ZW50KVxuXG5cdCdjbGljayAuY2ZUZXh0YXJlYSBhJzogKGV2ZW50KS0+XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRTdGVlZG9zLm9wZW5XaW5kb3coZXZlbnQudGFyZ2V0LmhyZWYpO1xuXG5cbkluc3RhbmNlZm9ybVRlbXBsYXRlLm9uQ3JlYXRlZCA9ICgpLT5cblx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0aWYgIWluc3RhbmNlXG5cdFx0cmV0dXJuO1xuXG5cdHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlKTtcblxuXHR0cnlcblx0XHRjb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodGVtcGxhdGUsIHtpc0JvZHk6IHRydWV9KTtcblx0Y2F0Y2ggZVxuXHRcdGNvbnNvbGUubG9nIFwiSW5zdGFuY2UgVGVtcGxhdGUgRXJyb3JcIiwgZVxuXHRcdGNvbXBpbGVkID0gU3BhY2ViYXJzQ29tcGlsZXIuY29tcGlsZShcIlwiLCB7aXNCb2R5OiB0cnVlfSk7XG5cblxuXHRyZW5kZXJGdW5jdGlvbiA9IGV2YWwoY29tcGlsZWQpO1xuXG5cdGluc3RhbmNlVmlldyA9IG5ldyBCbGF6ZS5WaWV3KFwiY3VzdG9tX2luc3RhbmNlX3RlbXBsYXRlXCIsIHJlbmRlckZ1bmN0aW9uKTtcblxuXHRpbnN0YW5jZUN1c3RvbVRlbXBsYXRlID0gbmV3IEJsYXplLlRlbXBsYXRlKGluc3RhbmNlVmlldy5uYW1lLCByZW5kZXJGdW5jdGlvbik7XG5cblx0VGVtcGxhdGUuaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlID0gaW5zdGFuY2VDdXN0b21UZW1wbGF0ZVxuXG5cdFRlbXBsYXRlLmluc3RhbmNlX2N1c3RvbV90ZW1wbGF0ZS5oZWxwZXJzIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnNcblxuXG5cblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUub25SZW5kZXJlZCA9ICgpLT5cblx0IyB0ID0gdGhpcztcblxuXHQjdC5zdWJzY3JpYmUgXCJpbnN0YW5jZV9kYXRhXCIsIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSwgLT5cblx0IyAgICBUcmFja2VyLmFmdGVyRmx1c2ggLT5cblx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0aWYgIWluc3RhbmNlXG5cdFx0cmV0dXJuO1xuXG5cdCMkKFwiI2luc19hcHBsaWNhbnRcIikuc2VsZWN0MigpLnZhbChpbnN0YW5jZS5hcHBsaWNhbnQpLnRyaWdnZXIoJ2NoYW5nZScpO1xuXHQjJChcIiNpbnNfYXBwbGljYW50XCIpLnZhbChpbnN0YW5jZS5hcHBsaWNhbnQpO1xuXHRJbnN0YW5jZU1hbmFnZXIuc2V0SW5zdGFuY2VGb3JtQXBwbGljYW50KGluc3RhbmNlLmFwcGxpY2FudCwgaW5zdGFuY2UuYXBwbGljYW50X25hbWUpXG5cblxuXHRBcHByb3ZlTWFuYWdlci5lcnJvciA9IHtuZXh0U3RlcHM6ICcnLCBuZXh0U3RlcFVzZXJzOiAnJ307XG5cblx0IyBpbnN0YW5jZSBmcm9t57uR5a6a5LqL5Lu2XG5cdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2RyYWZ0J1xuXHRcdEluc3RhbmNlRXZlbnQuaW5pdEV2ZW50cyhpbnN0YW5jZS5mbG93KTtcblxuXHRpZiAhQXBwcm92ZU1hbmFnZXIuaXNSZWFkT25seSgpXG5cblx0XHRjdXJyZW50QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuXG5cblx0XHRpbnN0YW5jZU51bWJlckZpZWxkcyA9ICQoXCJbZGF0YS1mb3JtdWxhXVwiLCAkKFwiI2luc3RhbmNlZm9ybVwiKSlcblxuXHRcdGluc3RhbmNlTnVtYmVyRmllbGRzLmVhY2ggKCktPlxuXHRcdFx0c2NoZW1hS2V5ID0gdGhpcy5kYXRhc2V0LnNjaGVtYUtleVxuXHRcdFx0ZWxlbWVudCA9ICQodGhpcylcblx0XHRcdGlmICEkKHRoaXMpLnZhbCgpICYmIHNjaGVtYUtleSAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIilcblx0XHRcdFx0TWV0ZW9yLmNhbGwgJ2dldEluc3RhbmNlVmFsdWVzJywgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpLCAoZXJyb3IsIHJlc3VsdCktPlxuXHRcdFx0XHRcdGlmIGVycm9yXG5cdFx0XHRcdFx0XHR0b2FzdHIuZXJyb3IoZXJyb3IucmVhc29uKVxuXG5cdFx0XHRcdFx0aWYgIXJlc3VsdFtzY2hlbWFLZXldXG5cdFx0XHRcdFx0XHRrZXkgPSBlbGVtZW50LmRhdGEoXCJmb3JtdWxhXCIpPy5yZXBsYWNlKFwiYXV0b19udW1iZXIoXCIsIFwiXCIpLnJlcGxhY2UoXCIpXCIsIFwiXCIpXG5cblx0XHRcdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpLnJlcGxhY2UoL1xcJy9nLCBcIlwiKVxuXG5cdFx0XHRcdFx0XHRpZiBrZXkuaW5kZXhPZihcIntcIikgPiAtMVxuXHRcdFx0XHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZShcIntcIixcIlwiKS5yZXBsYWNlKFwifVwiLFwiXCIpXG5cdFx0XHRcdFx0XHRcdGtleSA9IGtleS50cmltKClcblx0XHRcdFx0XHRcdFx0a2V5ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShrZXksICdpbnN0YW5jZWZvcm0nKVxuXHRcdFx0XHRcdFx0SW5zdGFuY2VOdW1iZXJSdWxlcy5pbnN0YW5jZU51bWJlckJ1aWxkZXIgZWxlbWVudCwga2V5XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0ZWxlbWVudD8udmFsKHJlc3VsdFtzY2hlbWFLZXldKS50cmlnZ2VyKFwiY2hhbmdlXCIpXG5cblx0XHRqdWRnZSA9IGN1cnJlbnRBcHByb3ZlLmp1ZGdlXG5cdFx0Y3VycmVudFN0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblx0XHRmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuXG5cdFx0dW5sZXNzIGZvcm1fdmVyc2lvblxuXHRcdFx0cmV0dXJuXG5cblx0XHR1bmxlc3MgZm9ybV92ZXJzaW9uLmZpZWxkc1xuXHRcdFx0cmV0dXJuXG5cblx0XHRmb3JtdWxhX2ZpZWxkcyA9IEZvcm1fZm9ybXVsYS5nZXRGb3JtdWxhRmllbGRWYXJpYWJsZShcIkZvcm1fZm9ybXVsYS5maWVsZF92YWx1ZXNcIiwgZm9ybV92ZXJzaW9uLmZpZWxkcyk7XG5cdFx0aW5zZXJ0RG9jID0gQXV0b0Zvcm0uZ2V0Rm9ybVZhbHVlcyhcImluc3RhbmNlZm9ybVwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UpXG5cdFx0Rm9ybV9mb3JtdWxhLnJ1bihcIlwiLCBcIlwiLCBmb3JtdWxhX2ZpZWxkcywgaW5zZXJ0RG9jLCBmb3JtX3ZlcnNpb24uZmllbGRzKTtcblx0XHQj5Zyo5q2k5aSE5Yid5aeL5YyWc2Vzc2lvbiDkuK3nmoQgZm9ybV92YWx1ZXMg5Y+Y6YeP77yM55So5LqO6Kem5Y+R5LiL5LiA5q2l5q2l6aqk6K6h566XXG5cdFx0U2Vzc2lvbi5zZXQoXCJpbnN0YW5jZV9mb3JtX3ZhbHVlc1wiLCB7aW5zdGFuY2VJZDogaW5zdGFuY2UuX2lkLCB2YWx1ZXM6IGluc2VydERvY30pO1xuXG5cblxuIiwidmFyIG1hcmtlZDtcblxubWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKTtcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyA9IHtcbiAgYXBwbGljYW50Q29udGV4dDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhdGEsIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgc3RlZWRvc19pbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGRhdGEgPSB7XG4gICAgICBuYW1lOiAnaW5zX2FwcGxpY2FudCcsXG4gICAgICBhdHRzOiB7XG4gICAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgICAgaWQ6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgICAgXCJjbGFzc1wiOiAnc2VsZWN0VXNlciBmb3JtLWNvbnRyb2wgaW5zX2FwcGxpY2FudCdcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogc3RlZWRvc19pbnN0YW5jZS5hcHBsaWNhbnRfbmFtZVxuICAgIH07XG4gICAgaWYgKCFzdGVlZG9zX2luc3RhbmNlIHx8IHN0ZWVkb3NfaW5zdGFuY2Uuc3RhdGUgIT09IFwiZHJhZnRcIikge1xuICAgICAgZGF0YS5hdHRzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sXG4gIGluc3RhbmNlSWQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnaW5zdGFuY2Vmb3JtJztcbiAgfSxcbiAgZm9ybV90eXBlczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKSkge1xuICAgICAgcmV0dXJuICdkaXNhYmxlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnbWV0aG9kJztcbiAgICB9XG4gIH0sXG4gIHN0ZWVkb3NfZm9ybTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VGb3JtVmVyc2lvbigpO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmb3JtX3ZlcnNpb247XG4gICAgfVxuICB9LFxuICBpbm5lcnN1YmZvcm1Db250ZXh0OiBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgZG9jX3ZhbHVlcztcbiAgICBkb2NfdmFsdWVzID0gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICAgIG9ialtcInRhYmxlVmFsdWVzXCJdID0gZG9jX3ZhbHVlcyA/IGRvY192YWx1ZXNbb2JqLmNvZGVdIDogW107XG4gICAgb2JqW1wiZm9ybUlkXCJdID0gXCJpbnN0YW5jZWZvcm1cIjtcbiAgICByZXR1cm4gb2JqO1xuICB9LFxuICBpbnN0YW5jZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0ZWVkb3NfaW5zdGFuY2U7XG4gICAgU2Vzc2lvbi5nZXQoXCJjaGFuZ2VfZGF0ZVwiKTtcbiAgICBpZiAoU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZUlkXCIpKSB7XG4gICAgICBzdGVlZG9zX2luc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICByZXR1cm4gc3RlZWRvc19pbnN0YW5jZTtcbiAgICB9XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbih2YWwpIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgdW5lbXB0eTogZnVuY3Rpb24odmFsKSB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGVxdWFsczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBhID09PSBiO1xuICB9LFxuICB1bmVxdWFsczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiAhKGEgPT09IGIpO1xuICB9LFxuICBpbmNsdWRlczogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiLnNwbGl0KCcsJykuaW5jbHVkZXMoYSk7XG4gIH0sXG4gIGluY2x1ZGU6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYi5zcGxpdCgnLCcpLmluY2x1ZGVzKGEpO1xuICB9LFxuICBmaWVsZHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JtX3ZlcnNpb247XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYShXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hKGZvcm1fdmVyc2lvbikpO1xuICAgIH1cbiAgfSxcbiAgZm9ybWF0RGF0ZTogZnVuY3Rpb24oZGF0ZSwgb3B0aW9ucykge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5mb3JtYXQpIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tXCJcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KG9wdGlvbnMuZm9ybWF0KTtcbiAgfSxcbiAgdHJhY2VzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZmxvdywgaW5zdGFuY2UsIGxvY2FsZSwgcmVmLCByZWYxLCByZWYyLCByZWYzLCBzdGVlZG9zRGF0YSwgc3RlcHMsIHRyYWNlcztcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBzdGVlZG9zRGF0YSA9IChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYudmlldykgIT0gbnVsbCA/IChyZWYyID0gcmVmMS50ZW1wbGF0ZSkgIT0gbnVsbCA/IHJlZjIuc3RlZWRvc0RhdGEgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICBpbnN0YW5jZSA9IHN0ZWVkb3NEYXRhICE9IG51bGwgPyBzdGVlZG9zRGF0YS5pbnN0YW5jZSA6IHZvaWQgMDtcbiAgICAgIGZsb3cgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0Rmxvd1ZlcnNpb24oaW5zdGFuY2UpO1xuICAgICAgbG9jYWxlID0gc3RlZWRvc0RhdGEgIT0gbnVsbCA/IHN0ZWVkb3NEYXRhLmxvY2FsZSA6IHZvaWQgMDtcbiAgICAgIGlmIChsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRmxvd1ZlcnNpb24oKTtcbiAgICAgIGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIik7XG4gICAgfVxuICAgIGlmICghaW5zdGFuY2UgfHwgIWZsb3cpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RlcHMgPSBmbG93LnN0ZXBzO1xuICAgIHRyYWNlcyA9IHt9O1xuICAgIGlmICgocmVmMyA9IGluc3RhbmNlLnRyYWNlcykgIT0gbnVsbCkge1xuICAgICAgcmVmMy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICAgIHZhciBhcHByb3ZlcywgcmVmNCwgc3RlcDtcbiAgICAgICAgc3RlcCA9IHN0ZXBzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJfaWRcIiwgdHJhY2Uuc3RlcCk7XG4gICAgICAgIGFwcHJvdmVzID0gW107XG4gICAgICAgIGlmICgocmVmNCA9IHRyYWNlLmFwcHJvdmVzKSAhPSBudWxsKSB7XG4gICAgICAgICAgcmVmNC5mb3JFYWNoKGZ1bmN0aW9uKGFwcHJvdmUpIHtcbiAgICAgICAgICAgIHZhciBqdWRnZV9uYW1lO1xuICAgICAgICAgICAgaWYgKHRyYWNlLmlzX2ZpbmlzaGVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGlmIChhcHByb3ZlLmp1ZGdlID09PSAnYXBwcm92ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBhcHByb3ZlZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWplY3RlZFwiLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHByb3ZlLmp1ZGdlID09PSAndGVybWluYXRlZCcpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gVEFQaTE4bi5fXyhcIkluc3RhbmNlIFN0YXRlIHRlcm1pbmF0ZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJ3JlYXNzaWduZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWFzc2lnbmVkXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcHJvdmUuanVkZ2UgPT09ICdyZWxvY2F0ZWQnKSB7XG4gICAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSByZWxvY2F0ZWRcIiwge30sIGxvY2FsZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwcm92ZS5qdWRnZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBqdWRnZV9uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAganVkZ2VfbmFtZSA9IFRBUGkxOG4uX18oXCJJbnN0YW5jZSBTdGF0ZSBwZW5kaW5nXCIsIHt9LCBsb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVzLnB1c2goe1xuICAgICAgICAgICAgICBfaWQ6IGFwcHJvdmUuX2lkLFxuICAgICAgICAgICAgICBoYW5kbGVyOiBhcHByb3ZlLnVzZXIsXG4gICAgICAgICAgICAgIGhhbmRsZXJfbmFtZTogYXBwcm92ZS5oYW5kbGVyX25hbWUsXG4gICAgICAgICAgICAgIGhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWU6IGFwcHJvdmUuaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZSxcbiAgICAgICAgICAgICAgaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWU6IGFwcHJvdmUuaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUsXG4gICAgICAgICAgICAgIGZpbmlzaF9kYXRlOiBhcHByb3ZlLmZpbmlzaF9kYXRlLFxuICAgICAgICAgICAgICBqdWRnZTogYXBwcm92ZS5qdWRnZSxcbiAgICAgICAgICAgICAganVkZ2VfbmFtZToganVkZ2VfbmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGFwcHJvdmUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGlzX2ZpbmlzaGVkOiBhcHByb3ZlLmlzX2ZpbmlzaGVkLFxuICAgICAgICAgICAgICB0eXBlOiBhcHByb3ZlLnR5cGUsXG4gICAgICAgICAgICAgIG9waW5pb25fZmllbGRzX2NvZGU6IGFwcHJvdmUub3Bpbmlvbl9maWVsZHNfY29kZSxcbiAgICAgICAgICAgICAgc2lnbl9maWVsZF9jb2RlOiBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSxcbiAgICAgICAgICAgICAgaXNfcmVhZDogYXBwcm92ZS5pc19yZWFkLFxuICAgICAgICAgICAgICBzaWduX3Nob3c6IGFwcHJvdmUuc2lnbl9zaG93XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIGlmIChzdGVwLm5hbWUgaW4gdHJhY2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VzW3N0ZXAubmFtZV0gPSB0cmFjZXNbc3RlcC5uYW1lXS5jb25jYXQoYXBwcm92ZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhY2VzW3N0ZXAubmFtZV0gPSBhcHByb3ZlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJhY2VzO1xuICB9LFxuICBkb2NfdmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gV29ya2Zsb3dNYW5hZ2VyX2Zvcm1hdC5nZXRBdXRvZm9ybVNjaGVtYVZhbHVlcygpO1xuICB9LFxuICBpbnN0YW5jZV9ib3hfc3R5bGU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBib3gsIGlucywganVkZ2U7XG4gICAgYm94ID0gU2Vzc2lvbi5nZXQoXCJib3hcIik7XG4gICAgaWYgKGJveCA9PT0gXCJpbmJveFwiIHx8IGJveCA9PT0gXCJkcmFmdFwiKSB7XG4gICAgICBqdWRnZSA9IFNlc3Npb24uZ2V0KFwianVkZ2VcIik7XG4gICAgICBpZiAoanVkZ2UpIHtcbiAgICAgICAgaWYgKGp1ZGdlID09PSBcImFwcHJvdmVkXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJib3gtc3VjY2Vzc1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGp1ZGdlID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICByZXR1cm4gXCJib3gtZGFuZ2VyXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgaWYgKGlucyAmJiBpbnMuZmluYWxfZGVjaXNpb24pIHtcbiAgICAgIGlmIChpbnMuZmluYWxfZGVjaXNpb24gPT09IFwiYXBwcm92ZWRcIikge1xuICAgICAgICByZXR1cm4gXCJib3gtc3VjY2Vzc1wiO1xuICAgICAgfSBlbHNlIGlmIChpbnMuZmluYWxfZGVjaXNpb24gPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICByZXR1cm4gXCJib3gtZGFuZ2VyXCI7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICB0YWJsZV9maWVsZHM6IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGZpZWxkcywgZm9ybV92ZXJzaW9uO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1fdmVyc2lvbiA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtVmVyc2lvbihpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoZm9ybV92ZXJzaW9uKSB7XG4gICAgICBmaWVsZHMgPSBfLmNsb25lKGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuICAgICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQsIGluZGV4KSB7XG4gICAgICAgIHZhciBhZnRlcl9maWVsZCwgYmVmb3JlX2ZpZWxkLCBwcmVfZmllbGRzLCBwcmVfd2lkZV9maWVsZHMsIHRkX2NvbHNwYW4sIHRyX2VuZCwgdHJfc3RhcnQ7XG4gICAgICAgIGZpZWxkLnRyX3N0YXJ0ID0gXCJcIjtcbiAgICAgICAgZmllbGQudHJfZW5kID0gXCJcIjtcbiAgICAgICAgdGRfY29sc3BhbiA9IDE7XG4gICAgICAgIGlmICgodHlwZW9mIENvcmVGb3JtICE9PSBcInVuZGVmaW5lZFwiICYmIENvcmVGb3JtICE9PSBudWxsID8gQ29yZUZvcm0ucGFnZVRpdGxlRmllbGROYW1lIDogdm9pZCAwKSA9PT0gZmllbGQuY29kZSkge1xuICAgICAgICAgIGZpZWxkLmlzX3dpZGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5mb3JtdWxhICYmIGZpZWxkLnR5cGUgIT09ICdvZGF0YScpIHtcbiAgICAgICAgICBmaWVsZC5wZXJtaXNzaW9uID0gXCJyZWFkb25seVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgIGZpZWxkLnRkX2NvbHNwYW4gPSA0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZC50ZF9jb2xzcGFuID0gMztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICBmaWVsZC50cl9zdGFydCA9IFwiPHRyPlwiO1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkLnRyX2VuZCA9IFwiPC90cj5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJlX2ZpZWxkcyA9IGZpZWxkcy5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgICAgcHJlX3dpZGVfZmllbGRzID0gcHJlX2ZpZWxkcy5maWx0ZXJQcm9wZXJ0eShcImlzX3dpZGVcIiwgdHJ1ZSk7XG4gICAgICAgICAgdHJfc3RhcnQgPSBcIlwiO1xuICAgICAgICAgIHRyX2VuZCA9IFwiXCI7XG4gICAgICAgICAgYmVmb3JlX2ZpZWxkID0gbnVsbDtcbiAgICAgICAgICBhZnRlcl9maWVsZCA9IG51bGw7XG4gICAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgYmVmb3JlX2ZpZWxkID0gZmllbGRzW2luZGV4IC0gMV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCA8IGZpZWxkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBhZnRlcl9maWVsZCA9IGZpZWxkc1tpbmRleCArIDFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgIHRkX2NvbHNwYW4gPSA0O1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVfZmllbGQgJiYgYWZ0ZXJfZmllbGQgJiYgYmVmb3JlX2ZpZWxkLmlzX3dpZGUgJiYgYWZ0ZXJfZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgICBmaWVsZC5pc193aWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyID09PSAwICYmIGFmdGVyX2ZpZWxkICYmIGFmdGVyX2ZpZWxkLmlzX3dpZGUpIHtcbiAgICAgICAgICAgICAgZmllbGQuaXNfd2lkZSA9IHRydWU7XG4gICAgICAgICAgICAgIHRkX2NvbHNwYW4gPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PT0gMCAmJiBhZnRlcl9maWVsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBmaWVsZC5pc193aWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGRfY29sc3BhbiA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLnRkX2NvbHNwYW4gPSB0ZF9jb2xzcGFuO1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdHJfc3RhcnQgPSBcIjx0cj5cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChwcmVfZmllbGRzLmxlbmd0aCArIHByZV93aWRlX2ZpZWxkcy5sZW5ndGgpICUgMiA9PT0gMCB8fCBmaWVsZC5pc193aWRlKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICAgICAgdHJfc3RhcnQgPSBcIjx0ciBjbGFzcyA9IFxcXCJ0ci1jaGlsZC10YWJsZVxcXCI+XCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJfc3RhcnQgPSBcIjx0cj5cIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZC50cl9zdGFydCA9IHRyX3N0YXJ0O1xuICAgICAgICAgIGlmIChpbmRleCArIDEgPT09IGZpZWxkcy5sZW5ndGggfHwgZmllbGQudHlwZSA9PT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT09ICd0YWJsZScgfHwgZmllbGQuaXNfd2lkZSkge1xuICAgICAgICAgICAgdHJfZW5kID0gXCI8L3RyPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKHByZV9maWVsZHMubGVuZ3RoICsgcHJlX3dpZGVfZmllbGRzLmxlbmd0aCkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICB0cl9lbmQgPSBcIjwvdHI+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWVsZC50cl9lbmQgPSB0cl9lbmQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gIH0sXG4gIHNvcnRfYXBwcm92ZTogZnVuY3Rpb24oYXBwcm92ZXMsIG9yZGVyKSB7XG4gICAgaWYgKCFhcHByb3Zlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoIWFwcHJvdmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgICAgYXBwcm92ZXMuc29ydChmdW5jdGlvbihwMSwgcDIpIHtcbiAgICAgICAgICB2YXIgX3AxLCBfcDI7XG4gICAgICAgICAgX3AxID0gMDtcbiAgICAgICAgICBfcDIgPSAwO1xuICAgICAgICAgIGlmIChwMS5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgX3AxID0gcDEuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocDIuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIF9wMiA9IHAyLmZpbmlzaF9kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9wMiAtIF9wMTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHByb3Zlcy5zb3J0KGZ1bmN0aW9uKHAxLCBwMikge1xuICAgICAgICAgIHZhciBfcDEsIF9wMjtcbiAgICAgICAgICBfcDEgPSAwO1xuICAgICAgICAgIF9wMiA9IDA7XG4gICAgICAgICAgaWYgKHAxLmZpbmlzaF9kYXRlKSB7XG4gICAgICAgICAgICBfcDEgPSBwMS5maW5pc2hfZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwMi5maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgX3AyID0gcDIuZmluaXNoX2RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3AxIC0gX3AyO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVzO1xuICB9LFxuICBfdDogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5KTtcbiAgfSxcbiAgZ2V0RmllbGQ6IGZ1bmN0aW9uKGNvZGUpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb247XG4gICAgaWYgKGZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZvcm1fdmVyc2lvbi5maWVsZHMuZmluZFByb3BlcnR5QnlQSyhcImNvZGVcIiwgY29kZSk7XG4gICAgfVxuICB9LFxuICBnZXRWYWx1ZTogZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciBmb3JtX3ZlcnNpb24sIGluc3RhbmNlLCBsb2NhbGUsIHV0Y09mZnNldCwgdmFsdWVzO1xuICAgIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuICAgIGZvcm1fdmVyc2lvbiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5mb3JtX3ZlcnNpb247XG4gICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICB1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0O1xuICAgIHZhbHVlcyA9IGluc3RhbmNlLnZhbHVlcyB8fCB7fTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICB2YWx1ZXMgPSBXb3JrZmxvd01hbmFnZXJfZm9ybWF0LmdldEF1dG9mb3JtU2NoZW1hVmFsdWVzKCk7XG4gICAgfVxuICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0VmFsdWUodmFsdWVzW2NvZGVdLCBmb3JtX3ZlcnNpb24uZmllbGRzLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIGNvZGUpLCBsb2NhbGUsIHV0Y09mZnNldCk7XG4gIH0sXG4gIGdldExhYmVsOiBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuZm9ybV92ZXJzaW9uO1xuICAgIHJldHVybiBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0TGFiZWwoZm9ybV92ZXJzaW9uLmZpZWxkcywgY29kZSk7XG4gIH0sXG4gIGlzVGV4dGFyZWE6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgaWYgKChmaWVsZCAhPSBudWxsID8gZmllbGQudHlwZSA6IHZvaWQgMCkgPT09IFwiaW5wdXRcIiAmJiAoZmllbGQgIT0gbnVsbCA/IGZpZWxkLmlzX3RleHRhcmVhIDogdm9pZCAwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxuICBnZXRDZkNsYXNzOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIGlmICgoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnR5cGUgOiB2b2lkIDApID09PSBcImlucHV0XCIgJiYgKGZpZWxkICE9IG51bGwgPyBmaWVsZC5pc190ZXh0YXJlYSA6IHZvaWQgMCkpIHtcbiAgICAgIHJldHVybiBcImNmVGV4dGFyZWFcIjtcbiAgICB9XG4gIH0sXG4gIGdldFRhYmxlVGhlYWQ6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgcmV0dXJuIFN0ZWVkb3NUYWJsZS5nZXRUaGVhZChmaWVsZCwgZmFsc2UpO1xuICB9LFxuICBnZXRUYWJsZUJvZHk6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIGluc3RhbmNlLCB0YWJsZVZhbHVlLCB2YWx1ZXM7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG4gICAgICB2YWx1ZXMgPSBpbnN0YW5jZS52YWx1ZXMgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlcyA9IFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWFWYWx1ZXMoKTtcbiAgICB9XG4gICAgdGFibGVWYWx1ZSA9IHZhbHVlc1tmaWVsZC5jb2RlXTtcbiAgICByZXR1cm4gU3RlZWRvc1RhYmxlLmdldFRib2R5KGZpZWxkLnNmaWVsZHMuZ2V0UHJvcGVydHkoXCJjb2RlXCIpLCBmaWVsZCwgdGFibGVWYWx1ZSwgZmFsc2UpO1xuICB9LFxuICBzaG93TGFiZWw6IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIHRlbXBsYXRlRGF0YTtcbiAgICB0ZW1wbGF0ZURhdGEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGE7XG4gICAgaWYgKHRlbXBsYXRlRGF0YS5sYWJlbCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGlzT3BpbmlvbkZpZWxkOiBmdW5jdGlvbihmaWVsZCkge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkLmZvcm11bGEpO1xuICB9LFxuICBpc09waW5pb25GaWVsZF9mcm9tX3N0cmluZzogZnVuY3Rpb24oZmllbGRfZm9ybXVsYSkge1xuICAgIHJldHVybiBJbnN0YW5jZVNpZ25UZXh0LmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICB9LFxuICBpbmNsdWRlc09waW5pb25GaWVsZDogZnVuY3Rpb24oZm9ybSwgZm9ybV92ZXJzaW9uKSB7XG4gICAgdmFyIGZpZWxkX2Zvcm11bGFzLCBmaWVsZHMsIHJlZjtcbiAgICBmaWVsZF9mb3JtdWxhcyA9IG5ldyBBcnJheSgpO1xuICAgIGZpZWxkcyA9ICgocmVmID0gZGIuZm9ybV92ZXJzaW9ucy5maW5kT25lKHtcbiAgICAgIF9pZDogZm9ybV92ZXJzaW9uLFxuICAgICAgZm9ybTogZm9ybVxuICAgIH0pKSAhPSBudWxsID8gcmVmLmZpZWxkcyA6IHZvaWQgMCkgfHwgW107XG4gICAgZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZikge1xuICAgICAgdmFyIHJlZjE7XG4gICAgICBpZiAoZi50eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZygnaWdub3JlIG9waW5pb24gZmllbGQgaW4gdGFibGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoZi50eXBlID09PSAnc2VjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGYgIT0gbnVsbCA/IChyZWYxID0gZi5maWVsZHMpICE9IG51bGwgPyByZWYxLmZvckVhY2goZnVuY3Rpb24oZjEpIHtcbiAgICAgICAgICByZXR1cm4gZmllbGRfZm9ybXVsYXMucHVzaChmMS5mb3JtdWxhKTtcbiAgICAgICAgfSkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmllbGRfZm9ybXVsYXMucHVzaChmLmZvcm11bGEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfLnNvbWUoZmllbGRfZm9ybXVsYXMsIGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEpIHtcbiAgICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmlzT3BpbmlvbkZpZWxkX2Zyb21fc3RyaW5nKGZpZWxkX2Zvcm11bGEpO1xuICAgIH0pO1xuICB9LFxuICBnZXRPcGluaW9uRmllbGRTdGVwc05hbWU6IGZ1bmN0aW9uKGZpZWxkX2Zvcm11bGEsIHRvcF9rZXl3b3Jkcykge1xuICAgIHZhciBmb28xLCBvcGluaW9uRmllbGRzO1xuICAgIG9waW5pb25GaWVsZHMgPSBuZXcgQXJyYXkoKTtcbiAgICBpZiAoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc09waW5pb25GaWVsZF9mcm9tX3N0cmluZyhmaWVsZF9mb3JtdWxhKSkge1xuICAgICAgaWYgKGZpZWxkX2Zvcm11bGEpIHtcbiAgICAgICAgZm9vMSA9IGZpZWxkX2Zvcm11bGEuc3BsaXQoXCI7XCIpO1xuICAgICAgICBmb28xLmZvckVhY2goZnVuY3Rpb24oZm9vKSB7XG4gICAgICAgICAgdmFyIGpzb25fZm9ybXVsYSwgcmVmLCByZWYxLCBzMSwgc2Y7XG4gICAgICAgICAganNvbl9mb3JtdWxhID0ge307XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGpzb25fZm9ybXVsYSA9IGV2YWwoXCIoXCIgKyBmb28gKyBcIilcIik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgICBqc29uX2Zvcm11bGEgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGpzb25fZm9ybXVsYSAhPSBudWxsID8ganNvbl9mb3JtdWxhLnlpamlhbmxhbiA6IHZvaWQgMCkge1xuICAgICAgICAgICAgc2YgPSB7fTtcbiAgICAgICAgICAgIHNmLnN0ZXBOYW1lID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi5zdGVwO1xuICAgICAgICAgICAgc2YuaW1hZ2Vfc2lnbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4uaW1hZ2Vfc2lnbiB8fCBmYWxzZTtcbiAgICAgICAgICAgIHNmLm9ubHlfY2Nfb3BpbmlvbiA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9jYyB8fCBmYWxzZTtcbiAgICAgICAgICAgIHNmLmRlZmF1bHRfZGVzY3JpcHRpb24gPSBqc29uX2Zvcm11bGEueWlqaWFubGFuW1wiZGVmYXVsdFwiXTtcbiAgICAgICAgICAgIHNmLm9ubHlfaGFuZGxlciA9IGpzb25fZm9ybXVsYS55aWppYW5sYW4ub25seV9oYW5kbGVyO1xuICAgICAgICAgICAgc2YudG9wX2tleXdvcmRzID0ganNvbl9mb3JtdWxhLnlpamlhbmxhbi50b3Bfa2V5d29yZHMgfHwgdG9wX2tleXdvcmRzO1xuICAgICAgICAgICAgcmV0dXJuIG9waW5pb25GaWVsZHMucHVzaChzZik7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmllbGRfZm9ybXVsYSAhPSBudWxsID8gZmllbGRfZm9ybXVsYS5pbmRleE9mKFwie3RyYWNlcy5cIikgOiB2b2lkIDApID4gLTEgfHwgKGZpZWxkX2Zvcm11bGEgIT0gbnVsbCA/IGZpZWxkX2Zvcm11bGEuaW5kZXhPZihcIntzaWduYXR1cmUudHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSkge1xuICAgICAgICAgICAgc2YgPSB7XG4gICAgICAgICAgICAgIG9ubHlfY2Nfb3BpbmlvbjogZmFsc2UsXG4gICAgICAgICAgICAgIGltYWdlX3NpZ246IGZhbHNlLFxuICAgICAgICAgICAgICB0b3Bfa2V5d29yZHM6IHRvcF9rZXl3b3Jkc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChmb28uaW5kZXhPZihcIntzaWduYXR1cmUuXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc2YuaW1hZ2Vfc2lnbiA9IHRydWU7XG4gICAgICAgICAgICAgIGZvbyA9IGZvby5yZXBsYWNlKFwie3NpZ25hdHVyZS5cIiwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzMSA9IGZvby5yZXBsYWNlKFwie1wiLCBcIlwiKS5yZXBsYWNlKFwifVwiLCBcIlwiKTtcbiAgICAgICAgICAgIGlmIChzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBzZi5zdGVwTmFtZSA9IHMxLnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgICAgICAgaWYgKG9waW5pb25GaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJzdGVwTmFtZVwiLCBzZi5zdGVwTmFtZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICgocmVmID0gb3BpbmlvbkZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwic3RlcE5hbWVcIiwgc2Yuc3RlcE5hbWUpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICByZWYub25seV9jY19vcGluaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHMxLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKChyZWYxID0gczEuc3BsaXQoXCIuXCIpWzJdKSAhPSBudWxsID8gcmVmMS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogdm9pZCAwKSA9PT0gJ2NjJykge1xuICAgICAgICAgICAgICAgICAgICBzZi5vbmx5X2NjX29waW5pb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9waW5pb25GaWVsZHMucHVzaChzZik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9waW5pb25GaWVsZHM7XG4gIH0sXG4gIHNob3dDQ09waW5pb246IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIHJlZiwgcmVmMSwgcmVmMiwgczE7XG4gICAgaWYgKCgocmVmID0gZmllbGQuZm9ybXVsYSkgIT0gbnVsbCA/IHJlZi5pbmRleE9mKFwie3RyYWNlcy5cIikgOiB2b2lkIDApID4gLTEgfHwgKChyZWYxID0gZmllbGQuZm9ybXVsYSkgIT0gbnVsbCA/IHJlZjEuaW5kZXhPZihcIntzaWduYXR1cmUudHJhY2VzLlwiKSA6IHZvaWQgMCkgPiAtMSkge1xuICAgICAgczEgPSBmaWVsZC5mb3JtdWxhLnJlcGxhY2UoXCJ7c2lnbmF0dXJlLlwiLCBcIlwiKS5yZXBsYWNlKFwie1wiLCBcIlwiKS5yZXBsYWNlKFwifVwiLCBcIlwiKTtcbiAgICAgIGlmIChzMS5zcGxpdChcIi5cIikubGVuZ3RoID4gMikge1xuICAgICAgICBpZiAoKChyZWYyID0gczEuc3BsaXQoXCIuXCIpWzJdKSAhPSBudWxsID8gcmVmMi50b0xvY2FsZUxvd2VyQ2FzZSgpIDogdm9pZCAwKSA9PT0gJ2NjJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgbWFya0Rvd25Ub0h0bWw6IGZ1bmN0aW9uKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgaWYgKG1hcmtEb3duU3RyaW5nKSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKTtcbiAgICB9XG4gIH0sXG4gIGZfbGFiZWw6IGZ1bmN0aW9uKHRoYXQpIHtcbiAgICByZXR1cm4gdGhhdC5uYW1lIHx8IHRoYXQuY29kZTtcbiAgfVxufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnN0ZWVkb3NfZm9ybSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1fdmVyc2lvbjtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pc1NlY3Rpb24gPSBmdW5jdGlvbihjb2RlKSB7XG4gICAgdmFyIGZvcm1fdmVyc2lvbjtcbiAgICBmb3JtX3ZlcnNpb24gPSB0aGlzLmZvcm1fdmVyc2lvbjtcbiAgICByZXR1cm4gZm9ybV92ZXJzaW9uLmZpZWxkcy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCBjb2RlKS50eXBlID09PSAnc2VjdGlvbic7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZG9jX3ZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnN0YW5jZTtcbiAgICBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2U7XG4gICAgcmV0dXJuIGluc3RhbmNlLnZhbHVlcztcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5hcHBsaWNhbnRDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhdGEsIGluc3RhbmNlO1xuICAgIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZTtcbiAgICByZXR1cm4gZGF0YSA9IHtcbiAgICAgIG5hbWU6ICdpbnNfYXBwbGljYW50JyxcbiAgICAgIGF0dHM6IHtcbiAgICAgICAgbmFtZTogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBpZDogJ2luc19hcHBsaWNhbnQnLFxuICAgICAgICBcImNsYXNzXCI6ICdzZWxlY3RVc2VyIGZvcm0tY29udHJvbCBpbnNfYXBwbGljYW50J1xuICAgICAgfSxcbiAgICAgIHZhbHVlOiBpbnN0YW5jZS5hcHBsaWNhbnRfbmFtZVxuICAgIH07XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfTtcbiAgSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5maWVsZHMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uO1xuICAgIGZvcm1fdmVyc2lvbiA9IHRoaXMuZm9ybV92ZXJzaW9uO1xuICAgIGlmIChmb3JtX3ZlcnNpb24pIHtcbiAgICAgIHJldHVybiBuZXcgU2ltcGxlU2NoZW1hKFdvcmtmbG93TWFuYWdlcl9mb3JtYXQuZ2V0QXV0b2Zvcm1TY2hlbWEoZm9ybV92ZXJzaW9uKSk7XG4gICAgfVxuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmZvcm1fdHlwZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICB9O1xuICBUZW1wbGF0ZS5yZWdpc3RlckhlbHBlcihcImFmRmllbGRMYWJlbFRleHRcIiwgZnVuY3Rpb24ob3ApIHtcbiAgICB2YXIgZm9ybV92ZXJzaW9uLCByZWY7XG4gICAgZm9ybV92ZXJzaW9uID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmZvcm1fdmVyc2lvbjtcbiAgICByZXR1cm4gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldExhYmVsKGZvcm1fdmVyc2lvbi5maWVsZHMsIG9wICE9IG51bGwgPyAocmVmID0gb3AuaGFzaCkgIT0gbnVsbCA/IHJlZi5uYW1lIDogdm9pZCAwIDogdm9pZCAwKTtcbiAgfSk7XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuX3QgPSBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgbG9jYWxlO1xuICAgIGxvY2FsZSA9IHRoaXMubG9jYWxlO1xuICAgIHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSk7XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zX2F0dGFjaF9kb3dubG9hZF91cmwgPSBmdW5jdGlvbihfaWQsIGFic29sdXRlKSB7XG4gICAgaWYgKGFic29sdXRlKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKFwiL2FwaS9maWxlcy9pbnN0YW5jZXMvXCIgKyBfaWQgKyBcIj9kb3dubG9hZD10cnVlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCIvYXBpL2ZpbGVzL2luc3RhbmNlcy9cIiArIF9pZCArIFwiP2Rvd25sb2FkPXRydWVcIjtcbiAgICB9XG4gIH07XG4gIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMub3B0aW9ucyA9IGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgdmFyIG9wdGlvbnMsIHJlZiwgcmV2O1xuICAgIG9wdGlvbnMgPSBmaWVsZCAhPSBudWxsID8gKHJlZiA9IGZpZWxkLm9wdGlvbnMpICE9IG51bGwgPyByZWYuc3BsaXQoXCJcXG5cIikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgcmV2ID0gW107XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHJldi5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogaXRlbSxcbiAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV2O1xuICB9O1xuICBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmdldFBlcm1pc3Npb25zID0gZnVuY3Rpb24oY29kZSkge1xuICAgIHZhciByZWY7XG4gICAgaWYgKCEoKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5zdGFydFN0ZXBFZGl0YWJsZUZpZWxkcykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhjb2RlKSA6IHZvaWQgMCkpIHtcbiAgICAgIHJldHVybiBcInJlYWRvbmx5IGRpc2FibGVkXCI7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9O1xufVxuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5ldmVudHMgPSB7XG4gICdjaGFuZ2UgLmZvcm0tY29udHJvbCwuY2hlY2tib3ggaW5wdXQsLmFmLXJhZGlvLWdyb3VwIGlucHV0LC5hZi1jaGVja2JveC1ncm91cCBpbnB1dCc6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgcmV0dXJuIEluc3RhbmNlTWFuYWdlci5pbnN0YW5jZWZvcm1DaGFuZ2VFdmVudChldmVudCk7XG4gIH0sXG4gICd0eXBlYWhlYWQ6Y2hhbmdlIC5mb3JtLWNvbnRyb2wnOiBmdW5jdGlvbihldmVudCkge1xuICAgIHJldHVybiBJbnN0YW5jZU1hbmFnZXIuaW5zdGFuY2Vmb3JtQ2hhbmdlRXZlbnQoZXZlbnQpO1xuICB9LFxuICAnY2xpY2sgLmNmVGV4dGFyZWEgYSc6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gU3RlZWRvcy5vcGVuV2luZG93KGV2ZW50LnRhcmdldC5ocmVmKTtcbiAgfVxufTtcblxuSW5zdGFuY2Vmb3JtVGVtcGxhdGUub25DcmVhdGVkID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjb21waWxlZCwgZSwgaW5zdGFuY2UsIGluc3RhbmNlQ3VzdG9tVGVtcGxhdGUsIGluc3RhbmNlVmlldywgcmVuZGVyRnVuY3Rpb24sIHRlbXBsYXRlO1xuICBpbnN0YW5jZSA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldFRlbXBsYXRlKGluc3RhbmNlKTtcbiAgdHJ5IHtcbiAgICBjb21waWxlZCA9IFNwYWNlYmFyc0NvbXBpbGVyLmNvbXBpbGUodGVtcGxhdGUsIHtcbiAgICAgIGlzQm9keTogdHJ1ZVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICBlID0gZXJyb3IxO1xuICAgIGNvbnNvbGUubG9nKFwiSW5zdGFuY2UgVGVtcGxhdGUgRXJyb3JcIiwgZSk7XG4gICAgY29tcGlsZWQgPSBTcGFjZWJhcnNDb21waWxlci5jb21waWxlKFwiXCIsIHtcbiAgICAgIGlzQm9keTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlckZ1bmN0aW9uID0gZXZhbChjb21waWxlZCk7XG4gIGluc3RhbmNlVmlldyA9IG5ldyBCbGF6ZS5WaWV3KFwiY3VzdG9tX2luc3RhbmNlX3RlbXBsYXRlXCIsIHJlbmRlckZ1bmN0aW9uKTtcbiAgaW5zdGFuY2VDdXN0b21UZW1wbGF0ZSA9IG5ldyBCbGF6ZS5UZW1wbGF0ZShpbnN0YW5jZVZpZXcubmFtZSwgcmVuZGVyRnVuY3Rpb24pO1xuICBUZW1wbGF0ZS5pbnN0YW5jZV9jdXN0b21fdGVtcGxhdGUgPSBpbnN0YW5jZUN1c3RvbVRlbXBsYXRlO1xuICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2VfY3VzdG9tX3RlbXBsYXRlLmhlbHBlcnMoSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycyk7XG59O1xuXG5JbnN0YW5jZWZvcm1UZW1wbGF0ZS5vblJlbmRlcmVkID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjdXJyZW50QXBwcm92ZSwgY3VycmVudFN0ZXAsIGZvcm1fdmVyc2lvbiwgZm9ybXVsYV9maWVsZHMsIGluc2VydERvYywgaW5zdGFuY2UsIGluc3RhbmNlTnVtYmVyRmllbGRzLCBqdWRnZTtcbiAgaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBJbnN0YW5jZU1hbmFnZXIuc2V0SW5zdGFuY2VGb3JtQXBwbGljYW50KGluc3RhbmNlLmFwcGxpY2FudCwgaW5zdGFuY2UuYXBwbGljYW50X25hbWUpO1xuICBBcHByb3ZlTWFuYWdlci5lcnJvciA9IHtcbiAgICBuZXh0U3RlcHM6ICcnLFxuICAgIG5leHRTdGVwVXNlcnM6ICcnXG4gIH07XG4gIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2RyYWZ0Jykge1xuICAgIEluc3RhbmNlRXZlbnQuaW5pdEV2ZW50cyhpbnN0YW5jZS5mbG93KTtcbiAgfVxuICBpZiAoIUFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKSkge1xuICAgIGN1cnJlbnRBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKCk7XG4gICAgaW5zdGFuY2VOdW1iZXJGaWVsZHMgPSAkKFwiW2RhdGEtZm9ybXVsYV1cIiwgJChcIiNpbnN0YW5jZWZvcm1cIikpO1xuICAgIGluc3RhbmNlTnVtYmVyRmllbGRzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZWxlbWVudCwgc2NoZW1hS2V5O1xuICAgICAgc2NoZW1hS2V5ID0gdGhpcy5kYXRhc2V0LnNjaGVtYUtleTtcbiAgICAgIGVsZW1lbnQgPSAkKHRoaXMpO1xuICAgICAgaWYgKCEkKHRoaXMpLnZhbCgpICYmIHNjaGVtYUtleSAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlSWRcIikpIHtcbiAgICAgICAgcmV0dXJuIE1ldGVvci5jYWxsKCdnZXRJbnN0YW5jZVZhbHVlcycsIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VJZFwiKSwgZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICAgIHZhciBrZXksIHJlZjtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRvYXN0ci5lcnJvcihlcnJvci5yZWFzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJlc3VsdFtzY2hlbWFLZXldKSB7XG4gICAgICAgICAgICBrZXkgPSAocmVmID0gZWxlbWVudC5kYXRhKFwiZm9ybXVsYVwiKSkgIT0gbnVsbCA/IHJlZi5yZXBsYWNlKFwiYXV0b19udW1iZXIoXCIsIFwiXCIpLnJlcGxhY2UoXCIpXCIsIFwiXCIpIDogdm9pZCAwO1xuICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xcXCIvZywgXCJcIikucmVwbGFjZSgvXFwnL2csIFwiXCIpO1xuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKFwie1wiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKFwie1wiLCBcIlwiKS5yZXBsYWNlKFwifVwiLCBcIlwiKTtcbiAgICAgICAgICAgICAga2V5ID0ga2V5LnRyaW0oKTtcbiAgICAgICAgICAgICAga2V5ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShrZXksICdpbnN0YW5jZWZvcm0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBJbnN0YW5jZU51bWJlclJ1bGVzLmluc3RhbmNlTnVtYmVyQnVpbGRlcihlbGVtZW50LCBrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC52YWwocmVzdWx0W3NjaGVtYUtleV0pLnRyaWdnZXIoXCJjaGFuZ2VcIikgOiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBqdWRnZSA9IGN1cnJlbnRBcHByb3ZlLmp1ZGdlO1xuICAgIGN1cnJlbnRTdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgZm9ybV92ZXJzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKTtcbiAgICBpZiAoIWZvcm1fdmVyc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWZvcm1fdmVyc2lvbi5maWVsZHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9ybXVsYV9maWVsZHMgPSBGb3JtX2Zvcm11bGEuZ2V0Rm9ybXVsYUZpZWxkVmFyaWFibGUoXCJGb3JtX2Zvcm11bGEuZmllbGRfdmFsdWVzXCIsIGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuICAgIGluc2VydERvYyA9IEF1dG9Gb3JtLmdldEZvcm1WYWx1ZXMoXCJpbnN0YW5jZWZvcm1cIiwgdm9pZCAwLCB2b2lkIDAsIGZhbHNlKTtcbiAgICBGb3JtX2Zvcm11bGEucnVuKFwiXCIsIFwiXCIsIGZvcm11bGFfZmllbGRzLCBpbnNlcnREb2MsIGZvcm1fdmVyc2lvbi5maWVsZHMpO1xuICAgIHJldHVybiBTZXNzaW9uLnNldChcImluc3RhbmNlX2Zvcm1fdmFsdWVzXCIsIHtcbiAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLl9pZCxcbiAgICAgIHZhbHVlczogaW5zZXJ0RG9jXG4gICAgfSk7XG4gIH1cbn07XG4iLCJJbnN0YW5jZUF0dGFjaG1lbnRUZW1wbGF0ZS5oZWxwZXJzID0ge1xuXG5cdHNob3dNYWluVGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLndvcmtmbG93TWFpbkF0dGFjaFRpdGxlLmdldCgpO1xuXHR9LFxuXHRpc0NsaWVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIE1ldGVvci5pc0NsaWVudFxuXHR9LFxuXHRlbmFibGVkX2FkZF9tYWluX2F0dGFjaG1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24gJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gXCJkcmFmdFwiICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9IFwiaW5ib3hcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fVxuXG5cdFx0Ly8g5bey57uP57uT5p2f55qE5Y2V5a2Q5LiN6IO95pS56ZmE5Lu2XG5cdFx0aWYgKGlucy5zdGF0ZSA9PSBcImNvbXBsZXRlZFwiKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHR9XG5cblx0XHR2YXIgY3VycmVudF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cblx0XHRpZiAoIWN1cnJlbnRfc3RlcClcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdC8vIGNj55qE5Y2V5a2Q77yM5Y+q5pyJ5Zyo5b2T5YmN5q2l6aqk5omN6IO95L+u5pS56ZmE5Lu2XG5cdFx0dmFyIGFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcblx0XHRpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT0gXCJjY1wiKSB7XG5cdFx0XHR2YXIgY3VycmVudFRyYWNlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRUcmFjZSgpO1xuXHRcdFx0aWYoY3VycmVudFRyYWNlICYmIGN1cnJlbnRUcmFjZS5faWQgIT0gYXBwcm92ZS50cmFjZSl7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyDliIblj5HnmoTmraPmlofmiJbogIXpmYTku7bkuI3mmL7npLrovazkuLpwZGbmjInpkq5cblx0XHQvLyDlpoLmnpzmnInmraPmlofmnYPpmZDliJnkuLrmraPmlofvvIzlkKbliJnliIblj5HkuLrpmYTku7Zcblx0XHQvLyDliIblj5HnmoTpmYTku7bkuI3lhYHorrjkv67mlLkg5Yig6ZmkIOaWsOWinueJiOacrFxuXHRcdHZhciBtYWluX2F0dGFjaF9jb3VudCA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnMuX2lkLFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0fSkuY291bnQoKTtcblxuXHRcdHZhciBkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50ID0gMDtcblxuXHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlKSB7XG5cdFx0XHR2YXIgc3RhcnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRTdGFydFN0ZXAoKTtcblx0XHRcdGlmIChzdGFydF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoKSB7XG5cdFx0XHRcdHZhciBkaXN0cmlidXRlX21haW5fYXR0YWNoX2NvdW50ID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlLFxuXHRcdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWVcblx0XHRcdFx0fSkuY291bnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY3VycmVudF9zdGVwLmNhbl9lZGl0X21haW5fYXR0YWNoID09IHRydWUgJiYgbWFpbl9hdHRhY2hfY291bnQgPCAxICYmIGRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQgPCAxKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH1cblxuXHRcdC8vIOato+aWh+acgOWkmuWPquiDveacieS4gOS4qlxuXHRcdGlmIChtYWluX2F0dGFjaF9jb3VudCA+PSAxIHx8IGRpc3RyaWJ1dGVfbWFpbl9hdHRhY2hfY291bnQgPj0gMSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIOW8gOWni+iKgueCueW5tuS4lOiuvue9ruS6huWPr+S7peS4iuS8oOato+aWh+aJjeaYvuekuuS4iuS8oOato+aWh+eahOaMiemSrlxuXHRcdHZhciBjdXJyZW50X3N0ZXAgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFN0ZXAoKTtcblx0XHRpZiAoY3VycmVudF9zdGVwICYmIGN1cnJlbnRfc3RlcC5zdGVwX3R5cGUgPT0gXCJzdGFydFwiICYmIGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCA9PSB0cnVlKVxuXHRcdFx0cmV0dXJuIHRydWVcblxuXHRcdHJldHVybiBmYWxzZVxuXHR9LFxuXG5cdGVuYWJsZWRfZWRpdF9ub3JtYWxfYXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRpZiAoU2Vzc2lvbiAmJiBTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdHZhciBmbG93ID0gV29ya2Zsb3dNYW5hZ2VyLmdldEZsb3coaW5zLmZsb3cpO1xuXHRcdGlmICghZmxvdylcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cblx0XHQvLyDliIblj5HlkI7nmoQg6ZmE5Lu277yM5LiN5Y+v5Lul57yW6L6RL+WIoOmZpO+8jOS5n+S4jeiuqeS4iuS8oOaWsOeahOmZhOS7tiwg5rWB56iL5YiX6KGo77ya5re75Yqg5bGe5oCnIOKAmOiiq+WIhuWPkeWQjuaYr+WQpuWFgeiuuOS4iuS8oOmZhOS7tuKAmSAjMTgzN1xuXHRcdGlmIChpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlICYmICFmbG93LnVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZClcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpICE9IFwiZHJhZnRcIiAmJiBTZXNzaW9uLmdldChcImJveFwiKSAhPSBcImluYm94XCIpIHtcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdH1cblxuXHRcdC8vIOW3sue7j+e7k+adn+eahOWNleWtkOS4jeiDveaUuemZhOS7tlxuXHRcdGlmIChpbnMuc3RhdGUgPT0gXCJjb21wbGV0ZWRcIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fVxuXG5cdFx0Ly8gY2PnmoTljZXlrZDvvIzlj6rmnInlnKjlvZPliY3mraXpqqTmiY3og73kv67mlLnpmYTku7Zcblx0XHR2YXIgYXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuXHRcdGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PSBcImNjXCIpIHtcblx0XHRcdHZhciBjdXJyZW50VHJhY2UgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudFRyYWNlKCk7XG5cdFx0XHRpZihjdXJyZW50VHJhY2UgJiYgY3VycmVudFRyYWNlLl9pZCAhPSBhcHByb3ZlLnRyYWNlKXtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChJbnN0YW5jZU1hbmFnZXIuaXNDQyhpbnMpKSB7XG5cdFx0XHR2YXIgc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDQ1N0ZXAoKTtcblx0XHRcdGlmIChzdGVwICYmIChzdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdHJ1ZSB8fCBzdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdW5kZWZpbmVkKSlcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuXHRcdFx0aWYgKGN1cnJlbnRfc3RlcCAmJiAoY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdHJ1ZSB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB1bmRlZmluZWQpKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZVxuXHR9LFxuXG5cdG1haW5fYXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHR2YXIgc3RhcnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRTdGFydFN0ZXAoKTtcblxuXHRcdC8vIOWmguaenOaYr+iiq+WIhuWPkeeahOeUs+ivt+WNleW5tuS4lOacieS/ruaUueato+aWh+eahOadg+mZkO+8jOWImeS8mOWFiOaYvuekuuWOn+eUs+ivt+WNleaWh+S7tlxuXHRcdHZhciBtYWluX2F0dGFjaCA9IG51bGw7XG5cdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UgJiYgc3RhcnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCA9PSB0cnVlKSB7XG5cdFx0XHRtYWluX2F0dGFjaCA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZSh7XG5cdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UsXG5cdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoIW1haW5fYXR0YWNoKSB7XG5cdFx0XHRtYWluX2F0dGFjaCA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZSh7XG5cdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGlucy5faWQsXG5cdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0J21ldGFkYXRhLm1haW4nOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFpbl9hdHRhY2g7XG5cdH0sXG5cblx0bm9ybWFsX2F0dGFjaG1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0aWYgKCFpbnMpXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdHZhciBzZWxlY3RvciA9IHtcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzoge1xuXHRcdFx0XHQkbmU6IHRydWVcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHZhciBhdHRzID0gbmV3IEFycmF5KCk7XG5cblx0XHRpZiAoaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSkge1xuXHRcdFx0Ly8g5aaC5p6c5piv6KKr5YiG5Y+R55qE55Sz6K+35Y2V77yM5YiZ5pi+56S65Y6f55Sz6K+35Y2V5paH5Lu2LCDlpoLmnpzpgInmi6nkuoblsIbljp/ooajljZXlrZjlgqjkuLrpmYTku7bkuZ/opoHmmL7npLosIOWQjOaXtuS5n+imgeaYvuekuuaWsOS4iuS8oOeahOmZhOS7tlxuXHRcdFx0dmFyIGRmaXMgPSBfLmNsb25lKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcblx0XHRcdGRmaXMucHVzaChpbnMuX2lkKTtcblx0XHRcdHNlbGVjdG9yWydtZXRhZGF0YS5pbnN0YW5jZSddID0ge1xuXHRcdFx0XHQkaW46IGRmaXNcblx0XHRcdH07XG5cblxuXHRcdFx0c2VsZWN0b3JbXCIkb3JcIl0gPSBbe1xuXHRcdFx0XHRcIm1ldGFkYXRhLmluc3RhbmNlXCI6IGlucy5faWRcblx0XHRcdH0sIHtcblx0XHRcdFx0XCJtZXRhZGF0YS5pbnN0YW5jZVwiOiB7XG5cdFx0XHRcdFx0JGluOiBpbnMuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlc1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcIm1ldGFkYXRhLmlzX3ByaXZhdGVcIjoge1xuXHRcdFx0XHRcdCRuZTogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9XVxuXG5cdFx0XHQvLyDlpoLmnpzljp/nlLPor7fljZXmnInmraPmlofkvYbmmK/liIblj5HlkI7msqHmnInmraPmlofmnYPpmZDvvIzliJnljp/nlLPor7fljZXmraPmlofmmL7npLrlnKjpmYTku7bmoI9cblx0XHRcdHZhciBzdGFydF9zdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldFN0YXJ0U3RlcCgpO1xuXHRcdFx0aWYgKHN0YXJ0X3N0ZXAgJiYgc3RhcnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCAhPSB0cnVlKSB7XG5cdFx0XHRcdHZhciBkaXN0cmlidXRlX21haW4gPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoe1xuXHRcdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0XHRcdCRpbjogaW5zLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXNcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdFx0XHQnbWV0YWRhdGEubWFpbic6IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGlzdHJpYnV0ZV9tYWluKSB7XG5cdFx0XHRcdFx0dmFyIGZpcnN0VmVyc2lvbk1haW4gPSBjZnMuaW5zdGFuY2VzLmZpbmRPbmUoZGlzdHJpYnV0ZV9tYWluLm1ldGFkYXRhLnBhcmVudCk7XG5cdFx0XHRcdFx0ZGlzdHJpYnV0ZV9tYWluLmF0dGFjaG1lbnRVcGxvYWRlZEF0ID0gZmlyc3RWZXJzaW9uTWFpbiA/IGZpcnN0VmVyc2lvbk1haW4udXBsb2FkZWRBdCA6IGRpc3RyaWJ1dGVfbWFpbi51cGxvYWRlZEF0O1xuXHRcdFx0XHRcdGF0dHMucHVzaChkaXN0cmlidXRlX21haW4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdG9yWydtZXRhZGF0YS5pbnN0YW5jZSddID0gaW5zLl9pZDtcblx0XHR9XG5cblx0XHRjZnMuaW5zdGFuY2VzLmZpbmQoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24oYykge1xuXHRcdFx0dmFyIGZpcnN0VmVyc2lvbiA9IGNmcy5pbnN0YW5jZXMuZmluZE9uZShjLm1ldGFkYXRhLnBhcmVudCk7XG5cdFx0XHRjLmF0dGFjaG1lbnRVcGxvYWRlZEF0ID0gZmlyc3RWZXJzaW9uID8gZmlyc3RWZXJzaW9uLnVwbG9hZGVkQXQgOiBjLnVwbG9hZGVkQXQ7XG5cdFx0XHRhdHRzLnB1c2goYyk7XG5cdFx0fSlcblxuXHRcdHJldHVybiBfLnNvcnRCeShhdHRzLCAnYXR0YWNobWVudFVwbG9hZGVkQXQnKTtcblx0fSxcblxuXHRzaG93QXR0YWNobWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRpZiAoIWlucylcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdC8vIOWmguaenOaYr+iiq+WIhuWPkeeahOeUs+ivt+WNle+8jOWImeaYvuekuuWOn+eUs+ivt+WNleaWh+S7tiDlkozliIblj5HlkI7nlLPor7fljZXmlofku7Zcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNsb25lKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcblx0XHRpbnN0YW5jZUlkcy5wdXNoKGlucy5faWQpO1xuXHRcdHZhciBhdHRhY2htZW50c19jb3VudCA9IGNmcy5pbnN0YW5jZXMuZmluZCh7XG5cdFx0XHQnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG5cdFx0XHRcdCRpbjogaW5zdGFuY2VJZHNcblx0XHRcdH0sXG5cdFx0XHQnbWV0YWRhdGEuY3VycmVudCc6IHRydWVcblx0XHR9KS5jb3VudCgpO1xuXG5cdFx0aWYgKFNlc3Npb24gJiYgU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpICYmIGF0dGFjaG1lbnRzX2NvdW50IDwgMSlcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09IFwiZHJhZnRcIiB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PSBcImluYm94XCIgfHwgYXR0YWNobWVudHNfY291bnQgPiAwKVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdF90OiBmdW5jdGlvbihrZXkpIHtcblx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpXG5cdH0sXG5cblx0XzogZnVuY3Rpb24oa2V5KSB7XG5cdFx0dmFyIGxvY2FsZTtcblx0XHRpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKTtcblx0XHR9XG5cdH0sXG5cblx0Zmxvd19maWxlczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjZnMuZmlsZXMuZmluZCh7ICdtZXRhZGF0YS5zcGFjZSc6IGlucy5zcGFjZSwgJ21ldGFkYXRhLm9iamVjdF9uYW1lJzogJ2Zsb3dzJywgJ21ldGFkYXRhLnJlY29yZF9pZCc6IGlucy5mbG93IH0pO1xuXHR9LFxuXG5cdGlzRHJhZnRBbmRGbG93ZmlsZXNFeGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdGlmICghaW5zKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiAoU2Vzc2lvbi5nZXQoJ2JveCcpID09ICdkcmFmdCcpICYmICEhY2ZzLmZpbGVzLmZpbmQoeyAnbWV0YWRhdGEuc3BhY2UnOiBpbnMuc3BhY2UsICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsICdtZXRhZGF0YS5yZWNvcmRfaWQnOiBpbnMuZmxvdyB9KS5jb3VudCgpO1xuXHR9XG5cblxufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuX3QgPSBmdW5jdGlvbihrZXkpIHtcblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKVxuXHR9XG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuZW5hYmxlZF9hZGRfbWFpbl9hdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH07XG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuZW5hYmxlZF9lZGl0X25vcm1hbF9hdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH07XG5cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5tYWluX2F0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaW5zdGFuY2UgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEuaW5zdGFuY2U7XG5cdFx0dmFyIGluc3RhbmNlSWRzID0gXy5jb21wYWN0KFtpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UsIGluc3RhbmNlLl9pZF0pO1xuXHRcdHZhciBhdHRhY2htZW50ID0gY2ZzLmluc3RhbmNlcy5maW5kT25lKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIGF0dGFjaG1lbnQ7XG5cdH07XG5cblx0SW5zdGFuY2VBdHRhY2htZW50VGVtcGxhdGUuaGVscGVycy5ub3JtYWxfYXR0YWNobWVudHMgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RlZWRvc0RhdGEgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGFcblx0XHR2YXIgaW5zdGFuY2UgPSBzdGVlZG9zRGF0YS5pbnN0YW5jZTtcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNsb25lKGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMpIHx8IFtdO1xuXHRcdGluc3RhbmNlSWRzLnB1c2goaW5zdGFuY2UuX2lkKTtcblx0XHR2YXIgYXR0YWNobWVudHMgPSBjZnMuaW5zdGFuY2VzLmZpbmQoe1xuXHRcdFx0J21ldGFkYXRhLmluc3RhbmNlJzoge1xuXHRcdFx0XHQkaW46IGluc3RhbmNlSWRzXG5cdFx0XHR9LFxuXHRcdFx0J21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLFxuXHRcdFx0J21ldGFkYXRhLm1haW4nOiB7XG5cdFx0XHRcdCRuZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCRvcjogW3tcblx0XHRcdFx0J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB7XG5cdFx0XHRcdFx0JG5lOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB0cnVlLFxuXHRcdFx0XHRcIm1ldGFkYXRhLm93bmVyXCI6IHN0ZWVkb3NEYXRhLnNlc3Npb25Vc2VySWQgfHwgc3RlZWRvc0RhdGEudXNlcklkIHx8ICctMScgLy8g6Ziy5q2i5pWw5o2u5byC5bi45pe2LOaYvuekuuS6huengeaciemZhOS7tlxuXHRcdFx0fV1cblx0XHR9KS5mZXRjaCgpO1xuXG5cdFx0cmV0dXJuIGF0dGFjaG1lbnRzO1xuXHR9O1xuXG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuc2hvd0F0dGFjaG1lbnRzID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGluc3RhbmNlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmluc3RhbmNlO1xuXHRcdHZhciBpbnN0YW5jZUlkcyA9IF8uY2xvbmUoaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcykgfHwgW107XG5cdFx0aW5zdGFuY2VJZHMucHVzaChpbnN0YW5jZS5faWQpO1xuXG5cdFx0dmFyIGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZVxuXHRcdH0pLmZldGNoKCk7XG5cblx0XHRpZiAoYXR0YWNobWVudHMgJiYgYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdEluc3RhbmNlQXR0YWNobWVudFRlbXBsYXRlLmhlbHBlcnMuc2hvd01haW5UaXRsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbnN0YW5jZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5pbnN0YW5jZTtcblx0XHR2YXIgaW5zdGFuY2VJZHMgPSBfLmNvbXBhY3QoW2luc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSwgaW5zdGFuY2UuX2lkXSk7XG5cdFx0dmFyIG1haW5fYXR0YWNoX2NvdW50ID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcblx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IHtcblx0XHRcdFx0JGluOiBpbnN0YW5jZUlkc1xuXHRcdFx0fSxcblx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcblx0XHRcdCdtZXRhZGF0YS5tYWluJzogdHJ1ZVxuXHRcdH0pLmNvdW50KCk7XG5cblx0XHRyZXR1cm4gbWFpbl9hdHRhY2hfY291bnQgPiAwXG5cdH1cbn1cbiIsIm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIilcbkluc3RhbmNlU2lnblRleHQuaGVscGVycyA9XG5cdHNob3c6IChzdGVwTmFtZSktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoJ2luc3RhbmNlUHJpbnQnKVxuXHRcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRcdGlmIEluc3RhbmNlTWFuYWdlci5pc0luYm94KClcblx0XHRcdFx0bXlBcHByb3ZlID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRBcHByb3ZlKClcblx0XHRcdFx0aWYgbXlBcHByb3ZlXG5cdFx0XHRcdFx0aW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRcdFx0XHRteVRyYWNlID0gaW5zdGFuY2U/LnRyYWNlcz8uZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCBteUFwcHJvdmUudHJhY2UpXG5cdFx0XHRcdFx0cmV0dXJuIG15VHJhY2U/Lm5hbWUgPT0gc3RlcE5hbWVcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRkZWZhdWx0RGVzY3JpcHRpb246ICgpLT5cbiNcdFx0cmV0dXJuIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5kZWZhdWx0X2Rlc2NyaXB0aW9uIHx8IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9kZWZhdWx0X29waW5pb25cIilcblx0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb25cblxuXHR0cmFjZXM6ICgpLT5cblx0XHRJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpXG5cblx0dHJhY2U6IChzdGVwTmFtZSwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduLCB0b3Bfa2V5d29yZHMpLT5cblx0XHRpbnN0YW5jZSA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UoKVxuXG5cdFx0aXNfY29tcGxldGVkID0gaW5zdGFuY2U/LnN0YXRlID09IFwiY29tcGxldGVkXCJcblxuXHRcdGNvbXBsZXRlZF9kYXRlID0gaWYgaXNfY29tcGxldGVkIHRoZW4gXy5sYXN0KGluc3RhbmNlLnRyYWNlcyk/LmZpbmlzaF9kYXRlPy5nZXRUaW1lKCkgZWxzZSAwXG5cblx0XHRpZiBpc19jb21wbGV0ZWQgJiYgaW5zdGFuY2UuZmluaXNoX2RhdGVcblx0XHRcdGNvbXBsZXRlZF9kYXRlID0gaW5zdGFuY2UuZmluaXNoX2RhdGU/LmdldFRpbWUoKVxuXG5cdFx0dHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKVxuXG5cdFx0YXBwcm92ZXMgPSBfLmNsb25lKHRyYWNlc1tzdGVwTmFtZV0pXG5cblx0XHRhcHByb3ZlX3NvcnQgPSAoYXBwcm92ZXMsIHRvcF9rZXl3b3JkcyktPlxuXG4j5a+5QXBwcm92ZXPmjpLluo/vvIwg5oyJ54Wn5o+Q5Lqk5pe26Ze05o6S5YCS5bqP77yM5aaC5p6c5rKh5pyJ5o+Q5Lqk5YiZ5pi+56S65Zyo5pyA5LiK6L65XG5cdFx0XHRhcHByb3Zlc19zb3J0ZWQgPSBfLnNvcnRCeSBhcHByb3ZlcywgKGFwcHJvdmUpLT5cblx0XHRcdFx0cmV0dXJuIC0oYXBwcm92ZS5maW5pc2hfZGF0ZSB8fCBuZXcgRGF0ZSgpKS5nZXRUaW1lKClcblxuXHRcdFx0I+mAmui/h+WFs+mUruWtl+aOkuW6j1xuXHRcdFx0aWYgdG9wX2tleXdvcmRzXG5cdFx0XHRcdHRvcF9hcHByb3ZlcyA9IG5ldyBBcnJheSgpXG5cblx0XHRcdFx0dG9wX2tleXdvcmRzLnNwbGl0KFwiLFwiKS5mb3JFYWNoIChrZXkpIC0+XG5cdFx0XHRcdFx0dG9wX2FwcHJvdmVzID0gXy51bmlvbiB0b3BfYXBwcm92ZXMsIF8uZmlsdGVyKGFwcHJvdmVzX3NvcnRlZCwgKGFwcHJvdmUpLT5cblx0XHRcdFx0XHRcdHJldHVybiBhcHByb3ZlPy5oYW5kbGVyX25hbWU/LmluZGV4T2Yoa2V5KSA+IC0xXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQjIOWvuee9rumhtuaEj+ingeaMieeFp+WkhOeQhuS6i+S7tuaOkuWAkuW6j1xuXHRcdFx0XHR0b3BfYXBwcm92ZXMgPSBfLnNvcnRCeSB0b3BfYXBwcm92ZXMsICh0b3BfYXBwcm92ZSktPlxuXHRcdFx0XHRcdHJldHVybiAtKHRvcF9hcHByb3ZlLmZpbmlzaF9kYXRlIHx8IG5ldyBEYXRlKCkpLmdldFRpbWUoKVxuXG5cdFx0XHRcdGFwcHJvdmVzX3NvcnRlZCA9IF8udW5pb24gdG9wX2FwcHJvdmVzLCBhcHByb3Zlc19zb3J0ZWRcblx0XHRcdHJldHVybiBhcHByb3Zlc19zb3J0ZWQgfHwgW11cblxuXHRcdGFwcHJvdmVzID0gXy5maWx0ZXIgYXBwcm92ZXMsIChhKS0+XG5cdFx0XHRyZXR1cm4gYS50eXBlIGlzbnQgXCJmb3J3YXJkXCIgYW5kIGEudHlwZSBpc250IFwiZGlzdHJpYnV0ZVwiIGFuZCBhLnR5cGUgaXNudCBcInRlcm1pbmF0ZWRcIlxuXG5cdFx0aWYgb25seV9jY19vcGluaW9uXG5cdFx0XHRhcHByb3ZlcyA9IGFwcHJvdmVzPy5maWx0ZXJQcm9wZXJ0eShcInR5cGVcIiwgXCJjY1wiKVxuXG5cdFx0YXBwcm92ZXNfc29ydGVkID0gYXBwcm92ZV9zb3J0KGFwcHJvdmVzLCB0b3Bfa2V5d29yZHMpXG5cblx0XHRhcHByb3Zlc0dyb3VwID0gXy5ncm91cEJ5KGFwcHJvdmVzLCBcImhhbmRsZXJcIik7XG5cblx0XHRoYXNOZXh0ID0gKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIC0+XG5cdFx0XHRoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl1cblx0XHRcdHJldHVybiBfLmluZGV4T2YoaGFuZGxlckFwcHJvdmVzLCBhcHByb3ZlKSArIDEgPCBoYW5kbGVyQXBwcm92ZXMubGVuZ3RoXG5cblx0XHRoYXZlRGVzY3JpcHRpb25BcHByb3ZlID0gKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIC0+XG5cdFx0XHRoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl1cblxuXHRcdFx0ZGVzY3JpcHRpb25BcHByb3ZlcyA9IF8uZmlsdGVyIGhhbmRsZXJBcHByb3ZlcywgKGEpLT5cblx0XHRcdFx0aWYgYS5kZXNjcmlwdGlvblxuXHRcdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XHRpZiBkZXNjcmlwdGlvbkFwcHJvdmVzLmxlbmd0aCA9PSAwXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cblx0XHRhcHByb3Zlc19zb3J0ZWQuZm9yRWFjaCAoYXBwcm92ZSkgLT5cbiNcdFx0XHTmnInovpPlhaXmhI/op4Eg5oiWIOacgOaWsOS4gOadoeW5tuS4lOeUqOaIt+ayoeaciei+k+WFpei/h+aEj+ingVxuI1x0XHRcdGlmICFhcHByb3ZlLmlzX2ZpbmlzaGVkIHx8IGFwcHJvdmUuZGVzY3JpcHRpb24gfHwgKCFoYXNOZXh0KGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApICYmICFoYXZlRGVzY3JpcHRpb25BcHByb3ZlKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApKVxuI1x0XHRcdGlmICFoYXNOZXh0KGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApXG5cdFx0XHRpZiBhcHByb3ZlLnNpZ25fc2hvdyAhPSBmYWxzZSAmJiAoYXBwcm92ZS5kZXNjcmlwdGlvbiB8fCAoIWFwcHJvdmUuZGVzY3JpcHRpb24gJiYgIWhhc05leHQoYXBwcm92ZSwgYXBwcm92ZXNHcm91cCkgJiYgIWFwcHJvdmUuaXNfZmluaXNoZWQpIHx8IE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud29ya2Zsb3c/LnNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbilcblx0XHRcdFx0aWYgYXBwcm92ZS5qdWRnZSBpc250ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0XHRcdGFwcHJvdmUuX2Rpc3BsYXkgPSB0cnVlXG5cblx0XHRhcHByb3Zlc19zb3J0ZWQgPSBfLmZpbHRlciBhcHByb3Zlc19zb3J0ZWQsIChhKSAtPlxuXHRcdFx0aWYgaXNfY29tcGxldGVkXG5cdFx0XHRcdHJldHVybiBhLl9kaXNwbGF5ID09IHRydWUgJiYgYS5pc19maW5pc2hlZCAmJiBhLmZpbmlzaF9kYXRlPy5nZXRUaW1lKCkgPD0gY29tcGxldGVkX2RhdGVcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGEuX2Rpc3BsYXkgPT0gdHJ1ZVxuXHRcdHJldHVybiBhcHByb3Zlc19zb3J0ZWRcblxuXHRpbmNsdWRlOiAoYSwgYikgLT5cblx0XHRyZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5pbmNsdWRlKGEsIGIpXG5cblx0dW5lbXB0eTogKHZhbCktPlxuXHRcdHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnVuZW1wdHkodmFsKSB8fCBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndvcmtmbG93Py5zaG93QmxhbmtBcHByb3ZlRGVzY3JpcHRpb25cblxuXHRmb3JtYXREYXRlOiAoZGF0ZSwgb3B0aW9ucyktPlxuXHRcdGlmICFvcHRpb25zXG5cdFx0XHRvcHRpb25zID0ge1wiZm9ybWF0XCI6IFwiWVlZWS1NTS1ERFwifVxuXG5cdFx0cmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuZm9ybWF0RGF0ZShkYXRlLCBvcHRpb25zKVxuXG5cdGlzTXlBcHByb3ZlOiAoYXBwcm92ZSwgb25seV9jY19vcGluaW9uKSAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT0gJ2luYm94J1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuXHRcdFx0Y3VycmVudEFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKVxuXG5cdFx0XHRpZiAhYXBwcm92ZT8uX2lkXG5cdFx0XHRcdGFwcHJvdmUgPSBjdXJyZW50QXBwcm92ZVxuXG5cdFx0XHRpZiBhcHByb3ZlLl9pZCA9PSBjdXJyZW50QXBwcm92ZT8uX2lkICYmIGN1cnJlbnRBcHByb3ZlPy50eXBlID09ICdjYycgJiYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWVcblx0XHRcdFx0aWYgXy5pbmRleE9mKGN1cnJlbnRBcHByb3ZlPy5vcGluaW9uX2ZpZWxkc19jb2RlLCBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEubmFtZSkgPiAtMVxuXHRcdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0aWYgIShjdXJyZW50QXBwcm92ZT8udHlwZSA9PSAnY2MnKSAmJiBvbmx5X2NjX29waW5pb25cblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRcdGlmIGN1cnJlbnRBcHByb3ZlICYmIGFwcHJvdmUuX2lkID09IGN1cnJlbnRBcHByb3ZlLl9pZFxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdHJldHVybiBmYWxzZVxuXG5cdG15QXBwcm92ZURlc2NyaXB0aW9uOiAoYXBwcm92ZUlkKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdG15QXBwcm92ZSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/Lm15QXBwcm92ZT8uZ2V0KClcblx0XHRcdFx0aWYgbXlBcHByb3ZlICYmIG15QXBwcm92ZS5pZCA9PSBhcHByb3ZlSWRcblx0XHRcdFx0XHRpZiAhbXlBcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBteUFwcHJvdmUuc2lnbl9maWVsZF9jb2RlID09IFRlbXBsYXRlLmluc3RhbmNlKCk/LmRhdGE/Lm5hbWVcblx0XHRcdFx0XHRcdGlmICFTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG15QXBwcm92ZT8uZGVzY3JpcHRpb24gfHwgXCJcIlxuXHRcdFx0XHRcdFx0cmV0dXJuIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKVxuXG5cdG5vdzogKCktPlxuXHRcdHJldHVybiBuZXcgRGF0ZSgpO1xuXG5cdGlzUmVhZE9ubHk6ICgpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBBcHByb3ZlTWFuYWdlci5pc1JlYWRPbmx5KClcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRpc09waW5pb25PZkZpZWxkOiAoYXBwcm92ZSktPlxuXHRcdGlmIGFwcHJvdmUudHlwZSA9PSBcImNjXCIgJiYgVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWVcblx0XHRcdGlmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lID09IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdG1hcmtEb3duVG9IdG1sOiAobWFya0Rvd25TdHJpbmcpLT5cblx0XHRpZiBtYXJrRG93blN0cmluZ1xuXHRcdFx0IyByZW5kZXJlciA9IG5ldyBNYXJrZG93bi5SZW5kZXJlcigpO1xuXHRcdFx0IyByZW5kZXJlci5saW5rID0gKGhyZWYsIHRpdGxlLCB0ZXh0KSAtPlxuXHRcdFx0IyBcdHJldHVybiBcIjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPScje2hyZWZ9JyB0aXRsZT0nI3t0aXRsZX0nPiN7dGV4dH08L2E+XCJcblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJylcblx0XHRcdHJldHVybiBTcGFjZWJhcnMuU2FmZVN0cmluZyhtYXJrZWQucGFyc2UobWFya0Rvd25TdHJpbmcpKVxuXG5cdHN0ZXBzOiAoZmllbGRfZm9ybXVsYSwgc3RlcCwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduKS0+XG5cdFx0c3RlcHMgPSBbXVxuXHRcdGlmICFzdGVwXG5cdFx0XHRpZiAhZmllbGRfZm9ybXVsYVxuXHRcdFx0XHRmaWVsZF9mb3JtdWxhID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlRm9ybVZlcnNpb24oKT8uZmllbGRzPy5maW5kUHJvcGVydHlCeVBLKFwiY29kZVwiLCB0aGlzLm5hbWUpLmZvcm11bGFcblx0XHRcdHN0ZXBzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5nZXRPcGluaW9uRmllbGRTdGVwc05hbWUoZmllbGRfZm9ybXVsYSwgVGVtcGxhdGUuaW5zdGFuY2UoKT8uZGF0YS50b3Bfa2V5d29yZHMpXG5cdFx0ZWxzZVxuXHRcdFx0c3RlcHMgPSBbe3N0ZXBOYW1lOiBzdGVwLCBvbmx5X2NjX29waW5pb246IG9ubHlfY2Nfb3BpbmlvbiwgaW1hZ2Vfc2lnbjogaW1hZ2Vfc2lnbn1dXG5cdFx0cmV0dXJuIHN0ZXBzXG5cblx0aW1hZ2VTaWduRGF0YTogKGhhbmRsZXIpIC0+XG5cdFx0cmV0dXJuIHt1c2VyOiBoYW5kbGVyfVxuXG5cdHNob3dTaWduSW1hZ2U6IChoYW5kbGVyLCBpbWFnZV9zaWduLCBqdWRnZSkgLT5cblx0XHRpZiBbJ3JldHVybmVkJywgJ3Rlcm1pbmF0ZWQnLCAncmV0cmlldmVkJ10uaW5jbHVkZXMoanVkZ2UpXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRzcGFjZVVzZXJTaWduID0gSW1hZ2VTaWduLmhlbHBlcnMuc3BhY2VVc2VyU2lnbihoYW5kbGVyKVxuXG5cdFx0aWYgc3BhY2VVc2VyU2lnbj8uc2lnbiAmJiBpbWFnZV9zaWduXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdGdldExhc3RTaWduQXBwcm92ZTogKCktPlxuXHRcdGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG5cdFx0cmV0dXJuIF8ubGFzdChUcmFjZXNNYW5hZ2VyLmdldEhhbmRsZXJTaWduU2hvd0FwcHJvdmVzIGlucywgTWV0ZW9yLnVzZXJJZCgpKVxuXG5cblx0bGFzdE15QXBwcm92ZURlc2NyaXB0aW9uOiAoKS0+XG5cdFx0dHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKVxuXHRcdGN1cnJlbnRTdGVwID0gSW5zdGFuY2VNYW5hZ2VyLmdldEN1cnJlbnRTdGVwKCk7XG5cdFx0YXBwcm92ZXMgPSBfLmNsb25lKHRyYWNlc1tjdXJyZW50U3RlcC5uYW1lXSlcblxuXHRcdGFwcHJvdmVzID0gYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJoYW5kbGVyXCIsIE1ldGVvci51c2VySWQoKSlcblxuXHRcdGlmIGFwcHJvdmVzLmxlbmd0aCA+IDFcblx0XHRcdHJldHVybiBhcHByb3Zlc1thcHByb3Zlcy5sZW5ndGggLSAyXT8uZGVzY3JpcHRpb25cblxuXHRcdHJldHVybiBcIlwiO1xuXG5cdHNob3dBcHByb3ZlOiAoYXBwcm92ZSktPlxuXHRcdGlmICFhcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSA9PSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5kYXRhPy5uYW1lXG5cdFx0XHRpZiBhcHByb3ZlPy5pc19yZWFkXG5cdFx0XHRcdGlmIGFwcHJvdmUuaXNfZmluaXNoZWRcblx0XHRcdFx0XHRyZXR1cm4gW1wiYXBwcm92ZWRcIiwgXCJyZWplY3RlZFwiLCBcInN1Ym1pdHRlZFwiLCBcInJlYWRlZFwiXS5pbmNsdWRlcyhhcHByb3ZlLmp1ZGdlKVxuXHRcdHJldHVybiBmYWxzZTtcblxuXHRqdWRnZV9kZXNjcmlwdGlvbjogKGp1ZGdlKS0+XG5cdFx0cmV0dXJuIHQoanVkZ2UgKyBcIl9kZXNjcmlwdGlvblwiKVxuXG5cdGlzX2FwcHJvdmVkOiAoanVkZ2UpLT5cblx0XHRyZXR1cm4gXCJhcHByb3ZlZFwiID09IGp1ZGdlXG5cblx0aXNfcmVqZWN0ZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBcInJlamVjdGVkXCIgPT0ganVkZ2VcblxuXHRpc19yZWFkZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBbXCJhcHByb3ZlZFwiLCBcInJlamVjdGVkXCIsIFwic3VibWl0dGVkXCIsIFwicmVhZGVkXCJdLmluY2x1ZGVzKGp1ZGdlKVxuXG5cdGFkZENsYXNzOiAoKS0+XG5cdFx0bmFtZSA9IFRlbXBsYXRlLmluc3RhbmNlKCk/LmRhdGE/Lm5hbWVcblx0XHRzZXRUaW1lb3V0ICgpIC0+XG5cdFx0XHR0cnlcblx0XHRcdFx0ZWxlbWVudCA9ICQoXCIuYXV0b21hdGljLm9waW5pb24tZmllbGQtXCIgKyBuYW1lKVxuXHRcdFx0XHRpZiBlbGVtZW50Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRpZiBlbGVtZW50Py5pcyhcInRkXCIpXG5cdFx0XHRcdFx0XHRlbGVtZW50LmFkZENsYXNzKCdmaWVsZC1lZGl0YWJsZScpXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0JChcIi5pbnN0YW5jZS1zaWduXCIsIGVsZW1lbnQpLmFkZENsYXNzKCdmaWVsZC1lZGl0YWJsZScpXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGNvbnNvbGUubG9nIGVcblx0XHQsIDFcblx0XHRyZXR1cm4gJydcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdEluc3RhbmNlU2lnblRleHQuaGVscGVycy5kZWZhdWx0RGVzY3JpcHRpb24gPSAtPlxuXHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRyZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb24gfHwgVEFQaTE4bi5fXyhcImluc3RhbmNlX2RlZmF1bHRfb3BpbmlvblwiLCB7fSwgbG9jYWxlKSIsInZhciBtYXJrZWQ7XG5cbm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIik7XG5cbkluc3RhbmNlU2lnblRleHQuaGVscGVycyA9IHtcbiAgc2hvdzogZnVuY3Rpb24oc3RlcE5hbWUpIHtcbiAgICB2YXIgaW5zdGFuY2UsIG15QXBwcm92ZSwgbXlUcmFjZSwgcmVmO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldCgnaW5zdGFuY2VQcmludCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChJbnN0YW5jZU1hbmFnZXIuaXNJbmJveCgpKSB7XG4gICAgICAgIG15QXBwcm92ZSA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50QXBwcm92ZSgpO1xuICAgICAgICBpZiAobXlBcHByb3ZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICBteVRyYWNlID0gaW5zdGFuY2UgIT0gbnVsbCA/IChyZWYgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwgPyByZWYuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCBteUFwcHJvdmUudHJhY2UpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiAobXlUcmFjZSAhPSBudWxsID8gbXlUcmFjZS5uYW1lIDogdm9pZCAwKSA9PT0gc3RlcE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWZhdWx0RGVzY3JpcHRpb246IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmRhdGEuZGVmYXVsdF9kZXNjcmlwdGlvbjtcbiAgfSxcbiAgdHJhY2VzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKTtcbiAgfSxcbiAgdHJhY2U6IGZ1bmN0aW9uKHN0ZXBOYW1lLCBvbmx5X2NjX29waW5pb24sIGltYWdlX3NpZ24sIHRvcF9rZXl3b3Jkcykge1xuICAgIHZhciBhcHByb3ZlX3NvcnQsIGFwcHJvdmVzLCBhcHByb3Zlc0dyb3VwLCBhcHByb3Zlc19zb3J0ZWQsIGNvbXBsZXRlZF9kYXRlLCBoYXNOZXh0LCBoYXZlRGVzY3JpcHRpb25BcHByb3ZlLCBpbnN0YW5jZSwgaXNfY29tcGxldGVkLCByZWYsIHJlZjEsIHJlZjIsIHRyYWNlcztcbiAgICBpbnN0YW5jZSA9IEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMuaW5zdGFuY2UoKTtcbiAgICBpc19jb21wbGV0ZWQgPSAoaW5zdGFuY2UgIT0gbnVsbCA/IGluc3RhbmNlLnN0YXRlIDogdm9pZCAwKSA9PT0gXCJjb21wbGV0ZWRcIjtcbiAgICBjb21wbGV0ZWRfZGF0ZSA9IGlzX2NvbXBsZXRlZCA/IChyZWYgPSBfLmxhc3QoaW5zdGFuY2UudHJhY2VzKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmZpbmlzaF9kYXRlKSAhPSBudWxsID8gcmVmMS5nZXRUaW1lKCkgOiB2b2lkIDAgOiB2b2lkIDAgOiAwO1xuICAgIGlmIChpc19jb21wbGV0ZWQgJiYgaW5zdGFuY2UuZmluaXNoX2RhdGUpIHtcbiAgICAgIGNvbXBsZXRlZF9kYXRlID0gKHJlZjIgPSBpbnN0YW5jZS5maW5pc2hfZGF0ZSkgIT0gbnVsbCA/IHJlZjIuZ2V0VGltZSgpIDogdm9pZCAwO1xuICAgIH1cbiAgICB0cmFjZXMgPSBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLnRyYWNlcygpO1xuICAgIGFwcHJvdmVzID0gXy5jbG9uZSh0cmFjZXNbc3RlcE5hbWVdKTtcbiAgICBhcHByb3ZlX3NvcnQgPSBmdW5jdGlvbihhcHByb3ZlcywgdG9wX2tleXdvcmRzKSB7XG4gICAgICB2YXIgYXBwcm92ZXNfc29ydGVkLCB0b3BfYXBwcm92ZXM7XG4gICAgICBhcHByb3Zlc19zb3J0ZWQgPSBfLnNvcnRCeShhcHByb3ZlcywgZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICByZXR1cm4gLShhcHByb3ZlLmZpbmlzaF9kYXRlIHx8IG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRvcF9rZXl3b3Jkcykge1xuICAgICAgICB0b3BfYXBwcm92ZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdG9wX2tleXdvcmRzLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHJldHVybiB0b3BfYXBwcm92ZXMgPSBfLnVuaW9uKHRvcF9hcHByb3ZlcywgXy5maWx0ZXIoYXBwcm92ZXNfc29ydGVkLCBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgICB2YXIgcmVmMztcbiAgICAgICAgICAgIHJldHVybiAoYXBwcm92ZSAhPSBudWxsID8gKHJlZjMgPSBhcHByb3ZlLmhhbmRsZXJfbmFtZSkgIT0gbnVsbCA/IHJlZjMuaW5kZXhPZihrZXkpIDogdm9pZCAwIDogdm9pZCAwKSA+IC0xO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRvcF9hcHByb3ZlcyA9IF8uc29ydEJ5KHRvcF9hcHByb3ZlcywgZnVuY3Rpb24odG9wX2FwcHJvdmUpIHtcbiAgICAgICAgICByZXR1cm4gLSh0b3BfYXBwcm92ZS5maW5pc2hfZGF0ZSB8fCBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhcHByb3Zlc19zb3J0ZWQgPSBfLnVuaW9uKHRvcF9hcHByb3ZlcywgYXBwcm92ZXNfc29ydGVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcHByb3Zlc19zb3J0ZWQgfHwgW107XG4gICAgfTtcbiAgICBhcHByb3ZlcyA9IF8uZmlsdGVyKGFwcHJvdmVzLCBmdW5jdGlvbihhKSB7XG4gICAgICByZXR1cm4gYS50eXBlICE9PSBcImZvcndhcmRcIiAmJiBhLnR5cGUgIT09IFwiZGlzdHJpYnV0ZVwiICYmIGEudHlwZSAhPT0gXCJ0ZXJtaW5hdGVkXCI7XG4gICAgfSk7XG4gICAgaWYgKG9ubHlfY2Nfb3Bpbmlvbikge1xuICAgICAgYXBwcm92ZXMgPSBhcHByb3ZlcyAhPSBudWxsID8gYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJ0eXBlXCIsIFwiY2NcIikgOiB2b2lkIDA7XG4gICAgfVxuICAgIGFwcHJvdmVzX3NvcnRlZCA9IGFwcHJvdmVfc29ydChhcHByb3ZlcywgdG9wX2tleXdvcmRzKTtcbiAgICBhcHByb3Zlc0dyb3VwID0gXy5ncm91cEJ5KGFwcHJvdmVzLCBcImhhbmRsZXJcIik7XG4gICAgaGFzTmV4dCA9IGZ1bmN0aW9uKGFwcHJvdmUsIGFwcHJvdmVzR3JvdXApIHtcbiAgICAgIHZhciBoYW5kbGVyQXBwcm92ZXM7XG4gICAgICBoYW5kbGVyQXBwcm92ZXMgPSBhcHByb3Zlc0dyb3VwW2FwcHJvdmUuaGFuZGxlcl07XG4gICAgICByZXR1cm4gXy5pbmRleE9mKGhhbmRsZXJBcHByb3ZlcywgYXBwcm92ZSkgKyAxIDwgaGFuZGxlckFwcHJvdmVzLmxlbmd0aDtcbiAgICB9O1xuICAgIGhhdmVEZXNjcmlwdGlvbkFwcHJvdmUgPSBmdW5jdGlvbihhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSB7XG4gICAgICB2YXIgZGVzY3JpcHRpb25BcHByb3ZlcywgaGFuZGxlckFwcHJvdmVzO1xuICAgICAgaGFuZGxlckFwcHJvdmVzID0gYXBwcm92ZXNHcm91cFthcHByb3ZlLmhhbmRsZXJdO1xuICAgICAgZGVzY3JpcHRpb25BcHByb3ZlcyA9IF8uZmlsdGVyKGhhbmRsZXJBcHByb3ZlcywgZnVuY3Rpb24oYSkge1xuICAgICAgICBpZiAoYS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRlc2NyaXB0aW9uQXBwcm92ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgYXBwcm92ZXNfc29ydGVkLmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgdmFyIHJlZjM7XG4gICAgICBpZiAoYXBwcm92ZS5zaWduX3Nob3cgIT09IGZhbHNlICYmIChhcHByb3ZlLmRlc2NyaXB0aW9uIHx8ICghYXBwcm92ZS5kZXNjcmlwdGlvbiAmJiAhaGFzTmV4dChhcHByb3ZlLCBhcHByb3Zlc0dyb3VwKSAmJiAhYXBwcm92ZS5pc19maW5pc2hlZCkgfHwgKChyZWYzID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93KSAhPSBudWxsID8gcmVmMy5zaG93QmxhbmtBcHByb3ZlRGVzY3JpcHRpb24gOiB2b2lkIDApKSkge1xuICAgICAgICBpZiAoYXBwcm92ZS5qdWRnZSAhPT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcHJvdmUuX2Rpc3BsYXkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXBwcm92ZXNfc29ydGVkID0gXy5maWx0ZXIoYXBwcm92ZXNfc29ydGVkLCBmdW5jdGlvbihhKSB7XG4gICAgICB2YXIgcmVmMztcbiAgICAgIGlmIChpc19jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGEuX2Rpc3BsYXkgPT09IHRydWUgJiYgYS5pc19maW5pc2hlZCAmJiAoKHJlZjMgPSBhLmZpbmlzaF9kYXRlKSAhPSBudWxsID8gcmVmMy5nZXRUaW1lKCkgOiB2b2lkIDApIDw9IGNvbXBsZXRlZF9kYXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGEuX2Rpc3BsYXkgPT09IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFwcHJvdmVzX3NvcnRlZDtcbiAgfSxcbiAgaW5jbHVkZTogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGUoYSwgYik7XG4gIH0sXG4gIHVuZW1wdHk6IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciByZWY7XG4gICAgcmV0dXJuIEluc3RhbmNlZm9ybVRlbXBsYXRlLmhlbHBlcnMudW5lbXB0eSh2YWwpIHx8ICgocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93KSAhPSBudWxsID8gcmVmLnNob3dCbGFua0FwcHJvdmVEZXNjcmlwdGlvbiA6IHZvaWQgMCk7XG4gIH0sXG4gIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGRhdGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIFwiZm9ybWF0XCI6IFwiWVlZWS1NTS1ERFwiXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5mb3JtYXREYXRlKGRhdGUsIG9wdGlvbnMpO1xuICB9LFxuICBpc015QXBwcm92ZTogZnVuY3Rpb24oYXBwcm92ZSwgb25seV9jY19vcGluaW9uKSB7XG4gICAgdmFyIGN1cnJlbnRBcHByb3ZlLCBpbnM7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpICE9PSAnaW5ib3gnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgY3VycmVudEFwcHJvdmUgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0Q3VycmVudEFwcHJvdmUoKTtcbiAgICAgIGlmICghKGFwcHJvdmUgIT0gbnVsbCA/IGFwcHJvdmUuX2lkIDogdm9pZCAwKSkge1xuICAgICAgICBhcHByb3ZlID0gY3VycmVudEFwcHJvdmU7XG4gICAgICB9XG4gICAgICBpZiAoYXBwcm92ZS5faWQgPT09IChjdXJyZW50QXBwcm92ZSAhPSBudWxsID8gY3VycmVudEFwcHJvdmUuX2lkIDogdm9pZCAwKSAmJiAoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLnR5cGUgOiB2b2lkIDApID09PSAnY2MnICYmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSB7XG4gICAgICAgIGlmIChfLmluZGV4T2YoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLm9waW5pb25fZmllbGRzX2NvZGUgOiB2b2lkIDAsIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoISgoY3VycmVudEFwcHJvdmUgIT0gbnVsbCA/IGN1cnJlbnRBcHByb3ZlLnR5cGUgOiB2b2lkIDApID09PSAnY2MnKSAmJiBvbmx5X2NjX29waW5pb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRBcHByb3ZlICYmIGFwcHJvdmUuX2lkID09PSBjdXJyZW50QXBwcm92ZS5faWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgbXlBcHByb3ZlRGVzY3JpcHRpb246IGZ1bmN0aW9uKGFwcHJvdmVJZCkge1xuICAgIHZhciBteUFwcHJvdmUsIHJlZiwgcmVmMSwgcmVmMiwgcmVmMztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgbXlBcHByb3ZlID0gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5teUFwcHJvdmUpICE9IG51bGwgPyByZWYxLmdldCgpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICBpZiAobXlBcHByb3ZlICYmIG15QXBwcm92ZS5pZCA9PT0gYXBwcm92ZUlkKSB7XG4gICAgICAgICAgaWYgKCFteUFwcHJvdmUuc2lnbl9maWVsZF9jb2RlIHx8IG15QXBwcm92ZS5zaWduX2ZpZWxkX2NvZGUgPT09ICgocmVmMiA9IFRlbXBsYXRlLmluc3RhbmNlKCkpICE9IG51bGwgPyAocmVmMyA9IHJlZjIuZGF0YSkgIT0gbnVsbCA/IHJlZjMubmFtZSA6IHZvaWQgMCA6IHZvaWQgMCkpIHtcbiAgICAgICAgICAgIGlmICghU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiAobXlBcHByb3ZlICE9IG51bGwgPyBteUFwcHJvdmUuZGVzY3JpcHRpb24gOiB2b2lkIDApIHx8IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZV9teV9hcHByb3ZlX2Rlc2NyaXB0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbm93OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKTtcbiAgfSxcbiAgaXNSZWFkT25seTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgcmV0dXJuIEFwcHJvdmVNYW5hZ2VyLmlzUmVhZE9ubHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc09waW5pb25PZkZpZWxkOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKGFwcHJvdmUudHlwZSA9PT0gXCJjY1wiICYmIFRlbXBsYXRlLmluc3RhbmNlKCkuZGF0YS5uYW1lKSB7XG4gICAgICBpZiAoVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLm5hbWUgPT09IGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIG1hcmtEb3duVG9IdG1sOiBmdW5jdGlvbihtYXJrRG93blN0cmluZykge1xuICAgIGlmIChtYXJrRG93blN0cmluZykge1xuICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICBtYXJrZWQgPSBOcG0ucmVxdWlyZSgnbWFya2VkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3BhY2ViYXJzLlNhZmVTdHJpbmcobWFya2VkLnBhcnNlKG1hcmtEb3duU3RyaW5nKSk7XG4gICAgfVxuICB9LFxuICBzdGVwczogZnVuY3Rpb24oZmllbGRfZm9ybXVsYSwgc3RlcCwgb25seV9jY19vcGluaW9uLCBpbWFnZV9zaWduKSB7XG4gICAgdmFyIHJlZiwgcmVmMSwgcmVmMiwgc3RlcHM7XG4gICAgc3RlcHMgPSBbXTtcbiAgICBpZiAoIXN0ZXApIHtcbiAgICAgIGlmICghZmllbGRfZm9ybXVsYSkge1xuICAgICAgICBmaWVsZF9mb3JtdWxhID0gKHJlZiA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZUZvcm1WZXJzaW9uKCkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5maWVsZHMpICE9IG51bGwgPyByZWYxLmZpbmRQcm9wZXJ0eUJ5UEsoXCJjb2RlXCIsIHRoaXMubmFtZSkuZm9ybXVsYSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHN0ZXBzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy5nZXRPcGluaW9uRmllbGRTdGVwc05hbWUoZmllbGRfZm9ybXVsYSwgKHJlZjIgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gcmVmMi5kYXRhLnRvcF9rZXl3b3JkcyA6IHZvaWQgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc3RlcE5hbWU6IHN0ZXAsXG4gICAgICAgICAgb25seV9jY19vcGluaW9uOiBvbmx5X2NjX29waW5pb24sXG4gICAgICAgICAgaW1hZ2Vfc2lnbjogaW1hZ2Vfc2lnblxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHM7XG4gIH0sXG4gIGltYWdlU2lnbkRhdGE6IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcjogaGFuZGxlclxuICAgIH07XG4gIH0sXG4gIHNob3dTaWduSW1hZ2U6IGZ1bmN0aW9uKGhhbmRsZXIsIGltYWdlX3NpZ24sIGp1ZGdlKSB7XG4gICAgdmFyIHNwYWNlVXNlclNpZ247XG4gICAgaWYgKFsncmV0dXJuZWQnLCAndGVybWluYXRlZCcsICdyZXRyaWV2ZWQnXS5pbmNsdWRlcyhqdWRnZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3BhY2VVc2VyU2lnbiA9IEltYWdlU2lnbi5oZWxwZXJzLnNwYWNlVXNlclNpZ24oaGFuZGxlcik7XG4gICAgaWYgKChzcGFjZVVzZXJTaWduICE9IG51bGwgPyBzcGFjZVVzZXJTaWduLnNpZ24gOiB2b2lkIDApICYmIGltYWdlX3NpZ24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBnZXRMYXN0U2lnbkFwcHJvdmU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbnM7XG4gICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgcmV0dXJuIF8ubGFzdChUcmFjZXNNYW5hZ2VyLmdldEhhbmRsZXJTaWduU2hvd0FwcHJvdmVzKGlucywgTWV0ZW9yLnVzZXJJZCgpKSk7XG4gIH0sXG4gIGxhc3RNeUFwcHJvdmVEZXNjcmlwdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFwcHJvdmVzLCBjdXJyZW50U3RlcCwgcmVmLCB0cmFjZXM7XG4gICAgdHJhY2VzID0gSW5zdGFuY2Vmb3JtVGVtcGxhdGUuaGVscGVycy50cmFjZXMoKTtcbiAgICBjdXJyZW50U3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgIGFwcHJvdmVzID0gXy5jbG9uZSh0cmFjZXNbY3VycmVudFN0ZXAubmFtZV0pO1xuICAgIGFwcHJvdmVzID0gYXBwcm92ZXMuZmlsdGVyUHJvcGVydHkoXCJoYW5kbGVyXCIsIE1ldGVvci51c2VySWQoKSk7XG4gICAgaWYgKGFwcHJvdmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiAocmVmID0gYXBwcm92ZXNbYXBwcm92ZXMubGVuZ3RoIC0gMl0pICE9IG51bGwgPyByZWYuZGVzY3JpcHRpb24gOiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9LFxuICBzaG93QXBwcm92ZTogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIHZhciByZWYsIHJlZjE7XG4gICAgaWYgKCFhcHByb3ZlLnNpZ25fZmllbGRfY29kZSB8fCBhcHByb3ZlLnNpZ25fZmllbGRfY29kZSA9PT0gKChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGF0YSkgIT0gbnVsbCA/IHJlZjEubmFtZSA6IHZvaWQgMCA6IHZvaWQgMCkpIHtcbiAgICAgIGlmIChhcHByb3ZlICE9IG51bGwgPyBhcHByb3ZlLmlzX3JlYWQgOiB2b2lkIDApIHtcbiAgICAgICAgaWYgKGFwcHJvdmUuaXNfZmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm4gW1wiYXBwcm92ZWRcIiwgXCJyZWplY3RlZFwiLCBcInN1Ym1pdHRlZFwiLCBcInJlYWRlZFwiXS5pbmNsdWRlcyhhcHByb3ZlLmp1ZGdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGp1ZGdlX2Rlc2NyaXB0aW9uOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiB0KGp1ZGdlICsgXCJfZGVzY3JpcHRpb25cIik7XG4gIH0sXG4gIGlzX2FwcHJvdmVkOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiBcImFwcHJvdmVkXCIgPT09IGp1ZGdlO1xuICB9LFxuICBpc19yZWplY3RlZDogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4gXCJyZWplY3RlZFwiID09PSBqdWRnZTtcbiAgfSxcbiAgaXNfcmVhZGVkOiBmdW5jdGlvbihqdWRnZSkge1xuICAgIHJldHVybiBbXCJhcHByb3ZlZFwiLCBcInJlamVjdGVkXCIsIFwic3VibWl0dGVkXCIsIFwicmVhZGVkXCJdLmluY2x1ZGVzKGp1ZGdlKTtcbiAgfSxcbiAgYWRkQ2xhc3M6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuYW1lLCByZWYsIHJlZjE7XG4gICAgbmFtZSA9IChyZWYgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGF0YSkgIT0gbnVsbCA/IHJlZjEubmFtZSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUsIGVsZW1lbnQ7XG4gICAgICB0cnkge1xuICAgICAgICBlbGVtZW50ID0gJChcIi5hdXRvbWF0aWMub3Bpbmlvbi1maWVsZC1cIiArIG5hbWUpO1xuICAgICAgICBpZiAoZWxlbWVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuaXMoXCJ0ZFwiKSA6IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuYWRkQ2xhc3MoJ2ZpZWxkLWVkaXRhYmxlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAkKFwiLmluc3RhbmNlLXNpZ25cIiwgZWxlbWVudCkuYWRkQ2xhc3MoJ2ZpZWxkLWVkaXRhYmxlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH1cbiAgICB9LCAxKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgSW5zdGFuY2VTaWduVGV4dC5oZWxwZXJzLmRlZmF1bHREZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsb2NhbGU7XG4gICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICByZXR1cm4gVGVtcGxhdGUuaW5zdGFuY2UoKS5kYXRhLmRlZmF1bHRfZGVzY3JpcHRpb24gfHwgVEFQaTE4bi5fXyhcImluc3RhbmNlX2RlZmF1bHRfb3BpbmlvblwiLCB7fSwgbG9jYWxlKTtcbiAgfTtcbn1cbiIsIm1hcmtlZCA9IHJlcXVpcmUoXCJtYXJrZWRcIilcblRyYWNlc1RlbXBsYXRlLmhlbHBlcnMgPVxuXHR0cmFjZVNob3dTaWduSW1hZ2U6ICgpLT5cblx0XHRyZXR1cm4gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53b3JrZmxvdy50cmFjZVNob3dTaWduSW1hZ2UgIT0gZmFsc2UgJiYgTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53b3JrZmxvdy50cmFjZVNob3dTaWduSW1hZ2UgIT0gJ2ZhbHNlJ1xuXHRlcXVhbHM6IChhLCBiKSAtPlxuXHRcdGEgPT0gYlxuXHRlbXB0eTogKGEpIC0+XG5cdFx0aWYgYVxuXHRcdFx0YS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPCAxXG5cdFx0ZWxzZVxuXHRcdFx0dHJ1ZVxuXHR1bmVtcHR5OiAoYSkgLT5cblx0XHRpZiBhXG5cdFx0XHRhLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA+IDBcblx0XHRlbHNlXG5cdFx0XHRmYWxzZVxuXG5cdGFwcGVuZDogKGEsIGIpIC0+XG5cdFx0YSArIGJcblxuXHRkYXRlRm9ybWF0OiAoZGF0ZSkgLT5cblx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSAmJiBkYXRlPy5nZXRGdWxsWWVhcigpID09IChuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKVxuXHRcdFx0XHRyZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU0tREQgSEg6bW0nKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIG1vbWVudChkYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblxuXHRnZXRTdGVwTmFtZTogKHN0ZXBJZCkgLT5cblx0XHRzdGVwID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlU3RlcChzdGVwSWQpXG5cdFx0aWYgc3RlcFxuXHRcdFx0cmV0dXJuIHN0ZXAubmFtZVxuXHRcdG51bGxcblx0c2hvd0RlbGV0ZUJ1dHRvbjogKGFwcHJvdmVkKSAtPlxuXHRcdGlmIGFwcHJvdmVkIGFuZCBhcHByb3ZlZC50eXBlID09ICdjYycgYW5kIGFwcHJvdmVkLmZyb21fdXNlciA9PSBNZXRlb3IudXNlcklkKCkgYW5kIGFwcHJvdmVkLmlzX2ZpbmlzaGVkICE9IHRydWUgYW5kICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIilcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0ZmFsc2Vcblx0aXNTaG93TW9kaWZpY2F0aW9uQnV0dG9uOiAoYXBwcm92ZWQpIC0+XG5cdFx0YXBwcm92ZV9hZG1pbnMgPSBNZXRlb3Iuc2V0dGluZ3M/LnB1YmxpYz8ud29ya2Zsb3c/LmFwcHJvdmVfYWRtaW5zXG5cdFx0aWYgYXBwcm92ZV9hZG1pbnM/Lmxlbmd0aFxuXHRcdFx0aXNTaG93ID0gYXBwcm92ZV9hZG1pbnM/LmNvbnRhaW5zIE1ldGVvci51c2VySWQoKVxuXHRcdHVubGVzcyBpc1Nob3dcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHJldHVybiBhcHByb3ZlZC5oYW5kbGVyID09IE1ldGVvci51c2VySWQoKVxuXHRpc0VkaXRpbmc6ICgpIC0+XG5cdFx0IHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZSgpLmlzX2VkaXRpbmc/LmdldCgpXG5cdGlzU2hvd0Rlc2NyaXB0aW9uOiAoYXBwcm92ZWQpLT5cblx0XHQjIGRlYnVnZ2VyXG5cdFx0aWYgVHJhY2VzVGVtcGxhdGUuaGVscGVycy5pc1Nob3dNb2RpZmljYXRpb25CdXR0b24gYXBwcm92ZWRcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0cmV0dXJuIGFwcHJvdmVkLmRlc2NyaXB0aW9uPy50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPiAwXG5cdGlzQ0M6IChhcHByb3ZlZCkgLT5cblx0XHRpZiBhcHByb3ZlZCBhbmQgYXBwcm92ZWQudHlwZSA9PSAnY2MnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdGdldEFwcHJvdmVTdGF0dXNJY29uOiAoYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSAtPlxuXHRcdGlmIGF1dG9TdWJtaXR0ZWQgPT0gdHJ1ZVxuXHRcdFx0cmV0dXJuICdpb24gaW9uLWFuZHJvaWQtYWxhcm0tY2xvY2snXG5cdFx0I+W3sue7k+adn+eahOaYvuekuuS4uuaguOWHhi/pqbPlm54v5Y+W5raI55Sz6K+377yM5bm25pi+56S65aSE55CG54q25oCB5Zu+5qCHXG5cdFx0YXBwcm92ZVN0YXR1c0ljb24gPSB1bmRlZmluZWRcblx0XHRzd2l0Y2ggYXBwcm92ZUp1ZGdlXG5cdFx0XHR3aGVuICdhcHByb3ZlZCdcblx0XHRcdFx0IyDlt7LmoLjlh4Zcblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jaGVja21hcmstcm91bmQnXG5cdFx0XHR3aGVuICdyZWplY3RlZCdcblx0XHRcdFx0IyDlt7LpqbPlm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jbG9zZS1yb3VuZCdcblx0XHRcdHdoZW4gJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5raIXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2ZhIGZhLWJhbidcblx0XHRcdHdoZW4gJ3JlYXNzaWduZWQnXG5cdFx0XHRcdCMg6L2s562+5qC4XG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tYW5kcm9pZC1jb250YWN0J1xuXHRcdFx0d2hlbiAncmVsb2NhdGVkJ1xuXHRcdFx0XHQjIOmHjeWumuS9jVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWFycm93LXNocmluaydcblx0XHRcdHdoZW4gJ3JldHJpZXZlZCdcblx0XHRcdFx0IyDlt7Llj5blm55cblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnZmEgZmEtdW5kbydcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXBwcm92ZVN0YXR1c0ljb24gPSAnJ1xuXHRcdFx0XHRicmVha1xuXHRcdGFwcHJvdmVTdGF0dXNJY29uXG5cdGdldEFwcHJvdmVTdGF0dXNUZXh0OiAoYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSAtPlxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0bG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZVxuXHRcdFx0aWYgbG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gJ3poLWNuJ1xuXHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRlbHNlXG5cdFx0XHRsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpXG5cdFx0I+W3sue7k+adn+eahOaYvuekuuS4uuaguOWHhi/pqbPlm54v5Y+W5raI55Sz6K+377yM5bm25pi+56S65aSE55CG54q25oCB5Zu+5qCHXG5cdFx0aWYgYXV0b1N1Ym1pdHRlZCA9PSB0cnVlXG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV90aW1lb3V0X2F1dG9fc3VibWl0dGVkJywge30sIGxvY2FsZSlcblx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IHVuZGVmaW5lZFxuXHRcdHN3aXRjaCBhcHByb3ZlSnVkZ2Vcblx0XHRcdHdoZW4gJ2FwcHJvdmVkJ1xuXHRcdFx0XHQjIOW3suaguOWHhlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIGFwcHJvdmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JlamVjdGVkJ1xuXHRcdFx0XHQjIOW3sumps+WbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlamVjdGVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5raIXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgdGVybWluYXRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZWFzc2lnbmVkJ1xuXHRcdFx0XHQjIOi9rOetvuaguFxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlYXNzaWduZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0d2hlbiAncmVsb2NhdGVkJ1xuXHRcdFx0XHQjIOmHjeWumuS9jVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlbG9jYXRlZCcsIHt9LCBsb2NhbGUpXG5cdFx0XHR3aGVuICdyZXRyaWV2ZWQnXG5cdFx0XHRcdCMg5bey5Y+W5ZueXG5cdFx0XHRcdGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmV0cmlldmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JldHVybmVkJ1xuXHRcdFx0XHQjIOW3sumAgOWbnlxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJldHVybmVkJywge30sIGxvY2FsZSlcblx0XHRcdHdoZW4gJ3JlYWRlZCdcblx0XHRcdFx0IyDlt7LpmIVcblx0XHRcdFx0YXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWFkZWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRhcHByb3ZlU3RhdHVzVGV4dCA9ICcnXG5cdFx0XHRcdGJyZWFrXG5cdFx0YXBwcm92ZVN0YXR1c1RleHRcblx0XG5cdGdldEFwcHJvdmVKdWRnZUNsYXNzOiAoYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSAtPlxuXHRcdGlmIGF1dG9TdWJtaXR0ZWQgPT0gdHJ1ZVxuXHRcdFx0cmV0dXJuICdhdXRvU3VibWl0dGVkJ1xuXHRcdHJldHVybiBhcHByb3ZlSnVkZ2VcblxuXHRfdDogKGtleSktPlxuXHRcdHJldHVybiBUQVBpMThuLl9fKGtleSlcblxuXHRteUFwcHJvdmVEZXNjcmlwdGlvbjogKGFwcHJvdmVJZCktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRteUFwcHJvdmUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpPy5teUFwcHJvdmU/LmdldCgpXG5cdFx0XHRcdGlmIG15QXBwcm92ZSAmJiBteUFwcHJvdmUuaWQgPT0gYXBwcm92ZUlkXG5cdFx0XHRcdFx0aWYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKVxuXHRcdFx0XHRcdFx0cmV0dXJuIG15QXBwcm92ZT8uZGVzY3JpcHRpb24gfHwgXCJcIlxuXHRcdFx0XHRcdHJldHVybiBTZXNzaW9uLmdldChcImluc3RhbmNlX215X2FwcHJvdmVfZGVzY3JpcHRpb25cIilcblx0aXNGb3J3YXJkOiAoYXBwcm92ZWQpIC0+XG5cdFx0aWYgYXBwcm92ZWQgYW5kIGFwcHJvdmVkLnR5cGUgPT0gJ2ZvcndhcmQnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdHNob3dGb3J3YXJkRGVsZXRlQnV0dG9uOiAoYXBwcm92ZSkgLT5cblx0XHRpZiBkYi5pbnN0YW5jZXMuZmluZChhcHByb3ZlLmZvcndhcmRfaW5zdGFuY2UpLmNvdW50KCkgaXMgMFxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0aWYgYXBwcm92ZSBhbmQgYXBwcm92ZS50eXBlID09ICdmb3J3YXJkJyBhbmQgYXBwcm92ZS5mcm9tX3VzZXIgPT0gTWV0ZW9yLnVzZXJJZCgpIGFuZCAhU2Vzc2lvbi5nZXQoXCJpbnN0YW5jZVByaW50XCIpIGFuZCBhcHByb3ZlLmp1ZGdlIGlzbnQgJ3Rlcm1pbmF0ZWQnXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdGZhbHNlXG5cdG1hcmtEb3duVG9IdG1sOiAobWFya0Rvd25TdHJpbmcpLT5cblx0XHRpZiBtYXJrRG93blN0cmluZ1xuXHRcdFx0IyByZW5kZXJlciA9IG5ldyBNYXJrZG93bi5SZW5kZXJlcigpO1xuXHRcdFx0IyByZW5kZXJlci5saW5rID0gKCBocmVmLCB0aXRsZSwgdGV4dCApIC0+XG5cdFx0XHQjIFx0cmV0dXJuIFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9JyN7aHJlZn0nIHRpdGxlPScje3RpdGxlfSc+I3t0ZXh0fTwvYT5cIlxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1hcmtlZCA9IE5wbS5yZXF1aXJlKCdtYXJrZWQnKVxuXHRcdFx0cmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpXG5cdGlzRGlzdHJpYnV0ZTogKGFwcHJvdmUpIC0+XG5cdFx0aWYgYXBwcm92ZSBhbmQgYXBwcm92ZS50eXBlID09ICdkaXN0cmlidXRlJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRmYWxzZVxuXHRzaG93RGlzdHJpYnV0ZURlbGV0ZUJ1dHRvbjogKGFwcHJvdmUpIC0+XG5cdFx0aWYgZGIuaW5zdGFuY2VzLmZpbmQoYXBwcm92ZS5mb3J3YXJkX2luc3RhbmNlKS5jb3VudCgpIGlzIDBcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0aWYgYXBwcm92ZSBhbmQgYXBwcm92ZS50eXBlID09ICdkaXN0cmlidXRlJyBhbmQgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSBhbmQgYXBwcm92ZS5qdWRnZSBpc250ICd0ZXJtaW5hdGVkJ1xuXHRcdFx0IyDmtYHnqIvnrqHnkIblkZjlkozns7vnu5/nrqHnkIblkZjvvIzlj6/ku6XmiafooYzku7vkvZXmg4XlhrXkuIvnmoTmlofku7blj5bmtojliIblj5Fcblx0XHRcdGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGFwcHJvdmUuaW5zdGFuY2V9LCB7ZmllbGRzOiB7ZmxvdzogMSwgc3BhY2U6IDF9fSlcblx0XHRcdGlmIGlucyBhbmQgaW5zLmZsb3cgYW5kIGlucy5zcGFjZVxuXHRcdFx0XHRpZiBXb3JrZmxvd01hbmFnZXIuaGFzRmxvd0FkbWluUGVybWlzc2lvbihpbnMuZmxvdywgaW5zLnNwYWNlLCBNZXRlb3IudXNlcklkKCkpXG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblxuXHRcdFx0aWYgYXBwcm92ZS5mcm9tX3VzZXIgPT0gTWV0ZW9yLnVzZXJJZCgpXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cblx0XHRmYWxzZVxuXG5cdGZpbmlzaERhdGVTY2hlbWE6ICgpIC0+XG5cdFx0aWYgU3RlZWRvcy5pc0FuZHJvaWRPcklPUygpXG5cdFx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGZpbmlzaF9kYXRlOiB7XG5cdFx0XHRcdFx0YXV0b2Zvcm06IHtcblx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZXRpbWUtbG9jYWxcIlxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b3B0aW9uYWw6IGZhbHNlLFxuXHRcdFx0XHRcdHR5cGU6IERhdGVcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGZpbmlzaF9kYXRlOiB7XG5cdFx0XHRcdFx0YXV0b2Zvcm06IHtcblx0XHRcdFx0XHRcdHR5cGU6IFwiYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyXCJcblx0XHRcdFx0XHRcdHJlYWRvbmx5OiB0cnVlXG5cdFx0XHRcdFx0XHRkYXRlVGltZVBpY2tlck9wdGlvbnM6e1xuXHRcdFx0XHRcdFx0XHRmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbVwiLFxuXHRcdFx0XHRcdFx0XHRpZ25vcmVSZWFkb25seTp0cnVlLFxuXHRcdFx0XHRcdFx0XHRsb2NhbGU6IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIiksXG5cdFx0XHRcdFx0XHRcdHdpZGdldFBvc2l0aW9uaW5nOntcblx0XHRcdFx0XHRcdFx0XHRob3Jpem9udGFsOiAncmlnaHQnXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9wdGlvbmFsOiBmYWxzZSxcblx0XHRcdFx0XHR0eXBlOiBEYXRlXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cblx0ZmluaXNoRGF0ZVZhbHVlczogKCkgLT5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZmluaXNoX2RhdGU6dGhpcy5maW5pc2hfZGF0ZVxuXHRcdH07XG5cblx0IyMjXG4gICAgXHTmraTlh73mlbDnlKjkuo7mjqfliLbmmK/lkKbmmL7npLp0cmFjZXMgdmlld1xuICAgIFx0dHJ1ZTog5pi+56S6dHJhY2VzIHZpZXcs562+5qC45Y6G56iL5oyJ6ZKu54K55Ye75ZCO5piv55u05o6l5a6a5L2N5YiwdHJhY2VzIHZpZXdcbiAgICBcdGZhbHNlOiDkuI3mmL7npLp0cmFjZXMgdmlld++8jOetvuaguOWOhueoi+aMiemSrueCueWHu+WQjizku6VNb2RhbCDmlrnlvI/mmL7npLp0cmFjZXMgdmlld1xuXHQjIyNcblx0c2hvd1RyYWNlc1ZpZXc6IChmb3JtLCBmb3JtX3ZlcnNpb24pLT5cbiNcdFx0cmV0dXJuICEoSW5zdGFuY2VNYW5hZ2VyLmlzVGFibGVTdHlsZShmb3JtKSAmJiBJbnN0YW5jZWZvcm1UZW1wbGF0ZS5oZWxwZXJzLmluY2x1ZGVzT3BpbmlvbkZpZWxkKGZvcm0sIGZvcm1fdmVyc2lvbikpXG5cblx0XHRzaG93X21vZGFsX3RyYWNlc19saXN0ID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7c3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSwga2V5OiBcInNob3dfbW9kYWxfdHJhY2VzX2xpc3RcIn0pPy52YWx1ZXMgfHwgZmFsc2VcblxuXHRcdHJldHVybiAhc2hvd19tb2RhbF90cmFjZXNfbGlzdFxuXG5cdGdldEluc3RhbmNlU3RhdGVUZXh0OiAoaW5zdGFuY2VfaWQpLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdGlmIGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICd6aC1jbidcblx0XHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0ZWxzZVxuXHRcdFx0bG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKVxuXG5cdFx0aW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VfaWR9LCB7ZmllbGRzOiB7c3RhdGU6IDEsIGlzX3JlYWQ6IDF9fSlcblx0XHRpZiBub3QgaW5zXG5cdFx0XHRyZXR1cm4gVEFQaTE4bi5fXygnaW5zdGFuY2VfZGVsZXRlZCcsIHt9LCBsb2NhbGUpXG5cblx0XHR0ZXh0ID0gJydcblx0XHRpZiBpbnMuc3RhdGUgaXMgJ2NvbXBsZXRlZCdcblx0XHRcdHRleHQgPSBUQVBpMThuLl9fKCdjb21wbGV0ZWQnLCB7fSwgbG9jYWxlKVxuXHRcdGVsc2UgaWYgaW5zLnN0YXRlIGlzICdwZW5kaW5nJ1xuXHRcdFx0dGV4dCA9IFRBUGkxOG4uX18oJ3BlbmRpbmcnLCB7fSwgbG9jYWxlKVxuXHRcdGVsc2UgaWYgaW5zLnN0YXRlIGlzICdkcmFmdCdcblx0XHRcdGlmIGlucy5pc19yZWFkXG5cdFx0XHRcdHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX3JlYWQnLCB7fSwgbG9jYWxlKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0ZXh0ID0gVEFQaTE4bi5fXygnaW5zdGFuY2VfYXBwcm92ZV9ub3RfeWV0X2hhbmRsZWQnLCB7fSwgbG9jYWxlKVxuXG5cdFx0cmV0dXJuIHRleHRcblxuXHRnZXRJbnN0YW5jZVN0YXRlQ29sb3I6IChpbnN0YW5jZV9pZCktPlxuXHRcdGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlX2lkfSwge2ZpZWxkczoge3N0YXRlOiAxLCBpc19yZWFkOiAxfX0pXG5cdFx0aWYgbm90IGluc1xuXHRcdFx0cmV0dXJuIFwiXCJcblxuXHRcdGNsYSA9ICcnXG5cdFx0aWYgaW5zLnN0YXRlIGlzICdkcmFmdCdcblx0XHRcdGlmIGlucy5pc19yZWFkXG5cdFx0XHRcdGNsYSA9ICdibHVlJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjbGEgPSAncmVkJ1xuXHRcdHJldHVybiBjbGFcblxuXHRmaXJzdFRyYWNlOiAoaW5kZXgpLT5cblx0XHRyZXR1cm4gaW5kZXggaXMgMFxuXG5cdGxhc3RfZGlzdHJpYnV0ZV9mcm9tOiAoaW5zdGFuY2VfaWQpLT5cblx0XHRpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZV9pZCwgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOiB7JGV4aXN0czogdHJ1ZX19LHtmaWVsZHM6e2NyZWF0ZWQ6IDEsIGNyZWF0ZWRfYnk6IDF9fSlcblx0XHRpZiBpbnNcblx0XHRcdGRpc19pbmZvID0ge31cblx0XHRcdHVzZXIgPSB7fVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdHVzZXIgPSBVVWZsb3dfYXBpLmdldE5hbWVGb3JVc2VyKGlucy5jcmVhdGVkX2J5KVxuXHRcdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogaW5zLmNyZWF0ZWRfYnl9LCB7ZmllbGRzOiB7bmFtZTogMX19KVxuXG5cdFx0XHRpZiB1c2VyLm5hbWVcblx0XHRcdFx0ZGlzX2luZm8uZnJvbV91c2VyID0gdXNlci5faWRcblx0XHRcdFx0ZGlzX2luZm8uZnJvbV91c2VyX25hbWUgPSB1c2VyLm5hbWVcblx0XHRcdFx0ZGlzX2luZm8uY3JlYXRlZCA9IGlucy5jcmVhdGVkXG5cblx0XHRcdGlmIG5vdCBfLmlzRW1wdHkoZGlzX2luZm8pXG5cdFx0XHRcdHJldHVybiBkaXNfaW5mb1xuXHRcdHJldHVyblxuXG5cdGlzQ0NPckRpc3RyaWJ1dGVPckZvcndhcmRUZXJtaW5hdGVkOiAoYXBwcm92ZSktPlxuXHRcdGlmIChhcHByb3ZlLnR5cGUgaXMgJ2NjJyBvciBhcHByb3ZlLnR5cGUgaXMgJ2Rpc3RyaWJ1dGUnIG9yIGFwcHJvdmUudHlwZSBpcyAnZm9yd2FyZCcpIGFuZCBhcHByb3ZlLmp1ZGdlIGlzICd0ZXJtaW5hdGVkJ1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHRyZXR1cm4gZmFsc2VcblxuXHRqdWRnZVRlcm1pbmF0ZWQ6IChqdWRnZSktPlxuXHRcdHJldHVybiBqdWRnZSBpcyAndGVybWluYXRlZCdcblxuXHRpbnN0YW5jZUV4aXN0czogKGluc3RhbmNlX2lkKS0+XG5cdFx0cmV0dXJuICEhZGIuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2VfaWQpLmNvdW50KClcblxuXHRhZ2VudERlc2NyaXB0aW9uOiAodXNlck5hbWUpLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdGlmIGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09ICd6aC1jbidcblx0XHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0ZWxzZVxuXHRcdFx0bG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKVxuXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogdXNlck5hbWV9LCBsb2NhbGUpXG5cdFxuXHR0cmFjZU5hbWU6IChpbnN0YW5jZV9pZCwgdHJhY2VJZCktPlxuXHRcdHJldHVybiBfLmZpbmQoZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VfaWQsIHtmaWVsZHM6IHt0cmFjZXM6IDF9fSk/LnRyYWNlcywgKHRyYWNlKS0+XG5cdFx0XHRcdFx0cmV0dXJuIHRyYWNlLl9pZCA9PSAgdHJhY2VJZFxuXHRcdCk/Lm5hbWVcblxuXHRvYmplY3RVcmw6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpLT5cblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgYXBwX2lkKVxuXG5cdGhhbmRsZXJEb2M6IChoYW5kbGVySWQpLT5cblx0XHR1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYz8ud29ya2Zsb3c/LnVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm9cblx0XHRpZiAhdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mbyBvciAhdXNlcnNfY2FuX3JlYWRfY2NfaGFuZGxlcl9kZXRhaWxfaW5mby5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpXG5cdFx0XHRyZXR1cm5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBVVWZsb3dfYXBpLmdldENvbnRhY3RJbmZvRm9yVXNlcihoYW5kbGVySWQsIFNlc3Npb24uZ2V0KCdzcGFjZUlkJykpXG5cdFx0ZWxzZSBpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdHJldHVybiBkYi51c2Vycy5maW5kT25lKGhhbmRsZXJJZClcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuZGF0ZUZvcm1hdCA9IChkYXRlKS0+XG5cdFx0aWYgZGF0ZVxuXHRcdFx0dXRjT2Zmc2V0ID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLnV0Y09mZnNldFxuXHRcdFx0cmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKGRhdGUsIHV0Y09mZnNldCk7XG5cblx0VHJhY2VzVGVtcGxhdGUuaGVscGVycy5fdCA9IChrZXkpLT5cblx0XHRsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlXG5cdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKVxuXG5cdFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuc2hvd0RlbGV0ZUJ1dHRvbiA9IChhcHByb3ZlZCkgLT5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblRyYWNlc1RlbXBsYXRlLmV2ZW50cyA9XG5cdCdjbGljayAuY2MtYXBwcm92ZS1yZW1vdmUnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG5cdFx0aWYgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgKiAxICE9IDFcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMVxuXHRcdFx0JChcImlcIixldmVudC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcyhcImZhLXNwaW5cIilcblx0XHRcdGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpXG5cdFx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0XHQjIENBTEwg5Yig6ZmkYXBwcm92ZeWHveaVsOOAglxuXHRcdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRNZXRlb3IuY2FsbCAnY2NfcmVtb3ZlJywgaW5zdGFuY2VJZCwgYXBwcm92ZUlkLCAoZXJyLCByZXN1bHQpIC0+XG5cdFx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0XHRpZiBlcnJcblx0XHRcdFx0XHR0b2FzdHIuZXJyb3IgZXJyXG5cdFx0XHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNhbGxpbmcgPSAwXG5cdFx0XHRcdFx0JChcImlcIixldmVudC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcyhcImZhLXNwaW5cIilcblx0XHRcdFx0aWYgcmVzdWx0ID09IHRydWVcblx0XHRcdFx0XHR0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwicmVtb3ZlX2NjX2FwcHJvdmVcIikpO1xuXHRcdFx0XHRcdGlmICQoXCIuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsXCIpLmxlbmd0aFxuXHRcdFx0XHRcdFx0TW9kYWwuaGlkZSBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0cmV0dXJuXG5cblx0J2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1jYy1hcHByb3ZlLXJlbW92ZSc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0IyAjIENBTEwg5Yig6ZmkYXBwcm92ZeWHveaVsOOAglxuXHRcdCMgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0IyBNZXRlb3IuY2FsbCAnY2NfcmVtb3ZlJywgaW5zdGFuY2VJZCwgYXBwcm92ZUlkLCAoZXJyLCByZXN1bHQpIC0+XG5cdFx0IyBcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdCMgXHRpZiBlcnJcblx0XHQjIFx0XHR0b2FzdHIuZXJyb3IgZXJyXG5cdFx0IyBcdGlmIHJlc3VsdCA9PSB0cnVlXG5cdFx0IyBcdFx0dG9hc3RyLnN1Y2Nlc3MoVEFQaTE4bi5fXyhcInJlbW92ZV9jY19hcHByb3ZlXCIpKTtcblx0XHQjIFx0XHRNb2RhbC5oaWRlIFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCJcblx0XHQjIFx0cmV0dXJuXG5cdFx0IyByZXR1cm5cblx0XHRNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZVxuXHRcdE1vZGFsLnNob3cgJ2NhbmNlbF9jY19tb2RhbCdcblxuXHQnY2xpY2sgLmFwcHJvdmUtaXRlbSwuYXBwcm92ZS1kZXNjcmlwdGlvbic6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0IyBQQ+S4iumTvuaOpeWFgeiuuOebtOaOpeeCueW8gO+8jOS4jeWGjeaJk+W8gOetvuaJueWOhueoi+ivpue7hlxuXHRcdHVubGVzcyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoXG5cdFx0XHRNb2RhbC5zaG93IFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXNcblxuXHQndGFwaG9sZCAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIOaJi+acuuS4iumVv+aMieaJk+W8gOetvuaJueWOhueoi+ivpue7hu+8jOWmguaenOaYr+mTvuaOpemVv+aMieaJk+W8gOWQjuS4gOaUvuaJi+eql+WPo+WwseWPiOWFs+aOieS6hu+8jOaJgOS7peS4jeiuqemTvuaOpeaJk+W8gOetvuaJueWOhueoi+ivpue7hlxuXHRcdHVubGVzcyAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoXG5cdFx0XHRNb2RhbC5zaG93IFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXNcblxuXHQnY2xpY2sgLmFwcHJvdmUtaXRlbSBhLmJ0bi1saW5rLC5hcHByb3ZlLWRlc2NyaXB0aW9uIGEuYnRuLWxpbmssLmFwcHJvdmUtaXRlbS1kaXN0cmlidXRlIGEuYnRuLWxpbmsnOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMg5omL5py65LiK54K55Ye76ZO+5o6l77yM5by55Ye65paw56qX5Y+j77yM5LiN5pSv5oyB77yM5Zug5Li6YW5kcm9pZOS4iuS8muW8ueWHuueZu+W9leeVjOmdolxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0dXNlcklkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQ/LnRhcmdldF91c2VyX2lkXG5cdFx0XHRDcmVhdG9yLm9wZW5TYWZlT2JqZWN0VXJsKCd1c2VycycsIHVzZXJJZClcblxuXHQndGFwZW5kIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXHRcdCMg5LiK6L+w6ZW/5oyJ5omT5byAYXBwcm92Zeivpue7hueql+WPo+eahOS6i+S7tnRhcGhvbGTkvJrop6blj5HmiZPlvIDnqpflj6PlkI7nmoR0b3VjaGVuZOS6i+S7tu+8jOmAoOaIkOmVv+aMieaJk+W8gOeql+WPo+WQjuS4gOaUvuaJi+eql+WPo+WwseWPiOWFs+aOieS6hlxuXHRcdCMg6L+Z6YeM5Y+q6IO96YCa6L+H6Zi75q2idGFwZW5k5LqL5Lu2KOS4jeWPr+S7peeUqHRvdWNoZW5k5LqL5Lu277yM5Zug5Li65Lya5b2x5ZONdGFwaG9sZOWKn+iDve+8jOmAoOaIkOayoeaciemVv+aMieaViOaenOaXtuS5n+S8muinpuWPkXRhcGhvbGTkuovku7Yp5YaS5rOh5p2l6YG/5YWN6Zeu6aKY44CCXG5cdFx0IyDpk77mjqXlhYHorrjnm7TmjqXngrnlvIBcblx0XHR1bmxlc3MgJChldmVudC50YXJnZXQpLmNsb3Nlc3QoXCJhLmJ0bi1saW5rXCIpLmxlbmd0aFxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KClcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdCdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZm9yd2FyZC1hcHByb3ZlLXJlbW92ZSc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0dHJhY2VJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnRyYWNlXG5cdFx0IyBDQUxMIOWIoOmZpGFwcHJvdmXlh73mlbDjgIJcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIilcblx0XHRNZXRlb3IuY2FsbCAnZm9yd2FyZF9yZW1vdmUnLCBpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIChlcnIsIHJlc3VsdCkgLT5cblx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0aWYgZXJyXG5cdFx0XHRcdHRvYXN0ci5lcnJvciBUQVBpMThuLl9fKGVyci5yZWFzb24pXG5cdFx0XHRpZiByZXN1bHQgPT0gdHJ1ZVxuXHRcdFx0XHR0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwiaW5zdGFuY2VfYXBwcm92ZV9mb3J3YXJkX3JlbW92ZV9zdWNjZXNzXCIpKTtcblx0XHRcdFx0TW9kYWwuaGlkZSBcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiXG5cdFx0XHRyZXR1cm5cblx0XHRyZXR1cm5cblxuXHQnY2xpY2sgLmluc3RhbmNlLXRyYWNlLWRldGFpbC1tb2RhbCAuYnRuLWZvcndhcmQtaW5zdGFuY2UtbG9vayc6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0Zm9yd2FyZF9zcGFjZSA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmZvcndhcmRzcGFjZVxuXHRcdGZvcndhcmRfaW5zdGFuY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5mb3J3YXJkaW5zdGFuY2Vcblx0XHRTdGVlZG9zLm9wZW5XaW5kb3coU3RlZWRvcy5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgZm9yd2FyZF9zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBmb3J3YXJkX2luc3RhbmNlKSlcblxuXHQnY2xpY2sgLmJ0bi1tb2RpZmljYXRpb24nXHQ6IChldmVudCwgdGVtcGxhdGUpIC0+XG5cdFx0dGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuXHRcdHVubGVzcyBTdGVlZG9zLmlzQW5kcm9pZE9ySU9TKClcblx0XHRcdFRyYWNrZXIuYWZ0ZXJGbHVzaCAtPlxuXHRcdFx0XHQjIOaYvuekuuaXpeW/l+eahOaXtuWAmeaKiua7muWKqOadoeW+gOS4i+enu+eCue+8jOiuqeaXpeacn+aOp+S7tuaYvuekuuWHuuS4gOmDqOWIhu+8jOS7pemBv+WFjeeUqOaIt+eci+S4jeWIsOaXpeacn+aOp+S7tlxuXHRcdFx0XHQkKFwiI2luc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbCAjZmluaXNoX2lucHV0XCIpLm9uIFwiZHAuc2hvd1wiLCAoKSAtPlxuXHRcdFx0XHRcdCQoXCIubW9kYWwtYm9keVwiKS5zY3JvbGxUb3AoMTAwKVxuXG5cdCdjbGljayAuYnRuLWNhbmNlbEJ1dCcgOiAoZXZlbnQsIHRlbXBsYXRlKSAtPlxuXG5cdFx0dGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuXG5cdCdjbGljayAuYnRuLXNhdmVCdXQnIDogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHQjIHRlbXBsYXRlLmlzX2VkaXRpbmcuc2V0KCF0ZW1wbGF0ZS5pc19lZGl0aW5nLmdldCgpKVxuXG5cdFx0aW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJylcblx0XHRhcHByb3ZlSWQgPSBldmVudC50YXJnZXQuZGF0YXNldC5hcHByb3ZlXG5cdFx0dHJhY2VJZCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnRyYWNlXG5cdFx0b3Bpbmlvbl9pbnB1dCA9ICQoJyNvcGluaW9uX2lucHV0JykudmFsKClcblx0XHRmaW5pc2hfaW5wdXQgPSBBdXRvRm9ybS5nZXRGaWVsZFZhbHVlKFwiZmluaXNoX2RhdGVcIiwgXCJmaW5pc2hEYXRlQXV0b0Zvcm1cIilcblxuXHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKVxuXHRcdE1ldGVvci5jYWxsICdjaGFuZ2VfYXBwcm92ZV9pbmZvJywgaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBvcGluaW9uX2lucHV0LCBmaW5pc2hfaW5wdXQsIChlcnIsIHJlc3VsdCktPlxuXHRcdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRpZiBlcnJcblx0XHRcdFx0dG9hc3RyLmVycm9yIFRBUGkxOG4uX18oZXJyLnJlYXNvbilcblx0XHRcdGlmIHJlc3VsdCA9PSB0cnVlXG5cdFx0XHRcdHRvYXN0ci5zdWNjZXNzKHQoXCJpbnN0YW5jZV9hcHByb3ZlX21vZGFsX21vZGlmaWNhdGlvbnNhdmVcIikpXG5cdFx0XHRcdE1vZGFsLmhpZGUgXCJpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWxcIlxuXHRcdFx0cmV0dXJuXG5cblx0J2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1kaXN0cmlidXRlLWFwcHJvdmUtcmVtb3ZlJzogKGV2ZW50LCB0ZW1wbGF0ZSkgLT5cblx0XHRNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZVxuXHRcdE1vZGFsLnNob3cgJ2NhbmNlbF9kaXN0cmlidXRlX21vZGFsJ1xuIiwidmFyIG1hcmtlZDtcblxubWFya2VkID0gcmVxdWlyZShcIm1hcmtlZFwiKTtcblxuVHJhY2VzVGVtcGxhdGUuaGVscGVycyA9IHtcbiAgdHJhY2VTaG93U2lnbkltYWdlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93LnRyYWNlU2hvd1NpZ25JbWFnZSAhPT0gZmFsc2UgJiYgTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndvcmtmbG93LnRyYWNlU2hvd1NpZ25JbWFnZSAhPT0gJ2ZhbHNlJztcbiAgfSxcbiAgZXF1YWxzOiBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH0sXG4gIGVtcHR5OiBmdW5jdGlvbihhKSB7XG4gICAgaWYgKGEpIHtcbiAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCA8IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgdW5lbXB0eTogZnVuY3Rpb24oYSkge1xuICAgIGlmIChhKSB7XG4gICAgICByZXR1cm4gYS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBhcHBlbmQ6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYSArIGI7XG4gIH0sXG4gIGRhdGVGb3JtYXQ6IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpICYmIChkYXRlICE9IG51bGwgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOiB2b2lkIDApID09PSAobmV3IERhdGUpLmdldEZ1bGxZZWFyKCkpIHtcbiAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdNTS1ERCBISDptbScpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgIH1cbiAgfSxcbiAgZ2V0U3RlcE5hbWU6IGZ1bmN0aW9uKHN0ZXBJZCkge1xuICAgIHZhciBzdGVwO1xuICAgIHN0ZXAgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2VTdGVwKHN0ZXBJZCk7XG4gICAgaWYgKHN0ZXApIHtcbiAgICAgIHJldHVybiBzdGVwLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBzaG93RGVsZXRlQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIGlmIChhcHByb3ZlZCAmJiBhcHByb3ZlZC50eXBlID09PSAnY2MnICYmIGFwcHJvdmVkLmZyb21fdXNlciA9PT0gTWV0ZW9yLnVzZXJJZCgpICYmIGFwcHJvdmVkLmlzX2ZpbmlzaGVkICE9PSB0cnVlICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzU2hvd01vZGlmaWNhdGlvbkJ1dHRvbjogZnVuY3Rpb24oYXBwcm92ZWQpIHtcbiAgICB2YXIgYXBwcm92ZV9hZG1pbnMsIGlzU2hvdywgcmVmLCByZWYxLCByZWYyO1xuICAgIGFwcHJvdmVfYWRtaW5zID0gKHJlZiA9IE1ldGVvci5zZXR0aW5ncykgIT0gbnVsbCA/IChyZWYxID0gcmVmW1wicHVibGljXCJdKSAhPSBudWxsID8gKHJlZjIgPSByZWYxLndvcmtmbG93KSAhPSBudWxsID8gcmVmMi5hcHByb3ZlX2FkbWlucyA6IHZvaWQgMCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICBpZiAoYXBwcm92ZV9hZG1pbnMgIT0gbnVsbCA/IGFwcHJvdmVfYWRtaW5zLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgaXNTaG93ID0gYXBwcm92ZV9hZG1pbnMgIT0gbnVsbCA/IGFwcHJvdmVfYWRtaW5zLmNvbnRhaW5zKE1ldGVvci51c2VySWQoKSkgOiB2b2lkIDA7XG4gICAgfVxuICAgIGlmICghaXNTaG93KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlZC5oYW5kbGVyID09PSBNZXRlb3IudXNlcklkKCk7XG4gIH0sXG4gIGlzRWRpdGluZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlZjtcbiAgICByZXR1cm4gKHJlZiA9IFRlbXBsYXRlLmluc3RhbmNlKCkuaXNfZWRpdGluZykgIT0gbnVsbCA/IHJlZi5nZXQoKSA6IHZvaWQgMDtcbiAgfSxcbiAgaXNTaG93RGVzY3JpcHRpb246IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgdmFyIHJlZjtcbiAgICBpZiAoVHJhY2VzVGVtcGxhdGUuaGVscGVycy5pc1Nob3dNb2RpZmljYXRpb25CdXR0b24oYXBwcm92ZWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICgocmVmID0gYXBwcm92ZWQuZGVzY3JpcHRpb24pICE9IG51bGwgPyByZWYudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoIDogdm9pZCAwKSA+IDA7XG4gIH0sXG4gIGlzQ0M6IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgaWYgKGFwcHJvdmVkICYmIGFwcHJvdmVkLnR5cGUgPT09ICdjYycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGdldEFwcHJvdmVTdGF0dXNJY29uOiBmdW5jdGlvbihhcHByb3ZlSnVkZ2UsIGF1dG9TdWJtaXR0ZWQpIHtcbiAgICB2YXIgYXBwcm92ZVN0YXR1c0ljb247XG4gICAgaWYgKGF1dG9TdWJtaXR0ZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnaW9uIGlvbi1hbmRyb2lkLWFsYXJtLWNsb2NrJztcbiAgICB9XG4gICAgYXBwcm92ZVN0YXR1c0ljb24gPSB2b2lkIDA7XG4gICAgc3dpdGNoIChhcHByb3ZlSnVkZ2UpIHtcbiAgICAgIGNhc2UgJ2FwcHJvdmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jaGVja21hcmstcm91bmQnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlamVjdGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnaW9uIGlvbi1jbG9zZS1yb3VuZCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGVybWluYXRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2ZhIGZhLWJhbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVhc3NpZ25lZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNJY29uID0gJ2lvbiBpb24tYW5kcm9pZC1jb250YWN0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWxvY2F0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzSWNvbiA9ICdpb24gaW9uLWFycm93LXNocmluayc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmV0cmlldmVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnZmEgZmEtdW5kbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXBwcm92ZVN0YXR1c0ljb24gPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlU3RhdHVzSWNvbjtcbiAgfSxcbiAgZ2V0QXBwcm92ZVN0YXR1c1RleHQ6IGZ1bmN0aW9uKGFwcHJvdmVKdWRnZSwgYXV0b1N1Ym1pdHRlZCkge1xuICAgIHZhciBhcHByb3ZlU3RhdHVzVGV4dCwgbG9jYWxlO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGU7XG4gICAgICBpZiAobG9jYWxlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09ICd6aC1jbicpIHtcbiAgICAgICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpO1xuICAgIH1cbiAgICBpZiAoYXV0b1N1Ym1pdHRlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oJ2luc3RhbmNlX2FwcHJvdmVfdGltZW91dF9hdXRvX3N1Ym1pdHRlZCcsIHt9LCBsb2NhbGUpO1xuICAgIH1cbiAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IHZvaWQgMDtcbiAgICBzd2l0Y2ggKGFwcHJvdmVKdWRnZSkge1xuICAgICAgY2FzZSAnYXBwcm92ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIGFwcHJvdmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVqZWN0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlamVjdGVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGVybWluYXRlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgdGVybWluYXRlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlYXNzaWduZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlYXNzaWduZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWxvY2F0ZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJlbG9jYXRlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JldHJpZXZlZCc6XG4gICAgICAgIGFwcHJvdmVTdGF0dXNUZXh0ID0gVEFQaTE4bi5fXygnSW5zdGFuY2UgU3RhdGUgcmV0cmlldmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmV0dXJuZWQnOlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9IFRBUGkxOG4uX18oJ0luc3RhbmNlIFN0YXRlIHJldHVybmVkJywge30sIGxvY2FsZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVhZGVkJzpcbiAgICAgICAgYXBwcm92ZVN0YXR1c1RleHQgPSBUQVBpMThuLl9fKCdJbnN0YW5jZSBTdGF0ZSByZWFkZWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcHByb3ZlU3RhdHVzVGV4dCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGFwcHJvdmVTdGF0dXNUZXh0O1xuICB9LFxuICBnZXRBcHByb3ZlSnVkZ2VDbGFzczogZnVuY3Rpb24oYXBwcm92ZUp1ZGdlLCBhdXRvU3VibWl0dGVkKSB7XG4gICAgaWYgKGF1dG9TdWJtaXR0ZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnYXV0b1N1Ym1pdHRlZCc7XG4gICAgfVxuICAgIHJldHVybiBhcHByb3ZlSnVkZ2U7XG4gIH0sXG4gIF90OiBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuICB9LFxuICBteUFwcHJvdmVEZXNjcmlwdGlvbjogZnVuY3Rpb24oYXBwcm92ZUlkKSB7XG4gICAgdmFyIG15QXBwcm92ZSwgcmVmLCByZWYxO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICBteUFwcHJvdmUgPSAocmVmID0gVGVtcGxhdGUuaW5zdGFuY2UoKSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLm15QXBwcm92ZSkgIT0gbnVsbCA/IHJlZjEuZ2V0KCkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIGlmIChteUFwcHJvdmUgJiYgbXlBcHByb3ZlLmlkID09PSBhcHByb3ZlSWQpIHtcbiAgICAgICAgICBpZiAoIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIChteUFwcHJvdmUgIT0gbnVsbCA/IG15QXBwcm92ZS5kZXNjcmlwdGlvbiA6IHZvaWQgMCkgfHwgXCJcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFNlc3Npb24uZ2V0KFwiaW5zdGFuY2VfbXlfYXBwcm92ZV9kZXNjcmlwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgaXNGb3J3YXJkOiBmdW5jdGlvbihhcHByb3ZlZCkge1xuICAgIGlmIChhcHByb3ZlZCAmJiBhcHByb3ZlZC50eXBlID09PSAnZm9yd2FyZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNob3dGb3J3YXJkRGVsZXRlQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKGRiLmluc3RhbmNlcy5maW5kKGFwcHJvdmUuZm9yd2FyZF9pbnN0YW5jZSkuY291bnQoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXBwcm92ZSAmJiBhcHByb3ZlLnR5cGUgPT09ICdmb3J3YXJkJyAmJiBhcHByb3ZlLmZyb21fdXNlciA9PT0gTWV0ZW9yLnVzZXJJZCgpICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgJiYgYXBwcm92ZS5qdWRnZSAhPT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBtYXJrRG93blRvSHRtbDogZnVuY3Rpb24obWFya0Rvd25TdHJpbmcpIHtcbiAgICBpZiAobWFya0Rvd25TdHJpbmcpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgbWFya2VkID0gTnBtLnJlcXVpcmUoJ21hcmtlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNwYWNlYmFycy5TYWZlU3RyaW5nKG1hcmtlZC5wYXJzZShtYXJrRG93blN0cmluZykpO1xuICAgIH1cbiAgfSxcbiAgaXNEaXN0cmlidXRlOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgaWYgKGFwcHJvdmUgJiYgYXBwcm92ZS50eXBlID09PSAnZGlzdHJpYnV0ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNob3dEaXN0cmlidXRlRGVsZXRlQnV0dG9uOiBmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoZGIuaW5zdGFuY2VzLmZpbmQoYXBwcm92ZS5mb3J3YXJkX2luc3RhbmNlKS5jb3VudCgpID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcHByb3ZlICYmIGFwcHJvdmUudHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikgJiYgYXBwcm92ZS5qdWRnZSAhPT0gJ3Rlcm1pbmF0ZWQnKSB7XG4gICAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogYXBwcm92ZS5pbnN0YW5jZVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBmbG93OiAxLFxuICAgICAgICAgIHNwYWNlOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGlucyAmJiBpbnMuZmxvdyAmJiBpbnMuc3BhY2UpIHtcbiAgICAgICAgaWYgKFdvcmtmbG93TWFuYWdlci5oYXNGbG93QWRtaW5QZXJtaXNzaW9uKGlucy5mbG93LCBpbnMuc3BhY2UsIE1ldGVvci51c2VySWQoKSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFwcHJvdmUuZnJvbV91c2VyID09PSBNZXRlb3IudXNlcklkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZmluaXNoRGF0ZVNjaGVtYTogZnVuY3Rpb24oKSB7XG4gICAgaWYgKFN0ZWVkb3MuaXNBbmRyb2lkT3JJT1MoKSkge1xuICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTY2hlbWEoe1xuICAgICAgICBmaW5pc2hfZGF0ZToge1xuICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICB0eXBlOiBcImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbmFsOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBEYXRlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZVNjaGVtYSh7XG4gICAgICAgIGZpbmlzaF9kYXRlOiB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyXCIsXG4gICAgICAgICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGVUaW1lUGlja2VyT3B0aW9uczoge1xuICAgICAgICAgICAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbVwiLFxuICAgICAgICAgICAgICBpZ25vcmVSZWFkb25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgbG9jYWxlOiBTZXNzaW9uLmdldChcIlRBUGkxOG46OmxvYWRlZF9sYW5nXCIpLFxuICAgICAgICAgICAgICB3aWRnZXRQb3NpdGlvbmluZzoge1xuICAgICAgICAgICAgICAgIGhvcml6b250YWw6ICdyaWdodCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IERhdGVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBmaW5pc2hEYXRlVmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmluaXNoX2RhdGU6IHRoaXMuZmluaXNoX2RhdGVcbiAgICB9O1xuICB9LFxuXG4gIC8qXG4gICAgIFx05q2k5Ye95pWw55So5LqO5o6n5Yi25piv5ZCm5pi+56S6dHJhY2VzIHZpZXdcbiAgICAgXHR0cnVlOiDmmL7npLp0cmFjZXMgdmlldyznrb7moLjljobnqIvmjInpkq7ngrnlh7vlkI7mmK/nm7TmjqXlrprkvY3liLB0cmFjZXMgdmlld1xuICAgICBcdGZhbHNlOiDkuI3mmL7npLp0cmFjZXMgdmlld++8jOetvuaguOWOhueoi+aMiemSrueCueWHu+WQjizku6VNb2RhbCDmlrnlvI/mmL7npLp0cmFjZXMgdmlld1xuICAgKi9cbiAgc2hvd1RyYWNlc1ZpZXc6IGZ1bmN0aW9uKGZvcm0sIGZvcm1fdmVyc2lvbikge1xuICAgIHZhciByZWYsIHNob3dfbW9kYWxfdHJhY2VzX2xpc3Q7XG4gICAgc2hvd19tb2RhbF90cmFjZXNfbGlzdCA9ICgocmVmID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7XG4gICAgICBzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLFxuICAgICAga2V5OiBcInNob3dfbW9kYWxfdHJhY2VzX2xpc3RcIlxuICAgIH0pKSAhPSBudWxsID8gcmVmLnZhbHVlcyA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgcmV0dXJuICFzaG93X21vZGFsX3RyYWNlc19saXN0O1xuICB9LFxuICBnZXRJbnN0YW5jZVN0YXRlVGV4dDogZnVuY3Rpb24oaW5zdGFuY2VfaWQpIHtcbiAgICB2YXIgaW5zLCBsb2NhbGUsIHRleHQ7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgbG9jYWxlID0gVGVtcGxhdGUuaW5zdGFuY2UoKS52aWV3LnRlbXBsYXRlLnN0ZWVkb3NEYXRhLmxvY2FsZTtcbiAgICAgIGlmIChsb2NhbGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvY2FsZSA9IFNlc3Npb24uZ2V0KFwiVEFQaTE4bjo6bG9hZGVkX2xhbmdcIik7XG4gICAgfVxuICAgIGlucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VfaWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgc3RhdGU6IDEsXG4gICAgICAgIGlzX3JlYWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWlucykge1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oJ2luc3RhbmNlX2RlbGV0ZWQnLCB7fSwgbG9jYWxlKTtcbiAgICB9XG4gICAgdGV4dCA9ICcnO1xuICAgIGlmIChpbnMuc3RhdGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgICB0ZXh0ID0gVEFQaTE4bi5fXygnY29tcGxldGVkJywge30sIGxvY2FsZSk7XG4gICAgfSBlbHNlIGlmIChpbnMuc3RhdGUgPT09ICdwZW5kaW5nJykge1xuICAgICAgdGV4dCA9IFRBUGkxOG4uX18oJ3BlbmRpbmcnLCB7fSwgbG9jYWxlKTtcbiAgICB9IGVsc2UgaWYgKGlucy5zdGF0ZSA9PT0gJ2RyYWZ0Jykge1xuICAgICAgaWYgKGlucy5pc19yZWFkKSB7XG4gICAgICAgIHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX3JlYWQnLCB7fSwgbG9jYWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgPSBUQVBpMThuLl9fKCdpbnN0YW5jZV9hcHByb3ZlX25vdF95ZXRfaGFuZGxlZCcsIHt9LCBsb2NhbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfSxcbiAgZ2V0SW5zdGFuY2VTdGF0ZUNvbG9yOiBmdW5jdGlvbihpbnN0YW5jZV9pZCkge1xuICAgIHZhciBjbGEsIGlucztcbiAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlX2lkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHN0YXRlOiAxLFxuICAgICAgICBpc19yZWFkOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFpbnMpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjbGEgPSAnJztcbiAgICBpZiAoaW5zLnN0YXRlID09PSAnZHJhZnQnKSB7XG4gICAgICBpZiAoaW5zLmlzX3JlYWQpIHtcbiAgICAgICAgY2xhID0gJ2JsdWUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhID0gJ3JlZCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGE7XG4gIH0sXG4gIGZpcnN0VHJhY2U6IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgcmV0dXJuIGluZGV4ID09PSAwO1xuICB9LFxuICBsYXN0X2Rpc3RyaWJ1dGVfZnJvbTogZnVuY3Rpb24oaW5zdGFuY2VfaWQpIHtcbiAgICB2YXIgZGlzX2luZm8sIGlucywgdXNlcjtcbiAgICBpbnMgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICBfaWQ6IGluc3RhbmNlX2lkLFxuICAgICAgZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlOiB7XG4gICAgICAgICRleGlzdHM6IHRydWVcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgY3JlYXRlZDogMSxcbiAgICAgICAgY3JlYXRlZF9ieTogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChpbnMpIHtcbiAgICAgIGRpc19pbmZvID0ge307XG4gICAgICB1c2VyID0ge307XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHVzZXIgPSBVVWZsb3dfYXBpLmdldE5hbWVGb3JVc2VyKGlucy5jcmVhdGVkX2J5KTtcbiAgICAgIH0gZWxzZSBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgICBfaWQ6IGlucy5jcmVhdGVkX2J5XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXIubmFtZSkge1xuICAgICAgICBkaXNfaW5mby5mcm9tX3VzZXIgPSB1c2VyLl9pZDtcbiAgICAgICAgZGlzX2luZm8uZnJvbV91c2VyX25hbWUgPSB1c2VyLm5hbWU7XG4gICAgICAgIGRpc19pbmZvLmNyZWF0ZWQgPSBpbnMuY3JlYXRlZDtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc0VtcHR5KGRpc19pbmZvKSkge1xuICAgICAgICByZXR1cm4gZGlzX2luZm87XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpc0NDT3JEaXN0cmlidXRlT3JGb3J3YXJkVGVybWluYXRlZDogZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgIGlmICgoYXBwcm92ZS50eXBlID09PSAnY2MnIHx8IGFwcHJvdmUudHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnIHx8IGFwcHJvdmUudHlwZSA9PT0gJ2ZvcndhcmQnKSAmJiBhcHByb3ZlLmp1ZGdlID09PSAndGVybWluYXRlZCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGp1ZGdlVGVybWluYXRlZDogZnVuY3Rpb24oanVkZ2UpIHtcbiAgICByZXR1cm4ganVkZ2UgPT09ICd0ZXJtaW5hdGVkJztcbiAgfSxcbiAgaW5zdGFuY2VFeGlzdHM6IGZ1bmN0aW9uKGluc3RhbmNlX2lkKSB7XG4gICAgcmV0dXJuICEhZGIuaW5zdGFuY2VzLmZpbmQoaW5zdGFuY2VfaWQpLmNvdW50KCk7XG4gIH0sXG4gIGFnZW50RGVzY3JpcHRpb246IGZ1bmN0aW9uKHVzZXJOYW1lKSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgICAgaWYgKGxvY2FsZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSAnemgtY24nKSB7XG4gICAgICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxlID0gU2Vzc2lvbi5nZXQoXCJUQVBpMThuOjpsb2FkZWRfbGFuZ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHtcbiAgICAgIHVzZXJOYW1lOiB1c2VyTmFtZVxuICAgIH0sIGxvY2FsZSk7XG4gIH0sXG4gIHRyYWNlTmFtZTogZnVuY3Rpb24oaW5zdGFuY2VfaWQsIHRyYWNlSWQpIHtcbiAgICB2YXIgcmVmLCByZWYxO1xuICAgIHJldHVybiAocmVmID0gXy5maW5kKChyZWYxID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VfaWQsIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICB0cmFjZXM6IDFcbiAgICAgIH1cbiAgICB9KSkgIT0gbnVsbCA/IHJlZjEudHJhY2VzIDogdm9pZCAwLCBmdW5jdGlvbih0cmFjZSkge1xuICAgICAgcmV0dXJuIHRyYWNlLl9pZCA9PT0gdHJhY2VJZDtcbiAgICB9KSkgIT0gbnVsbCA/IHJlZi5uYW1lIDogdm9pZCAwO1xuICB9LFxuICBvYmplY3RVcmw6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGFwcF9pZCkge1xuICAgIHJldHVybiBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBhcHBfaWQpO1xuICB9LFxuICBoYW5kbGVyRG9jOiBmdW5jdGlvbihoYW5kbGVySWQpIHtcbiAgICB2YXIgcmVmLCByZWYxLCB1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvO1xuICAgIHVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdKSAhPSBudWxsID8gKHJlZjEgPSByZWYud29ya2Zsb3cpICE9IG51bGwgPyByZWYxLnVzZXJzX2Nhbl9yZWFkX2NjX2hhbmRsZXJfZGV0YWlsX2luZm8gOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgaWYgKCF1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvIHx8ICF1c2Vyc19jYW5fcmVhZF9jY19oYW5kbGVyX2RldGFpbF9pbmZvLmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgcmV0dXJuIFVVZmxvd19hcGkuZ2V0Q29udGFjdEluZm9Gb3JVc2VyKGhhbmRsZXJJZCwgU2Vzc2lvbi5nZXQoJ3NwYWNlSWQnKSk7XG4gICAgfSBlbHNlIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBkYi51c2Vycy5maW5kT25lKGhhbmRsZXJJZCk7XG4gICAgfVxuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgdXRjT2Zmc2V0O1xuICAgIGlmIChkYXRlKSB7XG4gICAgICB1dGNPZmZzZXQgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEudXRjT2Zmc2V0O1xuICAgICAgcmV0dXJuIEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5mb3JtYXREYXRlKGRhdGUsIHV0Y09mZnNldCk7XG4gICAgfVxuICB9O1xuICBUcmFjZXNUZW1wbGF0ZS5oZWxwZXJzLl90ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgIHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSk7XG4gIH07XG4gIFRyYWNlc1RlbXBsYXRlLmhlbHBlcnMuc2hvd0RlbGV0ZUJ1dHRvbiA9IGZ1bmN0aW9uKGFwcHJvdmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG5UcmFjZXNUZW1wbGF0ZS5ldmVudHMgPSB7XG4gICdjbGljayAuY2MtYXBwcm92ZS1yZW1vdmUnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgYXBwcm92ZUlkLCBpbnN0YW5jZUlkO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQuY2FsbGluZyAqIDEgIT09IDEpIHtcbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMTtcbiAgICAgICQoXCJpXCIsIGV2ZW50LmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKFwiZmEtc3BpblwiKTtcbiAgICAgIGluc3RhbmNlSWQgPSBTZXNzaW9uLmdldCgnaW5zdGFuY2VJZCcpO1xuICAgICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgIE1ldGVvci5jYWxsKCdjY19yZW1vdmUnLCBpbnN0YW5jZUlkLCBhcHByb3ZlSWQsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHRvYXN0ci5lcnJvcihlcnIpO1xuICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jYWxsaW5nID0gMDtcbiAgICAgICAgICAkKFwiaVwiLCBldmVudC5jdXJyZW50VGFyZ2V0KS5yZW1vdmVDbGFzcyhcImZhLXNwaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRvYXN0ci5zdWNjZXNzKFRBUGkxOG4uX18oXCJyZW1vdmVfY2NfYXBwcm92ZVwiKSk7XG4gICAgICAgICAgaWYgKCQoXCIuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsXCIpLmxlbmd0aCkge1xuICAgICAgICAgICAgTW9kYWwuaGlkZShcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1jYy1hcHByb3ZlLXJlbW92ZSc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBhcHByb3ZlSWQsIGluc3RhbmNlSWQ7XG4gICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICBNb2RhbC5hbGxvd011bHRpcGxlID0gdHJ1ZTtcbiAgICByZXR1cm4gTW9kYWwuc2hvdygnY2FuY2VsX2NjX21vZGFsJyk7XG4gIH0sXG4gICdjbGljayAuYXBwcm92ZS1pdGVtLC5hcHByb3ZlLWRlc2NyaXB0aW9uJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgaWYgKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChcImEuYnRuLWxpbmtcIikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gTW9kYWwuc2hvdyhcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiLCB0aGlzKTtcbiAgICB9XG4gIH0sXG4gICd0YXBob2xkIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICBpZiAoISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBNb2RhbC5zaG93KFwiaW5zdGFuY2VfdHJhY2VfZGV0YWlsX21vZGFsXCIsIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgJ2NsaWNrIC5hcHByb3ZlLWl0ZW0gYS5idG4tbGluaywuYXBwcm92ZS1kZXNjcmlwdGlvbiBhLmJ0bi1saW5rLC5hcHByb3ZlLWl0ZW0tZGlzdHJpYnV0ZSBhLmJ0bi1saW5rJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdmFyIHJlZiwgdXNlcklkO1xuICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgIHVzZXJJZCA9IChyZWYgPSBldmVudC50YXJnZXQuZGF0YXNldCkgIT0gbnVsbCA/IHJlZi50YXJnZXRfdXNlcl9pZCA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBDcmVhdG9yLm9wZW5TYWZlT2JqZWN0VXJsKCd1c2VycycsIHVzZXJJZCk7XG4gICAgfVxuICB9LFxuICAndGFwZW5kIC5hcHByb3ZlLWl0ZW0sLmFwcHJvdmUtZGVzY3JpcHRpb24nOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICBpZiAoISQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYS5idG4tbGlua1wiKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gICdjbGljayAuaW5zdGFuY2UtdHJhY2UtZGV0YWlsLW1vZGFsIC5idG4tZm9yd2FyZC1hcHByb3ZlLXJlbW92ZSc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHZhciBhcHByb3ZlSWQsIGluc3RhbmNlSWQsIHRyYWNlSWQ7XG4gICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICB0cmFjZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudHJhY2U7XG4gICAgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgIE1ldGVvci5jYWxsKCdmb3J3YXJkX3JlbW92ZScsIGluc3RhbmNlSWQsIHRyYWNlSWQsIGFwcHJvdmVJZCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdG9hc3RyLmVycm9yKFRBUGkxOG4uX18oZXJyLnJlYXNvbikpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0b2FzdHIuc3VjY2VzcyhUQVBpMThuLl9fKFwiaW5zdGFuY2VfYXBwcm92ZV9mb3J3YXJkX3JlbW92ZV9zdWNjZXNzXCIpKTtcbiAgICAgICAgTW9kYWwuaGlkZShcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1mb3J3YXJkLWluc3RhbmNlLWxvb2snOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgZm9yd2FyZF9pbnN0YW5jZSwgZm9yd2FyZF9zcGFjZTtcbiAgICBmb3J3YXJkX3NwYWNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuZm9yd2FyZHNwYWNlO1xuICAgIGZvcndhcmRfaW5zdGFuY2UgPSBldmVudC50YXJnZXQuZGF0YXNldC5mb3J3YXJkaW5zdGFuY2U7XG4gICAgcmV0dXJuIFN0ZWVkb3Mub3BlbldpbmRvdyhTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBmb3J3YXJkX3NwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGZvcndhcmRfaW5zdGFuY2UpKTtcbiAgfSxcbiAgJ2NsaWNrIC5idG4tbW9kaWZpY2F0aW9uJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgdGVtcGxhdGUuaXNfZWRpdGluZy5zZXQoIXRlbXBsYXRlLmlzX2VkaXRpbmcuZ2V0KCkpO1xuICAgIGlmICghU3RlZWRvcy5pc0FuZHJvaWRPcklPUygpKSB7XG4gICAgICByZXR1cm4gVHJhY2tlci5hZnRlckZsdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gJChcIiNpbnN0YW5jZV90cmFjZV9kZXRhaWxfbW9kYWwgI2ZpbmlzaF9pbnB1dFwiKS5vbihcImRwLnNob3dcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICQoXCIubW9kYWwtYm9keVwiKS5zY3JvbGxUb3AoMTAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gICdjbGljayAuYnRuLWNhbmNlbEJ1dCc6IGZ1bmN0aW9uKGV2ZW50LCB0ZW1wbGF0ZSkge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5pc19lZGl0aW5nLnNldCghdGVtcGxhdGUuaXNfZWRpdGluZy5nZXQoKSk7XG4gIH0sXG4gICdjbGljayAuYnRuLXNhdmVCdXQnOiBmdW5jdGlvbihldmVudCwgdGVtcGxhdGUpIHtcbiAgICB2YXIgYXBwcm92ZUlkLCBmaW5pc2hfaW5wdXQsIGluc3RhbmNlSWQsIG9waW5pb25faW5wdXQsIHRyYWNlSWQ7XG4gICAgaW5zdGFuY2VJZCA9IFNlc3Npb24uZ2V0KCdpbnN0YW5jZUlkJyk7XG4gICAgYXBwcm92ZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuYXBwcm92ZTtcbiAgICB0cmFjZUlkID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQudHJhY2U7XG4gICAgb3Bpbmlvbl9pbnB1dCA9ICQoJyNvcGluaW9uX2lucHV0JykudmFsKCk7XG4gICAgZmluaXNoX2lucHV0ID0gQXV0b0Zvcm0uZ2V0RmllbGRWYWx1ZShcImZpbmlzaF9kYXRlXCIsIFwiZmluaXNoRGF0ZUF1dG9Gb3JtXCIpO1xuICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwibG9hZGluZ1wiKTtcbiAgICByZXR1cm4gTWV0ZW9yLmNhbGwoJ2NoYW5nZV9hcHByb3ZlX2luZm8nLCBpbnN0YW5jZUlkLCB0cmFjZUlkLCBhcHByb3ZlSWQsIG9waW5pb25faW5wdXQsIGZpbmlzaF9pbnB1dCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdG9hc3RyLmVycm9yKFRBUGkxOG4uX18oZXJyLnJlYXNvbikpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0b2FzdHIuc3VjY2Vzcyh0KFwiaW5zdGFuY2VfYXBwcm92ZV9tb2RhbF9tb2RpZmljYXRpb25zYXZlXCIpKTtcbiAgICAgICAgTW9kYWwuaGlkZShcImluc3RhbmNlX3RyYWNlX2RldGFpbF9tb2RhbFwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgJ2NsaWNrIC5pbnN0YW5jZS10cmFjZS1kZXRhaWwtbW9kYWwgLmJ0bi1kaXN0cmlidXRlLWFwcHJvdmUtcmVtb3ZlJzogZnVuY3Rpb24oZXZlbnQsIHRlbXBsYXRlKSB7XG4gICAgTW9kYWwuYWxsb3dNdWx0aXBsZSA9IHRydWU7XG4gICAgcmV0dXJuIE1vZGFsLnNob3coJ2NhbmNlbF9kaXN0cmlidXRlX21vZGFsJyk7XG4gIH1cbn07XG4iLCJSZWxhdGVkSW5zdGFuY2VzLmhlbHBlcnMgPVxuXHRzaG93UmVsYXRlZEluc3RhY2VzOiAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0aW5zID0gdGhpcy5pbnN0YW5jZVxuXHRcdGlmIGlucz8ucmVsYXRlZF9pbnN0YW5jZXMgJiYgXy5pc0FycmF5KGlucz8ucmVsYXRlZF9pbnN0YW5jZXMpXG5cdFx0XHRpZiBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluOiBpbnMucmVsYXRlZF9pbnN0YW5jZXN9fSwge2ZpZWxkczoge3NwYWNlOiAxLCBuYW1lOiAxfX0pLmNvdW50KCkgPiAwXG5cdFx0XHRcdHJldHVybiB0cnVlXG5cdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRyZWxhdGVkX2luc3RhY2VzOiAtPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0aW5zID0gdGhpcy5pbnN0YW5jZVxuXHRcdGlmIGlucz8ucmVsYXRlZF9pbnN0YW5jZXMgJiYgXy5pc0FycmF5KGlucz8ucmVsYXRlZF9pbnN0YW5jZXMpXG5cdFx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbjogaW5zLnJlbGF0ZWRfaW5zdGFuY2VzfX0sIHtmaWVsZHM6IHtzcGFjZTogMSwgbmFtZTogMX19KS5mZXRjaCgpXG5cblx0cmVsYXRlZF9pbnN0YWNlX3VybDogKGlucykgLT5cblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpXG5cdFx0XHRyZXR1cm4gJydcblxuXHRcdGFic29sdXRlID0gZmFsc2VcblxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0YWJzb2x1dGUgPSB0aGlzLmFic29sdXRlXG5cdFx0aWYgYWJzb2x1dGVcblx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIitpbnMuc3BhY2UrXCIvdmlldy9yZWFkb25seS9cIiArIGlucy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIraW5zLnNwYWNlK1wiL3ZpZXcvcmVhZG9ubHkvXCIgKyBpbnMuX2lkICsgJz9oaWRlX3RyYWNlcz0wJylcblxuXHRfdDogKGtleSktPlxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oa2V5KVxuXHRcdGVsc2Vcblx0XHRcdGxvY2FsZSA9IFRlbXBsYXRlLmluc3RhbmNlKCkudmlldy50ZW1wbGF0ZS5zdGVlZG9zRGF0YS5sb2NhbGVcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKGtleSwge30sIGxvY2FsZSlcblxuXHRzaG93X2RlbGV0ZTogKCktPlxuXHRcdGlmICFNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09IFwiZHJhZnRcIiB8fCBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpXG5cdFx0XHRcdGlmIGN1cnJlbnRfc3RlcFxuXHRcdFx0XHRcdGlmIChjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbWFpbl9hdHRhY2ggfHwgY3VycmVudF9zdGVwLmNhbl9lZGl0X25vcm1hbF9hdHRhY2ggPT0gdHJ1ZSB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PSB1bmRlZmluZWQpXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZSIsIlJlbGF0ZWRJbnN0YW5jZXMuaGVscGVycyA9IHtcbiAgc2hvd1JlbGF0ZWRJbnN0YWNlczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKChpbnMgIT0gbnVsbCA/IGlucy5yZWxhdGVkX2luc3RhbmNlcyA6IHZvaWQgMCkgJiYgXy5pc0FycmF5KGlucyAhPSBudWxsID8gaW5zLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwKSkge1xuICAgICAgaWYgKGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBpbnMucmVsYXRlZF9pbnN0YW5jZXNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICBuYW1lOiAxXG4gICAgICAgIH1cbiAgICAgIH0pLmNvdW50KCkgPiAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICByZWxhdGVkX2luc3RhY2VzOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5zO1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlucyA9IFdvcmtmbG93TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnMgPSB0aGlzLmluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAoKGlucyAhPSBudWxsID8gaW5zLnJlbGF0ZWRfaW5zdGFuY2VzIDogdm9pZCAwKSAmJiBfLmlzQXJyYXkoaW5zICE9IG51bGwgPyBpbnMucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDApKSB7XG4gICAgICByZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IGlucy5yZWxhdGVkX2luc3RhbmNlc1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9XG4gIH0sXG4gIHJlbGF0ZWRfaW5zdGFjZV91cmw6IGZ1bmN0aW9uKGlucykge1xuICAgIHZhciBhYnNvbHV0ZTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGU7XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiICsgaW5zLnNwYWNlICsgXCIvdmlldy9yZWFkb25seS9cIiArIGlucy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGlucy5zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBpbnMuX2lkICsgJz9oaWRlX3RyYWNlcz0wJyk7XG4gICAgfVxuICB9LFxuICBfdDogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGxvY2FsZTtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gVEFQaTE4bi5fXyhrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBUZW1wbGF0ZS5pbnN0YW5jZSgpLnZpZXcudGVtcGxhdGUuc3RlZWRvc0RhdGEubG9jYWxlO1xuICAgICAgcmV0dXJuIFRBUGkxOG4uX18oa2V5LCB7fSwgbG9jYWxlKTtcbiAgICB9XG4gIH0sXG4gIHNob3dfZGVsZXRlOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY3VycmVudF9zdGVwO1xuICAgIGlmICghTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gXCJkcmFmdFwiIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgIGN1cnJlbnRfc3RlcCA9IEluc3RhbmNlTWFuYWdlci5nZXRDdXJyZW50U3RlcCgpO1xuICAgICAgICBpZiAoY3VycmVudF9zdGVwKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRfc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaCB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PT0gdHJ1ZSB8fCBjdXJyZW50X3N0ZXAuY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iLCJSZWxhdGVkUmVjb3Jkcy5oZWxwZXJzID1cblx0c2hvd1JlbGF0ZWRSZWNvcmRzOiAoKS0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRlbHNlXG5cdFx0XHRpbnMgPSB0aGlzLmluc3RhbmNlXG5cdFx0aWYgIWluc1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0cmV0dXJuICFfLmlzRW1wdHkoaW5zLnJlY29yZF9pZHMpXG5cdHJlbGF0ZWRSZWNvcmRVcmw6ICgpLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnQgJiYgKFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpKVxuXHRcdFx0cmV0dXJuICcnXG5cblx0XHRhYnNvbHV0ZSA9IGZhbHNlXG5cdFx0XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRpbnMgPSB0aGlzLmluc3RhbmNlXG5cdFx0XHRhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGVcblx0XHRlbHNlXG5cdFx0XHRpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblx0XG5cdFx0b2JqY2V0TmFtZSA9IGlucy5yZWNvcmRfaWRzWzBdLm9cblx0XHRpZCA9IGlucy5yZWNvcmRfaWRzWzBdLmlkc1swXVxuXG5cdFx0aWYgYWJzb2x1dGVcblx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcHAvLS8je29iamNldE5hbWV9L3ZpZXcvI3tpZH1cIilcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwcC8tLyN7b2JqY2V0TmFtZX0vdmlldy8je2lkfVwiKSIsIlJlbGF0ZWRSZWNvcmRzLmhlbHBlcnMgPSB7XG4gIHNob3dSZWxhdGVkUmVjb3JkczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlucztcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBpbnMgPSBXb3JrZmxvd01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKCFpbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFfLmlzRW1wdHkoaW5zLnJlY29yZF9pZHMpO1xuICB9LFxuICByZWxhdGVkUmVjb3JkVXJsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYWJzb2x1dGUsIGlkLCBpbnMsIG9iamNldE5hbWU7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgaW5zID0gdGhpcy5pbnN0YW5jZTtcbiAgICAgIGFic29sdXRlID0gdGhpcy5hYnNvbHV0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zID0gV29ya2Zsb3dNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgfVxuICAgIG9iamNldE5hbWUgPSBpbnMucmVjb3JkX2lkc1swXS5vO1xuICAgIGlkID0gaW5zLnJlY29yZF9pZHNbMF0uaWRzWzBdO1xuICAgIGlmIChhYnNvbHV0ZSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybChcImFwcC8tL1wiICsgb2JqY2V0TmFtZSArIFwiL3ZpZXcvXCIgKyBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTdGVlZG9zLmFic29sdXRlVXJsKFwiYXBwLy0vXCIgKyBvYmpjZXROYW1lICsgXCIvdmlldy9cIiArIGlkKTtcbiAgICB9XG4gIH1cbn07XG4iLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yNCAxNToyOToyMlxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuLy8gSnNvblJvdXRlcy5hZGQoXCJwb3N0XCIsIFwiL2FwaS93b3JrZmxvdy9nZXRTcGFjZVVzZXJzXCIsIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuLy8gICB2YXJcbi8vICAgICB1c2VySWRzID0gcmVxLmJvZHkudXNlcklkcyxcbi8vICAgICBzcGFjZUlkID0gcmVxLnF1ZXJ5LnNwYWNlSWQsXG4vLyAgICAgc3BhY2VVc2VycyA9IFtdXG4vLyAgIDtcblxuLy8gICBpZiAoIXVzZXJJZHMgfHwgIXNwYWNlSWQpIHtcbi8vICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgICBjb2RlOiAyMDAsXG4vLyAgICAgICBkYXRhOiB7XG4vLyAgICAgICAgICdlcnJvcnMnOiAn57y65bCR5Y+C5pWwJ1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9XG5cbi8vICAgc3BhY2VVc2VycyA9IFdvcmtmbG93TWFuYWdlci5nZXRVc2VycyhzcGFjZUlkLCB1c2VySWRzKTtcblxuLy8gICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgY29kZTogMjAwLFxuLy8gICAgIGRhdGE6IHtcbi8vICAgICAgICdzcGFjZVVzZXJzJzogc3BhY2VVc2Vyc1xuLy8gICAgIH1cbi8vICAgfSk7XG4vLyB9KVxuXG5cbiAgXG4gICIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDE1OjIzOjE0XG4gKiBARGVzY3JpcHRpb246IFxuICovXG4vLyBKc29uUm91dGVzLmFkZChcInBvc3RcIiwgXCIvYXBpL3dvcmtmbG93L2dldEZvcm11bGFVc2VyT2JqZWN0c1wiLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbi8vICAgdmFyXG4vLyAgICAgdXNlcklkcyA9IHJlcS5ib2R5LnVzZXJJZHMsXG4vLyAgICAgc3BhY2VJZCA9IHJlcS5xdWVyeS5zcGFjZUlkLFxuLy8gICAgIHNwYWNlVXNlcnMgPSBbXVxuLy8gICA7XG5cbi8vICAgaWYgKCF1c2VySWRzIHx8ICFzcGFjZUlkKSB7XG4vLyAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuLy8gICAgICAgY29kZTogMjAwLFxuLy8gICAgICAgZGF0YToge1xuLy8gICAgICAgICAnZXJyb3JzJzogJ+e8uuWwkeWPguaVsCdcbi8vICAgICAgIH1cbi8vICAgICB9KTtcbi8vICAgfVxuXG4vLyAgIHZhciB1c2VycyA9IFdvcmtmbG93TWFuYWdlci5nZXRGb3JtdWxhVXNlck9iamVjdChzcGFjZUlkLCB1c2VySWRzKTtcblxuLy8gICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyAgICAgY29kZTogMjAwLFxuLy8gICAgIGRhdGE6IHtcbi8vICAgICAgICdzcGFjZVVzZXJzJzogdXNlcnNcbi8vICAgICB9XG4vLyAgIH0pO1xuLy8gfSlcblxuXG4gIFxuICAiLCIvKlxuICogQEF1dGhvcjogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQERhdGU6IDIwMjEtMDUtMjQgMTI6MzI6NTZcbiAqIEBMYXN0RWRpdG9yczogc3VuaGFvbGluQGhvdG9hLmNvbVxuICogQExhc3RFZGl0VGltZTogMjAyMi0xMi0yNCAxNTozODo1NFxuICogQERlc2NyaXB0aW9uOiBcbiAqL1xuLy8gSnNvblJvdXRlcy5hZGQoXCJwb3N0XCIsIFwiL2FwaS93b3JrZmxvdy9pbml0X2Zvcm11bGFfdmFsdWVzXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4vLyBcdHZhclxuLy8gXHRcdGZpZWxkcyA9IHJlcS5ib2R5LmZpZWxkcyxcbi8vIFx0XHRhdXRvRm9ybURvYyA9IHJlcS5ib2R5LmF1dG9Gb3JtRG9jLFxuLy8gXHRcdGFwcHJvdmVyID0gcmVxLmJvZHkuYXBwcm92ZXIsXG4vLyBcdFx0YXBwbGljYW50ID0gcmVxLmJvZHkuYXBwbGljYW50LFxuXG4vLyBcdFx0c3BhY2VJZCA9IHJlcS5xdWVyeS5zcGFjZUlkLFxuXG4vLyBcdFx0c3BhY2VVc2VycyA9IFtdO1xuXG4vLyBcdGlmICghZmllbGRzIHx8ICFzcGFjZUlkIHx8ICFhdXRvRm9ybURvYyB8fCAhYXBwcm92ZXIgfHwgIWFwcGxpY2FudCkge1xuLy8gXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRcdGRhdGE6IHtcbi8vIFx0XHRcdFx0J2Vycm9ycyc6ICfnvLrlsJHlj4LmlbAnXG4vLyBcdFx0XHR9XG4vLyBcdFx0fSk7XG4vLyBcdFx0cmV0dXJuO1xuLy8gXHR9XG5cbi8vIFx0Zm9ybXVsYV92YWx1ZXMgPSBGb3JtX2Zvcm11bGEuaW5pdF9mb3JtdWxhX3ZhbHVlcyhmaWVsZHMsIGF1dG9Gb3JtRG9jLCBhcHByb3ZlciwgYXBwbGljYW50LCBzcGFjZUlkKTtcblxuLy8gXHRKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4vLyBcdFx0Y29kZTogMjAwLFxuLy8gXHRcdGRhdGE6IHtcbi8vIFx0XHRcdCdmb3JtdWxhX3ZhbHVlcyc6IGZvcm11bGFfdmFsdWVzXG4vLyBcdFx0fVxuLy8gXHR9KTtcbi8vIH0pXG4iLCIvLyBKc29uUm91dGVzLmFkZCgncG9zdCcsICcvYXBpL3dvcmtmbG93L2ZvcndhcmQnLCBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbi8vIFx0dHJ5IHtcbi8vIFx0XHR2YXIgY3VycmVudF91c2VyX2luZm8gPSB1dWZsb3dNYW5hZ2VyLmNoZWNrX2F1dGhvcml6YXRpb24ocmVxKTtcbi8vIFx0XHR2YXIgY3VycmVudF91c2VyX2lkID0gY3VycmVudF91c2VyX2luZm8uX2lkO1xuXG4vLyBcdFx0dmFyIGhhc2hEYXRhID0gcmVxLmJvZHk7XG4vLyBcdFx0dmFyIGluc3RhbmNlX2lkID0gaGFzaERhdGEuaW5zdGFuY2VfaWQ7XG4vLyBcdFx0dmFyIHNwYWNlX2lkID0gaGFzaERhdGEuc3BhY2VfaWQ7XG4vLyBcdFx0dmFyIGZsb3dfaWQgPSBoYXNoRGF0YS5mbG93X2lkO1xuLy8gXHRcdHZhciBoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQgPSBoYXNoRGF0YS5oYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQ7XG4vLyBcdFx0dmFyIGRlc2NyaXB0aW9uID0gaGFzaERhdGEuZGVzY3JpcHRpb247XG4vLyBcdFx0dmFyIGlzRm9yd2FyZEF0dGFjaG1lbnRzID0gaGFzaERhdGEuaXNGb3J3YXJkQXR0YWNobWVudHM7XG4vLyBcdFx0dmFyIHNlbGVjdGVkVXNlcnMgPSBoYXNoRGF0YS5zZWxlY3RlZFVzZXJzO1xuLy8gXHRcdHZhciBhY3Rpb25fdHlwZSA9IGhhc2hEYXRhLmFjdGlvbl90eXBlO1xuLy8gXHRcdHZhciByZWxhdGVkID0gaGFzaERhdGEucmVsYXRlZDtcbi8vIFx0XHR2YXIgZnJvbV9hcHByb3ZlX2lkID0gaGFzaERhdGEuZnJvbV9hcHByb3ZlX2lkO1xuXG4vLyBcdFx0Y2hlY2soaW5zdGFuY2VfaWQsIFN0cmluZyk7XG4vLyBcdFx0Y2hlY2soc3BhY2VfaWQsIFN0cmluZyk7XG4vLyBcdFx0Y2hlY2soZmxvd19pZCwgU3RyaW5nKTtcbi8vIFx0XHRjaGVjayhoYXNTYXZlSW5zdGFuY2VUb0F0dGFjaG1lbnQsIEJvb2xlYW4pO1xuLy8gXHRcdGNoZWNrKGRlc2NyaXB0aW9uLCBTdHJpbmcpO1xuLy8gXHRcdGNoZWNrKGlzRm9yd2FyZEF0dGFjaG1lbnRzLCBCb29sZWFuKTtcbi8vIFx0XHRjaGVjayhzZWxlY3RlZFVzZXJzLCBBcnJheSk7XG4vLyBcdFx0Y2hlY2soYWN0aW9uX3R5cGUsIE1hdGNoLk9uZU9mKCdmb3J3YXJkJywgJ2Rpc3RyaWJ1dGUnKSk7XG5cbi8vIFx0XHRpZiAoYWN0aW9uX3R5cGUgPT0gXCJkaXN0cmlidXRlXCIpXG4vLyBcdFx0XHRjaGVjayhmcm9tX2FwcHJvdmVfaWQsIFN0cmluZyk7XG5cbi8vIFx0XHR2YXIgaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoaW5zdGFuY2VfaWQpO1xuLy8gXHRcdHZhciBvbGRfc3BhY2VfaWQgPSBpbnMuc3BhY2U7XG5cbi8vIFx0XHR2YXIgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoZmxvd19pZCk7XG5cbi8vIFx0XHR2YXIgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZV9pZCk7XG5cbi8vIFx0XHRpZiAoIWlucyB8fCAhZmxvdyB8fCAhc3BhY2UpIHtcbi8vIFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ3BhcmFtcyBlcnJvciEnLCAncmVjb3JkIG5vdCBleGlzdHMhJyk7XG4vLyBcdFx0fVxuXG4vLyBcdFx0dmFyIGZvcndhcmRfdXNlcnMgPSBuZXcgQXJyYXk7XG4vLyBcdFx0aWYgKF8uaXNFbXB0eShzZWxlY3RlZFVzZXJzKSkge1xuLy8gXHRcdFx0Zm9yd2FyZF91c2VycyA9IFtjdXJyZW50X3VzZXJfaWRdO1xuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRmb3J3YXJkX3VzZXJzID0gc2VsZWN0ZWRVc2Vycztcbi8vIFx0XHR9XG5cbi8vIFx0XHQvLyDmoKHpqozliIblj5Hlr7nosaHmmK/lkKbmnInliIblj5HmtYHnqIvnmoTmj5DkuqTmnYPpmZBcbi8vIFx0XHR2YXIgbm9fcGVybWlzc2lvbl91c2VyX2lkcyA9IG5ldyBBcnJheSgpO1xuLy8gXHRcdF8uZWFjaChmb3J3YXJkX3VzZXJzLCBmdW5jdGlvbiAodWlkKSB7XG4vLyBcdFx0XHR2YXIgcGVybWlzc2lvbnMgPSBwZXJtaXNzaW9uTWFuYWdlci5nZXRGbG93UGVybWlzc2lvbnMoZmxvd19pZCwgdWlkKTtcbi8vIFx0XHRcdGlmICghcGVybWlzc2lvbnMuaW5jbHVkZXMoXCJhZGRcIikpIHtcbi8vIFx0XHRcdFx0Ly8gdGhyb3cgbmV3IE1ldGVvci5FcnJvcignZXJyb3IhJywgXCLor6XnlLPor7fkurrmsqHmnInmj5DkuqTmraTnlLPor7fljZXnmoTmnYPpmZDjgIJcIilcbi8vIFx0XHRcdFx0bm9fcGVybWlzc2lvbl91c2VyX2lkcy5wdXNoKHVpZCk7XG4vLyBcdFx0XHR9XG4vLyBcdFx0fSlcbi8vIFx0XHRpZiAoIV8uaXNFbXB0eShub19wZXJtaXNzaW9uX3VzZXJfaWRzKSkge1xuLy8gXHRcdFx0dmFyIG5vX3Blcm1pc3Npb25fdXNlcnNfbmFtZSA9IG5ldyBBcnJheSgpO1xuLy8gXHRcdFx0ZGIudXNlcnMuZmluZCh7XG4vLyBcdFx0XHRcdF9pZDoge1xuLy8gXHRcdFx0XHRcdCRpbjogbm9fcGVybWlzc2lvbl91c2VyX2lkc1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRcdG5hbWU6IDFcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSkuZm9yRWFjaChmdW5jdGlvbiAodSkge1xuLy8gXHRcdFx0XHRub19wZXJtaXNzaW9uX3VzZXJzX25hbWUucHVzaCh1Lm5hbWUpO1xuLy8gXHRcdFx0fSk7XG4vLyBcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdub19wZXJtaXNzaW9uJywgXCLor6Xmj5DkuqTkurrmsqHmnInmj5DkuqTmraTnlLPor7fljZXnmoTmnYPpmZDjgIJcIiwgbm9fcGVybWlzc2lvbl91c2Vyc19uYW1lLmpvaW4oJywnKSlcbi8vIFx0XHR9XG5cbi8vIFx0XHR2YXIgbmV3X2luc19pZHMgPSBuZXcgQXJyYXk7XG5cbi8vIFx0XHR2YXIgY3VycmVudF90cmFjZSA9IG51bGw7XG4vLyBcdFx0aWYgKGFjdGlvbl90eXBlID09IFwiZGlzdHJpYnV0ZVwiKSB7XG4vLyBcdFx0XHRfLmVhY2goaW5zLnRyYWNlcywgZnVuY3Rpb24gKHQpIHtcbi8vIFx0XHRcdFx0aWYgKCFjdXJyZW50X3RyYWNlKSB7XG4vLyBcdFx0XHRcdFx0Xy5lYWNoKHQuYXBwcm92ZXMsIGZ1bmN0aW9uIChhKSB7XG4vLyBcdFx0XHRcdFx0XHRpZiAoIWN1cnJlbnRfdHJhY2UpIHtcbi8vIFx0XHRcdFx0XHRcdFx0aWYgKGEuX2lkID09IGZyb21fYXBwcm92ZV9pZClcbi8vIFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50X3RyYWNlID0gdDtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KVxuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRjdXJyZW50X3RyYWNlID0gXy5sYXN0KGlucy50cmFjZXMpO1xuLy8gXHRcdH1cbi8vIFx0XHR2YXIgY3VycmVudF90cmFjZV9pZCA9IGN1cnJlbnRfdHJhY2UuX2lkO1xuLy8gXHRcdHZhciBmb3J3YXJkX2FwcHJvdmVzID0gW107XG4vLyBcdFx0dmFyIGZyb21fdXNlcl9uYW1lID0gZGIudXNlcnMuZmluZE9uZShjdXJyZW50X3VzZXJfaWQsIHtcbi8vIFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRuYW1lOiAxXG4vLyBcdFx0XHR9XG4vLyBcdFx0fSkubmFtZVxuLy8gXHRcdHZhciBzZXRfb2JqID0gbmV3IE9iamVjdDtcblxuLy8gXHRcdC8vIOiuoeeul3ZhbHVlc1xuLy8gXHRcdHZhciBvbGRfdmFsdWVzID0gaW5zLnZhbHVlcyxcbi8vIFx0XHRcdG5ld192YWx1ZXMgPSB7fTtcbi8vIFx0XHR2YXIgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoZmxvdy5mb3JtKTtcbi8vIFx0XHR2YXIgZmllbGRzID0gZm9ybS5jdXJyZW50LmZpZWxkcyB8fCBbXTtcblxuLy8gXHRcdHZhciBvbGRfZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoaW5zLmZvcm0pO1xuLy8gXHRcdHZhciBvbGRfZm9ybV92ZXJzaW9uID0gaW5zLmZvcm1fdmVyc2lvbixcbi8vIFx0XHRcdG9sZF9maWVsZHMgPSBbXSxcbi8vIFx0XHRcdGNvbW1vbl9maWVsZHMgPSBbXTtcblxuLy8gXHRcdHZhciBzZWxlY3RfdG9faW5wdXRfZmllbGRzID0gW107XG5cbi8vIFx0XHRpZiAob2xkX2Zvcm0uY3VycmVudC5faWQgPT0gb2xkX2Zvcm1fdmVyc2lvbikge1xuLy8gXHRcdFx0b2xkX2ZpZWxkcyA9IG9sZF9mb3JtLmN1cnJlbnQuZmllbGRzO1xuLy8gXHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRpZiAob2xkX2Zvcm0uaGlzdG9yeXMpIHtcbi8vIFx0XHRcdFx0b2xkX2Zvcm0uaGlzdG9yeXMuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuLy8gXHRcdFx0XHRcdGlmIChoLl9pZCA9PSBvbGRfZm9ybV92ZXJzaW9uKVxuLy8gXHRcdFx0XHRcdFx0b2xkX2ZpZWxkcyA9IGguZmllbGRzO1xuLy8gXHRcdFx0XHR9KVxuLy8gXHRcdFx0fVxuLy8gXHRcdH1cblxuLy8gXHRcdGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuLy8gXHRcdFx0dmFyIGV4aXN0c19maWVsZCA9IF8uZmluZChvbGRfZmllbGRzLCBmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRyZXR1cm4gZi50eXBlID09IGZpZWxkLnR5cGUgJiYgZi5jb2RlID09IGZpZWxkLmNvZGU7XG4vLyBcdFx0XHR9KVxuLy8gXHRcdFx0aWYgKGV4aXN0c19maWVsZClcbi8vIFx0XHRcdFx0Y29tbW9uX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbi8vIFx0XHRcdHZhciBzZWxlY3RfaW5wdXRfZmllbGQgPSBfLmZpbmQob2xkX2ZpZWxkcywgZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0cmV0dXJuIGYudHlwZSA9PSAnc2VsZWN0JyAmJiBmaWVsZC50eXBlID09ICdpbnB1dCcgJiYgZi5jb2RlID09IGZpZWxkLmNvZGU7XG4vLyBcdFx0XHR9KVxuLy8gXHRcdFx0aWYgKHNlbGVjdF9pbnB1dF9maWVsZClcbi8vIFx0XHRcdFx0c2VsZWN0X3RvX2lucHV0X2ZpZWxkcy5wdXNoKHNlbGVjdF9pbnB1dF9maWVsZCk7XG4vLyBcdFx0fSlcblxuLy8gXHRcdHNlbGVjdF90b19pbnB1dF9maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbi8vIFx0XHRcdGlmIChvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdKSB7XG4vLyBcdFx0XHRcdG5ld192YWx1ZXNbZmllbGQuY29kZV0gPSBvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdO1xuLy8gXHRcdFx0fVxuLy8gXHRcdH0pXG5cbi8vIFx0XHRjb21tb25fZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4vLyBcdFx0XHRpZiAoZmllbGQudHlwZSA9PSAnc2VjdGlvbicpIHtcbi8vIFx0XHRcdFx0aWYgKGZpZWxkLmZpZWxkcykge1xuLy8gXHRcdFx0XHRcdGZpZWxkLmZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4vLyBcdFx0XHRcdFx0XHQvLyDot6jlt6XkvZzljLrovazlj5HkuI3lpI3liLbpgInkurrpgInnu4Rcbi8vIFx0XHRcdFx0XHRcdGlmIChbJ2dyb3VwJywgJ3VzZXInXS5pbmNsdWRlcyhmLnR5cGUpICYmIG9sZF9zcGFjZV9pZCAhPSBzcGFjZV9pZCkge1xuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHR2YXIga2V5ID0gZi5jb2RlO1xuLy8gXHRcdFx0XHRcdFx0dmFyIG9sZF92ID0gb2xkX3ZhbHVlc1trZXldO1xuLy8gXHRcdFx0XHRcdFx0aWYgKG9sZF92KSB7XG4vLyBcdFx0XHRcdFx0XHRcdHZhciBmaWVsZE9wdGlvbnMgPSBmLm9wdGlvbnMgJiYgZi5vcHRpb25zLnNwbGl0ICYmIGYub3B0aW9ucy5zcGxpdChcIlxcblwiKS5tYXAoZnVuY3Rpb24obil7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IGl0ZW1TcGxpdHNbMF0sXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4vLyBcdFx0XHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdFx0Ly8g5qCh6aqMIOWNlemAie+8jOWkmumAie+8jOS4i+aLieahhiDlrZfmrrXlgLzmmK/lkKblnKjmlrDooajljZXlr7nlupTlrZfmrrXnmoTlj6/pgInlgLzojIPlm7TlhoVcbi8vIFx0XHRcdFx0XHRcdFx0aWYgKGYudHlwZSA9PSAnc2VsZWN0JyB8fCBmLnR5cGUgPT0gJ3JhZGlvJykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBzZWxlY3RlZE9wdGlvbiA9IGZpZWxkT3B0aW9ucy5maW5kKGZ1bmN0aW9uKGl0ZW0pIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlID09PSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRpZighc2VsZWN0ZWRPcHRpb24pe1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0fVxuXG4vLyBcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ211bHRpU2VsZWN0Jykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdHZhciBvbGRfbXVsdGlTZWxlY3RlZCA9IG9sZF92LnNwbGl0KCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIG5ld19tdWx0aVNlbGVjdGVkID0gXy5pbnRlcnNlY3Rpb24oZmllbGRPcHRpb25zLm1hcChmdW5jdGlvbihuKXsgcmV0dXJuIG4udmFsdWU7IH0pLCBvbGRfbXVsdGlTZWxlY3RlZCk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0b2xkX3YgPSBuZXdfbXVsdGlTZWxlY3RlZC5qb2luKCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0XHRuZXdfdmFsdWVzW2tleV0gPSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT0gJ3RhYmxlJykge1xuLy8gXHRcdFx0XHRpZiAoIV8uaXNFbXB0eShvbGRfdmFsdWVzW2ZpZWxkLmNvZGVdKSkge1xuLy8gXHRcdFx0XHRcdG5ld192YWx1ZXNbZmllbGQuY29kZV0gPSBuZXcgQXJyYXk7XG4vLyBcdFx0XHRcdFx0b2xkX3ZhbHVlc1tmaWVsZC5jb2RlXS5mb3JFYWNoKGZ1bmN0aW9uIChvbGRfdGFibGVfcm93X3ZhbHVlcykge1xuLy8gXHRcdFx0XHRcdFx0dmFyIG5ld190YWJsZV9yb3dfdmFsdWVzID0ge307XG5cbi8vIFx0XHRcdFx0XHRcdGlmICghXy5pc0VtcHR5KGZpZWxkLmZpZWxkcykpIHtcbi8vIFx0XHRcdFx0XHRcdFx0ZmllbGQuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHQvLyDot6jlt6XkvZzljLrovazlj5HkuI3lpI3liLbpgInkurrpgInnu4Rcbi8vIFx0XHRcdFx0XHRcdFx0XHRpZiAoWydncm91cCcsICd1c2VyJ10uaW5jbHVkZXMoZi50eXBlKSAmJiBvbGRfc3BhY2VfaWQgIT0gc3BhY2VfaWQpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdFx0dmFyIGtleSA9IGYuY29kZTtcbi8vIFx0XHRcdFx0XHRcdFx0XHR2YXIgb2xkX3YgPSBvbGRfdGFibGVfcm93X3ZhbHVlc1trZXldO1xuLy8gXHRcdFx0XHRcdFx0XHRcdGlmIChvbGRfdikge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGZpZWxkT3B0aW9ucyA9IGYub3B0aW9ucyAmJiBmLm9wdGlvbnMuc3BsaXQgJiYgZi5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihuKXtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogaXRlbVNwbGl0c1swXSxcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0Ly8g5qCh6aqMIOWNlemAie+8jOWkmumAie+8jOS4i+aLieahhiDlrZfmrrXlgLzmmK/lkKblnKjmlrDooajljZXlr7nlupTlrZfmrrXnmoTlj6/pgInlgLzojIPlm7TlhoVcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ3NlbGVjdCcgfHwgZi50eXBlID09ICdyYWRpbycpIHtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIHNlbGVjdGVkT3B0aW9uID0gZmllbGRPcHRpb25zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlID09PSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdGlmKCFzZWxlY3RlZE9wdGlvbil7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdGlmIChmLnR5cGUgPT0gJ211bHRpU2VsZWN0Jykge1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgb2xkX211bHRpU2VsZWN0ZWQgPSBvbGRfdi5zcGxpdCgnLCcpO1xuLy8gXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgbmV3X211bHRpU2VsZWN0ZWQgPSBfLmludGVyc2VjdGlvbihmaWVsZE9wdGlvbnMubWFwKGZ1bmN0aW9uKG4peyByZXR1cm4gbi52YWx1ZTsgfSksIG9sZF9tdWx0aVNlbGVjdGVkKTtcbi8vIFx0XHRcdFx0XHRcdFx0XHRcdFx0b2xkX3YgPSBuZXdfbXVsdGlTZWxlY3RlZC5qb2luKCcsJyk7XG4vLyBcdFx0XHRcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdFx0XHRcdG5ld190YWJsZV9yb3dfdmFsdWVzW2tleV0gPSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRcdGlmIChvbGRfdGFibGVfcm93X3ZhbHVlcy5faWQpIHtcbi8vIFx0XHRcdFx0XHRcdFx0bmV3X3RhYmxlX3Jvd192YWx1ZXMuX2lkID0gbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0cjtcbi8vIFx0XHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdFx0aWYgKCFfLmlzRW1wdHkobmV3X3RhYmxlX3Jvd192YWx1ZXMpKSB7XG4vLyBcdFx0XHRcdFx0XHRcdG5ld192YWx1ZXNbZmllbGQuY29kZV0ucHVzaChuZXdfdGFibGVfcm93X3ZhbHVlcyk7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSlcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdFx0Ly8g6Leo5bel5L2c5Yy66L2s5Y+R5LiN5aSN5Yi26YCJ5Lq66YCJ57uEXG4vLyBcdFx0XHRcdGlmIChbJ2dyb3VwJywgJ3VzZXInXS5pbmNsdWRlcyhmaWVsZC50eXBlKSAmJiBvbGRfc3BhY2VfaWQgIT0gc3BhY2VfaWQpIHtcbi8vIFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdFx0dmFyIGtleSA9IGZpZWxkLmNvZGU7XG4vLyBcdFx0XHRcdHZhciBvbGRfdiA9IG9sZF92YWx1ZXNba2V5XTtcbi8vIFx0XHRcdFx0aWYgKG9sZF92KSB7XG4vLyBcdFx0XHRcdFx0Ly8g5qCh6aqMIOWNlemAie+8jOWkmumAie+8jOS4i+aLieahhiDlrZfmrrXlgLzmmK/lkKblnKjmlrDooajljZXlr7nlupTlrZfmrrXnmoTlj6/pgInlgLzojIPlm7TlhoVcbi8vIFx0XHRcdFx0XHR2YXIgZmllbGRPcHRpb25zID0gZmllbGQub3B0aW9ucyAmJiBmaWVsZC5vcHRpb25zLnNwbGl0ICYmIGZpZWxkLm9wdGlvbnMuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKG4pe1xuLy8gXHRcdFx0XHRcdFx0dmFyIGl0ZW1TcGxpdHMgPSBuLnNwbGl0KFwiOlwiKTtcbi8vIFx0XHRcdFx0XHRcdHJldHVybiB7XG4vLyBcdFx0XHRcdFx0XHRcdGxhYmVsOiBpdGVtU3BsaXRzWzBdLFxuLy8gXHRcdFx0XHRcdFx0XHR2YWx1ZTogaXRlbVNwbGl0c1sxXSB8fCBuXG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0fSk7XG4vLyBcdFx0XHRcdFx0aWYgKGZpZWxkLnR5cGUgPT0gJ3NlbGVjdCcgfHwgZmllbGQudHlwZSA9PSAncmFkaW8nKSB7XG4vLyBcdFx0XHRcdFx0XHR2YXIgc2VsZWN0ZWRPcHRpb24gPSBmaWVsZE9wdGlvbnMuZmluZChmdW5jdGlvbihpdGVtKSB7XG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtLnZhbHVlID09PSBvbGRfdjtcbi8vIFx0XHRcdFx0XHRcdH0pO1xuLy8gXHRcdFx0XHRcdFx0aWYoIXNlbGVjdGVkT3B0aW9uKXtcbi8vIFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdGlmIChmaWVsZC50eXBlID09ICdtdWx0aVNlbGVjdCcpIHtcbi8vIFx0XHRcdFx0XHRcdHZhciBvbGRfbXVsdGlTZWxlY3RlZCA9IG9sZF92LnNwbGl0KCcsJyk7XG4vLyBcdFx0XHRcdFx0XHR2YXIgbmV3X211bHRpU2VsZWN0ZWQgPSBfLmludGVyc2VjdGlvbihmaWVsZE9wdGlvbnMubWFwKGZ1bmN0aW9uKG4peyByZXR1cm4gbi52YWx1ZTsgfSksIG9sZF9tdWx0aVNlbGVjdGVkKTtcbi8vIFx0XHRcdFx0XHRcdG9sZF92ID0gbmV3X211bHRpU2VsZWN0ZWQuam9pbignLCcpO1xuLy8gXHRcdFx0XHRcdH1cblxuLy8gXHRcdFx0XHRcdG5ld192YWx1ZXNba2V5XSA9IG9sZF92O1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHR9KVxuXG4vLyBcdFx0Ly/lpoLmnpzmmK/liIblj5HvvIzliJl2YWx1ZeS4reeahHJlY29yZF9uZWVk44CBRk9ORFNJROS4jemcgOimgeWIhuWPkeWIsOaWsOeUs+ivt+WNleS4rVxuLy8gXHRcdGlmIChhY3Rpb25fdHlwZSA9PT0gJ2Rpc3RyaWJ1dGUnKSB7XG4vLyBcdFx0XHRkZWxldGUgbmV3X3ZhbHVlcy5yZWNvcmRfbmVlZDtcbi8vIFx0XHRcdGRlbGV0ZSBuZXdfdmFsdWVzLkZPTkRTSUQ7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Ly8g6K6h566X55Sz6K+35Y2V5qCH6aKYXG4vLyBcdFx0dmFyIGluc3RhbmNlX25hbWUgPSBcIlwiO1xuLy8gXHRcdHZhciBuYW1lX2ZvcnVtbGEgPSBmb3JtLmN1cnJlbnQubmFtZV9mb3J1bWxhO1xuLy8gXHRcdGlmIChuYW1lX2ZvcnVtbGEpIHtcbi8vIFx0XHRcdHRyeSB7XG4vLyBcdFx0XHRcdHZhciBpc2NyaXB0ID0gbmFtZV9mb3J1bWxhLnJlcGxhY2UoL1xcey9nLCBcIihuZXdfdmFsdWVzWydcIikucmVwbGFjZSgvXFx9L2csIFwiJ10gfHwgJycpXCIpO1xuLy8gXHRcdFx0XHR2YXIgcmV2ID0gZXZhbChpc2NyaXB0KTtcbi8vIFx0XHRcdFx0aW5zdGFuY2VfbmFtZSA9IHJldiB8fCBmbG93Lm5hbWU7XG4vLyBcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuLy8gXHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdjYWN1bGF0ZV9pbnN0YW5jZV9uYW1lJywgXCLorqHnrpfnlLPor7fljZXmoIfpopjlh7rplJnor7fmo4Dmn6XooajljZXmoIfpopjohJrmnKzjgIJcIik7XG4vLyBcdFx0XHR9XG4vLyBcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdGluc3RhbmNlX25hbWUgPSBmbG93Lm5hbWU7XG4vLyBcdFx0fVxuXG4vLyBcdFx0Ly8gaW5zdGFuY2XkuK3orrDlvZXlvZPliY3mraXpqqTlkI3np7AgIzEzMTRcbi8vIFx0XHR2YXIgc3RhcnRfc3RlcCA9IF8uZmluZChmbG93LmN1cnJlbnQuc3RlcHMsIGZ1bmN0aW9uIChzdGVwKSB7XG4vLyBcdFx0XHRyZXR1cm4gc3RlcC5zdGVwX3R5cGUgPT0gJ3N0YXJ0Jztcbi8vIFx0XHR9KVxuXG4vLyBcdFx0Ly8g5rWB56iL6L2s5Y+R5Yqf6IO95L+u5pS55Li677yM5byA5aeL6IqC54K55pyJ57yW6L6R5p2D6ZmQ55qE5a2X5q6155qE5YC86L+b6KGM5aSN5Yi277yM5peg57yW6L6R5p2D6ZmQ55qE5a2X5q615YC85LiN6L+b6KGM5aSN5Yi2ICMzNzQ4XG4vLyBcdFx0aWYgKGFjdGlvbl90eXBlID09PSAnZm9yd2FyZCcpIHtcbi8vIFx0XHRcdG5ld192YWx1ZXMgPSB1dWZsb3dNYW5hZ2VyLmdldEFwcHJvdmVWYWx1ZXMobmV3X3ZhbHVlcywgc3RhcnRfc3RlcC5wZXJtaXNzaW9ucywgZmxvdy5mb3JtLCBmbG93LmN1cnJlbnQuZm9ybV92ZXJzaW9uKTtcbi8vIFx0XHR9XG5cbi8vIFx0XHQvLyDmlrDlu7rnlLPor7fljZXml7bvvIxpbnN0YW5jZXPorrDlvZXmtYHnqIvlkI3np7DjgIHmtYHnqIvliIbnsbvlkI3np7AgIzEzMTNcbi8vIFx0XHR2YXIgY2F0ZWdvcnlfbmFtZSA9IFwiXCI7XG4vLyBcdFx0aWYgKGZvcm0uY2F0ZWdvcnkpIHtcbi8vIFx0XHRcdHZhciBjYXRlZ29yeSA9IHV1Zmxvd01hbmFnZXIuZ2V0Q2F0ZWdvcnkoZm9ybS5jYXRlZ29yeSk7XG4vLyBcdFx0XHRpZiAoY2F0ZWdvcnkpXG4vLyBcdFx0XHRcdGNhdGVnb3J5X25hbWUgPSBjYXRlZ29yeS5uYW1lO1xuLy8gXHRcdH1cblxuLy8gXHRcdF8uZWFjaChmb3J3YXJkX3VzZXJzLCBmdW5jdGlvbiAodXNlcl9pZCkge1xuXG4vLyBcdFx0XHR2YXIgdXNlcl9pbmZvID0gZGIudXNlcnMuZmluZE9uZSh1c2VyX2lkKTtcblxuLy8gXHRcdFx0dmFyIHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbi8vIFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHR1c2VyOiB1c2VyX2lkXG4vLyBcdFx0XHR9LCB7XG4vLyBcdFx0XHRcdGZpZWxkczoge1xuLy8gXHRcdFx0XHRcdG9yZ2FuaXphdGlvbjogMVxuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KTtcbi8vIFx0XHRcdHZhciBzcGFjZV91c2VyX29yZ19pbmZvID0gZGIub3JnYW5pemF0aW9ucy5maW5kT25lKHtcbi8vIFx0XHRcdFx0X2lkOiBzcGFjZV91c2VyLm9yZ2FuaXphdGlvblxuLy8gXHRcdFx0fSwge1xuLy8gXHRcdFx0XHRmaWVsZHM6IHtcbi8vIFx0XHRcdFx0XHRuYW1lOiAxLFxuLy8gXHRcdFx0XHRcdGZ1bGxuYW1lOiAxXG4vLyBcdFx0XHRcdH1cbi8vIFx0XHRcdH0pO1xuXG4vLyBcdFx0XHR2YXIgbm93ID0gbmV3IERhdGUoKTtcbi8vIFx0XHRcdHZhciBpbnNfb2JqID0ge307XG5cbi8vIFx0XHRcdHZhciBhZ2VudCA9IHV1Zmxvd01hbmFnZXIuZ2V0QWdlbnQoc3BhY2VfaWQsIHVzZXJfaWQpO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfaWQgPSB1c2VyX2lkO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfaW5mbyA9IHVzZXJfaW5mbztcbi8vIFx0XHRcdHZhciBoYW5kbGVyX3NwYWNlX3VzZXIgPSBzcGFjZV91c2VyO1xuLy8gXHRcdFx0dmFyIGhhbmRsZXJfb3JnX2luZm8gPSBzcGFjZV91c2VyX29yZ19pbmZvO1xuLy8gXHRcdFx0aWYgKGFnZW50KSB7XG4vLyBcdFx0XHRcdGhhbmRsZXJfaWQgPSBhZ2VudDtcbi8vIFx0XHRcdFx0aGFuZGxlcl9pbmZvID0gZGIudXNlcnMuZmluZE9uZShhZ2VudCk7XG4vLyBcdFx0XHRcdGhhbmRsZXJfc3BhY2VfdXNlciA9IHV1Zmxvd01hbmFnZXIuZ2V0U3BhY2VVc2VyKHNwYWNlX2lkLCBhZ2VudCk7XG4vLyBcdFx0XHRcdGhhbmRsZXJfb3JnX2luZm8gPSB1dWZsb3dNYW5hZ2VyLmdldFNwYWNlVXNlck9yZ0luZm8oaGFuZGxlcl9zcGFjZV91c2VyKTtcbi8vIFx0XHRcdH1cbi8vIFx0XHRcdGluc19vYmouX2lkID0gZGIuaW5zdGFuY2VzLl9tYWtlTmV3SUQoKTtcbi8vIFx0XHRcdGluc19vYmouc3BhY2UgPSBzcGFjZV9pZDtcbi8vIFx0XHRcdGluc19vYmouZmxvdyA9IGZsb3dfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmZsb3dfdmVyc2lvbiA9IGZsb3cuY3VycmVudC5faWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmZvcm0gPSBmbG93LmZvcm07XG4vLyBcdFx0XHRpbnNfb2JqLmZvcm1fdmVyc2lvbiA9IGZsb3cuY3VycmVudC5mb3JtX3ZlcnNpb247XG4vLyBcdFx0XHRpbnNfb2JqLm5hbWUgPSBpbnN0YW5jZV9uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5zdWJtaXR0ZXIgPSBoYW5kbGVyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5zdWJtaXR0ZXJfbmFtZSA9IGhhbmRsZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnQgPSB1c2VyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnRfbmFtZSA9IHVzZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0aW5zX29iai5hcHBsaWNhbnRfb3JnYW5pemF0aW9uID0gc3BhY2VfdXNlci5vcmdhbml6YXRpb247XG4vLyBcdFx0XHRpbnNfb2JqLmFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZSA9IHNwYWNlX3VzZXJfb3JnX2luZm8ubmFtZTtcbi8vIFx0XHRcdGluc19vYmouYXBwbGljYW50X29yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IHNwYWNlX3VzZXJfb3JnX2luZm8uZnVsbG5hbWU7XG4vLyBcdFx0XHRpbnNfb2JqLnN0YXRlID0gXCJkcmFmdFwiO1xuLy8gXHRcdFx0aW5zX29iai5jb2RlID0gXCJcIjtcbi8vIFx0XHRcdGluc19vYmouaXNfYXJjaGl2ZWQgPSBmYWxzZTtcbi8vIFx0XHRcdGluc19vYmouaXNfZGVsZXRlZCA9IGZhbHNlO1xuLy8gXHRcdFx0aW5zX29iai5jcmVhdGVkID0gbm93O1xuLy8gXHRcdFx0aW5zX29iai5jcmVhdGVkX2J5ID0gY3VycmVudF91c2VyX2lkO1xuLy8gXHRcdFx0aW5zX29iai5tb2RpZmllZCA9IG5vdztcbi8vIFx0XHRcdGluc19vYmoubW9kaWZpZWRfYnkgPSBjdXJyZW50X3VzZXJfaWQ7XG4vLyBcdFx0XHRpbnNfb2JqLmluYm94X3VzZXJzID0gW2hhbmRsZXJfaWRdO1xuLy8gXHRcdFx0aW5zX29iai52YWx1ZXMgPSBuZXdfdmFsdWVzO1xuLy8gXHRcdFx0aWYgKGFjdGlvbl90eXBlID09ICdkaXN0cmlidXRlJykge1xuLy8gXHRcdFx0XHQvLyDop6PlhrPlpJrmrKHliIblj5HnnIvkuI3liLDmraPmlofjgIHpmYTku7bpl67pophcbi8vIFx0XHRcdFx0aWYgKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UpIHtcbi8vIFx0XHRcdFx0XHRpbnNfb2JqLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSA9IGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2U7XG4vLyBcdFx0XHRcdH0gZWxzZSB7XG4vLyBcdFx0XHRcdFx0aW5zX29iai5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2UgPSBpbnN0YW5jZV9pZDtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRpbnNfb2JqLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZXMgPSBfLmNsb25lKGlucy5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzKSB8fCBbXTtcbi8vIFx0XHRcdFx0aW5zX29iai5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzLnB1c2goaW5zdGFuY2VfaWQpO1xuXG4vLyBcdFx0XHRcdGlmIChyZWxhdGVkKSB7XG4vLyBcdFx0XHRcdFx0aW5zX29iai5yZWxhdGVkX2luc3RhbmNlcyA9IFtpbnN0YW5jZV9pZF1cbi8vIFx0XHRcdFx0fVxuXG4vLyBcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbl90eXBlID09ICdmb3J3YXJkJykge1xuLy8gXHRcdFx0XHRpbnNfb2JqLmZvcndhcmRfZnJvbV9pbnN0YW5jZSA9IGluc3RhbmNlX2lkXG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdC8vIOaWsOW7ulRyYWNlXG4vLyBcdFx0XHR2YXIgdHJhY2Vfb2JqID0ge307XG4vLyBcdFx0XHR0cmFjZV9vYmouX2lkID0gbmV3IE1vbmdvLk9iamVjdElEKCkuX3N0cjtcbi8vIFx0XHRcdHRyYWNlX29iai5pbnN0YW5jZSA9IGluc19vYmouX2lkO1xuLy8gXHRcdFx0dHJhY2Vfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2U7XG5cbi8vIFx0XHRcdC8vIOW9k+WJjeacgOaWsOeJiGZsb3fkuK3lvIDlp4voioLngrnnmoRzdGVwX2lkXG4vLyBcdFx0XHR2YXIgc3RlcF9pZCwgc3RlcF9uYW1lLCBjYW5fZWRpdF9tYWluX2F0dGFjaCwgY2FuX2VkaXRfbm9ybWFsX2F0dGFjaDtcbi8vIFx0XHRcdGZsb3cuY3VycmVudC5zdGVwcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGVwKSB7XG4vLyBcdFx0XHRcdGlmIChzdGVwLnN0ZXBfdHlwZSA9PSBcInN0YXJ0XCIpIHtcbi8vIFx0XHRcdFx0XHRzdGVwX2lkID0gc3RlcC5faWQ7XG4vLyBcdFx0XHRcdFx0c3RlcF9uYW1lID0gc3RlcC5uYW1lO1xuLy8gXHRcdFx0XHRcdGNhbl9lZGl0X21haW5fYXR0YWNoID0gc3RlcC5jYW5fZWRpdF9tYWluX2F0dGFjaDtcbi8vIFx0XHRcdFx0XHRjYW5fZWRpdF9ub3JtYWxfYXR0YWNoID0gc3RlcC5jYW5fZWRpdF9ub3JtYWxfYXR0YWNoO1xuLy8gXHRcdFx0XHR9XG4vLyBcdFx0XHR9KVxuLy8gXHRcdFx0dHJhY2Vfb2JqLnN0ZXAgPSBzdGVwX2lkO1xuLy8gXHRcdFx0dHJhY2Vfb2JqLnN0YXJ0X2RhdGUgPSBub3c7XG4vLyBcdFx0XHR0cmFjZV9vYmoubmFtZSA9IHN0ZXBfbmFtZTtcblxuLy8gXHRcdFx0Ly8g5paw5bu6QXBwcm92ZVxuLy8gXHRcdFx0dmFyIGFwcHJfb2JqID0ge307XG4vLyBcdFx0XHRhcHByX29iai5faWQgPSBuZXcgTW9uZ28uT2JqZWN0SUQoKS5fc3RyO1xuLy8gXHRcdFx0YXBwcl9vYmouaW5zdGFuY2UgPSBpbnNfb2JqLl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLnRyYWNlID0gdHJhY2Vfb2JqLl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLmlzX2ZpbmlzaGVkID0gZmFsc2U7XG4vLyBcdFx0XHRhcHByX29iai51c2VyID0gdXNlcl9pZDtcbi8vIFx0XHRcdGFwcHJfb2JqLnVzZXJfbmFtZSA9IHVzZXJfaW5mby5uYW1lO1xuLy8gXHRcdFx0YXBwcl9vYmouaGFuZGxlciA9IGhhbmRsZXJfaWQ7XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyX25hbWUgPSBoYW5kbGVyX2luZm8ubmFtZTtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uID0gaGFuZGxlcl9zcGFjZV91c2VyLm9yZ2FuaXphdGlvbjtcbi8vIFx0XHRcdGFwcHJfb2JqLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWUgPSBoYW5kbGVyX29yZ19pbmZvLm5hbWU7XG4vLyBcdFx0XHRhcHByX29iai5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZSA9IGhhbmRsZXJfb3JnX2luZm8uZnVsbG5hbWU7XG4vLyBcdFx0XHRhcHByX29iai50eXBlID0gXCJkcmFmdFwiO1xuLy8gXHRcdFx0YXBwcl9vYmouc3RhcnRfZGF0ZSA9IG5vdztcbi8vIFx0XHRcdGFwcHJfb2JqLnJlYWRfZGF0ZSA9IG5vdztcbi8vIFx0XHRcdGFwcHJfb2JqLmlzX3JlYWQgPSBmYWxzZTtcbi8vIFx0XHRcdGFwcHJfb2JqLmlzX2Vycm9yID0gZmFsc2U7XG5cbi8vIFx0XHRcdGFwcHJfb2JqLnZhbHVlcyA9IG5ld192YWx1ZXM7XG5cbi8vIFx0XHRcdGlmIChhZ2VudCkge1xuLy8gXHRcdFx0XHRhcHByX29iai5hZ2VudCA9IGFnZW50O1xuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHR0cmFjZV9vYmouYXBwcm92ZXMgPSBbYXBwcl9vYmpdO1xuLy8gXHRcdFx0aW5zX29iai50cmFjZXMgPSBbdHJhY2Vfb2JqXTtcblxuLy8gXHRcdFx0aWYgKGZsb3cuYXV0b19yZW1pbmQgPT0gdHJ1ZSlcbi8vIFx0XHRcdFx0aW5zX29iai5hdXRvX3JlbWluZCA9IHRydWU7XG5cbi8vIFx0XHRcdGluc19vYmouY3VycmVudF9zdGVwX25hbWUgPSBzdGFydF9zdGVwLm5hbWU7XG5cbi8vIFx0XHRcdGluc19vYmouZmxvd19uYW1lID0gZmxvdy5uYW1lO1xuLy8gXHRcdFx0aWYgKGNhdGVnb3J5X25hbWUpIHtcbi8vIFx0XHRcdFx0aW5zX29iai5jYXRlZ29yeV9uYW1lID0gY2F0ZWdvcnkubmFtZTtcbi8vIFx0XHRcdFx0aW5zX29iai5jYXRlZ29yeSA9IGNhdGVnb3J5Ll9pZDtcbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0bmV3X2luc19pZCA9IGRiLmluc3RhbmNlcy5pbnNlcnQoaW5zX29iaik7XG5cbi8vIFx0XHRcdC8vIOWkjeWItumZhOS7tlxuLy8gXHRcdFx0dmFyIGNvbGxlY3Rpb24gPSBjZnMuaW5zdGFuY2VzO1xuXG4vLyBcdFx0XHQvL+WwhuWOn+ihqOWNleWGheWuueWtmOWCqOS4uuesrOS4gOS4qumZhOS7tlxuLy8gXHRcdFx0aWYgKGhhc1NhdmVJbnN0YW5jZVRvQXR0YWNobWVudCkge1xuLy8gXHRcdFx0XHQvLyB0cnkge1xuXG4vLyBcdFx0XHRcdGluc3RhbmNlSHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlcl9pbmZvLCBzcGFjZV9pZCwgaW5zLCB7XG4vLyBcdFx0XHRcdFx0YWJzb2x1dGU6IHRydWUsXG4vLyBcdFx0XHRcdFx0c2hvd1RyYWNlOiB0cnVlXG4vLyBcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdHZhciBpbnN0YW5jZUZpbGUgPSBuZXcgRlMuRmlsZSgpO1xuLy8gXHRcdFx0XHRpbnN0YW5jZUZpbGUuYXR0YWNoRGF0YShCdWZmZXIuZnJvbShpbnN0YW5jZUh0bWwsIFwidXRmLThcIiksIHtcbi8vIFx0XHRcdFx0XHR0eXBlOiBcInRleHQvaHRtbFwiXG4vLyBcdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnJvcikge1xuLy8gXHRcdFx0XHRcdGlmIChlcnJvcikge1xuLy8gXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnJvci5lcnJvciwgZXJyb3IucmVhc29uKTtcbi8vIFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHRpbnN0YW5jZUZpbGUubmFtZShpbnMubmFtZSArIFwiLmh0bWxcIik7XG4vLyBcdFx0XHRcdFx0aW5zdGFuY2VGaWxlLnNpemUoaW5zdGFuY2VIdG1sLmxlbmd0aCk7XG5cbi8vIFx0XHRcdFx0XHR2YXIgbWV0YWRhdGEgPSB7XG4vLyBcdFx0XHRcdFx0XHRvd25lcjogdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHRcdG93bmVyX25hbWU6IHVzZXJfaW5mby5uYW1lLFxuLy8gXHRcdFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHRcdFx0aW5zdGFuY2U6IG5ld19pbnNfaWQsXG4vLyBcdFx0XHRcdFx0XHRhcHByb3ZlOiBhcHByX29iai5faWQsXG4vLyBcdFx0XHRcdFx0XHRjdXJyZW50OiB0cnVlXG4vLyBcdFx0XHRcdFx0fTtcbi8vIFx0XHRcdFx0XHRpbnN0YW5jZUZpbGUubWV0YWRhdGEgPSBtZXRhZGF0YTtcbi8vIFx0XHRcdFx0XHR2YXIgZmlsZU9iaiA9IGNvbGxlY3Rpb24uaW5zZXJ0KGluc3RhbmNlRmlsZSk7XG4vLyBcdFx0XHRcdFx0ZmlsZU9iai51cGRhdGUoe1xuLy8gXHRcdFx0XHRcdFx0JHNldDoge1xuLy8gXHRcdFx0XHRcdFx0XHQnbWV0YWRhdGEucGFyZW50JzogZmlsZU9iai5faWRcbi8vIFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHR9KVxuLy8gXHRcdFx0XHR9KVxuXG4vLyBcdFx0XHRcdC8vIH0gY2F0Y2ggKGUpIHtcbi8vIFx0XHRcdFx0Ly8gICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4vLyBcdFx0XHRcdC8vIH1cbi8vIFx0XHRcdH1cblxuLy8gXHRcdFx0aWYgKGlzRm9yd2FyZEF0dGFjaG1lbnRzICYmIGFjdGlvbl90eXBlID09ICdmb3J3YXJkJykge1xuLy8gXHRcdFx0XHR2YXIgZmlsZXMgPSBjb2xsZWN0aW9uLmZpbmQoe1xuLy8gXHRcdFx0XHRcdCdtZXRhZGF0YS5pbnN0YW5jZSc6IGluc3RhbmNlX2lkLFxuLy8gXHRcdFx0XHRcdCdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZVxuLy8gXHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0ZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuLy8gXHRcdFx0XHRcdC8vIOWIpOaWreaWsOeahOa1geeoi+W8gOWni+iKgueCueaYr+WQpuaciee8lui+keato+aWh+WSjOe8lui+kemZhOS7tuadg+mZkFxuLy8gXHRcdFx0XHRcdGlmIChmLm1ldGFkYXRhLm1haW4gPT0gdHJ1ZSkge1xuLy8gXHRcdFx0XHRcdFx0aWYgKGNhbl9lZGl0X21haW5fYXR0YWNoICE9IHRydWUgJiYgY2FuX2VkaXRfbm9ybWFsX2F0dGFjaCAhPSB0cnVlKVxuLy8gXHRcdFx0XHRcdFx0XHRyZXR1cm47XG4vLyBcdFx0XHRcdFx0fSBlbHNlIHtcbi8vIFx0XHRcdFx0XHRcdGlmIChjYW5fZWRpdF9ub3JtYWxfYXR0YWNoICE9IHRydWUpXG4vLyBcdFx0XHRcdFx0XHRcdHJldHVybjtcbi8vIFx0XHRcdFx0XHR9XG5cbi8vIFx0XHRcdFx0XHR2YXIgbmV3RmlsZSA9IG5ldyBGUy5GaWxlKCk7XG4vLyBcdFx0XHRcdFx0bmV3RmlsZS5hdHRhY2hEYXRhKGYuY3JlYXRlUmVhZFN0cmVhbSgnaW5zdGFuY2VzJyksIHtcbi8vIFx0XHRcdFx0XHRcdHR5cGU6IGYub3JpZ2luYWwudHlwZVxuLy8gXHRcdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnIpIHtcbi8vIFx0XHRcdFx0XHRcdGlmIChlcnIpIHtcbi8vIFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcihlcnIuZXJyb3IsIGVyci5yZWFzb24pO1xuLy8gXHRcdFx0XHRcdFx0fVxuLy8gXHRcdFx0XHRcdFx0bmV3RmlsZS5uYW1lKGYubmFtZSgpKTtcbi8vIFx0XHRcdFx0XHRcdG5ld0ZpbGUuc2l6ZShmLnNpemUoKSk7XG4vLyBcdFx0XHRcdFx0XHR2YXIgbWV0YWRhdGEgPSB7XG4vLyBcdFx0XHRcdFx0XHRcdG93bmVyOiB1c2VyX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRvd25lcl9uYW1lOiB1c2VyX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRpbnN0YW5jZTogbmV3X2luc19pZCxcbi8vIFx0XHRcdFx0XHRcdFx0YXBwcm92ZTogYXBwcl9vYmouX2lkLFxuLy8gXHRcdFx0XHRcdFx0XHRjdXJyZW50OiB0cnVlXG4vLyBcdFx0XHRcdFx0XHR9O1xuLy8gXHRcdFx0XHRcdFx0aWYgKGYubWV0YWRhdGEubWFpbiA9PSB0cnVlICYmIGNhbl9lZGl0X21haW5fYXR0YWNoID09IHRydWUpIHtcbi8vIFx0XHRcdFx0XHRcdFx0bWV0YWRhdGEubWFpbiA9IHRydWU7XG4vLyBcdFx0XHRcdFx0XHR9XG4vLyBcdFx0XHRcdFx0XHRuZXdGaWxlLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4vLyBcdFx0XHRcdFx0XHR2YXIgZmlsZU9iaiA9IGNvbGxlY3Rpb24uaW5zZXJ0KG5ld0ZpbGUpO1xuLy8gXHRcdFx0XHRcdFx0ZmlsZU9iai51cGRhdGUoe1xuLy8gXHRcdFx0XHRcdFx0XHQkc2V0OiB7XG4vLyBcdFx0XHRcdFx0XHRcdFx0J21ldGFkYXRhLnBhcmVudCc6IGZpbGVPYmouX2lkXG4vLyBcdFx0XHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0XHRcdH0pXG4vLyBcdFx0XHRcdFx0fSlcblxuLy8gXHRcdFx0XHR9KVxuLy8gXHRcdFx0fVxuXG4vLyBcdFx0XHRpZiAoYWN0aW9uX3R5cGUgPT09ICdkaXN0cmlidXRlJykge1xuLy8gXHRcdFx0XHQvLyDnu5nlvZPliY3nmoTnlLPor7fljZXlop7liqDliIblj5HorrDlvZVcbi8vIFx0XHRcdFx0dmFyIGFwcHIgPSB7XG4vLyBcdFx0XHRcdFx0J19pZCc6IG5ldyBNb25nby5PYmplY3RJRCgpLl9zdHIsXG4vLyBcdFx0XHRcdFx0J2luc3RhbmNlJzogaW5zdGFuY2VfaWQsXG4vLyBcdFx0XHRcdFx0J3RyYWNlJzogY3VycmVudF90cmFjZV9pZCxcbi8vIFx0XHRcdFx0XHQnaXNfZmluaXNoZWQnOiB0cnVlLFxuLy8gXHRcdFx0XHRcdCd1c2VyJzogdXNlcl9pZCxcbi8vIFx0XHRcdFx0XHQndXNlcl9uYW1lJzogdXNlcl9pbmZvLm5hbWUsXG4vLyBcdFx0XHRcdFx0J2hhbmRsZXInOiB1c2VyX2lkLFxuLy8gXHRcdFx0XHRcdCdoYW5kbGVyX25hbWUnOiB1c2VyX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9vcmdhbml6YXRpb24nOiBzcGFjZV91c2VyLm9yZ2FuaXphdGlvbixcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZSc6IHNwYWNlX3VzZXJfb3JnX2luZm8ubmFtZSxcbi8vIFx0XHRcdFx0XHQnaGFuZGxlcl9vcmdhbml6YXRpb25fZnVsbG5hbWUnOiBzcGFjZV91c2VyX29yZ19pbmZvLmZ1bGxuYW1lLFxuLy8gXHRcdFx0XHRcdCd0eXBlJzogYWN0aW9uX3R5cGUsXG4vLyBcdFx0XHRcdFx0J3N0YXJ0X2RhdGUnOiBuZXcgRGF0ZSgpLFxuLy8gXHRcdFx0XHRcdCdmaW5pc2hfZGF0ZSc6IG5ldyBEYXRlKCksXG4vLyBcdFx0XHRcdFx0J2lzX3JlYWQnOiBmYWxzZSxcbi8vIFx0XHRcdFx0XHQnanVkZ2UnOiAnc3VibWl0dGVkJyxcbi8vIFx0XHRcdFx0XHQnZnJvbV91c2VyJzogY3VycmVudF91c2VyX2lkLFxuLy8gXHRcdFx0XHRcdCdmcm9tX3VzZXJfbmFtZSc6IGZyb21fdXNlcl9uYW1lLFxuLy8gXHRcdFx0XHRcdCdmb3J3YXJkX3NwYWNlJzogc3BhY2VfaWQsXG4vLyBcdFx0XHRcdFx0J2ZvcndhcmRfaW5zdGFuY2UnOiBuZXdfaW5zX2lkLFxuLy8gXHRcdFx0XHRcdCdkZXNjcmlwdGlvbic6IGRlc2NyaXB0aW9uLFxuLy8gXHRcdFx0XHRcdCdmcm9tX2FwcHJvdmVfaWQnOiBmcm9tX2FwcHJvdmVfaWRcbi8vIFx0XHRcdFx0fTtcblxuLy8gXHRcdFx0XHRmb3J3YXJkX2FwcHJvdmVzLnB1c2goYXBwcik7XG4vLyBcdFx0XHR9XG5cbi8vIFx0XHRcdG5ld19pbnNfaWRzLnB1c2gobmV3X2luc19pZCk7XG4vLyBcdFx0XHRwdXNoTWFuYWdlci5zZW5kX21lc3NhZ2VfdG9fc3BlY2lmeVVzZXIoXCJjdXJyZW50X3VzZXJcIiwgdXNlcl9pZCk7XG4vLyBcdFx0fSlcblxuLy8gXHRcdGlmICghXy5pc0VtcHR5KGZvcndhcmRfYXBwcm92ZXMpKSB7XG4vLyBcdFx0XHRzZXRfb2JqLm1vZGlmaWVkID0gbmV3IERhdGUoKTtcbi8vIFx0XHRcdHNldF9vYmoubW9kaWZpZWRfYnkgPSBjdXJyZW50X3VzZXJfaWQ7XG4vLyBcdFx0XHR2YXIgciA9IGRiLmluc3RhbmNlcy51cGRhdGUoe1xuLy8gXHRcdFx0XHRfaWQ6IGluc3RhbmNlX2lkLFxuLy8gXHRcdFx0XHRcInRyYWNlcy5faWRcIjogY3VycmVudF90cmFjZV9pZFxuLy8gXHRcdFx0fSwge1xuLy8gXHRcdFx0XHQkc2V0OiBzZXRfb2JqLFxuLy8gXHRcdFx0XHQkYWRkVG9TZXQ6IHtcbi8vIFx0XHRcdFx0XHQndHJhY2VzLiQuYXBwcm92ZXMnOiB7XG4vLyBcdFx0XHRcdFx0XHQkZWFjaDogZm9yd2FyZF9hcHByb3Zlc1xuLy8gXHRcdFx0XHRcdH1cbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSk7XG4vLyBcdFx0fVxuXG5cbi8vIFx0XHRpZiAocikge1xuLy8gXHRcdFx0Xy5lYWNoKGN1cnJlbnRfdHJhY2UuYXBwcm92ZXMsIGZ1bmN0aW9uIChhLCBpZHgpIHtcbi8vIFx0XHRcdFx0aWYgKGEuX2lkID09IGZyb21fYXBwcm92ZV9pZCkge1xuLy8gXHRcdFx0XHRcdHZhciB1cGRhdGVfcmVhZCA9IHt9O1xuLy8gXHRcdFx0XHRcdHVwZGF0ZV9yZWFkW1widHJhY2VzLiQuYXBwcm92ZXMuXCIgKyBpZHggKyBcIi5yZWFkX2RhdGVcIl0gPSBuZXcgRGF0ZSgpO1xuLy8gXHRcdFx0XHRcdGRiLmluc3RhbmNlcy51cGRhdGUoe1xuLy8gXHRcdFx0XHRcdFx0X2lkOiBpbnN0YW5jZV9pZCxcbi8vIFx0XHRcdFx0XHRcdFwidHJhY2VzLl9pZFwiOiBjdXJyZW50X3RyYWNlX2lkXG4vLyBcdFx0XHRcdFx0fSwge1xuLy8gXHRcdFx0XHRcdFx0JHNldDogdXBkYXRlX3JlYWRcbi8vIFx0XHRcdFx0XHR9KTtcbi8vIFx0XHRcdFx0fVxuLy8gXHRcdFx0fSlcblxuLy8gXHRcdH1cblxuLy8gXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRcdGRhdGE6IHsgbmV3X2luc19pZHM6IG5ld19pbnNfaWRzIH1cbi8vIFx0XHR9KVxuLy8gXHR9IGNhdGNoIChlKSB7XG4vLyBcdFx0Y29uc29sZS5lcnJvcihlLnN0YWNrKVxuLy8gXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbi8vIFx0XHRcdGNvZGU6IDIwMCxcbi8vIFx0XHRcdGRhdGE6IHtcbi8vIFx0XHRcdFx0ZXJyb3JzOiBbZV1cbi8vIFx0XHRcdH1cbi8vIFx0XHR9KVxuLy8gXHR9XG5cbi8vIH0pIiwiaWYgcHJvY2Vzcy5lbnYuQ1JFQVRPUl9OT0RFX0VOViA9PSAnZGV2ZWxvcG1lbnQnXG4gICAgSnNvblJvdXRlcy5hZGQgJ3Bvc3QnLCAnL3Rlc3Qvd2ViaG9vaycsIChyZXEsIHJlcywgbmV4dCkgLT5cbiAgICAgICAgdHJ5XG5cbiAgICAgICAgICAgIGhhc2hEYXRhID0gcmVxLmJvZHlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nICdhY3Rpb246ICcsIGhhc2hEYXRhLmFjdGlvblxuICAgICAgICAgICAgY29uc29sZS5sb2cgJ2Zyb21fdXNlcjogJywgaGFzaERhdGEuZnJvbV91c2VyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndG9fdXNlcnM6ICcsIGhhc2hEYXRhLnRvX3VzZXJzXG5cblxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogMjAwXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9XG4gICAgICAgIGNhdGNoIGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgICAgICBjb2RlOiAyMDBcbiAgICAgICAgICAgICAgICBkYXRhOiB7IGVycm9yczogW3tlcnJvck1lc3NhZ2U6IGUubWVzc2FnZX1dIH0iLCJpZiAocHJvY2Vzcy5lbnYuQ1JFQVRPUl9OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICBKc29uUm91dGVzLmFkZCgncG9zdCcsICcvdGVzdC93ZWJob29rJywgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgICB2YXIgZSwgaGFzaERhdGE7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2hEYXRhID0gcmVxLmJvZHk7XG4gICAgICBjb25zb2xlLmxvZygnYWN0aW9uOiAnLCBoYXNoRGF0YS5hY3Rpb24pO1xuICAgICAgY29uc29sZS5sb2coJ2Zyb21fdXNlcjogJywgaGFzaERhdGEuZnJvbV91c2VyKTtcbiAgICAgIGNvbnNvbGUubG9nKCd0b191c2VyczogJywgaGFzaERhdGEudG9fdXNlcnMpO1xuICAgICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogMjAwLFxuICAgICAgICBkYXRhOiB7fVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGUgPSBlcnJvcjtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0c2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZTogKGluc19pZCwgc3RlcF9hcHByb3ZlLCBzdGVwc0FwcHJvdmVzT3B0aW9ucyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc2V0X2luc3RhbmNlX3N0ZXBfYXBwcm92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdHNldF9pbnN0YW5jZV9za2lwX3N0ZXBzOiAoaW5zX2lkLCBzdGVwSWQsIGFjdGlvbiktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc2V0X2luc3RhbmNlX3NraXBfc3RlcHMuYXBwbHkodGhpcywgYXJndW1lbnRzKSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTIyIDE1OjE4OjU5XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuXG5cdGdldF9pbnN0YW5jZV9kYXRhOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIGZvcm1DYWNoZWQsIGZsb3dDYWNoZWQpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmdldF9pbnN0YW5jZV9kYXRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fVxuXG59KTtcbiIsImNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG5cblx0ZHJhZnRfc2F2ZV9pbnN0YW5jZTogZnVuY3Rpb24gKGlucykge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZHJhZnRfc2F2ZV9pbnN0YW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0aW5ib3hfc2F2ZV9pbnN0YW5jZTogZnVuY3Rpb24gKGFwcHJvdmUpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmluYm94X3NhdmVfaW5zdGFuY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9XG5cbn0pIiwiLypcbiAqIEBBdXRob3I6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBEYXRlOiAyMDIzLTAxLTEzIDE3OjM1OjEzXG4gKiBATGFzdEVkaXRvcnM6IHN1bmhhb2xpbkBob3RvYS5jb21cbiAqIEBMYXN0RWRpdFRpbWU6IDIwMjMtMDMtMTEgMTA6NTE6MjlcbiAqIEBEZXNjcmlwdGlvbjogXG4gKi9cbmNvbnN0IHsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kcyh7XG5cdGNjX2RvOiBmdW5jdGlvbiAoYXBwcm92ZSwgY2NfdXNlcl9pZHMsIGRlc2NyaXB0aW9uKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jY19kby5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2NfcmVhZDogZnVuY3Rpb24gKGFwcHJvdmUpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3JlYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNjX3N1Ym1pdDogZnVuY3Rpb24gKGluc19pZCwgZGVzY3JpcHRpb24sIG15QXBwcm92ZSwgY2NIYXNFZGl0UGVybWlzc2lvbikge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2Nfc3VibWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblx0fSxcblxuXHRjY19yZW1vdmU6IGZ1bmN0aW9uIChpbnN0YW5jZUlkLCBhcHByb3ZlSWQpIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0YmF0Y2hfY2FuY2VsX2NjOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIGFwcHJvdmVfaWRzKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5iYXRjaF9jYW5jZWxfY2MuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9LFxuXG5cdGNjX3NhdmU6IGZ1bmN0aW9uIChpbnNfaWQsIGRlc2NyaXB0aW9uLCBteUFwcHJvdmUsIGNjSGFzRWRpdFBlcm1pc3Npb24pIHtcblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNjX3NhdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHR9XG59KSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTIyIDE1OjE4OjM4XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuXHQvLyDmlLnkuLrpgJrov4dhcGnosIPnlKhcblx0Zm9yd2FyZF9pbnN0YW5jZTogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCBzcGFjZV9pZCwgZmxvd19pZCwgaGFzU2F2ZUluc3RhbmNlVG9BdHRhY2htZW50LCBkZXNjcmlwdGlvbiwgaXNGb3J3YXJkQXR0YWNobWVudHMsIHNlbGVjdGVkVXNlcnMsIGFjdGlvbl90eXBlLCByZWxhdGVkLCBmcm9tX2FwcHJvdmVfaWQpIHtcblx0XHRpZiAoIXRoaXMudXNlcklkKVxuXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcignbm90LWF1dGhvcml6ZWQnKTtcblxuXHRcdHJldHVybjtcblx0fSxcblxuXG5cdGZvcndhcmRfcmVtb3ZlOiBmdW5jdGlvbiAoaW5zdGFuY2VfaWQsIHRyYWNlX2lkLCBhcHByb3ZlX2lkKSB7XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5mb3J3YXJkX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH0sXG5cblx0Y2FuY2VsRGlzdHJpYnV0ZTogZnVuY3Rpb24gKGluc3RhbmNlX2lkLCBhcHByb3ZlX2lkcykge1xuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2FuY2VsRGlzdHJpYnV0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdH1cblxuXG59KSIsIi8qXG4gKiBAQXV0aG9yOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBARGF0ZTogMjAyMS0wNS0yNCAxMjozMjo1NlxuICogQExhc3RFZGl0b3JzOiBzdW5oYW9saW5AaG90b2EuY29tXG4gKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTIyIDE1OjE3OjU0XG4gKiBARGVzY3JpcHRpb246IFxuICovXG5jb25zdCB7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHMoe1xuICAgIGNmc19pbnN0YW5jZXNfcmVtb3ZlOiBmdW5jdGlvbiAoZmlsZV9pZCkge1xuICAgICAgICByZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNmc19pbnN0YW5jZXNfcmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgY2ZzX2luc3RhbmNlc19zZXRfY3VycmVudDogZnVuY3Rpb24gKGZpbGVfaWQpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jZnNfaW5zdGFuY2VzX3NldF9jdXJyZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgY2ZzX2luc3RhbmNlc19sb2NrOiBmdW5jdGlvbiAoZmlsZV9pZCwgdXNlcl9pZCwgdXNlcl9uYW1lKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2ZzX2luc3RhbmNlc19sb2NrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9LFxuXG4gICAgY2ZzX2luc3RhbmNlc191bmxvY2s6IGZ1bmN0aW9uIChmaWxlX2lkKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuY2ZzX2luc3RhbmNlc191bmxvY2suYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH0sXG5cbiAgICBkb3dubG9hZF9zcGFjZV9pbnN0YW5jZV9hdHRhY2htZW50c190b19kaXNrOiBmdW5jdGlvbiAoc3BhY2VJZCwgY2ZzUmVjb3JkSWRzKSB7XG4gICAgICAgIHJldHVybiB3b3JrZmxvd01ldGhvZHMuZG93bmxvYWRfc3BhY2VfaW5zdGFuY2VfYXR0YWNobWVudHNfdG9fZGlzay5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfVxufSkiLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0c2V0X2FwcHJvdmVfaGF2ZV9yZWFkOiAoaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuc2V0X2FwcHJvdmVfaGF2ZV9yZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHRjaGFuZ2VfYXBwcm92ZV9pbmZvOiAoaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBkZXNjcmlwdGlvbiwgZmluaXNoX2RhdGUpIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5jaGFuZ2VfYXBwcm92ZV9pbmZvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHR1cGRhdGVfYXBwcm92ZV9zaWduOiAoaW5zdGFuY2VJZCwgdHJhY2VJZCwgYXBwcm92ZUlkLCBzaWduX2ZpZWxkX2NvZGUsIGRlc2NyaXB0aW9uLCBzaWduX3R5cGUsIGxhc3RTaWduQXBwcm92ZSktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlX2FwcHJvdmVfc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblxuXHR1cGRhdGVfc2lnbl9zaG93OiAob2JqcywgbXlBcHByb3ZlX2lkKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlX3NpZ25fc2hvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0aW5zdGFuY2VfcmV0dXJuOiAoYXBwcm92ZSwgcmVhc29uKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5pbnN0YW5jZV9yZXR1cm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRpbnN0YW5jZV9yZW1pbmQ6IChyZW1pbmRfdXNlcnMsIHJlbWluZF9jb3VudCwgcmVtaW5kX2RlYWRsaW5lLCBpbnN0YW5jZV9pZCwgYWN0aW9uX3R5cGVzLCB0cmFjZV9pZCktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuaW5zdGFuY2VfcmVtaW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRuZXh0X3N0ZXBfdXNlcnNfbm90X2ZvdW5kOiAoZGVhbF90eXBlLCBzdGVwX25hbWUsIHBhcmFtcykgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLm5leHRfc3RlcF91c2Vyc19ub3RfZm91bmQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbl9ldmFsID0gcmVxdWlyZSgnZXZhbCcpXG5cbk1ldGVvci5tZXRob2RzXG5cdGluc3RhbmNlTnVtYmVyQnVpbGRlcjogKHNwYWNlSWQsIG5hbWUpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmluc3RhbmNlTnVtYmVyQnVpbGRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Y2hlY2tfbWFpbl9hdHRhY2g6IChpbnNfaWQsIG5hbWUpLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNoZWNrX21haW5fYXR0YWNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRyZW1vdmVfcmVsYXRlZDogKGluc19pZCwgcmVfaW5zX2lkKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5yZW1vdmVfcmVsYXRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0dXBkYXRlX2luc3RhbmNlX3JlbGF0ZWQ6IChpbnNfaWQsIHJlbGF0ZWRfaW5zdGFuY2VzKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy51cGRhdGVfaW5zdGFuY2VfcmVsYXRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0dXBkYXRlRmxvd1Bvc2l0aW9uOiAoZGF0YSkgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnVwZGF0ZUZsb3dQb3NpdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0dXBkYXRlRmxvd1JvbGU6IChkYXRhKSAtPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMudXBkYXRlRmxvd1JvbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRzdGFydF9mbG93OiAoc3BhY2UsIGZsb3dJZCwgc3RhcnQpIC0+XG5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLnN0YXJ0X2Zsb3cuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Z2V0X2luc3RhbmNlX3RyYWNlczogKGluc19pZCktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X2luc3RhbmNlX3RyYWNlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cdCdnZXRfYmF0Y2hfaW5zdGFuY2VzJzogKHNwYWNlLCBjYXRlZ29yeUlkLCBmbG93SWRzKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRfYmF0Y2hfaW5zdGFuY2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXHQnZ2V0X2JhdGNoX2luc3RhbmNlc19jb3VudCc6IChzcGFjZSwgY2F0ZWdvcnlJZCwgZmxvd0lkcyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X2JhdGNoX2luc3RhbmNlc19jb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cblx0J2dldF9teV9hcHByb3Zlcyc6IChpbnN0YW5jZUlkcyktPlxuXHRcdHJldHVybiB3b3JrZmxvd01ldGhvZHMuZ2V0X215X2FwcHJvdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXG5cblxuXG5cblxuXG5cblxuXG4iLCJ7IHdvcmtmbG93TWV0aG9kcyB9ID0gcmVxdWlyZSgnQHN0ZWVkb3Mvd29ya2Zsb3cnKVxuTWV0ZW9yLm1ldGhvZHNcblx0Y2hhbmdlX2Zsb3dfc3RhdGU6IChmbG93cykgLT5cblx0XHRyZXR1cm4gd29ya2Zsb3dNZXRob2RzLmNoYW5nZV9mbG93X3N0YXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcblxuXG5cblxuIiwieyB3b3JrZmxvd01ldGhvZHMgfSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3dvcmtmbG93Jylcbk1ldGVvci5tZXRob2RzXG5cblx0aGlkZV9pbnN0YW5jZTogKGluc0lkLCBpc19oaWRkZW4pIC0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5oaWRlX2luc3RhbmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiIsInsgd29ya2Zsb3dNZXRob2RzIH0gPSByZXF1aXJlKCdAc3RlZWRvcy93b3JrZmxvdycpXG5NZXRlb3IubWV0aG9kc1xuXHRnZXRJbnN0YW5jZVZhbHVlczogKGluc0lkKS0+XG5cdFx0cmV0dXJuIHdvcmtmbG93TWV0aG9kcy5nZXRJbnN0YW5jZVZhbHVlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIiwiQ29va2llcyA9IHJlcXVpcmUoXCJjb29raWVzXCIpXG5cbmdldEluc3RhbmNlUmVhZE9ubHkgPSAocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpIC0+XG5cblx0dXNlciA9IFN0ZWVkb3MuZ2V0QVBJTG9naW5Vc2VyKHJlcSwgcmVzKVxuXG5cdGlmIHJlcT8ucXVlcnk/LmFjY2Vzc190b2tlblxuXHRcdHVzZXJJZCA9IFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuKHJlcS5xdWVyeS5hY2Nlc3NfdG9rZW4pXG5cdFx0aWYgdXNlcklkXG5cdFx0XHR1c2VyID0gTWV0ZW9yLnVzZXJzLmZpbmRPbmUoe19pZDogdXNlcklkfSlcblxuXHRzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZVxuXG5cdGluc3RhbmNlSWQgPSByZXEucGFyYW1zLmluc3RhbmNlX2lkXG5cblx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpbnN0YW5jZUlkfSk7XG5cblx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7X2lkOiBzcGFjZUlkfSk7XG5cblx0aGlkZV90cmFjZXMgPSByZXEucXVlcnk/LmhpZGVfdHJhY2VzXG5cblx0aWYgIW9wdGlvbnNcblx0XHRvcHRpb25zID0ge3Nob3dUcmFjZTogdHJ1ZX1cblx0ZWxzZVxuXHRcdG9wdGlvbnMuc2hvd1RyYWNlID0gdHJ1ZVxuXG5cdGlmIGhpZGVfdHJhY2VzIGlzIFwiMVwiXG5cdFx0aWYgb3B0aW9uc1xuXHRcdFx0b3B0aW9ucy5zaG93VHJhY2UgPSBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdG9wdGlvbnMgPSB7c2hvd1RyYWNlOiBmYWxzZX1cblxuXHRpZiAhb3B0aW9ucy5zaG93QXR0YWNobWVudHNcblx0XHRvcHRpb25zLnNob3dBdHRhY2htZW50cyA9IHRydWVcblxuXHRpZiAhc3BhY2Vcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzcGFjZVwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0aWYgICFpbnN0YW5jZVxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIGluc3RhbmNlXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRpZiAhdXNlclxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlbixYLVVzZXItSWRcIixcblx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0cmV0dXJuO1xuXG5cdGlmIGluc3RhbmNlLnNwYWNlICE9IHNwYWNlSWRcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0ZGF0YTpcblx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzcGFjZSBvciBpbnN0YW5jZVwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblxuXG5cdHNwYWNlVXNlckNvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7IHVzZXI6IHVzZXIuX2lkLCBzcGFjZTogc3BhY2VJZCB9KS5jb3VudCgpXG5cblx0aWYgc3BhY2VVc2VyQ291bnQgaXMgMFxuXHRcdGlmICFzcGFjZVxuXHRcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3Npbmcgc2FwY2VVc2VyXCIsXG5cdFx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0XHRyZXR1cm47XG5cblx0I+agoemqjHVzZXLmmK/lkKblr7lpbnN0YW5jZeacieafpeeci+adg+mZkFxuXHRfaGFzUGVybWlzc2lvbiA9IFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIGluc3RhbmNlKVxuXG5cdGlmICFfaGFzUGVybWlzc2lvbiAgJiYgaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlXG5cdFx0X3BhcmVudF9pbnN0YW5jZXMgPSBfLnVuaW9uKFtpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VdLCBpbnN0YW5jZS5kaXN0cmlidXRlX2Zyb21faW5zdGFuY2VzIHx8IFtdKVxuXG5cdFx0X2hhc1Blcm1pc3Npb24gPSBfLmZpbmQgX3BhcmVudF9pbnN0YW5jZXMsIChfcGFyZW50X2lkKS0+XG5cdFx0XHRfcGFyZW50X2lucyA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6X3BhcmVudF9pZH0sIHtmaWVsZHM6IHt0cmFjZXM6IDB9fSlcblxuXHRcdFx0cmV0dXJuIFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIF9wYXJlbnRfaW5zKVxuXG5cdGlmICFfaGFzUGVybWlzc2lvblxuXHRcdF9sb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSh1c2VyLl9pZCwgdHJ1ZSlcblx0XHRlcnJvciA9IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9wZXJtaXNzaW9uc19lcnJvclwiLCB7fSwgX2xvY2FsZSlcblx0XHRyZXMuY2hhcnNldCA9IFwidXRmLThcIlxuXHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcImVycm9yXCI6IGVycm9yLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0aHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKVxuXHRkYXRhQnVmID0gbmV3IEJ1ZmZlcihodG1sKTtcblx0cmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKVxuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LXJhbmdlJywgXCJieXRlcyAwLSN7ZGF0YUJ1Zi5sZW5ndGggLSAxfS8je2RhdGFCdWYubGVuZ3RofVwiKVxuXHRyZXMuc3RhdHVzQ29kZSA9IDIwMFxuXHRyZXMuZW5kKGh0bWwpXG5cbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZFwiLCBnZXRJbnN0YW5jZVJlYWRPbmx5XG5cbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZC86aW5zdGFuY2VfbmFtZVwiLCAocmVxLCByZXMsIG5leHQpLT5cblx0cmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCcpO1xuXHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQ7ZmlsZW5hbWU9JytlbmNvZGVVUkkocmVxLnBhcmFtcy5pbnN0YW5jZV9uYW1lKSk7XG5cdHJlcy5zZXRIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJywgJycpXG5cblx0b3B0aW9ucyA9IHthYnNvbHV0ZTogdHJ1ZX1cblxuXHRyZXR1cm4gZ2V0SW5zdGFuY2VSZWFkT25seShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucylcbiMjI1xuXHTojrflj5bnlLPor7fljZXliJfooajvvJpcbiAgICBmaW5hbF9kZWNpc2lvbu+8muWuoeaJuee7k+aenFxuICAgIHN0YXRlOiDnlLPor7fljZXnirbmgIFcbiMjI1xuSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvYXBpL3dvcmtmbG93L2luc3RhbmNlc1wiLCAocmVxLCByZXMsIG5leHQpIC0+XG5cblx0aWYgIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcylcblx0XHRyZXR1cm4gO1xuXG5cdHVzZXJfaWQgPSByZXEudXNlcklkXG5cblx0c3BhY2VJZCA9IHJlcS5oZWFkZXJzW1wieC1zcGFjZS1pZFwiXVxuXG5cdGlmIG5vdCBzcGFjZUlkXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1TcGFjZS1JZFwiLFxuXHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRyZXR1cm47XG5cblx0Zmxvd0lkID0gcmVxLnF1ZXJ5Py5mbG93SWRcblxuXHRpZiAhZmxvd0lkXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDQwMCxcblx0XHRcdGRhdGE6XG5cdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgZmxvd0lkXCIsXG5cdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdHJldHVybjtcblxuXHRxdWVyeSA9IHt9XG5cblx0cmV0X3N5bmNfdG9rZW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuXG5cdGZsb3dJZHMgPSBmbG93SWQuc3BsaXQoXCIsXCIpXG5cblxuXHRmbG93cyA9IGRiLmZsb3dzLmZpbmQoe19pZDogeyRpbjogZmxvd0lkc319KS5mZXRjaCgpXG5cblx0aSA9IDBcblx0d2hpbGUgaSA8IGZsb3dzLmxlbmd0aFxuXHRcdGYgPSBmbG93c1tpXVxuXHRcdHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3NwYWNlOiBmLnNwYWNlLCB1c2VyOiB1c2VyX2lkfSlcblx0XHRpZiAhc3BhY2VVc2VyXG5cdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRcdGRhdGE6XG5cdFx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyAje2YuX2lkfVwiLFxuXHRcdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdFx0cmV0dXJuO1xuXHRcdGVsc2VcblxuXHQjXHTmmK/lkKblt6XkvZzljLrnrqHnkIblkZhcblx0XHRpZiAhU3RlZWRvcy5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcl9pZClcblx0XHRcdHNwYWNlVXNlck9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuXHRcdFx0XHRfaWQ6IHtcblx0XHRcdFx0XHQkaW46IHNwYWNlVXNlci5vcmdhbml6YXRpb25zXG5cdFx0XHRcdH1cblx0XHRcdH0pLmZldGNoKCk7XG5cblx0XHRcdGlmICFXb3JrZmxvd01hbmFnZXIuY2FuTW9uaXRvcihmLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMpICYmICFXb3JrZmxvd01hbmFnZXIuY2FuQWRtaW4oZiwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zKVxuXHRcdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFx0XCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyAje2YuX2lkfVwiLFxuXHRcdFx0XHRcdFx0XCJzdWNjZXNzXCI6IGZhbHNlXG5cdFx0XHRcdHJldHVybjtcblx0XHRpKytcblxuXG5cdHF1ZXJ5LmZsb3cgPSB7JGluOiBmbG93SWRzfVxuXG5cdHF1ZXJ5LnNwYWNlID0gc3BhY2VJZFxuXG5cdGlmIHJlcS5xdWVyeT8uc3luY190b2tlblxuXHRcdHN5bmNfdG9rZW4gPSBuZXcgRGF0ZShOdW1iZXIocmVxLnF1ZXJ5LnN5bmNfdG9rZW4pKVxuXHRcdHF1ZXJ5Lm1vZGlmaWVkID0geyRndDogc3luY190b2tlbn1cblxuXHRpZiByZXEucXVlcnk/LmZpbmFsX2RlY2lzaW9uXG5cdFx0cXVlcnkuZmluYWxfZGVjaXNpb24gPSB7JGluIDogcmVxLnF1ZXJ5LmZpbmFsX2RlY2lzaW9uLnNwbGl0KFwiLFwiKX1cblx0ZWxzZVxuXHRcdHF1ZXJ5LmZpbmFsX2RlY2lzaW9uID0geyRuaW46IFtcInRlcm1pbmF0ZWRcIiwgXCJyZWplY3RlZFwiXX1cblxuXHRpZiByZXEucXVlcnk/LnN0YXRlXG5cdFx0cXVlcnkuc3RhdGUgPSB7JGluOiByZXEucXVlcnkuc3RhdGUuc3BsaXQoXCIsXCIpfVxuXHRlbHNlXG5cdFx0cXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiXG5cbiNcdOacgOWkmui/lOWbnjUwMOadoeaVsOaNrlxuXHRpbnN0YW5jZXMgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge2ZpZWxkczoge2luYm94X3VlcnM6IDAsIGNjX3VzZXJzOiAwLCBvdXRib3hfdXNlcnM6IDAsIHRyYWNlczogMCwgYXR0YWNobWVudHM6IDB9LCBza2lwOiAwLCBsaW1pdDogNTAwfSkuZmV0Y2goKVxuXHRpbnN0YW5jZXMuZm9yRWFjaCAoaW5zdGFuY2UpLT5cblxuXHRcdGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHsnbWV0YWRhdGEuaW5zdGFuY2UnOiBpbnN0YW5jZS5faWQsJ21ldGFkYXRhLmN1cnJlbnQnOiB0cnVlLCBcIm1ldGFkYXRhLmlzX3ByaXZhdGVcIjogeyRuZTogdHJ1ZX19LCB7ZmllbGRzOiB7Y29waWVzOiAwfX0pLmZldGNoKClcblxuXHRcdGluc3RhbmNlLmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHNcblxuXG5cdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRjb2RlOiAyMDAsXG5cdFx0XHRkYXRhOlxuXHRcdFx0XHRcInN0YXR1c1wiOiBcInN1Y2Nlc3NcIixcblx0XHRcdFx0XCJzeW5jX3Rva2VuXCI6IHJldF9zeW5jX3Rva2VuXG5cdFx0XHRcdFwiZGF0YVwiOiBpbnN0YW5jZXNcblx0cmV0dXJuO1xuIiwidmFyIENvb2tpZXMsIGdldEluc3RhbmNlUmVhZE9ubHk7XG5cbkNvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKTtcblxuZ2V0SW5zdGFuY2VSZWFkT25seSA9IGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0LCBvcHRpb25zKSB7XG4gIHZhciBfaGFzUGVybWlzc2lvbiwgX2xvY2FsZSwgX3BhcmVudF9pbnN0YW5jZXMsIGRhdGFCdWYsIGVycm9yLCBoaWRlX3RyYWNlcywgaHRtbCwgaW5zdGFuY2UsIGluc3RhbmNlSWQsIHJlZiwgcmVmMSwgc3BhY2UsIHNwYWNlSWQsIHNwYWNlVXNlckNvdW50LCB1c2VyLCB1c2VySWQ7XG4gIHVzZXIgPSBTdGVlZG9zLmdldEFQSUxvZ2luVXNlcihyZXEsIHJlcyk7XG4gIGlmIChyZXEgIT0gbnVsbCA/IChyZWYgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYuYWNjZXNzX3Rva2VuIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgdXNlcklkID0gU3RlZWRvcy5nZXRVc2VySWRGcm9tQWNjZXNzVG9rZW4ocmVxLnF1ZXJ5LmFjY2Vzc190b2tlbik7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgdXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZTtcbiAgaW5zdGFuY2VJZCA9IHJlcS5wYXJhbXMuaW5zdGFuY2VfaWQ7XG4gIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgIF9pZDogaW5zdGFuY2VJZFxuICB9KTtcbiAgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7XG4gICAgX2lkOiBzcGFjZUlkXG4gIH0pO1xuICBoaWRlX3RyYWNlcyA9IChyZWYxID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmMS5oaWRlX3RyYWNlcyA6IHZvaWQgMDtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHNob3dUcmFjZTogdHJ1ZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucy5zaG93VHJhY2UgPSB0cnVlO1xuICB9XG4gIGlmIChoaWRlX3RyYWNlcyA9PT0gXCIxXCIpIHtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgb3B0aW9ucy5zaG93VHJhY2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgc2hvd1RyYWNlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKCFvcHRpb25zLnNob3dBdHRhY2htZW50cykge1xuICAgIG9wdGlvbnMuc2hvd0F0dGFjaG1lbnRzID0gdHJ1ZTtcbiAgfVxuICBpZiAoIXNwYWNlKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNwYWNlXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIGluc3RhbmNlXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXVzZXIpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDEsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZFwiLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGluc3RhbmNlLnNwYWNlICE9PSBzcGFjZUlkKSB7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIHNwYWNlIG9yIGluc3RhbmNlXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBzcGFjZVVzZXJDb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgIHVzZXI6IHVzZXIuX2lkLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0pLmNvdW50KCk7XG4gIGlmIChzcGFjZVVzZXJDb3VudCA9PT0gMCkge1xuICAgIGlmICghc3BhY2UpIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAxLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBzYXBjZVVzZXJcIixcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIF9oYXNQZXJtaXNzaW9uID0gV29ya2Zsb3dNYW5hZ2VyLmhhc0luc3RhbmNlUGVybWlzc2lvbnModXNlciwgaW5zdGFuY2UpO1xuICBpZiAoIV9oYXNQZXJtaXNzaW9uICYmIGluc3RhbmNlLmRpc3RyaWJ1dGVfZnJvbV9pbnN0YW5jZSkge1xuICAgIF9wYXJlbnRfaW5zdGFuY2VzID0gXy51bmlvbihbaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlXSwgaW5zdGFuY2UuZGlzdHJpYnV0ZV9mcm9tX2luc3RhbmNlcyB8fCBbXSk7XG4gICAgX2hhc1Blcm1pc3Npb24gPSBfLmZpbmQoX3BhcmVudF9pbnN0YW5jZXMsIGZ1bmN0aW9uKF9wYXJlbnRfaWQpIHtcbiAgICAgIHZhciBfcGFyZW50X2lucztcbiAgICAgIF9wYXJlbnRfaW5zID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IF9wYXJlbnRfaWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgdHJhY2VzOiAwXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFdvcmtmbG93TWFuYWdlci5oYXNJbnN0YW5jZVBlcm1pc3Npb25zKHVzZXIsIF9wYXJlbnRfaW5zKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoIV9oYXNQZXJtaXNzaW9uKSB7XG4gICAgX2xvY2FsZSA9IFN0ZWVkb3MubG9jYWxlKHVzZXIuX2lkLCB0cnVlKTtcbiAgICBlcnJvciA9IFRBUGkxOG4uX18oXCJpbnN0YW5jZV9wZXJtaXNzaW9uc19lcnJvclwiLCB7fSwgX2xvY2FsZSk7XG4gICAgcmVzLmNoYXJzZXQgPSBcInV0Zi04XCI7XG4gICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogNDAxLFxuICAgICAgZGF0YToge1xuICAgICAgICBcImVycm9yXCI6IGVycm9yLFxuICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaHRtbCA9IEluc3RhbmNlUmVhZE9ubHlUZW1wbGF0ZS5nZXRJbnN0YW5jZUh0bWwodXNlciwgc3BhY2UsIGluc3RhbmNlLCBvcHRpb25zKTtcbiAgZGF0YUJ1ZiA9IG5ldyBCdWZmZXIoaHRtbCk7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgcmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBkYXRhQnVmLmxlbmd0aCk7XG4gIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtcmFuZ2UnLCBcImJ5dGVzIDAtXCIgKyAoZGF0YUJ1Zi5sZW5ndGggLSAxKSArIFwiL1wiICsgZGF0YUJ1Zi5sZW5ndGgpO1xuICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgcmV0dXJuIHJlcy5lbmQoaHRtbCk7XG59O1xuXG5Kc29uUm91dGVzLmFkZChcImdldFwiLCBcIi93b3JrZmxvdy9zcGFjZS86c3BhY2Uvdmlldy9yZWFkb25seS86aW5zdGFuY2VfaWRcIiwgZ2V0SW5zdGFuY2VSZWFkT25seSk7XG5cbkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL3dvcmtmbG93L3NwYWNlLzpzcGFjZS92aWV3L3JlYWRvbmx5LzppbnN0YW5jZV9pZC86aW5zdGFuY2VfbmFtZVwiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgb3B0aW9ucztcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCcpO1xuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQ7ZmlsZW5hbWU9JyArIGVuY29kZVVSSShyZXEucGFyYW1zLmluc3RhbmNlX25hbWUpKTtcbiAgcmVzLnNldEhlYWRlcignVHJhbnNmZXItRW5jb2RpbmcnLCAnJyk7XG4gIG9wdGlvbnMgPSB7XG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfTtcbiAgcmV0dXJuIGdldEluc3RhbmNlUmVhZE9ubHkocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpO1xufSk7XG5cblxuLypcblx06I635Y+W55Sz6K+35Y2V5YiX6KGo77yaXG4gICAgZmluYWxfZGVjaXNpb27vvJrlrqHmibnnu5PmnpxcbiAgICBzdGF0ZTog55Sz6K+35Y2V54q25oCBXG4gKi9cblxuSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvYXBpL3dvcmtmbG93L2luc3RhbmNlc1wiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZiwgZmxvd0lkLCBmbG93SWRzLCBmbG93cywgaSwgaW5zdGFuY2VzLCBxdWVyeSwgcmVmLCByZWYxLCByZWYyLCByZWYzLCByZXRfc3luY190b2tlbiwgc3BhY2VJZCwgc3BhY2VVc2VyLCBzcGFjZVVzZXJPcmdhbml6YXRpb25zLCBzeW5jX3Rva2VuLCB1c2VyX2lkO1xuICBpZiAoIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdXNlcl9pZCA9IHJlcS51c2VySWQ7XG4gIHNwYWNlSWQgPSByZXEuaGVhZGVyc1tcIngtc3BhY2UtaWRcIl07XG4gIGlmICghc3BhY2VJZCkge1xuICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDQwMSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLVNwYWNlLUlkXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBmbG93SWQgPSAocmVmID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmLmZsb3dJZCA6IHZvaWQgMDtcbiAgaWYgKCFmbG93SWQpIHtcbiAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiA0MDAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgZmxvd0lkXCIsXG4gICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBxdWVyeSA9IHt9O1xuICByZXRfc3luY190b2tlbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBmbG93SWRzID0gZmxvd0lkLnNwbGl0KFwiLFwiKTtcbiAgZmxvd3MgPSBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogZmxvd0lkc1xuICAgIH1cbiAgfSkuZmV0Y2goKTtcbiAgaSA9IDA7XG4gIHdoaWxlIChpIDwgZmxvd3MubGVuZ3RoKSB7XG4gICAgZiA9IGZsb3dzW2ldO1xuICAgIHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IGYuc3BhY2UsXG4gICAgICB1c2VyOiB1c2VyX2lkXG4gICAgfSk7XG4gICAgaWYgKCFzcGFjZVVzZXIpIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAxLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyBcIiArIGYuX2lkLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuXG4gICAgfVxuICAgIGlmICghU3RlZWRvcy5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcl9pZCkpIHtcbiAgICAgIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IHNwYWNlVXNlci5vcmdhbml6YXRpb25zXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgICBpZiAoIVdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGYsIHNwYWNlVXNlciwgc3BhY2VVc2VyT3JnYW5pemF0aW9ucykgJiYgIVdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmLCBzcGFjZVVzZXIsIHNwYWNlVXNlck9yZ2FuaXphdGlvbnMpKSB7XG4gICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTm8gcGVybWlzc2lvbiwgZmxvdyBpcyBcIiArIGYuX2lkLFxuICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpKys7XG4gIH1cbiAgcXVlcnkuZmxvdyA9IHtcbiAgICAkaW46IGZsb3dJZHNcbiAgfTtcbiAgcXVlcnkuc3BhY2UgPSBzcGFjZUlkO1xuICBpZiAoKHJlZjEgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYxLnN5bmNfdG9rZW4gOiB2b2lkIDApIHtcbiAgICBzeW5jX3Rva2VuID0gbmV3IERhdGUoTnVtYmVyKHJlcS5xdWVyeS5zeW5jX3Rva2VuKSk7XG4gICAgcXVlcnkubW9kaWZpZWQgPSB7XG4gICAgICAkZ3Q6IHN5bmNfdG9rZW5cbiAgICB9O1xuICB9XG4gIGlmICgocmVmMiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjIuZmluYWxfZGVjaXNpb24gOiB2b2lkIDApIHtcbiAgICBxdWVyeS5maW5hbF9kZWNpc2lvbiA9IHtcbiAgICAgICRpbjogcmVxLnF1ZXJ5LmZpbmFsX2RlY2lzaW9uLnNwbGl0KFwiLFwiKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkuZmluYWxfZGVjaXNpb24gPSB7XG4gICAgICAkbmluOiBbXCJ0ZXJtaW5hdGVkXCIsIFwicmVqZWN0ZWRcIl1cbiAgICB9O1xuICB9XG4gIGlmICgocmVmMyA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjMuc3RhdGUgOiB2b2lkIDApIHtcbiAgICBxdWVyeS5zdGF0ZSA9IHtcbiAgICAgICRpbjogcmVxLnF1ZXJ5LnN0YXRlLnNwbGl0KFwiLFwiKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiO1xuICB9XG4gIGluc3RhbmNlcyA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBpbmJveF91ZXJzOiAwLFxuICAgICAgY2NfdXNlcnM6IDAsXG4gICAgICBvdXRib3hfdXNlcnM6IDAsXG4gICAgICB0cmFjZXM6IDAsXG4gICAgICBhdHRhY2htZW50czogMFxuICAgIH0sXG4gICAgc2tpcDogMCxcbiAgICBsaW1pdDogNTAwXG4gIH0pLmZldGNoKCk7XG4gIGluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgdmFyIGF0dGFjaG1lbnRzO1xuICAgIGF0dGFjaG1lbnRzID0gY2ZzLmluc3RhbmNlcy5maW5kKHtcbiAgICAgICdtZXRhZGF0YS5pbnN0YW5jZSc6IGluc3RhbmNlLl9pZCxcbiAgICAgICdtZXRhZGF0YS5jdXJyZW50JzogdHJ1ZSxcbiAgICAgIFwibWV0YWRhdGEuaXNfcHJpdmF0ZVwiOiB7XG4gICAgICAgICRuZTogdHJ1ZVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBjb3BpZXM6IDBcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIHJldHVybiBpbnN0YW5jZS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzO1xuICB9KTtcbiAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgIGNvZGU6IDIwMCxcbiAgICBkYXRhOiB7XG4gICAgICBcInN0YXR1c1wiOiBcInN1Y2Nlc3NcIixcbiAgICAgIFwic3luY190b2tlblwiOiByZXRfc3luY190b2tlbixcbiAgICAgIFwiZGF0YVwiOiBpbnN0YW5jZXNcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJcbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL3N0ZWVkb3MtY3NzXCIsIChyZXEsIHJlcywgbmV4dCktPlxuXHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9jc3MnKTtcblx0YWxsQ3NzID0gV2ViQXBwLmdldFJlZnJlc2hhYmxlQXNzZXRzKClcblxuXHRhbGxDc3NMaW5rID0gXCJcIlxuXG5cdGFsbENzcy5mb3JFYWNoIChjc3MpIC0+XG5cdFx0aWYgX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWFxuXHRcdFx0cm9vdFVybCA9IF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxcblx0XHRcdGlmIHJvb3RVcmwuZW5kc1dpdGgoXCIvXCIpXG5cdFx0XHRcdGNzc0hyZWYgPSByb290VXJsLnJlcGxhY2UoX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCArIFwiL1wiLCBcIlwiKSArIGNzcy51cmxcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y3NzSHJlZiA9IHJvb3RVcmwucmVwbGFjZShfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYLCBcIlwiKSArIGNzcy51cmxcblx0XHRlbHNlXG5cdFx0XHRjc3NIcmVmID0gTWV0ZW9yLmFic29sdXRlVXJsKGNzcy51cmwpXG5cdFx0YWxsQ3NzTGluayArPSBcIkBpbXBvcnQgdXJsKCN7Y3NzSHJlZn0pO1wiXG5cblx0cmVzLnN0YXR1c0NvZGUgPSAyMDBcblx0cmVzLmVuZChhbGxDc3NMaW5rKSIsIkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL3N0ZWVkb3MtY3NzXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBhbGxDc3MsIGFsbENzc0xpbms7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2NzcycpO1xuICBhbGxDc3MgPSBXZWJBcHAuZ2V0UmVmcmVzaGFibGVBc3NldHMoKTtcbiAgYWxsQ3NzTGluayA9IFwiXCI7XG4gIGFsbENzcy5mb3JFYWNoKGZ1bmN0aW9uKGNzcykge1xuICAgIHZhciBjc3NIcmVmLCByb290VXJsO1xuICAgIGlmIChfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYKSB7XG4gICAgICByb290VXJsID0gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTDtcbiAgICAgIGlmIChyb290VXJsLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICBjc3NIcmVmID0gcm9vdFVybC5yZXBsYWNlKF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVggKyBcIi9cIiwgXCJcIikgKyBjc3MudXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3NzSHJlZiA9IHJvb3RVcmwucmVwbGFjZShfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYLCBcIlwiKSArIGNzcy51cmw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNzc0hyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoY3NzLnVybCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxDc3NMaW5rICs9IFwiQGltcG9ydCB1cmwoXCIgKyBjc3NIcmVmICsgXCIpO1wiO1xuICB9KTtcbiAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gIHJldHVybiByZXMuZW5kKGFsbENzc0xpbmspO1xufSk7XG4iLCJKc29uUm91dGVzLmFkZCBcImdldFwiLCBcIi9hcGkvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvZHJhZnQvOmZsb3dcIiwgKHJlcSwgcmVzLCBuZXh0KSAtPlxuXHRpZiAhU3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrKHJlcSwgcmVzKVxuXHRcdHJldHVyblxuXG5cdHVzZXJfaWQgPSByZXEudXNlcklkXG5cblx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoeyBfaWQ6IHVzZXJfaWQgfSlcblxuXHRzcGFjZUlkID0gcmVxLnBhcmFtcy5zcGFjZVxuXG5cdGZsb3dJZCA9IHJlcS5wYXJhbXMuZmxvd1xuXG5cdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoeyBfaWQ6IHNwYWNlSWQgfSlcblxuXHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7IF9pZDogZmxvd0lkIH0sIHsgZmllbGRzOiB7IG5hbWU6IDEsICdjdXJyZW50Ll9pZCc6IDEsIGZvcm06IDEgfSB9KVxuXG5cdGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHsgX2lkOiBmbG93LmZvcm0gfSwgeyBmaWVsZHM6IHsgJ2N1cnJlbnQuX2lkJzogMSB9IH0pXG5cblx0b3B0aW9ucyA9IHtcblx0XHRzaG93VHJhY2U6IGZhbHNlLFxuXHRcdHNob3dBdHRhY2htZW50czogZmFsc2UsXG5cdFx0dGVtcGxhdGVOYW1lOiBcImRlZmF1bHRcIixcblx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0aW5zdGFuY2Vfc3R5bGU6IFwiaW5zdGFuY2UtZGVmYXVsdFwiLFxuXHRcdHBsdWdpbnM6IFwiXCJcIlxuXG5cdFx0XHQ8bWV0YSBodHRwLWVxdWl2PVwiWC1VQS1Db21wYXRpYmxlXCIgY29udGVudD1cIklFPWVkZ2UsY2hyb21lPTFcIiAvPlxuXHRcdFx0PG1ldGEgbmFtZT1cImZvcm1hdC1kZXRlY3Rpb25cIiBjb250ZW50PVwidGVsZXBob25lPW5vXCI+XG5cdFx0XHQ8bWV0YSBodHRwLWVxdWl2PVwieC1yaW0tYXV0by1tYXRjaFwiIGNvbnRlbnQ9XCJub25lXCI+XG5cdFx0XHQ8dGl0bGU+I3tmbG93Lm5hbWV9PC90aXRsZT5cblx0XHRcdDxtZXRhIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPTAnIG5hbWU9J3ZpZXdwb3J0JyAvPlxuXHRcdFx0PG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aFwiIC8+XG5cblx0XHRcdDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2Nzcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmNzc1wiPlxuXG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzXCIgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPjwvc2NyaXB0PlxuXG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9sb2NhbGVzL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci56aC1DTi5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBjaGFyc2V0PVwiVVRGLThcIj48L3NjcmlwdD5cblxuXHRcdFx0PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIvcGx1Z2lucy90b2FzdHIvdG9hc3RyLm1pbi5jc3NcIj5cblx0XHRcdDxzY3JpcHQgc3JjPVwiL3BsdWdpbnMvdG9hc3RyL3RvYXN0ci5taW4uanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cdFx0XHQ8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIi9qcy93b3JrZmxvd19jbGllbnQuY3NzXCI+XG5cdFx0XHQ8c2NyaXB0IHNyYz1cIi9qcy93b3JrZmxvd19jbGllbnQuanNcIiB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+PC9zY3JpcHQ+XG5cdFx0XCJcIlwiXG5cdH1cblxuXHRpbnN0YW5jZSA9IHtcblx0XHRmbG93OiBmbG93Ll9pZCxcblx0XHRmbG93X3ZlcnNpb246IGZsb3cuY3VycmVudC5faWQsXG5cdFx0Zm9ybTogZm9ybS5faWQsXG5cdFx0Zm9ybV92ZXJzaW9uOiBmb3JtLmN1cnJlbnQuX2lkLFxuXHRcdHZhbHVlczoge30sXG5cdFx0bmFtZTogZmxvdy5uYW1lLFxuXHRcdHNwYWNlOiBzcGFjZUlkXG5cdH1cblxuXHRodG1sID0gSW5zdGFuY2VSZWFkT25seVRlbXBsYXRlLmdldEluc3RhbmNlSHRtbCh1c2VyLCBzcGFjZSwgaW5zdGFuY2UsIG9wdGlvbnMpXG5cblx0ZGF0YUJ1ZiA9IG5ldyBCdWZmZXIoaHRtbClcblxuXHRyZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKVxuXG5cdHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtcmFuZ2UnLCBcImJ5dGVzIDAtI3tkYXRhQnVmLmxlbmd0aCAtIDF9LyN7ZGF0YUJ1Zi5sZW5ndGh9XCIpXG5cblx0cmVzLnN0YXR1c0NvZGUgPSAyMDBcblxuXHRyZXMuZW5kKGh0bWwpXG4iLCJKc29uUm91dGVzLmFkZChcImdldFwiLCBcIi9hcGkvd29ya2Zsb3cvc3BhY2UvOnNwYWNlL3ZpZXcvZHJhZnQvOmZsb3dcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGRhdGFCdWYsIGZsb3csIGZsb3dJZCwgZm9ybSwgaHRtbCwgaW5zdGFuY2UsIG9wdGlvbnMsIHNwYWNlLCBzcGFjZUlkLCB1c2VyLCB1c2VyX2lkO1xuICBpZiAoIVN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayhyZXEsIHJlcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdXNlcl9pZCA9IHJlcS51c2VySWQ7XG4gIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICBfaWQ6IHVzZXJfaWRcbiAgfSk7XG4gIHNwYWNlSWQgPSByZXEucGFyYW1zLnNwYWNlO1xuICBmbG93SWQgPSByZXEucGFyYW1zLmZsb3c7XG4gIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoe1xuICAgIF9pZDogc3BhY2VJZFxuICB9KTtcbiAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgIF9pZDogZmxvd0lkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICAnY3VycmVudC5faWQnOiAxLFxuICAgICAgZm9ybTogMVxuICAgIH1cbiAgfSk7XG4gIGZvcm0gPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICBfaWQ6IGZsb3cuZm9ybVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICAnY3VycmVudC5faWQnOiAxXG4gICAgfVxuICB9KTtcbiAgb3B0aW9ucyA9IHtcbiAgICBzaG93VHJhY2U6IGZhbHNlLFxuICAgIHNob3dBdHRhY2htZW50czogZmFsc2UsXG4gICAgdGVtcGxhdGVOYW1lOiBcImRlZmF1bHRcIixcbiAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgaW5zdGFuY2Vfc3R5bGU6IFwiaW5zdGFuY2UtZGVmYXVsdFwiLFxuICAgIHBsdWdpbnM6IFwiXFxuPG1ldGEgaHR0cC1lcXVpdj1cXFwiWC1VQS1Db21wYXRpYmxlXFxcIiBjb250ZW50PVxcXCJJRT1lZGdlLGNocm9tZT0xXFxcIiAvPlxcbjxtZXRhIG5hbWU9XFxcImZvcm1hdC1kZXRlY3Rpb25cXFwiIGNvbnRlbnQ9XFxcInRlbGVwaG9uZT1ub1xcXCI+XFxuPG1ldGEgaHR0cC1lcXVpdj1cXFwieC1yaW0tYXV0by1tYXRjaFxcXCIgY29udGVudD1cXFwibm9uZVxcXCI+XFxuPHRpdGxlPlwiICsgZmxvdy5uYW1lICsgXCI8L3RpdGxlPlxcbjxtZXRhIGNvbnRlbnQ9J3dpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIG1heGltdW0tc2NhbGU9MS4wLCB1c2VyLXNjYWxhYmxlPTAnIG5hbWU9J3ZpZXdwb3J0JyAvPlxcbjxtZXRhIG5hbWU9XFxcInZpZXdwb3J0XFxcIiBjb250ZW50PVxcXCJ3aWR0aD1kZXZpY2Utd2lkdGhcXFwiIC8+XFxuXFxuPGxpbmsgcmVsPVxcXCJzdHlsZXNoZWV0XFxcIiB0eXBlPVxcXCJ0ZXh0L2Nzc1xcXCIgaHJlZj1cXFwiL3BsdWdpbnMvYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyL2Nzcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmNzc1xcXCI+XFxuXFxuPHNjcmlwdCBzcmM9XFxcIi9wbHVnaW5zL2Jvb3RzdHJhcC1kYXRldGltZXBpY2tlci9qcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIubWluLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgc3JjPVxcXCIvcGx1Z2lucy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIvanMvbG9jYWxlcy9ib290c3RyYXAtZGF0ZXRpbWVwaWNrZXIuemgtQ04uanNcXFwiIHR5cGU9XFxcInRleHQvamF2YXNjcmlwdFxcXCIgY2hhcnNldD1cXFwiVVRGLThcXFwiPjwvc2NyaXB0PlxcblxcbjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGhyZWY9XFxcIi9wbHVnaW5zL3RvYXN0ci90b2FzdHIubWluLmNzc1xcXCI+XFxuPHNjcmlwdCBzcmM9XFxcIi9wbHVnaW5zL3RvYXN0ci90b2FzdHIubWluLmpzXFxcIiB0eXBlPVxcXCJ0ZXh0L2phdmFzY3JpcHRcXFwiPjwvc2NyaXB0PlxcbjxsaW5rIHJlbD1cXFwic3R5bGVzaGVldFxcXCIgdHlwZT1cXFwidGV4dC9jc3NcXFwiIGhyZWY9XFxcIi9qcy93b3JrZmxvd19jbGllbnQuY3NzXFxcIj5cXG48c2NyaXB0IHNyYz1cXFwiL2pzL3dvcmtmbG93X2NsaWVudC5qc1xcXCIgdHlwZT1cXFwidGV4dC9qYXZhc2NyaXB0XFxcIj48L3NjcmlwdD5cIlxuICB9O1xuICBpbnN0YW5jZSA9IHtcbiAgICBmbG93OiBmbG93Ll9pZCxcbiAgICBmbG93X3ZlcnNpb246IGZsb3cuY3VycmVudC5faWQsXG4gICAgZm9ybTogZm9ybS5faWQsXG4gICAgZm9ybV92ZXJzaW9uOiBmb3JtLmN1cnJlbnQuX2lkLFxuICAgIHZhbHVlczoge30sXG4gICAgbmFtZTogZmxvdy5uYW1lLFxuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH07XG4gIGh0bWwgPSBJbnN0YW5jZVJlYWRPbmx5VGVtcGxhdGUuZ2V0SW5zdGFuY2VIdG1sKHVzZXIsIHNwYWNlLCBpbnN0YW5jZSwgb3B0aW9ucyk7XG4gIGRhdGFCdWYgPSBuZXcgQnVmZmVyKGh0bWwpO1xuICByZXMuc2V0SGVhZGVyKCdjb250ZW50LWxlbmd0aCcsIGRhdGFCdWYubGVuZ3RoKTtcbiAgcmVzLnNldEhlYWRlcignY29udGVudC1yYW5nZScsIFwiYnl0ZXMgMC1cIiArIChkYXRhQnVmLmxlbmd0aCAtIDEpICsgXCIvXCIgKyBkYXRhQnVmLmxlbmd0aCk7XG4gIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICByZXR1cm4gcmVzLmVuZChodG1sKTtcbn0pO1xuIiwiQXJyYXkucHJvdG90eXBlLmZpbHRlclByb3BlcnR5ID0gZnVuY3Rpb24oaCwgbCl7XG4gICAgdmFyIGcgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odCl7XG4gICAgICAgIHZhciBtID0gdD8gdFtoXTpudWxsO1xuICAgICAgICB2YXIgZCA9IGZhbHNlO1xuICAgICAgICBpZihtIGluc3RhbmNlb2YgQXJyYXkpe1xuICAgICAgICAgICAgZCA9IG0uaW5jbHVkZXMobCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZCA9IChsID09PSB1bmRlZmluZWQpPyBmYWxzZTptPT1sO1xuICAgICAgICB9XG4gICAgICAgIGlmKGQpe1xuICAgICAgICAgICAgZy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGc7XG59O1xuXG5BcnJheS5wcm90b3R5cGUuZ2V0UHJvcGVydHkgPSBmdW5jdGlvbihrKXtcbiAgICB2YXIgdiA9IG5ldyBBcnJheSgpO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih0KXtcbiAgICAgICAgdmFyIG0gPSB0PyB0W2tdOm51bGw7XG4gICAgICAgIHYucHVzaChtKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdjtcbn1cblxuQXJyYXkucHJvdG90eXBlLmdldEVhY2ggPSBmdW5jdGlvbihjb2RlKXtcbiAgICB2YXIgcmV2ID0gW107XG4gICAgZm9yKHZhciBpID0gMCA7IGkgPCB0aGlzLmxlbmd0aCA7IGkrKyl7XG4gICAgICAgIHJldi5wdXNoKHRoaXNbaV1bY29kZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV2O1xufTtcblxuQXJyYXkucHJvdG90eXBlLnVuaXEgPSBmdW5jdGlvbigpe1xuICAgIHZhciBhID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGIpeyBcbiAgICAgICAgaWYoYS5pbmRleE9mKGIpIDwgMClcbiAgICAgICAgICAgIHthW2EubGVuZ3RoXSA9IGJ9XG4gICAgfSk7XG4gICAgcmV0dXJuIGE7XG59O1xuXG5Gb3JtX2Zvcm11bGEgPSB7fTtcblxuXG5Gb3JtX2Zvcm11bGEubWl4aW4gPSBmdW5jdGlvbihkZXN0LCBzcmMpe1xuICAgIGZvcih2YXIga2V5IGluIHNyYyl7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn07XG5cblxuRm9ybV9mb3JtdWxhLmhhbmRlclVzZXJPYmplY3QgPSBmdW5jdGlvbih1KXtcblxuICAgIGlmKHUgaW5zdGFuY2VvZiBBcnJheSl7XG4gICAgICAgIHZhciB1c2VyID0ge307XG5cbiAgICAgICAgdXNlci5uYW1lID0gdS5nZXRQcm9wZXJ0eShcIm5hbWVcIilcbiAgICAgICAgdXNlci5vcmdhbml6YXRpb24gPSB7fTtcbiAgICAgICAgdXNlci5vcmdhbml6YXRpb24ubmFtZSA9IHUuZ2V0UHJvcGVydHkoXCJvcmdhbml6YXRpb25cIikuZ2V0UHJvcGVydHkoXCJuYW1lXCIpO1xuICAgICAgICB1c2VyLm9yZ2FuaXphdGlvbi5mdWxsbmFtZSA9IHUuZ2V0UHJvcGVydHkoXCJvcmdhbml6YXRpb25cIikuZ2V0UHJvcGVydHkoXCJmdWxsbmFtZVwiKTtcblxuICAgICAgICB1c2VyLmhyID0gdS5nZXRQcm9wZXJ0eShcImhyXCIpXG5cbiAgICAgICAgdXNlci5zb3J0X25vID0gdS5nZXRQcm9wZXJ0eShcInNvcnRfbm9cIilcblxuXHRcdHVzZXIubW9iaWxlID0gdS5nZXRQcm9wZXJ0eShcIm1vYmlsZVwiKVxuXG5cdFx0dXNlci53b3JrX3Bob25lID0gdS5nZXRQcm9wZXJ0eShcIndvcmtfcGhvbmVcIilcblxuXHRcdHVzZXIucG9zaXRpb24gPSB1LmdldFByb3BlcnR5KFwicG9zaXRpb25cIilcblxuICAgICAgICB2YXIgdXNlclJvbGVzID0gdS5nZXRQcm9wZXJ0eShcInJvbGVzXCIpO1xuICAgICAgICB2YXIgcm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdXNlclJvbGVzLmZvckVhY2goZnVuY3Rpb24oaSl7XG4gICAgICAgICAgICByb2xlcyA9IHJvbGVzLmNvbmNhdChpKTtcbiAgICAgICAgfSk7IFxuICAgICAgICByb2xlcy51bmlxKCk7XG4gICAgICAgIHVzZXIucm9sZXMgPSByb2xlcztcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfWVsc2V7XG4gICAgICAgIHJldHVybiB1O1xuICAgIH1cbn1cblxuRm9ybV9mb3JtdWxhLmhhbmRlck9yZ09iamVjdCA9IGZ1bmN0aW9uKG8pe1xuXG4gICAgaWYobyBpbnN0YW5jZW9mIEFycmF5KXtcbiAgICAgICAgdmFyIG9yZyA9IHt9O1xuXHRcdG9yZy5pZCA9IG8uZ2V0UHJvcGVydHkoXCJfaWRcIik7XG4gICAgICAgIG9yZy5uYW1lID0gby5nZXRQcm9wZXJ0eShcIm5hbWVcIik7XG4gICAgICAgIG9yZy5mdWxsbmFtZSA9IG8uZ2V0UHJvcGVydHkoXCJmdWxsbmFtZVwiKTtcblxuICAgICAgICByZXR1cm4gb3JnO1xuICAgIH1lbHNle1xuICAgICAgICByZXR1cm4gbztcbiAgICB9XG59XG5cblxuXG4vKipcbiAgICAqIOiOt+W+l+WFrOW8j+mcgOimgeeUqOWIsOeahOWIneWni+WAvFxuICAgICog6L6T5YWl77yaZmllbGRzLCB2YWx1ZXMsIGFwcGxpY2FudFxuICAgICog6L6T5Ye677yaX192YWx1ZXNcbioqL1xuRm9ybV9mb3JtdWxhLmluaXRfZm9ybXVsYV92YWx1ZXMgPSBmdW5jdGlvbihmaWVsZHMsIGF1dG9Gb3JtRG9jLCBhcHByb3ZlciwgYXBwbGljYW50LCBzcGFjZUlkKXtcbiAgICB2YXIgX192YWx1ZXMgPSB7fTtcbiAgICAvL+eUs+ivt+WNleS4reWhq+eahOWAvOWkhOeQhlxuICAgIGlmKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoICYmIGF1dG9Gb3JtRG9jKSB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkKXtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgICAgIGlmKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZih0eXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICog5bCG6KGo5qC85a2X5q6155qE5YC86L+b6KGM6L2s5o2i5ZCO5Lyg5YWlX192YWx1ZXPkuK1cbiAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZXPkuK3ooajmoLznmoTlgLzmoLzlvI/kuLpcbiAgICAgICAgICAgICAgICAgICAgKiBbe1wiYVwiOjEsXCJiXCI6NH0se1wiYVwiOjIsXCJiXCI6NX0se1wiYVwiOjMsXCJiXCI6Nn1dXG4gICAgICAgICAgICAgICAgICAgICogX192YWx1ZXPpnIDopoHovazljJbkuLrkuIvpnaLmoLzlvI/kuJTlkozkuLvooajnmoTlgLzkuIDmoLfmlL7liLDnrKzkuIDlsYJcbiAgICAgICAgICAgICAgICAgICAgKiB7XCJhXCI6WzEsMiwzXSxcImJcIjpbNCw1LDZdfVxuICAgICAgICAgICAgICAgICAgICAqKi9cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlRmllbGRzID0gZmllbGQuc2ZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlVmFsdWVzID0gYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhVGFibGVWYWx1ZXMgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fdGFibGVWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy/mjInlhazlvI/nmoTmoLzlvI/ovazmjaLlgLzkuLpfX3RhYmxlVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIGlmKHRhYmxlRmllbGRzICYmIHRhYmxlRmllbGRzLmxlbmd0aCAmJiB0YWJsZVZhbHVlcyAmJiB0YWJsZVZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHRhYmxlVmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFUYWJsZVZhbHVlcy5wdXNoKEZvcm1fZm9ybXVsYS5pbml0X2Zvcm11bGFfdmFsdWVzKHRhYmxlRmllbGRzLCB0YWJsZVZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v5oyJ5Li76KGo55qE5qC85byP6L2s5o2iX190YWJsZVZhbHVlc+WKoOWIsFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVGaWVsZHMuZm9yRWFjaChmdW5jdGlvbih0YWJsZWZpZWxkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RhYmxlVmFsdWVzW3RhYmxlZmllbGQuY29kZV0gPSBmb3JtdWxhVGFibGVWYWx1ZXMuZ2V0RWFjaCh0YWJsZWZpZWxkLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX3ZhbHVlcyA9IEZvcm1fZm9ybXVsYS5taXhpbihfX3ZhbHVlcywgX190YWJsZVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3VzZXInKXtcbiAgICAgICAgICAgICAgICAgICAgX192YWx1ZXNbZmllbGQuY29kZV0gPSBGb3JtX2Zvcm11bGEuaGFuZGVyVXNlck9iamVjdChXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3RzKHNwYWNlSWQsIGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2dyb3VwJyl7XG4gICAgICAgICAgICAgICAgICAgIF9fdmFsdWVzW2ZpZWxkLmNvZGVdID0gRm9ybV9mb3JtdWxhLmhhbmRlck9yZ09iamVjdChXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYU9yZ09iamVjdHMoYXV0b0Zvcm1Eb2NbZmllbGQuY29kZV0pKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnb2RhdGEnKXtcblx0XHRcdFx0XHRfX3ZhbHVlc1tmaWVsZC5jb2RlXSA9IGF1dG9Gb3JtRG9jW2ZpZWxkLmNvZGVdIHx8IHt9XG5cblx0XHRcdFx0fSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy/mraTlpITkvKBzcGFjZUlk57uZ6YCJ5Lq65o6n5Lu255qE5pen5pWw5o2u6K6h566Xcm9sZXPlkoxvcmdhbml6YXRpb25cbiAgICAgICAgICAgICAgICAgICAgX192YWx1ZXNbZmllbGQuY29kZV0gPSBhdXRvRm9ybURvY1tmaWVsZC5jb2RlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgICAvL+W9k+WJjeWkhOeQhuS6ulxuICAgIF9fdmFsdWVzW1wiYXBwcm92ZXJcIl0gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3Qoc3BhY2VJZCwgYXBwcm92ZXIpO1xuICAgIC8v55Sz6K+35Lq6XG4gICAgX192YWx1ZXNbXCJhcHBsaWNhbnRcIl0gPSBXb3JrZmxvd01hbmFnZXIuZ2V0Rm9ybXVsYVVzZXJPYmplY3Qoc3BhY2VJZCwgYXBwbGljYW50KTtcblxuICAgIHJldHVybiBfX3ZhbHVlcztcbn07XG5cbiIsIk1ldGVvci5wdWJsaXNoICdjYXRlZ29yaWVzJywgKHNwYWNlSWQpIC0+XG5cdGNoZWNrIHNwYWNlSWQsIFN0cmluZ1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdHJldHVybiBkYi5jYXRlZ29yaWVzLmZpbmQoeyBzcGFjZTogc3BhY2VJZCB9LCB7IGZpZWxkczogeyBuYW1lOiAxLCBzcGFjZTogMSwgc29ydF9ubzogMSwgYXBwOiAxIH0gfSkiLCJNZXRlb3IucHVibGlzaCgnY2F0ZWdvcmllcycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuY2F0ZWdvcmllcy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBzb3J0X25vOiAxLFxuICAgICAgYXBwOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiXG5NZXRlb3IucHVibGlzaCAnY2ZzX2luc3RhbmNlcycsIChpbnN0YW5jZUlkcyktPlxuXHRjaGVjayhpbnN0YW5jZUlkcywgQXJyYXkpXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBpbnN0YW5jZUlkc1xuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBjZnMuaW5zdGFuY2VzLmZpbmQoeydtZXRhZGF0YS5pbnN0YW5jZSc6IHskaW46IGluc3RhbmNlSWRzfSAsICRvcjogW3snbWV0YWRhdGEuaXNfcHJpdmF0ZSc6IHskbmU6IHRydWV9fSx7J21ldGFkYXRhLmlzX3ByaXZhdGUnOiB0cnVlLCBcIm1ldGFkYXRhLm93bmVyXCI6IHRoaXMudXNlcklkfV19KVxuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Nmc19pbnN0YW5jZXMnLCBmdW5jdGlvbihpbnN0YW5jZUlkcykge1xuICBjaGVjayhpbnN0YW5jZUlkcywgQXJyYXkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWluc3RhbmNlSWRzKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gY2ZzLmluc3RhbmNlcy5maW5kKHtcbiAgICAnbWV0YWRhdGEuaW5zdGFuY2UnOiB7XG4gICAgICAkaW46IGluc3RhbmNlSWRzXG4gICAgfSxcbiAgICAkb3I6IFtcbiAgICAgIHtcbiAgICAgICAgJ21ldGFkYXRhLmlzX3ByaXZhdGUnOiB7XG4gICAgICAgICAgJG5lOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgJ21ldGFkYXRhLmlzX3ByaXZhdGUnOiB0cnVlLFxuICAgICAgICBcIm1ldGFkYXRhLm93bmVyXCI6IHRoaXMudXNlcklkXG4gICAgICB9XG4gICAgXVxuICB9KTtcbn0pO1xuIiwiXG5cbk1ldGVvci5wdWJsaXNoICdmbG93X3Bvc2l0aW9ucycsIChzcGFjZUlkKS0+XG5cdFxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cdFxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gZGIuZmxvd19wb3NpdGlvbnMuZmluZCh7c3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOiB7cm9sZToxLCB1c2VyczogMSwgb3JnOiAxfX0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfcG9zaXRpb25zJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93X3Bvc2l0aW9ucy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICByb2xlOiAxLFxuICAgICAgdXNlcnM6IDEsXG4gICAgICBvcmc6IDFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaENvbXBvc2l0ZSAnZmxvd19wb3NpdGlvbnNfdGFidWxhcicsICh0YWJsZU5hbWUsIGlkcywgZmllbGRzKS0+XG5cdGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcblx0Y2hlY2soaWRzLCBBcnJheSk7XG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHRoaXMudW5ibG9jaygpXG5cblx0ZmluZDogLT5cblx0XHR0aGlzLnVuYmxvY2soKVxuXHRcdGRiLmZsb3dfcG9zaXRpb25zLmZpbmQge19pZDogeyRpbjogaWRzfX0sIGZpZWxkczogZmllbGRzXG5cblx0Y2hpbGRyZW46IFtcblx0XHR7XG5cdFx0XHRmaW5kOiAocG9zaXRpb24pIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIGZsb3dfcm9sZXNcblx0XHRcdFx0ZGIuZmxvd19yb2xlcy5maW5kIHsgX2lkOiBwb3NpdGlvbi5yb2xlIH0sIGZpZWxkczogbmFtZTogMVxuXHRcdH1cblx0XHR7XG5cdFx0XHRmaW5kOiAocG9zaXRpb24pIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIG9yZ2FuaXphdGlvbnNcblx0XHRcdFx0ZGIub3JnYW5pemF0aW9ucy5maW5kIHsgX2lkOiBwb3NpdGlvbi5vcmcgfSwgZmllbGRzOiBmdWxsbmFtZTogMVxuXHRcdH1cblx0XHR7XG5cdFx0XHRmaW5kOiAocG9zaXRpb24pIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIHVzZXJcblx0XHRcdFx0ZGIuc3BhY2VfdXNlcnMuZmluZCB7XG5cdFx0XHRcdFx0c3BhY2U6IHBvc2l0aW9uLnNwYWNlXG5cdFx0XHRcdFx0dXNlcjogJGluOiBwb3NpdGlvbi51c2Vyc1xuXHRcdFx0XHR9LCBmaWVsZHM6XG5cdFx0XHRcdFx0c3BhY2U6IDFcblx0XHRcdFx0XHR1c2VyOiAxXG5cdFx0XHRcdFx0bmFtZTogMVxuXHRcdH1cblx0XSIsIk1ldGVvci5wdWJsaXNoQ29tcG9zaXRlKCdmbG93X3Bvc2l0aW9uc190YWJ1bGFyJywgZnVuY3Rpb24odGFibGVOYW1lLCBpZHMsIGZpZWxkcykge1xuICBjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG4gIGNoZWNrKGlkcywgQXJyYXkpO1xuICBjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICB0aGlzLnVuYmxvY2soKTtcbiAgcmV0dXJuIHtcbiAgICBmaW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudW5ibG9jaygpO1xuICAgICAgcmV0dXJuIGRiLmZsb3dfcG9zaXRpb25zLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IGlkc1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBbXG4gICAgICB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLmZsb3dfcm9sZXMuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHBvc2l0aW9uLnJvbGVcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHBvc2l0aW9uLm9yZ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBmdWxsbmFtZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IHBvc2l0aW9uLnNwYWNlLFxuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAkaW46IHBvc2l0aW9uLnVzZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgICB1c2VyOiAxLFxuICAgICAgICAgICAgICBuYW1lOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59KTtcbiIsIlxuXG5cdE1ldGVvci5wdWJsaXNoICdmbG93X3JvbGVzJywgKHNwYWNlSWQpLT5cblx0XHRcblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XHRcblx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0XHRyZXR1cm4gZGIuZmxvd19yb2xlcy5maW5kKHtzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtuYW1lOjF9fSk7XG4iLCJNZXRlb3IucHVibGlzaCgnZmxvd19yb2xlcycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd19yb2xlcy5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dzJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdCMg56ys5LiA5qyh6K6i6ZiF5pe25Yid5aeL5YyW5bel5L2c5Yy6XG5cdGlmIGRiLmZsb3dzLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSkuY291bnQoKSA9PSAwXG5cdFx0ZGIuc3BhY2VzLmNyZWF0ZVRlbXBsYXRlRm9ybUFuZEZsb3coc3BhY2VJZClcblxuXHRyZXR1cm4gZGIuZmxvd3MuZmluZCh7c3BhY2U6IHNwYWNlSWR9LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRuYW1lOiAxLFxuXHRcdFx0Zm9ybTogMSxcblx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0cGVybXM6IDEsXG5cdFx0XHRzcGFjZTogMSxcblx0XHRcdGNvbXBhbnlfaWQ6IDEsXG5cdFx0XHRzb3J0X25vOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcblx0XHRcdGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcblxuTWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlX2Zsb3cnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBkYi5mbG93cy5maW5kKHtfaWQ6IGZsb3dJZCwgc3BhY2U6IHNwYWNlSWR9LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRuYW1lOiAxLFxuXHRcdFx0Zm9ybTogMSxcblx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0cGVybXM6IDEsXG5cdFx0XHRzcGFjZTogMSxcblx0XHRcdGNvbXBhbnlfaWQ6IDEsXG5cdFx0XHRzb3J0X25vOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcblx0XHRcdGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcblxuXG5NZXRlb3IucHVibGlzaCAnZmxvd192ZXJzaW9uJywgKHNwYWNlSWQsIGZsb3dJZCwgdmVyc2lvbklkKSAtPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgdmVyc2lvbklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0Z2V0Rmxvd1ZlcnNpb24gPSAoaWQgLCB2ZXJzaW9uSWQpLT5cblx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkIDogaWR9KTtcblx0XHRpZiBmbG93XG5cdFx0XHRmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnRcblx0XHRcdGZsb3dfdmVyc2lvbi5sYXRlc3QgPSB0cnVlXG5cblx0XHRcdGlmIGZsb3dfdmVyc2lvbi5faWQgIT0gdmVyc2lvbklkXG5cdFx0XHRcdGZsb3dfdmVyc2lvbiA9IGZsb3cuaGlzdG9yeXMuZmluZFByb3BlcnR5QnlQSyhcIl9pZFwiLCB2ZXJzaW9uSWQpXG5cdFx0XHRcdGZsb3dfdmVyc2lvbi5sYXRlc3QgPSBmYWxzZVxuXG5cdFx0XHRyZXR1cm4gZmxvd192ZXJzaW9uXG5cdGhhbmRsZSA9IGRiLmZsb3dzLmZpbmQoe19pZDogZmxvd0lkfSwge2ZpZWxkczoge19pZDogMSwgXCJjdXJyZW50Lm1vZGlmaWVkXCI6IDF9fSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGlkLCB2ZXJzaW9uSWQpKTtcblx0fVxuXG5cblx0c2VsZi5hZGRlZChcImZsb3dfdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGbG93VmVyc2lvbihmbG93SWQsIHZlcnNpb25JZCkpO1xuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG5cbk1ldGVvci5wdWJsaXNoICdkaXN0cmlidXRlX29wdGlvbmFsX2Zsb3dzJywgKGZsb3dfaWRzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd19pZHNcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLmZsb3dzLmZpbmQoe19pZDogeyRpbjogZmxvd19pZHN9fSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0bmFtZTogMSxcblx0XHRcdGZvcm06IDEsXG5cdFx0XHRzdGF0ZTogMSxcblx0XHRcdHBlcm1zOiAxLFxuXHRcdFx0c3BhY2U6IDEsXG5cdFx0XHRkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uOiAxLFxuXHRcdFx0Y29tcGFueV9pZDogMSxcblx0XHRcdGVuYWJsZV9hbWlzZm9ybTogMVxuXHRcdH1cblx0fSlcblxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3cnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmZsb3dzLmZpbmQoe19pZDogZmxvd0lkLCBzcGFjZTogc3BhY2VJZH0sIHtcblx0XHRmaWVsZHM6IHtcblx0XHRcdHByaW50X3RlbXBsYXRlOiAxLFxuXHRcdFx0aW5zdGFuY2VfdGVtcGxhdGU6IDEsXG5cdFx0XHRldmVudHM6IDEsXG5cdFx0XHRkaXN0cmlidXRlX29wdGlvbmFsX3VzZXJzOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV90b19zZWxmOiAxLFxuXHRcdFx0dXBsb2FkX2FmdGVyX2JlaW5nX2Rpc3RyaWJ1dGVkOiAxLFxuXHRcdFx0ZGlzdHJpYnV0ZV9lbmRfbm90aWZpY2F0aW9uOiAxLFxuXHRcdFx0Y29tcGFueV9pZDogMSxcblx0XHRcdGFsbG93X3NlbGVjdF9zdGVwOiAxLFxuXHRcdFx0ZW5hYmxlX2FtaXNmb3JtOiAxXG5cdFx0fVxuXHR9KVxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfZmlsZXMnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgZmxvd0lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBjZnMuZmlsZXMuZmluZCh7ICdtZXRhZGF0YS5zcGFjZSc6IHNwYWNlSWQsICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsICdtZXRhZGF0YS5yZWNvcmRfaWQnOiBmbG93SWQgfSlcblxuTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgJ2Zsb3dzX3RhYnVsYXInLCAodGFibGVOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHRjaGVjayh0YWJsZU5hbWUsIFN0cmluZyk7XG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXHRjaGVjayhmaWVsZHMsIE1hdGNoLk9wdGlvbmFsKE9iamVjdCkpO1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR0aGlzLnVuYmxvY2soKVxuXG5cdGZpbmQ6IC0+XG5cdFx0dGhpcy51bmJsb2NrKClcblx0XHRkYi5mbG93cy5maW5kIHtfaWQ6IHskaW46IGlkc319LCBmaWVsZHM6IGZpZWxkc1xuXG5cdGNoaWxkcmVuOiBbXG5cdFx0e1xuXHRcdFx0ZmluZDogKGZsb3cpIC0+XG5cdFx0XHRcdEB1bmJsb2NrKClcblx0XHRcdFx0IyBQdWJsaXNoIHRoZSByZWxhdGVkIHVzZXJcblx0XHRcdFx0ZGIuc3BhY2VfdXNlcnMuZmluZCB7XG5cdFx0XHRcdFx0c3BhY2U6IGZsb3cuc3BhY2UsXG5cdFx0XHRcdFx0dXNlcjogZmxvdy5jdXJyZW50Lm1vZGlmaWVkX2J5XG5cdFx0XHRcdH0sIGZpZWxkczpcblx0XHRcdFx0XHRzcGFjZTogMVxuXHRcdFx0XHRcdHVzZXI6IDFcblx0XHRcdFx0XHRuYW1lOiAxXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaW5kOiAoZmxvdykgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgdXNlclxuXHRcdFx0XHRkYi5mb3Jtcy5maW5kIHtcblx0XHRcdFx0XHRzcGFjZTogZmxvdy5zcGFjZSxcblx0XHRcdFx0XHRfaWQ6IGZsb3cuZm9ybVxuXHRcdFx0XHR9LCBmaWVsZHM6XG5cdFx0XHRcdFx0c3BhY2U6IDFcblx0XHRcdFx0XHRfaWQ6IDFcblx0XHRcdFx0XHRuYW1lOiAxLFxuXHRcdFx0XHRcdGNhdGVnb3J5OiAxXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaW5kOiAoZmxvdykgLT5cblx0XHRcdFx0QHVuYmxvY2soKVxuXHRcdFx0XHQjIFB1Ymxpc2ggdGhlIHJlbGF0ZWQgdXNlclxuXHRcdFx0XHRkYi5jYXRlZ29yaWVzLmZpbmQge1xuXHRcdFx0XHRcdHNwYWNlOiBmbG93LnNwYWNlXG5cdFx0XHRcdH0sIGZpZWxkczpcblx0XHRcdFx0XHRzcGFjZTogMVxuXHRcdFx0XHRcdF9pZDogMVxuXHRcdFx0XHRcdG5hbWU6IDFcblx0XHR9XG5cdF0iLCJNZXRlb3IucHVibGlzaCgnZmxvd3MnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKGRiLmZsb3dzLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0pLmNvdW50KCkgPT09IDApIHtcbiAgICBkYi5zcGFjZXMuY3JlYXRlVGVtcGxhdGVGb3JtQW5kRmxvdyhzcGFjZUlkKTtcbiAgfVxuICByZXR1cm4gZGIuZmxvd3MuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGZvcm06IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHBlcm1zOiAxLFxuICAgICAgc3BhY2U6IDEsXG4gICAgICBjb21wYW55X2lkOiAxLFxuICAgICAgc29ydF9ubzogMSxcbiAgICAgIGRpc3RyaWJ1dGVfb3B0aW9uYWxfdXNlcnM6IDEsXG4gICAgICBkaXN0cmlidXRlX3RvX3NlbGY6IDEsXG4gICAgICBlbmFibGVfYW1pc2Zvcm06IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZV9mbG93JywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IGZsb3dJZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgZm9ybTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgcGVybXM6IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBzb3J0X25vOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIGVuYWJsZV9hbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfdmVyc2lvbicsIGZ1bmN0aW9uKHNwYWNlSWQsIGZsb3dJZCwgdmVyc2lvbklkKSB7XG4gIHZhciBnZXRGbG93VmVyc2lvbiwgaGFuZGxlLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd0lkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXZlcnNpb25JZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGdldEZsb3dWZXJzaW9uID0gZnVuY3Rpb24oaWQsIHZlcnNpb25JZCkge1xuICAgIHZhciBmbG93LCBmbG93X3ZlcnNpb247XG4gICAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpZFxuICAgIH0pO1xuICAgIGlmIChmbG93KSB7XG4gICAgICBmbG93X3ZlcnNpb24gPSBmbG93LmN1cnJlbnQ7XG4gICAgICBmbG93X3ZlcnNpb24ubGF0ZXN0ID0gdHJ1ZTtcbiAgICAgIGlmIChmbG93X3ZlcnNpb24uX2lkICE9PSB2ZXJzaW9uSWQpIHtcbiAgICAgICAgZmxvd192ZXJzaW9uID0gZmxvdy5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZCk7XG4gICAgICAgIGZsb3dfdmVyc2lvbi5sYXRlc3QgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmbG93X3ZlcnNpb247XG4gICAgfVxuICB9O1xuICBoYW5kbGUgPSBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IGZsb3dJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBfaWQ6IDEsXG4gICAgICBcImN1cnJlbnQubW9kaWZpZWRcIjogMVxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGlkLCB2ZXJzaW9uSWQpKTtcbiAgICB9XG4gIH0pO1xuICBzZWxmLmFkZGVkKFwiZmxvd192ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZsb3dWZXJzaW9uKGZsb3dJZCwgdmVyc2lvbklkKSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnZGlzdHJpYnV0ZV9vcHRpb25hbF9mbG93cycsIGZ1bmN0aW9uKGZsb3dfaWRzKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZmxvd19pZHMpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IHtcbiAgICAgICRpbjogZmxvd19pZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBmb3JtOiAxLFxuICAgICAgc3RhdGU6IDEsXG4gICAgICBwZXJtczogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIGRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbjogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBlbmFibGVfYW1pc2Zvcm06IDFcbiAgICB9XG4gIH0pO1xufSk7XG5cbk1ldGVvci5wdWJsaXNoKCdmbG93JywgZnVuY3Rpb24oc3BhY2VJZCwgZmxvd0lkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICBfaWQ6IGZsb3dJZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBwcmludF90ZW1wbGF0ZTogMSxcbiAgICAgIGluc3RhbmNlX3RlbXBsYXRlOiAxLFxuICAgICAgZXZlbnRzOiAxLFxuICAgICAgZGlzdHJpYnV0ZV9vcHRpb25hbF91c2VyczogMSxcbiAgICAgIGRpc3RyaWJ1dGVfdG9fc2VsZjogMSxcbiAgICAgIHVwbG9hZF9hZnRlcl9iZWluZ19kaXN0cmlidXRlZDogMSxcbiAgICAgIGRpc3RyaWJ1dGVfZW5kX25vdGlmaWNhdGlvbjogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBhbGxvd19zZWxlY3Rfc3RlcDogMSxcbiAgICAgIGVuYWJsZV9hbWlzZm9ybTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfZmlsZXMnLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQpIHtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWZsb3dJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGNmcy5maWxlcy5maW5kKHtcbiAgICAnbWV0YWRhdGEuc3BhY2UnOiBzcGFjZUlkLFxuICAgICdtZXRhZGF0YS5vYmplY3RfbmFtZSc6ICdmbG93cycsXG4gICAgJ21ldGFkYXRhLnJlY29yZF9pZCc6IGZsb3dJZFxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaENvbXBvc2l0ZSgnZmxvd3NfdGFidWxhcicsIGZ1bmN0aW9uKHRhYmxlTmFtZSwgaWRzLCBmaWVsZHMpIHtcbiAgY2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgdGhpcy51bmJsb2NrKCk7XG4gIHJldHVybiB7XG4gICAgZmluZDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgIHJldHVybiBkYi5mbG93cy5maW5kKHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBpZHNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBjaGlsZHJlbjogW1xuICAgICAge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihmbG93KSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IGZsb3cuc3BhY2UsXG4gICAgICAgICAgICB1c2VyOiBmbG93LmN1cnJlbnQubW9kaWZpZWRfYnlcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICAgIHVzZXI6IDEsXG4gICAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaW5kOiBmdW5jdGlvbihmbG93KSB7XG4gICAgICAgICAgdGhpcy51bmJsb2NrKCk7XG4gICAgICAgICAgcmV0dXJuIGRiLmZvcm1zLmZpbmQoe1xuICAgICAgICAgICAgc3BhY2U6IGZsb3cuc3BhY2UsXG4gICAgICAgICAgICBfaWQ6IGZsb3cuZm9ybVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgICAgICBuYW1lOiAxLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpbmQ6IGZ1bmN0aW9uKGZsb3cpIHtcbiAgICAgICAgICB0aGlzLnVuYmxvY2soKTtcbiAgICAgICAgICByZXR1cm4gZGIuY2F0ZWdvcmllcy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBmbG93LnNwYWNlXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2Zvcm1zJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmZvcm1zLmZpbmQoe3NwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczoge25hbWU6IDEsIGNhdGVnb3J5OiAxLCBzdGF0ZTogMSwgZGVzY3JpcHRpb246IDEsIGluc3RhbmNlX3N0eWxlOiAxLCBhbWlzX3NjaGVtYTogMX19KVxuXG5NZXRlb3IucHVibGlzaCAnaW5zdGFuY2VfZm9ybScsIChzcGFjZUlkLCBmb3JtSWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0cmV0dXJuIGRiLmZvcm1zLmZpbmQoe19pZDogZm9ybUlkLCBzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtuYW1lOiAxLCBjYXRlZ29yeTogMSwgc3RhdGU6IDEsIGRlc2NyaXB0aW9uOiAxLCBpbnN0YW5jZV9zdHlsZTogMSwgYW1pc19zY2hlbWE6IDF9fSlcblxuXG5NZXRlb3IucHVibGlzaCAnZm9ybV92ZXJzaW9uJywgKHNwYWNlSWQsIGZvcm1JZCwgdmVyc2lvbklkKSAtPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGZvcm1JZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgdmVyc2lvbklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0Z2V0Rm9ybVZlcnNpb24gPSAoaWQgLCB2ZXJzaW9uSWQpLT5cblx0XHRmb3JtID0gZGIuZm9ybXMuZmluZE9uZSh7X2lkIDogaWR9KTtcblx0XHRpZiAhZm9ybVxuXHRcdFx0cmV0dXJuIHt9XG5cdFx0Zm9ybV92ZXJzaW9uID0gZm9ybS5jdXJyZW50XG5cdFx0Zm9ybV92ZXJzaW9uLmxhdGVzdCA9IHRydWVcblx0XHRpZiBmb3JtX3ZlcnNpb24uX2lkICE9IHZlcnNpb25JZFxuXHRcdFx0Zm9ybV92ZXJzaW9uID0gZm9ybS5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZClcblx0XHRcdGZvcm1fdmVyc2lvbi5sYXRlc3QgPSBmYWxzZVxuXHRcdHJldHVybiBmb3JtX3ZlcnNpb25cblxuXHRoYW5kbGUgPSBkYi5mb3Jtcy5maW5kKHtfaWQ6IGZvcm1JZH0sIHtmaWVsZHM6IHtfaWQ6IDEsIFwiY3VycmVudC5tb2RpZmllZFwiOiAxfX0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdHNlbGYuY2hhbmdlZChcImZvcm1fdmVyc2lvbnNcIiwgdmVyc2lvbklkLCBnZXRGb3JtVmVyc2lvbihpZCwgdmVyc2lvbklkKSk7XG5cdH1cblxuXHRzZWxmLmFkZGVkKFwiZm9ybV92ZXJzaW9uc1wiLCB2ZXJzaW9uSWQsIGdldEZvcm1WZXJzaW9uKGZvcm1JZCwgdmVyc2lvbklkKSk7XG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKCkiLCJNZXRlb3IucHVibGlzaCgnZm9ybXMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmZvcm1zLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBjYXRlZ29yeTogMSxcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgZGVzY3JpcHRpb246IDEsXG4gICAgICBpbnN0YW5jZV9zdHlsZTogMSxcbiAgICAgIGFtaXNfc2NoZW1hOiAxXG4gICAgfVxuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaCgnaW5zdGFuY2VfZm9ybScsIGZ1bmN0aW9uKHNwYWNlSWQsIGZvcm1JZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5mb3Jtcy5maW5kKHtcbiAgICBfaWQ6IGZvcm1JZCxcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgY2F0ZWdvcnk6IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIGRlc2NyaXB0aW9uOiAxLFxuICAgICAgaW5zdGFuY2Vfc3R5bGU6IDEsXG4gICAgICBhbWlzX3NjaGVtYTogMVxuICAgIH1cbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2Zvcm1fdmVyc2lvbicsIGZ1bmN0aW9uKHNwYWNlSWQsIGZvcm1JZCwgdmVyc2lvbklkKSB7XG4gIHZhciBnZXRGb3JtVmVyc2lvbiwgaGFuZGxlLCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghZm9ybUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIXZlcnNpb25JZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGdldEZvcm1WZXJzaW9uID0gZnVuY3Rpb24oaWQsIHZlcnNpb25JZCkge1xuICAgIHZhciBmb3JtLCBmb3JtX3ZlcnNpb247XG4gICAgZm9ybSA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpZFxuICAgIH0pO1xuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBmb3JtX3ZlcnNpb24gPSBmb3JtLmN1cnJlbnQ7XG4gICAgZm9ybV92ZXJzaW9uLmxhdGVzdCA9IHRydWU7XG4gICAgaWYgKGZvcm1fdmVyc2lvbi5faWQgIT09IHZlcnNpb25JZCkge1xuICAgICAgZm9ybV92ZXJzaW9uID0gZm9ybS5oaXN0b3J5cy5maW5kUHJvcGVydHlCeVBLKFwiX2lkXCIsIHZlcnNpb25JZCk7XG4gICAgICBmb3JtX3ZlcnNpb24ubGF0ZXN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmb3JtX3ZlcnNpb247XG4gIH07XG4gIGhhbmRsZSA9IGRiLmZvcm1zLmZpbmQoe1xuICAgIF9pZDogZm9ybUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIF9pZDogMSxcbiAgICAgIFwiY3VycmVudC5tb2RpZmllZFwiOiAxXG4gICAgfVxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJmb3JtX3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rm9ybVZlcnNpb24oaWQsIHZlcnNpb25JZCkpO1xuICAgIH1cbiAgfSk7XG4gIHNlbGYuYWRkZWQoXCJmb3JtX3ZlcnNpb25zXCIsIHZlcnNpb25JZCwgZ2V0Rm9ybVZlcnNpb24oZm9ybUlkLCB2ZXJzaW9uSWQpKTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnaW5zdGFuY2VfZGF0YScsIChpbnN0YW5jZUlkLCBib3gpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyAoaW5zdGFuY2VJZCAmJiBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiBpbnN0YW5jZUlkfSkuY291bnQoKSlcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0bWluaUFwcHJvdmVGaWVsZHMgPSBbJ19pZCcsICdpc19maW5pc2hlZCcsICd1c2VyJywgJ2hhbmRsZXInLCAnaGFuZGxlcl9uYW1lJywgJ3R5cGUnLCAnc3RhcnRfZGF0ZScsICdkZXNjcmlwdGlvbicsXG5cdFx0J2lzX3JlYWQnLCAnanVkZ2UnLCAnZmluaXNoX2RhdGUnLCAnZnJvbV91c2VyX25hbWUnLCAnZnJvbV91c2VyJywgJ2NjX2Rlc2NyaXB0aW9uJywgJ2F1dG9fc3VibWl0dGVkJ11cblxuXHR0cmlnZ2VyQ2hhbmdlRmllbGRzID0gWydmb3JtX3ZlcnNpb24nLCAnZmxvd192ZXJzaW9uJywgJ3JlbGF0ZWRfaW5zdGFuY2VzJywgJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnLCAndmFsdWVzJywgJ2NoYW5nZV90aW1lJ11cblxuXHR0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzID0ge31cblxuXHRpbnN0YW5jZV9maWVsZHNfMCA9IHtcblx0XHRcInJlY29yZF9zeW5jZWRcIjogMCxcblxuI1x0XHRcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvbl9mdWxsbmFtZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uX25hbWVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5oYW5kbGVyX29yZ2FuaXphdGlvblwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmNvc3RfdGltZVwiOiAwLFxuI1x0XHRcInRyYWNlcy5hcHByb3Zlcy5yZWFkX2RhdGVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5pc19lcnJvclwiOiAwLFxuXHRcdCMgXCJ0cmFjZXMuYXBwcm92ZXMudXNlcl9uYW1lXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuZGVhZGxpbmVcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5yZW1pbmRfZGF0ZVwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLnJlbWluZGVkX2NvdW50XCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMubW9kaWZpZWRfYnlcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5tb2RpZmllZFwiOiAwLFxuXHRcdFwidHJhY2VzLmFwcHJvdmVzLmdlb2xvY2F0aW9uXCI6IDAsXG5cdFx0XCJ0cmFjZXMuYXBwcm92ZXMuY2NfdXNlcnNcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy5mcm9tX2FwcHJvdmVfaWRcIjogMCxcblx0XHRcInRyYWNlcy5hcHByb3Zlcy52YWx1ZXNfaGlzdG9yeVwiOiAwXG5cdH1cblxuXHRnZXRNeWFwcHJvdmVNb2RpZmllZCA9ICh0cmFjZXMpLT5cblx0XHRteUFwcHJvdmVNb2RpZmllZHMgPSBuZXcgQXJyYXkoKVxuXG5cdFx0dHJhY2VzPy5mb3JFYWNoICh0cmFjZSktPlxuXHRcdFx0dHJhY2U/LmFwcHJvdmVzPy5mb3JFYWNoIChhcHByb3ZlKS0+XG5cdFx0XHRcdGlmIChhcHByb3ZlLnVzZXIgPT0gc2VsZi51c2VySWQgfHwgYXBwcm92ZS5oYW5kbGVyID09IHNlbGYudXNlcklkKVxuXHRcdFx0XHQjICYmICFhcHByb3ZlLmlzX2ZpbmlzaGVkXG4jXHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiYXBwcm92ZVwiLCBhcHByb3ZlLl9pZCwgYXBwcm92ZS5yZWFkX2RhdGUpXG5cblx0XHRcdFx0XHRteUFwcHJvdmVNb2RpZmllZHMucHVzaChhcHByb3ZlLnJlYWRfZGF0ZSlcblxuXHRcdHJldHVybiBteUFwcHJvdmVNb2RpZmllZHNcblxuXG5cdGdldE1pbmlJbnN0YW5jZSA9IChfaW5zdGFuY2VJZCktPlxuXHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogX2luc3RhbmNlSWR9LCB7ZmllbGRzOiBpbnN0YW5jZV9maWVsZHNfMH0pXG5cblx0XHRpZiBpbnN0YW5jZVxuXG5cdFx0XHR0cmlnZ2VyQ2hhbmdlRmllbGRzLmZvckVhY2ggKGtleSktPlxuXHRcdFx0XHRpZiBrZXkgPT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnXG5cdFx0XHRcdFx0dHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldID0gZ2V0TXlhcHByb3ZlTW9kaWZpZWQoaW5zdGFuY2UudHJhY2VzKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldID0gaW5zdGFuY2Vba2V5XVxuXG4jXHRcdFx0aGFzT3BpbmlvbkZpZWxkID0gSW5zdGFuY2VTaWduVGV4dC5pbmNsdWRlc09waW5pb25GaWVsZChpbnN0YW5jZS5mb3JtLCBpbnN0YW5jZS5mb3JtX3ZlcnNpb24pXG5cblx0XHRcdHNob3dfbW9kYWxfdHJhY2VzX2xpc3QgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHsgc3BhY2U6IGluc3RhbmNlLnNwYWNlLCBrZXk6IFwic2hvd19tb2RhbF90cmFjZXNfbGlzdFwiIH0sIHsgZmllbGRzOiB7IHZhbHVlczogMSB9IH0pPy52YWx1ZXMgfHwgZmFsc2VcblxuXHRcdFx0aWYgc2hvd19tb2RhbF90cmFjZXNfbGlzdFxuXG5cdFx0XHRcdHRyYWNlcyA9IG5ldyBBcnJheSgpO1xuXG5cdFx0XHRcdGluc3RhbmNlPy50cmFjZXM/LmZvckVhY2ggKHRyYWNlKS0+XG5cdFx0XHRcdFx0X3RyYWNlID0gXy5jbG9uZSh0cmFjZSlcblxuXHRcdFx0XHRcdGFwcHJvdmVzID0gbmV3IEFycmF5KClcblxuXHRcdFx0XHRcdHRyYWNlPy5hcHByb3Zlcz8uZm9yRWFjaCAoYXBwcm92ZSktPlxuXHRcdFx0XHRcdFx0aWYgYXBwcm92ZS50eXBlICE9ICdjYycgfHwgYXBwcm92ZS51c2VyID09IHNlbGYudXNlcklkIHx8IGFwcHJvdmUuaGFuZGxlciA9PSBzZWxmLnVzZXJJZCB8fCAoIV8uaXNFbXB0eShhcHByb3ZlLnNpZ25fZmllbGRfY29kZSkpXG5cdFx0XHRcdFx0XHRcdGFwcHJvdmVzLnB1c2goYXBwcm92ZSlcblxuXHRcdFx0XHRcdF90cmFjZS5hcHByb3ZlcyA9IGFwcHJvdmVzXG5cblx0XHRcdFx0XHR0cmFjZXMucHVzaChfdHJhY2UpXG5cblx0XHRcdFx0aW5zdGFuY2UudHJhY2VzID0gdHJhY2VzO1xuXG5cdFx0cmV0dXJuIGluc3RhbmNlXG5cblxuXHRuZWVkQ2hhbmdlID0gKGNoYW5nZUZpZWxkcyktPlxuXHRcdGlmIGNoYW5nZUZpZWxkc1xuXG5cdFx0XHRfY2hhbmdlID0gZmFsc2VcblxuXHRcdFx0X3JldiA9IF8uZmluZCB0cmlnZ2VyQ2hhbmdlRmllbGRzLCAoa2V5KS0+XG5cdFx0XHRcdF9rZXkgPSBrZXlcblxuXHRcdFx0XHRpZiBrZXkgPT0gJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnXG5cdFx0XHRcdFx0X2tleSA9ICd0cmFjZXMnXG5cblx0XHRcdFx0aWYgXy5oYXMoY2hhbmdlRmllbGRzLCBfa2V5KVxuXG5cdFx0XHRcdFx0aWYga2V5ID09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJ1xuXG5cdFx0XHRcdFx0XHRfbXlfYXBwcm92ZV9tb2RpZmllZHMgPSBnZXRNeWFwcHJvdmVNb2RpZmllZChjaGFuZ2VGaWVsZHMudHJhY2VzKVxuXG4jXHRcdFx0XHRcdFx0Y29uc29sZS5sb2codHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlc1trZXldLCBfbXlfYXBwcm92ZV9tb2RpZmllZHMpXG5cblx0XHRcdFx0XHRcdHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgX215X2FwcHJvdmVfbW9kaWZpZWRzKVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgY2hhbmdlRmllbGRzW2tleV0pXG5cblx0XHRcdGlmIF9yZXZcblx0XHRcdFx0X2NoYW5nZSA9IHRydWVcblxuI1x0XHRcdGNvbnNvbGUubG9nKF9yZXYsIF9jaGFuZ2UpXG5cblx0XHRcdHJldHVybiBfY2hhbmdlXG5cblx0XHRyZXR1cm4gdHJ1ZVxuXHQj5q2k5aSE5LiN6IO95re75YqgZmllbGRz6ZmQ5Yi277yM5ZCm5YiZ5Lya5a+86Ie05pWw5o2u5LiN5a6e5pe2XG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IGluc3RhbmNlSWR9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0Y2hhbmdlZDogKGlkLCBmaWVsZHMpLT5cblx0XHRcdGlmKGJveCAhPSAnaW5ib3gnIHx8IG5lZWRDaGFuZ2UoZmllbGRzKSlcblx0XHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBnZXRNaW5pSW5zdGFuY2UoaWQpKTtcblx0XHRyZW1vdmVkOiAoaWQpLT5cblx0XHRcdHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG5cdH1cblxuXHRpbnN0YW5jZSA9IGdldE1pbmlJbnN0YW5jZShpbnN0YW5jZUlkKVxuXG5cdHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaW5zdGFuY2U/Ll9pZCwgaW5zdGFuY2UpO1xuXG5cdHNlbGYucmVhZHkoKTtcblxuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuXG5cbk1ldGVvci5wdWJsaXNoICdpbnN0YW5jZV90cmFjZXMnLCAoaW5zdGFuY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dW5sZXNzIGluc3RhbmNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXNcblxuXHRnZXRJbnN0YW5jZVRyYWNlcyA9IChfaW5zSWQpLT5cblx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogX2luc0lkfSwge2ZpZWxkczoge19pZDogMSwgdHJhY2VzOiAxfX0pXG5cblxuXHRoYW5kbGUgPSAgZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogaW5zdGFuY2VJZH0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdHNlbGYuY2hhbmdlZChcImluc3RhbmNlX3RyYWNlc1wiLCBpbnN0YW5jZUlkLCBnZXRJbnN0YW5jZVRyYWNlcyhpbnN0YW5jZUlkKSk7XG5cdH1cblxuXHRzZWxmLmFkZGVkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpIiwiTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlX2RhdGEnLCBmdW5jdGlvbihpbnN0YW5jZUlkLCBib3gpIHtcbiAgdmFyIGdldE1pbmlJbnN0YW5jZSwgZ2V0TXlhcHByb3ZlTW9kaWZpZWQsIGhhbmRsZSwgaW5zdGFuY2UsIGluc3RhbmNlX2ZpZWxkc18wLCBtaW5pQXBwcm92ZUZpZWxkcywgbmVlZENoYW5nZSwgc2VsZiwgdHJpZ2dlckNoYW5nZUZpZWxkcywgdHJpZ2dlckNoYW5nZUZpZWxkc1ZhbHVlcztcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCEoaW5zdGFuY2VJZCAmJiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiBpbnN0YW5jZUlkXG4gIH0pLmNvdW50KCkpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgbWluaUFwcHJvdmVGaWVsZHMgPSBbJ19pZCcsICdpc19maW5pc2hlZCcsICd1c2VyJywgJ2hhbmRsZXInLCAnaGFuZGxlcl9uYW1lJywgJ3R5cGUnLCAnc3RhcnRfZGF0ZScsICdkZXNjcmlwdGlvbicsICdpc19yZWFkJywgJ2p1ZGdlJywgJ2ZpbmlzaF9kYXRlJywgJ2Zyb21fdXNlcl9uYW1lJywgJ2Zyb21fdXNlcicsICdjY19kZXNjcmlwdGlvbicsICdhdXRvX3N1Ym1pdHRlZCddO1xuICB0cmlnZ2VyQ2hhbmdlRmllbGRzID0gWydmb3JtX3ZlcnNpb24nLCAnZmxvd192ZXJzaW9uJywgJ3JlbGF0ZWRfaW5zdGFuY2VzJywgJ19teV9hcHByb3ZlX3JlYWRfZGF0ZXMnLCAndmFsdWVzJywgJ2NoYW5nZV90aW1lJ107XG4gIHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXMgPSB7fTtcbiAgaW5zdGFuY2VfZmllbGRzXzAgPSB7XG4gICAgXCJyZWNvcmRfc3luY2VkXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuaGFuZGxlcl9vcmdhbml6YXRpb25fbmFtZVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmhhbmRsZXJfb3JnYW5pemF0aW9uXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuY29zdF90aW1lXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuaXNfZXJyb3JcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5kZWFkbGluZVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLnJlbWluZF9kYXRlXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMucmVtaW5kZWRfY291bnRcIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5tb2RpZmllZF9ieVwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLm1vZGlmaWVkXCI6IDAsXG4gICAgXCJ0cmFjZXMuYXBwcm92ZXMuZ2VvbG9jYXRpb25cIjogMCxcbiAgICBcInRyYWNlcy5hcHByb3Zlcy5jY191c2Vyc1wiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLmZyb21fYXBwcm92ZV9pZFwiOiAwLFxuICAgIFwidHJhY2VzLmFwcHJvdmVzLnZhbHVlc19oaXN0b3J5XCI6IDBcbiAgfTtcbiAgZ2V0TXlhcHByb3ZlTW9kaWZpZWQgPSBmdW5jdGlvbih0cmFjZXMpIHtcbiAgICB2YXIgbXlBcHByb3ZlTW9kaWZpZWRzO1xuICAgIG15QXBwcm92ZU1vZGlmaWVkcyA9IG5ldyBBcnJheSgpO1xuICAgIGlmICh0cmFjZXMgIT0gbnVsbCkge1xuICAgICAgdHJhY2VzLmZvckVhY2goZnVuY3Rpb24odHJhY2UpIHtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgcmV0dXJuIHRyYWNlICE9IG51bGwgPyAocmVmID0gdHJhY2UuYXBwcm92ZXMpICE9IG51bGwgPyByZWYuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgaWYgKGFwcHJvdmUudXNlciA9PT0gc2VsZi51c2VySWQgfHwgYXBwcm92ZS5oYW5kbGVyID09PSBzZWxmLnVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG15QXBwcm92ZU1vZGlmaWVkcy5wdXNoKGFwcHJvdmUucmVhZF9kYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBteUFwcHJvdmVNb2RpZmllZHM7XG4gIH07XG4gIGdldE1pbmlJbnN0YW5jZSA9IGZ1bmN0aW9uKF9pbnN0YW5jZUlkKSB7XG4gICAgdmFyIGluc3RhbmNlLCByZWYsIHJlZjEsIHNob3dfbW9kYWxfdHJhY2VzX2xpc3QsIHRyYWNlcztcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogX2luc3RhbmNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IGluc3RhbmNlX2ZpZWxkc18wXG4gICAgfSk7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlRmllbGRzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJykge1xuICAgICAgICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0gPSBnZXRNeWFwcHJvdmVNb2RpZmllZChpbnN0YW5jZS50cmFjZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0gPSBpbnN0YW5jZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNob3dfbW9kYWxfdHJhY2VzX2xpc3QgPSAoKHJlZiA9IGRiLnNwYWNlX3NldHRpbmdzLmZpbmRPbmUoe1xuICAgICAgICBzcGFjZTogaW5zdGFuY2Uuc3BhY2UsXG4gICAgICAgIGtleTogXCJzaG93X21vZGFsX3RyYWNlc19saXN0XCJcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgdmFsdWVzOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSAhPSBudWxsID8gcmVmLnZhbHVlcyA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgICBpZiAoc2hvd19tb2RhbF90cmFjZXNfbGlzdCkge1xuICAgICAgICB0cmFjZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoKHJlZjEgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJlZjEuZm9yRWFjaChmdW5jdGlvbih0cmFjZSkge1xuICAgICAgICAgICAgICB2YXIgX3RyYWNlLCBhcHByb3ZlcywgcmVmMjtcbiAgICAgICAgICAgICAgX3RyYWNlID0gXy5jbG9uZSh0cmFjZSk7XG4gICAgICAgICAgICAgIGFwcHJvdmVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgIGlmICh0cmFjZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKChyZWYyID0gdHJhY2UuYXBwcm92ZXMpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHJlZjIuZm9yRWFjaChmdW5jdGlvbihhcHByb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHByb3ZlLnR5cGUgIT09ICdjYycgfHwgYXBwcm92ZS51c2VyID09PSBzZWxmLnVzZXJJZCB8fCBhcHByb3ZlLmhhbmRsZXIgPT09IHNlbGYudXNlcklkIHx8ICghXy5pc0VtcHR5KGFwcHJvdmUuc2lnbl9maWVsZF9jb2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwcm92ZXMucHVzaChhcHByb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF90cmFjZS5hcHByb3ZlcyA9IGFwcHJvdmVzO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2VzLnB1c2goX3RyYWNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS50cmFjZXMgPSB0cmFjZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbiAgbmVlZENoYW5nZSA9IGZ1bmN0aW9uKGNoYW5nZUZpZWxkcykge1xuICAgIHZhciBfY2hhbmdlLCBfcmV2O1xuICAgIGlmIChjaGFuZ2VGaWVsZHMpIHtcbiAgICAgIF9jaGFuZ2UgPSBmYWxzZTtcbiAgICAgIF9yZXYgPSBfLmZpbmQodHJpZ2dlckNoYW5nZUZpZWxkcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHZhciBfa2V5LCBfbXlfYXBwcm92ZV9tb2RpZmllZHM7XG4gICAgICAgIF9rZXkgPSBrZXk7XG4gICAgICAgIGlmIChrZXkgPT09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJykge1xuICAgICAgICAgIF9rZXkgPSAndHJhY2VzJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5oYXMoY2hhbmdlRmllbGRzLCBfa2V5KSkge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdfbXlfYXBwcm92ZV9yZWFkX2RhdGVzJykge1xuICAgICAgICAgICAgX215X2FwcHJvdmVfbW9kaWZpZWRzID0gZ2V0TXlhcHByb3ZlTW9kaWZpZWQoY2hhbmdlRmllbGRzLnRyYWNlcyk7XG4gICAgICAgICAgICByZXR1cm4gIV8uaXNFcXVhbCh0cmlnZ2VyQ2hhbmdlRmllbGRzVmFsdWVzW2tleV0sIF9teV9hcHByb3ZlX21vZGlmaWVkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhXy5pc0VxdWFsKHRyaWdnZXJDaGFuZ2VGaWVsZHNWYWx1ZXNba2V5XSwgY2hhbmdlRmllbGRzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoX3Jldikge1xuICAgICAgICBfY2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfY2hhbmdlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDogaW5zdGFuY2VJZFxuICB9KS5vYnNlcnZlQ2hhbmdlcyh7XG4gICAgY2hhbmdlZDogZnVuY3Rpb24oaWQsIGZpZWxkcykge1xuICAgICAgaWYgKGJveCAhPT0gJ2luYm94JyB8fCBuZWVkQ2hhbmdlKGZpZWxkcykpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgZ2V0TWluaUluc3RhbmNlKGlkKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZW1vdmVkOiBmdW5jdGlvbihpZCkge1xuICAgICAgcmV0dXJuIHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG4gICAgfVxuICB9KTtcbiAgaW5zdGFuY2UgPSBnZXRNaW5pSW5zdGFuY2UoaW5zdGFuY2VJZCk7XG4gIHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaW5zdGFuY2UgIT0gbnVsbCA/IGluc3RhbmNlLl9pZCA6IHZvaWQgMCwgaW5zdGFuY2UpO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcblxuTWV0ZW9yLnB1Ymxpc2goJ2luc3RhbmNlX3RyYWNlcycsIGZ1bmN0aW9uKGluc3RhbmNlSWQpIHtcbiAgdmFyIGdldEluc3RhbmNlVHJhY2VzLCBoYW5kbGUsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghaW5zdGFuY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGdldEluc3RhbmNlVHJhY2VzID0gZnVuY3Rpb24oX2luc0lkKSB7XG4gICAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogX2luc0lkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgdHJhY2VzOiAxXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBfaWQ6IGluc3RhbmNlSWRcbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcbiAgICB9XG4gIH0pO1xuICBzZWxmLmFkZGVkKFwiaW5zdGFuY2VfdHJhY2VzXCIsIGluc3RhbmNlSWQsIGdldEluc3RhbmNlVHJhY2VzKGluc3RhbmNlSWQpKTtcbiAgc2VsZi5yZWFkeSgpO1xuICByZXR1cm4gc2VsZi5vblN0b3AoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGhhbmRsZS5zdG9wKCk7XG4gIH0pO1xufSk7XG4iLCJcblx0TWV0ZW9yLnB1Ymxpc2ggJ2luc3RhbmNlc19saXN0JywgKHNwYWNlSWQsIGJveCwgZmxvd0lkKS0+XG5cblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XHRcblx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdFx0cXVlcnkgPSB7c3BhY2U6IHNwYWNlSWR9XG5cdFx0aWYgYm94ID09IFwiaW5ib3hcIlxuXHRcdFx0cXVlcnkuaW5ib3hfdXNlcnMgPSB0aGlzLnVzZXJJZDtcblx0XHRlbHNlIGlmIGJveCA9PSBcIm91dGJveFwiXG5cdFx0XHRxdWVyeS5vdXRib3hfdXNlcnMgPSB0aGlzLnVzZXJJZDtcblx0XHRlbHNlIGlmIGJveCA9PSBcImRyYWZ0XCJcblx0XHRcdHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuXHRcdFx0cXVlcnkuc3RhdGUgPSBcImRyYWZ0XCJcblx0XHRlbHNlIGlmIGJveCA9PSBcInBlbmRpbmdcIlxuXHRcdFx0cXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwicGVuZGluZ1wiXG5cdFx0ZWxzZSBpZiBib3ggPT0gXCJjb21wbGV0ZWRcIlxuXHRcdFx0cXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwiY29tcGxldGVkXCJcblx0XHRlbHNlIGlmIGJveCA9PSBcIm1vbml0b3JcIlxuXHRcdFx0cXVlcnkuZmxvdyA9IGZsb3dJZDtcblx0XHRcdHF1ZXJ5LnN0YXRlID0geyRpbjogW1wicGVuZGluZ1wiLFwiY29tcGxldGVkXCJdfTtcblx0XHRlbHNlXG5cdFx0XHRxdWVyeS5zdGF0ZSA9IFwibm9uZVwiXG5cblx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtmaWVsZHM6IHtuYW1lOjEsIGNyZWF0ZWQ6MSwgZm9ybToxLCBmbG93OiAxLCBzcGFjZToxLCBtb2RpZmllZDoxLCBhcHBsaWNhbnQ6IDEsIGlzX2FyY2hpdmVkOjEsIGZvcm1fdmVyc2lvbjogMSwgZmxvd192ZXJzaW9uOiAxfX0pXG5cbiIsIk1ldGVvci5wdWJsaXNoKCdpbnN0YW5jZXNfbGlzdCcsIGZ1bmN0aW9uKHNwYWNlSWQsIGJveCwgZmxvd0lkKSB7XG4gIHZhciBxdWVyeTtcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBxdWVyeSA9IHtcbiAgICBzcGFjZTogc3BhY2VJZFxuICB9O1xuICBpZiAoYm94ID09PSBcImluYm94XCIpIHtcbiAgICBxdWVyeS5pbmJveF91c2VycyA9IHRoaXMudXNlcklkO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJvdXRib3hcIikge1xuICAgIHF1ZXJ5Lm91dGJveF91c2VycyA9IHRoaXMudXNlcklkO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJkcmFmdFwiKSB7XG4gICAgcXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG4gICAgcXVlcnkuc3RhdGUgPSBcImRyYWZ0XCI7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcInBlbmRpbmdcIikge1xuICAgIHF1ZXJ5LnN1Ym1pdHRlciA9IHRoaXMudXNlcklkO1xuICAgIHF1ZXJ5LnN0YXRlID0gXCJwZW5kaW5nXCI7XG4gIH0gZWxzZSBpZiAoYm94ID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgcXVlcnkuc3VibWl0dGVyID0gdGhpcy51c2VySWQ7XG4gICAgcXVlcnkuc3RhdGUgPSBcImNvbXBsZXRlZFwiO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJtb25pdG9yXCIpIHtcbiAgICBxdWVyeS5mbG93ID0gZmxvd0lkO1xuICAgIHF1ZXJ5LnN0YXRlID0ge1xuICAgICAgJGluOiBbXCJwZW5kaW5nXCIsIFwiY29tcGxldGVkXCJdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBxdWVyeS5zdGF0ZSA9IFwibm9uZVwiO1xuICB9XG4gIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuICAgIGZpZWxkczoge1xuICAgICAgbmFtZTogMSxcbiAgICAgIGNyZWF0ZWQ6IDEsXG4gICAgICBmb3JtOiAxLFxuICAgICAgZmxvdzogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgbW9kaWZpZWQ6IDEsXG4gICAgICBhcHBsaWNhbnQ6IDEsXG4gICAgICBpc19hcmNoaXZlZDogMSxcbiAgICAgIGZvcm1fdmVyc2lvbjogMSxcbiAgICAgIGZsb3dfdmVyc2lvbjogMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsImxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUgPSAoaW5zdGFuY2VpZCwgdXNlcklkLCBkYXRhTWFwLCBjYWxsYmFjayktPlxuXHRvcGVyYXRpb24gPSBbe1xuXHRcdFwiJG1hdGNoXCI6IHtcblx0XHRcdFwiX2lkXCI6IGluc3RhbmNlaWRcblx0XHR9XG5cdH0sIHtcIiRwcm9qZWN0XCI6IHtcIm5hbWVcIjogMSwgXCJfYXBwcm92ZVwiOiBcIiR0cmFjZXMuYXBwcm92ZXNcIn19LCB7XCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJ9LCB7XCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJ9LFxuXHRcdHtcIiRtYXRjaFwiOiB7XCJfYXBwcm92ZS5pc19maW5pc2hlZFwiOiB0cnVlLCAkb3I6W3tcIl9hcHByb3ZlLmhhbmRsZXJcIjogdXNlcklkfSx7XCJfYXBwcm92ZS51c2VyXCI6IHVzZXJJZH1dfX0sXG5cdFx0e1wiJGdyb3VwXCI6IHtcIl9pZFwiOiBcIiRfaWRcIiwgXCJmaW5pc2hfZGF0ZVwiOiB7XCIkbGFzdFwiOiBcIiRfYXBwcm92ZS5maW5pc2hfZGF0ZVwifX19XG5cdF1cblxuXHRkYi5pbnN0YW5jZXMucmF3Q29sbGVjdGlvbigpLmFnZ3JlZ2F0ZShvcGVyYXRpb24pLnRvQXJyYXkgKGVyciwgZGF0YSktPlxuXHRcdGlmIGVyclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGVycilcblxuXHRcdGRhdGEuZm9yRWFjaCAoZG9jKSAtPlxuXHRcdFx0ZGF0YU1hcC5wdXNoIGRvY1xuXG5cdFx0aWYgY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKVxuXHRcdFx0Y2FsbGJhY2soKVxuXHRcdHJldHVyblxuXG5hc3luY0xhc3RGaW5pc2hlZEFwcHJvdmUgPSBNZXRlb3Iud3JhcEFzeW5jKGxhc3RGaW5pc2hlZEFwcHJvdmVBZ2dyZWdhdGUpXG5cbk1ldGVvci5wdWJsaXNoIFwiaW5zdGFuY2VfdGFidWxhclwiLCAodGFibGVOYW1lLCBpZHMsIGZpZWxkcyktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0Y2hlY2sodGFibGVOYW1lLCBTdHJpbmcpO1xuXG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSlcblxuXHRmaWVsZHMuY2NfdXNlcnMgPSAxXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0Z2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlID0gKHVzZXJJZCwgaW5zdGFuY2VJZCktPlxuXHRcdGRhdGEgPSBbXVxuXHRcdGFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZShpbnN0YW5jZUlkLCB1c2VySWQsIGRhdGEpXG5cdFx0aWYgZGF0YS5sZW5ndGggPiAwXG5cdFx0XHRyZXR1cm4gZGF0YVswXVxuXG5cblx0Z2V0TXlBcHByb3ZlID0gKHVzZXJJZCwgaW5zdGFuY2VJZCktPlxuXHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaW5zdGFuY2VJZH0sIHtmaWVsZHM6IHt0cmFjZXM6IDF9fSlcblx0XHRteUFwcHJvdmUgPSBudWxsXG5cblx0XHRpZiAhaW5zdGFuY2Vcblx0XHRcdHJldHVyblxuXG5cdFx0aWYgIWluc3RhbmNlLnRyYWNlcyB8fCBpbnN0YW5jZS50cmFjZXMubGVuZ3RoIDwgMVxuXHRcdFx0cmV0dXJuXG5cblx0XHRub3RGaW5pc2hlZFRyYWNlcyA9IGluc3RhbmNlLnRyYWNlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKVxuXG5cdFx0aWYgbm90RmluaXNoZWRUcmFjZXMubGVuZ3RoID4gMFxuXHRcdFx0YXBwcm92ZXMgPSBub3RGaW5pc2hlZFRyYWNlc1swXS5hcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKS5maWx0ZXJQcm9wZXJ0eShcImhhbmRsZXJcIiwgdXNlcklkKTtcblxuXHRcdFx0aWYgYXBwcm92ZXMubGVuZ3RoID4gMFxuXHRcdFx0XHRhcHByb3ZlID0gYXBwcm92ZXNbMF1cblx0XHRcdFx0bXlBcHByb3ZlID0ge1xuXHRcdFx0XHRcdGlkOiBhcHByb3ZlLl9pZCxcblx0XHRcdFx0XHRpbnN0YW5jZTogYXBwcm92ZS5pbnN0YW5jZSxcblx0XHRcdFx0XHR0cmFjZTogYXBwcm92ZS50cmFjZSxcblx0XHRcdFx0XHRpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWQsXG5cdFx0XHRcdFx0c3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlXG5cdFx0XHRcdFx0YWdlbnQ6IGFwcHJvdmUuYWdlbnRcblx0XHRcdFx0XHR1c2VyX25hbWU6IGFwcHJvdmUudXNlcl9uYW1lXG5cdFx0XHRcdH1cblxuXHRcdGlmICFteUFwcHJvdmVcblx0XHRcdGlzX3JlYWQgPSBmYWxzZVxuXHRcdFx0aW5zdGFuY2UudHJhY2VzLmZvckVhY2ggKHRyYWNlKSAtPlxuXHRcdFx0XHR0cmFjZT8uYXBwcm92ZXM/LmZvckVhY2ggKGFwcHJvdmUpIC0+XG5cdFx0XHRcdFx0aWYgYXBwcm92ZS50eXBlID09ICdjYycgYW5kIGFwcHJvdmUudXNlciA9PSB1c2VySWQgYW5kIGFwcHJvdmUuaXNfZmluaXNoZWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdGlmIGFwcHJvdmUuaXNfcmVhZFxuXHRcdFx0XHRcdFx0XHRpc19yZWFkID0gdHJ1ZVxuXHRcdFx0XHRcdFx0bXlBcHByb3ZlID0ge2lkOiBhcHByb3ZlLl9pZCwgaXNfcmVhZDogaXNfcmVhZCwgc3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlLCBhZ2VudDogYXBwcm92ZS5hZ2VudCwgdXNlcl9uYW1lOiBhcHByb3ZlLnVzZXJfbmFtZX1cblxuXHRcdHJldHVybiBteUFwcHJvdmVcblxuXHRnZXRTdGVwQ3VycmVudE5hbWUgPSAoaW5zdGFuY2VJZCkgLT5cblx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGluc3RhbmNlSWR9LCB7ZmllbGRzOiB7XCJ0cmFjZXMubmFtZVwiOiAxLCBcInRyYWNlc1wiOiB7JHNsaWNlOiAtMX19fSlcblx0XHRpZiBpbnN0YW5jZVxuXHRcdFx0c3RlcEN1cnJlbnROYW1lID0gaW5zdGFuY2UudHJhY2VzP1swXT8ubmFtZVxuXG5cdFx0cmV0dXJuIHN0ZXBDdXJyZW50TmFtZVxuXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHtfaWQ6IHskaW46IGlkc319LCB7ZmllbGRzOiB7dHJhY2VzOiAwfX0pLm9ic2VydmVDaGFuZ2VzIHtcblx0XHRjaGFuZ2VkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0bXlBcHByb3ZlID0gZ2V0TXlBcHByb3ZlKHNlbGYudXNlcklkLCBpZClcblx0XHRcdG15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpXG5cdFx0XHRpZiBteUFwcHJvdmVcblx0XHRcdFx0aW5zdGFuY2UuaXNfcmVhZCA9IG15QXBwcm92ZS5pc19yZWFkXG5cdFx0XHRcdGluc3RhbmNlLnN0YXJ0X2RhdGUgPSBteUFwcHJvdmUuc3RhcnRfZGF0ZVxuXHRcdFx0XHRpZiBteUFwcHJvdmUuYWdlbnRcblx0XHRcdFx0XHRpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGluc3RhbmNlLmlzX3JlYWQgPSB0cnVlXG5cblx0XHRcdGlmIG15TGFzdEZpbmlzaGVkQXBwcm92ZVxuXHRcdFx0XHRpbnN0YW5jZS5teV9maW5pc2hfZGF0ZSA9IG15TGFzdEZpbmlzaGVkQXBwcm92ZS5maW5pc2hfZGF0ZVxuXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGluc3RhbmNlLmNjX2NvdW50ID0gaW5zdGFuY2UuY2NfdXNlcnM/Lmxlbmd0aCB8fCAwXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHRyeVxuXHRcdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcblx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdpbnN0YW5jZSBvYnNlcnZlQ2hhbmdlcyBlcnJvcjogJywgZXJyb3IubWVzc2FnZSk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdzZWxmLnVzZXJJZDogJywgc2VsZi51c2VySWQpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygndGFibGVOYW1lOiAnLCB0YWJsZU5hbWUpO1xuXHRcdFx0XHRjb25zb2xlLmxvZygnaWRzOiAnLCBKU09OLnN0cmluZ2lmeShpZHMpKTtcblx0XHRcdFx0Y29uc29sZS5sb2coJ215QXBwcm92ZTogJywgSlNPTi5zdHJpbmdpZnkobXlBcHByb3ZlKSk7XG5cdFx0cmVtb3ZlZDogKGlkKS0+XG5cdFx0XHRzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuXHR9XG5cblx0aWRzLmZvckVhY2ggKGlkKS0+XG5cdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdG15QXBwcm92ZSA9IGdldE15QXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpXG5cdFx0bXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlKHNlbGYudXNlcklkLCBpZClcblx0XHRpZiBteUFwcHJvdmVcblx0XHRcdGluc3RhbmNlLmlzX3JlYWQgPSBteUFwcHJvdmUuaXNfcmVhZFxuXHRcdFx0aW5zdGFuY2Uuc3RhcnRfZGF0ZSA9IG15QXBwcm92ZS5zdGFydF9kYXRlXG5cdFx0XHRpZiBteUFwcHJvdmUuYWdlbnRcblx0XHRcdFx0XHRpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lXG5cdFx0ZWxzZVxuXHRcdFx0aW5zdGFuY2UuaXNfcmVhZCA9IHRydWVcblxuXHRcdGlmIG15TGFzdEZpbmlzaGVkQXBwcm92ZVxuXHRcdFx0aW5zdGFuY2UubXlfZmluaXNoX2RhdGUgPSBteUxhc3RGaW5pc2hlZEFwcHJvdmUuZmluaXNoX2RhdGVcblxuXHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdGluc3RhbmNlLmNjX2NvdW50ID0gaW5zdGFuY2UuY2NfdXNlcnM/Lmxlbmd0aCB8fCAwXG5cdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0c2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuXG5cdHNlbGYucmVhZHkoKTtcblx0c2VsZi5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcblxuTWV0ZW9yLnB1Ymxpc2ggXCJpbnN0YW5jZV90YXNrc190YWJ1bGFyXCIsICh0YWJ1bGFyTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuXG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSlcblxuXHQjIGNvbnNvbGUubG9nKCd0YWJ1bGFyTmFtZTogJywgdGFidWxhck5hbWUpO1xuXHQjIGNvbnNvbGUubG9nKCdpZHM6ICcsIEpTT04uc3RyaW5naWZ5KGlkcykpO1xuXHQjIGNvbnNvbGUubG9nKCdmaWVsZHM6ICcsIEpTT04uc3RyaW5naWZ5KGZpZWxkcykpO1xuXG5cdGRiLmluc3RhbmNlX3Rhc2tzLmZpbmQoe1xuXHRcdF9pZDoge1xuXHRcdFx0JGluOiBpZHNcblx0XHR9XG5cdH0sIHtcblx0XHRmaWVsZHM6IGZpZWxkc1xuXHR9KVxuXG5NZXRlb3IucHVibGlzaCBcImluc3RhbmNlc190YWJ1bGFyXCIsICh0YWJ1bGFyTmFtZSwgaWRzLCBmaWVsZHMpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuXG5cdGNoZWNrKGlkcywgQXJyYXkpO1xuXG5cdGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSlcblxuXHQjIGNvbnNvbGUubG9nKCd0YWJ1bGFyTmFtZTogJywgdGFidWxhck5hbWUpO1xuXHQjIGNvbnNvbGUubG9nKCdpZHM6ICcsIEpTT04uc3RyaW5naWZ5KGlkcykpO1xuXHQjIGNvbnNvbGUubG9nKCdmaWVsZHM6ICcsIEpTT04uc3RyaW5naWZ5KGZpZWxkcykpO1xuXG5cdGRiLmluc3RhbmNlcy5maW5kKHtcblx0XHRfaWQ6IHtcblx0XHRcdCRpbjogaWRzXG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmllbGRzOiBmaWVsZHNcblx0fSkiLCJ2YXIgYXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlLCBsYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlO1xuXG5sYXN0RmluaXNoZWRBcHByb3ZlQWdncmVnYXRlID0gZnVuY3Rpb24oaW5zdGFuY2VpZCwgdXNlcklkLCBkYXRhTWFwLCBjYWxsYmFjaykge1xuICB2YXIgb3BlcmF0aW9uO1xuICBvcGVyYXRpb24gPSBbXG4gICAge1xuICAgICAgXCIkbWF0Y2hcIjoge1xuICAgICAgICBcIl9pZFwiOiBpbnN0YW5jZWlkXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgXCIkcHJvamVjdFwiOiB7XG4gICAgICAgIFwibmFtZVwiOiAxLFxuICAgICAgICBcIl9hcHByb3ZlXCI6IFwiJHRyYWNlcy5hcHByb3Zlc1wiXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgXCIkdW53aW5kXCI6IFwiJF9hcHByb3ZlXCJcbiAgICB9LCB7XG4gICAgICBcIiR1bndpbmRcIjogXCIkX2FwcHJvdmVcIlxuICAgIH0sIHtcbiAgICAgIFwiJG1hdGNoXCI6IHtcbiAgICAgICAgXCJfYXBwcm92ZS5pc19maW5pc2hlZFwiOiB0cnVlLFxuICAgICAgICAkb3I6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIl9hcHByb3ZlLmhhbmRsZXJcIjogdXNlcklkXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgXCJfYXBwcm92ZS51c2VyXCI6IHVzZXJJZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIFwiJGdyb3VwXCI6IHtcbiAgICAgICAgXCJfaWRcIjogXCIkX2lkXCIsXG4gICAgICAgIFwiZmluaXNoX2RhdGVcIjoge1xuICAgICAgICAgIFwiJGxhc3RcIjogXCIkX2FwcHJvdmUuZmluaXNoX2RhdGVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBdO1xuICByZXR1cm4gZGIuaW5zdGFuY2VzLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUob3BlcmF0aW9uKS50b0FycmF5KGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7XG4gICAgICByZXR1cm4gZGF0YU1hcC5wdXNoKGRvYyk7XG4gICAgfSk7XG4gICAgaWYgKGNhbGxiYWNrICYmIF8uaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmFzeW5jTGFzdEZpbmlzaGVkQXBwcm92ZSA9IE1ldGVvci53cmFwQXN5bmMobGFzdEZpbmlzaGVkQXBwcm92ZUFnZ3JlZ2F0ZSk7XG5cbk1ldGVvci5wdWJsaXNoKFwiaW5zdGFuY2VfdGFidWxhclwiLCBmdW5jdGlvbih0YWJsZU5hbWUsIGlkcywgZmllbGRzKSB7XG4gIHZhciBnZXRNeUFwcHJvdmUsIGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZSwgZ2V0U3RlcEN1cnJlbnROYW1lLCBoYW5kbGUsIHNlbGY7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGNoZWNrKHRhYmxlTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIGZpZWxkcy5jY191c2VycyA9IDE7XG4gIHNlbGYgPSB0aGlzO1xuICBnZXRNeUxhc3RGaW5pc2hlZEFwcHJvdmUgPSBmdW5jdGlvbih1c2VySWQsIGluc3RhbmNlSWQpIHtcbiAgICB2YXIgZGF0YTtcbiAgICBkYXRhID0gW107XG4gICAgYXN5bmNMYXN0RmluaXNoZWRBcHByb3ZlKGluc3RhbmNlSWQsIHVzZXJJZCwgZGF0YSk7XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRhdGFbMF07XG4gICAgfVxuICB9O1xuICBnZXRNeUFwcHJvdmUgPSBmdW5jdGlvbih1c2VySWQsIGluc3RhbmNlSWQpIHtcbiAgICB2YXIgYXBwcm92ZSwgYXBwcm92ZXMsIGluc3RhbmNlLCBpc19yZWFkLCBteUFwcHJvdmUsIG5vdEZpbmlzaGVkVHJhY2VzO1xuICAgIGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBpbnN0YW5jZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHRyYWNlczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIG15QXBwcm92ZSA9IG51bGw7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWluc3RhbmNlLnRyYWNlcyB8fCBpbnN0YW5jZS50cmFjZXMubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBub3RGaW5pc2hlZFRyYWNlcyA9IGluc3RhbmNlLnRyYWNlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKTtcbiAgICBpZiAobm90RmluaXNoZWRUcmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXBwcm92ZXMgPSBub3RGaW5pc2hlZFRyYWNlc1swXS5hcHByb3Zlcy5maWx0ZXJQcm9wZXJ0eShcImlzX2ZpbmlzaGVkXCIsIGZhbHNlKS5maWx0ZXJQcm9wZXJ0eShcImhhbmRsZXJcIiwgdXNlcklkKTtcbiAgICAgIGlmIChhcHByb3Zlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFwcHJvdmUgPSBhcHByb3Zlc1swXTtcbiAgICAgICAgbXlBcHByb3ZlID0ge1xuICAgICAgICAgIGlkOiBhcHByb3ZlLl9pZCxcbiAgICAgICAgICBpbnN0YW5jZTogYXBwcm92ZS5pbnN0YW5jZSxcbiAgICAgICAgICB0cmFjZTogYXBwcm92ZS50cmFjZSxcbiAgICAgICAgICBpc19yZWFkOiBhcHByb3ZlLmlzX3JlYWQsXG4gICAgICAgICAgc3RhcnRfZGF0ZTogYXBwcm92ZS5zdGFydF9kYXRlLFxuICAgICAgICAgIGFnZW50OiBhcHByb3ZlLmFnZW50LFxuICAgICAgICAgIHVzZXJfbmFtZTogYXBwcm92ZS51c2VyX25hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFteUFwcHJvdmUpIHtcbiAgICAgIGlzX3JlYWQgPSBmYWxzZTtcbiAgICAgIGluc3RhbmNlLnRyYWNlcy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNlKSB7XG4gICAgICAgIHZhciByZWY7XG4gICAgICAgIHJldHVybiB0cmFjZSAhPSBudWxsID8gKHJlZiA9IHRyYWNlLmFwcHJvdmVzKSAhPSBudWxsID8gcmVmLmZvckVhY2goZnVuY3Rpb24oYXBwcm92ZSkge1xuICAgICAgICAgIGlmIChhcHByb3ZlLnR5cGUgPT09ICdjYycgJiYgYXBwcm92ZS51c2VyID09PSB1c2VySWQgJiYgYXBwcm92ZS5pc19maW5pc2hlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmIChhcHByb3ZlLmlzX3JlYWQpIHtcbiAgICAgICAgICAgICAgaXNfcmVhZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbXlBcHByb3ZlID0ge1xuICAgICAgICAgICAgICBpZDogYXBwcm92ZS5faWQsXG4gICAgICAgICAgICAgIGlzX3JlYWQ6IGlzX3JlYWQsXG4gICAgICAgICAgICAgIHN0YXJ0X2RhdGU6IGFwcHJvdmUuc3RhcnRfZGF0ZSxcbiAgICAgICAgICAgICAgYWdlbnQ6IGFwcHJvdmUuYWdlbnQsXG4gICAgICAgICAgICAgIHVzZXJfbmFtZTogYXBwcm92ZS51c2VyX25hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbXlBcHByb3ZlO1xuICB9O1xuICBnZXRTdGVwQ3VycmVudE5hbWUgPSBmdW5jdGlvbihpbnN0YW5jZUlkKSB7XG4gICAgdmFyIGluc3RhbmNlLCByZWYsIHJlZjEsIHN0ZXBDdXJyZW50TmFtZTtcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaW5zdGFuY2VJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBcInRyYWNlcy5uYW1lXCI6IDEsXG4gICAgICAgIFwidHJhY2VzXCI6IHtcbiAgICAgICAgICAkc2xpY2U6IC0xXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIHN0ZXBDdXJyZW50TmFtZSA9IChyZWYgPSBpbnN0YW5jZS50cmFjZXMpICE9IG51bGwgPyAocmVmMSA9IHJlZlswXSkgIT0gbnVsbCA/IHJlZjEubmFtZSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBDdXJyZW50TmFtZTtcbiAgfTtcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHRyYWNlczogMFxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgZXJyb3IsIGluc3RhbmNlLCBteUFwcHJvdmUsIG15TGFzdEZpbmlzaGVkQXBwcm92ZSwgcmVmLCByZWYxO1xuICAgICAgaW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogaWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBteUFwcHJvdmUgPSBnZXRNeUFwcHJvdmUoc2VsZi51c2VySWQsIGlkKTtcbiAgICAgIG15TGFzdEZpbmlzaGVkQXBwcm92ZSA9IGdldE15TGFzdEZpbmlzaGVkQXBwcm92ZShzZWxmLnVzZXJJZCwgaWQpO1xuICAgICAgaWYgKG15QXBwcm92ZSkge1xuICAgICAgICBpbnN0YW5jZS5pc19yZWFkID0gbXlBcHByb3ZlLmlzX3JlYWQ7XG4gICAgICAgIGluc3RhbmNlLnN0YXJ0X2RhdGUgPSBteUFwcHJvdmUuc3RhcnRfZGF0ZTtcbiAgICAgICAgaWYgKG15QXBwcm92ZS5hZ2VudCkge1xuICAgICAgICAgIGluc3RhbmNlLmFnZW50X3VzZXJfbmFtZSA9IG15QXBwcm92ZS51c2VyX25hbWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmlzX3JlYWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG15TGFzdEZpbmlzaGVkQXBwcm92ZSkge1xuICAgICAgICBpbnN0YW5jZS5teV9maW5pc2hfZGF0ZSA9IG15TGFzdEZpbmlzaGVkQXBwcm92ZS5maW5pc2hfZGF0ZTtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlLmlzX2NjID0gKChyZWYgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgICAgaW5zdGFuY2UuY2NfY291bnQgPSAoKHJlZjEgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwKSB8fCAwO1xuICAgICAgZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5zdGFuY2Ugb2JzZXJ2ZUNoYW5nZXMgZXJyb3I6ICcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICBjb25zb2xlLmxvZygnc2VsZi51c2VySWQ6ICcsIHNlbGYudXNlcklkKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RhYmxlTmFtZTogJywgdGFibGVOYW1lKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2lkczogJywgSlNPTi5zdHJpbmdpZnkoaWRzKSk7XG4gICAgICAgIHJldHVybiBjb25zb2xlLmxvZygnbXlBcHByb3ZlOiAnLCBKU09OLnN0cmluZ2lmeShteUFwcHJvdmUpKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZWQ6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gc2VsZi5yZW1vdmVkKFwiaW5zdGFuY2VzXCIsIGlkKTtcbiAgICB9XG4gIH0pO1xuICBpZHMuZm9yRWFjaChmdW5jdGlvbihpZCkge1xuICAgIHZhciBpbnN0YW5jZSwgbXlBcHByb3ZlLCBteUxhc3RGaW5pc2hlZEFwcHJvdmUsIHJlZiwgcmVmMTtcbiAgICBpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogaWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IGZpZWxkc1xuICAgIH0pO1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbXlBcHByb3ZlID0gZ2V0TXlBcHByb3ZlKHNlbGYudXNlcklkLCBpZCk7XG4gICAgbXlMYXN0RmluaXNoZWRBcHByb3ZlID0gZ2V0TXlMYXN0RmluaXNoZWRBcHByb3ZlKHNlbGYudXNlcklkLCBpZCk7XG4gICAgaWYgKG15QXBwcm92ZSkge1xuICAgICAgaW5zdGFuY2UuaXNfcmVhZCA9IG15QXBwcm92ZS5pc19yZWFkO1xuICAgICAgaW5zdGFuY2Uuc3RhcnRfZGF0ZSA9IG15QXBwcm92ZS5zdGFydF9kYXRlO1xuICAgICAgaWYgKG15QXBwcm92ZS5hZ2VudCkge1xuICAgICAgICBpbnN0YW5jZS5hZ2VudF91c2VyX25hbWUgPSBteUFwcHJvdmUudXNlcl9uYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5pc19yZWFkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG15TGFzdEZpbmlzaGVkQXBwcm92ZSkge1xuICAgICAgaW5zdGFuY2UubXlfZmluaXNoX2RhdGUgPSBteUxhc3RGaW5pc2hlZEFwcHJvdmUuZmluaXNoX2RhdGU7XG4gICAgfVxuICAgIGluc3RhbmNlLmlzX2NjID0gKChyZWYgPSBpbnN0YW5jZS5jY191c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgIGluc3RhbmNlLmNjX2NvdW50ID0gKChyZWYxID0gaW5zdGFuY2UuY2NfdXNlcnMpICE9IG51bGwgPyByZWYxLmxlbmd0aCA6IHZvaWQgMCkgfHwgMDtcbiAgICBkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnM7XG4gICAgcmV0dXJuIHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcbiAgfSk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBoYW5kbGUuc3RvcCgpO1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaChcImluc3RhbmNlX3Rhc2tzX3RhYnVsYXJcIiwgZnVuY3Rpb24odGFidWxhck5hbWUsIGlkcywgZmllbGRzKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGNoZWNrKHRhYnVsYXJOYW1lLCBTdHJpbmcpO1xuICBjaGVjayhpZHMsIEFycmF5KTtcbiAgY2hlY2soZmllbGRzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgcmV0dXJuIGRiLmluc3RhbmNlX3Rhc2tzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IGZpZWxkc1xuICB9KTtcbn0pO1xuXG5NZXRlb3IucHVibGlzaChcImluc3RhbmNlc190YWJ1bGFyXCIsIGZ1bmN0aW9uKHRhYnVsYXJOYW1lLCBpZHMsIGZpZWxkcykge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBjaGVjayh0YWJ1bGFyTmFtZSwgU3RyaW5nKTtcbiAgY2hlY2soaWRzLCBBcnJheSk7XG4gIGNoZWNrKGZpZWxkcywgTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSk7XG4gIHJldHVybiBkYi5pbnN0YW5jZXMuZmluZCh7XG4gICAgX2lkOiB7XG4gICAgICAkaW46IGlkc1xuICAgIH1cbiAgfSwge1xuICAgIGZpZWxkczogZmllbGRzXG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnaW5zdGFuY2VzX2RyYWZ0JywgKHNwYWNlSWQpIC0+XG5cdGNoZWNrIHNwYWNlSWQsIFN0cmluZ1xuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1c2VySWQgPSB0aGlzLnVzZXJJZFxuXHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe3N0YXRlOlwiZHJhZnRcIixzcGFjZTpzcGFjZUlkLHN1Ym1pdHRlcjp1c2VySWQsJG9yOlt7aW5ib3hfdXNlcnM6IHskZXhpc3RzOmZhbHNlfX0sIHtpbmJveF91c2VyczogW119XX0sIHtmaWVsZHM6IHtfaWQ6IDEsIHN0YXRlOiAxLCBzcGFjZTogMSwgc3VibWl0dGVyOiAxLCBpbmJveF91c2VyczogMSwgbW9kaWZpZWQ6IDEsIG5hbWU6IDF9LCBzb3J0Onttb2RpZmllZDogLTF9fSkiLCJNZXRlb3IucHVibGlzaCgnaW5zdGFuY2VzX2RyYWZ0JywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICB2YXIgdXNlcklkO1xuICBjaGVjayhzcGFjZUlkLCBTdHJpbmcpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICB1c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICBzdGF0ZTogXCJkcmFmdFwiLFxuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIHN1Ym1pdHRlcjogdXNlcklkLFxuICAgICRvcjogW1xuICAgICAge1xuICAgICAgICBpbmJveF91c2Vyczoge1xuICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgaW5ib3hfdXNlcnM6IFtdXG4gICAgICB9XG4gICAgXVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBfaWQ6IDEsXG4gICAgICBzdGF0ZTogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgc3VibWl0dGVyOiAxLFxuICAgICAgaW5ib3hfdXNlcnM6IDEsXG4gICAgICBtb2RpZmllZDogMSxcbiAgICAgIG5hbWU6IDFcbiAgICB9LFxuICAgIHNvcnQ6IHtcbiAgICAgIG1vZGlmaWVkOiAtMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdkaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzJywgKGluc3RhbmNlX2lkcyktPlxuXHRjaGVjayhpbnN0YW5jZV9pZHMsIEFycmF5KVxuXG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblx0XG5cdHVubGVzcyBpbnN0YW5jZV9pZHNcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0aWYgXy5pc0VtcHR5KGluc3RhbmNlX2lkcylcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXNcblxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZCh7X2lkOiB7JGluOiBpbnN0YW5jZV9pZHN9fSwge2ZpZWxkczoge3N0YXRlOiAxLCB0cmFjZXM6eyRzbGljZTogMX0gfSB9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0YWRkZWQ6IChpZCwgZmllbGRzKS0+XG5cdFx0XHRzZWxmLmFkZGVkKCdpbnN0YW5jZXMnLCBpZCwge3N0YXRlOiBmaWVsZHMuc3RhdGUsIGlzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZH0pXG5cblx0XHRjaGFuZ2VkOiAoaWQsIGZpZWxkcyktPlxuXHRcdFx0aWYgZmllbGRzLnN0YXRlXG5cdFx0XHRcdHNlbGYuY2hhbmdlZCgnaW5zdGFuY2VzJywgaWQsIHtzdGF0ZTogZmllbGRzLnN0YXRlfSlcblx0XHRcdGlmIGZpZWxkcy50cmFjZXNcblx0XHRcdFx0c2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge2lzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZH0pXG5cdH1cblxuXHR0aGlzLnJlYWR5KClcblx0dGhpcy5vblN0b3AgKCktPlxuXHRcdGhhbmRsZS5zdG9wKClcbiIsIk1ldGVvci5wdWJsaXNoKCdkaXN0cmlidXRlZF9pbnN0YW5jZXNfc3RhdGVfYnlfaWRzJywgZnVuY3Rpb24oaW5zdGFuY2VfaWRzKSB7XG4gIHZhciBoYW5kbGUsIHNlbGY7XG4gIGNoZWNrKGluc3RhbmNlX2lkcywgQXJyYXkpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIWluc3RhbmNlX2lkcykge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShpbnN0YW5jZV9pZHMpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgaGFuZGxlID0gZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgIF9pZDoge1xuICAgICAgJGluOiBpbnN0YW5jZV9pZHNcbiAgICB9XG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHN0YXRlOiAxLFxuICAgICAgdHJhY2VzOiB7XG4gICAgICAgICRzbGljZTogMVxuICAgICAgfVxuICAgIH1cbiAgfSkub2JzZXJ2ZUNoYW5nZXMoe1xuICAgIGFkZGVkOiBmdW5jdGlvbihpZCwgZmllbGRzKSB7XG4gICAgICByZXR1cm4gc2VsZi5hZGRlZCgnaW5zdGFuY2VzJywgaWQsIHtcbiAgICAgICAgc3RhdGU6IGZpZWxkcy5zdGF0ZSxcbiAgICAgICAgaXNfcmVhZDogZmllbGRzLnRyYWNlc1swXS5hcHByb3Zlc1swXS5pc19yZWFkXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKGlkLCBmaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZHMuc3RhdGUpIHtcbiAgICAgICAgc2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge1xuICAgICAgICAgIHN0YXRlOiBmaWVsZHMuc3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGRzLnRyYWNlcykge1xuICAgICAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKCdpbnN0YW5jZXMnLCBpZCwge1xuICAgICAgICAgIGlzX3JlYWQ6IGZpZWxkcy50cmFjZXNbMF0uYXBwcm92ZXNbMF0uaXNfcmVhZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLnJlYWR5KCk7XG4gIHJldHVybiB0aGlzLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdyZWxhdGVkX2luc3RhY2VzJywgKGluc3RhbmNlSWQsIHJlbGF0ZWRfaW5zdGFuY2VzKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgaW5zdGFuY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZWxhdGVkX2luc3RhbmNlX2lkcyA9IGRiLmluc3RhbmNlcy5maW5kT25lKGluc3RhbmNlSWQse2ZpZWxkczoge3JlbGF0ZWRfaW5zdGFuY2VzOiAxfX0pPy5yZWxhdGVkX2luc3RhbmNlc1xuXG5cdGlmIHJlbGF0ZWRfaW5zdGFuY2VfaWRzICYmIF8uaXNBcnJheShyZWxhdGVkX2luc3RhbmNlX2lkcylcblx0XHRyZXR1cm4gZGIuaW5zdGFuY2VzLmZpbmQoe19pZDogeyRpbiA6IHJlbGF0ZWRfaW5zdGFuY2VfaWRzfX0sIHtmaWVsZHM6IHtfaWQ6IDEsIG5hbWU6IDEsIHNwYWNlOiAxfX0pXG5cdGVsc2Vcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpIiwiTWV0ZW9yLnB1Ymxpc2goJ3JlbGF0ZWRfaW5zdGFjZXMnLCBmdW5jdGlvbihpbnN0YW5jZUlkLCByZWxhdGVkX2luc3RhbmNlcykge1xuICB2YXIgcmVmLCByZWxhdGVkX2luc3RhbmNlX2lkcztcbiAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgaWYgKCFpbnN0YW5jZUlkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZWxhdGVkX2luc3RhbmNlX2lkcyA9IChyZWYgPSBkYi5pbnN0YW5jZXMuZmluZE9uZShpbnN0YW5jZUlkLCB7XG4gICAgZmllbGRzOiB7XG4gICAgICByZWxhdGVkX2luc3RhbmNlczogMVxuICAgIH1cbiAgfSkpICE9IG51bGwgPyByZWYucmVsYXRlZF9pbnN0YW5jZXMgOiB2b2lkIDA7XG4gIGlmIChyZWxhdGVkX2luc3RhbmNlX2lkcyAmJiBfLmlzQXJyYXkocmVsYXRlZF9pbnN0YW5jZV9pZHMpKSB7XG4gICAgcmV0dXJuIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IHJlbGF0ZWRfaW5zdGFuY2VfaWRzXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgbmFtZTogMSxcbiAgICAgICAgc3BhY2U6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG59KTtcbiIsImlmIE1ldGVvci5pc1NlcnZlclxuICAgIE1ldGVvci5wdWJsaXNoICdzcGFjZV91c2VyX3NpZ25zJywgKHNwYWNlSWQpIC0+XG4gICAgICAgIGNoZWNrIHNwYWNlSWQsIFN0cmluZ1xuXG4gICAgICAgIHVubGVzcyB0aGlzLnVzZXJJZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKVxuXG4gICAgICAgIHJldHVybiBkYi5zcGFjZV91c2VyX3NpZ25zLmZpbmQoeyBzcGFjZTogc3BhY2VJZCB9LCB7ZmllbGRzOiB7Y3JlYXRlZF9ieTogMCwgY3JlYXRlZDogMCwgbW9kaWZpZWRfYnk6IDB9fSlcbiIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLnB1Ymxpc2goJ3NwYWNlX3VzZXJfc2lnbnMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gICAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICAgIH1cbiAgICByZXR1cm4gZGIuc3BhY2VfdXNlcl9zaWducy5maW5kKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiIyMjXG5NZXRlb3IucHVibGlzaENvbXBvc2l0ZSBcInVzZXJfaW5ib3hfaW5zdGFuY2VcIiwgKCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0dXNlclNwYWNlSWRzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG5cdFx0dXNlcjogdGhpcy51c2VySWQsXG5cdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKS5nZXRFYWNoKFwic3BhY2VcIik7XG5cdHF1ZXJ5ID0ge3NwYWNlOiB7JGluOiB1c2VyU3BhY2VJZHN9fVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZmluZDogLT5cblx0XHRkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuXHRcdFx0ZmllbGRzOiB7XG5cdFx0XHRcdHNwYWNlOiAxLFxuXHRcdFx0XHRhcHBsaWNhbnRfbmFtZTogMSxcblx0XHRcdFx0ZmxvdzogMSxcblx0XHRcdFx0aW5ib3hfdXNlcnM6IDEsXG5cdFx0XHRcdGNjX3VzZXJzOiAxLFxuXHRcdFx0XHRzdGF0ZTogMSxcblx0XHRcdFx0bmFtZTogMSxcblx0XHRcdFx0bW9kaWZpZWQ6IDEsXG5cdFx0XHRcdGZvcm06IDFcblx0XHRcdH0sIHNvcnQ6IHttb2RpZmllZDogLTF9LCBza2lwOiAwLCBsaW1pdDogMjAwXG5cdFx0fSk7XG5cdGNoaWxkcmVuOiBbXG5cdFx0e1xuXHRcdFx0ZmluZDogKGluc3RhbmNlLCBwb3N0KS0+XG5cdFx0XHRcdGRiLmZsb3dzLmZpbmQoe19pZDogaW5zdGFuY2UuZmxvd30sIHtmaWVsZHM6IHtuYW1lOiAxLCBzcGFjZTogMX19KTtcblx0XHR9XG5cdF1cbiMjI1xuXG4jIyNcbk1ldGVvci5wdWJsaXNoICdteV9pbmJveF9pbnN0YW5jZXMnLCAoc3BhY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0I1x0dXNlclNwYWNlSWRzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG5cdCNcdFx0dXNlcjogdGhpcy51c2VySWQsXG5cdCNcdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHQjXHR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKS5nZXRFYWNoKFwic3BhY2VcIik7XG5cblx0cXVlcnkgPSB7c3BhY2U6IHNwYWNlSWR9XG5cblx0cXVlcnkuJG9yID0gW3tpbmJveF91c2VyczogdGhpcy51c2VySWR9LCB7Y2NfdXNlcnM6IHRoaXMudXNlcklkfV1cblxuXHRmaWVsZHMgPSB7XG5cdFx0c3BhY2U6IDEsXG4jXHRcdGFwcGxpY2FudF9uYW1lOiAxLFxuXHRcdGZsb3c6IDEsXG5cdFx0aW5ib3hfdXNlcnM6IDEsXG5cdFx0Y2NfdXNlcnM6IDEsXG5cdFx0c3RhdGU6IDEsXG4jXHRcdG5hbWU6IDEsXG4jXHRcdG1vZGlmaWVkOiAxLFxuXHRcdGZvcm06IDFcblx0fVxuXG5cdGhhbmRsZSA9IGRiLmluc3RhbmNlcy5maW5kKHF1ZXJ5LCB7c29ydDoge21vZGlmaWVkOiAtMX0sIHNraXA6IDAsIGxpbWl0OiA1MDB9KS5vYnNlcnZlQ2hhbmdlcyB7XG5cdFx0YWRkZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0c2VsZi5hZGRlZChcImluc3RhbmNlc1wiLCBpZCwgaW5zdGFuY2UpXG5cdFx0Y2hhbmdlZDogKGlkKS0+XG5cdFx0XHRpbnN0YW5jZSA9IGRiLmluc3RhbmNlcy5maW5kT25lKHtfaWQ6IGlkfSwge2ZpZWxkczogZmllbGRzfSlcblx0XHRcdHJldHVybiBpZiBub3QgaW5zdGFuY2Vcblx0XHRcdGluc3RhbmNlLmlzX2NjID0gaW5zdGFuY2UuY2NfdXNlcnM/LmluY2x1ZGVzKHNlbGYudXNlcklkKSB8fCBmYWxzZVxuXHRcdFx0ZGVsZXRlIGluc3RhbmNlLmNjX3VzZXJzXG5cdFx0XHRzZWxmLmNoYW5nZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKTtcblx0XHRyZW1vdmVkOiAoaWQpLT5cblx0XHRcdHNlbGYucmVtb3ZlZChcImluc3RhbmNlc1wiLCBpZCk7XG5cdH1cblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpXG4jIyNcblxuX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUgPSAoc3BhY2VJZCwgdXNlcklkLCBfaXRlbXMsIGNhbGxiYWNrKS0+XG5cdGRiLmluc3RhbmNlcy5yYXdDb2xsZWN0aW9uKCkuYWdncmVnYXRlKFtcblx0XHR7XG5cdFx0XHQkbWF0Y2g6IHtcblx0XHRcdFx0c3BhY2U6IHNwYWNlSWQsXG5cdFx0XHRcdCRvcjogW3tpbmJveF91c2VyczogdXNlcklkfSwge2NjX3VzZXJzOiB1c2VySWR9XVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0JGdyb3VwOiB7XG5cdFx0XHRcdF9pZDoge2Zsb3c6IFwiJGZsb3dcIiwgY2F0ZWdvcnk6IFwiJGNhdGVnb3J5XCJ9LCBjb3VudDogeyRzdW06IDF9XG5cdFx0XHR9XG5cdFx0fVxuXHRdKS50b0FycmF5IChlcnIsIGRhdGEpLT5cblx0XHRpZiBlcnJcblx0XHRcdHRocm93IG5ldyBFcnJvcihlcnIpXG5cblx0XHRkYXRhLmZvckVhY2ggKGRvYykgLT5cblx0XHRcdF9pdGVtcy5wdXNoIGRvY1xuXG5cdFx0aWYgY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKVxuXHRcdFx0Y2FsbGJhY2soKVxuXHRcdHJldHVyblxuXG5fYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSA9IE1ldGVvci53cmFwQXN5bmMoX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUpXG5cbk1ldGVvci5wdWJsaXNoICdteV9pbmJveF9mbG93X2luc3RhbmNlc19jb3VudCcsIChzcGFjZUlkKS0+XG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHNlbGYgPSB0aGlzO1xuXG5cdHF1ZXJ5ID0ge3NwYWNlOiBzcGFjZUlkfVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZGF0YSA9IFtdICAj5pWw5o2u5qC85byP77yaW3tfaWQ6Zmxvd0lkLCBjb3VudDog5b6F5Yqe5pWw6YePfSwge19pZDpmbG93SWQyLCBjb3VudDog5b6F5Yqe5pWw6YePMn1dXG5cdF9hc3luY19nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlKHNwYWNlSWQsIHNlbGYudXNlcklkLCBkYXRhKVxuXG5cdF9mbG93c0RhdGEgPSBbXVxuXG5cdF8uZWFjaCBkYXRhLCAoZGF0YUl0ZW0pLT5cblx0XHRfZmxvd3NEYXRhLnB1c2goe19pZDogZGF0YUl0ZW0uX2lkLmZsb3csIGNhdGVnb3J5OiBkYXRhSXRlbS5faWQuY2F0ZWdvcnksIGNvdW50OiBkYXRhSXRlbS5jb3VudH0pXG5cblx0c2VsZi5hZGRlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtmbG93czogX2Zsb3dzRGF0YX0pO1xuXG5cdF9jaGFuZ2VEYXRhID0gKGRvYywgYWN0aW9uKS0+XG5cdFx0Zmxvd19pbnN0YW5jZSA9IF8uZmluZCBfZmxvd3NEYXRhLCAoZiktPlxuXHRcdFx0cmV0dXJuIGYuX2lkID09IGRvYy5mbG93XG5cdFx0aWYgZmxvd19pbnN0YW5jZVxuXHRcdFx0aWYgYWN0aW9uID09IFwiYWRkZWRcIlxuXHRcdFx0XHRmbG93X2luc3RhbmNlLmNvdW50Kytcblx0XHRcdGVsc2UgaWYgYWN0aW9uID09IFwicmVtb3ZlZFwiXG5cdFx0XHRcdGZsb3dfaW5zdGFuY2UuY291bnQtLVxuXHRcdGVsc2UgaWYgYWN0aW9uID09IFwiYWRkZWRcIlxuXHRcdFx0X2Zsb3dzRGF0YS5wdXNoIHtfaWQ6IGRvYy5mbG93LCBjYXRlZ29yeTogZG9jLmNhdGVnb3J5LCBjb3VudDogMX1cblxuXHRcdHNlbGYuY2hhbmdlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtmbG93czogX2Zsb3dzRGF0YX0pO1xuXG5cdF9pbml0ID0gdHJ1ZVxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge2ZpZWxkczoge19pZDogMSwgaW5ib3hfdXNlcnM6IDEsIGNjX3VzZXJzOiAxLCBmbG93OiAxLCBjYXRlZ29yeTogMX19KS5vYnNlcnZlIHtcblx0XHRhZGRlZDogKGRvYyktPlxuXHRcdFx0aWYgIV9pbml0XG5cdFx0XHRcdF9jaGFuZ2VEYXRhKGRvYywgXCJhZGRlZFwiKVxuXHRcdHJlbW92ZWQ6IChkb2MpLT5cblx0XHRcdGlmICFfaW5pdFxuXHRcdFx0XHRfY2hhbmdlRGF0YShkb2MsIFwicmVtb3ZlZFwiKVxuXHR9XG5cdF9pbml0ID0gZmFsc2VcblxuXHRzZWxmLnJlYWR5KCk7XG5cdHNlbGYub25TdG9wICgpLT5cblx0XHRoYW5kbGUuc3RvcCgpIiwiXG4vKlxuTWV0ZW9yLnB1Ymxpc2hDb21wb3NpdGUgXCJ1c2VyX2luYm94X2luc3RhbmNlXCIsICgpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVzZXJTcGFjZUlkcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuXHRcdHVzZXI6IHRoaXMudXNlcklkLFxuXHRcdHVzZXJfYWNjZXB0ZWQ6IHRydWVcblx0fSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKCkuZ2V0RWFjaChcInNwYWNlXCIpO1xuXHRxdWVyeSA9IHtzcGFjZTogeyRpbjogdXNlclNwYWNlSWRzfX1cblxuXHRxdWVyeS4kb3IgPSBbe2luYm94X3VzZXJzOiB0aGlzLnVzZXJJZH0sIHtjY191c2VyczogdGhpcy51c2VySWR9XVxuXG5cdGZpbmQ6IC0+XG5cdFx0ZGIuaW5zdGFuY2VzLmZpbmQocXVlcnksIHtcblx0XHRcdGZpZWxkczoge1xuXHRcdFx0XHRzcGFjZTogMSxcblx0XHRcdFx0YXBwbGljYW50X25hbWU6IDEsXG5cdFx0XHRcdGZsb3c6IDEsXG5cdFx0XHRcdGluYm94X3VzZXJzOiAxLFxuXHRcdFx0XHRjY191c2VyczogMSxcblx0XHRcdFx0c3RhdGU6IDEsXG5cdFx0XHRcdG5hbWU6IDEsXG5cdFx0XHRcdG1vZGlmaWVkOiAxLFxuXHRcdFx0XHRmb3JtOiAxXG5cdFx0XHR9LCBzb3J0OiB7bW9kaWZpZWQ6IC0xfSwgc2tpcDogMCwgbGltaXQ6IDIwMFxuXHRcdH0pO1xuXHRjaGlsZHJlbjogW1xuXHRcdHtcblx0XHRcdGZpbmQ6IChpbnN0YW5jZSwgcG9zdCktPlxuXHRcdFx0XHRkYi5mbG93cy5maW5kKHtfaWQ6IGluc3RhbmNlLmZsb3d9LCB7ZmllbGRzOiB7bmFtZTogMSwgc3BhY2U6IDF9fSk7XG5cdFx0fVxuXHRdXG4gKi9cblxuLypcbk1ldGVvci5wdWJsaXNoICdteV9pbmJveF9pbnN0YW5jZXMnLCAoc3BhY2VJZCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0c2VsZiA9IHRoaXM7XG5cblx0ICpcdHVzZXJTcGFjZUlkcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuXHQgKlx0XHR1c2VyOiB0aGlzLnVzZXJJZCxcblx0ICpcdFx0dXNlcl9hY2NlcHRlZDogdHJ1ZVxuXHQgKlx0fSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKCkuZ2V0RWFjaChcInNwYWNlXCIpO1xuXG5cdHF1ZXJ5ID0ge3NwYWNlOiBzcGFjZUlkfVxuXG5cdHF1ZXJ5LiRvciA9IFt7aW5ib3hfdXNlcnM6IHRoaXMudXNlcklkfSwge2NjX3VzZXJzOiB0aGlzLnVzZXJJZH1dXG5cblx0ZmllbGRzID0ge1xuXHRcdHNwYWNlOiAxLFxuICpcdFx0YXBwbGljYW50X25hbWU6IDEsXG5cdFx0ZmxvdzogMSxcblx0XHRpbmJveF91c2VyczogMSxcblx0XHRjY191c2VyczogMSxcblx0XHRzdGF0ZTogMSxcbiAqXHRcdG5hbWU6IDEsXG4gKlx0XHRtb2RpZmllZDogMSxcblx0XHRmb3JtOiAxXG5cdH1cblxuXHRoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge3NvcnQ6IHttb2RpZmllZDogLTF9LCBza2lwOiAwLCBsaW1pdDogNTAwfSkub2JzZXJ2ZUNoYW5nZXMge1xuXHRcdGFkZGVkOiAoaWQpLT5cblx0XHRcdGluc3RhbmNlID0gZGIuaW5zdGFuY2VzLmZpbmRPbmUoe19pZDogaWR9LCB7ZmllbGRzOiBmaWVsZHN9KVxuXHRcdFx0cmV0dXJuIGlmIG5vdCBpbnN0YW5jZVxuXHRcdFx0aW5zdGFuY2UuaXNfY2MgPSBpbnN0YW5jZS5jY191c2Vycz8uaW5jbHVkZXMoc2VsZi51c2VySWQpIHx8IGZhbHNlXG5cdFx0XHRkZWxldGUgaW5zdGFuY2UuY2NfdXNlcnNcblx0XHRcdHNlbGYuYWRkZWQoXCJpbnN0YW5jZXNcIiwgaWQsIGluc3RhbmNlKVxuXHRcdGNoYW5nZWQ6IChpZCktPlxuXHRcdFx0aW5zdGFuY2UgPSBkYi5pbnN0YW5jZXMuZmluZE9uZSh7X2lkOiBpZH0sIHtmaWVsZHM6IGZpZWxkc30pXG5cdFx0XHRyZXR1cm4gaWYgbm90IGluc3RhbmNlXG5cdFx0XHRpbnN0YW5jZS5pc19jYyA9IGluc3RhbmNlLmNjX3VzZXJzPy5pbmNsdWRlcyhzZWxmLnVzZXJJZCkgfHwgZmFsc2Vcblx0XHRcdGRlbGV0ZSBpbnN0YW5jZS5jY191c2Vyc1xuXHRcdFx0c2VsZi5jaGFuZ2VkKFwiaW5zdGFuY2VzXCIsIGlkLCBpbnN0YW5jZSk7XG5cdFx0cmVtb3ZlZDogKGlkKS0+XG5cdFx0XHRzZWxmLnJlbW92ZWQoXCJpbnN0YW5jZXNcIiwgaWQpO1xuXHR9XG5cblx0c2VsZi5yZWFkeSgpO1xuXHRzZWxmLm9uU3RvcCAoKS0+XG5cdFx0aGFuZGxlLnN0b3AoKVxuICovXG52YXIgX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUsIF9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlO1xuXG5fZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZSA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCwgX2l0ZW1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gZGIuaW5zdGFuY2VzLnJhd0NvbGxlY3Rpb24oKS5hZ2dyZWdhdGUoW1xuICAgIHtcbiAgICAgICRtYXRjaDoge1xuICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgJG9yOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5ib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGNjX3VzZXJzOiB1c2VySWRcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICAkZ3JvdXA6IHtcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgZmxvdzogXCIkZmxvd1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcIiRjYXRlZ29yeVwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiB7XG4gICAgICAgICAgJHN1bTogMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBdKS50b0FycmF5KGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7XG4gICAgICByZXR1cm4gX2l0ZW1zLnB1c2goZG9jKTtcbiAgICB9KTtcbiAgICBpZiAoY2FsbGJhY2sgJiYgXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xufTtcblxuX2FzeW5jX2dldF9mbG93X2luc3RhbmNlc19hZ2dyZWdhdGUgPSBNZXRlb3Iud3JhcEFzeW5jKF9nZXRfZmxvd19pbnN0YW5jZXNfYWdncmVnYXRlKTtcblxuTWV0ZW9yLnB1Ymxpc2goJ215X2luYm94X2Zsb3dfaW5zdGFuY2VzX2NvdW50JywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICB2YXIgX2NoYW5nZURhdGEsIF9mbG93c0RhdGEsIF9pbml0LCBkYXRhLCBoYW5kbGUsIHF1ZXJ5LCBzZWxmO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgcXVlcnkgPSB7XG4gICAgc3BhY2U6IHNwYWNlSWRcbiAgfTtcbiAgcXVlcnkuJG9yID0gW1xuICAgIHtcbiAgICAgIGluYm94X3VzZXJzOiB0aGlzLnVzZXJJZFxuICAgIH0sIHtcbiAgICAgIGNjX3VzZXJzOiB0aGlzLnVzZXJJZFxuICAgIH1cbiAgXTtcbiAgZGF0YSA9IFtdO1xuICBfYXN5bmNfZ2V0X2Zsb3dfaW5zdGFuY2VzX2FnZ3JlZ2F0ZShzcGFjZUlkLCBzZWxmLnVzZXJJZCwgZGF0YSk7XG4gIF9mbG93c0RhdGEgPSBbXTtcbiAgXy5lYWNoKGRhdGEsIGZ1bmN0aW9uKGRhdGFJdGVtKSB7XG4gICAgcmV0dXJuIF9mbG93c0RhdGEucHVzaCh7XG4gICAgICBfaWQ6IGRhdGFJdGVtLl9pZC5mbG93LFxuICAgICAgY2F0ZWdvcnk6IGRhdGFJdGVtLl9pZC5jYXRlZ29yeSxcbiAgICAgIGNvdW50OiBkYXRhSXRlbS5jb3VudFxuICAgIH0pO1xuICB9KTtcbiAgc2VsZi5hZGRlZChcImZsb3dfaW5zdGFuY2VzXCIsIHNwYWNlSWQsIHtcbiAgICBmbG93czogX2Zsb3dzRGF0YVxuICB9KTtcbiAgX2NoYW5nZURhdGEgPSBmdW5jdGlvbihkb2MsIGFjdGlvbikge1xuICAgIHZhciBmbG93X2luc3RhbmNlO1xuICAgIGZsb3dfaW5zdGFuY2UgPSBfLmZpbmQoX2Zsb3dzRGF0YSwgZnVuY3Rpb24oZikge1xuICAgICAgcmV0dXJuIGYuX2lkID09PSBkb2MuZmxvdztcbiAgICB9KTtcbiAgICBpZiAoZmxvd19pbnN0YW5jZSkge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gXCJhZGRlZFwiKSB7XG4gICAgICAgIGZsb3dfaW5zdGFuY2UuY291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBcInJlbW92ZWRcIikge1xuICAgICAgICBmbG93X2luc3RhbmNlLmNvdW50LS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhY3Rpb24gPT09IFwiYWRkZWRcIikge1xuICAgICAgX2Zsb3dzRGF0YS5wdXNoKHtcbiAgICAgICAgX2lkOiBkb2MuZmxvdyxcbiAgICAgICAgY2F0ZWdvcnk6IGRvYy5jYXRlZ29yeSxcbiAgICAgICAgY291bnQ6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5jaGFuZ2VkKFwiZmxvd19pbnN0YW5jZXNcIiwgc3BhY2VJZCwge1xuICAgICAgZmxvd3M6IF9mbG93c0RhdGFcbiAgICB9KTtcbiAgfTtcbiAgX2luaXQgPSB0cnVlO1xuICBoYW5kbGUgPSBkYi5pbnN0YW5jZXMuZmluZChxdWVyeSwge1xuICAgIGZpZWxkczoge1xuICAgICAgX2lkOiAxLFxuICAgICAgaW5ib3hfdXNlcnM6IDEsXG4gICAgICBjY191c2VyczogMSxcbiAgICAgIGZsb3c6IDEsXG4gICAgICBjYXRlZ29yeTogMVxuICAgIH1cbiAgfSkub2JzZXJ2ZSh7XG4gICAgYWRkZWQ6IGZ1bmN0aW9uKGRvYykge1xuICAgICAgaWYgKCFfaW5pdCkge1xuICAgICAgICByZXR1cm4gX2NoYW5nZURhdGEoZG9jLCBcImFkZGVkXCIpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlZDogZnVuY3Rpb24oZG9jKSB7XG4gICAgICBpZiAoIV9pbml0KSB7XG4gICAgICAgIHJldHVybiBfY2hhbmdlRGF0YShkb2MsIFwicmVtb3ZlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBfaW5pdCA9IGZhbHNlO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaGFuZGxlLnN0b3AoKTtcbiAgfSk7XG59KTtcbiIsIlxuTWV0ZW9yLnB1Ymxpc2ggJ2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUnLCAoc3BhY2VJZCwgZmxvd0lkKS0+XG5cdGNoZWNrKHNwYWNlSWQsIFN0cmluZylcblx0Y2hlY2soZmxvd0lkLCBTdHJpbmcpXG5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBzcGFjZUlkICYmIGZsb3dJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdjbXNfZmlsZXMnKS5maW5kKHsgc3BhY2U6IHNwYWNlSWQsICdwYXJlbnQubyc6ICdmbG93cycsICdwYXJlbnQuaWRzJzogZmxvd0lkLCAgbmFtZTogJ+ato+aWhy5kb2N4JyB9KVxuIiwiTWV0ZW9yLnB1Ymxpc2goJ2Zsb3dfbWFpbl9hdHRhY2hfdGVtcGxhdGUnLCBmdW5jdGlvbihzcGFjZUlkLCBmbG93SWQpIHtcbiAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgY2hlY2soZmxvd0lkLCBTdHJpbmcpO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIShzcGFjZUlkICYmIGZsb3dJZCkpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Ntc19maWxlcycpLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICdwYXJlbnQubyc6ICdmbG93cycsXG4gICAgJ3BhcmVudC5pZHMnOiBmbG93SWQsXG4gICAgbmFtZTogJ+ato+aWhy5kb2N4J1xuICB9KTtcbn0pO1xuIiwid29ya2Zsb3dUZW1wbGF0ZSA9IHt9XG5cbiPlj6/nlKjmraTohJrmnKzku47mqKHmnb/lt6XkvZzljLrlgZrmibnph4/lr7zlh7rvvJpcbiPkvb/nlKjnrqHnkIblkZjotKbmiLfnmbvlvZXlkI7vvIzov5vlhaVGbG93TW9kdWxlc++8jOWcqOaOp+WItuWPsOaJp+ihjOS7peS4i+iEmuacrOWNs+WPr1xuI2RiLmZvcm1zLmZpbmQoe3N0YXRlOlwiZW5hYmxlZFwifSkuZm9yRWFjaChmdW5jdGlvbihmb3JtKXt3aW5kb3cub3BlbihNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcGkvd29ya2Zsb3cvZXhwb3J0L2Zvcm0/Zm9ybT1cIitmb3JtLl9pZCkpfSlcbndvcmtmbG93VGVtcGxhdGVbXCJlblwiXSA9W11cblxuI+WPr+eUqOatpOiEmuacrOS7juaooeadv+W3peS9nOWMuuWBmuaJuemHj+WvvOWHuu+8mlxuI+S9v+eUqOeuoeeQhuWRmOi0puaIt+eZu+W9leWQju+8jOi/m+WFpeaooeadv+S4k+WMuu+8jOWcqOaOp+WItuWPsOaJp+ihjOS7peS4i+iEmuacrOWNs+WPr1xuI2RiLmZvcm1zLmZpbmQoe3N0YXRlOlwiZW5hYmxlZFwifSkuZm9yRWFjaChmdW5jdGlvbihmb3JtKXt3aW5kb3cub3BlbihNZXRlb3IuYWJzb2x1dGVVcmwoXCJhcGkvd29ya2Zsb3cvZXhwb3J0L2Zvcm0/Zm9ybT1cIitmb3JtLl9pZCkpfSlcbndvcmtmbG93VGVtcGxhdGVbXCJ6aC1DTlwiXSA9W11cblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRmcyA9IHJlcXVpcmUoJ2ZzJylcblx0cGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXHRtaW1lID0gcmVxdWlyZSgnbWltZScpXG5cdHJlYWRGaWxlTGlzdCA9IChwYXRoRGlyLCBmaWxlc0xpc3QpLT5cblx0XHRmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGhEaXIpXG5cdFx0ZmlsZXMuZm9yRWFjaCAobmFtZSwgaW5kZXgpLT5cblx0XHRcdHN0YXQgPSBmcy5zdGF0U3luYyhwYXRoLmpvaW4ocGF0aERpciwgbmFtZSkpXG5cdFx0XHRpZiBzdGF0LmlzRGlyZWN0b3J5KClcblx0XHRcdFx0IyDpgJLlvZLor7vlj5bmlofku7Zcblx0XHRcdFx0cmVhZEZpbGVMaXN0KHBhdGguam9pbihwYXRoRGlyLCBuYW1lKSwgZmlsZXNMaXN0KVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRvYmogPSB7fVxuXHRcdFx0XHRvYmoucGF0aCA9IHBhdGhEaXJcblx0XHRcdFx0b2JqLm5hbWUgPSBuYW1lXG5cdFx0XHRcdGZpbGVzTGlzdC5wdXNoKG9iailcblxuXHQj6I635Y+WemgtY27mlofku7blpLnkuIvnmoTmiYDmnInmlofku7Zcblx0ZmlsZXNMaXN0X2NuID0gW11cblx0cGF0aF9jbiA9IE1ldGVvci5zZXR0aW5ncy53b3JrZmxvd1RlbXBsYXRlcz8ucGF0aF9jblxuXHRpZiBwYXRoX2NuXG5cdFx0YWJzb2x1dGVfcGF0aF9jbiA9IHBhdGgucmVzb2x2ZShwYXRoX2NuKVxuXHRcdGNvbnNvbGUubG9nIFwiYWJzb2x1dGVfcGF0aF9jblwiLCBhYnNvbHV0ZV9wYXRoX2NuXG5cdFx0aWYgZnMuZXhpc3RzU3luYyhhYnNvbHV0ZV9wYXRoX2NuKVxuXHRcdFx0cmVhZEZpbGVMaXN0KGFic29sdXRlX3BhdGhfY24sIGZpbGVzTGlzdF9jbilcblx0XHRcdGZpbGVzTGlzdF9jbi5mb3JFYWNoIChmaWxlKS0+XG5cdFx0XHRcdHRyeVxuXHRcdFx0XHRcdGlmIG1pbWUuZ2V0VHlwZShmaWxlLm5hbWUpIGlzIFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0XHRcdFx0XHRkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSksICd1dGY4Jylcblx0XHRcdFx0XHRcdHdvcmtmbG93VGVtcGxhdGVbXCJ6aC1DTlwiXS5wdXNoKEpTT04ucGFyc2UoZGF0YSkpXG5cdFx0XHRcdGNhdGNoIGVcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwi6I635Y+WemgtY27mlofku7blpLnkuIvnmoTmiYDmnInmlofku7ZcIiwgcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKVxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXG5cdCPojrflj5Zlbi11c+aWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlxuXHRmaWxlc0xpc3RfdXMgPSBbXVxuXHRwYXRoX3VzID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzPy5wYXRoX3VzXG5cdGlmIHBhdGhfdXNcblx0XHRhYnNvbHV0ZV9wYXRoX3VzID0gcGF0aC5yZXNvbHZlKHBhdGhfdXMpXG5cdFx0Y29uc29sZS5sb2cgXCJhYnNvbHV0ZV9wYXRoX3VzXCIsIGFic29sdXRlX3BhdGhfdXNcblx0XHRpZiBmcy5leGlzdHNTeW5jKGFic29sdXRlX3BhdGhfdXMpXG5cdFx0XHRyZWFkRmlsZUxpc3QoYWJzb2x1dGVfcGF0aF91cywgZmlsZXNMaXN0X3VzKVxuXHRcdFx0ZmlsZXNMaXN0X3VzLmZvckVhY2ggKGZpbGUpLT5cblx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0aWYgbWltZS5nZXRUeXBlKGZpbGUubmFtZSkgaXMgXCJhcHBsaWNhdGlvbi9qc29uXCJcblx0XHRcdFx0XHRcdGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSwgJ3V0ZjgnKVxuXHRcdFx0XHRcdFx0d29ya2Zsb3dUZW1wbGF0ZVtcImVuXCJdLnB1c2goSlNPTi5wYXJzZShkYXRhKSlcblx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCLojrflj5Zlbi11c+aWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlwiLCBwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cdFx0XHRcdFxuXHRcdFx0XHRcdFxuXG5cbiIsIiAgICAgICAgICAgICAgICAgICAgIFxuXG53b3JrZmxvd1RlbXBsYXRlID0ge307XG5cbndvcmtmbG93VGVtcGxhdGVbXCJlblwiXSA9IFtdO1xuXG53b3JrZmxvd1RlbXBsYXRlW1wiemgtQ05cIl0gPSBbXTtcblxuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHZhciBhYnNvbHV0ZV9wYXRoX2NuLCBhYnNvbHV0ZV9wYXRoX3VzLCBmaWxlc0xpc3RfY24sIGZpbGVzTGlzdF91cywgZnMsIG1pbWUsIHBhdGgsIHBhdGhfY24sIHBhdGhfdXMsIHJlYWRGaWxlTGlzdCwgcmVmLCByZWYxO1xuICBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4gIG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG4gIHJlYWRGaWxlTGlzdCA9IGZ1bmN0aW9uKHBhdGhEaXIsIGZpbGVzTGlzdCkge1xuICAgIHZhciBmaWxlcztcbiAgICBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHBhdGhEaXIpO1xuICAgIHJldHVybiBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgb2JqLCBzdGF0O1xuICAgICAgc3RhdCA9IGZzLnN0YXRTeW5jKHBhdGguam9pbihwYXRoRGlyLCBuYW1lKSk7XG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJldHVybiByZWFkRmlsZUxpc3QocGF0aC5qb2luKHBhdGhEaXIsIG5hbWUpLCBmaWxlc0xpc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIG9iai5wYXRoID0gcGF0aERpcjtcbiAgICAgICAgb2JqLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gZmlsZXNMaXN0LnB1c2gob2JqKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgZmlsZXNMaXN0X2NuID0gW107XG4gIHBhdGhfY24gPSAocmVmID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzKSAhPSBudWxsID8gcmVmLnBhdGhfY24gOiB2b2lkIDA7XG4gIGlmIChwYXRoX2NuKSB7XG4gICAgYWJzb2x1dGVfcGF0aF9jbiA9IHBhdGgucmVzb2x2ZShwYXRoX2NuKTtcbiAgICBjb25zb2xlLmxvZyhcImFic29sdXRlX3BhdGhfY25cIiwgYWJzb2x1dGVfcGF0aF9jbik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYWJzb2x1dGVfcGF0aF9jbikpIHtcbiAgICAgIHJlYWRGaWxlTGlzdChhYnNvbHV0ZV9wYXRoX2NuLCBmaWxlc0xpc3RfY24pO1xuICAgICAgZmlsZXNMaXN0X2NuLmZvckVhY2goZnVuY3Rpb24oZmlsZSkge1xuICAgICAgICB2YXIgZGF0YSwgZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobWltZS5nZXRUeXBlKGZpbGUubmFtZSkgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSB7XG4gICAgICAgICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihmaWxlLnBhdGgsIGZpbGUubmFtZSksICd1dGY4Jyk7XG4gICAgICAgICAgICByZXR1cm4gd29ya2Zsb3dUZW1wbGF0ZVtcInpoLUNOXCJdLnB1c2goSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6I635Y+WemgtY27mlofku7blpLnkuIvnmoTmiYDmnInmlofku7ZcIiwgcGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSk7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBmaWxlc0xpc3RfdXMgPSBbXTtcbiAgcGF0aF91cyA9IChyZWYxID0gTWV0ZW9yLnNldHRpbmdzLndvcmtmbG93VGVtcGxhdGVzKSAhPSBudWxsID8gcmVmMS5wYXRoX3VzIDogdm9pZCAwO1xuICBpZiAocGF0aF91cykge1xuICAgIGFic29sdXRlX3BhdGhfdXMgPSBwYXRoLnJlc29sdmUocGF0aF91cyk7XG4gICAgY29uc29sZS5sb2coXCJhYnNvbHV0ZV9wYXRoX3VzXCIsIGFic29sdXRlX3BhdGhfdXMpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGFic29sdXRlX3BhdGhfdXMpKSB7XG4gICAgICByZWFkRmlsZUxpc3QoYWJzb2x1dGVfcGF0aF91cywgZmlsZXNMaXN0X3VzKTtcbiAgICAgIHJldHVybiBmaWxlc0xpc3RfdXMuZm9yRWFjaChmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHZhciBkYXRhLCBlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtaW1lLmdldFR5cGUoZmlsZS5uYW1lKSA9PT0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIHtcbiAgICAgICAgICAgIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGZpbGUucGF0aCwgZmlsZS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIHJldHVybiB3b3JrZmxvd1RlbXBsYXRlW1wiZW5cIl0ucHVzaChKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCLojrflj5Zlbi11c+aWh+S7tuWkueS4i+eahOaJgOacieaWh+S7tlwiLCBwYXRoLmpvaW4oZmlsZS5wYXRoLCBmaWxlLm5hbWUpKTtcbiAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59KTtcbiIsIiMjI1xuKiAgICAqICAgICogICAgKiAgICAqICAgICpcbuKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIHxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSUIGRheSBvZiB3ZWVrICgwIC0gNykgKDAgb3IgNyBpcyBTdW4pXG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSAIG1vbnRoICgxIC0gMTIpXG7ilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgZGF5IG9mIG1vbnRoICgxIC0gMzEpXG7ilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBob3VyICgwIC0gMjMpXG7ilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIG1pbnV0ZSAoMCAtIDU5KVxu4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHNlY29uZCAoMCAtIDU5LCBPUFRJT05BTClcbiMjI1xuTWV0ZW9yLnN0YXJ0dXAgLT5cblx0aWYgTWV0ZW9yLnNldHRpbmdzLmNyb24/LmF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvblxuXHRcdHNjaGVkdWxlID0gcmVxdWlyZSgnbm9kZS1zY2hlZHVsZScpXG5cdFx0IyDlrprml7bmiafooYzlkIzmraVcblx0XHRydWxlID0gTWV0ZW9yLnNldHRpbmdzLmNyb24uYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uXG5cdFx0Z29fbmV4dCA9IHRydWVcblx0XHRzY2hlZHVsZS5zY2hlZHVsZUpvYiBydWxlLCBNZXRlb3IuYmluZEVudmlyb25tZW50ICgpLT5cblx0XHRcdHRyeVxuXHRcdFx0XHRpZiAhZ29fbmV4dFxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRnb19uZXh0ID0gZmFsc2Vcblx0XHRcdFx0Y29uc29sZS50aW1lICdhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24nXG5cblx0XHRcdFx0bm93ID0gbmV3IERhdGVcblxuXHRcdFx0XHQjIOWwhuWnlOaJmOinhOWImeiuvue9ruS4uuS4jeWPr+eUqFxuXHRcdFx0XHRkYi5wcm9jZXNzX2RlbGVnYXRpb25fcnVsZXMudXBkYXRlKHsgZW5hYmxlZDogdHJ1ZSwgZW5kX3RpbWU6IHsgJGx0ZTogbm93IH0gfSwgeyAkc2V0OiB7IGVuYWJsZWQ6IGZhbHNlIH0gfSwgeyBtdWx0aSA6dHJ1ZSB9KVxuXG5cdFx0XHRcdGNvbnNvbGUudGltZUVuZCAnYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uJ1xuXHRcdFx0XHRnb19uZXh0ID0gdHJ1ZVxuXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJBVVRPIEFVVE9fRklOSVNIX1BST0NFU1NfREVMRUdBVElPTiBFUlJPUjogXCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cdFx0XHRcdGdvX25leHQgPSB0cnVlXG5cblx0XHQsIChlKS0+XG5cdFx0XHRjb25zb2xlLmxvZyAnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IGF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbi5jb2ZmZWUnXG5cdFx0XHRjb25zb2xlLmxvZyBlLnN0YWNrXG4iLCJcbi8qXG4qICAgICogICAgKiAgICAqICAgICogICAgKlxu4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKxcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAgfFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJQgZGF5IG9mIHdlZWsgKDAgLSA3KSAoMCBvciA3IGlzIFN1bilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIAgbW9udGggKDEgLSAxMilcbuKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBkYXkgb2YgbW9udGggKDEgLSAzMSlcbuKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGhvdXIgKDAgLSAyMylcbuKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgbWludXRlICgwIC0gNTkpXG7ilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2Vjb25kICgwIC0gNTksIE9QVElPTkFMKVxuICovXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdmFyIGdvX25leHQsIHJlZiwgcnVsZSwgc2NoZWR1bGU7XG4gIGlmICgocmVmID0gTWV0ZW9yLnNldHRpbmdzLmNyb24pICE9IG51bGwgPyByZWYuYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uIDogdm9pZCAwKSB7XG4gICAgc2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJyk7XG4gICAgcnVsZSA9IE1ldGVvci5zZXR0aW5ncy5jcm9uLmF1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbjtcbiAgICBnb19uZXh0ID0gdHJ1ZTtcbiAgICByZXR1cm4gc2NoZWR1bGUuc2NoZWR1bGVKb2IocnVsZSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlLCBub3c7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWdvX25leHQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ29fbmV4dCA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2F1dG9fZmluaXNoX3Byb2Nlc3NfZGVsZWdhdGlvbicpO1xuICAgICAgICBub3cgPSBuZXcgRGF0ZTtcbiAgICAgICAgZGIucHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzLnVwZGF0ZSh7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBlbmRfdGltZToge1xuICAgICAgICAgICAgJGx0ZTogbm93XG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdhdXRvX2ZpbmlzaF9wcm9jZXNzX2RlbGVnYXRpb24nKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQVVUTyBBVVRPX0ZJTklTSF9QUk9DRVNTX0RFTEVHQVRJT04gRVJST1I6IFwiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogYXV0b19maW5pc2hfcHJvY2Vzc19kZWxlZ2F0aW9uLmNvZmZlZScpO1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKGUuc3RhY2spO1xuICAgIH0pKTtcbiAgfVxufSk7XG4iLCIjIyNcbiogICAgKiAgICAqICAgICogICAgKiAgICAqXG7ilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICB8XG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlCBkYXkgb2Ygd2VlayAoMCAtIDcpICgwIG9yIDcgaXMgU3VuKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgCBtb250aCAoMSAtIDEyKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGRheSBvZiBtb250aCAoMSAtIDMxKVxu4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgaG91ciAoMCAtIDIzKVxu4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBtaW51dGUgKDAgLSA1OSlcbuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBzZWNvbmQgKDAgLSA1OSwgT1BUSU9OQUwpXG4jIyNcbk1ldGVvci5zdGFydHVwIC0+XG5cdGlmIE1ldGVvci5zZXR0aW5ncy5jcm9uPy50aW1lb3V0X2F1dG9fc3VibWl0XG5cdFx0c2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJylcblx0XHQjIOWumuaXtuaJp+ihjOWQjOatpVxuXHRcdHJ1bGUgPSBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi50aW1lb3V0X2F1dG9fc3VibWl0XG5cdFx0Z29fbmV4dCA9IHRydWVcblx0XHRzY2hlZHVsZS5zY2hlZHVsZUpvYiBydWxlLCBNZXRlb3IuYmluZEVudmlyb25tZW50ICgpLT5cblx0XHRcdHRyeVxuXHRcdFx0XHRpZiAhZ29fbmV4dFxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRnb19uZXh0ID0gZmFsc2Vcblx0XHRcdFx0Y29uc29sZS50aW1lICd0aW1lb3V0X2F1dG9fc3VibWl0J1xuXG5cdFx0XHRcdHV1Zmxvd01hbmFnZXIudGltZW91dEF1dG9TdWJtaXQoKVxuXG5cdFx0XHRcdGNvbnNvbGUudGltZUVuZCAndGltZW91dF9hdXRvX3N1Ym1pdCdcblx0XHRcdFx0Z29fbmV4dCA9IHRydWVcblxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRjb25zb2xlLmVycm9yIFwiQVVUTyBUSU1FT1VUX0FVVE9fU1VCTUlUIEVSUk9SOiBcIlxuXHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblx0XHRcdFx0Z29fbmV4dCA9IHRydWVcblxuXHRcdCwgKGUpLT5cblx0XHRcdGNvbnNvbGUubG9nICdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUnXG5cdFx0XHRjb25zb2xlLmxvZyBlLnN0YWNrXG5cbk1ldGVvci5tZXRob2RzXG5cdHRpbWVvdXRfYXV0b19zdWJtaXQ6IChpbnNfaWQpLT5cblx0XHR1dWZsb3dNYW5hZ2VyLnRpbWVvdXRBdXRvU3VibWl0KGluc19pZClcblx0XHRyZXR1cm4gdHJ1ZVxuXG5cbiIsIlxuLypcbiogICAgKiAgICAqICAgICogICAgKiAgICAqXG7ilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrFxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICB8XG7ilIIgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlCBkYXkgb2Ygd2VlayAoMCAtIDcpICgwIG9yIDcgaXMgU3VuKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgCBtb250aCAoMSAtIDEyKVxu4pSCICAgIOKUgiAgICDilIIgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIGRheSBvZiBtb250aCAoMSAtIDMxKVxu4pSCICAgIOKUgiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgaG91ciAoMCAtIDIzKVxu4pSCICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBtaW51dGUgKDAgLSA1OSlcbuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBzZWNvbmQgKDAgLSA1OSwgT1BUSU9OQUwpXG4gKi9cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICB2YXIgZ29fbmV4dCwgcmVmLCBydWxlLCBzY2hlZHVsZTtcbiAgaWYgKChyZWYgPSBNZXRlb3Iuc2V0dGluZ3MuY3JvbikgIT0gbnVsbCA/IHJlZi50aW1lb3V0X2F1dG9fc3VibWl0IDogdm9pZCAwKSB7XG4gICAgc2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJyk7XG4gICAgcnVsZSA9IE1ldGVvci5zZXR0aW5ncy5jcm9uLnRpbWVvdXRfYXV0b19zdWJtaXQ7XG4gICAgZ29fbmV4dCA9IHRydWU7XG4gICAgcmV0dXJuIHNjaGVkdWxlLnNjaGVkdWxlSm9iKHJ1bGUsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZ29fbmV4dCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnb19uZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUudGltZSgndGltZW91dF9hdXRvX3N1Ym1pdCcpO1xuICAgICAgICB1dWZsb3dNYW5hZ2VyLnRpbWVvdXRBdXRvU3VibWl0KCk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgndGltZW91dF9hdXRvX3N1Ym1pdCcpO1xuICAgICAgICByZXR1cm4gZ29fbmV4dCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBVVRPIFRJTUVPVVRfQVVUT19TVUJNSVQgRVJST1I6IFwiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIGdvX25leHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogdGltZW91dF9hdXRvX3N1Ym1pdC5jb2ZmZWUnKTtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZyhlLnN0YWNrKTtcbiAgICB9KSk7XG4gIH1cbn0pO1xuXG5NZXRlb3IubWV0aG9kcyh7XG4gIHRpbWVvdXRfYXV0b19zdWJtaXQ6IGZ1bmN0aW9uKGluc19pZCkge1xuICAgIHV1Zmxvd01hbmFnZXIudGltZW91dEF1dG9TdWJtaXQoaW5zX2lkKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdFRhYnVsYXJUYWJsZXMucmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhciA9IG5ldyBUYWJ1bGFyLlRhYmxlXG5cdFx0bmFtZTogXCJyZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyXCJcblx0XHRjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZXNcblx0XHRjb2x1bW5zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiX2lkXCIsXG5cdFx0XHRcdHRpdGxlOiAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJyZXZlcnNlXCIgaWQ9XCJyZXZlcnNlXCI+Jyxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0d2lkdGg6ICcxcHgnLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpbnB1dCA9ICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJyZWxhdGVkLWluc3RhbmNlcy1saXN0LWNoZWNrYm94XCIgbmFtZT1cInJlbGF0ZWRfaW5zdGFuY2VzX2lkc1wiIGlkPVwicmVsYXRlZF9pbnN0YW5jZXNfaWRzXCIgdmFsdWU9XCInICsgZG9jLl9pZCArICdcIidcblxuXHRcdFx0XHRcdGlmIFRhYnVsYXJUYWJsZXMucmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhci5yZWxhdGVkX2luc3RhbmNlcz8uaW5jbHVkZXMoZG9jLl9pZClcblx0XHRcdFx0XHRcdGlucHV0ICs9IFwiIGNoZWNrZWQgXCJcblxuXHRcdFx0XHRcdGlucHV0ICs9IFwiPlwiXG5cdFx0XHRcdFx0cmV0dXJuIGlucHV0XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm5hbWVcIixcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0d2lkdGg6ICc0NSUnLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRocmVmID0gJyc7XG5cdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSlcblx0XHRcdFx0XHRcdGhyZWYgPSAnJ1xuXG5cdFx0XHRcdFx0YWJzb2x1dGUgPSBmYWxzZVxuXG5cdFx0XHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdFx0XHRhYnNvbHV0ZSA9IHRoaXMuYWJzb2x1dGVcblx0XHRcdFx0XHRpZiBhYnNvbHV0ZVxuXHRcdFx0XHRcdFx0aHJlZiA9IE1ldGVvci5hYnNvbHV0ZVVybChcIndvcmtmbG93L3NwYWNlL1wiK2RvYy5zcGFjZStcIi92aWV3L3JlYWRvbmx5L1wiICsgZG9jLl9pZCArICc/aGlkZV90cmFjZXM9MCcpXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aHJlZiA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIitkb2Muc3BhY2UrXCIvdmlldy9yZWFkb25seS9cIiArIGRvYy5faWQgKyAnP2hpZGVfdHJhY2VzPTAnKVxuXHRcdFx0XHRcdHJldHVybiBcIjxhIGRhdGEtaWQ9JyN7ZG9jLl9pZH0nIHRhcmdldD0nX2JsYW5rJyBocmVmPSdcIitocmVmK1wiJz5cIiArIGRvYy5uYW1lICsgXCI8L2E+XCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiZmxvd19uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiY3VycmVudF9zdGVwX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN0YXRlID09IFwiY29tcGxldGVkXCJcblx0XHRcdFx0XHRcdGp1ZGdlID0gZG9jLmZpbmFsX2RlY2lzaW9uIHx8IFwiYXBwcm92ZWRcIlxuXG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWUgPSBkb2MuY3VycmVudF9zdGVwX25hbWUgfHwgJydcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXAtY3VycmVudC1zdGF0ZSAje2p1ZGdlfVwiPiN7c3RlcF9jdXJyZW50X25hbWV9PC9kaXY+XG5cdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdH1cblx0XHRdXG5cblx0XHRkb206IFwidHBcIixcblx0XHRsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuXHRcdGV4dHJhRmllbGRzOiBbXCJzdGF0ZVwiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwic3BhY2VcIiwgXCJrZXl3b3Jkc1wiXSxcblx0XHRwYWdlTGVuZ3RoOiAxMCxcblx0XHRpbmZvOiBmYWxzZSxcblx0XHRzZWFyY2hpbmc6IHRydWUsXG5cdFx0cmVzcG9uc2l2ZTpcblx0XHRcdGRldGFpbHM6IGZhbHNlXG5cdFx0YXV0b1dpZHRoOiBmYWxzZSxcblx0XHRjaGFuZ2VTZWxlY3RvcjogKHNlbGVjdG9yLCB1c2VySWQpIC0+XG5cdFx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblxuXHRcdFx0c3BhY2VJZCA9IHNlbGVjdG9yLnNwYWNlXG5cdFx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0XHRpZiBzZWxlY3Rvcj8uJGFuZD8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdHNwYWNlSWQgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2VJZFxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlSWQpXG5cdFx0XHRpZiAhc3BhY2Vcblx0XHRcdFx0c2VsZWN0b3Iuc3RhdGUgPSBcIm5vbmVcIlxuXHRcdFx0aWYgIXNwYWNlLmFkbWlucy5pbmNsdWRlcyh1c2VySWQpXG5cblx0XHRcdFx0Zmxvd19pZHMgPSBbXVxuXHRcdFx0XHRjdXJTcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcblx0XHRcdFx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRcdFx0XHQndXNlcic6IHVzZXJJZFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRpZiBjdXJTcGFjZVVzZXJcblx0XHRcdFx0XHRvcmdhbml6YXRpb25zID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcblx0XHRcdFx0XHRcdF9pZDoge1xuXHRcdFx0XHRcdFx0XHQkaW46IGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkuZmV0Y2goKVxuXHRcdFx0XHRcdGZsb3dzID0gZGIuZmxvd3MuZmluZCh7IHNwYWNlOiBzcGFjZUlkIH0pXG5cdFx0XHRcdFx0Zmxvd3MuZm9yRWFjaCAoZmwpLT5cblx0XHRcdFx0XHRcdGlmIFdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGZsLCBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMpIHx8IFdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmbCwgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zKVxuXHRcdFx0XHRcdFx0XHRmbG93X2lkcy5wdXNoKGZsLl9pZClcblxuXHRcdFx0XHRpZiBzZWxlY3Rvcj8uJGFuZD8ubGVuZ3RoID4gMFxuXHRcdFx0XHRcdHNlbGVjdG9yLiRhbmRbMF0uJG9yID0gW3tzdWJtaXR0ZXI6IHVzZXJJZH0sIHthcHBsaWNhbnQ6IHVzZXJJZH0sIHtpbmJveF91c2VyczogdXNlcklkfSwge291dGJveF91c2VyczogdXNlcklkfSxcblx0XHRcdFx0XHRcdFx0e2NjX3VzZXJzOiB1c2VySWR9LCB7IGZsb3c6IHsgJGluOiBmbG93X2lkcyB9IH1dXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRfLmV4dGVuZCBzZWxlY3Rvciwge1xuXHRcdFx0XHRcdFx0JG9yOiBbe3N1Ym1pdHRlcjogdXNlcklkfSwge2FwcGxpY2FudDogdXNlcklkfSwge2luYm94X3VzZXJzOiB1c2VySWR9LCB7b3V0Ym94X3VzZXJzOiB1c2VySWR9LFxuXHRcdFx0XHRcdFx0XHR7Y2NfdXNlcnM6IHVzZXJJZH0sIHsgZmxvdzogeyAkaW46IGZsb3dfaWRzIH0gfV1cblx0XHRcdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZWxlY3RvciIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gVGFidWxhclRhYmxlcy5yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyID0gbmV3IFRhYnVsYXIuVGFibGUoe1xuICAgIG5hbWU6IFwicmVsYXRlZF9pbnN0YW5jZXNfdGFidWxhclwiLFxuICAgIGNvbGxlY3Rpb246IGRiLmluc3RhbmNlcyxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIGRhdGE6IFwiX2lkXCIsXG4gICAgICAgIHRpdGxlOiAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJyZXZlcnNlXCIgaWQ9XCJyZXZlcnNlXCI+JyxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd2lkdGg6ICcxcHgnLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGlucHV0LCByZWY7XG4gICAgICAgICAgaW5wdXQgPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwicmVsYXRlZC1pbnN0YW5jZXMtbGlzdC1jaGVja2JveFwiIG5hbWU9XCJyZWxhdGVkX2luc3RhbmNlc19pZHNcIiBpZD1cInJlbGF0ZWRfaW5zdGFuY2VzX2lkc1wiIHZhbHVlPVwiJyArIGRvYy5faWQgKyAnXCInO1xuICAgICAgICAgIGlmICgocmVmID0gVGFidWxhclRhYmxlcy5yZWxhdGVkX2luc3RhbmNlc190YWJ1bGFyLnJlbGF0ZWRfaW5zdGFuY2VzKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKGRvYy5faWQpIDogdm9pZCAwKSB7XG4gICAgICAgICAgICBpbnB1dCArPSBcIiBjaGVja2VkIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnB1dCArPSBcIj5cIjtcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJuYW1lXCIsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdpZHRoOiAnNDUlJyxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhYnNvbHV0ZSwgaHJlZjtcbiAgICAgICAgICBocmVmID0gJyc7XG4gICAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpKSB7XG4gICAgICAgICAgICBocmVmID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFic29sdXRlID0gZmFsc2U7XG4gICAgICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICAgICAgYWJzb2x1dGUgPSB0aGlzLmFic29sdXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIGhyZWYgPSBNZXRlb3IuYWJzb2x1dGVVcmwoXCJ3b3JrZmxvdy9zcGFjZS9cIiArIGRvYy5zcGFjZSArIFwiL3ZpZXcvcmVhZG9ubHkvXCIgKyBkb2MuX2lkICsgJz9oaWRlX3RyYWNlcz0wJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhyZWYgPSBTdGVlZG9zLmFic29sdXRlVXJsKFwid29ya2Zsb3cvc3BhY2UvXCIgKyBkb2Muc3BhY2UgKyBcIi92aWV3L3JlYWRvbmx5L1wiICsgZG9jLl9pZCArICc/aGlkZV90cmFjZXM9MCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKFwiPGEgZGF0YS1pZD0nXCIgKyBkb2MuX2lkICsgXCInIHRhcmdldD0nX2JsYW5rJyBocmVmPSdcIikgKyBocmVmICsgXCInPlwiICsgZG9jLm5hbWUgKyBcIjwvYT5cIjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmxvd19uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJjdXJyZW50X3N0ZXBfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGp1ZGdlLCBzdGVwX2N1cnJlbnRfbmFtZTtcbiAgICAgICAgICBpZiAoZG9jLnN0YXRlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBqdWRnZSA9IGRvYy5maW5hbF9kZWNpc2lvbiB8fCBcImFwcHJvdmVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lID0gZG9jLmN1cnJlbnRfc3RlcF9uYW1lIHx8ICcnO1xuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInN0ZXAtY3VycmVudC1zdGF0ZSBcIiArIGp1ZGdlICsgXCJcXFwiPlwiICsgc3RlcF9jdXJyZW50X25hbWUgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgXSxcbiAgICBkb206IFwidHBcIixcbiAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgIGV4dHJhRmllbGRzOiBbXCJzdGF0ZVwiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwic3BhY2VcIiwgXCJrZXl3b3Jkc1wiXSxcbiAgICBwYWdlTGVuZ3RoOiAxMCxcbiAgICBpbmZvOiBmYWxzZSxcbiAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgcmVzcG9uc2l2ZToge1xuICAgICAgZGV0YWlsczogZmFsc2VcbiAgICB9LFxuICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgY2hhbmdlU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1c2VySWQpIHtcbiAgICAgIHZhciBjdXJTcGFjZVVzZXIsIGZsb3dfaWRzLCBmbG93cywgb3JnYW5pemF0aW9ucywgcmVmLCByZWYxLCBzcGFjZSwgc3BhY2VJZDtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2VJZCA9IHNlbGVjdG9yLnNwYWNlO1xuICAgICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc3BhY2VJZCA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZCk7XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHNlbGVjdG9yLnN0YXRlID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlLmFkbWlucy5pbmNsdWRlcyh1c2VySWQpKSB7XG4gICAgICAgIGZsb3dfaWRzID0gW107XG4gICAgICAgIGN1clNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAgICd1c2VyJzogdXNlcklkXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3VyU3BhY2VVc2VyKSB7XG4gICAgICAgICAgb3JnYW5pemF0aW9ucyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAgICAgJGluOiBjdXJTcGFjZVVzZXIub3JnYW5pemF0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLmZldGNoKCk7XG4gICAgICAgICAgZmxvd3MgPSBkYi5mbG93cy5maW5kKHtcbiAgICAgICAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZmxvd3MuZm9yRWFjaChmdW5jdGlvbihmbCkge1xuICAgICAgICAgICAgaWYgKFdvcmtmbG93TWFuYWdlci5jYW5Nb25pdG9yKGZsLCBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMpIHx8IFdvcmtmbG93TWFuYWdlci5jYW5BZG1pbihmbCwgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvd19pZHMucHVzaChmbC5faWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYxID0gc2VsZWN0b3IuJGFuZCkgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICAgICAgICBzZWxlY3Rvci4kYW5kWzBdLiRvciA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibWl0dGVyOiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgYXBwbGljYW50OiB1c2VySWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgaW5ib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBvdXRib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBjY191c2VyczogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGZsb3c6IHtcbiAgICAgICAgICAgICAgICAkaW46IGZsb3dfaWRzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF8uZXh0ZW5kKHNlbGVjdG9yLCB7XG4gICAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN1Ym1pdHRlcjogdXNlcklkXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBhcHBsaWNhbnQ6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgaW5ib3hfdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgb3V0Ym94X3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGNjX3VzZXJzOiB1c2VySWRcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGZsb3c6IHtcbiAgICAgICAgICAgICAgICAgICRpbjogZmxvd19pZHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsIlN0ZWVkb3Muc3Vic1tcIkluc3RhbmNlVGFidWxhclwiXSA9IG5ldyBTdWJzTWFuYWdlcigpXG5cblxuX2hhbmRsZUxpc3RGaWVsZHMgPSAoZmllbGRzKSAtPlxuXHRpbnNfZmllbGRzID0gbmV3IEFycmF5KCk7XG5cblx0ZmllbGRzPy5mb3JFYWNoIChmKS0+XG5cdFx0aWYgZi50eXBlID09ICd0YWJsZSdcblx0XHRcdGNvbnNvbGUubG9nICdpZ25vcmUgb3BpbmlvbiBmaWVsZCBpbiB0YWJsZSdcblx0XHRlbHNlIGlmIGYudHlwZSA9PSAnc2VjdGlvbidcblx0XHRcdGY/LmZpZWxkcz8uZm9yRWFjaCAoZjEpLT5cblx0XHRcdFx0aW5zX2ZpZWxkcy5wdXNoIGYxXG5cdFx0ZWxzZVxuXHRcdFx0aW5zX2ZpZWxkcy5wdXNoIGZcblxuXHRyZXR1cm4gaW5zX2ZpZWxkc1xuXG5cbnVwZGF0ZVRhYnVsYXJUaXRsZSA9ICgpLT5cblxuIyDlpoLmnpxjb2x1bW5z5pyJ5Yqg5YeP77yM6K+35L+u5pS5VGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zIOWHveaVsFxuaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhciA9IChmbG93SWQsIGZpZWxkcyktPlxuXHRvcHRpb25zID0ge1xuXHRcdG5hbWU6IFwiaW5zdGFuY2VzXCIsXG5cdFx0Y29sbGVjdGlvbjogZGIuaW5zdGFuY2VzLFxuXHRcdHB1YjogXCJpbnN0YW5jZV90YWJ1bGFyXCIsXG5cdFx0b25VbmxvYWQ6ICgpLT5cblx0XHRcdE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKVxuXG5cdFx0ZHJhd0NhbGxiYWNrOiAoc2V0dGluZ3MpLT5cblx0XHRcdGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIilcblx0XHRcdGlmIGVtcHR5VGQubGVuZ3RoXG5cdFx0XHRcdGVtcHR5VGRbMF0uY29sU3BhbiA9IFwiNlwiXG5cdFx0XHRpZiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzUGFkKClcblx0XHRcdFx0TWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApXG5cdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCkucmVhZHkgLT5cblx0XHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikucGVyZmVjdFNjcm9sbGJhcihcInVwZGF0ZVwiKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApXG5cblx0XHRcdHRpdGxlID0gdCBcInBhZ2VyX2lucHV0X2hpbnRcIlxuXHRcdFx0ZWxsaXBzaXNMaW5rID0gc2V0dGluZ3Mub0luc3RhbmNlLnBhcmVudCgpLmZpbmQoJy5wYWdpbmdfbnVtYmVycyAucGFnaW5hdGlvbiAuZGlzYWJsZWQgYScpXG5cdFx0XHRlbGxpcHNpc0xpbmsuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmNsaWNrIC0+XG5cdFx0XHRcdGlmICEkKHRoaXMpLmZpbmQoJ2lucHV0JykubGVuZ3RoXG5cdFx0XHRcdFx0aW5wdXQgPSAkKCc8aW5wdXQgY2xhc3M9XCJwYWdpbmF0ZV9pbnB1dCBmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiYm9yZGVyOiBub25lOyBwYWRkaW5nOjAgMnB4O1wiLz4nKVxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdFx0aW5wdXQuY3NzKHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6XCI1MnB4XCJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcIjIwcHhcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpbnB1dC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR3aWR0aDpcIjUycHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMTZweFwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdGlucHV0LmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuYXR0cihcInBsYWNlaG9sZGVyXCIsIHRpdGxlKVxuXHRcdFx0XHRcdCQodGhpcykuZW1wdHkoKS5hcHBlbmQgaW5wdXRcblx0XHRcdFx0XHRnb1BhZ2UgPSAoaW5kZXgpLT5cblx0XHRcdFx0XHRcdGlmIGluZGV4ID4gMFxuXHRcdFx0XHRcdFx0XHRwYWdlcyA9IE1hdGguY2VpbChzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCkgLyBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpXG5cdFx0XHRcdFx0XHRcdGlmIGluZGV4ID4gcGFnZXNcblx0XHRcdFx0XHRcdFx0XHQjIOmhteeggei2heWHuue0ouW8leaXtui3s+i9rOWIsOacgOWQjuS4gOmhtVxuXHRcdFx0XHRcdFx0XHRcdGluZGV4ID0gcGFnZXNcblx0XHRcdFx0XHRcdFx0aW5kZXgtLVxuXHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5vSW5zdGFuY2UuRGF0YVRhYmxlKCkucGFnZShpbmRleCkuZHJhdygncGFnZScpXG5cdFx0XHRcdFx0aW5wdXQuYmx1ciAoZSktPlxuXHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRnb1BhZ2UgY3VycmVudFBhZ2Vcblx0XHRcdFx0XHRcdCQodGhpcykucGFyZW50KCkuaHRtbCAnLi4uJ1xuXHRcdFx0XHRcdGlucHV0LmtleWRvd24gKGUpLT5cblx0XHRcdFx0XHRcdGlmKGUua2V5Q29kZS50b1N0cmluZygpID09IFwiMTNcIilcblx0XHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRcdGdvUGFnZSBjdXJyZW50UGFnZVxuXG5cdFx0Y3JlYXRlZFJvdzogKHJvdywgZGF0YSwgZGF0YUluZGV4KSAtPlxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGlmIGRhdGEuX2lkID09IEZsb3dSb3V0ZXIuY3VycmVudCgpLnBhcmFtcy5pbnN0YW5jZUlkXG5cdFx0XHRcdFx0cm93LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic2VsZWN0ZWRcIilcblx0XHRjb2x1bW5zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiX2lkXCIsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0bW9kaWZpZWRTdHJpbmcgPSBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuXHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLm1vZGlmaWVkXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2Muc3RhdGUgIT0gJ2RyYWZ0J1xuXHRcdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2Muc3RhcnRfZGF0ZSB8fCBkb2MubW9kaWZpZWRcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdvdXRib3gnIHx8IFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJ1xuXHRcdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLnN1Ym1pdF9kYXRlXG5cblx0XHRcdFx0XHRtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG5cdFx0XHRcdFx0Zmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZVxuXHRcdFx0XHRcdGNjX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdCMg5b2T5YmN55So5oi35ZyoY2MgdXNlcuS4re+8jOS9huaYr+S4jeWcqGluYm94IHVzZXJz5pe25omN5pi+56S6J+S8oOmYhSfmloflrZdcblx0XHRcdFx0XHRpZiBkb2MuaXNfY2MgJiYgIWRvYy5pbmJveF91c2Vycz8uaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIlxuXHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08c3Bhbj4oI3tkb2MuY3VycmVudF9zdGVwX25hbWV9KTwvc3Bhbj48L2Rpdj5cIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9ICdkcmFmdCcgJiYgZG9jLmN1cnJlbnRfc3RlcF9uYW1lXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PHNwYW4+KCN7ZG9jLmN1cnJlbnRfc3RlcF9uYW1lfSk8L3NwYW4+PC9kaXY+XCJcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08L2Rpdj5cIlxuXG5cdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgZG9jLmFnZW50X3VzZXJfbmFtZSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWV9KSArIFwiKTwvbGFiZWw+XCJcblxuXHRcdFx0XHRcdHVucmVhZCA9ICcnXG5cblx0XHRcdFx0XHQjIGlzRmF2b3JpdGVTZWxlY3RlZCA9IEZhdm9yaXRlcy5pc1JlY29yZFNlbGVjdGVkKFwiaW5zdGFuY2VzXCIsIGRvYy5faWQpXG5cdFx0XHRcdFx0IyBpZiBGYXZvcml0ZXMuaXNSZWNvcmRTZWxlY3RlZChcImluc3RhbmNlc1wiLCBkb2MuX2lkKVxuXHRcdFx0XHRcdCMgXHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLWlvcy1zdGFyLW91dGxpbmUgaW5zdGFuY2UtZmF2b3JpdGUtc2VsZWN0ZWRcIj48L2k+J1xuXHRcdFx0XHRcdCMgZWxzZSBcblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09IGZhbHNlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+J1xuXHRcdFx0XHRcdGVsc2UgaWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nXG5cblx0XHRcdFx0XHRwcmlvcml0eUljb24gPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiXG5cdFx0XHRcdFx0cHJpb3JpdHlWYWx1ZSA9IGRvYy52YWx1ZXM/LnByaW9yaXR5XG5cdFx0XHRcdFx0c3dpdGNoIHByaW9yaXR5VmFsdWVcblx0XHRcdFx0XHRcdHdoZW4gXCLnibnmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLntKfmgKVcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiXG5cdFx0XHRcdFx0XHR3aGVuIFwi5Yqe5paHXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCJcblx0XHRcdFx0XHRpZiBwcmlvcml0eUljb25DbGFzc1xuXHRcdFx0XHRcdFx0aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktI3twcmlvcml0eUljb25DbGFzc31cIlxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz4je3VucmVhZH08L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lICN7aW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzc30nPiN7ZG9jLm5hbWV9I3tjY192aWV3fSN7YWdlbnRfdmlld31cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPiN7ZG9jLmFwcGxpY2FudF9uYW1lfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1kZXRhaWwnPiN7c3RlcF9jdXJyZW50X25hbWVfdmlld31cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPSdpbnN0YW5jZS1tb2RpZmllZCcgdGl0bGU9JyN7bW9kaWZpZWRTdHJpbmd9Jz4je21vZGlmaWVkRnJvbU5vd308L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFwiXCJcIlxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19uYW1lXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRjY192aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHQjIOW9k+WJjeeUqOaIt+WcqGNjIHVzZXLkuK3vvIzkvYbmmK/kuI3lnKhpbmJveCB1c2Vyc+aXtuaJjeaYvuekuifkvKDpmIUn5paH5a2XXG5cdFx0XHRcdFx0aWYgZG9jLmlzX2NjICYmICFkb2MuaW5ib3hfdXNlcnM/LmluY2x1ZGVzKE1ldGVvci51c2VySWQoKSkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0Y2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCJcblxuXHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdGlmIGRvYy5hZ2VudF91c2VyX25hbWVcblx0XHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oJ3Byb2Nlc3NfZGVsZWdhdGlvbl9ydWxlc19kZXNjcmlwdGlvbicsIHt1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZX0pICsgXCIpPC9sYWJlbD5cIlxuXG5cdFx0XHRcdFx0dW5yZWFkID0gJydcblxuXHRcdFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT0gZmFsc2Vcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nXG5cdFx0XHRcdFx0ZWxzZSBpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PSB0cnVlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPidcblxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5VmFsdWUgPSBkb2MudmFsdWVzPy5wcmlvcml0eVxuXHRcdFx0XHRcdHN3aXRjaCBwcmlvcml0eVZhbHVlXG5cdFx0XHRcdFx0XHR3aGVuIFwi54m55oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiXG5cdFx0XHRcdFx0XHR3aGVuIFwi57Sn5oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIuWKnuaWh1wiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiXG5cdFx0XHRcdFx0aWYgcHJpb3JpdHlJY29uQ2xhc3Ncblx0XHRcdFx0XHRcdGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LSN7cHJpb3JpdHlJY29uQ2xhc3N9XCJcblx0XHRcdFx0XHRyZXR1cm4gXCJcIlwiXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz4je3VucmVhZH08L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSAje2luc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3N9Jz4je2RvYy5uYW1lfSN7Y2Nfdmlld30je2FnZW50X3ZpZXd9PC9kaXY+XG5cdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcInN1Ym1pdF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N1Ym1pdF9kYXRlXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2Muc3VibWl0X2RhdGVcblx0XHRcdFx0XHRcdHJldHVybiBtb21lbnQoZG9jLnN1Ym1pdF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImZsb3dfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19mbG93XCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJjdXJyZW50X3N0ZXBfbmFtZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdGVwX2N1cnJlbnRfbmFtZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN0YXRlID09IFwiY29tcGxldGVkXCJcblx0XHRcdFx0XHRcdGp1ZGdlID0gZG9jLmZpbmFsX2RlY2lzaW9uIHx8IFwiYXBwcm92ZWRcIlxuXG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWUgPSBkb2MuY3VycmVudF9zdGVwX25hbWUgfHwgJydcblxuXHRcdFx0XHRcdGNjX3RhZyA9ICcnXG5cblx0XHRcdFx0XHRpZiBkb2MuY2NfY291bnQgPiAwXG5cdFx0XHRcdFx0XHRjY190YWcgPSBUQVBpMThuLl9fKCdjY190YWcnKVxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXAtY3VycmVudC1zdGF0ZSAje2p1ZGdlfVwiPiN7c3RlcF9jdXJyZW50X25hbWV9I3tjY190YWd9PC9kaXY+XG5cdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm1vZGlmaWVkXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdGFydF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0YXJ0X2RhdGVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdGFydF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm15X2ZpbmlzaF9kYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5teV9maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2MubXlfZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibW9kaWZpZWRcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwia2V5d29yZHNcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jPy52YWx1ZXM/LnJlY29yZF9uZWVkICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT0gXCJ0cnVlXCJcblx0XHRcdFx0XHRcdGlmIGRvYz8uaXNfYXJjaGl2ZWRcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHQoXCJZRVNcIilcblx0XHRcdFx0XHRcdHJldHVybiB0KFwiTk9cIilcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0ZG9tOiBkbyAtPlxuXHRcdFx0IyDmiYvmnLrkuIrkuI3mmL7npLrkuIDpobXmmL7npLrlpJrlsJHmnaHorrDlvZXpgInpoblcblx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHQndHAnXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCd0cGwnXG5cdFx0b3JkZXI6IFtbNCwgXCJkZXNjXCJdXSxcblx0XHRleHRyYUZpZWxkczogW1wiZm9ybVwiLCBcImZsb3dcIiwgXCJpbmJveF91c2Vyc1wiLCBcInN0YXRlXCIsIFwic3BhY2VcIiwgXCJhcHBsaWNhbnRcIiwgXCJmb3JtX3ZlcnNpb25cIixcblx0XHRcdFwiZmxvd192ZXJzaW9uXCIsIFwiaXNfY2NcIiwgXCJjY19jb3VudFwiLCBcImlzX3JlYWRcIiwgXCJjdXJyZW50X3N0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG5cdFx0bGVuZ3RoQ2hhbmdlOiB0cnVlLFxuXHRcdGxlbmd0aE1lbnU6IFsxMCwxNSwyMCwyNSw1MCwxMDBdLFxuXHRcdHBhZ2VMZW5ndGg6IDEwLFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdHNlYXJjaGluZzogdHJ1ZSxcblx0XHRyZXNwb25zaXZlOlxuXHRcdFx0ZGV0YWlsczogZmFsc2Vcblx0XHRhdXRvV2lkdGg6IGZhbHNlLFxuXHRcdGNoYW5nZVNlbGVjdG9yOiAoc2VsZWN0b3IsIHVzZXJJZCkgLT5cblx0XHRcdHVubGVzcyB1c2VySWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2UgPSBzZWxlY3Rvci5zcGFjZVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3VzZXI6IHVzZXJJZCwgc3BhY2U6IHNwYWNlfSwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdFx0dW5sZXNzIHNwYWNlX3VzZXJcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yXG5cdFx0cGFnaW5nVHlwZTogXCJudW1iZXJzXCJcblx0XHRcblx0XHQjIGdldFNvcnQ6IChzZWxlY3Rvciwgc29ydCkgLT4gXG5cdFx0IyBcdGNvbnNvbGUubG9nKCdzZWxlY3RvcjonLHNlbGVjdG9yKVxuXHRcdCMgXHRjb25zb2xlLmxvZygnc29ydDonLHNvcnQpXG5cdFx0IyBcdG5ld1NvcnQgPSBbXVxuXHRcdCMgXHRfLmVhY2ggc2VsZWN0b3IsICh2LCBrKSAtPlxuXHRcdCMgXHRcdG5ld1NvcnQucHVzaChbaywgMV0pXG5cdFx0IyBcdG5ld1NvcnQgPSBuZXdTb3J0LmNvbmNhdChzb3J0KVxuXHRcdCMgXHRjb25zb2xlLmxvZygnbmV3U29ydDonLG5ld1NvcnQpXG5cdFx0IyBcdHJldHVybiBuZXdTb3J0XG5cdH1cblxuXHRpZiBmbG93SWRcblx0XHRrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgZmxvd0lkXG5cblx0XHRvcHRpb25zLm5hbWUgPSBrZXlcblxuXHRcdFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkcyA9IGZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcy5mb3JFYWNoIChmKS0+XG5cdFx0XHRpZiBmLnR5cGUgIT0gJ3RhYmxlJyAmJiBmLmlzX2xpc3RfZGlzcGxheVxuXHRcdFx0XHRvcHRpb25zLmNvbHVtbnMucHVzaFxuXHRcdFx0XHRcdGRhdGE6IChmLm5hbWUgfHwgZi5jb2RlKSxcblx0XHRcdFx0XHR0aXRsZTogdChmLm5hbWUgfHwgZi5jb2RlKSxcblx0XHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cblx0XHRcdFx0XHRcdHZhbHVlcyA9IGRvYy52YWx1ZXMgfHwge31cblxuXHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZXNbZi5jb2RlXVxuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggZi50eXBlXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ3VzZXInXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZT8ubmFtZVxuXHRcdFx0XHRcdFx0XHR3aGVuICdncm91cCdcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5mdWxsbmFtZVxuXHRcdFx0XHRcdFx0XHR3aGVuICdkYXRlJ1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcblx0XHRcdFx0XHRcdFx0d2hlbiAnZGF0ZVRpbWUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKVxuXHRcdFx0XHRcdFx0XHR3aGVuICdjaGVja2JveCdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZSA9PSB0cnVlIHx8IHZhbHVlID09ICd0cnVlJ1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF9ub1wiKTtcblx0XHRcdFx0XHRcdFx0d2hlbiAnb2RhdGEnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdGlmIF8uaXNBcnJheSh2YWx1ZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlWydAbGFiZWwnXVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVcblxuXG5cdHJldHVybiBvcHRpb25zO1xuXG5cbiMg5aaC5p6cY29sdW1uc+acieWKoOWHj++8jOivt+S/ruaUuVRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucyDlh73mlbBcbmluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyID0gKGZsb3dJZCwgZmllbGRzKS0+XG5cdG9wdGlvbnMgPSB7XG5cdFx0bmFtZTogXCJpbnN0YW5jZV90YXNrc1wiLFxuXHRcdGNvbGxlY3Rpb246IGRiLmluc3RhbmNlX3Rhc2tzLFxuXHRcdHB1YjogXCJpbnN0YW5jZV90YXNrc190YWJ1bGFyXCIsXG5cdFx0b25VbmxvYWQ6ICgpLT5cblx0XHRcdE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKVxuXG5cdFx0ZHJhd0NhbGxiYWNrOiAoc2V0dGluZ3MpLT5cblx0XHRcdGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIilcblx0XHRcdGlmIGVtcHR5VGQubGVuZ3RoXG5cdFx0XHRcdGVtcHR5VGRbMF0uY29sU3BhbiA9IFwiNlwiXG5cdFx0XHRpZiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzUGFkKClcblx0XHRcdFx0TWV0ZW9yLnNldFRpbWVvdXQoVGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fdGFibGVDb2x1bW5zLCAxNTApXG5cdFx0XHRcdCQoXCIuaW5zdGFuY2UtbGlzdFwiKS5zY3JvbGxUb3AoMCkucmVhZHkgLT5cblx0XHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikucGVyZmVjdFNjcm9sbGJhcihcInVwZGF0ZVwiKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKFwiLmluc3RhbmNlLWxpc3RcIikuc2Nyb2xsVG9wKDApXG5cblx0XHRcdHRpdGxlID0gdCBcInBhZ2VyX2lucHV0X2hpbnRcIlxuXHRcdFx0ZWxsaXBzaXNMaW5rID0gc2V0dGluZ3Mub0luc3RhbmNlLnBhcmVudCgpLmZpbmQoJy5wYWdpbmdfbnVtYmVycyAucGFnaW5hdGlvbiAuZGlzYWJsZWQgYScpXG5cdFx0XHRlbGxpcHNpc0xpbmsuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmNsaWNrIC0+XG5cdFx0XHRcdGlmICEkKHRoaXMpLmZpbmQoJ2lucHV0JykubGVuZ3RoXG5cdFx0XHRcdFx0aW5wdXQgPSAkKCc8aW5wdXQgY2xhc3M9XCJwYWdpbmF0ZV9pbnB1dCBmb3JtLWNvbnRyb2wgaW5wdXQtc21cIiB0eXBlPVwidGV4dFwiIHN0eWxlPVwiYm9yZGVyOiBub25lOyBwYWRkaW5nOjAgMnB4O1wiLz4nKVxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdFx0aW5wdXQuY3NzKHtcblx0XHRcdFx0XHRcdFx0d2lkdGg6XCI1MnB4XCJcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiBcIjIwcHhcIlxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpbnB1dC5jc3Moe1xuXHRcdFx0XHRcdFx0XHR3aWR0aDpcIjUycHhcIlxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IFwiMTZweFwiXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdGlucHV0LmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuYXR0cihcInBsYWNlaG9sZGVyXCIsIHRpdGxlKVxuXHRcdFx0XHRcdCQodGhpcykuZW1wdHkoKS5hcHBlbmQgaW5wdXRcblx0XHRcdFx0XHRnb1BhZ2UgPSAoaW5kZXgpLT5cblx0XHRcdFx0XHRcdGlmIGluZGV4ID4gMFxuXHRcdFx0XHRcdFx0XHRwYWdlcyA9IE1hdGguY2VpbChzZXR0aW5ncy5mblJlY29yZHNEaXNwbGF5KCkgLyBzZXR0aW5ncy5faURpc3BsYXlMZW5ndGgpXG5cdFx0XHRcdFx0XHRcdGlmIGluZGV4ID4gcGFnZXNcblx0XHRcdFx0XHRcdFx0XHQjIOmhteeggei2heWHuue0ouW8leaXtui3s+i9rOWIsOacgOWQjuS4gOmhtVxuXHRcdFx0XHRcdFx0XHRcdGluZGV4ID0gcGFnZXNcblx0XHRcdFx0XHRcdFx0aW5kZXgtLVxuXHRcdFx0XHRcdFx0XHRzZXR0aW5ncy5vSW5zdGFuY2UuRGF0YVRhYmxlKCkucGFnZShpbmRleCkuZHJhdygncGFnZScpXG5cdFx0XHRcdFx0aW5wdXQuYmx1ciAoZSktPlxuXHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRnb1BhZ2UgY3VycmVudFBhZ2Vcblx0XHRcdFx0XHRcdCQodGhpcykucGFyZW50KCkuaHRtbCAnLi4uJ1xuXHRcdFx0XHRcdGlucHV0LmtleWRvd24gKGUpLT5cblx0XHRcdFx0XHRcdGlmKGUua2V5Q29kZS50b1N0cmluZygpID09IFwiMTNcIilcblx0XHRcdFx0XHRcdFx0Y3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpXG5cdFx0XHRcdFx0XHRcdGdvUGFnZSBjdXJyZW50UGFnZVxuXG5cdFx0Y3JlYXRlZFJvdzogKHJvdywgZGF0YSwgZGF0YUluZGV4KSAtPlxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGlmIGRhdGEuaW5zdGFuY2UgPT0gRmxvd1JvdXRlci5jdXJyZW50KCkucGFyYW1zLmluc3RhbmNlSWRcblx0XHRcdFx0XHRyb3cuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3RlZFwiKVxuXHRcdGNvbHVtbnM6IFtcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJfaWRcIixcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRtb2RpZmllZFN0cmluZyA9IG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBkb2MubW9kaWZpZWRcblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pbnN0YW5jZV9zdGF0ZSAhPSAnZHJhZnQnXG5cdFx0XHRcdFx0XHRtb2RpZmllZCA9IGRvYy5zdGFydF9kYXRlIHx8IGRvYy5tb2RpZmllZFxuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ291dGJveCdcblx0XHRcdFx0XHRcdG1vZGlmaWVkID0gZG9jLnN1Ym1pdF9kYXRlIHx8IGRvYy5tb2RpZmllZFxuXG5cdFx0XHRcdFx0bW9kaWZpZWRGcm9tTm93ID0gU3RlZWRvcy5tb21lbnRSZWFjdGl2ZUZyb21Ob3cobW9kaWZpZWQpO1xuXHRcdFx0XHRcdGZsb3dfbmFtZSA9IGRvYy5mbG93X25hbWVcblx0XHRcdFx0XHRjY192aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHQjIOW9k+WJjeeUqOaIt+WcqGNjIHVzZXLkuK3vvIzkvYbmmK/kuI3lnKhpbmJveCB1c2Vyc+aXtuaJjeaYvuekuifkvKDpmIUn5paH5a2XXG5cdFx0XHRcdFx0aWYgZG9jLnR5cGUgPT0gJ2NjJyAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnXG5cdFx0XHRcdFx0XHRjY192aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKFwiaW5zdGFuY2VfY2NfdGl0bGVcIikgKyBcIik8L2xhYmVsPiBcIlxuXHRcdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz4je2Zsb3dfbmFtZX08c3Bhbj4oI3tkb2Muc3RlcF9uYW1lfSk8L3NwYW4+PC9kaXY+XCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpZiBkb2Muc3RlcF9uYW1lXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PHNwYW4+KCN7ZG9jLnN0ZXBfbmFtZX0pPC9zcGFuPjwvZGl2PlwiXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+I3tmbG93X25hbWV9PC9kaXY+XCJcblxuXHRcdFx0XHRcdGFnZW50X3ZpZXcgPSBcIlwiO1xuXHRcdFx0XHRcdGlmIGRvYy5hZ2VudF91c2VyX25hbWUgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94J1xuXHRcdFx0XHRcdFx0YWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge3VzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lfSkgKyBcIik8L2xhYmVsPlwiXG5cblx0XHRcdFx0XHR1bnJlYWQgPSAnJ1xuXG5cdFx0XHRcdFx0aWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PSBmYWxzZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiaW9uIGlvbi1yZWNvcmQgdW5yZWFkXCI+PC9pPidcblx0XHRcdFx0XHRlbHNlIGlmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09IHRydWVcblx0XHRcdFx0XHRcdHVucmVhZCA9ICc8aSBjbGFzcz1cImZhIGZhLWxvY2tcIj48L2k+J1xuXG5cdFx0XHRcdFx0cHJpb3JpdHlJY29uID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIlxuXHRcdFx0XHRcdHByaW9yaXR5VmFsdWUgPSBkb2MudmFsdWVzPy5wcmlvcml0eVxuXHRcdFx0XHRcdHN3aXRjaCBwcmlvcml0eVZhbHVlXG5cdFx0XHRcdFx0XHR3aGVuIFwi54m55oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiXG5cdFx0XHRcdFx0XHR3aGVuIFwi57Sn5oClXCJcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIuWKnuaWh1wiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiXG5cdFx0XHRcdFx0aWYgcHJpb3JpdHlJY29uQ2xhc3Ncblx0XHRcdFx0XHRcdGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LSN7cHJpb3JpdHlJY29uQ2xhc3N9XCJcblxuXHRcdFx0XHRcdHJldHVybiBcIlwiXCJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+I3t1bnJlYWR9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSAje2luc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3N9Jz4je2RvYy5pbnN0YW5jZV9uYW1lfSN7Y2Nfdmlld30je2FnZW50X3ZpZXd9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj4je2RvYy5hcHBsaWNhbnRfbmFtZX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz0naW5zdGFuY2UtZGV0YWlsJz4je3N0ZXBfY3VycmVudF9uYW1lX3ZpZXd9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz0naW5zdGFuY2UtbW9kaWZpZWQnIHRpdGxlPScje21vZGlmaWVkU3RyaW5nfSc+I3ttb2RpZmllZEZyb21Ob3d9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcIlwiXCJcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImluc3RhbmNlX25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfbmFtZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0Y2NfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0c3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG5cdFx0XHRcdFx0IyDlvZPliY3nlKjmiLflnKhjYyB1c2Vy5Lit77yM5L2G5piv5LiN5ZyoaW5ib3ggdXNlcnPml7bmiY3mmL7npLon5Lyg6ZiFJ+aWh+Wtl1xuXHRcdFx0XHRcdGlmIGRvYy5pc19jYyAmJiAhZG9jLmluYm94X3VzZXJzPy5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09ICdpbmJveCdcblx0XHRcdFx0XHRcdGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiXG5cblx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCJcIjtcblx0XHRcdFx0XHRpZiBkb2MuYWdlbnRfdXNlcl9uYW1lXG5cdFx0XHRcdFx0XHRhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7dXNlck5hbWU6IGRvYy5hZ2VudF91c2VyX25hbWV9KSArIFwiKTwvbGFiZWw+XCJcblxuXHRcdFx0XHRcdHVucmVhZCA9ICcnXG5cblx0XHRcdFx0XHRpZiBTZXNzaW9uLmdldChcImJveFwiKSA9PSAnaW5ib3gnICYmIGRvYy5pc19yZWFkID09IGZhbHNlXG5cdFx0XHRcdFx0XHR1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+J1xuXHRcdFx0XHRcdGVsc2UgaWYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT0gJ21vbml0b3InICYmIGRvYy5pc19oaWRkZW4gPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0dW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nXG5cblx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwiXCJcblx0XHRcdFx0XHRwcmlvcml0eVZhbHVlID0gZG9jLnZhbHVlcz8ucHJpb3JpdHlcblx0XHRcdFx0XHRzd2l0Y2ggcHJpb3JpdHlWYWx1ZVxuXHRcdFx0XHRcdFx0d2hlbiBcIueJueaApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIlxuXHRcdFx0XHRcdFx0d2hlbiBcIue0p+aApVwiXG5cdFx0XHRcdFx0XHRcdHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCJcblx0XHRcdFx0XHRcdHdoZW4gXCLlip7mlodcIlxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIlxuXHRcdFx0XHRcdGlmIHByaW9yaXR5SWNvbkNsYXNzXG5cdFx0XHRcdFx0XHRpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS0je3ByaW9yaXR5SWNvbkNsYXNzfVwiXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+I3t1bnJlYWR9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgI3tpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzfSc+I3tkb2MuaW5zdGFuY2VfbmFtZX0je2NjX3ZpZXd9I3thZ2VudF92aWV3fTwvZGl2PlxuXHRcdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImFwcGxpY2FudF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX2FwcGxpY2FudF9uYW1lXCIpLFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdWJtaXRfZGF0ZVwiLFxuXHRcdFx0XHR0aXRsZTogdChcImluc3RhbmNlc19zdWJtaXRfZGF0ZVwiKSxcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jLnN1Ym1pdF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdWJtaXRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJmbG93X25hbWVcIixcblx0XHRcdFx0dGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwic3RlcF9uYW1lXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0ZXBfY3VycmVudF9uYW1lXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRpZiBkb2MuaW5zdGFuY2Vfc3RhdGUgPT0gXCJjb21wbGV0ZWRcIlxuXHRcdFx0XHRcdFx0anVkZ2UgPSBkb2MuanVkZ2UgfHwgXCJhcHByb3ZlZFwiXG5cblx0XHRcdFx0XHRzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5zdGVwX25hbWUgfHwgJydcblxuXHRcdFx0XHRcdGNjX3RhZyA9ICcnXG5cblx0XHRcdFx0XHRpZiBkb2MuY2NfY291bnQgPiAwXG5cdFx0XHRcdFx0XHRjY190YWcgPSBUQVBpMThuLl9fKCdjY190YWcnKVxuXG5cdFx0XHRcdFx0cmV0dXJuIFwiXCJcIlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXAtY3VycmVudC1zdGF0ZSAje2p1ZGdlfVwiPiN7c3RlcF9jdXJyZW50X25hbWV9I3tjY190YWd9PC9kaXY+XG5cdFx0XHRcdFx0XCJcIlwiXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IGZhbHNlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcIm1vZGlmaWVkXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuXHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG5cdFx0XHRcdCxcblx0XHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRcdG9yZGVyYWJsZTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJzdGFydF9kYXRlXCIsXG5cdFx0XHRcdHRpdGxlOiB0KFwiaW5zdGFuY2VzX3N0YXJ0X2RhdGVcIiksXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5zdGFydF9kYXRlXG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcblx0XHRcdFx0LFxuXHRcdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdFx0b3JkZXJhYmxlOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRkYXRhOiBcImZpbmlzaF9kYXRlXCIsXG5cdFx0XHRcdHJlbmRlcjogKHZhbCwgdHlwZSwgZG9jKSAtPlxuXHRcdFx0XHRcdGlmIGRvYy5maW5pc2hfZGF0ZVxuXHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChkb2MuZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuXHRcdFx0XHQsXG5cdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRvcmRlcmFibGU6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibW9kaWZpZWRcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwia2V5d29yZHNcIixcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcblx0XHRcdFx0cmVuZGVyOiAodmFsLCB0eXBlLCBkb2MpIC0+XG5cdFx0XHRcdFx0aWYgZG9jPy52YWx1ZXM/LnJlY29yZF9uZWVkICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT0gXCJ0cnVlXCJcblx0XHRcdFx0XHRcdGlmIGRvYz8uaXNfYXJjaGl2ZWRcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHQoXCJZRVNcIilcblx0XHRcdFx0XHRcdHJldHVybiB0KFwiTk9cIilcblx0XHRcdFx0dmlzaWJsZTogZmFsc2Vcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0ZG9tOiBkbyAtPlxuXHRcdFx0IyDmiYvmnLrkuIrkuI3mmL7npLrkuIDpobXmmL7npLrlpJrlsJHmnaHorrDlvZXpgInpoblcblx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHQndHAnXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCd0cGwnXG5cdFx0b3JkZXI6IFtbNCwgXCJkZXNjXCJdXSxcblx0XHRleHRyYUZpZWxkczogW1wiaW5zdGFuY2VcIiwgXCJmb3JtXCIsIFwiZmxvd1wiLCBcImluYm94X3VzZXJzXCIsIFwiaW5zdGFuY2Vfc3RhdGVcIiwgXCJzcGFjZVwiLCBcImFwcGxpY2FudFwiLCBcImZvcm1fdmVyc2lvblwiLFxuXHRcdFx0XCJmbG93X3ZlcnNpb25cIiwgXCJ0eXBlXCIsIFwiaXNfcmVhZFwiLCBcInN0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG5cdFx0bGVuZ3RoQ2hhbmdlOiB0cnVlLFxuXHRcdGxlbmd0aE1lbnU6IFsxMCwxNSwyMCwyNSw1MCwxMDBdLFxuXHRcdHBhZ2VMZW5ndGg6IDEwLFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdHNlYXJjaGluZzogdHJ1ZSxcblx0XHRyZXNwb25zaXZlOlxuXHRcdFx0ZGV0YWlsczogZmFsc2Vcblx0XHRhdXRvV2lkdGg6IGZhbHNlLFxuXHRcdGNoYW5nZVNlbGVjdG9yOiAoc2VsZWN0b3IsIHVzZXJJZCkgLT5cblx0XHRcdHVubGVzcyB1c2VySWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2UgPSBzZWxlY3Rvci5zcGFjZVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3VzZXI6IHVzZXJJZCwgc3BhY2U6IHNwYWNlfSwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdFx0dW5sZXNzIHNwYWNlX3VzZXJcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yXG5cdFx0cGFnaW5nVHlwZTogXCJudW1iZXJzXCJcblxuXHR9XG5cblx0aWYgZmxvd0lkXG5cdFx0a2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGZsb3dJZFxuXG5cdFx0b3B0aW9ucy5uYW1lID0ga2V5XG5cblx0XHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzLmZpZWxkcyA9IGZpZWxkc1xuXG5cdFx0aW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzIFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MuZmllbGRzXG5cblx0XHRpbnNfZmllbGRzLmZvckVhY2ggKGYpLT5cblx0XHRcdGlmIGYudHlwZSAhPSAndGFibGUnICYmIGYuaXNfbGlzdF9kaXNwbGF5XG5cdFx0XHRcdG9wdGlvbnMuY29sdW1ucy5wdXNoXG5cdFx0XHRcdFx0ZGF0YTogKGYubmFtZSB8fCBmLmNvZGUpLFxuXHRcdFx0XHRcdHRpdGxlOiB0KGYubmFtZSB8fCBmLmNvZGUpLFxuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdFx0XHRyZW5kZXI6ICh2YWwsIHR5cGUsIGRvYykgLT5cblxuXHRcdFx0XHRcdFx0dmFsdWVzID0gZG9jLnZhbHVlcyB8fCB7fVxuXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlc1tmLmNvZGVdXG5cblx0XHRcdFx0XHRcdHN3aXRjaCBmLnR5cGVcblx0XHRcdFx0XHRcdFx0d2hlbiAndXNlcidcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlPy5uYW1lXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2dyb3VwJ1xuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWU/LmZ1bGxuYW1lXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2RhdGUnXG5cdFx0XHRcdFx0XHRcdFx0aWYgdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuXHRcdFx0XHRcdFx0XHR3aGVuICdkYXRlVGltZSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSBtb21lbnQodmFsdWUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpXG5cdFx0XHRcdFx0XHRcdHdoZW4gJ2NoZWNrYm94J1xuXHRcdFx0XHRcdFx0XHRcdGlmIHZhbHVlID09IHRydWUgfHwgdmFsdWUgPT0gJ3RydWUnXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X3llc1wiKTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuXHRcdFx0XHRcdFx0XHR3aGVuICdvZGF0YSdcblx0XHRcdFx0XHRcdFx0XHRpZiB2YWx1ZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgXy5pc0FycmF5KHZhbHVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWVbJ0BsYWJlbCddXG5cblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZVxuXG5cblx0cmV0dXJuIG9wdGlvbnM7XG5cblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlIGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIoKVxuXHRUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzID0gbmV3IFRhYnVsYXIuVGFibGUgaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoKVxuXHRUYWJ1bGFyVGFibGVzLmluYm94X2luc3RhbmNlcyA9IG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKFwiaW5ib3hcIilcblx0VGFidWxhclRhYmxlcy5vdXRib3hfaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUgR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoXCJvdXRib3hcIilcblxuXG5HZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyA9IChib3gsIGZsb3dJZCwgZmllbGRzKS0+XG5cdGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBib3ggKyBmbG93SWRcblx0aWYgYm94ID09IFwiaW5ib3hcIlxuXHRcdG9wdGlvbnMgPSBfZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMoZmxvd0lkLCBmaWVsZHMpXG5cdGVsc2UgaWYgYm94ID09IFwib3V0Ym94XCJcblx0XHRvcHRpb25zID0gX2dldF9vdXRib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyhmbG93SWQsIGZpZWxkcylcblx0ZWxzZVxuXHRcdG9wdGlvbnMgPSBpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKVxuXHRcdGlmICFmbG93SWRcblx0XHRcdG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCJcblx0aWYgZmxvd0lkXG5cdFx0b3B0aW9ucy5uYW1lID0ga2V5XG5cdHJldHVybiBvcHRpb25zXG5cbl9nZXRfaW5ib3hfaW5zdGFuY2VzX3RhYnVsYXJfb3B0aW9ucyA9IChmbG93SWQsIGZpZWxkcyktPlxuXHRvcHRpb25zID0gaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoZmxvd0lkLCBmaWVsZHMpXG5cblx0aWYgIWZsb3dJZFxuXHRcdG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCJcblxuXHRvcHRpb25zLm9yZGVyID0gW1s4LCBcImRlc2NcIl1dXG5cblx0b3B0aW9ucy5nZXRTb3J0ID0gKHNlbGVjdG9yLCBzb3J0KSAtPiBcblx0XHRjb25zb2xlLmxvZygnaW5ib3hfaW5zdGFuY2VzOicsc29ydClcblx0XHRyZXR1cm4gc29ydFxuXG5cdHJldHVybiBvcHRpb25zXG5cbl9nZXRfb3V0Ym94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMgPSAoZmxvd0lkLCBmaWVsZHMpLT5cblx0b3B0aW9ucyA9IGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKVxuXG5cdGlmICFmbG93SWRcblx0XHRvcHRpb25zLm5hbWUgPSBcIm91dGJveF9pbnN0YW5jZXNcIlxuXG5cdG9wdGlvbnMub3JkZXIgPSBbWzksIC0xXV1cblxuXHRvcHRpb25zLmdldFNvcnQgPSAoc2VsZWN0b3IsIHNvcnQpIC0+IFxuXHRcdGNvbnNvbGUubG9nKCdvdXRib3hfaW5zdGFuY2VzOicsc29ydClcblx0XHQjIG5ld1NvcnQgPSBbIFxuXHRcdCMgXHRbJ3NwYWNlJywgMV0sXG5cdFx0IyBcdFsnaGFuZGxlcicsIDFdLFxuXHRcdCMgXHRbJ2lzX2ZpbmlzaGVkJywgMV0sXG5cdFx0IyBdXG5cdFx0IyBuZXdTb3J0ID0gbmV3U29ydC5jb25jYXQoc29ydClcblx0XHQjIHJldHVybiBuZXdTb3J0XG5cdFx0cmV0dXJuIHNvcnRcblxuXHRyZXR1cm4gb3B0aW9uc1xuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0VGFidWxhclRhYmxlcy5mbG93SW5zdGFuY2VzID0gbmV3IFJlYWN0aXZlVmFyKClcblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRUcmFja2VyLmF1dG9ydW4gKGMpIC0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmICFTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdGlmIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpICE9ICdkcmFmdCdcblx0XHRcdFx0TWV0ZW9yLmNhbGwgXCJuZXdJbnN0YW5jZXNMaXN0VGFidWxhclwiLCBTZXNzaW9uLmdldChcImJveFwiKSwgU2Vzc2lvbi5nZXQoXCJmbG93SWRcIiksIChlcnJvciwgcmVzdWx0KSAtPlxuXHRcdFx0XHRcdG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyIFNlc3Npb24uZ2V0KFwiYm94XCIpLCBTZXNzaW9uLmdldChcImZsb3dJZFwiKSwgcmVzdWx0XG5cdFx0XHRcdFx0VGVtcGxhdGUuaW5zdGFuY2VfbGlzdC5fY2hhbmdlT3JkZXIoKVxuXG5cbm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyID0gKGJveCwgZmxvd0lkLCBmaWVsZHMpLT5cblx0aWYgIWZpZWxkc1xuXHRcdGZsb3cgPSBkYi5mbG93cy5maW5kT25lKHtfaWQ6IGZsb3dJZH0sIHtmaWVsZHM6IHtmb3JtOiAxfX0pXG5cdFx0ZmllbGRzID0gZGIuZm9ybXMuZmluZE9uZSh7IF9pZDogZmxvdz8uZm9ybSB9LCB7IGZpZWxkczogeyAnY3VycmVudC5maWVsZHMnOiAxIH0gfSk/LmN1cnJlbnQ/LmZpZWxkc1xuXG5cdGZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzIGZpZWxkc1xuXG5cdGlmIGZpZWxkcz8uZmlsdGVyUHJvcGVydHkoXCJpc19saXN0X2Rpc3BsYXlcIiwgdHJ1ZSk/Lmxlbmd0aCA+IDBcblx0XHRrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgYm94ICsgZmxvd0lkXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRUYWJ1bGFyVGFibGVzLmZsb3dJbnN0YW5jZXMuc2V0KG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpKVxuXHRcdGVsc2Vcblx0XHRcdG5ldyBUYWJ1bGFyLlRhYmxlIEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpXG5cdFx0Y29uc29sZS5sb2cgXCJuZXcgVGFidWxhclRhYmxlcyBcIiwga2V5XG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRNZXRlb3IubWV0aG9kc1xuXHRcdG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyOiAoYm94LCBmbG93SWQpLT5cblx0XHRcdG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyKGJveCwgZmxvd0lkKVxuXG5cdFx0XHRmbG93ID0gZGIuZmxvd3MuZmluZE9uZSh7X2lkOiBmbG93SWR9LCB7ZmllbGRzOiB7Zm9ybTogMX19KVxuXHRcdFx0ZmllbGRzID0gZGIuZm9ybXMuZmluZE9uZSh7IF9pZDogZmxvdz8uZm9ybSB9LCB7IGZpZWxkczogeyAnY3VycmVudC5maWVsZHMnOiAxIH0gfSk/LmN1cnJlbnQ/LmZpZWxkc1xuXHRcdFx0cmV0dXJuIGZpZWxkc1xuXG5cbiIsInZhciBHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucywgX2dldF9pbmJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zLCBfZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zLCBfaGFuZGxlTGlzdEZpZWxkcywgaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIsIGluc3RhbmNlc0xpc3RUYWJsZVRhYnVsYXIsIG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyLCB1cGRhdGVUYWJ1bGFyVGl0bGU7XG5cblN0ZWVkb3Muc3Vic1tcIkluc3RhbmNlVGFidWxhclwiXSA9IG5ldyBTdWJzTWFuYWdlcigpO1xuXG5faGFuZGxlTGlzdEZpZWxkcyA9IGZ1bmN0aW9uKGZpZWxkcykge1xuICB2YXIgaW5zX2ZpZWxkcztcbiAgaW5zX2ZpZWxkcyA9IG5ldyBBcnJheSgpO1xuICBpZiAoZmllbGRzICE9IG51bGwpIHtcbiAgICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGYudHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coJ2lnbm9yZSBvcGluaW9uIGZpZWxkIGluIHRhYmxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGYudHlwZSA9PT0gJ3NlY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmICE9IG51bGwgPyAocmVmID0gZi5maWVsZHMpICE9IG51bGwgPyByZWYuZm9yRWFjaChmdW5jdGlvbihmMSkge1xuICAgICAgICAgIHJldHVybiBpbnNfZmllbGRzLnB1c2goZjEpO1xuICAgICAgICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnNfZmllbGRzLnB1c2goZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGluc19maWVsZHM7XG59O1xuXG51cGRhdGVUYWJ1bGFyVGl0bGUgPSBmdW5jdGlvbigpIHt9O1xuXG5pbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyID0gZnVuY3Rpb24oZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIGluc19maWVsZHMsIGtleSwgb3B0aW9ucztcbiAgb3B0aW9ucyA9IHtcbiAgICBuYW1lOiBcImluc3RhbmNlc1wiLFxuICAgIGNvbGxlY3Rpb246IGRiLmluc3RhbmNlcyxcbiAgICBwdWI6IFwiaW5zdGFuY2VfdGFidWxhclwiLFxuICAgIG9uVW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MCk7XG4gICAgfSxcbiAgICBkcmF3Q2FsbGJhY2s6IGZ1bmN0aW9uKHNldHRpbmdzKSB7XG4gICAgICB2YXIgZWxsaXBzaXNMaW5rLCBlbXB0eVRkLCB0aXRsZTtcbiAgICAgIGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIik7XG4gICAgICBpZiAoZW1wdHlUZC5sZW5ndGgpIHtcbiAgICAgICAgZW1wdHlUZFswXS5jb2xTcGFuID0gXCI2XCI7XG4gICAgICB9XG4gICAgICBpZiAoIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc1BhZCgpKSB7XG4gICAgICAgIE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKTtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKS5yZWFkeShmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gJChcIi5pbnN0YW5jZS1saXN0XCIpLnBlcmZlY3RTY3JvbGxiYXIoXCJ1cGRhdGVcIik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKTtcbiAgICAgIH1cbiAgICAgIHRpdGxlID0gdChcInBhZ2VyX2lucHV0X2hpbnRcIik7XG4gICAgICBlbGxpcHNpc0xpbmsgPSBzZXR0aW5ncy5vSW5zdGFuY2UucGFyZW50KCkuZmluZCgnLnBhZ2luZ19udW1iZXJzIC5wYWdpbmF0aW9uIC5kaXNhYmxlZCBhJyk7XG4gICAgICByZXR1cm4gZWxsaXBzaXNMaW5rLmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGdvUGFnZSwgaW5wdXQ7XG4gICAgICAgIGlmICghJCh0aGlzKS5maW5kKCdpbnB1dCcpLmxlbmd0aCkge1xuICAgICAgICAgIGlucHV0ID0gJCgnPGlucHV0IGNsYXNzPVwicGFnaW5hdGVfaW5wdXQgZm9ybS1jb250cm9sIGlucHV0LXNtXCIgdHlwZT1cInRleHRcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgcGFkZGluZzowIDJweDtcIi8+Jyk7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMjBweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXQuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgdGl0bGUpO1xuICAgICAgICAgICQodGhpcykuZW1wdHkoKS5hcHBlbmQoaW5wdXQpO1xuICAgICAgICAgIGdvUGFnZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgcGFnZXM7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgIHBhZ2VzID0gTWF0aC5jZWlsKHNldHRpbmdzLmZuUmVjb3Jkc0Rpc3BsYXkoKSAvIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IHBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBwYWdlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Mub0luc3RhbmNlLkRhdGFUYWJsZSgpLnBhZ2UoaW5kZXgpLmRyYXcoJ3BhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlucHV0LmJsdXIoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgZ29QYWdlKGN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIHJldHVybiAkKHRoaXMpLnBhcmVudCgpLmh0bWwoJy4uLicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBpbnB1dC5rZXlkb3duKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZTtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUudG9TdHJpbmcoKSA9PT0gXCIxM1wiKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdvUGFnZShjdXJyZW50UGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlZFJvdzogZnVuY3Rpb24ocm93LCBkYXRhLCBkYXRhSW5kZXgpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgaWYgKGRhdGEuX2lkID09PSBGbG93Um91dGVyLmN1cnJlbnQoKS5wYXJhbXMuaW5zdGFuY2VJZCkge1xuICAgICAgICAgIHJldHVybiByb3cuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICBkYXRhOiBcIl9pZFwiLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFnZW50X3ZpZXcsIGNjX3ZpZXcsIGZsb3dfbmFtZSwgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcywgbW9kaWZpZWQsIG1vZGlmaWVkRnJvbU5vdywgbW9kaWZpZWRTdHJpbmcsIHByaW9yaXR5SWNvbiwgcHJpb3JpdHlJY29uQ2xhc3MsIHByaW9yaXR5VmFsdWUsIHJlZiwgcmVmMSwgc3RlcF9jdXJyZW50X25hbWVfdmlldywgdW5yZWFkO1xuICAgICAgICAgIG1vZGlmaWVkU3RyaW5nID0gbW9tZW50KGRvYy5tb2RpZmllZCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgbW9kaWZpZWQgPSBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnICYmIGRvYy5zdGF0ZSAhPT0gJ2RyYWZ0Jykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3RhcnRfZGF0ZSB8fCBkb2MubW9kaWZpZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ291dGJveCcgfHwgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLnN1Ym1pdF9kYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG4gICAgICAgICAgZmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZTtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmlzX2NjICYmICEoKHJlZiA9IGRvYy5pbmJveF91c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpIDogdm9pZCAwKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgY2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCI7XG4gICAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCI8ZGl2IGNsYXNzPSdmbG93LW5hbWUnPlwiICsgZmxvd19uYW1lICsgXCI8c3Bhbj4oXCIgKyBkb2MuY3VycmVudF9zdGVwX25hbWUgKyBcIik8L3NwYW4+PC9kaXY+XCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSAhPT0gJ2RyYWZ0JyAmJiBkb2MuY3VycmVudF9zdGVwX25hbWUpIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLmN1cnJlbnRfc3RlcF9uYW1lICsgXCIpPC9zcGFuPjwvZGl2PlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuYWdlbnRfdXNlcl9uYW1lICYmIFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnaW5ib3gnKSB7XG4gICAgICAgICAgICBhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lXG4gICAgICAgICAgICB9KSArIFwiKTwvbGFiZWw+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVucmVhZCA9ICcnO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW9yaXR5SWNvbiA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5VmFsdWUgPSAocmVmMSA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYxLnByaW9yaXR5IDogdm9pZCAwO1xuICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHlWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcIueJueaApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiZGFuZ2VyXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIue0p+aApVwiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwid2FybmluZ1wiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLlip7mlodcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIm11dGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmlvcml0eUljb25DbGFzcykge1xuICAgICAgICAgICAgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyA9IFwiY29sb3ItcHJpb3JpdHkgY29sb3ItcHJpb3JpdHktXCIgKyBwcmlvcml0eUljb25DbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwiPGRpdiBjbGFzcz0naW5zdGFuY2UtcmVhZC1iYXInPlwiICsgdW5yZWFkICsgXCI8L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1uYW1lIFwiICsgaW5zdGFuY2VOYW1lUHJpb3JpdHlDbGFzcyArIFwiJz5cIiArIGRvYy5uYW1lICsgY2NfdmlldyArIGFnZW50X3ZpZXcgKyBcIlxcblx0PHNwYW4+XCIgKyBkb2MuYXBwbGljYW50X25hbWUgKyBcIjwvc3Bhbj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPSdpbnN0YW5jZS1kZXRhaWwnPlwiICsgc3RlcF9jdXJyZW50X25hbWVfdmlldyArIFwiXFxuXHQ8c3BhbiBjbGFzcz0naW5zdGFuY2UtbW9kaWZpZWQnIHRpdGxlPSdcIiArIG1vZGlmaWVkU3RyaW5nICsgXCInPlwiICsgbW9kaWZpZWRGcm9tTm93ICsgXCI8L3NwYW4+XFxuPC9kaXY+XCI7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X29yZ2FuaXphdGlvbl9uYW1lXCIpLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm5hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfbmFtZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciBhZ2VudF92aWV3LCBjY192aWV3LCBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzLCBwcmlvcml0eUljb25DbGFzcywgcHJpb3JpdHlWYWx1ZSwgcmVmLCByZWYxLCBzdGVwX2N1cnJlbnRfbmFtZV92aWV3LCB1bnJlYWQ7XG4gICAgICAgICAgY2NfdmlldyA9IFwiXCI7XG4gICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiXCI7XG4gICAgICAgICAgaWYgKGRvYy5pc19jYyAmJiAhKChyZWYgPSBkb2MuaW5ib3hfdXNlcnMpICE9IG51bGwgPyByZWYuaW5jbHVkZXMoTWV0ZW9yLnVzZXJJZCgpKSA6IHZvaWQgMCkgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhZ2VudF92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmFnZW50X3VzZXJfbmFtZSkge1xuICAgICAgICAgICAgYWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICB1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZVxuICAgICAgICAgICAgfSkgKyBcIik8L2xhYmVsPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bnJlYWQgPSAnJztcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+JztcbiAgICAgICAgICB9IGVsc2UgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwiXCI7XG4gICAgICAgICAgcHJpb3JpdHlWYWx1ZSA9IChyZWYxID0gZG9jLnZhbHVlcykgIT0gbnVsbCA/IHJlZjEucHJpb3JpdHkgOiB2b2lkIDA7XG4gICAgICAgICAgc3dpdGNoIChwcmlvcml0eVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwi54m55oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi57Sn5oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIuWKnuaWh1wiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaW9yaXR5SWNvbkNsYXNzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS1cIiArIHByaW9yaXR5SWNvbkNsYXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+XCIgKyB1bnJlYWQgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgXCIgKyBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzICsgXCInPlwiICsgZG9jLm5hbWUgKyBjY192aWV3ICsgYWdlbnRfdmlldyArIFwiPC9kaXY+XCI7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiYXBwbGljYW50X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfYXBwbGljYW50X25hbWVcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3VibWl0X2RhdGVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3VibWl0X2RhdGVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jLnN1Ym1pdF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5zdWJtaXRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmxvd19uYW1lXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX2Zsb3dcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiY3VycmVudF9zdGVwX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RlcF9jdXJyZW50X25hbWVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgY2NfdGFnLCBqdWRnZSwgc3RlcF9jdXJyZW50X25hbWU7XG4gICAgICAgICAgaWYgKGRvYy5zdGF0ZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAganVkZ2UgPSBkb2MuZmluYWxfZGVjaXNpb24gfHwgXCJhcHByb3ZlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5jdXJyZW50X3N0ZXBfbmFtZSB8fCAnJztcbiAgICAgICAgICBjY190YWcgPSAnJztcbiAgICAgICAgICBpZiAoZG9jLmNjX2NvdW50ID4gMCkge1xuICAgICAgICAgICAgY2NfdGFnID0gVEFQaTE4bi5fXygnY2NfdGFnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9XFxcInN0ZXAtY3VycmVudC1zdGF0ZSBcIiArIGp1ZGdlICsgXCJcXFwiPlwiICsgc3RlcF9jdXJyZW50X25hbWUgKyBjY190YWcgKyBcIjwvZGl2PlwiO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm1vZGlmaWVkXCIsXG4gICAgICAgIHRpdGxlOiB0KFwiaW5zdGFuY2VzX21vZGlmaWVkXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgcmV0dXJuIG1vbWVudChkb2MubW9kaWZpZWQpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwic3RhcnRfZGF0ZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdGFydF9kYXRlXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5zdGFydF9kYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KGRvYy5zdGFydF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJteV9maW5pc2hfZGF0ZVwiLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgaWYgKGRvYy5teV9maW5pc2hfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2MubXlfZmluaXNoX2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcIm1vZGlmaWVkXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwia2V5d29yZHNcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJpc19hcmNoaXZlZFwiLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICBpZiAoKGRvYyAhPSBudWxsID8gKHJlZiA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYucmVjb3JkX25lZWQgOiB2b2lkIDAgOiB2b2lkIDApICYmIGRvYy52YWx1ZXMucmVjb3JkX25lZWQgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICBpZiAoZG9jICE9IG51bGwgPyBkb2MuaXNfYXJjaGl2ZWQgOiB2b2lkIDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQoXCJZRVNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdChcIk5PXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH1cbiAgICBdLFxuICAgIGRvbTogKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICByZXR1cm4gJ3RwJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAndHBsJztcbiAgICAgIH1cbiAgICB9KSgpLFxuICAgIG9yZGVyOiBbWzQsIFwiZGVzY1wiXV0sXG4gICAgZXh0cmFGaWVsZHM6IFtcImZvcm1cIiwgXCJmbG93XCIsIFwiaW5ib3hfdXNlcnNcIiwgXCJzdGF0ZVwiLCBcInNwYWNlXCIsIFwiYXBwbGljYW50XCIsIFwiZm9ybV92ZXJzaW9uXCIsIFwiZmxvd192ZXJzaW9uXCIsIFwiaXNfY2NcIiwgXCJjY19jb3VudFwiLCBcImlzX3JlYWRcIiwgXCJjdXJyZW50X3N0ZXBfbmFtZVwiLCBcInZhbHVlc1wiLCBcImtleXdvcmRzXCIsIFwiZmluYWxfZGVjaXNpb25cIiwgXCJmbG93X25hbWVcIiwgXCJpc19oaWRkZW5cIiwgXCJhZ2VudF91c2VyX25hbWVcIl0sXG4gICAgbGVuZ3RoQ2hhbmdlOiB0cnVlLFxuICAgIGxlbmd0aE1lbnU6IFsxMCwgMTUsIDIwLCAyNSwgNTAsIDEwMF0sXG4gICAgcGFnZUxlbmd0aDogMTAsXG4gICAgaW5mbzogZmFsc2UsXG4gICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgIHJlc3BvbnNpdmU6IHtcbiAgICAgIGRldGFpbHM6IGZhbHNlXG4gICAgfSxcbiAgICBhdXRvV2lkdGg6IGZhbHNlLFxuICAgIGNoYW5nZVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvciwgdXNlcklkKSB7XG4gICAgICB2YXIgcmVmLCBzcGFjZSwgc3BhY2VfdXNlcjtcbiAgICAgIGlmICghdXNlcklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2UgPSBzZWxlY3Rvci5zcGFjZTtcbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgaWYgKChzZWxlY3RvciAhPSBudWxsID8gKHJlZiA9IHNlbGVjdG9yLiRhbmQpICE9IG51bGwgPyByZWYubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSA+IDApIHtcbiAgICAgICAgICBzcGFjZSA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3BhY2U6IHNwYWNlXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghc3BhY2VfdXNlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9LFxuICAgIHBhZ2luZ1R5cGU6IFwibnVtYmVyc1wiXG4gIH07XG4gIGlmIChmbG93SWQpIHtcbiAgICBrZXkgPSBcImluc3RhbmNlRmxvd1wiICsgZmxvd0lkO1xuICAgIG9wdGlvbnMubmFtZSA9IGtleTtcbiAgICBUYWJ1bGFyVGFibGVzLmluc3RhbmNlcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgaW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzKFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VzLmZpZWxkcyk7XG4gICAgaW5zX2ZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGYpIHtcbiAgICAgIGlmIChmLnR5cGUgIT09ICd0YWJsZScgJiYgZi5pc19saXN0X2Rpc3BsYXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBkYXRhOiBmLm5hbWUgfHwgZi5jb2RlLFxuICAgICAgICAgIHRpdGxlOiB0KGYubmFtZSB8fCBmLmNvZGUpLFxuICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgICAgdmFyIHZhbHVlLCB2YWx1ZXM7XG4gICAgICAgICAgICB2YWx1ZXMgPSBkb2MudmFsdWVzIHx8IHt9O1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbZi5jb2RlXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLm5hbWUgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZS5mdWxsbmFtZSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdkYXRlVGltZSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbWVudCh2YWx1ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfeWVzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IFRBUGkxOG4uX18oXCJmb3JtX2ZpZWxkX2NoZWNrYm94X25vXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnb2RhdGEnOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfLnBsdWNrKHZhbHVlLCAnQGxhYmVsJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbJ0BsYWJlbCddO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIgPSBmdW5jdGlvbihmbG93SWQsIGZpZWxkcykge1xuICB2YXIgaW5zX2ZpZWxkcywga2V5LCBvcHRpb25zO1xuICBvcHRpb25zID0ge1xuICAgIG5hbWU6IFwiaW5zdGFuY2VfdGFza3NcIixcbiAgICBjb2xsZWN0aW9uOiBkYi5pbnN0YW5jZV90YXNrcyxcbiAgICBwdWI6IFwiaW5zdGFuY2VfdGFza3NfdGFidWxhclwiLFxuICAgIG9uVW5sb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBNZXRlb3Iuc2V0VGltZW91dChUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll90YWJsZUNvbHVtbnMsIDE1MCk7XG4gICAgfSxcbiAgICBkcmF3Q2FsbGJhY2s6IGZ1bmN0aW9uKHNldHRpbmdzKSB7XG4gICAgICB2YXIgZWxsaXBzaXNMaW5rLCBlbXB0eVRkLCB0aXRsZTtcbiAgICAgIGVtcHR5VGQgPSAkKFwiLmRhdGFUYWJsZXNfZW1wdHlcIik7XG4gICAgICBpZiAoZW1wdHlUZC5sZW5ndGgpIHtcbiAgICAgICAgZW1wdHlUZFswXS5jb2xTcGFuID0gXCI2XCI7XG4gICAgICB9XG4gICAgICBpZiAoIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc1BhZCgpKSB7XG4gICAgICAgIE1ldGVvci5zZXRUaW1lb3V0KFRlbXBsYXRlLmluc3RhbmNlX2xpc3QuX3RhYmxlQ29sdW1ucywgMTUwKTtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKS5yZWFkeShmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gJChcIi5pbnN0YW5jZS1saXN0XCIpLnBlcmZlY3RTY3JvbGxiYXIoXCJ1cGRhdGVcIik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJChcIi5pbnN0YW5jZS1saXN0XCIpLnNjcm9sbFRvcCgwKTtcbiAgICAgIH1cbiAgICAgIHRpdGxlID0gdChcInBhZ2VyX2lucHV0X2hpbnRcIik7XG4gICAgICBlbGxpcHNpc0xpbmsgPSBzZXR0aW5ncy5vSW5zdGFuY2UucGFyZW50KCkuZmluZCgnLnBhZ2luZ19udW1iZXJzIC5wYWdpbmF0aW9uIC5kaXNhYmxlZCBhJyk7XG4gICAgICByZXR1cm4gZWxsaXBzaXNMaW5rLmF0dHIoXCJ0aXRsZVwiLCB0aXRsZSkuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKS5jbGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGdvUGFnZSwgaW5wdXQ7XG4gICAgICAgIGlmICghJCh0aGlzKS5maW5kKCdpbnB1dCcpLmxlbmd0aCkge1xuICAgICAgICAgIGlucHV0ID0gJCgnPGlucHV0IGNsYXNzPVwicGFnaW5hdGVfaW5wdXQgZm9ybS1jb250cm9sIGlucHV0LXNtXCIgdHlwZT1cInRleHRcIiBzdHlsZT1cImJvcmRlcjogbm9uZTsgcGFkZGluZzowIDJweDtcIi8+Jyk7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMjBweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQuY3NzKHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiNTJweFwiLFxuICAgICAgICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5wdXQuYXR0cihcInRpdGxlXCIsIHRpdGxlKS5hdHRyKFwicGxhY2Vob2xkZXJcIiwgdGl0bGUpO1xuICAgICAgICAgICQodGhpcykuZW1wdHkoKS5hcHBlbmQoaW5wdXQpO1xuICAgICAgICAgIGdvUGFnZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgcGFnZXM7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgIHBhZ2VzID0gTWF0aC5jZWlsKHNldHRpbmdzLmZuUmVjb3Jkc0Rpc3BsYXkoKSAvIHNldHRpbmdzLl9pRGlzcGxheUxlbmd0aCk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IHBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBwYWdlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Mub0luc3RhbmNlLkRhdGFUYWJsZSgpLnBhZ2UoaW5kZXgpLmRyYXcoJ3BhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlucHV0LmJsdXIoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAgICAgZ29QYWdlKGN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIHJldHVybiAkKHRoaXMpLnBhcmVudCgpLmh0bWwoJy4uLicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBpbnB1dC5rZXlkb3duKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UGFnZTtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUudG9TdHJpbmcoKSA9PT0gXCIxM1wiKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gJCh0aGlzKS52YWwoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdvUGFnZShjdXJyZW50UGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlZFJvdzogZnVuY3Rpb24ocm93LCBkYXRhLCBkYXRhSW5kZXgpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgaWYgKGRhdGEuaW5zdGFuY2UgPT09IEZsb3dSb3V0ZXIuY3VycmVudCgpLnBhcmFtcy5pbnN0YW5jZUlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInNlbGVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIGRhdGE6IFwiX2lkXCIsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2UsXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgYWdlbnRfdmlldywgY2NfdmlldywgZmxvd19uYW1lLCBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzLCBtb2RpZmllZCwgbW9kaWZpZWRGcm9tTm93LCBtb2RpZmllZFN0cmluZywgcHJpb3JpdHlJY29uLCBwcmlvcml0eUljb25DbGFzcywgcHJpb3JpdHlWYWx1ZSwgcmVmLCBzdGVwX2N1cnJlbnRfbmFtZV92aWV3LCB1bnJlYWQ7XG4gICAgICAgICAgbW9kaWZpZWRTdHJpbmcgPSBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICBtb2RpZmllZCA9IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmluc3RhbmNlX3N0YXRlICE9PSAnZHJhZnQnKSB7XG4gICAgICAgICAgICBtb2RpZmllZCA9IGRvYy5zdGFydF9kYXRlIHx8IGRvYy5tb2RpZmllZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnb3V0Ym94Jykge1xuICAgICAgICAgICAgbW9kaWZpZWQgPSBkb2Muc3VibWl0X2RhdGUgfHwgZG9jLm1vZGlmaWVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb2RpZmllZEZyb21Ob3cgPSBTdGVlZG9zLm1vbWVudFJlYWN0aXZlRnJvbU5vdyhtb2RpZmllZCk7XG4gICAgICAgICAgZmxvd19uYW1lID0gZG9jLmZsb3dfbmFtZTtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLnR5cGUgPT09ICdjYycgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcpIHtcbiAgICAgICAgICAgIGNjX3ZpZXcgPSBcIjxsYWJlbCBjbGFzcz0nY2MtbGFiZWwnPihcIiArIFRBUGkxOG4uX18oXCJpbnN0YW5jZV9jY190aXRsZVwiKSArIFwiKTwvbGFiZWw+IFwiO1xuICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLnN0ZXBfbmFtZSArIFwiKTwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvYy5zdGVwX25hbWUpIHtcbiAgICAgICAgICAgICAgc3RlcF9jdXJyZW50X25hbWVfdmlldyA9IFwiPGRpdiBjbGFzcz0nZmxvdy1uYW1lJz5cIiArIGZsb3dfbmFtZSArIFwiPHNwYW4+KFwiICsgZG9jLnN0ZXBfbmFtZSArIFwiKTwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcgPSBcIjxkaXYgY2xhc3M9J2Zsb3ctbmFtZSc+XCIgKyBmbG93X25hbWUgKyBcIjwvZGl2PlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZ2VudF92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmFnZW50X3VzZXJfbmFtZSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgYWdlbnRfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXygncHJvY2Vzc19kZWxlZ2F0aW9uX3J1bGVzX2Rlc2NyaXB0aW9uJywge1xuICAgICAgICAgICAgICB1c2VyTmFtZTogZG9jLmFnZW50X3VzZXJfbmFtZVxuICAgICAgICAgICAgfSkgKyBcIik8L2xhYmVsPlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bnJlYWQgPSAnJztcbiAgICAgICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdpbmJveCcgJiYgZG9jLmlzX3JlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJpb24gaW9uLXJlY29yZCB1bnJlYWRcIj48L2k+JztcbiAgICAgICAgICB9IGVsc2UgaWYgKFNlc3Npb24uZ2V0KFwiYm94XCIpID09PSAnbW9uaXRvcicgJiYgZG9jLmlzX2hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdW5yZWFkID0gJzxpIGNsYXNzPVwiZmEgZmEtbG9ja1wiPjwvaT4nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmlvcml0eUljb24gPSBcIlwiO1xuICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eVZhbHVlID0gKHJlZiA9IGRvYy52YWx1ZXMpICE9IG51bGwgPyByZWYucHJpb3JpdHkgOiB2b2lkIDA7XG4gICAgICAgICAgc3dpdGNoIChwcmlvcml0eVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwi54m55oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi57Sn5oClXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIuWKnuaWh1wiOlxuICAgICAgICAgICAgICBwcmlvcml0eUljb25DbGFzcyA9IFwibXV0ZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByaW9yaXR5SWNvbkNsYXNzKSB7XG4gICAgICAgICAgICBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzID0gXCJjb2xvci1wcmlvcml0eSBjb2xvci1wcmlvcml0eS1cIiArIHByaW9yaXR5SWNvbkNsYXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPSdpbnN0YW5jZS1yZWFkLWJhcic+XCIgKyB1bnJlYWQgKyBcIjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLW5hbWUgXCIgKyBpbnN0YW5jZU5hbWVQcmlvcml0eUNsYXNzICsgXCInPlwiICsgZG9jLmluc3RhbmNlX25hbWUgKyBjY192aWV3ICsgYWdlbnRfdmlldyArIFwiXFxuXHQ8c3Bhbj5cIiArIGRvYy5hcHBsaWNhbnRfbmFtZSArIFwiPC9zcGFuPlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9J2luc3RhbmNlLWRldGFpbCc+XCIgKyBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ICsgXCJcXG5cdDxzcGFuIGNsYXNzPSdpbnN0YW5jZS1tb2RpZmllZCcgdGl0bGU9J1wiICsgbW9kaWZpZWRTdHJpbmcgKyBcIic+XCIgKyBtb2RpZmllZEZyb21Ob3cgKyBcIjwvc3Bhbj5cXG48L2Rpdj5cIjtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImFwcGxpY2FudF9vcmdhbml6YXRpb25fbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfb3JnYW5pemF0aW9uX25hbWVcIiksXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiaW5zdGFuY2VfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19uYW1lXCIpLFxuICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgdmFyIGFnZW50X3ZpZXcsIGNjX3ZpZXcsIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MsIHByaW9yaXR5SWNvbkNsYXNzLCBwcmlvcml0eVZhbHVlLCByZWYsIHJlZjEsIHN0ZXBfY3VycmVudF9uYW1lX3ZpZXcsIHVucmVhZDtcbiAgICAgICAgICBjY192aWV3ID0gXCJcIjtcbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZV92aWV3ID0gXCJcIjtcbiAgICAgICAgICBpZiAoZG9jLmlzX2NjICYmICEoKHJlZiA9IGRvYy5pbmJveF91c2VycykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyhNZXRlb3IudXNlcklkKCkpIDogdm9pZCAwKSAmJiBTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94Jykge1xuICAgICAgICAgICAgY2NfdmlldyA9IFwiPGxhYmVsIGNsYXNzPSdjYy1sYWJlbCc+KFwiICsgVEFQaTE4bi5fXyhcImluc3RhbmNlX2NjX3RpdGxlXCIpICsgXCIpPC9sYWJlbD4gXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFnZW50X3ZpZXcgPSBcIlwiO1xuICAgICAgICAgIGlmIChkb2MuYWdlbnRfdXNlcl9uYW1lKSB7XG4gICAgICAgICAgICBhZ2VudF92aWV3ID0gXCI8bGFiZWwgY2xhc3M9J2NjLWxhYmVsJz4oXCIgKyBUQVBpMThuLl9fKCdwcm9jZXNzX2RlbGVnYXRpb25fcnVsZXNfZGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBkb2MuYWdlbnRfdXNlcl9uYW1lXG4gICAgICAgICAgICB9KSArIFwiKTwvbGFiZWw+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVucmVhZCA9ICcnO1xuICAgICAgICAgIGlmIChTZXNzaW9uLmdldChcImJveFwiKSA9PT0gJ2luYm94JyAmJiBkb2MuaXNfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVucmVhZCA9ICc8aSBjbGFzcz1cImlvbiBpb24tcmVjb3JkIHVucmVhZFwiPjwvaT4nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoU2Vzc2lvbi5nZXQoXCJib3hcIikgPT09ICdtb25pdG9yJyAmJiBkb2MuaXNfaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgICB1bnJlYWQgPSAnPGkgY2xhc3M9XCJmYSBmYS1sb2NrXCI+PC9pPic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJcIjtcbiAgICAgICAgICBwcmlvcml0eVZhbHVlID0gKHJlZjEgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmMS5wcmlvcml0eSA6IHZvaWQgMDtcbiAgICAgICAgICBzd2l0Y2ggKHByaW9yaXR5VmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCLnibnmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcImRhbmdlclwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLntKfmgKVcIjpcbiAgICAgICAgICAgICAgcHJpb3JpdHlJY29uQ2xhc3MgPSBcIndhcm5pbmdcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwi5Yqe5paHXCI6XG4gICAgICAgICAgICAgIHByaW9yaXR5SWNvbkNsYXNzID0gXCJtdXRlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJpb3JpdHlJY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgPSBcImNvbG9yLXByaW9yaXR5IGNvbG9yLXByaW9yaXR5LVwiICsgcHJpb3JpdHlJY29uQ2xhc3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBcIjxkaXYgY2xhc3M9J2luc3RhbmNlLXJlYWQtYmFyJz5cIiArIHVucmVhZCArIFwiPC9kaXY+XFxuPGRpdiBjbGFzcz0naW5zdGFuY2UtbmFtZSBcIiArIGluc3RhbmNlTmFtZVByaW9yaXR5Q2xhc3MgKyBcIic+XCIgKyBkb2MuaW5zdGFuY2VfbmFtZSArIGNjX3ZpZXcgKyBhZ2VudF92aWV3ICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJhcHBsaWNhbnRfbmFtZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19hcHBsaWNhbnRfbmFtZVwiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdWJtaXRfZGF0ZVwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19zdWJtaXRfZGF0ZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2Muc3VibWl0X2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLnN1Ym1pdF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJmbG93X25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfZmxvd1wiKSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJzdGVwX25hbWVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RlcF9jdXJyZW50X25hbWVcIiksXG4gICAgICAgIHJlbmRlcjogZnVuY3Rpb24odmFsLCB0eXBlLCBkb2MpIHtcbiAgICAgICAgICB2YXIgY2NfdGFnLCBqdWRnZSwgc3RlcF9jdXJyZW50X25hbWU7XG4gICAgICAgICAgaWYgKGRvYy5pbnN0YW5jZV9zdGF0ZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAganVkZ2UgPSBkb2MuanVkZ2UgfHwgXCJhcHByb3ZlZFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwX2N1cnJlbnRfbmFtZSA9IGRvYy5zdGVwX25hbWUgfHwgJyc7XG4gICAgICAgICAgY2NfdGFnID0gJyc7XG4gICAgICAgICAgaWYgKGRvYy5jY19jb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNjX3RhZyA9IFRBUGkxOG4uX18oJ2NjX3RhZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCI8ZGl2IGNsYXNzPVxcXCJzdGVwLWN1cnJlbnQtc3RhdGUgXCIgKyBqdWRnZSArIFwiXFxcIj5cIiArIHN0ZXBfY3VycmVudF9uYW1lICsgY2NfdGFnICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJtb2RpZmllZFwiLFxuICAgICAgICB0aXRsZTogdChcImluc3RhbmNlc19tb2RpZmllZFwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLm1vZGlmaWVkKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIG9yZGVyYWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcInN0YXJ0X2RhdGVcIixcbiAgICAgICAgdGl0bGU6IHQoXCJpbnN0YW5jZXNfc3RhcnRfZGF0ZVwiKSxcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2Muc3RhcnRfZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChkb2Muc3RhcnRfZGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgb3JkZXJhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiZmluaXNoX2RhdGVcIixcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2MuZmluaXNoX2RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZG9jLmZpbmlzaF9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogXCJtb2RpZmllZFwiLFxuICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiBcImtleXdvcmRzXCIsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6IFwiaXNfYXJjaGl2ZWRcIixcbiAgICAgICAgcmVuZGVyOiBmdW5jdGlvbih2YWwsIHR5cGUsIGRvYykge1xuICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgaWYgKChkb2MgIT0gbnVsbCA/IChyZWYgPSBkb2MudmFsdWVzKSAhPSBudWxsID8gcmVmLnJlY29yZF9uZWVkIDogdm9pZCAwIDogdm9pZCAwKSAmJiBkb2MudmFsdWVzLnJlY29yZF9uZWVkID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsID8gZG9jLmlzX2FyY2hpdmVkIDogdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0KFwiWUVTXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHQoXCJOT1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9XG4gICAgXSxcbiAgICBkb206IChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICd0cCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ3RwbCc7XG4gICAgICB9XG4gICAgfSkoKSxcbiAgICBvcmRlcjogW1s0LCBcImRlc2NcIl1dLFxuICAgIGV4dHJhRmllbGRzOiBbXCJpbnN0YW5jZVwiLCBcImZvcm1cIiwgXCJmbG93XCIsIFwiaW5ib3hfdXNlcnNcIiwgXCJpbnN0YW5jZV9zdGF0ZVwiLCBcInNwYWNlXCIsIFwiYXBwbGljYW50XCIsIFwiZm9ybV92ZXJzaW9uXCIsIFwiZmxvd192ZXJzaW9uXCIsIFwidHlwZVwiLCBcImlzX3JlYWRcIiwgXCJzdGVwX25hbWVcIiwgXCJ2YWx1ZXNcIiwgXCJrZXl3b3Jkc1wiLCBcImZpbmFsX2RlY2lzaW9uXCIsIFwiZmxvd19uYW1lXCIsIFwiaXNfaGlkZGVuXCIsIFwiYWdlbnRfdXNlcl9uYW1lXCJdLFxuICAgIGxlbmd0aENoYW5nZTogdHJ1ZSxcbiAgICBsZW5ndGhNZW51OiBbMTAsIDE1LCAyMCwgMjUsIDUwLCAxMDBdLFxuICAgIHBhZ2VMZW5ndGg6IDEwLFxuICAgIGluZm86IGZhbHNlLFxuICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICByZXNwb25zaXZlOiB7XG4gICAgICBkZXRhaWxzOiBmYWxzZVxuICAgIH0sXG4gICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICBjaGFuZ2VTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IsIHVzZXJJZCkge1xuICAgICAgdmFyIHJlZiwgc3BhY2UsIHNwYWNlX3VzZXI7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlID0gc2VsZWN0b3Iuc3BhY2U7XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHNwYWNlOiBzcGFjZVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXNwYWNlX3VzZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgfSxcbiAgICBwYWdpbmdUeXBlOiBcIm51bWJlcnNcIlxuICB9O1xuICBpZiAoZmxvd0lkKSB7XG4gICAga2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGZsb3dJZDtcbiAgICBvcHRpb25zLm5hbWUgPSBrZXk7XG4gICAgVGFidWxhclRhYmxlcy5pbnN0YW5jZV90YXNrcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgaW5zX2ZpZWxkcyA9IF9oYW5kbGVMaXN0RmllbGRzKFRhYnVsYXJUYWJsZXMuaW5zdGFuY2VfdGFza3MuZmllbGRzKTtcbiAgICBpbnNfZmllbGRzLmZvckVhY2goZnVuY3Rpb24oZikge1xuICAgICAgaWYgKGYudHlwZSAhPT0gJ3RhYmxlJyAmJiBmLmlzX2xpc3RfZGlzcGxheSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgIGRhdGE6IGYubmFtZSB8fCBmLmNvZGUsXG4gICAgICAgICAgdGl0bGU6IHQoZi5uYW1lIHx8IGYuY29kZSksXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKHZhbCwgdHlwZSwgZG9jKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUsIHZhbHVlcztcbiAgICAgICAgICAgIHZhbHVlcyA9IGRvYy52YWx1ZXMgfHwge307XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tmLmNvZGVdO1xuICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAndXNlcic6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUubmFtZSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZ3JvdXAnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmZ1bGxuYW1lIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2RhdGVUaW1lJzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tZW50KHZhbHVlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBUQVBpMThuLl9fKFwiZm9ybV9maWVsZF9jaGVja2JveF95ZXNcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVEFQaTE4bi5fXyhcImZvcm1fZmllbGRfY2hlY2tib3hfbm9cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdvZGF0YSc6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF8ucGx1Y2sodmFsdWUsICdAbGFiZWwnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsnQGxhYmVsJ107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgVGFidWxhclRhYmxlcy5pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZShpbnN0YW5jZXNMaXN0VGFibGVUYWJ1bGFyKCkpO1xuICBUYWJ1bGFyVGFibGVzLmluc3RhbmNlX3Rhc2tzID0gbmV3IFRhYnVsYXIuVGFibGUoaW5zdGFuY2VUYXNrc0xpc3RUYWJsZVRhYnVsYXIoKSk7XG4gIFRhYnVsYXJUYWJsZXMuaW5ib3hfaW5zdGFuY2VzID0gbmV3IFRhYnVsYXIuVGFibGUoR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMoXCJpbmJveFwiKSk7XG4gIHJldHVybiBUYWJ1bGFyVGFibGVzLm91dGJveF9pbnN0YW5jZXMgPSBuZXcgVGFidWxhci5UYWJsZShHZXRCb3hJbnN0YW5jZXNUYWJ1bGFyT3B0aW9ucyhcIm91dGJveFwiKSk7XG59KTtcblxuR2V0Qm94SW5zdGFuY2VzVGFidWxhck9wdGlvbnMgPSBmdW5jdGlvbihib3gsIGZsb3dJZCwgZmllbGRzKSB7XG4gIHZhciBrZXksIG9wdGlvbnM7XG4gIGtleSA9IFwiaW5zdGFuY2VGbG93XCIgKyBib3ggKyBmbG93SWQ7XG4gIGlmIChib3ggPT09IFwiaW5ib3hcIikge1xuICAgIG9wdGlvbnMgPSBfZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMoZmxvd0lkLCBmaWVsZHMpO1xuICB9IGVsc2UgaWYgKGJveCA9PT0gXCJvdXRib3hcIikge1xuICAgIG9wdGlvbnMgPSBfZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zKGZsb3dJZCwgZmllbGRzKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gaW5zdGFuY2VzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcyk7XG4gICAgaWYgKCFmbG93SWQpIHtcbiAgICAgIG9wdGlvbnMubmFtZSA9IFwiaW5ib3hfaW5zdGFuY2VzXCI7XG4gICAgfVxuICB9XG4gIGlmIChmbG93SWQpIHtcbiAgICBvcHRpb25zLm5hbWUgPSBrZXk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5fZ2V0X2luYm94X2luc3RhbmNlc190YWJ1bGFyX29wdGlvbnMgPSBmdW5jdGlvbihmbG93SWQsIGZpZWxkcykge1xuICB2YXIgb3B0aW9ucztcbiAgb3B0aW9ucyA9IGluc3RhbmNlVGFza3NMaXN0VGFibGVUYWJ1bGFyKGZsb3dJZCwgZmllbGRzKTtcbiAgaWYgKCFmbG93SWQpIHtcbiAgICBvcHRpb25zLm5hbWUgPSBcImluYm94X2luc3RhbmNlc1wiO1xuICB9XG4gIG9wdGlvbnMub3JkZXIgPSBbWzgsIFwiZGVzY1wiXV07XG4gIG9wdGlvbnMuZ2V0U29ydCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBzb3J0KSB7XG4gICAgY29uc29sZS5sb2coJ2luYm94X2luc3RhbmNlczonLCBzb3J0KTtcbiAgICByZXR1cm4gc29ydDtcbiAgfTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5fZ2V0X291dGJveF9pbnN0YW5jZXNfdGFidWxhcl9vcHRpb25zID0gZnVuY3Rpb24oZmxvd0lkLCBmaWVsZHMpIHtcbiAgdmFyIG9wdGlvbnM7XG4gIG9wdGlvbnMgPSBpbnN0YW5jZVRhc2tzTGlzdFRhYmxlVGFidWxhcihmbG93SWQsIGZpZWxkcyk7XG4gIGlmICghZmxvd0lkKSB7XG4gICAgb3B0aW9ucy5uYW1lID0gXCJvdXRib3hfaW5zdGFuY2VzXCI7XG4gIH1cbiAgb3B0aW9ucy5vcmRlciA9IFtbOSwgLTFdXTtcbiAgb3B0aW9ucy5nZXRTb3J0ID0gZnVuY3Rpb24oc2VsZWN0b3IsIHNvcnQpIHtcbiAgICBjb25zb2xlLmxvZygnb3V0Ym94X2luc3RhbmNlczonLCBzb3J0KTtcbiAgICByZXR1cm4gc29ydDtcbiAgfTtcbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIFRhYnVsYXJUYWJsZXMuZmxvd0luc3RhbmNlcyA9IG5ldyBSZWFjdGl2ZVZhcigpO1xufVxuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFRyYWNrZXIuYXV0b3J1bihmdW5jdGlvbihjKSB7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAhU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICBpZiAoU2Vzc2lvbi5nZXQoXCJmbG93SWRcIikgJiYgU2Vzc2lvbi5nZXQoXCJib3hcIikgIT09ICdkcmFmdCcpIHtcbiAgICAgICAgcmV0dXJuIE1ldGVvci5jYWxsKFwibmV3SW5zdGFuY2VzTGlzdFRhYnVsYXJcIiwgU2Vzc2lvbi5nZXQoXCJib3hcIiksIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgbmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIoU2Vzc2lvbi5nZXQoXCJib3hcIiksIFNlc3Npb24uZ2V0KFwiZmxvd0lkXCIpLCByZXN1bHQpO1xuICAgICAgICAgIHJldHVybiBUZW1wbGF0ZS5pbnN0YW5jZV9saXN0Ll9jaGFuZ2VPcmRlcigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufSk7XG5cbm5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyID0gZnVuY3Rpb24oYm94LCBmbG93SWQsIGZpZWxkcykge1xuICB2YXIgZmxvdywga2V5LCByZWYsIHJlZjEsIHJlZjI7XG4gIGlmICghZmllbGRzKSB7XG4gICAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBmbG93SWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgZm9ybTogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGZpZWxkcyA9IChyZWYgPSBkYi5mb3Jtcy5maW5kT25lKHtcbiAgICAgIF9pZDogZmxvdyAhPSBudWxsID8gZmxvdy5mb3JtIDogdm9pZCAwXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgICdjdXJyZW50LmZpZWxkcyc6IDFcbiAgICAgIH1cbiAgICB9KSkgIT0gbnVsbCA/IChyZWYxID0gcmVmLmN1cnJlbnQpICE9IG51bGwgPyByZWYxLmZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgfVxuICBmaWVsZHMgPSBfaGFuZGxlTGlzdEZpZWxkcyhmaWVsZHMpO1xuICBpZiAoKGZpZWxkcyAhPSBudWxsID8gKHJlZjIgPSBmaWVsZHMuZmlsdGVyUHJvcGVydHkoXCJpc19saXN0X2Rpc3BsYXlcIiwgdHJ1ZSkpICE9IG51bGwgPyByZWYyLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAga2V5ID0gXCJpbnN0YW5jZUZsb3dcIiArIGJveCArIGZsb3dJZDtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBUYWJ1bGFyVGFibGVzLmZsb3dJbnN0YW5jZXMuc2V0KG5ldyBUYWJ1bGFyLlRhYmxlKEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBUYWJ1bGFyLlRhYmxlKEdldEJveEluc3RhbmNlc1RhYnVsYXJPcHRpb25zKGJveCwgZmxvd0lkLCBmaWVsZHMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGUubG9nKFwibmV3IFRhYnVsYXJUYWJsZXMgXCIsIGtleSk7XG4gIH1cbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLm1ldGhvZHMoe1xuICAgIG5ld0luc3RhbmNlc0xpc3RUYWJ1bGFyOiBmdW5jdGlvbihib3gsIGZsb3dJZCkge1xuICAgICAgdmFyIGZpZWxkcywgZmxvdywgcmVmLCByZWYxO1xuICAgICAgbmV3SW5zdGFuY2VzTGlzdFRhYnVsYXIoYm94LCBmbG93SWQpO1xuICAgICAgZmxvdyA9IGRiLmZsb3dzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IGZsb3dJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBmb3JtOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZmllbGRzID0gKHJlZiA9IGRiLmZvcm1zLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IGZsb3cgIT0gbnVsbCA/IGZsb3cuZm9ybSA6IHZvaWQgMFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAnY3VycmVudC5maWVsZHMnOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSAhPSBudWxsID8gKHJlZjEgPSByZWYuY3VycmVudCkgIT0gbnVsbCA/IHJlZjEuZmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9XG4gIH0pO1xufVxuIl19 diff --git a/server/bundle/programs/server/packages/steedos_workflow.js.map b/server/bundle/programs/server/packages/steedos_workflow.js.map index 6dab2d93a3..ba2f4480e0 100644 --- a/server/bundle/programs/server/packages/steedos_workflow.js.map +++ b/server/bundle/programs/server/packages/steedos_workflow.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/steedos:workflow/checkNpm.js","meteor://💻app/packages/steedos:workflow/lib/URI.js","meteor://💻app/packages/steedos_workflow/lib/core.coffee","meteor://💻app/lib/core.coffee","meteor://💻app/packages/steedos_workflow/lib/models/instance_tasks.coffee","meteor://💻app/packages/steedos_workflow/lib/models/auth_tokens.coffee","meteor://💻app/packages/steedos_workflow/client/lib/instance_readonly_template.coffee","meteor://💻app/client/lib/instance_readonly_template.coffee","meteor://💻app/packages/steedos_workflow/client/lib/template_manager.coffee","meteor://💻app/client/lib/template_manager.coffee","meteor://💻app/packages/steedos:workflow/client/coreform/inputTypes/coreform-table/steedos-table.js","meteor://💻app/packages/steedos_workflow/client/views/instance/_image_sign.coffee","meteor://💻app/client/views/instance/_image_sign.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_traces_handler.coffee","meteor://💻app/client/views/instance/_traces_handler.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_instance_form.coffee","meteor://💻app/client/views/instance/_instance_form.coffee","meteor://💻app/packages/steedos:workflow/client/views/instance/_instance_attachments.js","meteor://💻app/packages/steedos_workflow/client/views/instance/_instance_sign_text.coffee","meteor://💻app/client/views/instance/_instance_sign_text.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_traces_help.coffee","meteor://💻app/client/views/instance/_traces_help.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_related_instances.coffee","meteor://💻app/client/views/instance/_related_instances.coffee","meteor://💻app/packages/steedos_workflow/client/views/instance/_related_records.coffee","meteor://💻app/client/views/instance/_related_records.coffee","meteor://💻app/packages/steedos:workflow/routes/getSpaceUsers.js","meteor://💻app/packages/steedos:workflow/routes/getFormulaUserObjects.js","meteor://💻app/packages/steedos:workflow/routes/init_formula_values.js","meteor://💻app/packages/steedos:workflow/routes/api_workflow_forward.js","meteor://💻app/packages/steedos_workflow/routes/test_webhook.coffee","meteor://💻app/routes/test_webhook.coffee","meteor://💻app/packages/steedos_workflow/server/methods/set_instance_step_approve.coffee","meteor://💻app/packages/steedos:workflow/server/methods/get_instance_data.js","meteor://💻app/packages/steedos:workflow/server/methods/save_instance.js","meteor://💻app/packages/steedos:workflow/server/methods/trace_approve_cc.js","meteor://💻app/packages/steedos:workflow/server/methods/forward_instance.js","meteor://💻app/packages/steedos:workflow/server/methods/cfs_instances.js","meteor://💻app/packages/steedos_workflow/server/methods/instance_approve.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_return.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_remind.coffee","meteor://💻app/packages/steedos_workflow/server/methods/next_step_users_not_found.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_number_rules.coffee","meteor://💻app/packages/steedos_workflow/server/methods/check_main_attach.coffee","meteor://💻app/packages/steedos_workflow/server/methods/related_instances.coffee","meteor://💻app/packages/steedos_workflow/server/methods/edit_flow_positions.coffee","meteor://💻app/packages/steedos_workflow/server/methods/start_flow.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_traces.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_batch.coffee","meteor://💻app/packages/steedos_workflow/server/methods/flow.coffee","meteor://💻app/packages/steedos_workflow/server/methods/hide_instance.coffee","meteor://💻app/packages/steedos_workflow/server/methods/instance_value.coffee","meteor://💻app/packages/steedos_workflow/server/routes/instance.coffee","meteor://💻app/server/routes/instance.coffee","meteor://💻app/packages/steedos_workflow/server/routes/steedos_css.coffee","meteor://💻app/server/routes/steedos_css.coffee","meteor://💻app/packages/steedos_workflow/server/routes/instance_draft_view.coffee","meteor://💻app/server/routes/instance_draft_view.coffee","meteor://💻app/packages/steedos:workflow/server/lib/1_form_formula.js","meteor://💻app/packages/steedos_workflow/server/publications/categories.coffee","meteor://💻app/server/publications/categories.coffee","meteor://💻app/packages/steedos_workflow/server/publications/cfs_instances.coffee","meteor://💻app/server/publications/cfs_instances.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_positions.coffee","meteor://💻app/server/publications/flow_positions.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_positions_tabular.coffee","meteor://💻app/server/publications/flow_positions_tabular.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_roles.coffee","meteor://💻app/server/publications/flow_roles.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flows.coffee","meteor://💻app/server/publications/flows.coffee","meteor://💻app/packages/steedos_workflow/server/publications/forms.coffee","meteor://💻app/server/publications/forms.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_data.coffee","meteor://💻app/server/publications/instance_data.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_list.coffee","meteor://💻app/server/publications/instance_list.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_tabular.coffee","meteor://💻app/server/publications/instance_tabular.coffee","meteor://💻app/packages/steedos_workflow/server/publications/instance_draft.coffee","meteor://💻app/server/publications/instance_draft.coffee","meteor://💻app/packages/steedos_workflow/server/publications/distributed_instances_state_by_ids.coffee","meteor://💻app/server/publications/distributed_instances_state_by_ids.coffee","meteor://💻app/packages/steedos_workflow/server/publications/related_instaces.coffee","meteor://💻app/server/publications/related_instaces.coffee","meteor://💻app/packages/steedos_workflow/server/publications/space_user_signs.coffee","meteor://💻app/server/publications/space_user_signs.coffee","meteor://💻app/packages/steedos_workflow/server/publications/user_inbox_instance.coffee","meteor://💻app/server/publications/user_inbox_instance.coffee","meteor://💻app/packages/steedos_workflow/server/publications/flow_main_attach_template.coffee","meteor://💻app/server/publications/flow_main_attach_template.coffee","meteor://💻app/packages/steedos_workflow/server/flow-template/workflow_template.coffee","meteor://💻app/server/flow-template/workflow_template.coffee","meteor://💻app/packages/steedos_workflow/server/schedule/auto_finish_process_delegation.coffee","meteor://💻app/server/schedule/auto_finish_process_delegation.coffee","meteor://💻app/packages/steedos_workflow/server/schedule/timeout_auto_submit.coffee","meteor://💻app/server/schedule/timeout_auto_submit.coffee","meteor://💻app/packages/steedos_workflow/related_instances_tabular.coffee","meteor://💻app/related_instances_tabular.coffee","meteor://💻app/packages/steedos_workflow/tabular.coffee","meteor://💻app/tabular.coffee"],"names":["checkNpmVersions","module","link","v","root","factory","define","amd","URI","punycode","IPv6","SecondLevelDomains","SLD","_URI","url","base","_urlSupplied","arguments","length","_baseSupplied","undefined","TypeError","location","href","absoluteTo","version","p","prototype","hasOwn","Object","hasOwnProperty","escapeRegEx","string","replace","getType","value","String","toString","call","slice","isArray","obj","filterArrayValues","data","lookup","i","_match","test","splice","arrayContains","list","_type","match","arraysEqual","one","two","sort","l","trimSlashes","text","trim_expression","_parts","protocol","username","password","hostname","urn","port","path","query","fragment","duplicateQueryParameters","escapeQuerySpace","protocol_expression","idn_expression","punycode_expression","ip4_expression","ip6_expression","find_uri_expression","findUri","start","end","trim","defaultPorts","http","https","ftp","gopher","ws","wss","invalid_hostname_characters","domAttributes","getDomAttribute","node","nodeName","toLowerCase","type","escapeForDumbFirefox36","escape","strictEncodeURIComponent","encodeURIComponent","encode","decode","decodeURIComponent","iso8859","unescape","unicode","characters","pathname","expression","map","reserved","urnpath","encodeQuery","escaped","decodeQuery","e","_part","generateAccessor","_group","c","generateSegmentedPathFunction","_sep","_codingFuncName","_innerCodingFuncName","actualCodingFunc","segments","split","join","decodePath","decodeUrnPath","recodePath","recodeUrnPath","encodeReserved","parse","parts","pos","indexOf","substring","parseAuthority","parseHost","bracketPos","t","charAt","firstColon","firstSlash","nextColon","parseUserinfo","lastIndexOf","shift","parseQuery","items","splits","name","push","build","buildAuthority","buildHost","buildUserinfo","buildQuery","unique","key","buildQueryParameter","addQuery","concat","removeQuery","hasQuery","withinArray","_booly","Boolean","op","commonPath","Math","min","withinString","callback","options","_start","_end","_trim","_attributeOpen","lastIndex","exec","index","ignoreHtml","attributeOpen","max","search","ignore","result","ensureValidHostname","toASCII","noConflict","removeAll","unconflicted","URITemplate","deferBuild","_deferred_build","_string","clone","valueOf","generateSimpleAccessor","generatePrefixAccessor","_key","hash","res","_object","attribute","src","is","what","ip","ip4","ip6","sld","idn","relative","has","_protocol","_port","_hostname","scheme","x","origin","authority","host","userinfo","resource","subdomain","domain","sub","RegExp","tld","get","ReferenceError","directory","filename","decodePathSegment","mutatedDirectory","normalizePath","suffix","s","segment","separator","absolute","Error","pop","unshift","segmentCoded","q","setQuery","setSearch","addSearch","removeSearch","hasSearch","normalize","normalizeProtocol","normalizeQuery","normalizeFragment","normalizeHostname","normalizePort","best","_path","_was_relative","_leadingParents","_parent","_pos","normalizePathname","normalizeSearch","normalizeHash","d","readable","uri","toUnicode","qp","kv","resolved","properties","basedir","relativeTo","relativeParts","baseParts","common","relativePath","basePath","parents","equals","one_map","two_map","checked","one_query","two_query","Workflow","ImageSign","TracesHandler","TracesTemplate","InstanceformTemplate","InstanceAttachmentTemplate","InstanceSignText","RelatedInstances","RelatedRecords","InstanceMacro","context","TracesManager","isOpinionField_from_string","field_formula","includesOpinionField","form","form_version","_form_version","field_formulas","fields","Array","Meteor","isServer","uuflowManager","getFormVersion","db","forms","findOne","_id","form_versions","forEach","f","ref","console","log","f1","formula","_","some","helpers","instance_tasks","Collection","_simpleSchema","SimpleSchema","instance","trace","is_finished","user","user_name","handler","handler_name","handler_organization","handler_organization_name","handler_organization_fullname","start_date","Date","due_date","is_read","is_error","values","deadline","remind_date","reminded_count","Number","read_date","description","modified","modified_by","sign_show","judge","next_steps","finish_date","cost_time","space","instance_name","submitter","submitter_name","applicant","applicant_name","applicant_organization_name","submit_date","flow","flow_name","step","step_name","category_name","instance_state","distribute_from_instance","forward_from_instance","keywords","is_archived","category","auth_tokens","_getLocale","_getRequiredFields","_getStartStepEditableFields","_getStartStepRequiredFields","_getTemplateData","_getViewHtml","getLinkText","marked","require","InstanceReadOnlyTemplate","instance_attachment","afSelectUserRead","afFormGroupRead","afFormGroup","create","tempalteName","steedosData","template","templateCompiled","templateRenderFunction","SpacebarsCompiler","compile","isBody","eval","Template","Blaze","createInstanceSignText","instanceSignTextCompiled","instanceSignTextHtml","instanceSignTextRenderFunction","instanceSignText","createImageSign","imageSignCompiled","imageSignHtml","imageSignRenderFunction","imageSign","createTracesHanlder","tracesHanlderCompiled","tracesHanlderHtml","tracesHanlderRenderFunction","instance_traces_handler","init","item","label","detail_url","Steedos","absoluteUrl","getValue","field","locale","utcOffset","date","fieldOptions","hours","month","nameField","records","seconds","selectedOption","selectedOptions","splitedValues","t0","t1","uiSchema","year","n","itemSplits","encodeURI","error","is_multiselect","getProperty","fullname","TAPi18n","__","formatDate","is_textarea","find","filter","is_percent","numberToPercentString","digits","numberToString","isClient","authRequest","JSON","stringify","async","objectFind","filters","fileName","filePreviewHtml","fileUrl","original","Creator","getObject","reference_to","NAME_FIELD_KEY","reference_to_field","getObjectNameFieldKey","getLabel","code","findPropertyByPK","getInstanceFormVersion","form_fields","current","where","historys","getFlowVersion","flow_version","flows","viewHtml","Assets","getText","ref1","toLocaleLowerCase","rev","is_required","steps","editableCode","startStep","keys","permissions","requiredFields","intersection","WorkflowManager","WorkflowManager_format","getAutoformSchemaValues","insname","ins_state","state","ins_final_decision","ins_code","ins_is_archived","ins_is_deleted","applicantContext","sessionUserId","editable","startStepEditableFields","passing","moment","format","getInstanceView","body","instanceCompiled","instanceRenderFunction","instanceTemplate","TemplateManager","getTemplate","templateName","instance_readonly_view","toHTMLWithData","getTracesView","traceCompiled","traceRenderFunction","tracesHtml","instance_style","trace_readonly_view","traces","getAttachmentView","attachmentCompiled","attachmentHtml","attachmentRenderFunction","attachments_readonly_view","getRelatedInstancesView","relatedInstancesCompiled","relatedInstancesHtml","relatedInstancesRenderFunction","related_instances_view","getRelatedRecordsView","relatedRecordsCompiled","relatedRecordsHtml","relatedRecordsRenderFunction","related_records_view","getOnLoadScript","form_script","getInstanceHtml","allCssLink","attachment","creatorService","cssHref","formDescription","formDescriptionHtml","html","ins_record_ids","instanceBoxStyle","jqHref","onLoadScript","openFileScript","related_instances","related_records","showTracesBtn","showTracesScript","traceCheck","width","settings","webservices","creator","record_ids","isMobile","showTrace","final_decision","showAttachments","isEmpty","tagger","styles","plugins","add_styles","formId","instance_title","pageTitle","pageTitleTrClass","val","CoreForm","pageTitleFieldName","handleTableTemplate","_export","table_fields","table_field","field_permission","pureCode","required","title_permission","removeSpecialCharacter","isOpinionField","tr_start","td_colspan","tr_end","includes","permission","_template","table","_templateHelps","steedos_instance","getInstance","atts","id","style","disabled","instanceId","form_types","ApproveManager","isReadOnly","steedos_form","innersubformContext","doc_values","Session","a","b","getAutoformSchema","instance_box_style","box","ins","print_template","instance_template","SteedosTable","checkItem","item_index","fieldObj","getField","fieldVal","getItemModalValue","sf_name","sfields","sf","InstanceManager","checkFormFieldValue","$","setTableItemValue","item_value","tableValue","getTableValue","getTableItemValue","removeTableItem","removed","setTableValue","getValidValue","validValue","handleData","instanceFields","getInstanceFields","getModalData","Form_formula","getFormulaFieldVariable","AutoForm","getFormValues","insertDoc","addItem","_item_value","getKeys","append","getTr","updateItem","tds","getRemoveTd","sfield","getTd","empty","runFormula","removeItem","hide","showModal","method","modalData","setTimeout","Modal","show","getCurrentDataForForm","ss","getFormSchema","schema","objectKeys","_makeGeneric","getThead","isObject","thead","trs","sf_length","wide_fields","filterProperty","is_wide","getTbody","sfieldsEditable","tbody","tr","td","td_value","getTDValue","view","CFDataManager","getFormulaSpaceUsers","u","getFormulaOrganizations","o","getFormulaOrganization","pluck","addInputType","valueOut","valueConverters","stringToStringArray","stringToNumber","stringToNumberArray","stringToBoolean","stringToBooleanArray","stringToDate","stringToDateArray","contextAdjust","maxlength","afTable","events","event","new_item_index","currentTarget","dataset","set","rendered","str","addItemTr","getCurrentStep","step_type","ccHasEditPermission","autorun","currentData","spaceUserSign","userId","space_user_signs","imageURL","sign","showSignImage","traceShowSignImage","objectUrl","object_name","record_id","app_id","getObjectUrl","unempty","unequals","include","ref2","ref3","getInstanceFlowVersion","approves","ref4","approve","judge_name","opinion_fields_code","sign_field_code","after_field","before_field","pre_fields","pre_wide_fields","sort_approve","order","p1","p2","_p1","_p2","getTime","_t","isTextarea","getCfClass","getTableThead","getTableBody","showLabel","templateData","getOpinionFieldStepsName","top_keywords","foo1","opinionFields","foo","json_formula","s1","error1","yijianlan","stepName","image_sign","only_cc_opinion","only_cc","default_description","only_handler","showCCOpinion","markDownToHtml","markDownString","Npm","Spacebars","SafeString","f_label","that","isSection","registerHelper","ins_attach_download_url","getPermissions","instanceformChangeEvent","preventDefault","openWindow","target","onCreated","compiled","instanceCustomTemplate","instanceView","renderFunction","View","instance_custom_template","onRendered","currentApprove","currentStep","formula_fields","instanceNumberFields","setInstanceFormApplicant","nextSteps","nextStepUsers","InstanceEvent","initEvents","getCurrentApprove","each","element","schemaKey","toastr","reason","getFieldValue","InstanceNumberRules","instanceNumberBuilder","trigger","run","showMainTitle","workflowMainAttachTitle","enabled_add_main_attachment","current_step","currentTrace","getCurrentTrace","main_attach_count","cfs","instances","count","distribute_main_attach_count","start_step","getStartStep","can_edit_main_attach","enabled_edit_normal_attachment","getFlow","upload_after_being_distributed","isCC","getCCStep","can_edit_normal_attach","main_attachment","main_attach","normal_attachments","selector","$ne","dfis","distribute_from_instances","$in","distribute_main","firstVersionMain","metadata","parent","attachmentUploadedAt","uploadedAt","firstVersion","sortBy","instanceIds","attachments_count","flow_files","files","isDraftAndFlowfilesExist","compact","attachments","$or","fetch","myApprove","myTrace","isInbox","defaultDescription","approve_sort","approvesGroup","approves_sorted","completed_date","hasNext","haveDescriptionApprove","is_completed","last","top_approves","union","top_approve","groupBy","handlerApproves","descriptionApproves","workflow","showBlankApproveDescription","_display","isMyApprove","myApproveDescription","approveId","now","isOpinionOfField","imageSignData","getLastSignApprove","getHandlerSignShowApproves","lastMyApproveDescription","showApprove","judge_description","is_approved","is_rejected","is_readed","addClass","dateFormat","getFullYear","getStepName","stepId","getInstanceStep","showDeleteButton","approved","from_user","isShowModificationButton","approve_admins","isShow","contains","isEditing","is_editing","isShowDescription","getApproveStatusIcon","approveJudge","autoSubmitted","approveStatusIcon","getApproveStatusText","approveStatusText","getApproveJudgeClass","isForward","showForwardDeleteButton","forward_instance","isDistribute","showDistributeDeleteButton","hasFlowAdminPermission","finishDateSchema","isAndroidOrIOS","autoform","optional","readonly","dateTimePickerOptions","ignoreReadonly","widgetPositioning","horizontal","finishDateValues","showTracesView","show_modal_traces_list","space_settings","getInstanceStateText","instance_id","getInstanceStateColor","cla","firstTrace","last_distribute_from","dis_info","$exists","created","created_by","UUflow_api","getNameForUser","users","from_user_name","isCCOrDistributeOrForwardTerminated","judgeTerminated","instanceExists","agentDescription","userName","traceName","traceId","handlerDoc","handlerId","users_can_read_cc_handler_detail_info","getContactInfoForUser","stopPropagation","calling","err","removeClass","success","allowMultiple","closest","target_user_id","openSafeObjectUrl","forward_space","forwardspace","forwardinstance","Tracker","afterFlush","on","scrollTop","finish_input","opinion_input","showRelatedInstaces","related_instaces","related_instace_url","isCordova","show_delete","showRelatedRecords","relatedRecordUrl","objcetName","ids","process","env","CREATOR_NODE_ENV","JsonRoutes","add","req","next","hashData","action","to_users","sendResult","stack","errors","errorMessage","message","workflowMethods","methods","set_instance_step_approve","ins_id","step_approve","stepsApprovesOptions","apply","set_instance_skip_steps","get_instance_data","formCached","flowCached","draft_save_instance","inbox_save_instance","cc_do","cc_user_ids","cc_read","cc_submit","cc_remove","batch_cancel_cc","approve_ids","cc_save","space_id","flow_id","hasSaveInstanceToAttachment","isForwardAttachments","selectedUsers","action_type","related","from_approve_id","forward_remove","trace_id","approve_id","cancelDistribute","cfs_instances_remove","file_id","cfs_instances_set_current","cfs_instances_lock","user_id","cfs_instances_unlock","download_space_instance_attachments_to_disk","spaceId","cfsRecordIds","set_approve_have_read","change_approve_info","update_approve_sign","sign_type","lastSignApprove","update_sign_show","objs","myApprove_id","instance_return","instance_remind","remind_users","remind_count","remind_deadline","action_types","next_step_users_not_found","deal_type","params","_eval","check_main_attach","remove_related","re_ins_id","update_instance_related","updateFlowPosition","updateFlowRole","start_flow","flowId","get_instance_traces","categoryId","flowIds","get_batch_instances","get_batch_instances_count","get_my_approves","change_flow_state","hide_instance","insId","is_hidden","getInstanceValues","Cookies","getInstanceReadOnly","_hasPermission","_locale","_parent_instances","dataBuf","hide_traces","spaceUserCount","getAPILoginUser","access_token","getUserIdFromAccessToken","spaces","space_users","hasInstancePermissions","_parent_id","_parent_ins","charset","Buffer","setHeader","statusCode","ret_sync_token","spaceUser","spaceUserOrganizations","sync_token","APIAuthenticationCheck","headers","isSpaceAdmin","organizations","canMonitor","canAdmin","$gt","$nin","inbox_uers","cc_users","outbox_users","skip","limit","copies","allCss","WebApp","getRefreshableAssets","css","rootUrl","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","ROOT_URL","endsWith","h","g","m","k","getEach","uniq","mixin","dest","handerUserObject","organization","hr","sort_no","mobile","work_phone","position","userRoles","roles","handerOrgObject","org","init_formula_values","autoFormDoc","approver","__values","tableFields","tableValues","formulaTableValues","__tableValues","tablefield","getFormulaUserObjects","getFormulaOrgObjects","getFormulaUserObject","publish","check","ready","categories","app","flow_positions","role","publishComposite","tableName","Match","Optional","unblock","children","flow_roles","createTemplateFormAndFlow","perms","company_id","distribute_optional_users","distribute_to_self","enable_amisform","versionId","handle","self","latest","observeChanges","changed","added","onStop","stop","flow_ids","distribute_end_notification","allow_select_step","amis_schema","getMiniInstance","getMyapproveModified","instance_fields_0","miniApproveFields","needChange","triggerChangeFields","triggerChangeFieldsValues","myApproveModifieds","_instanceId","_trace","changeFields","_change","_rev","_my_approve_modifieds","isEqual","getInstanceTraces","_insId","inbox_users","asyncLastFinishedApprove","lastFinishedApproveAggregate","instanceid","dataMap","operation","rawCollection","aggregate","toArray","doc","isFunction","wrapAsync","getMyApprove","getMyLastFinishedApprove","getStepCurrentName","notFinishedTraces","agent","stepCurrentName","$slice","myLastFinishedApprove","agent_user_name","my_finish_date","is_cc","cc_count","tabularName","instance_ids","related_instance_ids","_async_get_flow_instances_aggregate","_get_flow_instances_aggregate","_items","$match","$group","$sum","_changeData","_flowsData","_init","dataItem","flow_instance","observe","getCollection","workflowTemplate","startup","absolute_path_cn","absolute_path_us","filesList_cn","filesList_us","fs","mime","path_cn","path_us","readFileList","pathDir","filesList","readdirSync","stat","statSync","isDirectory","workflowTemplates","resolve","existsSync","file","readFileSync","go_next","rule","schedule","cron","auto_finish_process_delegation","scheduleJob","bindEnvironment","time","process_delegation_rules","update","enabled","end_time","$lte","$set","multi","timeEnd","timeout_auto_submit","timeoutAutoSubmit","TabularTables","related_instances_tabular","Tabular","Table","collection","columns","title","orderable","render","input","step_current_name","current_step_name","dom","lengthChange","extraFields","pageLength","info","searching","responsive","details","autoWidth","changeSelector","curSpaceUser","$and","admins","fl","extend","GetBoxInstancesTabularOptions","_get_inbox_instances_tabular_options","_get_outbox_instances_tabular_options","_handleListFields","instanceTasksListTableTabular","instancesListTableTabular","newInstancesListTabular","updateTabularTitle","subs","SubsManager","ins_fields","pub","onUnload","instance_list","_tableColumns","drawCallback","ellipsisLink","emptyTd","colSpan","isPad","perfectScrollbar","oInstance","attr","click","goPage","height","pages","ceil","fnRecordsDisplay","_iDisplayLength","DataTable","page","draw","blur","currentPage","keydown","keyCode","createdRow","row","dataIndex","FlowRouter","setAttribute","agent_view","cc_view","instanceNamePriorityClass","modifiedFromNow","modifiedString","priorityIcon","priorityIconClass","priorityValue","step_current_name_view","unread","momentReactiveFromNow","priority","visible","cc_tag","record_need","lengthMenu","space_user","pagingType","is_list_display","inbox_instances","outbox_instances","getSort","flowInstances","ReactiveVar","_changeOrder"],"mappings":"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;;;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA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","file":"/packages/steedos_workflow.js","sourcesContent":["import { checkNpmVersions } from 'meteor/tmeasday:check-npm-versions';\ncheckNpmVersions({\n\t\"node-schedule\": \"^1.3.1\",\n\t\"xml2js\": \"^0.4.19\",\n}, 'steedos:workflow');","/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.17.0\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n * GPL v3 http://opensource.org/licenses/GPL-3.0\n *\n */\n(function (root, factory) {\n\t'use strict';\n\t// https://github.com/umdjs/umd/blob/master/returnExports.js\n\t// if (typeof exports === 'object') {\n\t// // Node\n\t// module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n\t// } else\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n\t} else {\n\t\t// Browser globals (root is window)\n\t\troot.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n\t}\n}(this, function (punycode, IPv6, SLD, root) {\n\t'use strict';\n\t/*global location, escape, unescape */\n\t// FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n\t/*jshint camelcase: false */\n\n\t// save current URI variable, if any\n\tvar _URI = root && root.URI;\n\n\tfunction URI(url, base) {\n\t\tvar _urlSupplied = arguments.length >= 1;\n\t\tvar _baseSupplied = arguments.length >= 2;\n\n\t\t// Allow instantiation without the 'new' keyword\n\t\tif (!(this instanceof URI)) {\n\t\t\tif (_urlSupplied) {\n\t\t\t\tif (_baseSupplied) {\n\t\t\t\t\treturn new URI(url, base);\n\t\t\t\t}\n\n\t\t\t\treturn new URI(url);\n\t\t\t}\n\n\t\t\treturn new URI();\n\t\t}\n\n\t\tif (url === undefined) {\n\t\t\tif (_urlSupplied) {\n\t\t\t\tthrow new TypeError('undefined is not a valid argument for URI');\n\t\t\t}\n\n\t\t\tif (typeof location !== 'undefined') {\n\t\t\t\turl = location.href + '';\n\t\t\t} else {\n\t\t\t\turl = '';\n\t\t\t}\n\t\t}\n\n\t\tthis.href(url);\n\n\t\t// resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n\t\tif (base !== undefined) {\n\t\t\treturn this.absoluteTo(base);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tURI.version = '1.17.0';\n\n\tvar p = URI.prototype;\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\n\tfunction escapeRegEx(string) {\n\t\t// https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n\t\treturn string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n\t}\n\n\tfunction getType(value) {\n\t\t// IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n\t\tif (value === undefined) {\n\t\t\treturn 'Undefined';\n\t\t}\n\n\t\treturn String(Object.prototype.toString.call(value)).slice(8, -1);\n\t}\n\n\tfunction isArray(obj) {\n\t\treturn getType(obj) === 'Array';\n\t}\n\n\tfunction filterArrayValues(data, value) {\n\t\tvar lookup = {};\n\t\tvar i, length;\n\n\t\tif (getType(value) === 'RegExp') {\n\t\t\tlookup = null;\n\t\t} else if (isArray(value)) {\n\t\t\tfor (i = 0, length = value.length; i < length; i++) {\n\t\t\t\tlookup[value[i]] = true;\n\t\t\t}\n\t\t} else {\n\t\t\tlookup[value] = true;\n\t\t}\n\n\t\tfor (i = 0, length = data.length; i < length; i++) {\n\t\t\t/*jshint laxbreak: true */\n\t\t\tvar _match = lookup && lookup[data[i]] !== undefined\n\t\t\t\t|| !lookup && value.test(data[i]);\n\t\t\t/*jshint laxbreak: false */\n\t\t\tif (_match) {\n\t\t\t\tdata.splice(i, 1);\n\t\t\t\tlength--;\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tfunction arrayContains(list, value) {\n\t\tvar i, length;\n\n\t\t// value may be string, number, array, regexp\n\t\tif (isArray(value)) {\n\t\t\t// Note: this can be optimized to O(n) (instead of current O(m * n))\n\t\t\tfor (i = 0, length = value.length; i < length; i++) {\n\t\t\t\tif (!arrayContains(list, value[i])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvar _type = getType(value);\n\t\tfor (i = 0, length = list.length; i < length; i++) {\n\t\t\tif (_type === 'RegExp') {\n\t\t\t\tif (typeof list[i] === 'string' && list[i].match(value)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else if (list[i] === value) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction arraysEqual(one, two) {\n\t\tif (!isArray(one) || !isArray(two)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// arrays can't be equal if they have different amount of content\n\t\tif (one.length !== two.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tone.sort();\n\t\ttwo.sort();\n\n\t\tfor (var i = 0, l = one.length; i < l; i++) {\n\t\t\tif (one[i] !== two[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfunction trimSlashes(text) {\n\t\tvar trim_expression = /^\\/+|\\/+$/g;\n\t\treturn text.replace(trim_expression, '');\n\t}\n\n\tURI._parts = function() {\n\t\treturn {\n\t\t\tprotocol: null,\n\t\t\tusername: null,\n\t\t\tpassword: null,\n\t\t\thostname: null,\n\t\t\turn: null,\n\t\t\tport: null,\n\t\t\tpath: null,\n\t\t\tquery: null,\n\t\t\tfragment: null,\n\t\t\t// state\n\t\t\tduplicateQueryParameters: URI.duplicateQueryParameters,\n\t\t\tescapeQuerySpace: URI.escapeQuerySpace\n\t\t};\n\t};\n\t// state: allow duplicate query parameters (a=1&a=1)\n\tURI.duplicateQueryParameters = false;\n\t// state: replaces + with %20 (space in query strings)\n\tURI.escapeQuerySpace = true;\n\t// static properties\n\tURI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n\tURI.idn_expression = /[^a-z0-9\\.-]/i;\n\tURI.punycode_expression = /(xn--)/i;\n\t// well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n\tURI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n\t// credits to Rich Brown\n\t// source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n\t// specification: http://www.ietf.org/rfc/rfc4291.txt\n\tURI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n\t// expression used is \"gruber revised\" (@gruber v2) determined to be the\n\t// best solution in a regex-golf we did a couple of ages ago at\n\t// * http://mathiasbynens.be/demo/url-regex\n\t// * http://rodneyrehm.de/t/url-regex.html\n\tURI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n\tURI.findUri = {\n\t\t// valid \"scheme://\" or \"www.\"\n\t\tstart: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n\t\t// everything up to the next whitespace\n\t\tend: /[\\s\\r\\n]|$/,\n\t\t// trim trailing punctuation captured by end RegExp\n\t\ttrim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/\n\t};\n\t// http://www.iana.org/assignments/uri-schemes.html\n\t// http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n\tURI.defaultPorts = {\n\t\thttp: '80',\n\t\thttps: '443',\n\t\tftp: '21',\n\t\tgopher: '70',\n\t\tws: '80',\n\t\twss: '443'\n\t};\n\t// allowed hostname characters according to RFC 3986\n\t// ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n\t// I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . -\n\tURI.invalid_hostname_characters = /[^a-zA-Z0-9\\.-]/;\n\t// map DOM Elements to their URI attribute\n\tURI.domAttributes = {\n\t\t'a': 'href',\n\t\t'blockquote': 'cite',\n\t\t'link': 'href',\n\t\t'base': 'href',\n\t\t'script': 'src',\n\t\t'form': 'action',\n\t\t'img': 'src',\n\t\t'area': 'href',\n\t\t'iframe': 'src',\n\t\t'embed': 'src',\n\t\t'source': 'src',\n\t\t'track': 'src',\n\t\t'input': 'src', // but only if type=\"image\"\n\t\t'audio': 'src',\n\t\t'video': 'src'\n\t};\n\tURI.getDomAttribute = function(node) {\n\t\tif (!node || !node.nodeName) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar nodeName = node.nodeName.toLowerCase();\n\t\t// should only expose src for type=\"image\"\n\t\tif (nodeName === 'input' && node.type !== 'image') {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn URI.domAttributes[nodeName];\n\t};\n\n\tfunction escapeForDumbFirefox36(value) {\n\t\t// https://github.com/medialize/URI.js/issues/91\n\t\treturn escape(value);\n\t}\n\n\t// encoding / decoding according to RFC3986\n\tfunction strictEncodeURIComponent(string) {\n\t\t// see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n\t\treturn encodeURIComponent(string)\n\t\t\t.replace(/[!'()*]/g, escapeForDumbFirefox36)\n\t\t\t.replace(/\\*/g, '%2A');\n\t}\n\tURI.encode = strictEncodeURIComponent;\n\tURI.decode = decodeURIComponent;\n\tURI.iso8859 = function() {\n\t\tURI.encode = escape;\n\t\tURI.decode = unescape;\n\t};\n\tURI.unicode = function() {\n\t\tURI.encode = strictEncodeURIComponent;\n\t\tURI.decode = decodeURIComponent;\n\t};\n\tURI.characters = {\n\t\tpathname: {\n\t\t\tencode: {\n\t\t\t\t// RFC3986 2.1: For consistency, URI producers and normalizers should\n\t\t\t\t// use uppercase hexadecimal digits for all percent-encodings.\n\t\t\t\texpression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n\t\t\t\tmap: {\n\t\t\t\t\t// -._~!'()*\n\t\t\t\t\t'%24': '$',\n\t\t\t\t\t'%26': '&',\n\t\t\t\t\t'%2B': '+',\n\t\t\t\t\t'%2C': ',',\n\t\t\t\t\t'%3B': ';',\n\t\t\t\t\t'%3D': '=',\n\t\t\t\t\t'%3A': ':',\n\t\t\t\t\t'%40': '@'\n\t\t\t\t}\n\t\t\t},\n\t\t\tdecode: {\n\t\t\t\texpression: /[\\/\\?#]/g,\n\t\t\t\tmap: {\n\t\t\t\t\t'/': '%2F',\n\t\t\t\t\t'?': '%3F',\n\t\t\t\t\t'#': '%23'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\treserved: {\n\t\t\tencode: {\n\t\t\t\t// RFC3986 2.1: For consistency, URI producers and normalizers should\n\t\t\t\t// use uppercase hexadecimal digits for all percent-encodings.\n\t\t\t\texpression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n\t\t\t\tmap: {\n\t\t\t\t\t// gen-delims\n\t\t\t\t\t'%3A': ':',\n\t\t\t\t\t'%2F': '/',\n\t\t\t\t\t'%3F': '?',\n\t\t\t\t\t'%23': '#',\n\t\t\t\t\t'%5B': '[',\n\t\t\t\t\t'%5D': ']',\n\t\t\t\t\t'%40': '@',\n\t\t\t\t\t// sub-delims\n\t\t\t\t\t'%21': '!',\n\t\t\t\t\t'%24': '$',\n\t\t\t\t\t'%26': '&',\n\t\t\t\t\t'%27': '\\'',\n\t\t\t\t\t'%28': '(',\n\t\t\t\t\t'%29': ')',\n\t\t\t\t\t'%2A': '*',\n\t\t\t\t\t'%2B': '+',\n\t\t\t\t\t'%2C': ',',\n\t\t\t\t\t'%3B': ';',\n\t\t\t\t\t'%3D': '='\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\turnpath: {\n\t\t\t// The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n\t\t\t// for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n\t\t\t// these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n\t\t\t// note that the colon character is not featured in the encoding map; this is because URI.js\n\t\t\t// gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n\t\t\t// should not appear unencoded in a segment itself.\n\t\t\t// See also the note above about RFC3986 and capitalalized hex digits.\n\t\t\tencode: {\n\t\t\t\texpression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n\t\t\t\tmap: {\n\t\t\t\t\t'%21': '!',\n\t\t\t\t\t'%24': '$',\n\t\t\t\t\t'%27': '\\'',\n\t\t\t\t\t'%28': '(',\n\t\t\t\t\t'%29': ')',\n\t\t\t\t\t'%2A': '*',\n\t\t\t\t\t'%2B': '+',\n\t\t\t\t\t'%2C': ',',\n\t\t\t\t\t'%3B': ';',\n\t\t\t\t\t'%3D': '=',\n\t\t\t\t\t'%40': '@'\n\t\t\t\t}\n\t\t\t},\n\t\t\t// These characters are the characters called out by RFC2141 as \"reserved\" characters that\n\t\t\t// should never appear in a URN, plus the colon character (see note above).\n\t\t\tdecode: {\n\t\t\t\texpression: /[\\/\\?#:]/g,\n\t\t\t\tmap: {\n\t\t\t\t\t'/': '%2F',\n\t\t\t\t\t'?': '%3F',\n\t\t\t\t\t'#': '%23',\n\t\t\t\t\t':': '%3A'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tURI.encodeQuery = function(string, escapeQuerySpace) {\n\t\tvar escaped = URI.encode(string + '');\n\t\tif (escapeQuerySpace === undefined) {\n\t\t\tescapeQuerySpace = URI.escapeQuerySpace;\n\t\t}\n\n\t\treturn escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n\t};\n\tURI.decodeQuery = function(string, escapeQuerySpace) {\n\t\tstring += '';\n\t\tif (escapeQuerySpace === undefined) {\n\t\t\tescapeQuerySpace = URI.escapeQuerySpace;\n\t\t}\n\n\t\ttry {\n\t\t\treturn URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n\t\t} catch(e) {\n\t\t\t// we're not going to mess with weird encodings,\n\t\t\t// give up and return the undecoded original string\n\t\t\t// see https://github.com/medialize/URI.js/issues/87\n\t\t\t// see https://github.com/medialize/URI.js/issues/92\n\t\t\treturn string;\n\t\t}\n\t};\n\t// generate encode/decode path functions\n\tvar _parts = {'encode':'encode', 'decode':'decode'};\n\tvar _part;\n\tvar generateAccessor = function(_group, _part) {\n\t\treturn function(string) {\n\t\t\ttry {\n\t\t\t\treturn URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n\t\t\t\t\treturn URI.characters[_group][_part].map[c];\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\t// we're not going to mess with weird encodings,\n\t\t\t\t// give up and return the undecoded original string\n\t\t\t\t// see https://github.com/medialize/URI.js/issues/87\n\t\t\t\t// see https://github.com/medialize/URI.js/issues/92\n\t\t\t\treturn string;\n\t\t\t}\n\t\t};\n\t};\n\n\tfor (_part in _parts) {\n\t\tURI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n\t\tURI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n\t}\n\n\tvar generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n\t\treturn function(string) {\n\t\t\t// Why pass in names of functions, rather than the function objects themselves? The\n\t\t\t// definitions of some functions (but in particular, URI.decode) will occasionally change due\n\t\t\t// to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n\t\t\t// that the functions we use here are \"fresh\".\n\t\t\tvar actualCodingFunc;\n\t\t\tif (!_innerCodingFuncName) {\n\t\t\t\tactualCodingFunc = URI[_codingFuncName];\n\t\t\t} else {\n\t\t\t\tactualCodingFunc = function(string) {\n\t\t\t\t\treturn URI[_codingFuncName](URI[_innerCodingFuncName](string));\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tvar segments = (string + '').split(_sep);\n\n\t\t\tfor (var i = 0, length = segments.length; i < length; i++) {\n\t\t\t\tsegments[i] = actualCodingFunc(segments[i]);\n\t\t\t}\n\n\t\t\treturn segments.join(_sep);\n\t\t};\n\t};\n\n\t// This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n\tURI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n\tURI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n\tURI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n\tURI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n\tURI.encodeReserved = generateAccessor('reserved', 'encode');\n\n\tURI.parse = function(string, parts) {\n\t\tvar pos;\n\t\tif (!parts) {\n\t\t\tparts = {};\n\t\t}\n\t\t// [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n\t\t// extract fragment\n\t\tpos = string.indexOf('#');\n\t\tif (pos > -1) {\n\t\t\t// escaping?\n\t\t\tparts.fragment = string.substring(pos + 1) || null;\n\t\t\tstring = string.substring(0, pos);\n\t\t}\n\n\t\t// extract query\n\t\tpos = string.indexOf('?');\n\t\tif (pos > -1) {\n\t\t\t// escaping?\n\t\t\tparts.query = string.substring(pos + 1) || null;\n\t\t\tstring = string.substring(0, pos);\n\t\t}\n\n\t\t// extract protocol\n\t\tif (string.substring(0, 2) === '//') {\n\t\t\t// relative-scheme\n\t\t\tparts.protocol = null;\n\t\t\tstring = string.substring(2);\n\t\t\t// extract \"user:pass@host:port\"\n\t\t\tstring = URI.parseAuthority(string, parts);\n\t\t} else {\n\t\t\tpos = string.indexOf(':');\n\t\t\tif (pos > -1) {\n\t\t\t\tparts.protocol = string.substring(0, pos) || null;\n\t\t\t\tif (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n\t\t\t\t\t// : may be within the path\n\t\t\t\t\tparts.protocol = undefined;\n\t\t\t\t} else if (string.substring(pos + 1, pos + 3) === '//') {\n\t\t\t\t\tstring = string.substring(pos + 3);\n\n\t\t\t\t\t// extract \"user:pass@host:port\"\n\t\t\t\t\tstring = URI.parseAuthority(string, parts);\n\t\t\t\t} else {\n\t\t\t\t\tstring = string.substring(pos + 1);\n\t\t\t\t\tparts.urn = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// what's left must be the path\n\t\tparts.path = string;\n\n\t\t// and we're done\n\t\treturn parts;\n\t};\n\tURI.parseHost = function(string, parts) {\n\t\t// Copy chrome, IE, opera backslash-handling behavior.\n\t\t// Back slashes before the query string get converted to forward slashes\n\t\t// See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n\t\t// See: https://code.google.com/p/chromium/issues/detail?id=25916\n\t\t// https://github.com/medialize/URI.js/pull/233\n\t\tstring = string.replace(/\\\\/g, '/');\n\n\t\t// extract host:port\n\t\tvar pos = string.indexOf('/');\n\t\tvar bracketPos;\n\t\tvar t;\n\n\t\tif (pos === -1) {\n\t\t\tpos = string.length;\n\t\t}\n\n\t\tif (string.charAt(0) === '[') {\n\t\t\t// IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n\t\t\t// I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n\t\t\t// IPv6+port in the format [2001:db8::1]:80 (for the time being)\n\t\t\tbracketPos = string.indexOf(']');\n\t\t\tparts.hostname = string.substring(1, bracketPos) || null;\n\t\t\tparts.port = string.substring(bracketPos + 2, pos) || null;\n\t\t\tif (parts.port === '/') {\n\t\t\t\tparts.port = null;\n\t\t\t}\n\t\t} else {\n\t\t\tvar firstColon = string.indexOf(':');\n\t\t\tvar firstSlash = string.indexOf('/');\n\t\t\tvar nextColon = string.indexOf(':', firstColon + 1);\n\t\t\tif (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n\t\t\t\t// IPv6 host contains multiple colons - but no port\n\t\t\t\t// this notation is actually not allowed by RFC 3986, but we're a liberal parser\n\t\t\t\tparts.hostname = string.substring(0, pos) || null;\n\t\t\t\tparts.port = null;\n\t\t\t} else {\n\t\t\t\tt = string.substring(0, pos).split(':');\n\t\t\t\tparts.hostname = t[0] || null;\n\t\t\t\tparts.port = t[1] || null;\n\t\t\t}\n\t\t}\n\n\t\tif (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n\t\t\tpos++;\n\t\t\tstring = '/' + string;\n\t\t}\n\n\t\treturn string.substring(pos) || '/';\n\t};\n\tURI.parseAuthority = function(string, parts) {\n\t\tstring = URI.parseUserinfo(string, parts);\n\t\treturn URI.parseHost(string, parts);\n\t};\n\tURI.parseUserinfo = function(string, parts) {\n\t\t// extract username:password\n\t\tvar firstSlash = string.indexOf('/');\n\t\tvar pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n\t\tvar t;\n\n\t\t// authority@ must come before /path\n\t\tif (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n\t\t\tt = string.substring(0, pos).split(':');\n\t\t\tparts.username = t[0] ? URI.decode(t[0]) : null;\n\t\t\tt.shift();\n\t\t\tparts.password = t[0] ? URI.decode(t.join(':')) : null;\n\t\t\tstring = string.substring(pos + 1);\n\t\t} else {\n\t\t\tparts.username = null;\n\t\t\tparts.password = null;\n\t\t}\n\n\t\treturn string;\n\t};\n\tURI.parseQuery = function(string, escapeQuerySpace) {\n\t\tif (!string) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n\t\tstring = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n\t\tif (!string) {\n\t\t\treturn {};\n\t\t}\n\n\t\tvar items = {};\n\t\tvar splits = string.split('&');\n\t\tvar length = splits.length;\n\t\tvar v, name, value;\n\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tv = splits[i].split('=');\n\t\t\tname = URI.decodeQuery(v.shift(), escapeQuerySpace);\n\t\t\t// no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n\t\t\tvalue = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n\t\t\tif (hasOwn.call(items, name)) {\n\t\t\t\tif (typeof items[name] === 'string' || items[name] === null) {\n\t\t\t\t\titems[name] = [items[name]];\n\t\t\t\t}\n\n\t\t\t\titems[name].push(value);\n\t\t\t} else {\n\t\t\t\titems[name] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t};\n\n\tURI.build = function(parts) {\n\t\tvar t = '';\n\n\t\tif (parts.protocol) {\n\t\t\tt += parts.protocol + ':';\n\t\t}\n\n\t\tif (!parts.urn && (t || parts.hostname)) {\n\t\t\tt += '//';\n\t\t}\n\n\t\tt += (URI.buildAuthority(parts) || '');\n\n\t\tif (typeof parts.path === 'string') {\n\t\t\tif (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n\t\t\t\tt += '/';\n\t\t\t}\n\n\t\t\tt += parts.path;\n\t\t}\n\n\t\tif (typeof parts.query === 'string' && parts.query) {\n\t\t\tt += '?' + parts.query;\n\t\t}\n\n\t\tif (typeof parts.fragment === 'string' && parts.fragment) {\n\t\t\tt += '#' + parts.fragment;\n\t\t}\n\t\treturn t;\n\t};\n\tURI.buildHost = function(parts) {\n\t\tvar t = '';\n\n\t\tif (!parts.hostname) {\n\t\t\treturn '';\n\t\t} else if (URI.ip6_expression.test(parts.hostname)) {\n\t\t\tt += '[' + parts.hostname + ']';\n\t\t} else {\n\t\t\tt += parts.hostname;\n\t\t}\n\n\t\tif (parts.port) {\n\t\t\tt += ':' + parts.port;\n\t\t}\n\n\t\treturn t;\n\t};\n\tURI.buildAuthority = function(parts) {\n\t\treturn URI.buildUserinfo(parts) + URI.buildHost(parts);\n\t};\n\tURI.buildUserinfo = function(parts) {\n\t\tvar t = '';\n\n\t\tif (parts.username) {\n\t\t\tt += URI.encode(parts.username);\n\n\t\t\tif (parts.password) {\n\t\t\t\tt += ':' + URI.encode(parts.password);\n\t\t\t}\n\n\t\t\tt += '@';\n\t\t}\n\n\t\treturn t;\n\t};\n\tURI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n\t\t// according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n\t\t// being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n\t\t// the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n\t\t// URI.js treats the query string as being application/x-www-form-urlencoded\n\t\t// see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n\t\tvar t = '';\n\t\tvar unique, key, i, length;\n\t\tfor (key in data) {\n\t\t\tif (hasOwn.call(data, key) && key) {\n\t\t\t\tif (isArray(data[key])) {\n\t\t\t\t\tunique = {};\n\t\t\t\t\tfor (i = 0, length = data[key].length; i < length; i++) {\n\t\t\t\t\t\tif (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n\t\t\t\t\t\t\tt += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n\t\t\t\t\t\t\tif (duplicateQueryParameters !== true) {\n\t\t\t\t\t\t\t\tunique[data[key][i] + ''] = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (data[key] !== undefined) {\n\t\t\t\t\tt += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn t.substring(1);\n\t};\n\tURI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n\t\t// http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n\t\t// don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n\t\treturn URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n\t};\n\n\tURI.addQuery = function(data, name, value) {\n\t\tif (typeof name === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tURI.addQuery(data, key, name[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof name === 'string') {\n\t\t\tif (data[name] === undefined) {\n\t\t\t\tdata[name] = value;\n\t\t\t\treturn;\n\t\t\t} else if (typeof data[name] === 'string') {\n\t\t\t\tdata[name] = [data[name]];\n\t\t\t}\n\n\t\t\tif (!isArray(value)) {\n\t\t\t\tvalue = [value];\n\t\t\t}\n\n\t\t\tdata[name] = (data[name] || []).concat(value);\n\t\t} else {\n\t\t\tthrow new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n\t\t}\n\t};\n\tURI.removeQuery = function(data, name, value) {\n\t\tvar i, length, key;\n\n\t\tif (isArray(name)) {\n\t\t\tfor (i = 0, length = name.length; i < length; i++) {\n\t\t\t\tdata[name[i]] = undefined;\n\t\t\t}\n\t\t} else if (getType(name) === 'RegExp') {\n\t\t\tfor (key in data) {\n\t\t\t\tif (name.test(key)) {\n\t\t\t\t\tdata[key] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof name === 'object') {\n\t\t\tfor (key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tURI.removeQuery(data, key, name[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof name === 'string') {\n\t\t\tif (value !== undefined) {\n\t\t\t\tif (getType(value) === 'RegExp') {\n\t\t\t\t\tif (!isArray(data[name]) && value.test(data[name])) {\n\t\t\t\t\t\tdata[name] = undefined;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata[name] = filterArrayValues(data[name], value);\n\t\t\t\t\t}\n\t\t\t\t} else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n\t\t\t\t\tdata[name] = undefined;\n\t\t\t\t} else if (isArray(data[name])) {\n\t\t\t\t\tdata[name] = filterArrayValues(data[name], value);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdata[name] = undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n\t\t}\n\t};\n\tURI.hasQuery = function(data, name, value, withinArray) {\n\t\tif (typeof name === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tif (!URI.hasQuery(data, key, name[key])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} else if (typeof name !== 'string') {\n\t\t\tthrow new TypeError('URI.hasQuery() accepts an object, string as the name parameter');\n\t\t}\n\n\t\tswitch (getType(value)) {\n\t\t\tcase 'Undefined':\n\t\t\t\t// true if exists (but may be empty)\n\t\t\t\treturn name in data; // data[name] !== undefined;\n\n\t\t\tcase 'Boolean':\n\t\t\t\t// true if exists and non-empty\n\t\t\t\tvar _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n\t\t\t\treturn value === _booly;\n\n\t\t\tcase 'Function':\n\t\t\t\t// allow complex comparison\n\t\t\t\treturn !!value(data[name], name, data);\n\n\t\t\tcase 'Array':\n\t\t\t\tif (!isArray(data[name])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar op = withinArray ? arrayContains : arraysEqual;\n\t\t\t\treturn op(data[name], value);\n\n\t\t\tcase 'RegExp':\n\t\t\t\tif (!isArray(data[name])) {\n\t\t\t\t\treturn Boolean(data[name] && data[name].match(value));\n\t\t\t\t}\n\n\t\t\t\tif (!withinArray) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn arrayContains(data[name], value);\n\n\t\t\tcase 'Number':\n\t\t\t\tvalue = String(value);\n\t\t\t/* falls through */\n\t\t\tcase 'String':\n\t\t\t\tif (!isArray(data[name])) {\n\t\t\t\t\treturn data[name] === value;\n\t\t\t\t}\n\n\t\t\t\tif (!withinArray) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn arrayContains(data[name], value);\n\n\t\t\tdefault:\n\t\t\t\tthrow new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n\t\t}\n\t};\n\n\n\tURI.commonPath = function(one, two) {\n\t\tvar length = Math.min(one.length, two.length);\n\t\tvar pos;\n\n\t\t// find first non-matching character\n\t\tfor (pos = 0; pos < length; pos++) {\n\t\t\tif (one.charAt(pos) !== two.charAt(pos)) {\n\t\t\t\tpos--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (pos < 1) {\n\t\t\treturn one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n\t\t}\n\n\t\t// revert to last /\n\t\tif (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n\t\t\tpos = one.substring(0, pos).lastIndexOf('/');\n\t\t}\n\n\t\treturn one.substring(0, pos + 1);\n\t};\n\n\tURI.withinString = function(string, callback, options) {\n\t\toptions || (options = {});\n\t\tvar _start = options.start || URI.findUri.start;\n\t\tvar _end = options.end || URI.findUri.end;\n\t\tvar _trim = options.trim || URI.findUri.trim;\n\t\tvar _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n\t\t_start.lastIndex = 0;\n\t\twhile (true) {\n\t\t\tvar match = _start.exec(string);\n\t\t\tif (!match) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvar start = match.index;\n\t\t\tif (options.ignoreHtml) {\n\t\t\t\t// attribut(e=[\"']?$)\n\t\t\t\tvar attributeOpen = string.slice(Math.max(start - 3, 0), start);\n\t\t\t\tif (attributeOpen && _attributeOpen.test(attributeOpen)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar end = start + string.slice(start).search(_end);\n\t\t\tvar slice = string.slice(start, end).replace(_trim, '');\n\t\t\tif (options.ignore && options.ignore.test(slice)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tend = start + slice.length;\n\t\t\tvar result = callback(slice, start, end, string);\n\t\t\tstring = string.slice(0, start) + result + string.slice(end);\n\t\t\t_start.lastIndex = start + result.length;\n\t\t}\n\n\t\t_start.lastIndex = 0;\n\t\treturn string;\n\t};\n\n\tURI.ensureValidHostname = function(v) {\n\t\t// Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n\t\t// they are not part of DNS and therefore ignored by URI.js\n\n\t\tif (v.match(URI.invalid_hostname_characters)) {\n\t\t\t// test punycode\n\t\t\tif (!punycode) {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-] and Punycode.js is not available');\n\t\t\t}\n\n\t\t\tif (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\t\t}\n\t};\n\n\t// noConflict\n\tURI.noConflict = function(removeAll) {\n\t\tif (removeAll) {\n\t\t\tvar unconflicted = {\n\t\t\t\tURI: this.noConflict()\n\t\t\t};\n\n\t\t\tif (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n\t\t\t\tunconflicted.URITemplate = root.URITemplate.noConflict();\n\t\t\t}\n\n\t\t\tif (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n\t\t\t\tunconflicted.IPv6 = root.IPv6.noConflict();\n\t\t\t}\n\n\t\t\tif (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n\t\t\t\tunconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n\t\t\t}\n\n\t\t\treturn unconflicted;\n\t\t} else if (root.URI === this) {\n\t\t\troot.URI = _URI;\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tp.build = function(deferBuild) {\n\t\tif (deferBuild === true) {\n\t\t\tthis._deferred_build = true;\n\t\t} else if (deferBuild === undefined || this._deferred_build) {\n\t\t\tthis._string = URI.build(this._parts);\n\t\t\tthis._deferred_build = false;\n\t\t}\n\n\t\treturn this;\n\t};\n\n\tp.clone = function() {\n\t\treturn new URI(this);\n\t};\n\n\tp.valueOf = p.toString = function() {\n\t\treturn this.build(false)._string;\n\t};\n\n\n\tfunction generateSimpleAccessor(_part){\n\t\treturn function(v, build) {\n\t\t\tif (v === undefined) {\n\t\t\t\treturn this._parts[_part] || '';\n\t\t\t} else {\n\t\t\t\tthis._parts[_part] = v || null;\n\t\t\t\tthis.build(!build);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction generatePrefixAccessor(_part, _key){\n\t\treturn function(v, build) {\n\t\t\tif (v === undefined) {\n\t\t\t\treturn this._parts[_part] || '';\n\t\t\t} else {\n\t\t\t\tif (v !== null) {\n\t\t\t\t\tv = v + '';\n\t\t\t\t\tif (v.charAt(0) === _key) {\n\t\t\t\t\t\tv = v.substring(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._parts[_part] = v;\n\t\t\t\tthis.build(!build);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t};\n\t}\n\n\tp.protocol = generateSimpleAccessor('protocol');\n\tp.username = generateSimpleAccessor('username');\n\tp.password = generateSimpleAccessor('password');\n\tp.hostname = generateSimpleAccessor('hostname');\n\tp.port = generateSimpleAccessor('port');\n\tp.query = generatePrefixAccessor('query', '?');\n\tp.fragment = generatePrefixAccessor('fragment', '#');\n\n\tp.search = function(v, build) {\n\t\tvar t = this.query(v, build);\n\t\treturn typeof t === 'string' && t.length ? ('?' + t) : t;\n\t};\n\tp.hash = function(v, build) {\n\t\tvar t = this.fragment(v, build);\n\t\treturn typeof t === 'string' && t.length ? ('#' + t) : t;\n\t};\n\n\tp.pathname = function(v, build) {\n\t\tif (v === undefined || v === true) {\n\t\t\tvar res = this._parts.path || (this._parts.hostname ? '/' : '');\n\t\t\treturn v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n\t\t} else {\n\t\t\tif (this._parts.urn) {\n\t\t\t\tthis._parts.path = v ? URI.recodeUrnPath(v) : '';\n\t\t\t} else {\n\t\t\t\tthis._parts.path = v ? URI.recodePath(v) : '/';\n\t\t\t}\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.path = p.pathname;\n\tp.href = function(href, build) {\n\t\tvar key;\n\n\t\tif (href === undefined) {\n\t\t\treturn this.toString();\n\t\t}\n\n\t\tthis._string = '';\n\t\tthis._parts = URI._parts();\n\n\t\tvar _URI = href instanceof URI;\n\t\tvar _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n\t\tif (href.nodeName) {\n\t\t\tvar attribute = URI.getDomAttribute(href);\n\t\t\thref = href[attribute] || '';\n\t\t\t_object = false;\n\t\t}\n\n\t\t// window.location is reported to be an object, but it's not the sort\n\t\t// of object we're looking for:\n\t\t// * location.protocol ends with a colon\n\t\t// * location.query != object.search\n\t\t// * location.hash != object.fragment\n\t\t// simply serializing the unknown object should do the trick\n\t\t// (for location, not for everything...)\n\t\tif (!_URI && _object && href.pathname !== undefined) {\n\t\t\thref = href.toString();\n\t\t}\n\n\t\tif (typeof href === 'string' || href instanceof String) {\n\t\t\tthis._parts = URI.parse(String(href), this._parts);\n\t\t} else if (_URI || _object) {\n\t\t\tvar src = _URI ? href._parts : href;\n\t\t\tfor (key in src) {\n\t\t\t\tif (hasOwn.call(this._parts, key)) {\n\t\t\t\t\tthis._parts[key] = src[key];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('invalid input');\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\n\t// identification accessors\n\tp.is = function(what) {\n\t\tvar ip = false;\n\t\tvar ip4 = false;\n\t\tvar ip6 = false;\n\t\tvar name = false;\n\t\tvar sld = false;\n\t\tvar idn = false;\n\t\tvar punycode = false;\n\t\tvar relative = !this._parts.urn;\n\n\t\tif (this._parts.hostname) {\n\t\t\trelative = false;\n\t\t\tip4 = URI.ip4_expression.test(this._parts.hostname);\n\t\t\tip6 = URI.ip6_expression.test(this._parts.hostname);\n\t\t\tip = ip4 || ip6;\n\t\t\tname = !ip;\n\t\t\tsld = name && SLD && SLD.has(this._parts.hostname);\n\t\t\tidn = name && URI.idn_expression.test(this._parts.hostname);\n\t\t\tpunycode = name && URI.punycode_expression.test(this._parts.hostname);\n\t\t}\n\n\t\tswitch (what.toLowerCase()) {\n\t\t\tcase 'relative':\n\t\t\t\treturn relative;\n\n\t\t\tcase 'absolute':\n\t\t\t\treturn !relative;\n\n\t\t\t// hostname identification\n\t\t\tcase 'domain':\n\t\t\tcase 'name':\n\t\t\t\treturn name;\n\n\t\t\tcase 'sld':\n\t\t\t\treturn sld;\n\n\t\t\tcase 'ip':\n\t\t\t\treturn ip;\n\n\t\t\tcase 'ip4':\n\t\t\tcase 'ipv4':\n\t\t\tcase 'inet4':\n\t\t\t\treturn ip4;\n\n\t\t\tcase 'ip6':\n\t\t\tcase 'ipv6':\n\t\t\tcase 'inet6':\n\t\t\t\treturn ip6;\n\n\t\t\tcase 'idn':\n\t\t\t\treturn idn;\n\n\t\t\tcase 'url':\n\t\t\t\treturn !this._parts.urn;\n\n\t\t\tcase 'urn':\n\t\t\t\treturn !!this._parts.urn;\n\n\t\t\tcase 'punycode':\n\t\t\t\treturn punycode;\n\t\t}\n\n\t\treturn null;\n\t};\n\n\t// component specific input validation\n\tvar _protocol = p.protocol;\n\tvar _port = p.port;\n\tvar _hostname = p.hostname;\n\n\tp.protocol = function(v, build) {\n\t\tif (v !== undefined) {\n\t\t\tif (v) {\n\t\t\t\t// accept trailing ://\n\t\t\t\tv = v.replace(/:(\\/\\/)?$/, '');\n\n\t\t\t\tif (!v.match(URI.protocol_expression)) {\n\t\t\t\t\tthrow new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _protocol.call(this, v, build);\n\t};\n\tp.scheme = p.protocol;\n\tp.port = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v !== undefined) {\n\t\t\tif (v === 0) {\n\t\t\t\tv = null;\n\t\t\t}\n\n\t\t\tif (v) {\n\t\t\t\tv += '';\n\t\t\t\tif (v.charAt(0) === ':') {\n\t\t\t\t\tv = v.substring(1);\n\t\t\t\t}\n\n\t\t\t\tif (v.match(/[^0-9]/)) {\n\t\t\t\t\tthrow new TypeError('Port \"' + v + '\" contains characters other than [0-9]');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _port.call(this, v, build);\n\t};\n\tp.hostname = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v !== undefined) {\n\t\t\tvar x = {};\n\t\t\tvar res = URI.parseHost(v, x);\n\t\t\tif (res !== '/') {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\n\t\t\tv = x.hostname;\n\t\t}\n\t\treturn _hostname.call(this, v, build);\n\t};\n\n\t// compound accessors\n\tp.origin = function(v, build) {\n\t\tvar parts;\n\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\tvar protocol = this.protocol();\n\t\t\tvar authority = this.authority();\n\t\t\tif (!authority) return '';\n\t\t\treturn (protocol ? protocol + '://' : '') + this.authority();\n\t\t} else {\n\t\t\tvar origin = URI(v);\n\t\t\tthis\n\t\t\t\t.protocol(origin.protocol())\n\t\t\t\t.authority(origin.authority())\n\t\t\t\t.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.host = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\treturn this._parts.hostname ? URI.buildHost(this._parts) : '';\n\t\t} else {\n\t\t\tvar res = URI.parseHost(v, this._parts);\n\t\t\tif (res !== '/') {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.authority = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\treturn this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n\t\t} else {\n\t\t\tvar res = URI.parseAuthority(v, this._parts);\n\t\t\tif (res !== '/') {\n\t\t\t\tthrow new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.userinfo = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.username) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar t = URI.buildUserinfo(this._parts);\n\t\t\treturn t.substring(0, t.length -1);\n\t\t} else {\n\t\t\tif (v[v.length-1] !== '@') {\n\t\t\t\tv += '@';\n\t\t\t}\n\n\t\t\tURI.parseUserinfo(v, this._parts);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.resource = function(v, build) {\n\t\tvar parts;\n\n\t\tif (v === undefined) {\n\t\t\treturn this.path() + this.search() + this.hash();\n\t\t}\n\n\t\tparts = URI.parse(v);\n\t\tthis._parts.path = parts.path;\n\t\tthis._parts.query = parts.query;\n\t\tthis._parts.fragment = parts.fragment;\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\n\t// fraction accessors\n\tp.subdomain = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\t// convenience, return \"www\" from \"www.example.org\"\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// grab domain and add another segment\n\t\t\tvar end = this._parts.hostname.length - this.domain().length - 1;\n\t\t\treturn this._parts.hostname.substring(0, end) || '';\n\t\t} else {\n\t\t\tvar e = this._parts.hostname.length - this.domain().length;\n\t\t\tvar sub = this._parts.hostname.substring(0, e);\n\t\t\tvar replace = new RegExp('^' + escapeRegEx(sub));\n\n\t\t\tif (v && v.charAt(v.length - 1) !== '.') {\n\t\t\t\tv += '.';\n\t\t\t}\n\n\t\t\tif (v) {\n\t\t\t\tURI.ensureValidHostname(v);\n\t\t\t}\n\n\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.domain = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (typeof v === 'boolean') {\n\t\t\tbuild = v;\n\t\t\tv = undefined;\n\t\t}\n\n\t\t// convenience, return \"example.org\" from \"www.example.org\"\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// if hostname consists of 1 or 2 segments, it must be the domain\n\t\t\tvar t = this._parts.hostname.match(/\\./g);\n\t\t\tif (t && t.length < 2) {\n\t\t\t\treturn this._parts.hostname;\n\t\t\t}\n\n\t\t\t// grab tld and add another segment\n\t\t\tvar end = this._parts.hostname.length - this.tld(build).length - 1;\n\t\t\tend = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n\t\t\treturn this._parts.hostname.substring(end) || '';\n\t\t} else {\n\t\t\tif (!v) {\n\t\t\t\tthrow new TypeError('cannot set domain empty');\n\t\t\t}\n\n\t\t\tURI.ensureValidHostname(v);\n\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\tthis._parts.hostname = v;\n\t\t\t} else {\n\t\t\t\tvar replace = new RegExp(escapeRegEx(this.domain()) + '$');\n\t\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.tld = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (typeof v === 'boolean') {\n\t\t\tbuild = v;\n\t\t\tv = undefined;\n\t\t}\n\n\t\t// return \"org\" from \"www.example.org\"\n\t\tif (v === undefined) {\n\t\t\tif (!this._parts.hostname || this.is('IP')) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar pos = this._parts.hostname.lastIndexOf('.');\n\t\t\tvar tld = this._parts.hostname.substring(pos + 1);\n\n\t\t\tif (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n\t\t\t\treturn SLD.get(this._parts.hostname) || tld;\n\t\t\t}\n\n\t\t\treturn tld;\n\t\t} else {\n\t\t\tvar replace;\n\n\t\t\tif (!v) {\n\t\t\t\tthrow new TypeError('cannot set TLD empty');\n\t\t\t} else if (v.match(/[^a-zA-Z0-9-]/)) {\n\t\t\t\tif (SLD && SLD.is(v)) {\n\t\t\t\t\treplace = new RegExp(escapeRegEx(this.tld()) + '$');\n\t\t\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n\t\t\t\t}\n\t\t\t} else if (!this._parts.hostname || this.is('IP')) {\n\t\t\t\tthrow new ReferenceError('cannot set TLD on non-domain host');\n\t\t\t} else {\n\t\t\t\treplace = new RegExp(escapeRegEx(this.tld()) + '$');\n\t\t\t\tthis._parts.hostname = this._parts.hostname.replace(replace, v);\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.directory = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined || v === true) {\n\t\t\tif (!this._parts.path && !this._parts.hostname) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this._parts.path === '/') {\n\t\t\t\treturn '/';\n\t\t\t}\n\n\t\t\tvar end = this._parts.path.length - this.filename().length - 1;\n\t\t\tvar res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n\t\t\treturn v ? URI.decodePath(res) : res;\n\n\t\t} else {\n\t\t\tvar e = this._parts.path.length - this.filename().length;\n\t\t\tvar directory = this._parts.path.substring(0, e);\n\t\t\tvar replace = new RegExp('^' + escapeRegEx(directory));\n\n\t\t\t// fully qualifier directories begin with a slash\n\t\t\tif (!this.is('relative')) {\n\t\t\t\tif (!v) {\n\t\t\t\t\tv = '/';\n\t\t\t\t}\n\n\t\t\t\tif (v.charAt(0) !== '/') {\n\t\t\t\t\tv = '/' + v;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// directories always end with a slash\n\t\t\tif (v && v.charAt(v.length - 1) !== '/') {\n\t\t\t\tv += '/';\n\t\t\t}\n\n\t\t\tv = URI.recodePath(v);\n\t\t\tthis._parts.path = this._parts.path.replace(replace, v);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.filename = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined || v === true) {\n\t\t\tif (!this._parts.path || this._parts.path === '/') {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar pos = this._parts.path.lastIndexOf('/');\n\t\t\tvar res = this._parts.path.substring(pos+1);\n\n\t\t\treturn v ? URI.decodePathSegment(res) : res;\n\t\t} else {\n\t\t\tvar mutatedDirectory = false;\n\n\t\t\tif (v.charAt(0) === '/') {\n\t\t\t\tv = v.substring(1);\n\t\t\t}\n\n\t\t\tif (v.match(/\\.?\\//)) {\n\t\t\t\tmutatedDirectory = true;\n\t\t\t}\n\n\t\t\tvar replace = new RegExp(escapeRegEx(this.filename()) + '$');\n\t\t\tv = URI.recodePath(v);\n\t\t\tthis._parts.path = this._parts.path.replace(replace, v);\n\n\t\t\tif (mutatedDirectory) {\n\t\t\t\tthis.normalizePath(build);\n\t\t\t} else {\n\t\t\t\tthis.build(!build);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.suffix = function(v, build) {\n\t\tif (this._parts.urn) {\n\t\t\treturn v === undefined ? '' : this;\n\t\t}\n\n\t\tif (v === undefined || v === true) {\n\t\t\tif (!this._parts.path || this._parts.path === '/') {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tvar filename = this.filename();\n\t\t\tvar pos = filename.lastIndexOf('.');\n\t\t\tvar s, res;\n\n\t\t\tif (pos === -1) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// suffix may only contain alnum characters (yup, I made this up.)\n\t\t\ts = filename.substring(pos+1);\n\t\t\tres = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n\t\t\treturn v ? URI.decodePathSegment(res) : res;\n\t\t} else {\n\t\t\tif (v.charAt(0) === '.') {\n\t\t\t\tv = v.substring(1);\n\t\t\t}\n\n\t\t\tvar suffix = this.suffix();\n\t\t\tvar replace;\n\n\t\t\tif (!suffix) {\n\t\t\t\tif (!v) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\tthis._parts.path += '.' + URI.recodePath(v);\n\t\t\t} else if (!v) {\n\t\t\t\treplace = new RegExp(escapeRegEx('.' + suffix) + '$');\n\t\t\t} else {\n\t\t\t\treplace = new RegExp(escapeRegEx(suffix) + '$');\n\t\t\t}\n\n\t\t\tif (replace) {\n\t\t\t\tv = URI.recodePath(v);\n\t\t\t\tthis._parts.path = this._parts.path.replace(replace, v);\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\t};\n\tp.segment = function(segment, v, build) {\n\t\tvar separator = this._parts.urn ? ':' : '/';\n\t\tvar path = this.path();\n\t\tvar absolute = path.substring(0, 1) === '/';\n\t\tvar segments = path.split(separator);\n\n\t\tif (segment !== undefined && typeof segment !== 'number') {\n\t\t\tbuild = v;\n\t\t\tv = segment;\n\t\t\tsegment = undefined;\n\t\t}\n\n\t\tif (segment !== undefined && typeof segment !== 'number') {\n\t\t\tthrow new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n\t\t}\n\n\t\tif (absolute) {\n\t\t\tsegments.shift();\n\t\t}\n\n\t\tif (segment < 0) {\n\t\t\t// allow negative indexes to address from the end\n\t\t\tsegment = Math.max(segments.length + segment, 0);\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\t/*jshint laxbreak: true */\n\t\t\treturn segment === undefined\n\t\t\t\t? segments\n\t\t\t\t: segments[segment];\n\t\t\t/*jshint laxbreak: false */\n\t\t} else if (segment === null || segments[segment] === undefined) {\n\t\t\tif (isArray(v)) {\n\t\t\t\tsegments = [];\n\t\t\t\t// collapse empty elements within array\n\t\t\t\tfor (var i=0, l=v.length; i < l; i++) {\n\t\t\t\t\tif (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (segments.length && !segments[segments.length -1].length) {\n\t\t\t\t\t\tsegments.pop();\n\t\t\t\t\t}\n\n\t\t\t\t\tsegments.push(trimSlashes(v[i]));\n\t\t\t\t}\n\t\t\t} else if (v || typeof v === 'string') {\n\t\t\t\tv = trimSlashes(v);\n\t\t\t\tif (segments[segments.length -1] === '') {\n\t\t\t\t\t// empty trailing elements have to be overwritten\n\t\t\t\t\t// to prevent results such as /foo//bar\n\t\t\t\t\tsegments[segments.length -1] = v;\n\t\t\t\t} else {\n\t\t\t\t\tsegments.push(v);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (v) {\n\t\t\t\tsegments[segment] = trimSlashes(v);\n\t\t\t} else {\n\t\t\t\tsegments.splice(segment, 1);\n\t\t\t}\n\t\t}\n\n\t\tif (absolute) {\n\t\t\tsegments.unshift('');\n\t\t}\n\n\t\treturn this.path(segments.join(separator), build);\n\t};\n\tp.segmentCoded = function(segment, v, build) {\n\t\tvar segments, i, l;\n\n\t\tif (typeof segment !== 'number') {\n\t\t\tbuild = v;\n\t\t\tv = segment;\n\t\t\tsegment = undefined;\n\t\t}\n\n\t\tif (v === undefined) {\n\t\t\tsegments = this.segment(segment, v, build);\n\t\t\tif (!isArray(segments)) {\n\t\t\t\tsegments = segments !== undefined ? URI.decode(segments) : undefined;\n\t\t\t} else {\n\t\t\t\tfor (i = 0, l = segments.length; i < l; i++) {\n\t\t\t\t\tsegments[i] = URI.decode(segments[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn segments;\n\t\t}\n\n\t\tif (!isArray(v)) {\n\t\t\tv = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n\t\t} else {\n\t\t\tfor (i = 0, l = v.length; i < l; i++) {\n\t\t\t\tv[i] = URI.encode(v[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn this.segment(segment, v, build);\n\t};\n\n\t// mutating query string\n\tvar q = p.query;\n\tp.query = function(v, build) {\n\t\tif (v === true) {\n\t\t\treturn URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\t} else if (typeof v === 'function') {\n\t\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\t\tvar result = v.call(this, data);\n\t\t\tthis._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t} else if (v !== undefined && typeof v !== 'string') {\n\t\t\tthis._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t} else {\n\t\t\treturn q.call(this, v, build);\n\t\t}\n\t};\n\tp.setQuery = function(name, value, build) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n\t\tif (typeof name === 'string' || name instanceof String) {\n\t\t\tdata[name] = value !== undefined ? value : null;\n\t\t} else if (typeof name === 'object') {\n\t\t\tfor (var key in name) {\n\t\t\t\tif (hasOwn.call(name, key)) {\n\t\t\t\t\tdata[key] = name[key];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n\t\t}\n\n\t\tthis._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\tif (typeof name !== 'string') {\n\t\t\tbuild = value;\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.addQuery = function(name, value, build) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\tURI.addQuery(data, name, value === undefined ? null : value);\n\t\tthis._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\tif (typeof name !== 'string') {\n\t\t\tbuild = value;\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.removeQuery = function(name, value, build) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\tURI.removeQuery(data, name, value);\n\t\tthis._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n\t\tif (typeof name !== 'string') {\n\t\t\tbuild = value;\n\t\t}\n\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.hasQuery = function(name, value, withinArray) {\n\t\tvar data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\t\treturn URI.hasQuery(data, name, value, withinArray);\n\t};\n\tp.setSearch = p.setQuery;\n\tp.addSearch = p.addQuery;\n\tp.removeSearch = p.removeQuery;\n\tp.hasSearch = p.hasQuery;\n\n\t// sanitizing URLs\n\tp.normalize = function() {\n\t\tif (this._parts.urn) {\n\t\t\treturn this\n\t\t\t\t.normalizeProtocol(false)\n\t\t\t\t.normalizePath(false)\n\t\t\t\t.normalizeQuery(false)\n\t\t\t\t.normalizeFragment(false)\n\t\t\t\t.build();\n\t\t}\n\n\t\treturn this\n\t\t\t.normalizeProtocol(false)\n\t\t\t.normalizeHostname(false)\n\t\t\t.normalizePort(false)\n\t\t\t.normalizePath(false)\n\t\t\t.normalizeQuery(false)\n\t\t\t.normalizeFragment(false)\n\t\t\t.build();\n\t};\n\tp.normalizeProtocol = function(build) {\n\t\tif (typeof this._parts.protocol === 'string') {\n\t\t\tthis._parts.protocol = this._parts.protocol.toLowerCase();\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizeHostname = function(build) {\n\t\tif (this._parts.hostname) {\n\t\t\tif (this.is('IDN') && punycode) {\n\t\t\t\tthis._parts.hostname = punycode.toASCII(this._parts.hostname);\n\t\t\t} else if (this.is('IPv6') && IPv6) {\n\t\t\t\tthis._parts.hostname = IPv6.best(this._parts.hostname);\n\t\t\t}\n\n\t\t\tthis._parts.hostname = this._parts.hostname.toLowerCase();\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizePort = function(build) {\n\t\t// remove port of it's the protocol's default\n\t\tif (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n\t\t\tthis._parts.port = null;\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizePath = function(build) {\n\t\tvar _path = this._parts.path;\n\t\tif (!_path) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._parts.urn) {\n\t\t\tthis._parts.path = URI.recodeUrnPath(this._parts.path);\n\t\t\tthis.build(!build);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._parts.path === '/') {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar _was_relative;\n\t\tvar _leadingParents = '';\n\t\tvar _parent, _pos;\n\n\t\t// handle relative paths\n\t\tif (_path.charAt(0) !== '/') {\n\t\t\t_was_relative = true;\n\t\t\t_path = '/' + _path;\n\t\t}\n\n\t\t// handle relative files (as opposed to directories)\n\t\tif (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n\t\t\t_path += '/';\n\t\t}\n\n\t\t// resolve simples\n\t\t_path = _path\n\t\t\t.replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n\t\t\t.replace(/\\/{2,}/g, '/');\n\n\t\t// remember leading parents\n\t\tif (_was_relative) {\n\t\t\t_leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n\t\t\tif (_leadingParents) {\n\t\t\t\t_leadingParents = _leadingParents[0];\n\t\t\t}\n\t\t}\n\n\t\t// resolve parents\n\t\twhile (true) {\n\t\t\t_parent = _path.indexOf('/..');\n\t\t\tif (_parent === -1) {\n\t\t\t\t// no more ../ to resolve\n\t\t\t\tbreak;\n\t\t\t} else if (_parent === 0) {\n\t\t\t\t// top level cannot be relative, skip it\n\t\t\t\t_path = _path.substring(3);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t_pos = _path.substring(0, _parent).lastIndexOf('/');\n\t\t\tif (_pos === -1) {\n\t\t\t\t_pos = _parent;\n\t\t\t}\n\t\t\t_path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n\t\t}\n\n\t\t// revert to relative\n\t\tif (_was_relative && this.is('relative')) {\n\t\t\t_path = _leadingParents + _path.substring(1);\n\t\t}\n\n\t\t_path = URI.recodePath(_path);\n\t\tthis._parts.path = _path;\n\t\tthis.build(!build);\n\t\treturn this;\n\t};\n\tp.normalizePathname = p.normalizePath;\n\tp.normalizeQuery = function(build) {\n\t\tif (typeof this._parts.query === 'string') {\n\t\t\tif (!this._parts.query.length) {\n\t\t\t\tthis._parts.query = null;\n\t\t\t} else {\n\t\t\t\tthis.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n\t\t\t}\n\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizeFragment = function(build) {\n\t\tif (!this._parts.fragment) {\n\t\t\tthis._parts.fragment = null;\n\t\t\tthis.build(!build);\n\t\t}\n\n\t\treturn this;\n\t};\n\tp.normalizeSearch = p.normalizeQuery;\n\tp.normalizeHash = p.normalizeFragment;\n\n\tp.iso8859 = function() {\n\t\t// expect unicode input, iso8859 output\n\t\tvar e = URI.encode;\n\t\tvar d = URI.decode;\n\n\t\tURI.encode = escape;\n\t\tURI.decode = decodeURIComponent;\n\t\ttry {\n\t\t\tthis.normalize();\n\t\t} finally {\n\t\t\tURI.encode = e;\n\t\t\tURI.decode = d;\n\t\t}\n\t\treturn this;\n\t};\n\n\tp.unicode = function() {\n\t\t// expect iso8859 input, unicode output\n\t\tvar e = URI.encode;\n\t\tvar d = URI.decode;\n\n\t\tURI.encode = strictEncodeURIComponent;\n\t\tURI.decode = unescape;\n\t\ttry {\n\t\t\tthis.normalize();\n\t\t} finally {\n\t\t\tURI.encode = e;\n\t\t\tURI.decode = d;\n\t\t}\n\t\treturn this;\n\t};\n\n\tp.readable = function() {\n\t\tvar uri = this.clone();\n\t\t// removing username, password, because they shouldn't be displayed according to RFC 3986\n\t\turi.username('').password('').normalize();\n\t\tvar t = '';\n\t\tif (uri._parts.protocol) {\n\t\t\tt += uri._parts.protocol + '://';\n\t\t}\n\n\t\tif (uri._parts.hostname) {\n\t\t\tif (uri.is('punycode') && punycode) {\n\t\t\t\tt += punycode.toUnicode(uri._parts.hostname);\n\t\t\t\tif (uri._parts.port) {\n\t\t\t\t\tt += ':' + uri._parts.port;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tt += uri.host();\n\t\t\t}\n\t\t}\n\n\t\tif (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n\t\t\tt += '/';\n\t\t}\n\n\t\tt += uri.path(true);\n\t\tif (uri._parts.query) {\n\t\t\tvar q = '';\n\t\t\tfor (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n\t\t\t\tvar kv = (qp[i] || '').split('=');\n\t\t\t\tq += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n\t\t\t\t\t.replace(/&/g, '%26');\n\n\t\t\t\tif (kv[1] !== undefined) {\n\t\t\t\t\tq += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n\t\t\t\t\t\t.replace(/&/g, '%26');\n\t\t\t\t}\n\t\t\t}\n\t\t\tt += '?' + q.substring(1);\n\t\t}\n\n\t\tt += URI.decodeQuery(uri.hash(), true);\n\t\treturn t;\n\t};\n\n\t// resolving relative and absolute URLs\n\tp.absoluteTo = function(base) {\n\t\tvar resolved = this.clone();\n\t\tvar properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n\t\tvar basedir, i, p;\n\n\t\tif (this._parts.urn) {\n\t\t\tthrow new Error('URNs do not have any generally defined hierarchical components');\n\t\t}\n\n\t\tif (!(base instanceof URI)) {\n\t\t\tbase = new URI(base);\n\t\t}\n\n\t\tif (!resolved._parts.protocol) {\n\t\t\tresolved._parts.protocol = base._parts.protocol;\n\t\t}\n\n\t\tif (this._parts.hostname) {\n\t\t\treturn resolved;\n\t\t}\n\n\t\tfor (i = 0; (p = properties[i]); i++) {\n\t\t\tresolved._parts[p] = base._parts[p];\n\t\t}\n\n\t\tif (!resolved._parts.path) {\n\t\t\tresolved._parts.path = base._parts.path;\n\t\t\tif (!resolved._parts.query) {\n\t\t\t\tresolved._parts.query = base._parts.query;\n\t\t\t}\n\t\t} else if (resolved._parts.path.substring(-2) === '..') {\n\t\t\tresolved._parts.path += '/';\n\t\t}\n\n\t\tif (resolved.path().charAt(0) !== '/') {\n\t\t\tbasedir = base.directory();\n\t\t\tbasedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n\t\t\tresolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n\t\t\tresolved.normalizePath();\n\t\t}\n\n\t\tresolved.build();\n\t\treturn resolved;\n\t};\n\tp.relativeTo = function(base) {\n\t\tvar relative = this.clone().normalize();\n\t\tvar relativeParts, baseParts, common, relativePath, basePath;\n\n\t\tif (relative._parts.urn) {\n\t\t\tthrow new Error('URNs do not have any generally defined hierarchical components');\n\t\t}\n\n\t\tbase = new URI(base).normalize();\n\t\trelativeParts = relative._parts;\n\t\tbaseParts = base._parts;\n\t\trelativePath = relative.path();\n\t\tbasePath = base.path();\n\n\t\tif (relativePath.charAt(0) !== '/') {\n\t\t\tthrow new Error('URI is already relative');\n\t\t}\n\n\t\tif (basePath.charAt(0) !== '/') {\n\t\t\tthrow new Error('Cannot calculate a URI relative to another relative URI');\n\t\t}\n\n\t\tif (relativeParts.protocol === baseParts.protocol) {\n\t\t\trelativeParts.protocol = null;\n\t\t}\n\n\t\tif (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tif (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tif (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n\t\t\trelativeParts.hostname = null;\n\t\t\trelativeParts.port = null;\n\t\t} else {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tif (relativePath === basePath) {\n\t\t\trelativeParts.path = '';\n\t\t\treturn relative.build();\n\t\t}\n\n\t\t// determine common sub path\n\t\tcommon = URI.commonPath(relativePath, basePath);\n\n\t\t// If the paths have nothing in common, return a relative URL with the absolute path.\n\t\tif (!common) {\n\t\t\treturn relative.build();\n\t\t}\n\n\t\tvar parents = baseParts.path\n\t\t\t.substring(common.length)\n\t\t\t.replace(/[^\\/]*$/, '')\n\t\t\t.replace(/.*?\\//g, '../');\n\n\t\trelativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n\t\treturn relative.build();\n\t};\n\n\t// comparing URIs\n\tp.equals = function(uri) {\n\t\tvar one = this.clone();\n\t\tvar two = new URI(uri);\n\t\tvar one_map = {};\n\t\tvar two_map = {};\n\t\tvar checked = {};\n\t\tvar one_query, two_query, key;\n\n\t\tone.normalize();\n\t\ttwo.normalize();\n\n\t\t// exact match\n\t\tif (one.toString() === two.toString()) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// extract query string\n\t\tone_query = one.query();\n\t\ttwo_query = two.query();\n\t\tone.query('');\n\t\ttwo.query('');\n\n\t\t// definitely not equal if not even non-query parts match\n\t\tif (one.toString() !== two.toString()) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// query parameters have the same length, even if they're permuted\n\t\tif (one_query.length !== two_query.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tone_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n\t\ttwo_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n\t\tfor (key in one_map) {\n\t\t\tif (hasOwn.call(one_map, key)) {\n\t\t\t\tif (!isArray(one_map[key])) {\n\t\t\t\t\tif (one_map[key] !== two_map[key]) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (!arraysEqual(one_map[key], two_map[key])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tchecked[key] = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (key in two_map) {\n\t\t\tif (hasOwn.call(two_map, key)) {\n\t\t\t\tif (!checked[key]) {\n\t\t\t\t\t// two contains a parameter not present in one\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\n\t// state\n\tp.duplicateQueryParameters = function(v) {\n\t\tthis._parts.duplicateQueryParameters = !!v;\n\t\treturn this;\n\t};\n\n\tp.escapeQuerySpace = function(v) {\n\t\tthis._parts.escapeQuerySpace = !!v;\n\t\treturn this;\n\t};\n\n\treturn URI;\n}));","Workflow = {}\n\n@ImageSign = {};\n\n@TracesHandler = {};\n\n@TracesTemplate = {};\n\n@InstanceformTemplate = {};\n\n@InstanceAttachmentTemplate = {};\n\n@InstanceSignText = {}\n\n@RelatedInstances = {}\n\n@RelatedRecords = {}\n\n@InstanceMacro = {context: {}}\n\n@TracesManager = {};\n\nInstanceSignText.isOpinionField_from_string = (field_formula)->\n\treturn (field_formula?.indexOf(\"{traces.\") > -1 || field_formula?.indexOf(\"{signature.traces.\") > -1 || field_formula?.indexOf(\"{yijianlan:\") > -1 || field_formula?.indexOf(\"{\\\"yijianlan\\\":\") > -1 || field_formula?.indexOf(\"{'yijianlan':\") > -1)\n\nInstanceSignText.includesOpinionField = (form, form_version)->\n\tfield_formulas = new Array();\n\n\t_form_version = {}\n\n\tif Meteor.isServer\n\t\t_form_version = uuflowManager.getFormVersion(db.forms.findOne({_id: form}), form_version)\n\telse\n\t\t_form_version = db.form_versions.findOne({_id: form_version, form: form})\n\n\tfields = _form_version?.fields || []\n\n\tfields.forEach (f)->\n\t\tif f.type == 'table'\n\t\t\tconsole.log 'ignore opinion field in table'\n\t\telse if f.type == 'section'\n\t\t\tf?.fields?.forEach (f1)->\n\t\t\t\tfield_formulas.push f1.formula\n\t\telse\n\t\t\tfield_formulas.push f.formula\n\n\t_.some field_formulas, (field_formula)->\n\t\treturn InstanceformTemplate.helpers.isOpinionField_from_string(field_formula)\n\n"," \n\nWorkflow = {};\n\nthis.ImageSign = {};\n\nthis.TracesHandler = {};\n\nthis.TracesTemplate = {};\n\nthis.InstanceformTemplate = {};\n\nthis.InstanceAttachmentTemplate = {};\n\nthis.InstanceSignText = {};\n\nthis.RelatedInstances = {};\n\nthis.RelatedRecords = {};\n\nthis.InstanceMacro = {\n context: {}\n};\n\nthis.TracesManager = {};\n\nInstanceSignText.isOpinionField_from_string = function(field_formula) {\n return (field_formula != null ? field_formula.indexOf(\"{traces.\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{signature.traces.\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{yijianlan:\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{\\\"yijianlan\\\":\") : void 0) > -1 || (field_formula != null ? field_formula.indexOf(\"{'yijianlan':\") : void 0) > -1;\n};\n\nInstanceSignText.includesOpinionField = function(form, form_version) {\n var _form_version, field_formulas, fields;\n field_formulas = new Array();\n _form_version = {};\n if (Meteor.isServer) {\n _form_version = uuflowManager.getFormVersion(db.forms.findOne({\n _id: form\n }), form_version);\n } else {\n _form_version = db.form_versions.findOne({\n _id: form_version,\n form: form\n });\n }\n fields = (_form_version != null ? _form_version.fields : void 0) || [];\n fields.forEach(function(f) {\n var ref;\n if (f.type === 'table') {\n return console.log('ignore opinion field in table');\n } else if (f.type === 'section') {\n return f != null ? (ref = f.fields) != null ? ref.forEach(function(f1) {\n return field_formulas.push(f1.formula);\n }) : void 0 : void 0;\n } else {\n return field_formulas.push(f.formula);\n }\n });\n return _.some(field_formulas, function(field_formula) {\n return InstanceformTemplate.helpers.isOpinionField_from_string(field_formula);\n });\n};\n","db.instance_tasks = new Meteor.Collection('instance_tasks')\n\ndb.instance_tasks._simpleSchema = new SimpleSchema\n instance:\n type: String\n trace:\n type: String\n is_finished:\n type: String\n user:\n type: String\n user_name:\n type: String\n handler:\n type: String\n handler_name:\n type: String\n handler_organization:\n type: String\n handler_organization_name:\n type: String\n handler_organization_fullname:\n type: String\n start_date:\n type: Date\n due_date:\n type: Date\n is_read:\n type: Boolean\n is_error:\n type: Boolean\n values:\n type: Object\n deadline:\n type: Date\n remind_date:\n type: Date\n reminded_count:\n type: Number\n read_date:\n type: Date\n description:\n type: String\n modified:\n type: Date\n modified_by:\n type: String\n sign_show:\n type: Boolean\n judge:\n type: String\n next_steps:\n type: Array\n \"next_steps.$\":\n type: Object\n \"next_steps.$.step\":\n type: String\n \"next_steps.$.users\":\n type: [String]\n finish_date:\n type: Date\n cost_time:\n type: Number\n space:\n type: String\n instance_name:\n type: String\n submitter:\n type: String\n submitter_name:\n type: String\n applicant:\n type: String\n applicant_name:\n type: String\n applicant_organization_name:\n type: String\n submit_date:\n type: Date\n flow:\n type: String\n flow_name:\n type: String\n form:\n type: String\n step:\n type: String\n step_name:\n type: String\n category_name:\n type: String\n instance_state:\n type: String\n distribute_from_instance:\n type: String\n forward_from_instance:\n type: String\n keywords:\n type: String\n is_archived:\n type: Boolean\n category:\n type: String\n","db.auth_tokens = new Meteor.Collection('auth_tokens')","marked = require(\"marked\")\n\nInstanceReadOnlyTemplate = {};\n\n\nInstanceReadOnlyTemplate.instance_attachment = \"\"\"\n\t
{{{description}}}
\n\t\t\t\t\t{{{getValue code}}}
\n\t\t\t\t\t{{else}}\n\t\t\t\t\t\t{{{description}}}
\n\t\t\t\t\t{{{description}}}
\\n\t\t\t\t{{{getValue code}}}
\\n\t\t\t\t{{else}}\\n\t\t\t\t\t{{{description}}}
\\n\t\t\t\t\n\t\t\t\t\t#{this.instance_title().pageTitle}\n\t\t\t\t | \n\t\t\t
\n\t\t\t\t\t | \n\t\t\t\t\t | \n\t\t\t\t\t | \n\t\t\t\t | \n\t\t\t\t\t\t{{afFieldLabelText name=\"#{table_field.code}\"}}\n\t\t\t\t\t | \n\t\t\t\t\t\n\t\t\t\t\t\t{{> instanceSignText name=\"#{table_field.code}\"}}\n\t\t\t\t\t | \n\t\t\t\t\"\"\"\n\t\t\t\ttemplate += table_field.tr_end\n\t\t\telse\n\t\t\t\tif InstanceformTemplate.helpers.includes(table_field.type, 'section,table')\n\t\t\t\t\ttemplate += table_field.tr_start\n\t\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\t {{> afFormGroup name=\"#{table_field.code}\" label=false}}\n\t\t\t\t\t\t | \n\t\t\t\t\t\"\"\"\n\t\t\t\t\ttemplate += table_field.tr_end\n\t\t\t\telse\n\t\t\t\t\ttemplate += table_field.tr_start\n\n\t\t\t\t\tif _export\n\t\t\t\t\t\ttitle_permission = \"\"\n\t\t\t\t\t\tfield_permission = \"\"\n\t\t\t\t\telse\n\t\t\t\t\t\ttitle_permission = \"title-\" + table_field.permission\n\t\t\t\t\t\tfield_permission = \"field-\" + table_field.permission\n\n\t\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{afFieldLabelText name=\"#{table_field.code}\"}}\n\t\t\t\t\t\t | \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{> afFormGroup name=\"#{table_field.code}\" label=false}}\n\t\t\t\t\t\t | \n\t\t\t\t\t\"\"\"\n\t\t\t\t\ttemplate += table_field.tr_end\n\n\ttemplate += \"\"\"\n\t\t
---|
\n\t\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t{{>Template.dynamic template=\"afSelectUser\" data=applicantContext}}\n\t\t\t\t\t \n\t\t\t\t | \n\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t\t\t{{formatDate instance.submit_date '{\"format\":\"YYYY-MM-DD\"}'}}\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t | \n\t\t\t
\n#\t\t\t\t\t{{instance.name}}\n#\t\t\t\t\t\n#\t\t\t\t | \n#\t\t\t
\n#\t\t\t\t\t\n#\t\t\t\t\t{{>Template.dynamic template=\"afSelectUser\" data=applicantContext}}\n#\t\t\t\t | \n#\t\t\t
\n#\t\t\t\t\t\t\t{{afFieldLabelText name=this.code}}\n#\t\t\t\t\t\t | \n#\t\t\t\t\t\t\n#\t\t\t\t\t\t\t{{> instanceSignText step=(getOpinionFieldStepName this) default=''}}\n#\t\t\t\t\t\t | \n#\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t{{else}}\n#\t\t\t\t\t{{#if includes this.type 'section,table'}}\n#\t\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t {{> afFormGroup name=this.code label=false}}\n#\t\t\t\t\t\t\t | \n#\t\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t\t{{else}}\n#\t\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\t{{afFieldLabelText name=this.code}}\n#\t\t\t\t\t\t\t | \n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\t{{> afFormGroup name=this.code label=false}}\n#\t\t\t\t\t\t\t | \n#\t\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t\t{{/if}}\n#\t\t\t\t{{/if}}\n#\n#\t\t {{/each}}\n#\t\t
\\n\t\t\t\t\" + (this.instance_title().pageTitle) + \"\\n\t\t\t | \\n\t\t
\\n\t\t\t\t | \\n\t\t\t\t | \\n\t\t\t\t | \\n\t\t\t | \\n\t{{afFieldLabelText name=\\\"\" + table_field.code + \"\\\"}}\\n | \\n\\n\t{{> instanceSignText name=\\\"\" + table_field.code + \"\\\"}}\\n | \";\n return template += table_field.tr_end;\n } else {\n if (InstanceformTemplate.helpers.includes(table_field.type, 'section,table')) {\n template += table_field.tr_start;\n template += \"\\n {{> afFormGroup name=\\\"\" + table_field.code + \"\\\" label=false}}\\n | \";\n return template += table_field.tr_end;\n } else {\n template += table_field.tr_start;\n if (_export) {\n title_permission = \"\";\n field_permission = \"\";\n } else {\n title_permission = \"title-\" + table_field.permission;\n field_permission = \"field-\" + table_field.permission;\n }\n template += \"\\n\t{{afFieldLabelText name=\\\"\" + table_field.code + \"\\\"}}\\n | \\n\\n\t{{> afFormGroup name=\\\"\" + table_field.code + \"\\\" label=false}}\\n | \";\n return template += table_field.tr_end;\n }\n }\n }\n });\n template += \"\t
---|
\\n\t\t\t\t \\n\t\t\t\t\t\\n\t\t\t\t \\n\t\t\t\t\\n\t\t\t\t\t{{>Template.dynamic template=\\\"afSelectUser\\\" data=applicantContext}}\\n\t\t\t\t \\n\t\t\t | \\n\t\t\t\\n\t\t\t\t \\n\t\t\t\t\t \\n\t\t\t\\n\t\t\t\t\t\t\\n\t\t\t\t\t \\n\t\t\t\t\t\\n\t\t\t\t\t\t \\n\t\t\t\t\\n\t\t\t\t\t\t\t{{formatDate instance.submit_date '{\\\"format\\\":\\\"YYYY-MM-DD\\\"}'}}\\n\t\t\t\t\t\t \\n\t\t\t\t\t | \\n\t\t
{{{description}}}
\n\t\t\t\t\t{{{getValue code}}}
\n\t\t\t\t\t{{else}}\n\t\t\t\t\t\t{{{description}}}
\n\t\t\t\t\t{{{description}}}
\\n\t\t\t\t{{{getValue code}}}
\\n\t\t\t\t{{else}}\\n\t\t\t\t\t{{{description}}}
\\n\t\t\t\t\n\t\t\t\t\t#{this.instance_title().pageTitle}\n\t\t\t\t | \n\t\t\t
\n\t\t\t\t\t | \n\t\t\t\t\t | \n\t\t\t\t\t | \n\t\t\t\t | \n\t\t\t\t\t\t{{afFieldLabelText name=\"#{table_field.code}\"}}\n\t\t\t\t\t | \n\t\t\t\t\t\n\t\t\t\t\t\t{{> instanceSignText name=\"#{table_field.code}\"}}\n\t\t\t\t\t | \n\t\t\t\t\"\"\"\n\t\t\t\ttemplate += table_field.tr_end\n\t\t\telse\n\t\t\t\tif InstanceformTemplate.helpers.includes(table_field.type, 'section,table')\n\t\t\t\t\ttemplate += table_field.tr_start\n\t\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\t {{> afFormGroup name=\"#{table_field.code}\" label=false}}\n\t\t\t\t\t\t | \n\t\t\t\t\t\"\"\"\n\t\t\t\t\ttemplate += table_field.tr_end\n\t\t\t\telse\n\t\t\t\t\ttemplate += table_field.tr_start\n\n\t\t\t\t\tif _export\n\t\t\t\t\t\ttitle_permission = \"\"\n\t\t\t\t\t\tfield_permission = \"\"\n\t\t\t\t\telse\n\t\t\t\t\t\ttitle_permission = \"title-\" + table_field.permission\n\t\t\t\t\t\tfield_permission = \"field-\" + table_field.permission\n\n\t\t\t\t\ttemplate += \"\"\"\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{afFieldLabelText name=\"#{table_field.code}\"}}\n\t\t\t\t\t\t | \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{{> afFormGroup name=\"#{table_field.code}\" label=false}}\n\t\t\t\t\t\t | \n\t\t\t\t\t\"\"\"\n\t\t\t\t\ttemplate += table_field.tr_end\n\n\ttemplate += \"\"\"\n\t\t
---|
\n\t\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t{{>Template.dynamic template=\"afSelectUser\" data=applicantContext}}\n\t\t\t\t\t \n\t\t\t\t | \n\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t\t \n\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t\t\t \n\t\t\t\t\t\n\t\t\t\t\t\t\t\t{{formatDate instance.submit_date '{\"format\":\"YYYY-MM-DD\"}'}}\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t | \n\t\t\t
\n#\t\t\t\t\t{{instance.name}}\n#\t\t\t\t\t\n#\t\t\t\t | \n#\t\t\t
\n#\t\t\t\t\t\n#\t\t\t\t\t{{>Template.dynamic template=\"afSelectUser\" data=applicantContext}}\n#\t\t\t\t | \n#\t\t\t
\n#\t\t\t\t\t\t\t{{afFieldLabelText name=this.code}}\n#\t\t\t\t\t\t | \n#\t\t\t\t\t\t\n#\t\t\t\t\t\t\t{{> instanceSignText step=(getOpinionFieldStepName this) default=''}}\n#\t\t\t\t\t\t | \n#\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t{{else}}\n#\t\t\t\t\t{{#if includes this.type 'section,table'}}\n#\t\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t {{> afFormGroup name=this.code label=false}}\n#\t\t\t\t\t\t\t | \n#\t\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t\t{{else}}\n#\t\t\t\t\t\t{{{tr_start}}}\n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\t{{afFieldLabelText name=this.code}}\n#\t\t\t\t\t\t\t | \n#\t\t\t\t\t\t\t\n#\t\t\t\t\t\t\t\t{{> afFormGroup name=this.code label=false}}\n#\t\t\t\t\t\t\t | \n#\t\t\t\t\t\t{{{tr_end}}}\n#\t\t\t\t\t{{/if}}\n#\t\t\t\t{{/if}}\n#\n#\t\t {{/each}}\n#\t\t
\\n\t\t\t\t\" + (this.instance_title().pageTitle) + \"\\n\t\t\t | \\n\t\t
\\n\t\t\t\t | \\n\t\t\t\t | \\n\t\t\t\t | \\n\t\t\t | \\n\t{{afFieldLabelText name=\\\"\" + table_field.code + \"\\\"}}\\n | \\n\\n\t{{> instanceSignText name=\\\"\" + table_field.code + \"\\\"}}\\n | \";\n return template += table_field.tr_end;\n } else {\n if (InstanceformTemplate.helpers.includes(table_field.type, 'section,table')) {\n template += table_field.tr_start;\n template += \"\\n {{> afFormGroup name=\\\"\" + table_field.code + \"\\\" label=false}}\\n | \";\n return template += table_field.tr_end;\n } else {\n template += table_field.tr_start;\n if (_export) {\n title_permission = \"\";\n field_permission = \"\";\n } else {\n title_permission = \"title-\" + table_field.permission;\n field_permission = \"field-\" + table_field.permission;\n }\n template += \"\\n\t{{afFieldLabelText name=\\\"\" + table_field.code + \"\\\"}}\\n | \\n\\n\t{{> afFormGroup name=\\\"\" + table_field.code + \"\\\" label=false}}\\n | \";\n return template += table_field.tr_end;\n }\n }\n }\n });\n template += \"\t
---|
\\n\t\t\t\t \\n\t\t\t\t\t\\n\t\t\t\t \\n\t\t\t\t\\n\t\t\t\t\t{{>Template.dynamic template=\\\"afSelectUser\\\" data=applicantContext}}\\n\t\t\t\t \\n\t\t\t | \\n\t\t\t\\n\t\t\t\t \\n\t\t\t\t\t \\n\t\t\t\\n\t\t\t\t\t\t\\n\t\t\t\t\t \\n\t\t\t\t\t\\n\t\t\t\t\t\t \\n\t\t\t\t\\n\t\t\t\t\t\t\t{{formatDate instance.submit_date '{\\\"format\\\":\\\"YYYY-MM-DD\\\"}'}}\\n\t\t\t\t\t\t \\n\t\t\t\t\t | \\n\t\t
a}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./isArray.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3)},"_isArrayLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"memoize.js":function e(t,n,e){let r;function i(e,t){var n=function(i){var o=n.cache,s=""+(t?t.apply(this,arguments):i);return r(o,s)||(o[s]=e.apply(this,arguments)),o[s]};return n.cache={},n}e.export({default:()=>i}),e.link("./_has.js",{default(e){r=e}},0)},"delay.js":function e(t,n,e){let r;e.link("./restArguments.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})))},"defer.js":function e(t,n,e){let r,i,o;e.link("./partial.js",{default(e){r=e}},0),e.link("./delay.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2),e.exportDefault(r(i,o,1))},"throttle.js":function e(t,n,e){let r;function i(e,t,n){var i,o,s,a,u=0;n||(n={});var f=function(){u=!1===n.leading?0:r(),i=null,a=e.apply(o,s),i||(o=s=null)},c=function(){var c=r();u||!1!==n.leading||(u=c);var l=t-(c-u);return o=this,s=arguments,l<=0||l>t?(i&&(clearTimeout(i),i=null),u=c,a=e.apply(o,s),i||(o=s=null)):i||!1===n.trailing||(i=setTimeout(f,l)),a};return c.cancel=function(){clearTimeout(i),u=0,i=o=s=null},c}e.export({default:()=>i}),e.link("./now.js",{default(e){r=e}},0)},"debounce.js":function e(t,n,e){let r,i;function o(e,t,n){var o,s,a,u,f,c=function(){var r=i()-s;t>r?o=setTimeout(c,t-r):(o=null,n||(u=e.apply(f,a)),o||(a=f=null))},l=r((function(r){return f=this,a=r,s=i(),o||(o=setTimeout(c,t),n&&(u=e.apply(f,a))),u}));return l.cancel=function(){clearTimeout(o),o=a=f=null},l}e.export({default:()=>o}),e.link("./restArguments.js",{default(e){r=e}},0),e.link("./now.js",{default(e){i=e}},1)},"wrap.js":function e(t,n,e){let r;function i(e,t){return r(t,e)}e.export({default:()=>i}),e.link("./partial.js",{default(e){r=e}},0)},"negate.js":function e(t,n,e){function r(e){return function(){return!e.apply(this,arguments)}}e.export({default:()=>r})},"compose.js":function e(t,n,e){function r(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}e.export({default:()=>r})},"after.js":function e(t,n,e){function r(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}e.export({default:()=>r})},"before.js":function e(t,n,e){function r(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}e.export({default:()=>r})},"once.js":function e(t,n,e){let r,i;e.link("./partial.js",{default(e){r=e}},0),e.link("./before.js",{default(e){i=e}},1),e.exportDefault(r(i,2))},"findKey.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s,a=0,u=o.length;ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"findIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createPredicateIndexFinder.js":function e(t,n,e){let r,i;function o(e){return function(t,n,o){n=r(n,o);for(var s=i(t),a=e>0?0:s-1;a>=0&&a a}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./_isArrayLike.js",{default(e){i=e}},1),e.link("./isArray.js",{default(e){o=e}},2),e.link("./isArguments.js",{default(e){s=e}},3)},"_isArrayLike.js":function e(t,n,e){let r,i;e.link("./_createSizePropertyCheck.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1),e.exportDefault(r(i))},"memoize.js":function e(t,n,e){let r;function i(e,t){var n=function(i){var o=n.cache,s=""+(t?t.apply(this,arguments):i);return r(o,s)||(o[s]=e.apply(this,arguments)),o[s]};return n.cache={},n}e.export({default:()=>i}),e.link("./_has.js",{default(e){r=e}},0)},"delay.js":function e(t,n,e){let r;e.link("./restArguments.js",{default(e){r=e}},0),e.exportDefault(r((function(e,t,n){return setTimeout((function(){return e.apply(null,n)}),t)})))},"defer.js":function e(t,n,e){let r,i,o;e.link("./partial.js",{default(e){r=e}},0),e.link("./delay.js",{default(e){i=e}},1),e.link("./underscore.js",{default(e){o=e}},2),e.exportDefault(r(i,o,1))},"throttle.js":function e(t,n,e){let r;function i(e,t,n){var i,o,s,a,u=0;n||(n={});var f=function(){u=!1===n.leading?0:r(),i=null,a=e.apply(o,s),i||(o=s=null)},c=function(){var c=r();u||!1!==n.leading||(u=c);var l=t-(c-u);return o=this,s=arguments,l<=0||l>t?(i&&(clearTimeout(i),i=null),u=c,a=e.apply(o,s),i||(o=s=null)):i||!1===n.trailing||(i=setTimeout(f,l)),a};return c.cancel=function(){clearTimeout(i),u=0,i=o=s=null},c}e.export({default:()=>i}),e.link("./now.js",{default(e){r=e}},0)},"debounce.js":function e(t,n,e){let r,i;function o(e,t,n){var o,s,a,u,f,c=function(){var r=i()-s;t>r?o=setTimeout(c,t-r):(o=null,n||(u=e.apply(f,a)),o||(a=f=null))},l=r((function(r){return f=this,a=r,s=i(),o||(o=setTimeout(c,t),n&&(u=e.apply(f,a))),u}));return l.cancel=function(){clearTimeout(o),o=a=f=null},l}e.export({default:()=>o}),e.link("./restArguments.js",{default(e){r=e}},0),e.link("./now.js",{default(e){i=e}},1)},"wrap.js":function e(t,n,e){let r;function i(e,t){return r(t,e)}e.export({default:()=>i}),e.link("./partial.js",{default(e){r=e}},0)},"negate.js":function e(t,n,e){function r(e){return function(){return!e.apply(this,arguments)}}e.export({default:()=>r})},"compose.js":function e(t,n,e){function r(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}}e.export({default:()=>r})},"after.js":function e(t,n,e){function r(e,t){return function(){if(--e<1)return t.apply(this,arguments)}}e.export({default:()=>r})},"before.js":function e(t,n,e){function r(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}}e.export({default:()=>r})},"once.js":function e(t,n,e){let r,i;e.link("./partial.js",{default(e){r=e}},0),e.link("./before.js",{default(e){i=e}},1),e.exportDefault(r(i,2))},"findKey.js":function e(t,n,e){let r,i;function o(e,t,n){t=r(t,n);for(var o=i(e),s,a=0,u=o.length;ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"findIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(1))},"_createPredicateIndexFinder.js":function e(t,n,e){let r,i;function o(e){return function(t,n,o){n=r(n,o);for(var s=i(t),a=e>0?0:s-1;a>=0&&ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"findLastIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"sortedIndex.js":function e(t,n,e){let r,i;function o(e,t,n,o){for(var s=(n=r(n,o,1))(t),a=0,u=i(e);ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"indexOf.js":function e(t,n,e){let r,i,o;e.link("./sortedIndex.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./_createIndexFinder.js",{default(e){o=e}},2),e.exportDefault(o(1,i,r))},"_createIndexFinder.js":function e(t,n,e){let r,i,o;function s(e,t,n){return function(s,a,u){var f=0,c=r(s);if("number"==typeof u)e>0?f=u>=0?u:Math.max(u+c,f):c=u>=0?Math.min(u+1,c):u+c+1;else if(n&&u&&c)return s[u=n(s,a)]===a?u:-1;if(a!=a)return(u=t(i.call(s,f,c),o))>=0?u+f:-1;for(u=e>0?f:c-1;u>=0&&uo}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./contains.js",{default(e){i=e}},1)},"unzip.js":function e(t,n,e){let r,i,o;function s(e){for(var t=e&&r(e,i).length||0,n=Array(t),s=0;so}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./keys.js",{default(e){i=e}},1)},"_cb.js":function e(t,n,e){let r,i,o;function s(e,t,n){return r.iteratee!==o?r.iteratee(e,t):i(e,t,n)}e.export({default:()=>s}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),e.link("./iteratee.js",{default(e){o=e}},2)},"_baseIteratee.js":function e(t,n,e){let r,i,o,s,a,u,f;function c(e,t,n){return null==e?r:i(e)?f(e,t,n):o(e)&&!s(e)?a(e):u(e)}e.export({default:()=>c}),e.link("./identity.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./isObject.js",{default(e){o=e}},2),e.link("./isArray.js",{default(e){s=e}},3),e.link("./matcher.js",{default(e){a=e}},4),e.link("./property.js",{default(e){u=e}},5),e.link("./_optimizeCb.js",{default(e){f=e}},6)},"identity.js":function e(t,n,e){function r(e){return e}e.export({default:()=>r})},"matcher.js":function e(t,n,e){let r,i;function o(e){return e=r({},e),function(t){return i(t,e)}}e.export({default:()=>o}),e.link("./extendOwn.js",{default(e){r=e}},0),e.link("./isMatch.js",{default(e){i=e}},1)},"property.js":function e(t,n,e){let r,i;function o(e){return e=i(e),function(t){return r(t,e)}}e.export({default:()=>o}),e.link("./_deepGet.js",{default(e){r=e}},0),e.link("./_toPath.js",{default(e){i=e}},1)},"_optimizeCb.js":function e(t,n,e){function r(e,t,n){if(void 0===t)return e;switch(null==n?3:n){case 1:return function(n){return e.call(t,n)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,o){return e.call(t,n,r,i,o)}}return function(){return e.apply(t,arguments)}}e.export({default:()=>r})},"iteratee.js":function e(t,n,e){let r,i;function o(e,t){return i(e,t,1/0)}e.export({default:()=>o}),e.link("./underscore.js",{default(e){r=e}},0),e.link("./_baseIteratee.js",{default(e){i=e}},1),r.iteratee=o},"noop.js":function e(t,n,e){function r(){}e.export({default:()=>r})},"propertyOf.js":function e(t,n,e){let r,i;function o(e){return null==e?r:function(t){return i(e,t)}}e.export({default:()=>o}),e.link("./noop.js",{default(e){r=e}},0),e.link("./get.js",{default(e){i=e}},1)},"times.js":function e(t,n,e){let r;function i(e,t,n){var i=Array(Math.max(0,e));t=r(t,n,1);for(var o=0;oo}),e.link("./_baseCreate.js",{default(e){r=e}},0),e.link("./isObject.js",{default(e){i=e}},1)},"bind.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./isFunction.js",{default(e){i=e}},1),e.link("./_executeBound.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t,n){if(!i(e))throw new TypeError("Bind must be called on a function");var s=r((function(r){return o(e,s,t,this,n.concat(r))}));return s})))},"bindAll.js":function e(t,n,e){let r,i,o;e.link("./restArguments.js",{default(e){r=e}},0),e.link("./_flatten.js",{default(e){i=e}},1),e.link("./bind.js",{default(e){o=e}},2),e.exportDefault(r((function(e,t){var n=(t=i(t,!1,!1)).length;if(n<1)throw new Error("bindAll must be passed function names");for(;n--;){var r=t[n];e[r]=o(e[r],e)}return e})))},"_flatten.js":function e(t,n,e){let r,i,o,s;function a(e,t,n,u){if(u=u||[],t||0===t){if(t<=0)return u.concat(e)}else t=1/0;for(var f=u.length,c=0,l=r(e);co}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"findLastIndex.js":function e(t,n,e){let r;e.link("./_createPredicateIndexFinder.js",{default(e){r=e}},0),e.exportDefault(r(-1))},"sortedIndex.js":function e(t,n,e){let r,i;function o(e,t,n,o){for(var s=(n=r(n,o,1))(t),a=0,u=i(e);ao}),e.link("./_cb.js",{default(e){r=e}},0),e.link("./_getLength.js",{default(e){i=e}},1)},"indexOf.js":function e(t,n,e){let r,i,o;e.link("./sortedIndex.js",{default(e){r=e}},0),e.link("./findIndex.js",{default(e){i=e}},1),e.link("./_createIndexFinder.js",{default(e){o=e}},2),e.exportDefault(o(1,i,r))},"_createIndexFinder.js":function e(t,n,e){let r,i,o;function s(e,t,n){return function(s,a,u){var f=0,c=r(s);if("number"==typeof u)e>0?f=u>=0?u:Math.max(u+c,f):c=u>=0?Math.min(u+1,c):u+c+1;else if(n&&u&&c)return s[u=n(s,a)]===a?u:-1;if(a!=a)return(u=t(i.call(s,f,c),o))>=0?u+f:-1;for(u=e>0?f:c-1;u>=0&&uo}),e.link("./_getLength.js",{default(e){r=e}},0),e.link("./contains.js",{default(e){i=e}},1)},"unzip.js":function e(t,n,e){let r,i,o;function s(e){for(var t=e&&r(e,i).length||0,n=Array(t),s=0;s",t.document[0]).appendTo(o)):"tr"===s?t._createTrPlaceholder(t.currentItem,o):"img"===s&&o.attr("src",t.currentItem.attr("src")),i||o.css("visibility","hidden"),o},update:function(e,o){(!i||s.forcePlaceholderSize)&&(o.height()||o.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),o.width()||o.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each((function(){e(" ",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)}))},_contactContainers:function(t){var i,s,o,r,n,a,l,c,h,u,p=null,d=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(p&&e.contains(this.containers[i].element[0],p.element[0]))continue;p=this.containers[i],d=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(p)if(1===this.containers.length)this.containers[d].containerCache.over||(this.containers[d]._trigger("over",t,this._uiHash(this)),this.containers[d].containerCache.over=1);else{for(o=1e4,r=null,n=(h=p.floating||this._isFloating(this.currentItem))?"left":"top",a=h?"width":"height",u=h?"pageX":"pageY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[d].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[n],c=!1,t[u]-l>this.items[s][a]/2&&(c=!0),o>Math.abs(t[u]-l)&&(o=Math.abs(t[u]-l),r=this.items[s],this.direction=c?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[d])return void(this.currentContainer.containerCache.over||(this.containers[d]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1));r?this._rearrange(t,r,null,!0):this._rearrange(t,null,this.containers[d].element,!0),this._trigger("change",t,this._uiHash()),this.containers[d]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[d],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",t,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,o=this.options;"parent"===o.containment&&(o.containment=this.helper[0].parentNode),("document"===o.containment||"window"===o.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===o.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===o.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(o.containment)||(t=e(o.containment)[0],i=e(o.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,o="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,r=/(html|body)/i.test(o[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():r?0:o.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():r?0:o.scrollLeft())*s}},_generatePosition:function(t){var i,s,o=this.options,r=t.pageX,n=t.pageY,a="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(a[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left