` element.\n *\n * If you are creating a reusable component then you should be careful when using `\"*\": \"$inherit\"`\n * since you may inadvertently inherit a setting in the future that changes the behavior of your component.\n *\n *\n * ## Triggering and debouncing model updates\n *\n * The `updateOn` and `debounce` properties allow you to specify a custom list of events that will\n * trigger a model update and/or a debouncing delay so that the actual update only takes place when\n * a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different from the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController#$rollbackViewValue} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController#$rollbackViewValue}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * The following example shows how to override immediate updates. Changes on the inputs within the\n * form will update the model only when the control loses focus (blur event). If `escape` key is\n * pressed while the input field is focused, the value is reset to the value in the current model.\n *\n *
\n * \n * \n *
\n *
user.name = \n *
\n * \n * \n * angular.module('optionsExample', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.user = { name: 'say', data: '' };\n *\n * $scope.cancel = function(e) {\n * if (e.keyCode === 27) {\n * $scope.userForm.userName.$rollbackViewValue();\n * }\n * };\n * }]);\n * \n * \n * var model = element(by.binding('user.name'));\n * var input = element(by.model('user.name'));\n * var other = element(by.model('user.data'));\n *\n * it('should allow custom events', function() {\n * input.sendKeys(' hello');\n * input.click();\n * expect(model.getText()).toEqual('say');\n * other.click();\n * expect(model.getText()).toEqual('say hello');\n * });\n *\n * it('should $rollbackViewValue when model changes', function() {\n * input.sendKeys(' hello');\n * expect(input.getAttribute('value')).toEqual('say hello');\n * input.sendKeys(protractor.Key.ESCAPE);\n * expect(input.getAttribute('value')).toEqual('say');\n * other.click();\n * expect(model.getText()).toEqual('say');\n * });\n * \n * \n *\n * The next example shows how to debounce model changes. Model will be updated only 1 sec after last change.\n * If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n *\n *
\n * \n * \n *
\n *
user.name = \n *
\n * \n * \n * angular.module('optionsExample', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.user = { name: 'say' };\n * }]);\n * \n * \n *\n * ## Model updates and validation\n *\n * The default behaviour in `ngModel` is that the model value is set to `undefined` when the\n * validation determines that the value is invalid. By setting the `allowInvalid` property to true,\n * the model will still be updated even if the value is invalid.\n *\n *\n * ## Connecting to the scope\n *\n * By setting the `getterSetter` property to true you are telling ngModel that the `ngModel` expression\n * on the scope refers to a \"getter/setter\" function rather than the value itself.\n *\n * The following example shows how to bind to getter/setters:\n *\n *
\n * \n * \n *
\n *
user.name = \n *
\n * \n * \n * angular.module('getterSetterExample', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * var _name = 'Brian';\n * $scope.user = {\n * name: function(newName) {\n * return angular.isDefined(newName) ? (_name = newName) : _name;\n * }\n * };\n * }]);\n * \n * \n *\n *\n * ## Specifying timezones\n *\n * You can specify the timezone that date/time input directives expect by providing its name in the\n * `timezone` property.\n *\n * @param {Object} ngModelOptions options to apply to {@link ngModel} directives on this element and\n * and its descendents. Valid keys are:\n * - `updateOn`: string specifying which event should the input be bound to. You can set several\n * events using an space delimited list. There is a special event called `default` that\n * matches the default events belonging to the control.\n * - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n * custom value for each event. For example:\n * ```\n * ng-model-options=\"{\n * updateOn: 'default blur',\n * debounce: { 'default': 500, 'blur': 0 }\n * }\"\n * ```\n * - `allowInvalid`: boolean value which indicates that the model can be set with values that did\n * not validate correctly instead of the default behavior of setting the model to undefined.\n * - `getterSetter`: boolean value which determines whether or not to treat functions bound to\n * `ngModel` as getters/setters.\n * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for\n * `
`, `
`, ... . It understands UTC/GMT and the\n * continental US time zone abbreviations, but for general use, use a time zone offset, for\n * example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n * If not specified, the timezone of the browser will be used.\n *\n */\nvar ngModelOptionsDirective = function() {\n return {\n restrict: 'A',\n // ngModelOptions needs to run before ngModel and input directives\n priority: 10,\n require: ['ngModelOptions', '?^^ngModelOptions'],\n controller: function NgModelOptionsController() {},\n link: {\n pre: function ngModelOptionsPreLinkFn(scope, element, attrs, ctrls) {\n var optionsCtrl = ctrls[0];\n var parentOptions = ctrls[1] ? ctrls[1].$options : defaultModelOptions;\n optionsCtrl.$options = parentOptions.createChild(scope.$eval(attrs.ngModelOptions));\n }\n }\n };\n};\n\n\n// shallow copy over values from `src` that are not already specified on `dst`\nfunction defaults(dst, src) {\n forEach(src, function(value, key) {\n if (!isDefined(dst[key])) {\n dst[key] = value;\n }\n });\n}\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n *\n * @description\n * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\n * DOM element. This is useful if the element contains what appears to be Angular directives and\n * bindings but which should be ignored by Angular. This could be the case if you have a site that\n * displays snippets of code, for instance.\n *\n * @element ANY\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n * @example\n
\n \n Normal: {{1 + 2}}
\n Ignored: {{1 + 2}}
\n \n \n it('should check ng-non-bindable', function() {\n expect(element(by.binding('1 + 2')).getText()).toContain('3');\n expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n });\n \n \n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/* exported ngOptionsDirective */\n\n/* global jqLiteRemove */\n\nvar ngOptionsMinErr = minErr('ngOptions');\n\n/**\n * @ngdoc directive\n * @name ngOptions\n * @restrict A\n *\n * @description\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `
`\n * elements for the `` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension expression.\n *\n * In many cases, {@link ng.directive:ngRepeat ngRepeat} can be used on `` elements instead of\n * `ngOptions` to achieve a similar result. However, `ngOptions` provides some benefits:\n * - more flexibility in how the ``'s model is assigned via the `select` **`as`** part of the\n * comprehension expression\n * - reduced memory consumption by not creating a new scope for each repeated instance\n * - increased render speed by creating the options in a documentFragment instead of individually\n *\n * When an item in the `` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * Optionally, a single hard-coded `` element, with the value set to an empty string, can\n * be nested into the `` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding the select to a model that is an object or a collection.\n *\n * One issue occurs if you want to preselect an option. For example, if you set\n * the model to an object that is equal to an object in your collection, `ngOptions` won't be able to set the selection,\n * because the objects are not identical. So by default, you should always reference the item in your collection\n * for preselections, e.g.: `$scope.selected = $scope.collection[3]`.\n *\n * Another solution is to use a `track by` clause, because then `ngOptions` will track the identity\n * of the item not by reference, but by the result of the `track by` expression. For example, if your\n * collection items have an id property, you would `track by item.id`.\n *\n * A different issue with objects or collections is that ngModel won't detect if an object property or\n * a collection item changes. For that reason, `ngOptions` additionally watches the model using\n * `$watchCollection`, when the expression contains a `track by` clause or the the select has the `multiple` attribute.\n * This allows ngOptions to trigger a re-rendering of the options even if the actual object/collection\n * has not changed identity, but only a property on the object or an item in the collection changes.\n *\n * Note that `$watchCollection` does a shallow comparison of the properties of the object (or the items in the collection\n * if the model is an array). This means that changing a property deeper than the first level inside the\n * object/collection will not trigger a re-rendering.\n *\n * ## `select` **`as`**\n *\n * Using `select` **`as`** will bind the result of the `select` expression to the model, but\n * the value of the `` and `` html elements will be either the index (for array data sources)\n * or property name (for object data sources) of the value within the collection. If a **`track by`** expression\n * is used, the result of that expression will be set as the value of the `option` and `select` elements.\n *\n *\n * ### `select` **`as`** and **`track by`**\n *\n * \n * Be careful when using `select` **`as`** and **`track by`** in the same expression.\n *
\n *\n * Given this array of items on the $scope:\n *\n * ```js\n * $scope.items = [{\n * id: 1,\n * label: 'aLabel',\n * subItem: { name: 'aSubItem' }\n * }, {\n * id: 2,\n * label: 'bLabel',\n * subItem: { name: 'bSubItem' }\n * }];\n * ```\n *\n * This will work:\n *\n * ```html\n * \n * ```\n * ```js\n * $scope.selected = $scope.items[0];\n * ```\n *\n * but this will not work:\n *\n * ```html\n * \n * ```\n * ```js\n * $scope.selected = $scope.items[0].subItem;\n * ```\n *\n * In both examples, the **`track by`** expression is applied successfully to each `item` in the\n * `items` array. Because the selected option has been set programmatically in the controller, the\n * **`track by`** expression is also applied to the `ngModel` value. In the first example, the\n * `ngModel` value is `items[0]` and the **`track by`** expression evaluates to `items[0].id` with\n * no issue. In the second example, the `ngModel` value is `items[0].subItem` and the **`track by`**\n * expression evaluates to `items[0].subItem.id` (which is undefined). As a result, the model value\n * is not matched against any ` ` and the `` appears as having no selected value.\n *\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n * `required` when you want to data-bind to the `required` attribute.\n * @param {comprehension_expression=} ngOptions in one of the following forms:\n *\n * * for array data sources:\n * * `label` **`for`** `value` **`in`** `array`\n * * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n * * `label` **`group by`** `group` **`for`** `value` **`in`** `array`\n * * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array`\n * * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n * * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n * * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`\n * (for including a filter with `track by`)\n * * for object data sources:\n * * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n * * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n * * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n * * `label` **`disable when`** `disable` **`for (`**`key`**`,`** `value`**`) in`** `object`\n * * `select` **`as`** `label` **`group by`** `group`\n * **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n * * `select` **`as`** `label` **`disable when`** `disable`\n * **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n * * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n * * `value`: local variable which will refer to each item in the `array` or each property value\n * of `object` during iteration.\n * * `key`: local variable which will refer to a property name in `object` during iteration.\n * * `label`: The result of this expression will be the label for `` element. The\n * `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n * * `select`: The result of this expression will be bound to the model of the parent ``\n * element. If not specified, `select` expression will default to `value`.\n * * `group`: The result of this expression will be used to group options using the ``\n * DOM element.\n * * `disable`: The result of this expression will be used to disable the rendered ``\n * element. Return `true` to disable.\n * * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n * used to identify the objects in the array. The `trackexpr` will most likely refer to the\n * `value` variable (e.g. `value.propertyName`). With this the selection is preserved\n * even when the options are recreated (e.g. reloaded from the server).\n *\n * @example\n \n \n \n \n
\n
\n
Color (null not allowed):\n \n \n
Color (null allowed):\n \n \n -- choose color -- \n \n \n\n
Color grouped by shade:\n \n \n \n\n
Color grouped by shade, with some disabled:\n \n \n \n\n\n\n Select
bogus .\n
\n
\n Currently selected: {{ {selected_color:myColor} }}\n
\n
\n
\n \n \n it('should check ng-options', function() {\n expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n element.all(by.model('myColor')).first().click();\n element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n });\n \n \n */\n\n/* eslint-disable max-len */\n// //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555000000000666666666666600000007777777777777000000000000000888888888800000000000000000009999999999\nvar NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([$\\w][$\\w]*)|(?:\\(\\s*([$\\w][$\\w]*)\\s*,\\s*([$\\w][$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/;\n // 1: value expression (valueFn)\n // 2: label expression (displayFn)\n // 3: group by expression (groupByFn)\n // 4: disable when expression (disableWhenFn)\n // 5: array item variable name\n // 6: object item key variable name\n // 7: object item value variable name\n // 8: collection expression\n // 9: track by expression\n/* eslint-enable */\n\n\nvar ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, $document, $parse) {\n\n function parseOptionsExpression(optionsExp, selectElement, scope) {\n\n var match = optionsExp.match(NG_OPTIONS_REGEXP);\n if (!(match)) {\n throw ngOptionsMinErr('iexp',\n 'Expected expression in form of ' +\n '\\'_select_ (as _label_)? for (_key_,)?_value_ in _collection_\\'' +\n ' but got \\'{0}\\'. Element: {1}',\n optionsExp, startingTag(selectElement));\n }\n\n // Extract the parts from the ngOptions expression\n\n // The variable name for the value of the item in the collection\n var valueName = match[5] || match[7];\n // The variable name for the key of the item in the collection\n var keyName = match[6];\n\n // An expression that generates the viewValue for an option if there is a label expression\n var selectAs = / as /.test(match[0]) && match[1];\n // An expression that is used to track the id of each object in the options collection\n var trackBy = match[9];\n // An expression that generates the viewValue for an option if there is no label expression\n var valueFn = $parse(match[2] ? match[1] : valueName);\n var selectAsFn = selectAs && $parse(selectAs);\n var viewValueFn = selectAsFn || valueFn;\n var trackByFn = trackBy && $parse(trackBy);\n\n // Get the value by which we are going to track the option\n // if we have a trackFn then use that (passing scope and locals)\n // otherwise just hash the given viewValue\n var getTrackByValueFn = trackBy ?\n function(value, locals) { return trackByFn(scope, locals); } :\n function getHashOfValue(value) { return hashKey(value); };\n var getTrackByValue = function(value, key) {\n return getTrackByValueFn(value, getLocals(value, key));\n };\n\n var displayFn = $parse(match[2] || match[1]);\n var groupByFn = $parse(match[3] || '');\n var disableWhenFn = $parse(match[4] || '');\n var valuesFn = $parse(match[8]);\n\n var locals = {};\n var getLocals = keyName ? function(value, key) {\n locals[keyName] = key;\n locals[valueName] = value;\n return locals;\n } : function(value) {\n locals[valueName] = value;\n return locals;\n };\n\n\n function Option(selectValue, viewValue, label, group, disabled) {\n this.selectValue = selectValue;\n this.viewValue = viewValue;\n this.label = label;\n this.group = group;\n this.disabled = disabled;\n }\n\n function getOptionValuesKeys(optionValues) {\n var optionValuesKeys;\n\n if (!keyName && isArrayLike(optionValues)) {\n optionValuesKeys = optionValues;\n } else {\n // if object, extract keys, in enumeration order, unsorted\n optionValuesKeys = [];\n for (var itemKey in optionValues) {\n if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {\n optionValuesKeys.push(itemKey);\n }\n }\n }\n return optionValuesKeys;\n }\n\n return {\n trackBy: trackBy,\n getTrackByValue: getTrackByValue,\n getWatchables: $parse(valuesFn, function(optionValues) {\n // Create a collection of things that we would like to watch (watchedArray)\n // so that they can all be watched using a single $watchCollection\n // that only runs the handler once if anything changes\n var watchedArray = [];\n optionValues = optionValues || [];\n\n var optionValuesKeys = getOptionValuesKeys(optionValues);\n var optionValuesLength = optionValuesKeys.length;\n for (var index = 0; index < optionValuesLength; index++) {\n var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n var value = optionValues[key];\n\n var locals = getLocals(value, key);\n var selectValue = getTrackByValueFn(value, locals);\n watchedArray.push(selectValue);\n\n // Only need to watch the displayFn if there is a specific label expression\n if (match[2] || match[1]) {\n var label = displayFn(scope, locals);\n watchedArray.push(label);\n }\n\n // Only need to watch the disableWhenFn if there is a specific disable expression\n if (match[4]) {\n var disableWhen = disableWhenFn(scope, locals);\n watchedArray.push(disableWhen);\n }\n }\n return watchedArray;\n }),\n\n getOptions: function() {\n\n var optionItems = [];\n var selectValueMap = {};\n\n // The option values were already computed in the `getWatchables` fn,\n // which must have been called to trigger `getOptions`\n var optionValues = valuesFn(scope) || [];\n var optionValuesKeys = getOptionValuesKeys(optionValues);\n var optionValuesLength = optionValuesKeys.length;\n\n for (var index = 0; index < optionValuesLength; index++) {\n var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n var value = optionValues[key];\n var locals = getLocals(value, key);\n var viewValue = viewValueFn(scope, locals);\n var selectValue = getTrackByValueFn(viewValue, locals);\n var label = displayFn(scope, locals);\n var group = groupByFn(scope, locals);\n var disabled = disableWhenFn(scope, locals);\n var optionItem = new Option(selectValue, viewValue, label, group, disabled);\n\n optionItems.push(optionItem);\n selectValueMap[selectValue] = optionItem;\n }\n\n return {\n items: optionItems,\n selectValueMap: selectValueMap,\n getOptionFromViewValue: function(value) {\n return selectValueMap[getTrackByValue(value)];\n },\n getViewValueFromOption: function(option) {\n // If the viewValue could be an object that may be mutated by the application,\n // we need to make a copy and not return the reference to the value on the option.\n return trackBy ? copy(option.viewValue) : option.viewValue;\n }\n };\n }\n };\n }\n\n\n // we can't just jqLite(' ') since jqLite is not smart enough\n // to create it in and IE barfs otherwise.\n var optionTemplate = window.document.createElement('option'),\n optGroupTemplate = window.document.createElement('optgroup');\n\n function ngOptionsPostLink(scope, selectElement, attr, ctrls) {\n\n var selectCtrl = ctrls[0];\n var ngModelCtrl = ctrls[1];\n var multiple = attr.multiple;\n\n // The emptyOption allows the application developer to provide their own custom \"empty\"\n // option when the viewValue does not match any of the option values.\n for (var i = 0, children = selectElement.children(), ii = children.length; i < ii; i++) {\n if (children[i].value === '') {\n selectCtrl.hasEmptyOption = true;\n selectCtrl.emptyOption = children.eq(i);\n break;\n }\n }\n\n var providedEmptyOption = !!selectCtrl.emptyOption;\n\n var unknownOption = jqLite(optionTemplate.cloneNode(false));\n unknownOption.val('?');\n\n var options;\n var ngOptions = parseOptionsExpression(attr.ngOptions, selectElement, scope);\n // This stores the newly created options before they are appended to the select.\n // Since the contents are removed from the fragment when it is appended,\n // we only need to create it once.\n var listFragment = $document[0].createDocumentFragment();\n\n // Overwrite the implementation. ngOptions doesn't use hashes\n selectCtrl.generateUnknownOptionValue = function(val) {\n return '?';\n };\n\n // Update the controller methods for multiple selectable options\n if (!multiple) {\n\n selectCtrl.writeValue = function writeNgOptionsValue(value) {\n var selectedOption = options.selectValueMap[selectElement.val()];\n var option = options.getOptionFromViewValue(value);\n\n // Make sure to remove the selected attribute from the previously selected option\n // Otherwise, screen readers might get confused\n if (selectedOption) selectedOption.element.removeAttribute('selected');\n\n if (option) {\n // Don't update the option when it is already selected.\n // For example, the browser will select the first option by default. In that case,\n // most properties are set automatically - except the `selected` attribute, which we\n // set always\n\n if (selectElement[0].value !== option.selectValue) {\n selectCtrl.removeUnknownOption();\n selectCtrl.unselectEmptyOption();\n\n selectElement[0].value = option.selectValue;\n option.element.selected = true;\n }\n\n option.element.setAttribute('selected', 'selected');\n } else {\n\n if (providedEmptyOption) {\n selectCtrl.selectEmptyOption();\n } else if (selectCtrl.unknownOption.parent().length) {\n selectCtrl.updateUnknownOption(value);\n } else {\n selectCtrl.renderUnknownOption(value);\n }\n }\n };\n\n selectCtrl.readValue = function readNgOptionsValue() {\n\n var selectedOption = options.selectValueMap[selectElement.val()];\n\n if (selectedOption && !selectedOption.disabled) {\n selectCtrl.unselectEmptyOption();\n selectCtrl.removeUnknownOption();\n return options.getViewValueFromOption(selectedOption);\n }\n return null;\n };\n\n // If we are using `track by` then we must watch the tracked value on the model\n // since ngModel only watches for object identity change\n // FIXME: When a user selects an option, this watch will fire needlessly\n if (ngOptions.trackBy) {\n scope.$watch(\n function() { return ngOptions.getTrackByValue(ngModelCtrl.$viewValue); },\n function() { ngModelCtrl.$render(); }\n );\n }\n\n } else {\n\n selectCtrl.writeValue = function writeNgOptionsMultiple(value) {\n options.items.forEach(function(option) {\n option.element.selected = false;\n });\n\n if (value) {\n value.forEach(function(item) {\n var option = options.getOptionFromViewValue(item);\n if (option) option.element.selected = true;\n });\n }\n };\n\n\n selectCtrl.readValue = function readNgOptionsMultiple() {\n var selectedValues = selectElement.val() || [],\n selections = [];\n\n forEach(selectedValues, function(value) {\n var option = options.selectValueMap[value];\n if (option && !option.disabled) selections.push(options.getViewValueFromOption(option));\n });\n\n return selections;\n };\n\n // If we are using `track by` then we must watch these tracked values on the model\n // since ngModel only watches for object identity change\n if (ngOptions.trackBy) {\n\n scope.$watchCollection(function() {\n if (isArray(ngModelCtrl.$viewValue)) {\n return ngModelCtrl.$viewValue.map(function(value) {\n return ngOptions.getTrackByValue(value);\n });\n }\n }, function() {\n ngModelCtrl.$render();\n });\n\n }\n }\n\n if (providedEmptyOption) {\n\n // we need to remove it before calling selectElement.empty() because otherwise IE will\n // remove the label from the element. wtf?\n selectCtrl.emptyOption.remove();\n\n // compile the element since there might be bindings in it\n $compile(selectCtrl.emptyOption)(scope);\n\n if (selectCtrl.emptyOption[0].nodeType === NODE_TYPE_COMMENT) {\n // This means the empty option has currently no actual DOM node, probably because\n // it has been modified by a transclusion directive.\n selectCtrl.hasEmptyOption = false;\n\n // Redefine the registerOption function, which will catch\n // options that are added by ngIf etc. (rendering of the node is async because of\n // lazy transclusion)\n selectCtrl.registerOption = function(optionScope, optionEl) {\n if (optionEl.val() === '') {\n selectCtrl.hasEmptyOption = true;\n selectCtrl.emptyOption = optionEl;\n selectCtrl.emptyOption.removeClass('ng-scope');\n // This ensures the new empty option is selected if previously no option was selected\n ngModelCtrl.$render();\n\n optionEl.on('$destroy', function() {\n selectCtrl.hasEmptyOption = false;\n selectCtrl.emptyOption = undefined;\n });\n }\n };\n\n } else {\n // remove the class, which is added automatically because we recompile the element and it\n // becomes the compilation root\n selectCtrl.emptyOption.removeClass('ng-scope');\n }\n\n }\n\n selectElement.empty();\n\n // We need to do this here to ensure that the options object is defined\n // when we first hit it in writeNgOptionsValue\n updateOptions();\n\n // We will re-render the option elements if the option values or labels change\n scope.$watchCollection(ngOptions.getWatchables, updateOptions);\n\n // ------------------------------------------------------------------ //\n\n function addOptionElement(option, parent) {\n var optionElement = optionTemplate.cloneNode(false);\n parent.appendChild(optionElement);\n updateOptionElement(option, optionElement);\n }\n\n\n function updateOptionElement(option, element) {\n option.element = element;\n element.disabled = option.disabled;\n // NOTE: The label must be set before the value, otherwise IE10/11/EDGE create unresponsive\n // selects in certain circumstances when multiple selects are next to each other and display\n // the option list in listbox style, i.e. the select is [multiple], or specifies a [size].\n // See https://github.com/angular/angular.js/issues/11314 for more info.\n // This is unfortunately untestable with unit / e2e tests\n if (option.label !== element.label) {\n element.label = option.label;\n element.textContent = option.label;\n }\n element.value = option.selectValue;\n }\n\n function updateOptions() {\n var previousValue = options && selectCtrl.readValue();\n\n // We must remove all current options, but cannot simply set innerHTML = null\n // since the providedEmptyOption might have an ngIf on it that inserts comments which we\n // must preserve.\n // Instead, iterate over the current option elements and remove them or their optgroup\n // parents\n if (options) {\n\n for (var i = options.items.length - 1; i >= 0; i--) {\n var option = options.items[i];\n if (isDefined(option.group)) {\n jqLiteRemove(option.element.parentNode);\n } else {\n jqLiteRemove(option.element);\n }\n }\n }\n\n options = ngOptions.getOptions();\n\n var groupElementMap = {};\n\n // Ensure that the empty option is always there if it was explicitly provided\n if (providedEmptyOption) {\n selectElement.prepend(selectCtrl.emptyOption);\n }\n\n options.items.forEach(function addOption(option) {\n var groupElement;\n\n if (isDefined(option.group)) {\n\n // This option is to live in a group\n // See if we have already created this group\n groupElement = groupElementMap[option.group];\n\n if (!groupElement) {\n\n groupElement = optGroupTemplate.cloneNode(false);\n listFragment.appendChild(groupElement);\n\n // Update the label on the group element\n // \"null\" is special cased because of Safari\n groupElement.label = option.group === null ? 'null' : option.group;\n\n // Store it for use later\n groupElementMap[option.group] = groupElement;\n }\n\n addOptionElement(option, groupElement);\n\n } else {\n\n // This option is not in a group\n addOptionElement(option, listFragment);\n }\n });\n\n selectElement[0].appendChild(listFragment);\n\n ngModelCtrl.$render();\n\n // Check to see if the value has changed due to the update to the options\n if (!ngModelCtrl.$isEmpty(previousValue)) {\n var nextValue = selectCtrl.readValue();\n var isNotPrimitive = ngOptions.trackBy || multiple;\n if (isNotPrimitive ? !equals(previousValue, nextValue) : previousValue !== nextValue) {\n ngModelCtrl.$setViewValue(nextValue);\n ngModelCtrl.$render();\n }\n }\n\n }\n }\n\n return {\n restrict: 'A',\n terminal: true,\n require: ['select', 'ngModel'],\n link: {\n pre: function ngOptionsPreLink(scope, selectElement, attr, ctrls) {\n // Deactivate the SelectController.register method to prevent\n // option directives from accidentally registering themselves\n // (and unwanted $destroy handlers etc.)\n ctrls[0].registerOption = noop;\n },\n post: ngOptionsPostLink\n }\n };\n}];\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * # Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in Angular's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * # Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * Angular expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * \n * \n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, Angular will replace `{}` with\n * `{{personCount}}` . The closed braces `{}` is a placeholder\n * for {{numberExpression}} .\n *\n * If no rule is defined for a category, then an empty string is displayed and a warning is generated.\n * Note that some locales define more categories than `one` and `other`. For example, fr-fr defines `few` and `many`.\n *\n * # Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * \n * \n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Mary and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n \n \n \n \n Person 1: \n Person 2: \n Number of People: \n\n \n Without Offset:\n \n \n\n \n With Offset(2):\n \n \n
\n \n \n it('should show correct pluralized string', function() {\n var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n var withOffset = element.all(by.css('ng-pluralize')).get(1);\n var countInput = element(by.model('personCount'));\n\n expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n countInput.clear();\n countInput.sendKeys('0');\n\n expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n countInput.clear();\n countInput.sendKeys('2');\n\n expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n countInput.clear();\n countInput.sendKeys('3');\n\n expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n countInput.clear();\n countInput.sendKeys('4');\n\n expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n });\n it('should show data-bound names', function() {\n var withOffset = element.all(by.css('ng-pluralize')).get(1);\n var personCount = element(by.model('personCount'));\n var person1 = element(by.model('person1'));\n var person2 = element(by.model('person2'));\n personCount.clear();\n personCount.sendKeys('4');\n person1.clear();\n person1.sendKeys('Di');\n person2.clear();\n person2.sendKeys('Vojta');\n expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n });\n \n \n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, $interpolate, $log) {\n var BRACE = /{}/g,\n IS_WHEN = /^when(Minus)?(.+)$/;\n\n return {\n link: function(scope, element, attr) {\n var numberExp = attr.count,\n whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n offset = attr.offset || 0,\n whens = scope.$eval(whenExp) || {},\n whensExpFns = {},\n startSymbol = $interpolate.startSymbol(),\n endSymbol = $interpolate.endSymbol(),\n braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,\n watchRemover = angular.noop,\n lastCount;\n\n forEach(attr, function(expression, attributeName) {\n var tmpMatch = IS_WHEN.exec(attributeName);\n if (tmpMatch) {\n var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);\n whens[whenKey] = element.attr(attr.$attr[attributeName]);\n }\n });\n forEach(whens, function(expression, key) {\n whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));\n\n });\n\n scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {\n var count = parseFloat(newVal);\n var countIsNaN = isNumberNaN(count);\n\n if (!countIsNaN && !(count in whens)) {\n // If an explicit number rule such as 1, 2, 3... is defined, just use it.\n // Otherwise, check it against pluralization rules in $locale service.\n count = $locale.pluralCat(count - offset);\n }\n\n // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.\n // In JS `NaN !== NaN`, so we have to explicitly check.\n if ((count !== lastCount) && !(countIsNaN && isNumberNaN(lastCount))) {\n watchRemover();\n var whenExpFn = whensExpFns[count];\n if (isUndefined(whenExpFn)) {\n if (newVal != null) {\n $log.debug('ngPluralize: no rule defined for \\'' + count + '\\' in ' + whenExp);\n }\n watchRemover = noop;\n updateElementText();\n } else {\n watchRemover = scope.$watch(whenExpFn, updateElementText);\n }\n lastCount = count;\n }\n });\n\n function updateElementText(newText) {\n element.text(newText || '');\n }\n }\n };\n}];\n\n/* exported ngRepeatDirective */\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n * @multiElement\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable | Type | Details |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) |\n * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. |\n * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). |\n * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). |\n *\n * \n * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n * This may be useful when, for instance, nesting ngRepeats.\n *
\n *\n *\n * # Iterating over object properties\n *\n * It is possible to get `ngRepeat` to iterate over the properties of an object using the following\n * syntax:\n *\n * ```js\n * ...
\n * ```\n *\n * However, there are a few limitations compared to array iteration:\n *\n * - The JavaScript specification does not define the order of keys\n * returned for an object, so Angular relies on the order returned by the browser\n * when running `for key in myObj`. Browsers generally follow the strategy of providing\n * keys in the order in which they were defined, although there are exceptions when keys are deleted\n * and reinstated. See the\n * [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes).\n *\n * - `ngRepeat` will silently *ignore* object keys starting with `$`, because\n * it's a prefix used by Angular for public (`$`) and private (`$$`) properties.\n *\n * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with\n * objects, and will throw an error if used with one.\n *\n * If you are hitting any of these limitations, the recommended workaround is to convert your object into an array\n * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could\n * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter)\n * or implement a `$watch` on the object yourself.\n *\n *\n * # Tracking and Duplicates\n *\n * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in\n * the collection. When a change happens, `ngRepeat` then makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * To minimize creation of DOM elements, `ngRepeat` uses a function\n * to \"keep track\" of all items in the collection and their corresponding DOM elements.\n * For example, if an item is added to the collection, `ngRepeat` will know that all other items\n * already have DOM elements, and will not re-render them.\n *\n * The default tracking function (which tracks items by their identity) does not allow\n * duplicate items in arrays. This is because when there are duplicates, it is not possible\n * to maintain a one-to-one mapping between collection items and DOM elements.\n *\n * If you do need to repeat duplicate items, you can substitute the default tracking behavior\n * with your own using the `track by` expression.\n *\n * For example, you may track items by the index of each item in the collection, using the\n * special scope property `$index`:\n * ```html\n * \n * {{n}}\n *
\n * ```\n *\n * You may also use arbitrary expressions in `track by`, including references to custom functions\n * on the scope:\n * ```html\n * \n * {{n}}\n *
\n * ```\n *\n * \n * If you are working with objects that have a unique identifier property, you should track\n * by this identifier instead of the object instance. Should you reload your data later, `ngRepeat`\n * will not have to rebuild the DOM elements for items it has already rendered, even if the\n * JavaScript objects in the collection have been substituted for new ones. For large collections,\n * this significantly improves rendering performance. If you don't have a unique identifier,\n * `track by $index` can also provide a performance boost.\n *
\n *\n * ```html\n * \n * {{model.name}}\n *
\n * ```\n *\n * \n * \n * Avoid using `track by $index` when the repeated template contains\n * {@link guide/expression#one-time-binding one-time bindings}. In such cases, the `nth` DOM\n * element will always be matched with the `nth` item of the array, so the bindings on that element\n * will not be updated even when the corresponding item changes, essentially causing the view to get\n * out-of-sync with the underlying data.\n *
\n *\n * When no `track by` expression is provided, it is equivalent to tracking by the built-in\n * `$id` function, which tracks items by their identity:\n * ```html\n * \n * {{obj.prop}}\n *
\n * ```\n *\n * \n * \n * **Note:** `track by` must always be the last expression:\n *
\n * ```\n * \n * {{model.name}}\n *
\n * ```\n *\n *\n * # Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n * \n * Header {{ item }}\n * \n * \n * Body {{ item }}\n *
\n * \n * Footer {{ item }}\n * \n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n * \n * \n * Body A\n *
\n * \n * \n * \n * Body B\n *
\n * \n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * | Animation | Occurs |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter} | when a new item is added to the list or when an item is revealed after a filter |\n * | {@link ng.$animate#leave leave} | when an item is removed from the list or when an item is filtered out |\n * | {@link ng.$animate#move move } | when an adjacent item is filtered out causing a reorder or when the item contents are reordered |\n *\n * See the example below for defining CSS animations with ngRepeat.\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n * formats are currently supported:\n *\n * * `variable in expression` – where variable is the user defined loop variable and `expression`\n * is a scope expression giving the collection to enumerate.\n *\n * For example: `album in artist.albums`.\n *\n * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n * and `expression` is the scope expression giving the collection to enumerate.\n *\n * For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n * * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression\n * which can be used to associate the objects in the collection with the DOM elements. If no tracking expression\n * is specified, ng-repeat associates elements by identity. It is an error to have\n * more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are\n * mapped to the same DOM element, which is not possible.)\n *\n * Note that the tracking expression must come last, after any filters, and the alias expression.\n *\n * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\n * will be associated by item identity in the array.\n *\n * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\n * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\n * with the corresponding item in the array by identity. Moving the same object in array would move the DOM\n * element in the same way in the DOM.\n *\n * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\n * case the object identity does not matter. Two objects are considered equivalent as long as their `id`\n * property is same.\n *\n * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\n * to items in conjunction with a tracking expression.\n *\n * * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the\n * intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message\n * when a filter is active on the repeater, but the filtered result set is empty.\n *\n * For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after\n * the items have been processed through the filter.\n *\n * Please note that `as [variable name] is not an operator but rather a part of ngRepeat micro-syntax so it can be used only at the end\n * (and not as operator, inside an expression).\n *\n * For example: `item in items | filter : x | orderBy : order | limitTo : limit as results` .\n *\n * @example\n * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed\n * results by name or by age. New (entering) and removed (leaving) items are animated.\n \n \n \n I have {{friends.length}} friends. They are:\n
\n
\n \n [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n \n \n No results found... \n \n \n
\n \n \n angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) {\n $scope.friends = [\n {name:'John', age:25, gender:'boy'},\n {name:'Jessie', age:30, gender:'girl'},\n {name:'Johanna', age:28, gender:'girl'},\n {name:'Joy', age:15, gender:'girl'},\n {name:'Mary', age:28, gender:'girl'},\n {name:'Peter', age:95, gender:'boy'},\n {name:'Sebastian', age:50, gender:'boy'},\n {name:'Erika', age:27, gender:'girl'},\n {name:'Patrick', age:40, gender:'boy'},\n {name:'Samantha', age:60, gender:'girl'}\n ];\n });\n \n \n .example-animate-container {\n background:white;\n border:1px solid black;\n list-style:none;\n margin:0;\n padding:0 10px;\n }\n\n .animate-repeat {\n line-height:30px;\n list-style:none;\n box-sizing:border-box;\n }\n\n .animate-repeat.ng-move,\n .animate-repeat.ng-enter,\n .animate-repeat.ng-leave {\n transition:all linear 0.5s;\n }\n\n .animate-repeat.ng-leave.ng-leave-active,\n .animate-repeat.ng-move,\n .animate-repeat.ng-enter {\n opacity:0;\n max-height:0;\n }\n\n .animate-repeat.ng-leave,\n .animate-repeat.ng-move.ng-move-active,\n .animate-repeat.ng-enter.ng-enter-active {\n opacity:1;\n max-height:30px;\n }\n \n \n var friends = element.all(by.repeater('friend in friends'));\n\n it('should render initial data set', function() {\n expect(friends.count()).toBe(10);\n expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n expect(element(by.binding('friends.length')).getText())\n .toMatch(\"I have 10 friends. They are:\");\n });\n\n it('should update repeater when filter predicate changes', function() {\n expect(friends.count()).toBe(10);\n\n element(by.model('q')).sendKeys('ma');\n\n expect(friends.count()).toBe(2);\n expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n });\n \n \n */\nvar ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $animate, $compile) {\n var NG_REMOVED = '$$NG_REMOVED';\n var ngRepeatMinErr = minErr('ngRepeat');\n\n var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {\n // TODO(perf): generate setters to shave off ~40ms or 1-1.5%\n scope[valueIdentifier] = value;\n if (keyIdentifier) scope[keyIdentifier] = key;\n scope.$index = index;\n scope.$first = (index === 0);\n scope.$last = (index === (arrayLength - 1));\n scope.$middle = !(scope.$first || scope.$last);\n // eslint-disable-next-line no-bitwise\n scope.$odd = !(scope.$even = (index & 1) === 0);\n };\n\n var getBlockStart = function(block) {\n return block.clone[0];\n };\n\n var getBlockEnd = function(block) {\n return block.clone[block.clone.length - 1];\n };\n\n\n return {\n restrict: 'A',\n multiElement: true,\n transclude: 'element',\n priority: 1000,\n terminal: true,\n $$tlb: true,\n compile: function ngRepeatCompile($element, $attr) {\n var expression = $attr.ngRepeat;\n var ngRepeatEndComment = $compile.$$createComment('end ngRepeat', expression);\n\n var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n if (!match) {\n throw ngRepeatMinErr('iexp', 'Expected expression in form of \\'_item_ in _collection_[ track by _id_]\\' but got \\'{0}\\'.',\n expression);\n }\n\n var lhs = match[1];\n var rhs = match[2];\n var aliasAs = match[3];\n var trackByExp = match[4];\n\n match = lhs.match(/^(?:(\\s*[$\\w]+)|\\(\\s*([$\\w]+)\\s*,\\s*([$\\w]+)\\s*\\))$/);\n\n if (!match) {\n throw ngRepeatMinErr('iidexp', '\\'_item_\\' in \\'_item_ in _collection_\\' should be an identifier or \\'(_key_, _value_)\\' expression, but got \\'{0}\\'.',\n lhs);\n }\n var valueIdentifier = match[3] || match[1];\n var keyIdentifier = match[2];\n\n if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||\n /^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(aliasAs))) {\n throw ngRepeatMinErr('badident', 'alias \\'{0}\\' is invalid --- must be a valid JS identifier which is not a reserved name.',\n aliasAs);\n }\n\n var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;\n var hashFnLocals = {$id: hashKey};\n\n if (trackByExp) {\n trackByExpGetter = $parse(trackByExp);\n } else {\n trackByIdArrayFn = function(key, value) {\n return hashKey(value);\n };\n trackByIdObjFn = function(key) {\n return key;\n };\n }\n\n return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {\n\n if (trackByExpGetter) {\n trackByIdExpFn = function(key, value, index) {\n // assign key, value, and $index to the locals so that they can be used in hash functions\n if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n hashFnLocals[valueIdentifier] = value;\n hashFnLocals.$index = index;\n return trackByExpGetter($scope, hashFnLocals);\n };\n }\n\n // Store a list of elements from previous run. This is a hash where key is the item from the\n // iterator, and the value is objects with following properties.\n // - scope: bound scope\n // - element: previous element.\n // - index: position\n //\n // We are using no-proto object so that we don't need to guard against inherited props via\n // hasOwnProperty.\n var lastBlockMap = createMap();\n\n //watch props\n $scope.$watchCollection(rhs, function ngRepeatAction(collection) {\n var index, length,\n previousNode = $element[0], // node that cloned nodes should be inserted after\n // initialized to the comment node anchor\n nextNode,\n // Same as lastBlockMap but it has the current state. It will become the\n // lastBlockMap on the next iteration.\n nextBlockMap = createMap(),\n collectionLength,\n key, value, // key/value of iteration\n trackById,\n trackByIdFn,\n collectionKeys,\n block, // last object information {scope, element, id}\n nextBlockOrder,\n elementsToRemove;\n\n if (aliasAs) {\n $scope[aliasAs] = collection;\n }\n\n if (isArrayLike(collection)) {\n collectionKeys = collection;\n trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n } else {\n trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n // if object, extract keys, in enumeration order, unsorted\n collectionKeys = [];\n for (var itemKey in collection) {\n if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') {\n collectionKeys.push(itemKey);\n }\n }\n }\n\n collectionLength = collectionKeys.length;\n nextBlockOrder = new Array(collectionLength);\n\n // locate existing items\n for (index = 0; index < collectionLength; index++) {\n key = (collection === collectionKeys) ? index : collectionKeys[index];\n value = collection[key];\n trackById = trackByIdFn(key, value, index);\n if (lastBlockMap[trackById]) {\n // found previously seen block\n block = lastBlockMap[trackById];\n delete lastBlockMap[trackById];\n nextBlockMap[trackById] = block;\n nextBlockOrder[index] = block;\n } else if (nextBlockMap[trackById]) {\n // if collision detected. restore lastBlockMap and throw an error\n forEach(nextBlockOrder, function(block) {\n if (block && block.scope) lastBlockMap[block.id] = block;\n });\n throw ngRepeatMinErr('dupes',\n 'Duplicates in a repeater are not allowed. Use \\'track by\\' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}',\n expression, trackById, value);\n } else {\n // new never before seen block\n nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};\n nextBlockMap[trackById] = true;\n }\n }\n\n // remove leftover items\n for (var blockKey in lastBlockMap) {\n block = lastBlockMap[blockKey];\n elementsToRemove = getBlockNodes(block.clone);\n $animate.leave(elementsToRemove);\n if (elementsToRemove[0].parentNode) {\n // if the element was not removed yet because of pending animation, mark it as deleted\n // so that we can ignore it later\n for (index = 0, length = elementsToRemove.length; index < length; index++) {\n elementsToRemove[index][NG_REMOVED] = true;\n }\n }\n block.scope.$destroy();\n }\n\n // we are not using forEach for perf reasons (trying to avoid #call)\n for (index = 0; index < collectionLength; index++) {\n key = (collection === collectionKeys) ? index : collectionKeys[index];\n value = collection[key];\n block = nextBlockOrder[index];\n\n if (block.scope) {\n // if we have already seen this object, then we need to reuse the\n // associated scope/element\n\n nextNode = previousNode;\n\n // skip nodes that are already pending removal via leave animation\n do {\n nextNode = nextNode.nextSibling;\n } while (nextNode && nextNode[NG_REMOVED]);\n\n if (getBlockStart(block) !== nextNode) {\n // existing item which got moved\n $animate.move(getBlockNodes(block.clone), null, previousNode);\n }\n previousNode = getBlockEnd(block);\n updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n } else {\n // new item which we don't know about\n $transclude(function ngRepeatTransclude(clone, scope) {\n block.scope = scope;\n // http://jsperf.com/clone-vs-createcomment\n var endNode = ngRepeatEndComment.cloneNode(false);\n clone[clone.length++] = endNode;\n\n $animate.enter(clone, null, previousNode);\n previousNode = endNode;\n // Note: We only need the first/last node of the cloned nodes.\n // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n // by a directive with templateUrl when its template arrives.\n block.clone = clone;\n nextBlockMap[block.id] = block;\n updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n });\n }\n }\n lastBlockMap = nextBlockMap;\n });\n };\n }\n };\n}];\n\nvar NG_HIDE_CLASS = 'ng-hide';\nvar NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n/**\n * @ngdoc directive\n * @name ngShow\n * @multiElement\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression\n * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding\n * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * \n *
\n *\n * \n *
\n * ```\n *\n * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class\n * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change\n * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\n * class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope\n * with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n * /* this is just another form of hiding an element */\n * display: block!important;\n * position: absolute;\n * top: -9999px;\n * left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the display style.\n *\n * ## A note about animations with `ngShow`\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass except that\n * you must also include the !important flag to override the display property\n * so that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n * /* this is required as of 1.3x to properly\n * apply all styling in a show/hide animation */\n * transition: 0s linear all;\n * }\n *\n * .my-element.ng-hide-add-active,\n * .my-element.ng-hide-remove-active {\n * /* the transition is defined in the active class */\n * transition: 1s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display\n * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\n *\n * @animations\n * | Animation | Occurs |\n * |----------------------------------|-------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide` | after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden |\n * | {@link $animate#removeClass removeClass} `.ng-hide` | after the `ngShow` expression evaluates to a truthy value and just before contents are set to visible |\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\n * then the element is shown or hidden respectively.\n *\n * @example\n \n \n Click me: \n \n Show:\n
\n I show up when your checkbox is checked.\n
\n
\n \n Hide:\n
\n I hide when your checkbox is checked.\n
\n
\n \n \n @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);\n \n \n .animate-show {\n line-height: 20px;\n opacity: 1;\n padding: 10px;\n border: 1px solid black;\n background: white;\n }\n\n .animate-show.ng-hide-add, .animate-show.ng-hide-remove {\n transition: all linear 0.5s;\n }\n\n .animate-show.ng-hide {\n line-height: 0;\n opacity: 0;\n padding: 0 10px;\n }\n\n .check-element {\n padding: 10px;\n border: 1px solid black;\n background: white;\n }\n \n \n var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n it('should check ng-show / ng-hide', function() {\n expect(thumbsUp.isDisplayed()).toBeFalsy();\n expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n element(by.model('checked')).click();\n\n expect(thumbsUp.isDisplayed()).toBeTruthy();\n expect(thumbsDown.isDisplayed()).toBeFalsy();\n });\n \n \n */\nvar ngShowDirective = ['$animate', function($animate) {\n return {\n restrict: 'A',\n multiElement: true,\n link: function(scope, element, attr) {\n scope.$watch(attr.ngShow, function ngShowWatchAction(value) {\n // we're adding a temporary, animation-specific class for ng-hide since this way\n // we can control when the element is actually displayed on screen without having\n // to have a global/greedy CSS selector that breaks when other animations are run.\n // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845\n $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n });\n });\n }\n };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n * @multiElement\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression\n * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * \n *
\n *\n * \n *
\n * ```\n *\n * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class\n * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change\n * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\n * class in CSS:\n *\n * ```css\n * .ng-hide {\n * /* this is just another form of hiding an element */\n * display: block!important;\n * position: absolute;\n * top: -9999px;\n * left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the display style.\n *\n * ## A note about animations with `ngHide`\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`\n * CSS class is added and removed for you instead of your own CSS class.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n * transition: 0.5s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display\n * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\n *\n * @animations\n * | Animation | Occurs |\n * |----------------------------------|-------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide` | after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden |\n * | {@link $animate#removeClass removeClass} `.ng-hide` | after the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible |\n *\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy then\n * the element is shown or hidden respectively.\n *\n * @example\n \n \n Click me: \n \n Show:\n
\n I show up when your checkbox is checked.\n
\n
\n \n Hide:\n
\n I hide when your checkbox is checked.\n
\n
\n \n \n @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);\n \n \n .animate-hide {\n transition: all linear 0.5s;\n line-height: 20px;\n opacity: 1;\n padding: 10px;\n border: 1px solid black;\n background: white;\n }\n\n .animate-hide.ng-hide {\n line-height: 0;\n opacity: 0;\n padding: 0 10px;\n }\n\n .check-element {\n padding: 10px;\n border: 1px solid black;\n background: white;\n }\n \n \n var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n it('should check ng-show / ng-hide', function() {\n expect(thumbsUp.isDisplayed()).toBeFalsy();\n expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n element(by.model('checked')).click();\n\n expect(thumbsUp.isDisplayed()).toBeTruthy();\n expect(thumbsDown.isDisplayed()).toBeFalsy();\n });\n \n \n */\nvar ngHideDirective = ['$animate', function($animate) {\n return {\n restrict: 'A',\n multiElement: true,\n link: function(scope, element, attr) {\n scope.$watch(attr.ngHide, function ngHideWatchAction(value) {\n // The comment inside of the ngShowDirective explains why we add and\n // remove a temporary class for the show/hide animation\n $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {\n tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n });\n });\n }\n };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @knownIssue\n * You should not use {@link guide/interpolation interpolation} in the value of the `style`\n * attribute, when using the `ngStyle` directive on the same element.\n * See {@link guide/interpolation#known-issues here} for more info.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n \n \n \n \n \n \n Sample Text \n myStyle={{myStyle}} \n \n \n span {\n color: black;\n }\n \n \n var colorSpan = element(by.css('span'));\n\n it('should check ng-style', function() {\n expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n element(by.css('input[value=\\'set color\\']')).click();\n expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n element(by.css('input[value=clear]')).click();\n expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n });\n \n \n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n if (oldStyles && (newStyles !== oldStyles)) {\n forEach(oldStyles, function(val, style) { element.css(style, '');});\n }\n if (newStyles) element.css(newStyles);\n }, true);\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * \n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n *
\n\n * @animations\n * | Animation | Occurs |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter} | after the ngSwitch contents change and the matched child element is placed inside the container |\n * | {@link ng.$animate#leave leave} | after the ngSwitch contents change and just before the former contents are removed from the DOM |\n *\n * @usage\n *\n * ```\n * \n * ... \n * ... \n * ... \n * \n * ```\n *\n *\n * @scope\n * @priority 1200\n * @param {*} ngSwitch|on expression to match against ng-switch-when
.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n * case will be displayed. If the same match appears multiple times, all the\n * elements will be displayed. It is possible to associate multiple values to\n * the same `ngSwitchWhen` by defining the optional attribute\n * `ngSwitchWhenSeparator`. The separator will be used to split the value of\n * the `ngSwitchWhen` attribute into multiple tokens, and the element will show\n * if any of the `ngSwitch` evaluates to any of these tokens.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n * are multiple default cases, all of them will be displayed when no other\n * case match.\n *\n *\n * @example\n \n \n \n
\n \n
selection={{selection}}
\n
\n
\n
Settings Div
\n
Home Span
\n
default
\n
\n
\n \n \n angular.module('switchExample', ['ngAnimate'])\n .controller('ExampleController', ['$scope', function($scope) {\n $scope.items = ['settings', 'home', 'options', 'other'];\n $scope.selection = $scope.items[0];\n }]);\n \n \n .animate-switch-container {\n position:relative;\n background:white;\n border:1px solid black;\n height:40px;\n overflow:hidden;\n }\n\n .animate-switch {\n padding:10px;\n }\n\n .animate-switch.ng-animate {\n transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n position:absolute;\n top:0;\n left:0;\n right:0;\n bottom:0;\n }\n\n .animate-switch.ng-leave.ng-leave-active,\n .animate-switch.ng-enter {\n top:-50px;\n }\n .animate-switch.ng-leave,\n .animate-switch.ng-enter.ng-enter-active {\n top:0;\n }\n \n \n var switchElem = element(by.css('[ng-switch]'));\n var select = element(by.model('selection'));\n\n it('should start in settings', function() {\n expect(switchElem.getText()).toMatch(/Settings Div/);\n });\n it('should change to home', function() {\n select.all(by.css('option')).get(1).click();\n expect(switchElem.getText()).toMatch(/Home Span/);\n });\n it('should change to settings via \"options\"', function() {\n select.all(by.css('option')).get(2).click();\n expect(switchElem.getText()).toMatch(/Settings Div/);\n });\n it('should select default', function() {\n select.all(by.css('option')).get(3).click();\n expect(switchElem.getText()).toMatch(/default/);\n });\n \n \n */\nvar ngSwitchDirective = ['$animate', '$compile', function($animate, $compile) {\n return {\n require: 'ngSwitch',\n\n // asks for $scope to fool the BC controller module\n controller: ['$scope', function NgSwitchController() {\n this.cases = {};\n }],\n link: function(scope, element, attr, ngSwitchController) {\n var watchExpr = attr.ngSwitch || attr.on,\n selectedTranscludes = [],\n selectedElements = [],\n previousLeaveAnimations = [],\n selectedScopes = [];\n\n var spliceFactory = function(array, index) {\n return function(response) {\n if (response !== false) array.splice(index, 1);\n };\n };\n\n scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n var i, ii;\n\n // Start with the last, in case the array is modified during the loop\n while (previousLeaveAnimations.length) {\n $animate.cancel(previousLeaveAnimations.pop());\n }\n\n for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n var selected = getBlockNodes(selectedElements[i].clone);\n selectedScopes[i].$destroy();\n var runner = previousLeaveAnimations[i] = $animate.leave(selected);\n runner.done(spliceFactory(previousLeaveAnimations, i));\n }\n\n selectedElements.length = 0;\n selectedScopes.length = 0;\n\n if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n forEach(selectedTranscludes, function(selectedTransclude) {\n selectedTransclude.transclude(function(caseElement, selectedScope) {\n selectedScopes.push(selectedScope);\n var anchor = selectedTransclude.element;\n caseElement[caseElement.length++] = $compile.$$createComment('end ngSwitchWhen');\n var block = { clone: caseElement };\n\n selectedElements.push(block);\n $animate.enter(caseElement, anchor.parent(), anchor);\n });\n });\n }\n });\n }\n };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n transclude: 'element',\n priority: 1200,\n require: '^ngSwitch',\n multiElement: true,\n link: function(scope, element, attrs, ctrl, $transclude) {\n\n var cases = attrs.ngSwitchWhen.split(attrs.ngSwitchWhenSeparator).sort().filter(\n // Filter duplicate cases\n function(element, index, array) { return array[index - 1] !== element; }\n );\n\n forEach(cases, function(whenCase) {\n ctrl.cases['!' + whenCase] = (ctrl.cases['!' + whenCase] || []);\n ctrl.cases['!' + whenCase].push({ transclude: $transclude, element: element });\n });\n }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n transclude: 'element',\n priority: 1200,\n require: '^ngSwitch',\n multiElement: true,\n link: function(scope, element, attr, ctrl, $transclude) {\n ctrl.cases['?'] = (ctrl.cases['?'] || []);\n ctrl.cases['?'].push({ transclude: $transclude, element: element });\n }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict EAC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * You can specify that you want to insert a named transclusion slot, instead of the default slot, by providing the slot name\n * as the value of the `ng-transclude` or `ng-transclude-slot` attribute.\n *\n * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing\n * content of this element will be removed before the transcluded content is inserted.\n * If the transcluded content is empty (or only whitespace), the existing content is left intact. This lets you provide fallback\n * content in the case that no transcluded content is provided.\n *\n * @element ANY\n *\n * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty\n * or its value is the same as the name of the attribute then the default slot is used.\n *\n * @example\n * ### Basic transclusion\n * This example demonstrates basic transclusion of content into a component directive.\n * \n * \n * \n * \n *
\n *
\n *
{{text}} \n *
\n * \n * \n * it('should have transcluded', function() {\n * var titleElement = element(by.model('title'));\n * titleElement.clear();\n * titleElement.sendKeys('TITLE');\n * var textElement = element(by.model('text'));\n * textElement.clear();\n * textElement.sendKeys('TEXT');\n * expect(element(by.binding('title')).getText()).toEqual('TITLE');\n * expect(element(by.binding('text')).getText()).toEqual('TEXT');\n * });\n * \n * \n *\n * @example\n * ### Transclude fallback content\n * This example shows how to use `NgTransclude` with fallback content, that\n * is displayed if no transcluded content is provided.\n *\n * \n * \n * \n * \n * \n * \n * \n * Button2 \n * \n * \n * \n * it('should have different transclude element content', function() {\n * expect(element(by.id('fallback')).getText()).toBe('Button1');\n * expect(element(by.id('modified')).getText()).toBe('Button2');\n * });\n * \n * \n *\n * @example\n * ### Multi-slot transclusion\n * This example demonstrates using multi-slot transclusion in a component directive.\n * \n * \n * \n * \n *
\n *
\n *
\n * {{title}} \n * {{text}}
\n * \n *
\n * \n * \n * angular.module('multiSlotTranscludeExample', [])\n * .directive('pane', function() {\n * return {\n * restrict: 'E',\n * transclude: {\n * 'title': '?paneTitle',\n * 'body': 'paneBody',\n * 'footer': '?paneFooter'\n * },\n * template: '' +\n * '
Fallback Title
' +\n * '
' +\n * '' +\n * '
'\n * };\n * })\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.title = 'Lorem Ipsum';\n * $scope.link = 'https://google.com';\n * $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n * }]);\n * \n * \n * it('should have transcluded the title and the body', function() {\n * var titleElement = element(by.model('title'));\n * titleElement.clear();\n * titleElement.sendKeys('TITLE');\n * var textElement = element(by.model('text'));\n * textElement.clear();\n * textElement.sendKeys('TEXT');\n * expect(element(by.css('.title')).getText()).toEqual('TITLE');\n * expect(element(by.binding('text')).getText()).toEqual('TEXT');\n * expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer');\n * });\n * \n * \n */\nvar ngTranscludeMinErr = minErr('ngTransclude');\nvar ngTranscludeDirective = ['$compile', function($compile) {\n return {\n restrict: 'EAC',\n terminal: true,\n compile: function ngTranscludeCompile(tElement) {\n\n // Remove and cache any original content to act as a fallback\n var fallbackLinkFn = $compile(tElement.contents());\n tElement.empty();\n\n return function ngTranscludePostLink($scope, $element, $attrs, controller, $transclude) {\n\n if (!$transclude) {\n throw ngTranscludeMinErr('orphan',\n 'Illegal use of ngTransclude directive in the template! ' +\n 'No parent directive that requires a transclusion found. ' +\n 'Element: {0}',\n startingTag($element));\n }\n\n\n // If the attribute is of the form: `ng-transclude=\"ng-transclude\"` then treat it like the default\n if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) {\n $attrs.ngTransclude = '';\n }\n var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot;\n\n // If the slot is required and no transclusion content is provided then this call will throw an error\n $transclude(ngTranscludeCloneAttachFn, null, slotName);\n\n // If the slot is optional and no transclusion content is provided then use the fallback content\n if (slotName && !$transclude.isSlotFilled(slotName)) {\n useFallbackContent();\n }\n\n function ngTranscludeCloneAttachFn(clone, transcludedScope) {\n if (clone.length && notWhitespace(clone)) {\n $element.append(clone);\n } else {\n useFallbackContent();\n // There is nothing linked against the transcluded scope since no content was available,\n // so it should be safe to clean up the generated scope.\n transcludedScope.$destroy();\n }\n }\n\n function useFallbackContent() {\n // Since this is the fallback content rather than the transcluded content,\n // we link against the scope of this directive rather than the transcluded scope\n fallbackLinkFn($scope, function(clone) {\n $element.append(clone);\n });\n }\n\n function notWhitespace(nodes) {\n for (var i = 0, ii = nodes.length; i < ii; i++) {\n var node = nodes[i];\n if (node.nodeType !== NODE_TYPE_TEXT || node.nodeValue.trim()) {\n return true;\n }\n }\n }\n };\n }\n };\n}];\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `\n\n Load inlined template \n
\n \n \n it('should load template defined inside script tag', function() {\n element(by.css('#tpl-link')).click();\n expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n });\n \n \n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n return {\n restrict: 'E',\n terminal: true,\n compile: function(element, attr) {\n if (attr.type === 'text/ng-template') {\n var templateUrl = attr.id,\n text = element[0].text;\n\n $templateCache.put(templateUrl, text);\n }\n }\n };\n}];\n\n/* exported selectDirective, optionDirective */\n\nvar noopNgModelController = { $setViewValue: noop, $render: noop };\n\n/**\n * @ngdoc type\n * @name select.SelectController\n * @description\n * The controller for the `` directive. This provides support for reading\n * and writing the selected value(s) of the control and also coordinates dynamically\n * added `` elements, perhaps by an `ngRepeat` directive.\n */\nvar SelectController =\n ['$element', '$scope', /** @this */ function($element, $scope) {\n\n var self = this,\n optionsMap = new HashMap();\n\n self.selectValueMap = {}; // Keys are the hashed values, values the original values\n\n // If the ngModel doesn't get provided then provide a dummy noop version to prevent errors\n self.ngModelCtrl = noopNgModelController;\n self.multiple = false;\n\n // The \"unknown\" option is one that is prepended to the list if the viewValue\n // does not match any of the options. When it is rendered the value of the unknown\n // option is '? XXX ?' where XXX is the hashKey of the value that is not known.\n //\n // We can't just jqLite(' ') since jqLite is not smart enough\n // to create it in and IE barfs otherwise.\n self.unknownOption = jqLite(window.document.createElement('option'));\n\n // The empty option is an option with the value '' that te application developer can\n // provide inside the select. When the model changes to a value that doesn't match an option,\n // it is selected - so if an empty option is provided, no unknown option is generated.\n // However, the empty option is not removed when the model matches an option. It is always selectable\n // and indicates that a \"null\" selection has been made.\n self.hasEmptyOption = false;\n self.emptyOption = undefined;\n\n self.renderUnknownOption = function(val) {\n var unknownVal = self.generateUnknownOptionValue(val);\n self.unknownOption.val(unknownVal);\n $element.prepend(self.unknownOption);\n setOptionAsSelected(self.unknownOption);\n $element.val(unknownVal);\n };\n\n self.updateUnknownOption = function(val) {\n var unknownVal = self.generateUnknownOptionValue(val);\n self.unknownOption.val(unknownVal);\n setOptionAsSelected(self.unknownOption);\n $element.val(unknownVal);\n };\n\n self.generateUnknownOptionValue = function(val) {\n return '? ' + hashKey(val) + ' ?';\n };\n\n self.removeUnknownOption = function() {\n if (self.unknownOption.parent()) self.unknownOption.remove();\n };\n\n self.selectEmptyOption = function() {\n if (self.emptyOption) {\n $element.val('');\n setOptionAsSelected(self.emptyOption);\n }\n };\n\n self.unselectEmptyOption = function() {\n if (self.hasEmptyOption) {\n self.emptyOption.removeAttr('selected');\n }\n };\n\n $scope.$on('$destroy', function() {\n // disable unknown option so that we don't do work when the whole select is being destroyed\n self.renderUnknownOption = noop;\n });\n\n // Read the value of the select control, the implementation of this changes depending\n // upon whether the select can have multiple values and whether ngOptions is at work.\n self.readValue = function readSingleValue() {\n var val = $element.val();\n // ngValue added option values are stored in the selectValueMap, normal interpolations are not\n var realVal = val in self.selectValueMap ? self.selectValueMap[val] : val;\n\n if (self.hasOption(realVal)) {\n return realVal;\n }\n\n return null;\n };\n\n\n // Write the value to the select control, the implementation of this changes depending\n // upon whether the select can have multiple values and whether ngOptions is at work.\n self.writeValue = function writeSingleValue(value) {\n // Make sure to remove the selected attribute from the previously selected option\n // Otherwise, screen readers might get confused\n var currentlySelectedOption = $element[0].options[$element[0].selectedIndex];\n if (currentlySelectedOption) currentlySelectedOption.removeAttribute('selected');\n\n if (self.hasOption(value)) {\n self.removeUnknownOption();\n\n var hashedVal = hashKey(value);\n $element.val(hashedVal in self.selectValueMap ? hashedVal : value);\n\n // Set selected attribute and property on selected option for screen readers\n var selectedOption = $element[0].options[$element[0].selectedIndex];\n setOptionAsSelected(jqLite(selectedOption));\n } else {\n if (value == null && self.emptyOption) {\n self.removeUnknownOption();\n self.selectEmptyOption();\n } else if (self.unknownOption.parent().length) {\n self.updateUnknownOption(value);\n } else {\n self.renderUnknownOption(value);\n }\n }\n };\n\n\n // Tell the select control that an option, with the given value, has been added\n self.addOption = function(value, element) {\n // Skip comment nodes, as they only pollute the `optionsMap`\n if (element[0].nodeType === NODE_TYPE_COMMENT) return;\n\n assertNotHasOwnProperty(value, '\"option value\"');\n if (value === '') {\n self.hasEmptyOption = true;\n self.emptyOption = element;\n }\n var count = optionsMap.get(value) || 0;\n optionsMap.put(value, count + 1);\n // Only render at the end of a digest. This improves render performance when many options\n // are added during a digest and ensures all relevant options are correctly marked as selected\n scheduleRender();\n };\n\n // Tell the select control that an option, with the given value, has been removed\n self.removeOption = function(value) {\n var count = optionsMap.get(value);\n if (count) {\n if (count === 1) {\n optionsMap.remove(value);\n if (value === '') {\n self.hasEmptyOption = false;\n self.emptyOption = undefined;\n }\n } else {\n optionsMap.put(value, count - 1);\n }\n }\n };\n\n // Check whether the select control has an option matching the given value\n self.hasOption = function(value) {\n return !!optionsMap.get(value);\n };\n\n\n var renderScheduled = false;\n function scheduleRender() {\n if (renderScheduled) return;\n renderScheduled = true;\n $scope.$$postDigest(function() {\n renderScheduled = false;\n self.ngModelCtrl.$render();\n });\n }\n\n var updateScheduled = false;\n function scheduleViewValueUpdate(renderAfter) {\n if (updateScheduled) return;\n\n updateScheduled = true;\n\n $scope.$$postDigest(function() {\n if ($scope.$$destroyed) return;\n\n updateScheduled = false;\n self.ngModelCtrl.$setViewValue(self.readValue());\n if (renderAfter) self.ngModelCtrl.$render();\n });\n }\n\n\n self.registerOption = function(optionScope, optionElement, optionAttrs, interpolateValueFn, interpolateTextFn) {\n\n if (optionAttrs.$attr.ngValue) {\n // The value attribute is set by ngValue\n var oldVal, hashedVal = NaN;\n optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n\n var removal;\n var previouslySelected = optionElement.prop('selected');\n\n if (isDefined(hashedVal)) {\n self.removeOption(oldVal);\n delete self.selectValueMap[hashedVal];\n removal = true;\n }\n\n hashedVal = hashKey(newVal);\n oldVal = newVal;\n self.selectValueMap[hashedVal] = newVal;\n self.addOption(newVal, optionElement);\n // Set the attribute directly instead of using optionAttrs.$set - this stops the observer\n // from firing a second time. Other $observers on value will also get the result of the\n // ngValue expression, not the hashed value\n optionElement.attr('value', hashedVal);\n\n if (removal && previouslySelected) {\n scheduleViewValueUpdate();\n }\n\n });\n } else if (interpolateValueFn) {\n // The value attribute is interpolated\n optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n // This method is overwritten in ngOptions and has side-effects!\n self.readValue();\n\n var removal;\n var previouslySelected = optionElement.prop('selected');\n\n if (isDefined(oldVal)) {\n self.removeOption(oldVal);\n removal = true;\n }\n oldVal = newVal;\n self.addOption(newVal, optionElement);\n\n if (removal && previouslySelected) {\n scheduleViewValueUpdate();\n }\n });\n } else if (interpolateTextFn) {\n // The text content is interpolated\n optionScope.$watch(interpolateTextFn, function interpolateWatchAction(newVal, oldVal) {\n optionAttrs.$set('value', newVal);\n var previouslySelected = optionElement.prop('selected');\n if (oldVal !== newVal) {\n self.removeOption(oldVal);\n }\n self.addOption(newVal, optionElement);\n\n if (oldVal && previouslySelected) {\n scheduleViewValueUpdate();\n }\n });\n } else {\n // The value attribute is static\n self.addOption(optionAttrs.value, optionElement);\n }\n\n\n optionAttrs.$observe('disabled', function(newVal) {\n\n // Since model updates will also select disabled options (like ngOptions),\n // we only have to handle options becoming disabled, not enabled\n\n if (newVal === 'true' || newVal && optionElement.prop('selected')) {\n if (self.multiple) {\n scheduleViewValueUpdate(true);\n } else {\n self.ngModelCtrl.$setViewValue(null);\n self.ngModelCtrl.$render();\n }\n }\n });\n\n optionElement.on('$destroy', function() {\n var currentValue = self.readValue();\n var removeValue = optionAttrs.value;\n\n self.removeOption(removeValue);\n self.ngModelCtrl.$render();\n\n if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 ||\n currentValue === removeValue\n ) {\n // When multiple (selected) options are destroyed at the same time, we don't want\n // to run a model update for each of them. Instead, run a single update in the $$postDigest\n scheduleViewValueUpdate(true);\n }\n });\n };\n\n function setOptionAsSelected(optionEl) {\n optionEl.prop('selected', true); // needed for IE\n optionEl.attr('selected', true);\n }\n}];\n\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `select` element with angular data-binding.\n *\n * The `select` directive is used together with {@link ngModel `ngModel`} to provide data-binding\n * between the scope and the `` control (including setting default values).\n * It also handles dynamic `` elements, which can be added using the {@link ngRepeat `ngRepeat}` or\n * {@link ngOptions `ngOptions`} directives.\n *\n * When an item in the `` menu is selected, the value of the selected option will be bound\n * to the model identified by the `ngModel` directive. With static or repeated options, this is\n * the content of the `value` attribute or the textContent of the ``, if the value attribute is missing.\n * Value and textContent can be interpolated.\n *\n * ## Matching model and option values\n *\n * In general, the match between the model and an option is evaluated by strictly comparing the model\n * value against the value of the available options.\n *\n * If you are setting the option value with the option's `value` attribute, or textContent, the\n * value will always be a `string` which means that the model value must also be a string.\n * Otherwise the `select` directive cannot match them correctly.\n *\n * To bind the model to a non-string value, you can use one of the following strategies:\n * - the {@link ng.ngOptions `ngOptions`} directive\n * ({@link ng.select#using-select-with-ngoptions-and-setting-a-default-value})\n * - the {@link ng.ngValue `ngValue`} directive, which allows arbitrary expressions to be\n * option values ({@link ng.select#using-ngvalue-to-bind-the-model-to-an-array-of-objects Example})\n * - model $parsers / $formatters to convert the string value\n * ({@link ng.select#binding-select-to-a-non-string-value-via-ngmodel-parsing-formatting Example})\n *\n * If the viewValue of `ngModel` does not match any of the options, then the control\n * will automatically add an \"unknown\" option, which it then removes when the mismatch is resolved.\n *\n * Optionally, a single hard-coded ` ` element, with the value set to an empty string, can\n * be nested into the `` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Choosing between `ngRepeat` and `ngOptions`\n *\n * In many cases, `ngRepeat` can be used on `` elements instead of {@link ng.directive:ngOptions\n * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits:\n * - more flexibility in how the ``'s model is assigned via the `select` **`as`** part of the\n * comprehension expression\n * - reduced memory consumption by not creating a new scope for each repeated instance\n * - increased render speed by creating the options in a documentFragment instead of individually\n *\n * Specifically, select with repeated options slows down significantly starting at 2000 options in\n * Chrome and Internet Explorer / Edge.\n *\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} multiple Allows multiple options to be selected. The selected values will be\n * bound to the model as an array.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds required attribute and required validation constraint to\n * the element when the ngRequired expression evaluates to true. Use ngRequired instead of required\n * when you want to data-bind to the required attribute.\n * @param {string=} ngChange Angular expression to be executed when selected option(s) changes due to user\n * interaction with the select element.\n * @param {string=} ngOptions sets the options that the select is populated with and defines what is\n * set on the model on selection. See {@link ngOptions `ngOptions`}.\n *\n * @example\n * ### Simple `select` elements with static options\n *\n * \n * \n * \n * \n *
\n * \n * \n * angular.module('staticSelect', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.data = {\n * singleSelect: null,\n * multipleSelect: [],\n * option1: 'option-1'\n * };\n *\n * $scope.forceUnknownOption = function() {\n * $scope.data.singleSelect = 'nonsense';\n * };\n * }]);\n * \n * \n *\n * ### Using `ngRepeat` to generate `select` options\n * \n * \n * \n * \n *
\n * model = {{data.model}} \n * \n * \n * \n * angular.module('ngrepeatSelect', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.data = {\n * model: null,\n * availableOptions: [\n * {id: '1', name: 'Option A'},\n * {id: '2', name: 'Option B'},\n * {id: '3', name: 'Option C'}\n * ]\n * };\n * }]);\n * \n * \n *\n * ### Using `ngValue` to bind the model to an array of objects\n * \n * \n * \n *
\n *
\n *
model = {{data.model | json}} \n *
\n * \n * \n * angular.module('ngvalueSelect', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.data = {\n * model: null,\n * availableOptions: [\n {value: 'myString', name: 'string'},\n {value: 1, name: 'integer'},\n {value: true, name: 'boolean'},\n {value: null, name: 'null'},\n {value: {prop: 'value'}, name: 'object'},\n {value: ['a'], name: 'array'}\n * ]\n * };\n * }]);\n * \n * \n *\n * ### Using `select` with `ngOptions` and setting a default value\n * See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples.\n *\n * \n * \n * \n * \n *
\n * option = {{data.selectedOption}} \n * \n * \n * \n * angular.module('defaultValueSelect', [])\n * .controller('ExampleController', ['$scope', function($scope) {\n * $scope.data = {\n * availableOptions: [\n * {id: '1', name: 'Option A'},\n * {id: '2', name: 'Option B'},\n * {id: '3', name: 'Option C'}\n * ],\n * selectedOption: {id: '3', name: 'Option C'} //This sets the default value of the select in the ui\n * };\n * }]);\n * \n * \n *\n *\n * ### Binding `select` to a non-string value via `ngModel` parsing / formatting\n *\n * \n * \n * \n * Zero \n * One \n * Two \n * \n * {{ model }}\n * \n * \n * angular.module('nonStringSelect', [])\n * .run(function($rootScope) {\n * $rootScope.model = { id: 2 };\n * })\n * .directive('convertToNumber', function() {\n * return {\n * require: 'ngModel',\n * link: function(scope, element, attrs, ngModel) {\n * ngModel.$parsers.push(function(val) {\n * return parseInt(val, 10);\n * });\n * ngModel.$formatters.push(function(val) {\n * return '' + val;\n * });\n * }\n * };\n * });\n * \n * \n * it('should initialize to model', function() {\n * expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two');\n * });\n * \n * \n *\n */\nvar selectDirective = function() {\n\n return {\n restrict: 'E',\n require: ['select', '?ngModel'],\n controller: SelectController,\n priority: 1,\n link: {\n pre: selectPreLink,\n post: selectPostLink\n }\n };\n\n function selectPreLink(scope, element, attr, ctrls) {\n\n var selectCtrl = ctrls[0];\n var ngModelCtrl = ctrls[1];\n\n // if ngModel is not defined, we don't need to do anything but set the registerOption\n // function to noop, so options don't get added internally\n if (!ngModelCtrl) {\n selectCtrl.registerOption = noop;\n return;\n }\n\n\n selectCtrl.ngModelCtrl = ngModelCtrl;\n\n // When the selected item(s) changes we delegate getting the value of the select control\n // to the `readValue` method, which can be changed if the select can have multiple\n // selected values or if the options are being generated by `ngOptions`\n element.on('change', function() {\n selectCtrl.removeUnknownOption();\n scope.$apply(function() {\n ngModelCtrl.$setViewValue(selectCtrl.readValue());\n });\n });\n\n // If the select allows multiple values then we need to modify how we read and write\n // values from and to the control; also what it means for the value to be empty and\n // we have to add an extra watch since ngModel doesn't work well with arrays - it\n // doesn't trigger rendering if only an item in the array changes.\n if (attr.multiple) {\n selectCtrl.multiple = true;\n\n // Read value now needs to check each option to see if it is selected\n selectCtrl.readValue = function readMultipleValue() {\n var array = [];\n forEach(element.find('option'), function(option) {\n if (option.selected && !option.disabled) {\n var val = option.value;\n array.push(val in selectCtrl.selectValueMap ? selectCtrl.selectValueMap[val] : val);\n }\n });\n return array;\n };\n\n // Write value now needs to set the selected property of each matching option\n selectCtrl.writeValue = function writeMultipleValue(value) {\n var items = new HashMap(value);\n forEach(element.find('option'), function(option) {\n option.selected = isDefined(items.get(option.value)) || isDefined(items.get(selectCtrl.selectValueMap[option.value]));\n });\n };\n\n // we have to do it on each watch since ngModel watches reference, but\n // we need to work of an array, so we need to see if anything was inserted/removed\n var lastView, lastViewRef = NaN;\n scope.$watch(function selectMultipleWatch() {\n if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) {\n lastView = shallowCopy(ngModelCtrl.$viewValue);\n ngModelCtrl.$render();\n }\n lastViewRef = ngModelCtrl.$viewValue;\n });\n\n // If we are a multiple select then value is now a collection\n // so the meaning of $isEmpty changes\n ngModelCtrl.$isEmpty = function(value) {\n return !value || value.length === 0;\n };\n\n }\n }\n\n function selectPostLink(scope, element, attrs, ctrls) {\n // if ngModel is not defined, we don't need to do anything\n var ngModelCtrl = ctrls[1];\n if (!ngModelCtrl) return;\n\n var selectCtrl = ctrls[0];\n\n // We delegate rendering to the `writeValue` method, which can be changed\n // if the select can have multiple selected values or if the options are being\n // generated by `ngOptions`.\n // This must be done in the postLink fn to prevent $render to be called before\n // all nodes have been linked correctly.\n ngModelCtrl.$render = function() {\n selectCtrl.writeValue(ngModelCtrl.$viewValue);\n };\n }\n};\n\n\n// The option directive is purely designed to communicate the existence (or lack of)\n// of dynamically created (and destroyed) option elements to their containing select\n// directive via its controller.\nvar optionDirective = ['$interpolate', function($interpolate) {\n return {\n restrict: 'E',\n priority: 100,\n compile: function(element, attr) {\n var interpolateValueFn, interpolateTextFn;\n\n if (isDefined(attr.ngValue)) {\n // Will be handled by registerOption\n } else if (isDefined(attr.value)) {\n // If the value attribute is defined, check if it contains an interpolation\n interpolateValueFn = $interpolate(attr.value, true);\n } else {\n // If the value attribute is not defined then we fall back to the\n // text content of the option element, which may be interpolated\n interpolateTextFn = $interpolate(element.text(), true);\n if (!interpolateTextFn) {\n attr.$set('value', element.text());\n }\n }\n\n return function(scope, element, attr) {\n // This is an optimization over using ^^ since we don't want to have to search\n // all the way to the root of the DOM for every single option element\n var selectCtrlName = '$selectController',\n parent = element.parent(),\n selectCtrl = parent.data(selectCtrlName) ||\n parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n if (selectCtrl) {\n selectCtrl.registerOption(scope, element, attr, interpolateValueFn, interpolateTextFn);\n }\n };\n }\n };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRequired\n * @restrict A\n *\n * @description\n *\n * ngRequired adds the required {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for {@link input `input`} and {@link select `select`} controls, but can also be\n * applied to custom controls.\n *\n * The directive sets the `required` attribute on the element if the Angular expression inside\n * `ngRequired` evaluates to true. A special directive for setting `required` is necessary because we\n * cannot use interpolation inside `required`. See the {@link guide/interpolation interpolation guide}\n * for more info.\n *\n * The validator will set the `required` error key to true if the `required` attribute is set and\n * calling {@link ngModel.NgModelController#$isEmpty `NgModelController.$isEmpty`} with the\n * {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} returns `true`. For example, the\n * `$isEmpty()` implementation for `input[text]` checks the length of the `$viewValue`. When developing\n * custom controls, `$isEmpty()` can be overwritten to account for a $viewValue that is not string-based.\n *\n * @example\n * \n * \n * \n * \n * \n *
\n * \n * \n var required = element(by.binding('form.input.$error.required'));\n var model = element(by.binding('model'));\n var input = element(by.id('input'));\n\n it('should set the required error', function() {\n expect(required.getText()).toContain('true');\n\n input.sendKeys('123');\n expect(required.getText()).not.toContain('true');\n expect(model.getText()).toContain('123');\n });\n * \n * \n */\nvar requiredDirective = function() {\n return {\n restrict: 'A',\n require: '?ngModel',\n link: function(scope, elm, attr, ctrl) {\n if (!ctrl) return;\n attr.required = true; // force truthy in case we are on non input element\n\n ctrl.$validators.required = function(modelValue, viewValue) {\n return !attr.required || !ctrl.$isEmpty(viewValue);\n };\n\n attr.$observe('required', function() {\n ctrl.$validate();\n });\n }\n };\n};\n\n/**\n * @ngdoc directive\n * @name ngPattern\n *\n * @description\n *\n * ngPattern adds the pattern {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `pattern` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * does not match a RegExp which is obtained by evaluating the Angular expression given in the\n * `ngPattern` attribute value:\n * * If the expression evaluates to a RegExp object, then this is used directly.\n * * If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it\n * in `^` and `$` characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n *\n * \n * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n * start at the index of the last search's match, thus not taking the whole input value into\n * account.\n *
\n *\n * \n * **Note:** This directive is also added when the plain `pattern` attribute is used, with two\n * differences:\n *
\n * \n * `ngPattern` does not set the `pattern` attribute and therefore HTML5 constraint validation is\n * not available.\n * \n * \n * The `ngPattern` attribute must be an expression, while the `pattern` value must be\n * interpolated.\n * \n * \n *
\n *\n * @example\n * \n * \n * \n * \n * \n *
\n * \n * \n var model = element(by.binding('model'));\n var input = element(by.id('input'));\n\n it('should validate the input with the default pattern', function() {\n input.sendKeys('aaa');\n expect(model.getText()).not.toContain('aaa');\n\n input.clear().then(function() {\n input.sendKeys('123');\n expect(model.getText()).toContain('123');\n });\n });\n * \n * \n */\nvar patternDirective = function() {\n return {\n restrict: 'A',\n require: '?ngModel',\n link: function(scope, elm, attr, ctrl) {\n if (!ctrl) return;\n\n var regexp, patternExp = attr.ngPattern || attr.pattern;\n attr.$observe('pattern', function(regex) {\n if (isString(regex) && regex.length > 0) {\n regex = new RegExp('^' + regex + '$');\n }\n\n if (regex && !regex.test) {\n throw minErr('ngPattern')('noregexp',\n 'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,\n regex, startingTag(elm));\n }\n\n regexp = regex || undefined;\n ctrl.$validate();\n });\n\n ctrl.$validators.pattern = function(modelValue, viewValue) {\n // HTML5 pattern constraint validates the input value, so we validate the viewValue\n return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);\n };\n }\n };\n};\n\n/**\n * @ngdoc directive\n * @name ngMaxlength\n *\n * @description\n *\n * ngMaxlength adds the maxlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `maxlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is longer than the integer obtained by evaluating the Angular expression given in the\n * `ngMaxlength` attribute value.\n *\n * \n * **Note:** This directive is also added when the plain `maxlength` attribute is used, with two\n * differences:\n *
\n * \n * `ngMaxlength` does not set the `maxlength` attribute and therefore HTML5 constraint\n * validation is not available.\n * \n * \n * The `ngMaxlength` attribute must be an expression, while the `maxlength` value must be\n * interpolated.\n * \n * \n *
\n *\n * @example\n * \n * \n * \n * \n * \n *
\n * \n * \n var model = element(by.binding('model'));\n var input = element(by.id('input'));\n\n it('should validate the input with the default maxlength', function() {\n input.sendKeys('abcdef');\n expect(model.getText()).not.toContain('abcdef');\n\n input.clear().then(function() {\n input.sendKeys('abcde');\n expect(model.getText()).toContain('abcde');\n });\n });\n * \n * \n */\nvar maxlengthDirective = function() {\n return {\n restrict: 'A',\n require: '?ngModel',\n link: function(scope, elm, attr, ctrl) {\n if (!ctrl) return;\n\n var maxlength = -1;\n attr.$observe('maxlength', function(value) {\n var intVal = toInt(value);\n maxlength = isNumberNaN(intVal) ? -1 : intVal;\n ctrl.$validate();\n });\n ctrl.$validators.maxlength = function(modelValue, viewValue) {\n return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);\n };\n }\n };\n};\n\n/**\n * @ngdoc directive\n * @name ngMinlength\n *\n * @description\n *\n * ngMinlength adds the minlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `minlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is shorter than the integer obtained by evaluating the Angular expression given in the\n * `ngMinlength` attribute value.\n *\n * \n * **Note:** This directive is also added when the plain `minlength` attribute is used, with two\n * differences:\n *
\n * \n * `ngMinlength` does not set the `minlength` attribute and therefore HTML5 constraint\n * validation is not available.\n * \n * \n * The `ngMinlength` value must be an expression, while the `minlength` value must be\n * interpolated.\n * \n * \n *
\n *\n * @example\n * \n * \n * \n * \n * \n *
\n * \n * \n var model = element(by.binding('model'));\n var input = element(by.id('input'));\n\n it('should validate the input with the default minlength', function() {\n input.sendKeys('ab');\n expect(model.getText()).not.toContain('ab');\n\n input.sendKeys('abc');\n expect(model.getText()).toContain('abc');\n });\n * \n * \n */\nvar minlengthDirective = function() {\n return {\n restrict: 'A',\n require: '?ngModel',\n link: function(scope, elm, attr, ctrl) {\n if (!ctrl) return;\n\n var minlength = 0;\n attr.$observe('minlength', function(value) {\n minlength = toInt(value) || 0;\n ctrl.$validate();\n });\n ctrl.$validators.minlength = function(modelValue, viewValue) {\n return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;\n };\n }\n };\n};\n\nif (window.angular.bootstrap) {\n // AngularJS is already loaded, so we can return here...\n if (window.console) {\n console.log('WARNING: Tried to load angular more than once.');\n }\n return;\n}\n\n// try to bind to jquery now so that one can write jqLite(fn)\n// but we will rebind on bootstrap again.\nbindJQuery();\n\npublishExternalAPI(angular);\n\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n n = n + '';\n var i = n.indexOf('.');\n return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n var v = opt_precision;\n\n if (undefined === v) {\n v = Math.min(getDecimals(n), 3);\n }\n\n var base = Math.pow(10, v);\n var f = ((n * base) | 0) % base;\n return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n \"DATETIME_FORMATS\": {\n \"AMPMS\": [\n \"AM\",\n \"PM\"\n ],\n \"DAY\": [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\"\n ],\n \"ERANAMES\": [\n \"Before Christ\",\n \"Anno Domini\"\n ],\n \"ERAS\": [\n \"BC\",\n \"AD\"\n ],\n \"FIRSTDAYOFWEEK\": 6,\n \"MONTH\": [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ],\n \"SHORTDAY\": [\n \"Sun\",\n \"Mon\",\n \"Tue\",\n \"Wed\",\n \"Thu\",\n \"Fri\",\n \"Sat\"\n ],\n \"SHORTMONTH\": [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ],\n \"STANDALONEMONTH\": [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ],\n \"WEEKENDRANGE\": [\n 5,\n 6\n ],\n \"fullDate\": \"EEEE, MMMM d, y\",\n \"longDate\": \"MMMM d, y\",\n \"medium\": \"MMM d, y h:mm:ss a\",\n \"mediumDate\": \"MMM d, y\",\n \"mediumTime\": \"h:mm:ss a\",\n \"short\": \"M/d/yy h:mm a\",\n \"shortDate\": \"M/d/yy\",\n \"shortTime\": \"h:mm a\"\n },\n \"NUMBER_FORMATS\": {\n \"CURRENCY_SYM\": \"$\",\n \"DECIMAL_SEP\": \".\",\n \"GROUP_SEP\": \",\",\n \"PATTERNS\": [\n {\n \"gSize\": 3,\n \"lgSize\": 3,\n \"maxFrac\": 3,\n \"minFrac\": 0,\n \"minInt\": 1,\n \"negPre\": \"-\",\n \"negSuf\": \"\",\n \"posPre\": \"\",\n \"posSuf\": \"\"\n },\n {\n \"gSize\": 3,\n \"lgSize\": 3,\n \"maxFrac\": 2,\n \"minFrac\": 2,\n \"minInt\": 1,\n \"negPre\": \"-\\u00a4\",\n \"negSuf\": \"\",\n \"posPre\": \"\\u00a4\",\n \"posSuf\": \"\"\n }\n ]\n },\n \"id\": \"en-us\",\n \"localeID\": \"en_US\",\n \"pluralCat\": function(n, opt_precision) { var i = n | 0; var vf = getVF(n, opt_precision); if (i == 1 && vf.v == 0) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n\n jqLite(function() {\n angularInit(window.document, bootstrap);\n });\n\n})(window);\n\n!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('');\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYW5ndWxhci9hbmd1bGFyLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FuZ3VsYXIvYW5ndWxhci5qcz8yMWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjYuMFxuICogKGMpIDIwMTAtMjAxNiBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmdcbiAqIExpY2Vuc2U6IE1JVFxuICovXG4oZnVuY3Rpb24od2luZG93KSB7J3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGEgdXRpbGl0eSBmb3IgcHJvZHVjaW5nIHJpY2ggRXJyb3IgbWVzc2FnZXMgd2l0aGluXG4gKiBBbmd1bGFyLiBJdCBjYW4gYmUgY2FsbGVkIGFzIGZvbGxvd3M6XG4gKlxuICogdmFyIGV4YW1wbGVNaW5FcnIgPSBtaW5FcnIoJ2V4YW1wbGUnKTtcbiAqIHRocm93IGV4YW1wbGVNaW5FcnIoJ29uZScsICdUaGlzIHswfSBpcyB7MX0nLCBmb28sIGJhcik7XG4gKlxuICogVGhlIGFib3ZlIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgbWluRXJyIGluIHRoZSBleGFtcGxlIG5hbWVzcGFjZS4gVGhlXG4gKiByZXN1bHRpbmcgZXJyb3Igd2lsbCBoYXZlIGEgbmFtZXNwYWNlZCBlcnJvciBjb2RlIG9mIGV4YW1wbGUub25lLiAgVGhlXG4gKiByZXN1bHRpbmcgZXJyb3Igd2lsbCByZXBsYWNlIHswfSB3aXRoIHRoZSB2YWx1ZSBvZiBmb28sIGFuZCB7MX0gd2l0aCB0aGVcbiAqIHZhbHVlIG9mIGJhci4gVGhlIG9iamVjdCBpcyBub3QgcmVzdHJpY3RlZCBpbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCBjYW5cbiAqIHRha2UuXG4gKlxuICogSWYgZmV3ZXIgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgdGhhbiBuZWNlc3NhcnkgZm9yIGludGVycG9sYXRpb24sIHRoZSBleHRyYVxuICogaW50ZXJwb2xhdGlvbiBtYXJrZXJzIHdpbGwgYmUgcHJlc2VydmVkIGluIHRoZSBmaW5hbCBzdHJpbmcuXG4gKlxuICogU2luY2UgZGF0YSB3aWxsIGJlIHBhcnNlZCBzdGF0aWNhbGx5IGR1cmluZyBhIGJ1aWxkIHN0ZXAsIHNvbWUgcmVzdHJpY3Rpb25zXG4gKiBhcmUgYXBwbGllZCB3aXRoIHJlc3BlY3QgdG8gaG93IG1pbkVyciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYW5kIGNhbGxlZC5cbiAqIEluc3RhbmNlcyBzaG91bGQgaGF2ZSBuYW1lcyBvZiB0aGUgZm9ybSBuYW1lc3BhY2VNaW5FcnIgZm9yIGEgbWluRXJyIGNyZWF0ZWRcbiAqIHVzaW5nIG1pbkVycignbmFtZXNwYWNlJykgLiBFcnJvciBjb2RlcywgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGUgc3RyaW5nc1xuICogc2hvdWxkIGFsbCBiZSBzdGF0aWMgc3RyaW5ncywgbm90IHZhcmlhYmxlcyBvciBnZW5lcmFsIGV4cHJlc3Npb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgVGhlIG5hbWVzcGFjZSB0byB1c2UgZm9yIHRoZSBuZXcgbWluRXJyIGluc3RhbmNlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gRXJyb3JDb25zdHJ1Y3RvciBDdXN0b20gZXJyb3IgY29uc3RydWN0b3IgdG8gYmUgaW5zdGFudGlhdGVkIHdoZW4gcmV0dXJuaW5nXG4gKiAgIGVycm9yIGZyb20gcmV0dXJuZWQgZnVuY3Rpb24sIGZvciBjYXNlcyB3aGVuIGEgcGFydGljdWxhciB0eXBlIG9mIGVycm9yIGlzIHVzZWZ1bC5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbihjb2RlOnN0cmluZywgdGVtcGxhdGU6c3RyaW5nLCAuLi50ZW1wbGF0ZUFyZ3MpOiBFcnJvcn0gbWluRXJyIGluc3RhbmNlXG4gKi9cblxuZnVuY3Rpb24gbWluRXJyKG1vZHVsZSwgRXJyb3JDb25zdHJ1Y3Rvcikge1xuICBFcnJvckNvbnN0cnVjdG9yID0gRXJyb3JDb25zdHJ1Y3RvciB8fCBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBTS0lQX0lOREVYRVMgPSAyO1xuXG4gICAgdmFyIHRlbXBsYXRlQXJncyA9IGFyZ3VtZW50cyxcbiAgICAgIGNvZGUgPSB0ZW1wbGF0ZUFyZ3NbMF0sXG4gICAgICBtZXNzYWdlID0gJ1snICsgKG1vZHVsZSA/IG1vZHVsZSArICc6JyA6ICcnKSArIGNvZGUgKyAnXSAnLFxuICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZUFyZ3NbMV0sXG4gICAgICBwYXJhbVByZWZpeCwgaTtcblxuICAgIG1lc3NhZ2UgKz0gdGVtcGxhdGUucmVwbGFjZSgvXFx7XFxkK1xcfS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgICAgdmFyIGluZGV4ID0gK21hdGNoLnNsaWNlKDEsIC0xKSxcbiAgICAgICAgc2hpZnRlZEluZGV4ID0gaW5kZXggKyBTS0lQX0lOREVYRVM7XG5cbiAgICAgIGlmIChzaGlmdGVkSW5kZXggPCB0ZW1wbGF0ZUFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0b0RlYnVnU3RyaW5nKHRlbXBsYXRlQXJnc1tzaGlmdGVkSW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgbWVzc2FnZSArPSAnXFxuaHR0cDovL2Vycm9ycy5hbmd1bGFyanMub3JnLzEuNi4wLycgK1xuICAgICAgKG1vZHVsZSA/IG1vZHVsZSArICcvJyA6ICcnKSArIGNvZGU7XG5cbiAgICBmb3IgKGkgPSBTS0lQX0lOREVYRVMsIHBhcmFtUHJlZml4ID0gJz8nOyBpIDwgdGVtcGxhdGVBcmdzLmxlbmd0aDsgaSsrLCBwYXJhbVByZWZpeCA9ICcmJykge1xuICAgICAgbWVzc2FnZSArPSBwYXJhbVByZWZpeCArICdwJyArIChpIC0gU0tJUF9JTkRFWEVTKSArICc9JyArXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0b0RlYnVnU3RyaW5nKHRlbXBsYXRlQXJnc1tpXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRXJyb3JDb25zdHJ1Y3RvcihtZXNzYWdlKTtcbiAgfTtcbn1cblxuLyogV2UgbmVlZCB0byB0ZWxsIEVTTGludCB3aGF0IHZhcmlhYmxlcyBhcmUgYmVpbmcgZXhwb3J0ZWQgKi9cbi8qIGV4cG9ydGVkXG4gIGFuZ3VsYXIsXG4gIG1zaWUsXG4gIGpxTGl0ZSxcbiAgalF1ZXJ5LFxuICBzbGljZSxcbiAgc3BsaWNlLFxuICBwdXNoLFxuICB0b1N0cmluZyxcbiAgbmdNaW5FcnIsXG4gIGFuZ3VsYXJNb2R1bGUsXG4gIHVpZCxcbiAgUkVHRVhfU1RSSU5HX1JFR0VYUCxcbiAgVkFMSURJVFlfU1RBVEVfUFJPUEVSVFksXG5cbiAgbG93ZXJjYXNlLFxuICB1cHBlcmNhc2UsXG4gIG1hbnVhbExvd2VyY2FzZSxcbiAgbWFudWFsVXBwZXJjYXNlLFxuICBub2RlTmFtZV8sXG4gIGlzQXJyYXlMaWtlLFxuICBmb3JFYWNoLFxuICBmb3JFYWNoU29ydGVkLFxuICByZXZlcnNlUGFyYW1zLFxuICBuZXh0VWlkLFxuICBzZXRIYXNoS2V5LFxuICBleHRlbmQsXG4gIHRvSW50LFxuICBpbmhlcml0LFxuICBtZXJnZSxcbiAgbm9vcCxcbiAgaWRlbnRpdHksXG4gIHZhbHVlRm4sXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RlZmluZWQsXG4gIGlzT2JqZWN0LFxuICBpc0JsYW5rT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzTnVtYmVyTmFOLFxuICBpc0RhdGUsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUmVnRXhwLFxuICBpc1dpbmRvdyxcbiAgaXNTY29wZSxcbiAgaXNGaWxlLFxuICBpc0Zvcm1EYXRhLFxuICBpc0Jsb2IsXG4gIGlzQm9vbGVhbixcbiAgaXNQcm9taXNlTGlrZSxcbiAgdHJpbSxcbiAgZXNjYXBlRm9yUmVnZXhwLFxuICBpc0VsZW1lbnQsXG4gIG1ha2VNYXAsXG4gIGluY2x1ZGVzLFxuICBhcnJheVJlbW92ZSxcbiAgY29weSxcbiAgZXF1YWxzLFxuICBjc3AsXG4gIGpxLFxuICBjb25jYXQsXG4gIHNsaWNlQXJncyxcbiAgYmluZCxcbiAgdG9Kc29uUmVwbGFjZXIsXG4gIHRvSnNvbixcbiAgZnJvbUpzb24sXG4gIGNvbnZlcnRUaW1lem9uZVRvTG9jYWwsXG4gIHRpbWV6b25lVG9PZmZzZXQsXG4gIHN0YXJ0aW5nVGFnLFxuICB0cnlEZWNvZGVVUklDb21wb25lbnQsXG4gIHBhcnNlS2V5VmFsdWUsXG4gIHRvS2V5VmFsdWUsXG4gIGVuY29kZVVyaVNlZ21lbnQsXG4gIGVuY29kZVVyaVF1ZXJ5LFxuICBhbmd1bGFySW5pdCxcbiAgYm9vdHN0cmFwLFxuICBnZXRUZXN0YWJpbGl0eSxcbiAgc25ha2VfY2FzZSxcbiAgYmluZEpRdWVyeSxcbiAgYXNzZXJ0QXJnLFxuICBhc3NlcnRBcmdGbixcbiAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHksXG4gIGdldHRlcixcbiAgZ2V0QmxvY2tOb2RlcyxcbiAgaGFzT3duUHJvcGVydHksXG4gIGNyZWF0ZU1hcCxcbiAgc3RyaW5naWZ5LFxuXG4gIE5PREVfVFlQRV9FTEVNRU5ULFxuICBOT0RFX1RZUEVfQVRUUklCVVRFLFxuICBOT0RFX1RZUEVfVEVYVCxcbiAgTk9ERV9UWVBFX0NPTU1FTlQsXG4gIE5PREVfVFlQRV9ET0NVTUVOVCxcbiAgTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UXG4qL1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAbmdkb2MgbW9kdWxlXG4gKiBAbmFtZSBuZ1xuICogQG1vZHVsZSBuZ1xuICogQGluc3RhbGxhdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogIyBuZyAoY29yZSBtb2R1bGUpXG4gKiBUaGUgbmcgbW9kdWxlIGlzIGxvYWRlZCBieSBkZWZhdWx0IHdoZW4gYW4gQW5ndWxhckpTIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQuIFRoZSBtb2R1bGUgaXRzZWxmXG4gKiBjb250YWlucyB0aGUgZXNzZW50aWFsIGNvbXBvbmVudHMgZm9yIGFuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiB0byBmdW5jdGlvbi4gVGhlIHRhYmxlIGJlbG93XG4gKiBsaXN0cyBhIGhpZ2ggbGV2ZWwgYnJlYWtkb3duIG9mIGVhY2ggb2YgdGhlIHNlcnZpY2VzL2ZhY3RvcmllcywgZmlsdGVycywgZGlyZWN0aXZlcyBhbmQgdGVzdGluZ1xuICogY29tcG9uZW50cyBhdmFpbGFibGUgd2l0aGluIHRoaXMgY29yZSBtb2R1bGUuXG4gKlxuICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9XCJuZ1wiPjwvZGl2PlxuICovXG5cbnZhciBSRUdFWF9TVFJJTkdfUkVHRVhQID0gL15cXC8oLispXFwvKFthLXpdKikkLztcblxuLy8gVGhlIG5hbWUgb2YgYSBmb3JtIGNvbnRyb2wncyBWYWxpZGl0eVN0YXRlIHByb3BlcnR5LlxuLy8gVGhpcyBpcyB1c2VkIHNvIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgaW50ZXJuYWwgdGVzdHMgdG8gY3JlYXRlIG1vY2sgVmFsaWRpdHlTdGF0ZXMuXG52YXIgVkFMSURJVFlfU1RBVEVfUFJPUEVSVFkgPSAndmFsaWRpdHknO1xuXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmxvd2VyY2FzZVxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogc2luY2VWZXJzaW9uPVwiMS41LjBcIlxuICogcmVtb3ZlVmVyc2lvbj1cIjEuNy4wXCJcbiAqIFVzZSBbU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL3RvTG93ZXJDYXNlKSBpbnN0ZWFkLlxuICpcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBsb3dlcmNhc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuICogQHJldHVybnMge3N0cmluZ30gTG93ZXJjYXNlZCBzdHJpbmcuXG4gKi9cbnZhciBsb3dlcmNhc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtyZXR1cm4gaXNTdHJpbmcoc3RyaW5nKSA/IHN0cmluZy50b0xvd2VyQ2FzZSgpIDogc3RyaW5nO307XG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLnVwcGVyY2FzZVxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogc2luY2VWZXJzaW9uPVwiMS41LjBcIlxuICogcmVtb3ZlVmVyc2lvbj1cIjEuNy4wXCJcbiAqIFVzZSBbU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL3RvVXBwZXJDYXNlKSBpbnN0ZWFkLlxuICpcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB1cHBlcmNhc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLlxuICogQHJldHVybnMge3N0cmluZ30gVXBwZXJjYXNlZCBzdHJpbmcuXG4gKi9cbnZhciB1cHBlcmNhc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtyZXR1cm4gaXNTdHJpbmcoc3RyaW5nKSA/IHN0cmluZy50b1VwcGVyQ2FzZSgpIDogc3RyaW5nO307XG5cblxudmFyIG1hbnVhbExvd2VyY2FzZSA9IGZ1bmN0aW9uKHMpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICByZXR1cm4gaXNTdHJpbmcocylcbiAgICAgID8gcy5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbihjaCkge3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgfCAzMik7fSlcbiAgICAgIDogcztcbiAgLyogZXNsaW50LWVuYWJsZSAqL1xufTtcbnZhciBtYW51YWxVcHBlcmNhc2UgPSBmdW5jdGlvbihzKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgcmV0dXJuIGlzU3RyaW5nKHMpXG4gICAgICA/IHMucmVwbGFjZSgvW2Etel0vZywgZnVuY3Rpb24oY2gpIHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApICYgfjMyKTt9KVxuICAgICAgOiBzO1xuICAvKiBlc2xpbnQtZW5hYmxlICovXG59O1xuXG5cbi8vIFN0cmluZyN0b0xvd2VyQ2FzZSBhbmQgU3RyaW5nI3RvVXBwZXJDYXNlIGRvbid0IHByb2R1Y2UgY29ycmVjdCByZXN1bHRzIGluIGJyb3dzZXJzIHdpdGggVHVya2lzaFxuLy8gbG9jYWxlLCBmb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBkZXRlY3QgdGhpcyBjYXNlIGFuZCByZWRlZmluZSBsb3dlcmNhc2UvdXBwZXJjYXNlIG1ldGhvZHNcbi8vIHdpdGggY29ycmVjdCBidXQgc2xvd2VyIGFsdGVybmF0aXZlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzExMzg3XG5pZiAoJ2knICE9PSAnSScudG9Mb3dlckNhc2UoKSkge1xuICBsb3dlcmNhc2UgPSBtYW51YWxMb3dlcmNhc2U7XG4gIHVwcGVyY2FzZSA9IG1hbnVhbFVwcGVyY2FzZTtcbn1cblxuXG52YXJcbiAgICBtc2llLCAgICAgICAgICAgICAvLyBob2xkcyBtYWpvciB2ZXJzaW9uIG51bWJlciBmb3IgSUUsIG9yIE5hTiBpZiBVQSBpcyBub3QgSUUuXG4gICAganFMaXRlLCAgICAgICAgICAgLy8gZGVsYXkgYmluZGluZyBzaW5jZSBqUXVlcnkgY291bGQgYmUgbG9hZGVkIGFmdGVyIHVzLlxuICAgIGpRdWVyeSwgICAgICAgICAgIC8vIGRlbGF5IGJpbmRpbmdcbiAgICBzbGljZSAgICAgICAgICAgICA9IFtdLnNsaWNlLFxuICAgIHNwbGljZSAgICAgICAgICAgID0gW10uc3BsaWNlLFxuICAgIHB1c2ggICAgICAgICAgICAgID0gW10ucHVzaCxcbiAgICB0b1N0cmluZyAgICAgICAgICA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICAgZ2V0UHJvdG90eXBlT2YgICAgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gICAgbmdNaW5FcnIgICAgICAgICAgPSBtaW5FcnIoJ25nJyksXG5cbiAgICAvKiogQG5hbWUgYW5ndWxhciAqL1xuICAgIGFuZ3VsYXIgICAgICAgICAgID0gd2luZG93LmFuZ3VsYXIgfHwgKHdpbmRvdy5hbmd1bGFyID0ge30pLFxuICAgIGFuZ3VsYXJNb2R1bGUsXG4gICAgdWlkICAgICAgICAgICAgICAgPSAwO1xuXG4vLyBTdXBwb3J0OiBJRSA5LTExIG9ubHlcbi8qKlxuICogZG9jdW1lbnRNb2RlIGlzIGFuIElFLW9ubHkgcHJvcGVydHlcbiAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9jYzE5Njk4OCh2PXZzLjg1KS5hc3B4XG4gKi9cbm1zaWUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYG9iamAgaXMgYW4gYXJyYXkgb3IgYXJyYXktbGlrZSBvYmplY3QgKE5vZGVMaXN0LCBBcmd1bWVudHMsXG4gKiAgICAgICAgICAgICAgICAgICBTdHJpbmcgLi4uKVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZShvYmopIHtcblxuICAvLyBgbnVsbGAsIGB1bmRlZmluZWRgIGFuZCBgd2luZG93YCBhcmUgbm90IGFycmF5LWxpa2VcbiAgaWYgKG9iaiA9PSBudWxsIHx8IGlzV2luZG93KG9iaikpIHJldHVybiBmYWxzZTtcblxuICAvLyBhcnJheXMsIHN0cmluZ3MgYW5kIGpRdWVyeS9qcUxpdGUgb2JqZWN0cyBhcmUgYXJyYXkgbGlrZVxuICAvLyAqIGpxTGl0ZSBpcyBlaXRoZXIgdGhlIGpRdWVyeSBvciBqcUxpdGUgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAgLy8gKiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YganFMaXRlIGZpcnN0IGFzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAvLyAgIHZpYSB0aGUgZm9yRWFjaCBtZXRob2Qgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGpxTGl0ZSBvYmplY3QgaW4gdGhlIGZpcnN0IHBsYWNlXG4gIGlmIChpc0FycmF5KG9iaikgfHwgaXNTdHJpbmcob2JqKSB8fCAoanFMaXRlICYmIG9iaiBpbnN0YW5jZW9mIGpxTGl0ZSkpIHJldHVybiB0cnVlO1xuXG4gIC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuICAvLyBcImxlbmd0aFwiIGluIG9iaiB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0xMTUwOClcbiAgdmFyIGxlbmd0aCA9ICdsZW5ndGgnIGluIE9iamVjdChvYmopICYmIG9iai5sZW5ndGg7XG5cbiAgLy8gTm9kZUxpc3Qgb2JqZWN0cyAod2l0aCBgaXRlbWAgbWV0aG9kKSBhbmRcbiAgLy8gb3RoZXIgb2JqZWN0cyB3aXRoIHN1aXRhYmxlIGxlbmd0aCBjaGFyYWN0ZXJpc3RpY3MgYXJlIGFycmF5LWxpa2VcbiAgcmV0dXJuIGlzTnVtYmVyKGxlbmd0aCkgJiZcbiAgICAobGVuZ3RoID49IDAgJiYgKChsZW5ndGggLSAxKSBpbiBvYmogfHwgb2JqIGluc3RhbmNlb2YgQXJyYXkpIHx8IHR5cGVvZiBvYmouaXRlbSA9PT0gJ2Z1bmN0aW9uJyk7XG5cbn1cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuZm9yRWFjaFxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEludm9rZXMgdGhlIGBpdGVyYXRvcmAgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBpdGVtIGluIGBvYmpgIGNvbGxlY3Rpb24sIHdoaWNoIGNhbiBiZSBlaXRoZXIgYW5cbiAqIG9iamVjdCBvciBhbiBhcnJheS4gVGhlIGBpdGVyYXRvcmAgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGBpdGVyYXRvcih2YWx1ZSwga2V5LCBvYmopYCwgd2hlcmUgYHZhbHVlYFxuICogaXMgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eSBvciBhbiBhcnJheSBlbGVtZW50LCBga2V5YCBpcyB0aGUgb2JqZWN0IHByb3BlcnR5IGtleSBvclxuICogYXJyYXkgZWxlbWVudCBpbmRleCBhbmQgb2JqIGlzIHRoZSBgb2JqYCBpdHNlbGYuIFNwZWNpZnlpbmcgYSBgY29udGV4dGAgZm9yIHRoZSBmdW5jdGlvbiBpcyBvcHRpb25hbC5cbiAqXG4gKiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBgLmZvckVhY2hgIGRvZXMgbm90IGl0ZXJhdGUgb3ZlciBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWNhdXNlIGl0IGZpbHRlcnNcbiAqIHVzaW5nIHRoZSBgaGFzT3duUHJvcGVydHlgIG1ldGhvZC5cbiAqXG4gKiBVbmxpa2UgRVMyNjInc1xuICogW0FycmF5LnByb3RvdHlwZS5mb3JFYWNoXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuNC40LjE4KSxcbiAqIHByb3ZpZGluZyAndW5kZWZpbmVkJyBvciAnbnVsbCcgdmFsdWVzIGZvciBgb2JqYCB3aWxsIG5vdCB0aHJvdyBhIFR5cGVFcnJvciwgYnV0IHJhdGhlciBqdXN0XG4gKiByZXR1cm4gdGhlIHZhbHVlIHByb3ZpZGVkLlxuICpcbiAgIGBgYGpzXG4gICAgIHZhciB2YWx1ZXMgPSB7bmFtZTogJ21pc2tvJywgZ2VuZGVyOiAnbWFsZSd9O1xuICAgICB2YXIgbG9nID0gW107XG4gICAgIGFuZ3VsYXIuZm9yRWFjaCh2YWx1ZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICB0aGlzLnB1c2goa2V5ICsgJzogJyArIHZhbHVlKTtcbiAgICAgfSwgbG9nKTtcbiAgICAgZXhwZWN0KGxvZykudG9FcXVhbChbJ25hbWU6IG1pc2tvJywgJ2dlbmRlcjogbWFsZSddKTtcbiAgIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogT2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yIEl0ZXJhdG9yIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb250ZXh0IE9iamVjdCB0byBiZWNvbWUgY29udGV4dCAoYHRoaXNgKSBmb3IgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICogQHJldHVybnMge09iamVjdHxBcnJheX0gUmVmZXJlbmNlIHRvIGBvYmpgLlxuICovXG5cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICB2YXIga2V5LCBsZW5ndGg7XG4gIGlmIChvYmopIHtcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ3Byb3RvdHlwZScgJiYga2V5ICE9PSAnbGVuZ3RoJyAmJiBrZXkgIT09ICduYW1lJyAmJiBvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmopIHx8IGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIHZhciBpc1ByaW1pdGl2ZSA9IHR5cGVvZiBvYmogIT09ICdvYmplY3QnO1xuICAgICAgZm9yIChrZXkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSB8fCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvYmouZm9yRWFjaCAmJiBvYmouZm9yRWFjaCAhPT0gZm9yRWFjaCkge1xuICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3Qob2JqKSkge1xuICAgICAgLy8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iai5oYXNPd25Qcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU2xvdyBwYXRoIGZvciBvYmplY3RzIGluaGVyaXRpbmcgT2JqZWN0LnByb3RvdHlwZSwgaGFzT3duUHJvcGVydHkgY2hlY2sgbmVlZGVkXG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNsb3cgcGF0aCBmb3Igb2JqZWN0cyB3aGljaCBkbyBub3QgaGF2ZSBhIG1ldGhvZCBgaGFzT3duUHJvcGVydHlgXG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTb3J0ZWQob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaikuc29ydCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXlzW2ldXSwga2V5c1tpXSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5cblxuLyoqXG4gKiB3aGVuIHVzaW5nIGZvckVhY2ggdGhlIHBhcmFtcyBhcmUgdmFsdWUsIGtleSwgYnV0IGl0IGlzIG9mdGVuIHVzZWZ1bCB0byBoYXZlIGtleSwgdmFsdWUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZywgKil9IGl0ZXJhdG9yRm5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqLCBzdHJpbmcpfVxuICovXG5mdW5jdGlvbiByZXZlcnNlUGFyYW1zKGl0ZXJhdG9yRm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtpdGVyYXRvckZuKGtleSwgdmFsdWUpO307XG59XG5cbi8qKlxuICogQSBjb25zaXN0ZW50IHdheSBvZiBjcmVhdGluZyB1bmlxdWUgSURzIGluIGFuZ3VsYXIuXG4gKlxuICogVXNpbmcgc2ltcGxlIG51bWJlcnMgYWxsb3dzIHVzIHRvIGdlbmVyYXRlIDI4LjYgbWlsbGlvbiB1bmlxdWUgaWRzIHBlciBzZWNvbmQgZm9yIDEwIHllYXJzIGJlZm9yZVxuICogd2UgaGl0IG51bWJlciBwcmVjaXNpb24gaXNzdWVzIGluIEphdmFTY3JpcHQuXG4gKlxuICogTWF0aC5wb3coMiw1MykgLyA2MCAvIDYwIC8gMjQgLyAzNjUgLyAxMCA9IDI4LjZNXG4gKlxuICogQHJldHVybnMge251bWJlcn0gYW4gdW5pcXVlIGFscGhhLW51bWVyaWMgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIG5leHRVaWQoKSB7XG4gIHJldHVybiArK3VpZDtcbn1cblxuXG4vKipcbiAqIFNldCBvciBjbGVhciB0aGUgaGFzaGtleSBmb3IgYW4gb2JqZWN0LlxuICogQHBhcmFtIG9iaiBvYmplY3RcbiAqIEBwYXJhbSBoIHRoZSBoYXNoa2V5ICghdHJ1dGh5IHRvIGRlbGV0ZSB0aGUgaGFzaGtleSlcbiAqL1xuZnVuY3Rpb24gc2V0SGFzaEtleShvYmosIGgpIHtcbiAgaWYgKGgpIHtcbiAgICBvYmouJCRoYXNoS2V5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgb2JqLiQkaGFzaEtleTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGJhc2VFeHRlbmQoZHN0LCBvYmpzLCBkZWVwKSB7XG4gIHZhciBoID0gZHN0LiQkaGFzaEtleTtcblxuICBmb3IgKHZhciBpID0gMCwgaWkgPSBvYmpzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICB2YXIgb2JqID0gb2Jqc1tpXTtcbiAgICBpZiAoIWlzT2JqZWN0KG9iaikgJiYgIWlzRnVuY3Rpb24ob2JqKSkgY29udGludWU7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGtleXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICB2YXIgc3JjID0gb2JqW2tleV07XG5cbiAgICAgIGlmIChkZWVwICYmIGlzT2JqZWN0KHNyYykpIHtcbiAgICAgICAgaWYgKGlzRGF0ZShzcmMpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBuZXcgRGF0ZShzcmMudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1JlZ0V4cChzcmMpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBuZXcgUmVnRXhwKHNyYyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjLm5vZGVOYW1lKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBzcmMuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRWxlbWVudChzcmMpKSB7XG4gICAgICAgICAgZHN0W2tleV0gPSBzcmMuY2xvbmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRzdFtrZXldKSkgZHN0W2tleV0gPSBpc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuICAgICAgICAgIGJhc2VFeHRlbmQoZHN0W2tleV0sIFtzcmNdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0SGFzaEtleShkc3QsIGgpO1xuICByZXR1cm4gZHN0O1xufVxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5leHRlbmRcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeHRlbmRzIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgYGRzdGAgYnkgY29weWluZyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGBzcmNgIG9iamVjdChzKVxuICogdG8gYGRzdGAuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBgc3JjYCBvYmplY3RzLiBJZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBvcmlnaW5hbCBvYmplY3RzLCB5b3UgY2FuIGRvIHNvXG4gKiBieSBwYXNzaW5nIGFuIGVtcHR5IG9iamVjdCBhcyB0aGUgdGFyZ2V0OiBgdmFyIG9iamVjdCA9IGFuZ3VsYXIuZXh0ZW5kKHt9LCBvYmplY3QxLCBvYmplY3QyKWAuXG4gKlxuICogKipOb3RlOioqIEtlZXAgaW4gbWluZCB0aGF0IGBhbmd1bGFyLmV4dGVuZGAgZG9lcyBub3Qgc3VwcG9ydCByZWN1cnNpdmUgbWVyZ2UgKGRlZXAgY29weSkuIFVzZVxuICoge0BsaW5rIGFuZ3VsYXIubWVyZ2V9IGZvciB0aGlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkc3QgRGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IHNyYyBTb3VyY2Ugb2JqZWN0KHMpLlxuICogQHJldHVybnMge09iamVjdH0gUmVmZXJlbmNlIHRvIGBkc3RgLlxuICovXG5mdW5jdGlvbiBleHRlbmQoZHN0KSB7XG4gIHJldHVybiBiYXNlRXh0ZW5kKGRzdCwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBmYWxzZSk7XG59XG5cblxuLyoqXG4qIEBuZ2RvYyBmdW5jdGlvblxuKiBAbmFtZSBhbmd1bGFyLm1lcmdlXG4qIEBtb2R1bGUgbmdcbiogQGtpbmQgZnVuY3Rpb25cbipcbiogQGRlc2NyaXB0aW9uXG4qIERlZXBseSBleHRlbmRzIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgYGRzdGAgYnkgY29weWluZyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGBzcmNgIG9iamVjdChzKVxuKiB0byBgZHN0YC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGBzcmNgIG9iamVjdHMuIElmIHlvdSB3YW50IHRvIHByZXNlcnZlIG9yaWdpbmFsIG9iamVjdHMsIHlvdSBjYW4gZG8gc29cbiogYnkgcGFzc2luZyBhbiBlbXB0eSBvYmplY3QgYXMgdGhlIHRhcmdldDogYHZhciBvYmplY3QgPSBhbmd1bGFyLm1lcmdlKHt9LCBvYmplY3QxLCBvYmplY3QyKWAuXG4qXG4qIFVubGlrZSB7QGxpbmsgYW5ndWxhci5leHRlbmQgZXh0ZW5kKCl9LCBgbWVyZ2UoKWAgcmVjdXJzaXZlbHkgZGVzY2VuZHMgaW50byBvYmplY3QgcHJvcGVydGllcyBvZiBzb3VyY2Vcbiogb2JqZWN0cywgcGVyZm9ybWluZyBhIGRlZXAgY29weS5cbipcbiogQHBhcmFtIHtPYmplY3R9IGRzdCBEZXN0aW5hdGlvbiBvYmplY3QuXG4qIEBwYXJhbSB7Li4uT2JqZWN0fSBzcmMgU291cmNlIG9iamVjdChzKS5cbiogQHJldHVybnMge09iamVjdH0gUmVmZXJlbmNlIHRvIGBkc3RgLlxuKi9cbmZ1bmN0aW9uIG1lcmdlKGRzdCkge1xuICByZXR1cm4gYmFzZUV4dGVuZChkc3QsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgdHJ1ZSk7XG59XG5cblxuXG5mdW5jdGlvbiB0b0ludChzdHIpIHtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ciwgMTApO1xufVxuXG52YXIgaXNOdW1iZXJOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOdW1iZXJOYU4obnVtKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIG51bSAhPT0gbnVtO1xufTtcblxuXG5mdW5jdGlvbiBpbmhlcml0KHBhcmVudCwgZXh0cmEpIHtcbiAgcmV0dXJuIGV4dGVuZChPYmplY3QuY3JlYXRlKHBhcmVudCksIGV4dHJhKTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIubm9vcFxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb25zLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiB3cml0aW5nIGNvZGUgaW4gdGhlXG4gKiBmdW5jdGlvbmFsIHN0eWxlLlxuICAgYGBganNcbiAgICAgZnVuY3Rpb24gZm9vKGNhbGxiYWNrKSB7XG4gICAgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0ZVJlc3VsdCgpO1xuICAgICAgIChjYWxsYmFjayB8fCBhbmd1bGFyLm5vb3ApKHJlc3VsdCk7XG4gICAgIH1cbiAgIGBgYFxuICovXG5mdW5jdGlvbiBub29wKCkge31cbm5vb3AuJGluamVjdCA9IFtdO1xuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlkZW50aXR5XG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXRzIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHdyaXRpbmcgY29kZSBpbiB0aGVcbiAqIGZ1bmN0aW9uYWwgc3R5bGUuXG4gKlxuICAgYGBganNcbiAgIGZ1bmN0aW9uIHRyYW5zZm9ybWVyKHRyYW5zZm9ybWF0aW9uRm4sIHZhbHVlKSB7XG4gICAgIHJldHVybiAodHJhbnNmb3JtYXRpb25GbiB8fCBhbmd1bGFyLmlkZW50aXR5KSh2YWx1ZSk7XG4gICB9O1xuXG4gICAvLyBFLmcuXG4gICBmdW5jdGlvbiBnZXRSZXN1bHQoZm4sIGlucHV0KSB7XG4gICAgIHJldHVybiAoZm4gfHwgYW5ndWxhci5pZGVudGl0eSkoaW5wdXQpO1xuICAgfTtcblxuICAgZ2V0UmVzdWx0KGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiAyOyB9LCAyMSk7ICAgLy8gcmV0dXJucyA0MlxuICAgZ2V0UmVzdWx0KG51bGwsIDIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyAyMVxuICAgZ2V0UmVzdWx0KHVuZGVmaW5lZCwgMjEpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyAyMVxuICAgYGBgXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgcGFzc2VkIGluLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eSgkKSB7cmV0dXJuICQ7fVxuaWRlbnRpdHkuJGluamVjdCA9IFtdO1xuXG5cbmZ1bmN0aW9uIHZhbHVlRm4odmFsdWUpIHtyZXR1cm4gZnVuY3Rpb24gdmFsdWVSZWYoKSB7cmV0dXJuIHZhbHVlO307fVxuXG5mdW5jdGlvbiBoYXNDdXN0b21Ub1N0cmluZyhvYmopIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqLnRvU3RyaW5nKSAmJiBvYmoudG9TdHJpbmcgIT09IHRvU3RyaW5nO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlzVW5kZWZpbmVkXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIHVuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJzt9XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNEZWZpbmVkXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBkZWZpbmVkLlxuICovXG5mdW5jdGlvbiBpc0RlZmluZWQodmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJzt9XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNPYmplY3RcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGFuIGBPYmplY3RgLiBVbmxpa2UgYHR5cGVvZmAgaW4gSmF2YVNjcmlwdCwgYG51bGxgcyBhcmUgbm90XG4gKiBjb25zaWRlcmVkIHRvIGJlIG9iamVjdHMuIE5vdGUgdGhhdCBKYXZhU2NyaXB0IGFycmF5cyBhcmUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYW4gYE9iamVjdGAgYnV0IG5vdCBgbnVsbGAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2lzb2JqZWN0NFxuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGEgbnVsbCBwcm90b3R5cGVcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBPYmplY3RgIHdpdGggYSBudWxsIHByb3RvdHlwZVxuICovXG5mdW5jdGlvbiBpc0JsYW5rT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFnZXRQcm90b3R5cGVPZih2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNTdHJpbmdcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGEgYFN0cmluZ2AuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGEgYFN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7fVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlzTnVtYmVyXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIGBOdW1iZXJgLlxuICpcbiAqIFRoaXMgaW5jbHVkZXMgdGhlIFwic3BlY2lhbFwiIG51bWJlcnMgYE5hTmAsIGArSW5maW5pdHlgIGFuZCBgLUluZmluaXR5YC5cbiAqXG4gKiBJZiB5b3Ugd2lzaCB0byBleGNsdWRlIHRoZXNlIHRoZW4geW91IGNhbiB1c2UgdGhlIG5hdGl2ZVxuICogW2Bpc0Zpbml0ZSddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2lzRmluaXRlKVxuICogbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBOdW1iZXJgLlxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge3JldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO31cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5pc0RhdGVcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgaXMgYSBkYXRlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBEYXRlYC5cbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmlzQXJyYXlcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIGEgcmVmZXJlbmNlIGlzIGFuIGBBcnJheWAuIEFsaWFzIG9mIEFycmF5LmlzQXJyYXkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBSZWZlcmVuY2UgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGBBcnJheWAuXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNGdW5jdGlvblxuICogQG1vZHVsZSBuZ1xuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERldGVybWluZXMgaWYgYSByZWZlcmVuY2UgaXMgYSBgRnVuY3Rpb25gLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBGdW5jdGlvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO31cblxuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSB2YWx1ZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgUmVmZXJlbmNlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBpcyBhIGBSZWdFeHBgLlxuICovXG5mdW5jdGlvbiBpc1JlZ0V4cCh2YWx1ZSkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5cbi8qKlxuICogQ2hlY2tzIGlmIGBvYmpgIGlzIGEgd2luZG93IG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBvYmogT2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqYCBpcyBhIHdpbmRvdyBvYmouXG4gKi9cbmZ1bmN0aW9uIGlzV2luZG93KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajtcbn1cblxuXG5mdW5jdGlvbiBpc1Njb3BlKG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai4kZXZhbEFzeW5jICYmIG9iai4kd2F0Y2g7XG59XG5cblxuZnVuY3Rpb24gaXNGaWxlKG9iaikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBGaWxlXSc7XG59XG5cblxuZnVuY3Rpb24gaXNGb3JtRGF0YShvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJztcbn1cblxuXG5mdW5jdGlvbiBpc0Jsb2Iob2JqKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2Uob2JqKSB7XG4gIHJldHVybiBvYmogJiYgaXNGdW5jdGlvbihvYmoudGhlbik7XG59XG5cblxudmFyIFRZUEVEX0FSUkFZX1JFR0VYUCA9IC9eXFxbb2JqZWN0ICg/OlVpbnQ4fFVpbnQ4Q2xhbXBlZHxVaW50MTZ8VWludDMyfEludDh8SW50MTZ8SW50MzJ8RmxvYXQzMnxGbG9hdDY0KUFycmF5XSQvO1xuZnVuY3Rpb24gaXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiBpc051bWJlcih2YWx1ZS5sZW5ndGgpICYmIFRZUEVEX0FSUkFZX1JFR0VYUC50ZXN0KHRvU3RyaW5nLmNhbGwodmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcihvYmopIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuXG52YXIgdHJpbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZS50cmltKCkgOiB2YWx1ZTtcbn07XG5cbi8vIENvcGllZCBmcm9tOlxuLy8gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9sb2NhbF9jbG9zdXJlX2dvb2dfc3RyaW5nX3N0cmluZy5qcy5zb3VyY2UuaHRtbCNsaW5lMTAyMVxuLy8gUHJlcmVxOiBzIGlzIGEgc3RyaW5nLlxudmFyIGVzY2FwZUZvclJlZ2V4cCA9IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvKFstKClbXFxde30rPyouJF58LDojPCFcXFxcXSkvZywgJ1xcXFwkMScpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICAucmVwbGFjZSgvXFx4MDgvZywgJ1xcXFx4MDgnKTtcbn07XG5cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIuaXNFbGVtZW50XG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGV0ZXJtaW5lcyBpZiBhIHJlZmVyZW5jZSBpcyBhIERPTSBlbGVtZW50IChvciB3cmFwcGVkIGpRdWVyeSBlbGVtZW50KS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFJlZmVyZW5jZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCAob3Igd3JhcHBlZCBqUXVlcnkgZWxlbWVudCkuXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmXG4gICAgKG5vZGUubm9kZU5hbWUgIC8vIFdlIGFyZSBhIGRpcmVjdCBlbGVtZW50LlxuICAgIHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZCkpKTsgIC8vIFdlIGhhdmUgYW4gb24gYW5kIGZpbmQgbWV0aG9kIHBhcnQgb2YgalF1ZXJ5IEFQSS5cbn1cblxuLyoqXG4gKiBAcGFyYW0gc3RyICdrZXkxLGtleTIsLi4uJ1xuICogQHJldHVybnMge29iamVjdH0gaW4gdGhlIGZvcm0gb2Yge2tleTE6dHJ1ZSwga2V5Mjp0cnVlLCAuLi59XG4gKi9cbmZ1bmN0aW9uIG1ha2VNYXAoc3RyKSB7XG4gIHZhciBvYmogPSB7fSwgaXRlbXMgPSBzdHIuc3BsaXQoJywnKSwgaTtcbiAgZm9yIChpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgb2JqW2l0ZW1zW2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuXG5mdW5jdGlvbiBub2RlTmFtZV8oZWxlbWVudCkge1xuICByZXR1cm4gbG93ZXJjYXNlKGVsZW1lbnQubm9kZU5hbWUgfHwgKGVsZW1lbnRbMF0gJiYgZWxlbWVudFswXS5ub2RlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlcyhhcnJheSwgb2JqKSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBvYmopICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gYXJyYXlSZW1vdmUoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBpbmRleCA9IGFycmF5LmluZGV4T2YodmFsdWUpO1xuICBpZiAoaW5kZXggPj0gMCkge1xuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5jb3B5XG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBgc291cmNlYCwgd2hpY2ggc2hvdWxkIGJlIGFuIG9iamVjdCBvciBhbiBhcnJheS5cbiAqXG4gKiAqIElmIG5vIGRlc3RpbmF0aW9uIGlzIHN1cHBsaWVkLCBhIGNvcHkgb2YgdGhlIG9iamVjdCBvciBhcnJheSBpcyBjcmVhdGVkLlxuICogKiBJZiBhIGRlc3RpbmF0aW9uIGlzIHByb3ZpZGVkLCBhbGwgb2YgaXRzIGVsZW1lbnRzIChmb3IgYXJyYXlzKSBvciBwcm9wZXJ0aWVzIChmb3Igb2JqZWN0cylcbiAqICAgYXJlIGRlbGV0ZWQgYW5kIHRoZW4gYWxsIGVsZW1lbnRzL3Byb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIGFyZSBjb3BpZWQgdG8gaXQuXG4gKiAqIElmIGBzb3VyY2VgIGlzIG5vdCBhbiBvYmplY3Qgb3IgYXJyYXkgKGluYy4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCksIGBzb3VyY2VgIGlzIHJldHVybmVkLlxuICogKiBJZiBgc291cmNlYCBpcyBpZGVudGljYWwgdG8gYGRlc3RpbmF0aW9uYCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG4gKlxuICogPGJyIC8+XG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogICBPbmx5IGVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgdGFrZW4gaW50byBhY2NvdW50LiBOb24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIChib3RoIG9uIGBzb3VyY2VgXG4gKiAgIGFuZCBvbiBgZGVzdGluYXRpb25gKSB3aWxsIGJlIGlnbm9yZWQuXG4gKiA8L2Rpdj5cbiAqXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBUaGUgc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1ha2UgYSBjb3B5LlxuICogICAgICAgICAgICAgICAgICAgQ2FuIGJlIGFueSB0eXBlLCBpbmNsdWRpbmcgcHJpbWl0aXZlcywgYG51bGxgLCBhbmQgYHVuZGVmaW5lZGAuXG4gKiBAcGFyYW0geyhPYmplY3R8QXJyYXkpPX0gZGVzdGluYXRpb24gRGVzdGluYXRpb24gaW50byB3aGljaCB0aGUgc291cmNlIGlzIGNvcGllZC4gSWZcbiAqICAgICBwcm92aWRlZCwgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIGBzb3VyY2VgLlxuICogQHJldHVybnMgeyp9IFRoZSBjb3B5IG9yIHVwZGF0ZWQgYGRlc3RpbmF0aW9uYCwgaWYgYGRlc3RpbmF0aW9uYCB3YXMgc3BlY2lmaWVkLlxuICpcbiAqIEBleGFtcGxlXG4gIDxleGFtcGxlIG1vZHVsZT1cImNvcHlFeGFtcGxlXCIgbmFtZT1cImFuZ3VsYXItY29weVwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIGNsYXNzPVwic2ltcGxlLWZvcm1cIj5cbiAgICAgICAgICA8bGFiZWw+TmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJ1c2VyLm5hbWVcIiAvPjwvbGFiZWw+PGJyIC8+XG4gICAgICAgICAgPGxhYmVsPkFnZTogIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmctbW9kZWw9XCJ1c2VyLmFnZVwiIC8+PC9sYWJlbD48YnIgLz5cbiAgICAgICAgICBHZW5kZXI6IDxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmctbW9kZWw9XCJ1c2VyLmdlbmRlclwiIHZhbHVlPVwibWFsZVwiIC8+bWFsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5nLW1vZGVsPVwidXNlci5nZW5kZXJcIiB2YWx1ZT1cImZlbWFsZVwiIC8+ZmVtYWxlPC9sYWJlbD48YnIgLz5cbiAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwicmVzZXQoKVwiPlJFU0VUPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInVwZGF0ZSh1c2VyKVwiPlNBVkU8L2J1dHRvbj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8cHJlPmZvcm0gPSB7e3VzZXIgfCBqc29ufX08L3ByZT5cbiAgICAgICAgPHByZT5tYXN0ZXIgPSB7e21hc3RlciB8IGpzb259fTwvcHJlPlxuICAgICAgPC9kaXY+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgIC8vIE1vZHVsZTogY29weUV4YW1wbGVcbiAgICAgIGFuZ3VsYXIuXG4gICAgICAgIG1vZHVsZSgnY29weUV4YW1wbGUnLCBbXSkuXG4gICAgICAgIGNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAkc2NvcGUubWFzdGVyID0ge307XG5cbiAgICAgICAgICAkc2NvcGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIEV4YW1wbGUgd2l0aCAxIGFyZ3VtZW50XG4gICAgICAgICAgICAkc2NvcGUudXNlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUubWFzdGVyKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgJHNjb3BlLnVwZGF0ZSA9IGZ1bmN0aW9uKHVzZXIpIHtcbiAgICAgICAgICAgIC8vIEV4YW1wbGUgd2l0aCAyIGFyZ3VtZW50c1xuICAgICAgICAgICAgYW5ndWxhci5jb3B5KHVzZXIsICRzY29wZS5tYXN0ZXIpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAkc2NvcGUucmVzZXQoKTtcbiAgICAgICAgfV0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiBjb3B5KHNvdXJjZSwgZGVzdGluYXRpb24pIHtcbiAgdmFyIHN0YWNrU291cmNlID0gW107XG4gIHZhciBzdGFja0Rlc3QgPSBbXTtcblxuICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICBpZiAoaXNUeXBlZEFycmF5KGRlc3RpbmF0aW9uKSB8fCBpc0FycmF5QnVmZmVyKGRlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmdNaW5FcnIoJ2NwdGEnLCAnQ2FuXFwndCBjb3B5ISBUeXBlZEFycmF5IGRlc3RpbmF0aW9uIGNhbm5vdCBiZSBtdXRhdGVkLicpO1xuICAgIH1cbiAgICBpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikge1xuICAgICAgdGhyb3cgbmdNaW5FcnIoJ2NwaScsICdDYW5cXCd0IGNvcHkhIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbC4nKTtcbiAgICB9XG5cbiAgICAvLyBFbXB0eSB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG4gICAgaWYgKGlzQXJyYXkoZGVzdGluYXRpb24pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JFYWNoKGRlc3RpbmF0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChrZXkgIT09ICckJGhhc2hLZXknKSB7XG4gICAgICAgICAgZGVsZXRlIGRlc3RpbmF0aW9uW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YWNrU291cmNlLnB1c2goc291cmNlKTtcbiAgICBzdGFja0Rlc3QucHVzaChkZXN0aW5hdGlvbik7XG4gICAgcmV0dXJuIGNvcHlSZWN1cnNlKHNvdXJjZSwgZGVzdGluYXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHlFbGVtZW50KHNvdXJjZSk7XG5cbiAgZnVuY3Rpb24gY29weVJlY3Vyc2Uoc291cmNlLCBkZXN0aW5hdGlvbikge1xuICAgIHZhciBoID0gZGVzdGluYXRpb24uJCRoYXNoS2V5O1xuICAgIHZhciBrZXk7XG4gICAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc291cmNlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgZGVzdGluYXRpb24ucHVzaChjb3B5RWxlbWVudChzb3VyY2VbaV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3Qoc291cmNlKSkge1xuICAgICAgLy8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG4gICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KHNvdXJjZVtrZXldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNvdXJjZSAmJiB0eXBlb2Ygc291cmNlLmhhc093blByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBTbG93IHBhdGgsIHdoaWNoIG11c3QgcmVseSBvbiBoYXNPd25Qcm9wZXJ0eVxuICAgICAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjb3B5RWxlbWVudChzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2xvd2VzdCBwYXRoIC0tLSBoYXNPd25Qcm9wZXJ0eSBjYW4ndCBiZSBjYWxsZWQgYXMgYSBtZXRob2RcbiAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICBkZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldEhhc2hLZXkoZGVzdGluYXRpb24sIGgpO1xuICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlFbGVtZW50KHNvdXJjZSkge1xuICAgIC8vIFNpbXBsZSB2YWx1ZXNcbiAgICBpZiAoIWlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBjb3BpZWQgdmFsdWVzXG4gICAgdmFyIGluZGV4ID0gc3RhY2tTb3VyY2UuaW5kZXhPZihzb3VyY2UpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBzdGFja0Rlc3RbaW5kZXhdO1xuICAgIH1cblxuICAgIGlmIChpc1dpbmRvdyhzb3VyY2UpIHx8IGlzU2NvcGUoc291cmNlKSkge1xuICAgICAgdGhyb3cgbmdNaW5FcnIoJ2Nwd3MnLFxuICAgICAgICAnQ2FuXFwndCBjb3B5ISBNYWtpbmcgY29waWVzIG9mIFdpbmRvdyBvciBTY29wZSBpbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZWN1cnNlID0gZmFsc2U7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gY29weVR5cGUoc291cmNlKTtcblxuICAgIGlmIChkZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbiA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDogT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIG5lZWRzUmVjdXJzZSA9IHRydWU7XG4gICAgfVxuXG4gICAgc3RhY2tTb3VyY2UucHVzaChzb3VyY2UpO1xuICAgIHN0YWNrRGVzdC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuICAgIHJldHVybiBuZWVkc1JlY3Vyc2VcbiAgICAgID8gY29weVJlY3Vyc2Uoc291cmNlLCBkZXN0aW5hdGlvbilcbiAgICAgIDogZGVzdGluYXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBjb3B5VHlwZShzb3VyY2UpIHtcbiAgICBzd2l0Y2ggKHRvU3RyaW5nLmNhbGwoc291cmNlKSkge1xuICAgICAgY2FzZSAnW29iamVjdCBJbnQ4QXJyYXldJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgSW50MTZBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBJbnQzMkFycmF5XSc6XG4gICAgICBjYXNlICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBGbG9hdDY0QXJyYXldJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgVWludDhBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBVaW50MTZBcnJheV0nOlxuICAgICAgY2FzZSAnW29iamVjdCBVaW50MzJBcnJheV0nOlxuICAgICAgICByZXR1cm4gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihjb3B5RWxlbWVudChzb3VyY2UuYnVmZmVyKSwgc291cmNlLmJ5dGVPZmZzZXQsIHNvdXJjZS5sZW5ndGgpO1xuXG4gICAgICBjYXNlICdbb2JqZWN0IEFycmF5QnVmZmVyXSc6XG4gICAgICAgIC8vIFN1cHBvcnQ6IElFMTBcbiAgICAgICAgaWYgKCFzb3VyY2Uuc2xpY2UpIHtcbiAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiB0aGlzIGNhc2Ugd2Uga25vdyB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgQXJyYXlCdWZmZXJcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICAgIHZhciBjb3BpZWQgPSBuZXcgQXJyYXlCdWZmZXIoc291cmNlLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgIG5ldyBVaW50OEFycmF5KGNvcGllZCkuc2V0KG5ldyBVaW50OEFycmF5KHNvdXJjZSkpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICAgICAgICByZXR1cm4gY29waWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoMCk7XG5cbiAgICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgICAgcmV0dXJuIG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLnZhbHVlT2YoKSk7XG5cbiAgICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLnRvU3RyaW5nKCkubWF0Y2goL1teL10qJC8pWzBdKTtcbiAgICAgICAgcmUubGFzdEluZGV4ID0gc291cmNlLmxhc3RJbmRleDtcbiAgICAgICAgcmV0dXJuIHJlO1xuXG4gICAgICBjYXNlICdbb2JqZWN0IEJsb2JdJzpcbiAgICAgICAgcmV0dXJuIG5ldyBzb3VyY2UuY29uc3RydWN0b3IoW3NvdXJjZV0sIHt0eXBlOiBzb3VyY2UudHlwZX0pO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKHNvdXJjZS5jbG9uZU5vZGUpKSB7XG4gICAgICByZXR1cm4gc291cmNlLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5lcXVhbHNcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZXRlcm1pbmVzIGlmIHR3byBvYmplY3RzIG9yIHR3byB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQuIFN1cHBvcnRzIHZhbHVlIHR5cGVzLCByZWd1bGFyXG4gKiBleHByZXNzaW9ucywgYXJyYXlzIGFuZCBvYmplY3RzLlxuICpcbiAqIFR3byBvYmplY3RzIG9yIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gKlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIHBhc3MgYD09PWAgY29tcGFyaXNvbi5cbiAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYXJlIGVxdWFsIGJ5XG4gKiAgIGNvbXBhcmluZyB0aGVtIHdpdGggYGFuZ3VsYXIuZXF1YWxzYC5cbiAqICogQm90aCB2YWx1ZXMgYXJlIE5hTi4gKEluIEphdmFTY3JpcHQsIE5hTiA9PSBOYU4gPT4gZmFsc2UuIEJ1dCB3ZSBjb25zaWRlciB0d28gTmFOIGFzIGVxdWFsKVxuICogKiBCb3RoIHZhbHVlcyByZXByZXNlbnQgdGhlIHNhbWUgcmVndWxhciBleHByZXNzaW9uIChJbiBKYXZhU2NyaXB0LFxuICogICAvYWJjLyA9PSAvYWJjLyA9PiBmYWxzZS4gQnV0IHdlIGNvbnNpZGVyIHR3byByZWd1bGFyIGV4cHJlc3Npb25zIGFzIGVxdWFsIHdoZW4gdGhlaXIgdGV4dHVhbFxuICogICByZXByZXNlbnRhdGlvbiBtYXRjaGVzKS5cbiAqXG4gKiBEdXJpbmcgYSBwcm9wZXJ0eSBjb21wYXJpc29uLCBwcm9wZXJ0aWVzIG9mIGBmdW5jdGlvbmAgdHlwZSBhbmQgcHJvcGVydGllcyB3aXRoIG5hbWVzXG4gKiB0aGF0IGJlZ2luIHdpdGggYCRgIGFyZSBpZ25vcmVkLlxuICpcbiAqIFNjb3BlIGFuZCBET01XaW5kb3cgb2JqZWN0cyBhcmUgYmVpbmcgY29tcGFyZWQgb25seSBieSBpZGVudGlmeSAoYD09PWApLlxuICpcbiAqIEBwYXJhbSB7Kn0gbzEgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG8yIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYXJndW1lbnRzIGFyZSBlcXVhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwiZXF1YWxzRXhhbXBsZVwiIG5hbWU9XCJlcXVhbHNFeGFtcGxlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlPlxuICAgICAgICAgIDxoMz5Vc2VyIDE8L2gzPlxuICAgICAgICAgIE5hbWU6IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwidXNlcjEubmFtZVwiPlxuICAgICAgICAgIEFnZTogPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cInVzZXIxLmFnZVwiPlxuXG4gICAgICAgICAgPGgzPlVzZXIgMjwvaDM+XG4gICAgICAgICAgTmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJ1c2VyMi5uYW1lXCI+XG4gICAgICAgICAgQWdlOiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwidXNlcjIuYWdlXCI+XG5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGJyLz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJDb21wYXJlXCIgbmctY2xpY2s9XCJjb21wYXJlKClcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBVc2VyIDE6IDxwcmU+e3t1c2VyMSB8IGpzb259fTwvcHJlPlxuICAgICAgICAgIFVzZXIgMjogPHByZT57e3VzZXIyIHwganNvbn19PC9wcmU+XG4gICAgICAgICAgRXF1YWw6IDxwcmU+e3tyZXN1bHR9fTwvcHJlPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgICBhbmd1bGFyLm1vZHVsZSgnZXF1YWxzRXhhbXBsZScsIFtdKS5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLnVzZXIxID0ge307XG4gICAgICAgICAgJHNjb3BlLnVzZXIyID0ge307XG4gICAgICAgICAgJHNjb3BlLmNvbXBhcmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICRzY29wZS5yZXN1bHQgPSBhbmd1bGFyLmVxdWFscygkc2NvcGUudXNlcjEsICRzY29wZS51c2VyMik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfV0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiBlcXVhbHMobzEsIG8yKSB7XG4gIGlmIChvMSA9PT0gbzIpIHJldHVybiB0cnVlO1xuICBpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikgcmV0dXJuIHRydWU7IC8vIE5hTiA9PT0gTmFOXG4gIHZhciB0MSA9IHR5cGVvZiBvMSwgdDIgPSB0eXBlb2YgbzIsIGxlbmd0aCwga2V5LCBrZXlTZXQ7XG4gIGlmICh0MSA9PT0gdDIgJiYgdDEgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGlzQXJyYXkobzEpKSB7XG4gICAgICBpZiAoIWlzQXJyYXkobzIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoKGxlbmd0aCA9IG8xLmxlbmd0aCkgPT09IG8yLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcbiAgICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEYXRlKG8xKSkge1xuICAgICAgaWYgKCFpc0RhdGUobzIpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZXF1YWxzKG8xLmdldFRpbWUoKSwgbzIuZ2V0VGltZSgpKTtcbiAgICB9IGVsc2UgaWYgKGlzUmVnRXhwKG8xKSkge1xuICAgICAgaWYgKCFpc1JlZ0V4cChvMikpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBvMS50b1N0cmluZygpID09PSBvMi50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNTY29wZShvMSkgfHwgaXNTY29wZShvMikgfHwgaXNXaW5kb3cobzEpIHx8IGlzV2luZG93KG8yKSB8fFxuICAgICAgICBpc0FycmF5KG8yKSB8fCBpc0RhdGUobzIpIHx8IGlzUmVnRXhwKG8yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAga2V5U2V0ID0gY3JlYXRlTWFwKCk7XG4gICAgICBmb3IgKGtleSBpbiBvMSkge1xuICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSA9PT0gJyQnIHx8IGlzRnVuY3Rpb24obzFba2V5XSkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICBpZiAoIShrZXkgaW4ga2V5U2V0KSAmJlxuICAgICAgICAgICAga2V5LmNoYXJBdCgwKSAhPT0gJyQnICYmXG4gICAgICAgICAgICBpc0RlZmluZWQobzJba2V5XSkgJiZcbiAgICAgICAgICAgICFpc0Z1bmN0aW9uKG8yW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgY3NwID0gZnVuY3Rpb24oKSB7XG4gIGlmICghaXNEZWZpbmVkKGNzcC5ydWxlcykpIHtcblxuXG4gICAgdmFyIG5nQ3NwRWxlbWVudCA9ICh3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25nLWNzcF0nKSB8fFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbmctY3NwXScpKTtcblxuICAgIGlmIChuZ0NzcEVsZW1lbnQpIHtcbiAgICAgIHZhciBuZ0NzcEF0dHJpYnV0ZSA9IG5nQ3NwRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25nLWNzcCcpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5nQ3NwRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmctY3NwJyk7XG4gICAgICBjc3AucnVsZXMgPSB7XG4gICAgICAgIG5vVW5zYWZlRXZhbDogIW5nQ3NwQXR0cmlidXRlIHx8IChuZ0NzcEF0dHJpYnV0ZS5pbmRleE9mKCduby11bnNhZmUtZXZhbCcpICE9PSAtMSksXG4gICAgICAgIG5vSW5saW5lU3R5bGU6ICFuZ0NzcEF0dHJpYnV0ZSB8fCAobmdDc3BBdHRyaWJ1dGUuaW5kZXhPZignbm8taW5saW5lLXN0eWxlJykgIT09IC0xKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3NwLnJ1bGVzID0ge1xuICAgICAgICBub1Vuc2FmZUV2YWw6IG5vVW5zYWZlRXZhbCgpLFxuICAgICAgICBub0lubGluZVN0eWxlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3NwLnJ1bGVzO1xuXG4gIGZ1bmN0aW9uIG5vVW5zYWZlRXZhbCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldywgbm8tbmV3LWZ1bmNcbiAgICAgIG5ldyBGdW5jdGlvbignJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBtb2R1bGUgbmdcbiAqIEBuYW1lIG5nSnFcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdKcSB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBhdmFpbGFibGUgdW5kZXIgYHdpbmRvd2BcbiAqIHRvIGJlIHVzZWQgZm9yIGFuZ3VsYXIuZWxlbWVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgdGhpcyBkaXJlY3RpdmUgdG8gZm9yY2UgdGhlIGFuZ3VsYXIuZWxlbWVudCBsaWJyYXJ5LiAgVGhpcyBzaG91bGQgYmVcbiAqIHVzZWQgdG8gZm9yY2UgZWl0aGVyIGpxTGl0ZSBieSBsZWF2aW5nIG5nLWpxIGJsYW5rIG9yIHNldHRpbmcgdGhlIG5hbWUgb2ZcbiAqIHRoZSBqcXVlcnkgdmFyaWFibGUgdW5kZXIgd2luZG93IChlZy4galF1ZXJ5KS5cbiAqXG4gKiBTaW5jZSBhbmd1bGFyIGxvb2tzIGZvciB0aGlzIGRpcmVjdGl2ZSB3aGVuIGl0IGlzIGxvYWRlZCAoZG9lc24ndCB3YWl0IGZvciB0aGVcbiAqIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQpLCBpdCBtdXN0IGJlIHBsYWNlZCBvbiBhbiBlbGVtZW50IHRoYXQgY29tZXMgYmVmb3JlIHRoZSBzY3JpcHRcbiAqIHdoaWNoIGxvYWRzIGFuZ3VsYXIuIEFsc28sIG9ubHkgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGBuZy1qcWAgd2lsbCBiZSB1c2VkIGFuZCBhbGxcbiAqIG90aGVycyBpZ25vcmVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGZvcmNlIGpxTGl0ZSB1c2luZyB0aGUgYG5nSnFgIGRpcmVjdGl2ZSB0byB0aGUgYGh0bWxgIHRhZy5cbiBgYGBodG1sXG4gPCFkb2N0eXBlIGh0bWw+XG4gPGh0bWwgbmctYXBwIG5nLWpxPlxuIC4uLlxuIC4uLlxuIDwvaHRtbD5cbiBgYGBcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGpRdWVyeSBiYXNlZCBsaWJyYXJ5IG9mIGEgZGlmZmVyZW50IG5hbWUuXG4gKiBUaGUgbGlicmFyeSBuYW1lIG11c3QgYmUgYXZhaWxhYmxlIGF0IHRoZSB0b3AgbW9zdCAnd2luZG93Jy5cbiBgYGBodG1sXG4gPCFkb2N0eXBlIGh0bWw+XG4gPGh0bWwgbmctYXBwIG5nLWpxPVwialF1ZXJ5TGliXCI+XG4gLi4uXG4gLi4uXG4gPC9odG1sPlxuIGBgYFxuICovXG52YXIganEgPSBmdW5jdGlvbigpIHtcbiAgaWYgKGlzRGVmaW5lZChqcS5uYW1lXykpIHJldHVybiBqcS5uYW1lXztcbiAgdmFyIGVsO1xuICB2YXIgaSwgaWkgPSBuZ0F0dHJQcmVmaXhlcy5sZW5ndGgsIHByZWZpeCwgbmFtZTtcbiAgZm9yIChpID0gMDsgaSA8IGlpOyArK2kpIHtcbiAgICBwcmVmaXggPSBuZ0F0dHJQcmVmaXhlc1tpXTtcbiAgICBlbCA9IHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbJyArIHByZWZpeC5yZXBsYWNlKCc6JywgJ1xcXFw6JykgKyAnanFdJyk7XG4gICAgaWYgKGVsKSB7XG4gICAgICBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKHByZWZpeCArICdqcScpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChqcS5uYW1lXyA9IG5hbWUpO1xufTtcblxuZnVuY3Rpb24gY29uY2F0KGFycmF5MSwgYXJyYXkyLCBpbmRleCkge1xuICByZXR1cm4gYXJyYXkxLmNvbmNhdChzbGljZS5jYWxsKGFycmF5MiwgaW5kZXgpKTtcbn1cblxuZnVuY3Rpb24gc2xpY2VBcmdzKGFyZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgcmV0dXJuIHNsaWNlLmNhbGwoYXJncywgc3RhcnRJbmRleCB8fCAwKTtcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5iaW5kXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIGZ1bmN0aW9uIGBmbmAgYm91bmQgdG8gYHNlbGZgIChgc2VsZmAgYmVjb21lcyB0aGUgYHRoaXNgIGZvclxuICogYGZuYCkuIFlvdSBjYW4gc3VwcGx5IG9wdGlvbmFsIGBhcmdzYCB0aGF0IGFyZSBwcmVib3VuZCB0byB0aGUgZnVuY3Rpb24uIFRoaXMgZmVhdHVyZSBpcyBhbHNvXG4gKiBrbm93biBhcyBbcGFydGlhbCBhcHBsaWNhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJ0aWFsX2FwcGxpY2F0aW9uKSwgYXNcbiAqIGRpc3Rpbmd1aXNoZWQgZnJvbSBbZnVuY3Rpb24gY3VycnlpbmddKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3VycnlpbmcjQ29udHJhc3Rfd2l0aF9wYXJ0aWFsX2Z1bmN0aW9uX2FwcGxpY2F0aW9uKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBDb250ZXh0IHdoaWNoIGBmbmAgc2hvdWxkIGJlIGV2YWx1YXRlZCBpbi5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gZm4gRnVuY3Rpb24gdG8gYmUgYm91bmQuXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHByZWJvdW5kIHRvIHRoZSBgZm5gIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gRnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgYGZuYCB3aXRoIGFsbCB0aGUgc3BlY2lmaWVkIGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiBiaW5kKHNlbGYsIGZuKSB7XG4gIHZhciBjdXJyeUFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IHNsaWNlQXJncyhhcmd1bWVudHMsIDIpIDogW107XG4gIGlmIChpc0Z1bmN0aW9uKGZuKSAmJiAhKGZuIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgIHJldHVybiBjdXJyeUFyZ3MubGVuZ3RoXG4gICAgICA/IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICAgICA/IGZuLmFwcGx5KHNlbGYsIGNvbmNhdChjdXJyeUFyZ3MsIGFyZ3VtZW50cywgMCkpXG4gICAgICAgICAgICA6IGZuLmFwcGx5KHNlbGYsIGN1cnJ5QXJncyk7XG4gICAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICAgICAgID8gZm4uYXBwbHkoc2VsZiwgYXJndW1lbnRzKVxuICAgICAgICAgICAgOiBmbi5jYWxsKHNlbGYpO1xuICAgICAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIEluIElFLCBuYXRpdmUgbWV0aG9kcyBhcmUgbm90IGZ1bmN0aW9ucyBzbyB0aGV5IGNhbm5vdCBiZSBib3VuZCAobm90ZTogdGhleSBkb24ndCBuZWVkIHRvIGJlKS5cbiAgICByZXR1cm4gZm47XG4gIH1cbn1cblxuXG5mdW5jdGlvbiB0b0pzb25SZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gIHZhciB2YWwgPSB2YWx1ZTtcblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5LmNoYXJBdCgwKSA9PT0gJyQnICYmIGtleS5jaGFyQXQoMSkgPT09ICckJykge1xuICAgIHZhbCA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChpc1dpbmRvdyh2YWx1ZSkpIHtcbiAgICB2YWwgPSAnJFdJTkRPVyc7XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgIHdpbmRvdy5kb2N1bWVudCA9PT0gdmFsdWUpIHtcbiAgICB2YWwgPSAnJERPQ1VNRU5UJztcbiAgfSBlbHNlIGlmIChpc1Njb3BlKHZhbHVlKSkge1xuICAgIHZhbCA9ICckU0NPUEUnO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci50b0pzb25cbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXJpYWxpemVzIGlucHV0IGludG8gYSBKU09OLWZvcm1hdHRlZCBzdHJpbmcuIFByb3BlcnRpZXMgd2l0aCBsZWFkaW5nICQkIGNoYXJhY3RlcnMgd2lsbCBiZVxuICogc3RyaXBwZWQgc2luY2UgYW5ndWxhciB1c2VzIHRoaXMgbm90YXRpb24gaW50ZXJuYWxseS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxEYXRlfHN0cmluZ3xudW1iZXJ8Ym9vbGVhbn0gb2JqIElucHV0IHRvIGJlIHNlcmlhbGl6ZWQgaW50byBKU09OLlxuICogQHBhcmFtIHtib29sZWFufG51bWJlcn0gW3ByZXR0eT0yXSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIEpTT04gb3V0cHV0IHdpbGwgY29udGFpbiBuZXdsaW5lcyBhbmQgd2hpdGVzcGFjZS5cbiAqICAgIElmIHNldCB0byBhbiBpbnRlZ2VyLCB0aGUgSlNPTiBvdXRwdXQgd2lsbCBjb250YWluIHRoYXQgbWFueSBzcGFjZXMgcGVyIGluZGVudGF0aW9uLlxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IEpTT04taWZpZWQgc3RyaW5nIHJlcHJlc2VudGluZyBgb2JqYC5cbiAqIEBrbm93bklzc3VlXG4gKlxuICogVGhlIFNhZmFyaSBicm93c2VyIHRocm93cyBhIGBSYW5nZUVycm9yYCBpbnN0ZWFkIG9mIHJldHVybmluZyBgbnVsbGAgd2hlbiBpdCB0cmllcyB0byBzdHJpbmdpZnkgYSBgRGF0ZWBcbiAqIG9iamVjdCB3aXRoIGFuIGludmFsaWQgZGF0ZSB2YWx1ZS4gVGhlIG9ubHkgcmVsaWFibGUgd2F5IHRvIHByZXZlbnQgdGhpcyBpcyB0byBtb25rZXlwYXRjaCB0aGVcbiAqIGBEYXRlLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZCBhcyBmb2xsb3dzOlxuICpcbiAqIGBgYFxuICogdmFyIF9EYXRldG9KU09OID0gRGF0ZS5wcm90b3R5cGUudG9KU09OO1xuICogRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gKiAgIHRyeSB7XG4gKiAgICAgcmV0dXJuIF9EYXRldG9KU09OLmNhbGwodGhpcyk7XG4gKiAgIH0gY2F0Y2goZSkge1xuICogICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikge1xuICogICAgICAgcmV0dXJuIG51bGw7XG4gKiAgICAgfVxuICogICAgIHRocm93IGU7XG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzE0MjIxIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiB0b0pzb24ob2JqLCBwcmV0dHkpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKG9iaikpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghaXNOdW1iZXIocHJldHR5KSkge1xuICAgIHByZXR0eSA9IHByZXR0eSA/IDIgOiBudWxsO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIHRvSnNvblJlcGxhY2VyLCBwcmV0dHkpO1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmZyb21Kc29uXG4gKiBAbW9kdWxlIG5nXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGVzZXJpYWxpemVzIGEgSlNPTiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGpzb24gSlNPTiBzdHJpbmcgdG8gZGVzZXJpYWxpemUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fEFycmF5fHN0cmluZ3xudW1iZXJ9IERlc2VyaWFsaXplZCBKU09OIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZnJvbUpzb24oanNvbikge1xuICByZXR1cm4gaXNTdHJpbmcoanNvbilcbiAgICAgID8gSlNPTi5wYXJzZShqc29uKVxuICAgICAgOiBqc29uO1xufVxuXG5cbnZhciBBTExfQ09MT05TID0gLzovZztcbmZ1bmN0aW9uIHRpbWV6b25lVG9PZmZzZXQodGltZXpvbmUsIGZhbGxiYWNrKSB7XG4gIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seSwgRWRnZSAxMy0xNCtcbiAgLy8gSUUvRWRnZSBkbyBub3QgXCJ1bmRlcnN0YW5kXCIgY29sb24gKGA6YCkgaW4gdGltZXpvbmVcbiAgdGltZXpvbmUgPSB0aW1lem9uZS5yZXBsYWNlKEFMTF9DT0xPTlMsICcnKTtcbiAgdmFyIHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0ID0gRGF0ZS5wYXJzZSgnSmFuIDAxLCAxOTcwIDAwOjAwOjAwICcgKyB0aW1lem9uZSkgLyA2MDAwMDtcbiAgcmV0dXJuIGlzTnVtYmVyTmFOKHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0KSA/IGZhbGxiYWNrIDogcmVxdWVzdGVkVGltZXpvbmVPZmZzZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkRGF0ZU1pbnV0ZXMoZGF0ZSwgbWludXRlcykge1xuICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpO1xuICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyBtaW51dGVzKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cblxuZnVuY3Rpb24gY29udmVydFRpbWV6b25lVG9Mb2NhbChkYXRlLCB0aW1lem9uZSwgcmV2ZXJzZSkge1xuICByZXZlcnNlID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgdmFyIGRhdGVUaW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KTtcbiAgcmV0dXJuIGFkZERhdGVNaW51dGVzKGRhdGUsIHJldmVyc2UgKiAodGltZXpvbmVPZmZzZXQgLSBkYXRlVGltZXpvbmVPZmZzZXQpKTtcbn1cblxuXG4vKipcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gc3RhcnRpbmdUYWcoZWxlbWVudCkge1xuICBlbGVtZW50ID0ganFMaXRlKGVsZW1lbnQpLmNsb25lKCk7XG4gIHRyeSB7XG4gICAgLy8gdHVybnMgb3V0IElFIGRvZXMgbm90IGxldCB5b3Ugc2V0IC5odG1sKCkgb24gZWxlbWVudHMgd2hpY2hcbiAgICAvLyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBjaGlsZHJlbi4gU28gd2UganVzdCBpZ25vcmUgaXQuXG4gICAgZWxlbWVudC5lbXB0eSgpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgdmFyIGVsZW1IdG1sID0ganFMaXRlKCc8ZGl2PicpLmFwcGVuZChlbGVtZW50KS5odG1sKCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVsZW1lbnRbMF0ubm9kZVR5cGUgPT09IE5PREVfVFlQRV9URVhUID8gbG93ZXJjYXNlKGVsZW1IdG1sKSA6XG4gICAgICAgIGVsZW1IdG1sLlxuICAgICAgICAgIG1hdGNoKC9eKDxbXj5dKz4pLylbMV0uXG4gICAgICAgICAgcmVwbGFjZSgvXjwoW1xcdy1dKykvLCBmdW5jdGlvbihtYXRjaCwgbm9kZU5hbWUpIHtyZXR1cm4gJzwnICsgbG93ZXJjYXNlKG5vZGVOYW1lKTt9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBsb3dlcmNhc2UoZWxlbUh0bWwpO1xuICB9XG5cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogVHJpZXMgdG8gZGVjb2RlIHRoZSBVUkkgY29tcG9uZW50IHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc3RyIHZhbHVlIHBvdGVudGlhbCBVUkkgY29tcG9uZW50IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYHZhbHVlYCBjYW4gYmUgZGVjb2RlZFxuICogd2l0aCB0aGUgZGVjb2RlVVJJQ29tcG9uZW50IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZSBhbnkgaW52YWxpZCB1cmkgY29tcG9uZW50LlxuICB9XG59XG5cblxuLyoqXG4gKiBQYXJzZXMgYW4gZXNjYXBlZCB1cmwgcXVlcnkgc3RyaW5nIGludG8ga2V5LXZhbHVlIHBhaXJzLlxuICogQHJldHVybnMge09iamVjdC48c3RyaW5nLGJvb2xlYW58QXJyYXk+fVxuICovXG5mdW5jdGlvbiBwYXJzZUtleVZhbHVlKC8qKnN0cmluZyova2V5VmFsdWUpIHtcbiAgdmFyIG9iaiA9IHt9O1xuICBmb3JFYWNoKChrZXlWYWx1ZSB8fCAnJykuc3BsaXQoJyYnKSwgZnVuY3Rpb24oa2V5VmFsdWUpIHtcbiAgICB2YXIgc3BsaXRQb2ludCwga2V5LCB2YWw7XG4gICAgaWYgKGtleVZhbHVlKSB7XG4gICAgICBrZXkgPSBrZXlWYWx1ZSA9IGtleVZhbHVlLnJlcGxhY2UoL1xcKy9nLCclMjAnKTtcbiAgICAgIHNwbGl0UG9pbnQgPSBrZXlWYWx1ZS5pbmRleE9mKCc9Jyk7XG4gICAgICBpZiAoc3BsaXRQb2ludCAhPT0gLTEpIHtcbiAgICAgICAga2V5ID0ga2V5VmFsdWUuc3Vic3RyaW5nKDAsIHNwbGl0UG9pbnQpO1xuICAgICAgICB2YWwgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoc3BsaXRQb2ludCArIDEpO1xuICAgICAgfVxuICAgICAga2V5ID0gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICBpZiAoaXNEZWZpbmVkKGtleSkpIHtcbiAgICAgICAgdmFsID0gaXNEZWZpbmVkKHZhbCkgPyB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsKSA6IHRydWU7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KG9ialtrZXldKSkge1xuICAgICAgICAgIG9ialtrZXldLnB1c2godmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmpba2V5XSA9IFtvYmpba2V5XSx2YWxdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gdG9LZXlWYWx1ZShvYmopIHtcbiAgdmFyIHBhcnRzID0gW107XG4gIGZvckVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbihhcnJheVZhbHVlKSB7XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5LCB0cnVlKSArXG4gICAgICAgICAgICAgICAgICAgKGFycmF5VmFsdWUgPT09IHRydWUgPyAnJyA6ICc9JyArIGVuY29kZVVyaVF1ZXJ5KGFycmF5VmFsdWUsIHRydWUpKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5LCB0cnVlKSArXG4gICAgICAgICAgICAgICAodmFsdWUgPT09IHRydWUgPyAnJyA6ICc9JyArIGVuY29kZVVyaVF1ZXJ5KHZhbHVlLCB0cnVlKSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPyBwYXJ0cy5qb2luKCcmJykgOiAnJztcbn1cblxuXG4vKipcbiAqIFdlIG5lZWQgb3VyIGN1c3RvbSBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGRvZXNuJ3QgZm9sbG93XG4gKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTg2LnR4dCB3aXRoIHJlZ2FyZHMgdG8gdGhlIGNoYXJhY3RlciBzZXQgKHBjaGFyKSBhbGxvd2VkIGluIHBhdGhcbiAqIHNlZ21lbnRzOlxuICogICAgc2VnbWVudCAgICAgICA9ICpwY2hhclxuICogICAgcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyBcIjpcIiAvIFwiQFwiXG4gKiAgICBwY3QtZW5jb2RlZCAgID0gXCIlXCIgSEVYRElHIEhFWERJR1xuICogICAgdW5yZXNlcnZlZCAgICA9IEFMUEhBIC8gRElHSVQgLyBcIi1cIiAvIFwiLlwiIC8gXCJfXCIgLyBcIn5cIlxuICogICAgc3ViLWRlbGltcyAgICA9IFwiIVwiIC8gXCIkXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIoXCIgLyBcIilcIlxuICogICAgICAgICAgICAgICAgICAgICAvIFwiKlwiIC8gXCIrXCIgLyBcIixcIiAvIFwiO1wiIC8gXCI9XCJcbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJpU2VnbWVudCh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVyaVF1ZXJ5KHZhbCwgdHJ1ZSkuXG4gICAgICAgICAgICAgcmVwbGFjZSgvJTI2L2dpLCAnJicpLlxuICAgICAgICAgICAgIHJlcGxhY2UoLyUzRC9naSwgJz0nKS5cbiAgICAgICAgICAgICByZXBsYWNlKC8lMkIvZ2ksICcrJyk7XG59XG5cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZW5jb2RpbmcgKmtleSogb3IgKnZhbHVlKiBwYXJ0cyBvZiBxdWVyeSBjb21wb25lbnQuIFdlIG5lZWQgYSBjdXN0b21cbiAqIG1ldGhvZCBiZWNhdXNlIGVuY29kZVVSSUNvbXBvbmVudCBpcyB0b28gYWdncmVzc2l2ZSBhbmQgZW5jb2RlcyBzdHVmZiB0aGF0IGRvZXNuJ3QgaGF2ZSB0byBiZVxuICogZW5jb2RlZCBwZXIgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NjpcbiAqICAgIHF1ZXJ5ICAgICAgICAgPSAqKCBwY2hhciAvIFwiL1wiIC8gXCI/XCIgKVxuICogICAgcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyBcIjpcIiAvIFwiQFwiXG4gKiAgICB1bnJlc2VydmVkICAgID0gQUxQSEEgLyBESUdJVCAvIFwiLVwiIC8gXCIuXCIgLyBcIl9cIiAvIFwiflwiXG4gKiAgICBwY3QtZW5jb2RlZCAgID0gXCIlXCIgSEVYRElHIEhFWERJR1xuICogICAgc3ViLWRlbGltcyAgICA9IFwiIVwiIC8gXCIkXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIoXCIgLyBcIilcIlxuICogICAgICAgICAgICAgICAgICAgICAvIFwiKlwiIC8gXCIrXCIgLyBcIixcIiAvIFwiO1wiIC8gXCI9XCJcbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJpUXVlcnkodmFsLCBwY3RFbmNvZGVTcGFjZXMpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgICAgICAgICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICAgICAgICAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgICAgICAgICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgICAgICAgICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgICAgICAgICAgIHJlcGxhY2UoLyUzQi9naSwgJzsnKS5cbiAgICAgICAgICAgICByZXBsYWNlKC8lMjAvZywgKHBjdEVuY29kZVNwYWNlcyA/ICclMjAnIDogJysnKSk7XG59XG5cbnZhciBuZ0F0dHJQcmVmaXhlcyA9IFsnbmctJywgJ2RhdGEtbmctJywgJ25nOicsICd4LW5nLSddO1xuXG5mdW5jdGlvbiBnZXROZ0F0dHJpYnV0ZShlbGVtZW50LCBuZ0F0dHIpIHtcbiAgdmFyIGF0dHIsIGksIGlpID0gbmdBdHRyUHJlZml4ZXMubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgaWk7ICsraSkge1xuICAgIGF0dHIgPSBuZ0F0dHJQcmVmaXhlc1tpXSArIG5nQXR0cjtcbiAgICBpZiAoaXNTdHJpbmcoYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpKSkge1xuICAgICAgcmV0dXJuIGF0dHI7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhbGxvd0F1dG9Cb290c3RyYXAoZG9jdW1lbnQpIHtcbiAgaWYgKCFkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGxpbmsuaHJlZiA9IHNyYztcbiAgaWYgKGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbiA9PT0gbGluay5vcmlnaW4pIHtcbiAgICAvLyBTYW1lLW9yaWdpbiByZXNvdXJjZXMgYXJlIGFsd2F5cyBhbGxvd2VkLCBldmVuIGZvciBub24td2hpdGVsaXN0ZWQgc2NoZW1lcy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBEaXNhYmxlZCBib290c3RyYXBwaW5nIHVubGVzcyBhbmd1bGFyLmpzIHdhcyBsb2FkZWQgZnJvbSBhIGtub3duIHNjaGVtZSB1c2VkIG9uIHRoZSB3ZWIuXG4gIC8vIFRoaXMgaXMgdG8gcHJldmVudCBhbmd1bGFyLmpzIGJ1bmRsZWQgd2l0aCBicm93c2VyIGV4dGVuc2lvbnMgZnJvbSBiZWluZyB1c2VkIHRvIGJ5cGFzcyB0aGVcbiAgLy8gY29udGVudCBzZWN1cml0eSBwb2xpY3kgaW4gd2ViIHBhZ2VzIGFuZCBvdGhlciBicm93c2VyIGV4dGVuc2lvbnMuXG4gIHN3aXRjaCAobGluay5wcm90b2NvbCkge1xuICAgIGNhc2UgJ2h0dHA6JzpcbiAgICBjYXNlICdodHRwczonOlxuICAgIGNhc2UgJ2Z0cDonOlxuICAgIGNhc2UgJ2Jsb2I6JzpcbiAgICBjYXNlICdmaWxlOic6XG4gICAgY2FzZSAnZGF0YTonOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBDYWNoZWQgYXMgaXQgaGFzIHRvIHJ1biBkdXJpbmcgbG9hZGluZyBzbyB0aGF0IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgaXMgYXZhaWxhYmxlLlxudmFyIGlzQXV0b0Jvb3RzdHJhcEFsbG93ZWQgPSBhbGxvd0F1dG9Cb290c3RyYXAod2luZG93LmRvY3VtZW50KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0FwcFxuICogQG1vZHVsZSBuZ1xuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHBhcmFtIHthbmd1bGFyLk1vZHVsZX0gbmdBcHAgYW4gb3B0aW9uYWwgYXBwbGljYXRpb25cbiAqICAge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZX0gbmFtZSB0byBsb2FkLlxuICogQHBhcmFtIHtib29sZWFuPX0gbmdTdHJpY3REaSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIHRoZSBhcHAgZWxlbWVudCwgdGhlIGluamVjdG9yIHdpbGwgYmVcbiAqICAgY3JlYXRlZCBpbiBcInN0cmljdC1kaVwiIG1vZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBmYWlsIHRvIGludm9rZSBmdW5jdGlvbnMgd2hpY2hcbiAqICAgZG8gbm90IHVzZSBleHBsaWNpdCBmdW5jdGlvbiBhbm5vdGF0aW9uIChhbmQgYXJlIHRodXMgdW5zdWl0YWJsZSBmb3IgbWluaWZpY2F0aW9uKSwgYXMgZGVzY3JpYmVkXG4gKiAgIGluIHtAbGluayBndWlkZS9kaSB0aGUgRGVwZW5kZW5jeSBJbmplY3Rpb24gZ3VpZGV9LCBhbmQgdXNlZnVsIGRlYnVnZ2luZyBpbmZvIHdpbGwgYXNzaXN0IGluXG4gKiAgIHRyYWNraW5nIGRvd24gdGhlIHJvb3Qgb2YgdGhlc2UgYnVncy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBVc2UgdGhpcyBkaXJlY3RpdmUgdG8gKiphdXRvLWJvb3RzdHJhcCoqIGFuIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbi4gVGhlIGBuZ0FwcGAgZGlyZWN0aXZlXG4gKiBkZXNpZ25hdGVzIHRoZSAqKnJvb3QgZWxlbWVudCoqIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgaXMgdHlwaWNhbGx5IHBsYWNlZCBuZWFyIHRoZSByb290IGVsZW1lbnRcbiAqIG9mIHRoZSBwYWdlIC0gZS5nLiBvbiB0aGUgYDxib2R5PmAgb3IgYDxodG1sPmAgdGFncy5cbiAqXG4gKiBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHRvIGtlZXAgaW4gbWluZCB3aGVuIHVzaW5nIGBuZ0FwcGA6XG4gKiAtIG9ubHkgb25lIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbiBjYW4gYmUgYXV0by1ib290c3RyYXBwZWQgcGVyIEhUTUwgZG9jdW1lbnQuIFRoZSBmaXJzdCBgbmdBcHBgXG4gKiAgIGZvdW5kIGluIHRoZSBkb2N1bWVudCB3aWxsIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSByb290IGVsZW1lbnQgdG8gYXV0by1ib290c3RyYXAgYXMgYW5cbiAqICAgYXBwbGljYXRpb24uIFRvIHJ1biBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgaW4gYW4gSFRNTCBkb2N1bWVudCB5b3UgbXVzdCBtYW51YWxseSBib290c3RyYXAgdGhlbSB1c2luZ1xuICogICB7QGxpbmsgYW5ndWxhci5ib290c3RyYXB9IGluc3RlYWQuXG4gKiAtIEFuZ3VsYXJKUyBhcHBsaWNhdGlvbnMgY2Fubm90IGJlIG5lc3RlZCB3aXRoaW4gZWFjaCBvdGhlci5cbiAqIC0gRG8gbm90IHVzZSBhIGRpcmVjdGl2ZSB0aGF0IHVzZXMge0BsaW5rIG5nLiRjb21waWxlI3RyYW5zY2x1c2lvbiB0cmFuc2NsdXNpb259IG9uIHRoZSBzYW1lIGVsZW1lbnQgYXMgYG5nQXBwYC5cbiAqICAgVGhpcyBpbmNsdWRlcyBkaXJlY3RpdmVzIHN1Y2ggYXMge0BsaW5rIG5nLm5nSWYgYG5nSWZgfSwge0BsaW5rIG5nLm5nSW5jbHVkZSBgbmdJbmNsdWRlYH0gYW5kXG4gKiAgIHtAbGluayBuZ1JvdXRlLm5nVmlldyBgbmdWaWV3YH0uXG4gKiAgIERvaW5nIHRoaXMgbWlzcGxhY2VzIHRoZSBhcHAge0BsaW5rIG5nLiRyb290RWxlbWVudCBgJHJvb3RFbGVtZW50YH0gYW5kIHRoZSBhcHAncyB7QGxpbmsgYXV0by4kaW5qZWN0b3IgaW5qZWN0b3J9LFxuICogICBjYXVzaW5nIGFuaW1hdGlvbnMgdG8gc3RvcCB3b3JraW5nIGFuZCBtYWtpbmcgdGhlIGluamVjdG9yIGluYWNjZXNzaWJsZSBmcm9tIG91dHNpZGUgdGhlIGFwcC5cbiAqXG4gKiBZb3UgY2FuIHNwZWNpZnkgYW4gKipBbmd1bGFySlMgbW9kdWxlKiogdG8gYmUgdXNlZCBhcyB0aGUgcm9vdCBtb2R1bGUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXNcbiAqIG1vZHVsZSB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3J9IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGJvb3RzdHJhcHBlZC4gSXRcbiAqIHNob3VsZCBjb250YWluIHRoZSBhcHBsaWNhdGlvbiBjb2RlIG5lZWRlZCBvciBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBtb2R1bGVzIHRoYXQgd2lsbFxuICogY29udGFpbiB0aGUgY29kZS4gU2VlIHtAbGluayBhbmd1bGFyLm1vZHVsZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogSW4gdGhlIGV4YW1wbGUgYmVsb3cgaWYgdGhlIGBuZ0FwcGAgZGlyZWN0aXZlIHdlcmUgbm90IHBsYWNlZCBvbiB0aGUgYGh0bWxgIGVsZW1lbnQgdGhlbiB0aGVcbiAqIGRvY3VtZW50IHdvdWxkIG5vdCBiZSBjb21waWxlZCwgdGhlIGBBcHBDb250cm9sbGVyYCB3b3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGFuZCB0aGUgYHt7IGErYiB9fWBcbiAqIHdvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBgM2AuXG4gKlxuICogYG5nQXBwYCBpcyB0aGUgZWFzaWVzdCwgYW5kIG1vc3QgY29tbW9uIHdheSB0byBib290c3RyYXAgYW4gYXBwbGljYXRpb24uXG4gKlxuIDxleGFtcGxlIG1vZHVsZT1cIm5nQXBwRGVtb1wiIG5hbWU9XCJuZy1hcHBcIj5cbiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJuZ0FwcERlbW9Db250cm9sbGVyXCI+XG4gICAgIEkgY2FuIGFkZDoge3thfX0gKyB7e2J9fSA9ICB7eyBhK2IgfX1cbiAgIDwvZGl2PlxuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgYW5ndWxhci5tb2R1bGUoJ25nQXBwRGVtbycsIFtdKS5jb250cm9sbGVyKCduZ0FwcERlbW9Db250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICRzY29wZS5hID0gMTtcbiAgICAgJHNjb3BlLmIgPSAyO1xuICAgfSk7XG4gICA8L2ZpbGU+XG4gPC9leGFtcGxlPlxuICpcbiAqIFVzaW5nIGBuZ1N0cmljdERpYCwgeW91IHdvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICpcbiA8ZXhhbXBsZSBuZy1hcHAtaW5jbHVkZWQ9XCJ0cnVlXCIgbmFtZT1cInN0cmljdC1kaVwiPlxuICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgIDxkaXYgbmctYXBwPVwibmdBcHBTdHJpY3REZW1vXCIgbmctc3RyaWN0LWRpPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkdvb2RDb250cm9sbGVyMVwiPlxuICAgICAgICAgICBJIGNhbiBhZGQ6IHt7YX19ICsge3tifX0gPSAge3sgYStiIH19XG5cbiAgICAgICAgICAgPHA+VGhpcyByZW5kZXJzIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgZG9lcyBub3QgZmFpbCB0b1xuICAgICAgICAgICAgICBpbnN0YW50aWF0ZSwgYnkgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBzdHlsZSAoc2VlXG4gICAgICAgICAgICAgIHNjcmlwdC5qcyBmb3IgZGV0YWlscylcbiAgICAgICAgICAgPC9wPlxuICAgICAgIDwvZGl2PlxuXG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiR29vZENvbnRyb2xsZXIyXCI+XG4gICAgICAgICAgIE5hbWU6IDxpbnB1dCBuZy1tb2RlbD1cIm5hbWVcIj48YnIgLz5cbiAgICAgICAgICAgSGVsbG8sIHt7bmFtZX19IVxuXG4gICAgICAgICAgIDxwPlRoaXMgcmVuZGVycyBiZWNhdXNlIHRoZSBjb250cm9sbGVyIGRvZXMgbm90IGZhaWwgdG9cbiAgICAgICAgICAgICAgaW5zdGFudGlhdGUsIGJ5IHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb24gc3R5bGVcbiAgICAgICAgICAgICAgKHNlZSBzY3JpcHQuanMgZm9yIGRldGFpbHMpXG4gICAgICAgICAgIDwvcD5cbiAgICAgICA8L2Rpdj5cblxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkJhZENvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgSSBjYW4gYWRkOiB7e2F9fSArIHt7Yn19ID0gIHt7IGErYiB9fVxuXG4gICAgICAgICAgIDxwPlRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQsIGR1ZSB0byByZWx5aW5nXG4gICAgICAgICAgICAgIG9uIGF1dG9tYXRpYyBmdW5jdGlvbiBhbm5vdGF0aW9ucyAod2hpY2ggYXJlIGRpc2FibGVkIGluXG4gICAgICAgICAgICAgIHN0cmljdCBtb2RlKS4gQXMgc3VjaCwgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWN0aW9uIGlzIG5vdFxuICAgICAgICAgICAgICBpbnRlcnBvbGF0ZWQsIGFuZCB0aGVyZSBzaG91bGQgYmUgYW4gZXJyb3IgaW4geW91ciB3ZWIgY29uc29sZS5cbiAgICAgICAgICAgPC9wPlxuICAgICAgIDwvZGl2PlxuICAgPC9kaXY+XG4gICA8L2ZpbGU+XG4gICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICBhbmd1bGFyLm1vZHVsZSgnbmdBcHBTdHJpY3REZW1vJywgW10pXG4gICAgIC8vIEJhZENvbnRyb2xsZXIgd2lsbCBmYWlsIHRvIGluc3RhbnRpYXRlLCBkdWUgdG8gcmVseWluZyBvbiBhdXRvbWF0aWMgZnVuY3Rpb24gYW5ub3RhdGlvbixcbiAgICAgLy8gcmF0aGVyIHRoYW4gYW4gZXhwbGljaXQgYW5ub3RhdGlvblxuICAgICAuY29udHJvbGxlcignQmFkQ29udHJvbGxlcicsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICRzY29wZS5hID0gMTtcbiAgICAgICAkc2NvcGUuYiA9IDI7XG4gICAgIH0pXG4gICAgIC8vIFVubGlrZSBCYWRDb250cm9sbGVyLCBHb29kQ29udHJvbGxlcjEgYW5kIEdvb2RDb250cm9sbGVyMiB3aWxsIG5vdCBmYWlsIHRvIGJlIGluc3RhbnRpYXRlZCxcbiAgICAgLy8gZHVlIHRvIHVzaW5nIGV4cGxpY2l0IGFubm90YXRpb25zIHVzaW5nIHRoZSBhcnJheSBzdHlsZSBhbmQgJGluamVjdCBwcm9wZXJ0eSwgcmVzcGVjdGl2ZWx5LlxuICAgICAuY29udHJvbGxlcignR29vZENvbnRyb2xsZXIxJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAkc2NvcGUuYSA9IDE7XG4gICAgICAgJHNjb3BlLmIgPSAyO1xuICAgICB9XSlcbiAgICAgLmNvbnRyb2xsZXIoJ0dvb2RDb250cm9sbGVyMicsIEdvb2RDb250cm9sbGVyMik7XG4gICAgIGZ1bmN0aW9uIEdvb2RDb250cm9sbGVyMigkc2NvcGUpIHtcbiAgICAgICAkc2NvcGUubmFtZSA9ICdXb3JsZCc7XG4gICAgIH1cbiAgICAgR29vZENvbnRyb2xsZXIyLiRpbmplY3QgPSBbJyRzY29wZSddO1xuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgZGl2W25nLWNvbnRyb2xsZXJdIHtcbiAgICAgICBtYXJnaW4tYm90dG9tOiAxZW07XG4gICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgIGJvcmRlcjogMXB4IHNvbGlkO1xuICAgICAgIHBhZGRpbmc6IC41ZW07XG4gICB9XG4gICBkaXZbbmctY29udHJvbGxlcl49R29vZF0ge1xuICAgICAgIGJvcmRlci1jb2xvcjogI2Q2ZTljNjtcbiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xuICAgICAgIGNvbG9yOiAjM2M3NjNkO1xuICAgfVxuICAgZGl2W25nLWNvbnRyb2xsZXJePUJhZF0ge1xuICAgICAgIGJvcmRlci1jb2xvcjogI2ViY2NkMTtcbiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xuICAgICAgIGNvbG9yOiAjYTk0NDQyO1xuICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICB9XG4gICA8L2ZpbGU+XG4gPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiBhbmd1bGFySW5pdChlbGVtZW50LCBib290c3RyYXApIHtcbiAgdmFyIGFwcEVsZW1lbnQsXG4gICAgICBtb2R1bGUsXG4gICAgICBjb25maWcgPSB7fTtcblxuICAvLyBUaGUgZWxlbWVudCBgZWxlbWVudGAgaGFzIHByaW9yaXR5IG92ZXIgYW55IG90aGVyIGVsZW1lbnQuXG4gIGZvckVhY2gobmdBdHRyUHJlZml4ZXMsIGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIHZhciBuYW1lID0gcHJlZml4ICsgJ2FwcCc7XG5cbiAgICBpZiAoIWFwcEVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIGFwcEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgbW9kdWxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgfVxuICB9KTtcbiAgZm9yRWFjaChuZ0F0dHJQcmVmaXhlcywgZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnYXBwJztcbiAgICB2YXIgY2FuZGlkYXRlO1xuXG4gICAgaWYgKCFhcHBFbGVtZW50ICYmIChjYW5kaWRhdGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1snICsgbmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JykgKyAnXScpKSkge1xuICAgICAgYXBwRWxlbWVudCA9IGNhbmRpZGF0ZTtcbiAgICAgIG1vZHVsZSA9IGNhbmRpZGF0ZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKGFwcEVsZW1lbnQpIHtcbiAgICBpZiAoIWlzQXV0b0Jvb3RzdHJhcEFsbG93ZWQpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKCdBbmd1bGFyOiBkaXNhYmxpbmcgYXV0b21hdGljIGJvb3RzdHJhcC4gPHNjcmlwdD4gcHJvdG9jb2wgaW5kaWNhdGVzICcgK1xuICAgICAgICAgICdhbiBleHRlbnNpb24sIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgZG9lcyBub3QgbWF0Y2guJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbmZpZy5zdHJpY3REaSA9IGdldE5nQXR0cmlidXRlKGFwcEVsZW1lbnQsICdzdHJpY3QtZGknKSAhPT0gbnVsbDtcbiAgICBib290c3RyYXAoYXBwRWxlbWVudCwgbW9kdWxlID8gW21vZHVsZV0gOiBbXSwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgYW5ndWxhci5ib290c3RyYXBcbiAqIEBtb2R1bGUgbmdcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gbWFudWFsbHkgc3RhcnQgdXAgYW5ndWxhciBhcHBsaWNhdGlvbi5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB7QGxpbmsgZ3VpZGUvYm9vdHN0cmFwIEJvb3RzdHJhcCBndWlkZX0uXG4gKlxuICogQW5ndWxhciB3aWxsIGRldGVjdCBpZiBpdCBoYXMgYmVlbiBsb2FkZWQgaW50byB0aGUgYnJvd3NlciBtb3JlIHRoYW4gb25jZSBhbmQgb25seSBhbGxvdyB0aGVcbiAqIGZpcnN0IGxvYWRlZCBzY3JpcHQgdG8gYmUgYm9vdHN0cmFwcGVkIGFuZCB3aWxsIHJlcG9ydCBhIHdhcm5pbmcgdG8gdGhlIGJyb3dzZXIgY29uc29sZSBmb3JcbiAqIGVhY2ggb2YgdGhlIHN1YnNlcXVlbnQgc2NyaXB0cy4gVGhpcyBwcmV2ZW50cyBzdHJhbmdlIHJlc3VsdHMgaW4gYXBwbGljYXRpb25zLCB3aGVyZSBvdGhlcndpc2VcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBBbmd1bGFyIHRyeSB0byB3b3JrIG9uIHRoZSBET00uXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZToqKiBQcm90cmFjdG9yIGJhc2VkIGVuZC10by1lbmQgdGVzdHMgY2Fubm90IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGJvb3RzdHJhcCBtYW51YWxseS5cbiAqIFRoZXkgbXVzdCB1c2Uge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0FwcCBuZ0FwcH0uXG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIERvIG5vdCBib290c3RyYXAgdGhlIGFwcCBvbiBhbiBlbGVtZW50IHdpdGggYSBkaXJlY3RpdmUgdGhhdCB1c2VzIHtAbGluayBuZy4kY29tcGlsZSN0cmFuc2NsdXNpb24gdHJhbnNjbHVzaW9ufSxcbiAqIHN1Y2ggYXMge0BsaW5rIG5nLm5nSWYgYG5nSWZgfSwge0BsaW5rIG5nLm5nSW5jbHVkZSBgbmdJbmNsdWRlYH0gYW5kIHtAbGluayBuZ1JvdXRlLm5nVmlldyBgbmdWaWV3YH0uXG4gKiBEb2luZyB0aGlzIG1pc3BsYWNlcyB0aGUgYXBwIHtAbGluayBuZy4kcm9vdEVsZW1lbnQgYCRyb290RWxlbWVudGB9IGFuZCB0aGUgYXBwJ3Mge0BsaW5rIGF1dG8uJGluamVjdG9yIGluamVjdG9yfSxcbiAqIGNhdXNpbmcgYW5pbWF0aW9ucyB0byBzdG9wIHdvcmtpbmcgYW5kIG1ha2luZyB0aGUgaW5qZWN0b3IgaW5hY2Nlc3NpYmxlIGZyb20gb3V0c2lkZSB0aGUgYXBwLlxuICogPC9kaXY+XG4gKlxuICogYGBgaHRtbFxuICogPCFkb2N0eXBlIGh0bWw+XG4gKiA8aHRtbD5cbiAqIDxib2R5PlxuICogPGRpdiBuZy1jb250cm9sbGVyPVwiV2VsY29tZUNvbnRyb2xsZXJcIj5cbiAqICAge3tncmVldGluZ319XG4gKiA8L2Rpdj5cbiAqXG4gKiA8c2NyaXB0IHNyYz1cImFuZ3VsYXIuanNcIj48L3NjcmlwdD5cbiAqIDxzY3JpcHQ+XG4gKiAgIHZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnZGVtbycsIFtdKVxuICogICAuY29udHJvbGxlcignV2VsY29tZUNvbnRyb2xsZXInLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICRzY29wZS5ncmVldGluZyA9ICdXZWxjb21lISc7XG4gKiAgIH0pO1xuICogICBhbmd1bGFyLmJvb3RzdHJhcChkb2N1bWVudCwgWydkZW1vJ10pO1xuICogPC9zY3JpcHQ+XG4gKiA8L2JvZHk+XG4gKiA8L2h0bWw+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgd2hpY2ggaXMgdGhlIHJvb3Qgb2YgYW5ndWxhciBhcHBsaWNhdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfEZ1bmN0aW9ufEFycmF5Pj19IG1vZHVsZXMgYW4gYXJyYXkgb2YgbW9kdWxlcyB0byBsb2FkIGludG8gdGhlIGFwcGxpY2F0aW9uLlxuICogICAgIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcHJlZGVmaW5lZCBtb2R1bGUgb3IgYSAoREkgYW5ub3RhdGVkKVxuICogICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBpbmplY3RvciBhcyBhIGBjb25maWdgIGJsb2NrLlxuICogICAgIFNlZToge0BsaW5rIGFuZ3VsYXIubW9kdWxlIG1vZHVsZXN9XG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBhbiBvYmplY3QgZm9yIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGVcbiAqICAgICBmb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqICogYHN0cmljdERpYCAtIGRpc2FibGUgYXV0b21hdGljIGZ1bmN0aW9uIGFubm90YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBtZWFudCB0b1xuICogICBhc3Npc3QgaW4gZmluZGluZyBidWdzIHdoaWNoIGJyZWFrIG1pbmlmaWVkIGNvZGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogQHJldHVybnMge2F1dG8uJGluamVjdG9yfSBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIGluamVjdG9yIGZvciB0aGlzIGFwcC5cbiAqL1xuZnVuY3Rpb24gYm9vdHN0cmFwKGVsZW1lbnQsIG1vZHVsZXMsIGNvbmZpZykge1xuICBpZiAoIWlzT2JqZWN0KGNvbmZpZykpIGNvbmZpZyA9IHt9O1xuICB2YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBzdHJpY3REaTogZmFsc2VcbiAgfTtcbiAgY29uZmlnID0gZXh0ZW5kKGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG4gIHZhciBkb0Jvb3RzdHJhcCA9IGZ1bmN0aW9uKCkge1xuICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudC5pbmplY3RvcigpKSB7XG4gICAgICB2YXIgdGFnID0gKGVsZW1lbnRbMF0gPT09IHdpbmRvdy5kb2N1bWVudCkgPyAnZG9jdW1lbnQnIDogc3RhcnRpbmdUYWcoZWxlbWVudCk7XG4gICAgICAvLyBFbmNvZGUgYW5nbGUgYnJhY2tldHMgdG8gcHJldmVudCBpbnB1dCBmcm9tIGJlaW5nIHNhbml0aXplZCB0byBlbXB0eSBzdHJpbmcgIzg2ODMuXG4gICAgICB0aHJvdyBuZ01pbkVycihcbiAgICAgICAgICAnYnRzdHJwZCcsXG4gICAgICAgICAgJ0FwcCBhbHJlYWR5IGJvb3RzdHJhcHBlZCB3aXRoIHRoaXMgZWxlbWVudCBcXCd7MH1cXCcnLFxuICAgICAgICAgIHRhZy5yZXBsYWNlKC88LywnJmx0OycpLnJlcGxhY2UoLz4vLCcmZ3Q7JykpO1xuICAgIH1cblxuICAgIG1vZHVsZXMgPSBtb2R1bGVzIHx8IFtdO1xuICAgIG1vZHVsZXMudW5zaGlmdChbJyRwcm92aWRlJywgZnVuY3Rpb24oJHByb3ZpZGUpIHtcbiAgICAgICRwcm92aWRlLnZhbHVlKCckcm9vdEVsZW1lbnQnLCBlbGVtZW50KTtcbiAgICB9XSk7XG5cbiAgICBpZiAoY29uZmlnLmRlYnVnSW5mb0VuYWJsZWQpIHtcbiAgICAgIC8vIFB1c2hpbmcgc28gdGhhdCB0aGlzIG92ZXJyaWRlcyBgZGVidWdJbmZvRW5hYmxlZGAgc2V0dGluZyBkZWZpbmVkIGluIHVzZXIncyBgbW9kdWxlc2AuXG4gICAgICBtb2R1bGVzLnB1c2goWyckY29tcGlsZVByb3ZpZGVyJywgZnVuY3Rpb24oJGNvbXBpbGVQcm92aWRlcikge1xuICAgICAgICAkY29tcGlsZVByb3ZpZGVyLmRlYnVnSW5mb0VuYWJsZWQodHJ1ZSk7XG4gICAgICB9XSk7XG4gICAgfVxuXG4gICAgbW9kdWxlcy51bnNoaWZ0KCduZycpO1xuICAgIHZhciBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKG1vZHVsZXMsIGNvbmZpZy5zdHJpY3REaSk7XG4gICAgaW5qZWN0b3IuaW52b2tlKFsnJHJvb3RTY29wZScsICckcm9vdEVsZW1lbnQnLCAnJGNvbXBpbGUnLCAnJGluamVjdG9yJyxcbiAgICAgICBmdW5jdGlvbiBib290c3RyYXBBcHBseShzY29wZSwgZWxlbWVudCwgY29tcGlsZSwgaW5qZWN0b3IpIHtcbiAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnQuZGF0YSgnJGluamVjdG9yJywgaW5qZWN0b3IpO1xuICAgICAgICAgIGNvbXBpbGUoZWxlbWVudCkoc2NvcGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1dXG4gICAgKTtcbiAgICByZXR1cm4gaW5qZWN0b3I7XG4gIH07XG5cbiAgdmFyIE5HX0VOQUJMRV9ERUJVR19JTkZPID0gL15OR19FTkFCTEVfREVCVUdfSU5GTyEvO1xuICB2YXIgTkdfREVGRVJfQk9PVFNUUkFQID0gL15OR19ERUZFUl9CT09UU1RSQVAhLztcblxuICBpZiAod2luZG93ICYmIE5HX0VOQUJMRV9ERUJVR19JTkZPLnRlc3Qod2luZG93Lm5hbWUpKSB7XG4gICAgY29uZmlnLmRlYnVnSW5mb0VuYWJsZWQgPSB0cnVlO1xuICAgIHdpbmRvdy5uYW1lID0gd2luZG93Lm5hbWUucmVwbGFjZShOR19FTkFCTEVfREVCVUdfSU5GTywgJycpO1xuICB9XG5cbiAgaWYgKHdpbmRvdyAmJiAhTkdfREVGRVJfQk9PVFNUUkFQLnRlc3Qod2luZG93Lm5hbWUpKSB7XG4gICAgcmV0dXJuIGRvQm9vdHN0cmFwKCk7XG4gIH1cblxuICB3aW5kb3cubmFtZSA9IHdpbmRvdy5uYW1lLnJlcGxhY2UoTkdfREVGRVJfQk9PVFNUUkFQLCAnJyk7XG4gIGFuZ3VsYXIucmVzdW1lQm9vdHN0cmFwID0gZnVuY3Rpb24oZXh0cmFNb2R1bGVzKSB7XG4gICAgZm9yRWFjaChleHRyYU1vZHVsZXMsIGZ1bmN0aW9uKG1vZHVsZSkge1xuICAgICAgbW9kdWxlcy5wdXNoKG1vZHVsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvQm9vdHN0cmFwKCk7XG4gIH07XG5cbiAgaWYgKGlzRnVuY3Rpb24oYW5ndWxhci5yZXN1bWVEZWZlcnJlZEJvb3RzdHJhcCkpIHtcbiAgICBhbmd1bGFyLnJlc3VtZURlZmVycmVkQm9vdHN0cmFwKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAbmdkb2MgZnVuY3Rpb25cbiAqIEBuYW1lIGFuZ3VsYXIucmVsb2FkV2l0aERlYnVnSW5mb1xuICogQG1vZHVsZSBuZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZWxvYWQgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiB0dXJuZWQgb24uXG4gKiBUaGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhIGNhbGwgdG8gYCRjb21waWxlUHJvdmlkZXIuZGVidWdJbmZvRW5hYmxlZChmYWxzZSlgLlxuICpcbiAqIFNlZSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkZWJ1Z0luZm9FbmFibGVkfSBmb3IgbW9yZS5cbiAqL1xuZnVuY3Rpb24gcmVsb2FkV2l0aERlYnVnSW5mbygpIHtcbiAgd2luZG93Lm5hbWUgPSAnTkdfRU5BQkxFX0RFQlVHX0lORk8hJyArIHdpbmRvdy5uYW1lO1xuICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG59XG5cbi8qKlxuICogQG5hbWUgYW5ndWxhci5nZXRUZXN0YWJpbGl0eVxuICogQG1vZHVsZSBuZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIHRlc3RhYmlsaXR5IHNlcnZpY2UgZm9yIHRoZSBpbnN0YW5jZSBvZiBBbmd1bGFyIG9uIHRoZSBnaXZlblxuICogZWxlbWVudC5cbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyB0aGUgcm9vdCBvZiBhbmd1bGFyIGFwcGxpY2F0aW9uLlxuICovXG5mdW5jdGlvbiBnZXRUZXN0YWJpbGl0eShyb290RWxlbWVudCkge1xuICB2YXIgaW5qZWN0b3IgPSBhbmd1bGFyLmVsZW1lbnQocm9vdEVsZW1lbnQpLmluamVjdG9yKCk7XG4gIGlmICghaW5qZWN0b3IpIHtcbiAgICB0aHJvdyBuZ01pbkVycigndGVzdCcsXG4gICAgICAnbm8gaW5qZWN0b3IgZm91bmQgZm9yIGVsZW1lbnQgYXJndW1lbnQgdG8gZ2V0VGVzdGFiaWxpdHknKTtcbiAgfVxuICByZXR1cm4gaW5qZWN0b3IuZ2V0KCckJHRlc3RhYmlsaXR5Jyk7XG59XG5cbnZhciBTTkFLRV9DQVNFX1JFR0VYUCA9IC9bQS1aXS9nO1xuZnVuY3Rpb24gc25ha2VfY2FzZShuYW1lLCBzZXBhcmF0b3IpIHtcbiAgc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICdfJztcbiAgcmV0dXJuIG5hbWUucmVwbGFjZShTTkFLRV9DQVNFX1JFR0VYUCwgZnVuY3Rpb24obGV0dGVyLCBwb3MpIHtcbiAgICByZXR1cm4gKHBvcyA/IHNlcGFyYXRvciA6ICcnKSArIGxldHRlci50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxudmFyIGJpbmRKUXVlcnlGaXJlZCA9IGZhbHNlO1xuZnVuY3Rpb24gYmluZEpRdWVyeSgpIHtcbiAgdmFyIG9yaWdpbmFsQ2xlYW5EYXRhO1xuXG4gIGlmIChiaW5kSlF1ZXJ5RmlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBiaW5kIHRvIGpRdWVyeSBpZiBwcmVzZW50O1xuICB2YXIganFOYW1lID0ganEoKTtcbiAgalF1ZXJ5ID0gaXNVbmRlZmluZWQoanFOYW1lKSA/IHdpbmRvdy5qUXVlcnkgOiAgIC8vIHVzZSBqUXVlcnkgKGlmIHByZXNlbnQpXG4gICAgICAgICAgICFqcU5hbWUgICAgICAgICAgICAgPyB1bmRlZmluZWQgICAgIDogICAvLyB1c2UganFMaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbanFOYW1lXTsgICAvLyB1c2UgalF1ZXJ5IHNwZWNpZmllZCBieSBgbmdKcWBcblxuICAvLyBVc2UgalF1ZXJ5IGlmIGl0IGV4aXN0cyB3aXRoIHByb3BlciBmdW5jdGlvbmFsaXR5LCBvdGhlcndpc2UgZGVmYXVsdCB0byB1cy5cbiAgLy8gQW5ndWxhciAxLjIrIHJlcXVpcmVzIGpRdWVyeSAxLjcrIGZvciBvbigpL29mZigpIHN1cHBvcnQuXG4gIC8vIEFuZ3VsYXIgMS4zKyB0ZWNobmljYWxseSByZXF1aXJlcyBhdCBsZWFzdCBqUXVlcnkgMi4xKyBidXQgaXQgbWF5IHdvcmsgd2l0aCBvbGRlclxuICAvLyB2ZXJzaW9ucy4gSXQgd2lsbCBub3Qgd29yayBmb3Igc3VyZSB3aXRoIGpRdWVyeSA8MS43LCB0aG91Z2guXG4gIGlmIChqUXVlcnkgJiYgalF1ZXJ5LmZuLm9uKSB7XG4gICAganFMaXRlID0galF1ZXJ5O1xuICAgIGV4dGVuZChqUXVlcnkuZm4sIHtcbiAgICAgIHNjb3BlOiBKUUxpdGVQcm90b3R5cGUuc2NvcGUsXG4gICAgICBpc29sYXRlU2NvcGU6IEpRTGl0ZVByb3RvdHlwZS5pc29sYXRlU2NvcGUsXG4gICAgICBjb250cm9sbGVyOiBKUUxpdGVQcm90b3R5cGUuY29udHJvbGxlcixcbiAgICAgIGluamVjdG9yOiBKUUxpdGVQcm90b3R5cGUuaW5qZWN0b3IsXG4gICAgICBpbmhlcml0ZWREYXRhOiBKUUxpdGVQcm90b3R5cGUuaW5oZXJpdGVkRGF0YVxuICAgIH0pO1xuXG4gICAgLy8gQWxsIG5vZGVzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHZpYSB2YXJpb3VzIGpRdWVyeSBBUElzIGxpa2UgLnJlbW92ZSgpXG4gICAgLy8gYXJlIHBhc3NlZCB0aHJvdWdoIGpRdWVyeS5jbGVhbkRhdGEuIE1vbmtleS1wYXRjaCB0aGlzIG1ldGhvZCB0byBmaXJlXG4gICAgLy8gdGhlICRkZXN0cm95IGV2ZW50IG9uIGFsbCByZW1vdmVkIG5vZGVzLlxuICAgIG9yaWdpbmFsQ2xlYW5EYXRhID0galF1ZXJ5LmNsZWFuRGF0YTtcbiAgICBqUXVlcnkuY2xlYW5EYXRhID0gZnVuY3Rpb24oZWxlbXMpIHtcbiAgICAgIHZhciBldmVudHM7XG4gICAgICBmb3IgKHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrKSB7XG4gICAgICAgIGV2ZW50cyA9IGpRdWVyeS5fZGF0YShlbGVtLCAnZXZlbnRzJyk7XG4gICAgICAgIGlmIChldmVudHMgJiYgZXZlbnRzLiRkZXN0cm95KSB7XG4gICAgICAgICAgalF1ZXJ5KGVsZW0pLnRyaWdnZXJIYW5kbGVyKCckZGVzdHJveScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvcmlnaW5hbENsZWFuRGF0YShlbGVtcyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBqcUxpdGUgPSBKUUxpdGU7XG4gIH1cblxuICBhbmd1bGFyLmVsZW1lbnQgPSBqcUxpdGU7XG5cbiAgLy8gUHJldmVudCBkb3VibGUtcHJveHlpbmcuXG4gIGJpbmRKUXVlcnlGaXJlZCA9IHRydWU7XG59XG5cbi8qKlxuICogdGhyb3cgZXJyb3IgaWYgdGhlIGFyZ3VtZW50IGlzIGZhbHN5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcmcoYXJnLCBuYW1lLCByZWFzb24pIHtcbiAgaWYgKCFhcmcpIHtcbiAgICB0aHJvdyBuZ01pbkVycignYXJlcScsICdBcmd1bWVudCBcXCd7MH1cXCcgaXMgezF9JywgKG5hbWUgfHwgJz8nKSwgKHJlYXNvbiB8fCAncmVxdWlyZWQnKSk7XG4gIH1cbiAgcmV0dXJuIGFyZztcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXJnRm4oYXJnLCBuYW1lLCBhY2NlcHRBcnJheUFubm90YXRpb24pIHtcbiAgaWYgKGFjY2VwdEFycmF5QW5ub3RhdGlvbiAmJiBpc0FycmF5KGFyZykpIHtcbiAgICAgIGFyZyA9IGFyZ1thcmcubGVuZ3RoIC0gMV07XG4gIH1cblxuICBhc3NlcnRBcmcoaXNGdW5jdGlvbihhcmcpLCBuYW1lLCAnbm90IGEgZnVuY3Rpb24sIGdvdCAnICtcbiAgICAgIChhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBhcmcuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JyA6IHR5cGVvZiBhcmcpKTtcbiAgcmV0dXJuIGFyZztcbn1cblxuLyoqXG4gKiB0aHJvdyBlcnJvciBpZiB0aGUgbmFtZSBnaXZlbiBpcyBoYXNPd25Qcm9wZXJ0eVxuICogQHBhcmFtICB7U3RyaW5nfSBuYW1lICAgIHRoZSBuYW1lIHRvIHRlc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gY29udGV4dCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgbmFtZSBpcyB1c2VkLCBzdWNoIGFzIG1vZHVsZSBvciBkaXJlY3RpdmVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgY29udGV4dCkge1xuICBpZiAobmFtZSA9PT0gJ2hhc093blByb3BlcnR5Jykge1xuICAgIHRocm93IG5nTWluRXJyKCdiYWRuYW1lJywgJ2hhc093blByb3BlcnR5IGlzIG5vdCBhIHZhbGlkIHswfSBuYW1lJywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHZhbHVlIGFjY2Vzc2libGUgZnJvbSB0aGUgb2JqZWN0IGJ5IHBhdGguIEFueSB1bmRlZmluZWQgdHJhdmVyc2FscyBhcmUgaWdub3JlZFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBzdGFydGluZyBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHBhdGggdG8gdHJhdmVyc2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JpbmRGblRvU2NvcGU9dHJ1ZV1cbiAqIEByZXR1cm5zIHtPYmplY3R9IHZhbHVlIGFzIGFjY2Vzc2libGUgYnkgcGF0aFxuICovXG4vL1RPRE8obWlza28pOiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJlbW92ZWRcbmZ1bmN0aW9uIGdldHRlcihvYmosIHBhdGgsIGJpbmRGblRvU2NvcGUpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gb2JqO1xuICB2YXIga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIGtleTtcbiAgdmFyIGxhc3RJbnN0YW5jZSA9IG9iajtcbiAgdmFyIGxlbiA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChvYmopIHtcbiAgICAgIG9iaiA9IChsYXN0SW5zdGFuY2UgPSBvYmopW2tleV07XG4gICAgfVxuICB9XG4gIGlmICghYmluZEZuVG9TY29wZSAmJiBpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICByZXR1cm4gYmluZChsYXN0SW5zdGFuY2UsIG9iaik7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIERPTSBzaWJsaW5ncyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IGxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9IHRoZSBpbnB1dHRlZCBvYmplY3Qgb3IgYSBqcUxpdGUgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBub2Rlc1xuICovXG5mdW5jdGlvbiBnZXRCbG9ja05vZGVzKG5vZGVzKSB7XG4gIC8vIFRPRE8ocGVyZik6IHVwZGF0ZSBgbm9kZXNgIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb2JqZWN0P1xuICB2YXIgbm9kZSA9IG5vZGVzWzBdO1xuICB2YXIgZW5kTm9kZSA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICB2YXIgYmxvY2tOb2RlcztcblxuICBmb3IgKHZhciBpID0gMTsgbm9kZSAhPT0gZW5kTm9kZSAmJiAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpOyBpKyspIHtcbiAgICBpZiAoYmxvY2tOb2RlcyB8fCBub2Rlc1tpXSAhPT0gbm9kZSkge1xuICAgICAgaWYgKCFibG9ja05vZGVzKSB7XG4gICAgICAgIGJsb2NrTm9kZXMgPSBqcUxpdGUoc2xpY2UuY2FsbChub2RlcywgMCwgaSkpO1xuICAgICAgfVxuICAgICAgYmxvY2tOb2Rlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBibG9ja05vZGVzIHx8IG5vZGVzO1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aG91dCBhIHByb3RvdHlwZS4gVGhpcyBvYmplY3QgaXMgdXNlZnVsIGZvciBsb29rdXAgd2l0aG91dCBoYXZpbmcgdG9cbiAqIGd1YXJkIGFnYWluc3QgcHJvdG90eXBpY2FsbHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgdmlhIGhhc093blByb3BlcnR5LlxuICpcbiAqIFJlbGF0ZWQgbWljcm8tYmVuY2htYXJrczpcbiAqIC0gaHR0cDovL2pzcGVyZi5jb20vb2JqZWN0LWNyZWF0ZTJcbiAqIC0gaHR0cDovL2pzcGVyZi5jb20vcHJvdG8tbWFwLWxvb2t1cC8yXG4gKiAtIGh0dHA6Ly9qc3BlcmYuY29tL2Zvci1pbi12cy1vYmplY3Qta2V5czJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBjcmVhdGVNYXAoKSB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHsgLy8gbnVsbCB8fCB1bmRlZmluZWRcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoaGFzQ3VzdG9tVG9TdHJpbmcodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHRvSnNvbih2YWx1ZSk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBOT0RFX1RZUEVfRUxFTUVOVCA9IDE7XG52YXIgTk9ERV9UWVBFX0FUVFJJQlVURSA9IDI7XG52YXIgTk9ERV9UWVBFX1RFWFQgPSAzO1xudmFyIE5PREVfVFlQRV9DT01NRU5UID0gODtcbnZhciBOT0RFX1RZUEVfRE9DVU1FTlQgPSA5O1xudmFyIE5PREVfVFlQRV9ET0NVTUVOVF9GUkFHTUVOVCA9IDExO1xuXG4vKipcbiAqIEBuZ2RvYyB0eXBlXG4gKiBAbmFtZSBhbmd1bGFyLk1vZHVsZVxuICogQG1vZHVsZSBuZ1xuICogQGRlc2NyaXB0aW9uXG4gKlxuICogSW50ZXJmYWNlIGZvciBjb25maWd1cmluZyBhbmd1bGFyIHtAbGluayBhbmd1bGFyLm1vZHVsZSBtb2R1bGVzfS5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cE1vZHVsZUxvYWRlcih3aW5kb3cpIHtcblxuICB2YXIgJGluamVjdG9yTWluRXJyID0gbWluRXJyKCckaW5qZWN0b3InKTtcbiAgdmFyIG5nTWluRXJyID0gbWluRXJyKCduZycpO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZShvYmosIG5hbWUsIGZhY3RvcnkpIHtcbiAgICByZXR1cm4gb2JqW25hbWVdIHx8IChvYmpbbmFtZV0gPSBmYWN0b3J5KCkpO1xuICB9XG5cbiAgdmFyIGFuZ3VsYXIgPSBlbnN1cmUod2luZG93LCAnYW5ndWxhcicsIE9iamVjdCk7XG5cbiAgLy8gV2UgbmVlZCB0byBleHBvc2UgYGFuZ3VsYXIuJCRtaW5FcnJgIHRvIG1vZHVsZXMgc3VjaCBhcyBgbmdSZXNvdXJjZWAgdGhhdCByZWZlcmVuY2UgaXQgZHVyaW5nIGJvb3RzdHJhcFxuICBhbmd1bGFyLiQkbWluRXJyID0gYW5ndWxhci4kJG1pbkVyciB8fCBtaW5FcnI7XG5cbiAgcmV0dXJuIGVuc3VyZShhbmd1bGFyLCAnbW9kdWxlJywgZnVuY3Rpb24oKSB7XG4gICAgLyoqIEB0eXBlIHtPYmplY3QuPHN0cmluZywgYW5ndWxhci5Nb2R1bGU+fSAqL1xuICAgIHZhciBtb2R1bGVzID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgZnVuY3Rpb25cbiAgICAgKiBAbmFtZSBhbmd1bGFyLm1vZHVsZVxuICAgICAqIEBtb2R1bGUgbmdcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKlxuICAgICAqIFRoZSBgYW5ndWxhci5tb2R1bGVgIGlzIGEgZ2xvYmFsIHBsYWNlIGZvciBjcmVhdGluZywgcmVnaXN0ZXJpbmcgYW5kIHJldHJpZXZpbmcgQW5ndWxhclxuICAgICAqIG1vZHVsZXMuXG4gICAgICogQWxsIG1vZHVsZXMgKGFuZ3VsYXIgY29yZSBvciAzcmQgcGFydHkpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSB0byBhbiBhcHBsaWNhdGlvbiBtdXN0IGJlXG4gICAgICogcmVnaXN0ZXJlZCB1c2luZyB0aGlzIG1lY2hhbmlzbS5cbiAgICAgKlxuICAgICAqIFBhc3Npbmcgb25lIGFyZ3VtZW50IHJldHJpZXZlcyBhbiBleGlzdGluZyB7QGxpbmsgYW5ndWxhci5Nb2R1bGV9LFxuICAgICAqIHdoZXJlYXMgcGFzc2luZyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGNyZWF0ZXMgYSBuZXcge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfVxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIE1vZHVsZVxuICAgICAqXG4gICAgICogQSBtb2R1bGUgaXMgYSBjb2xsZWN0aW9uIG9mIHNlcnZpY2VzLCBkaXJlY3RpdmVzLCBjb250cm9sbGVycywgZmlsdGVycywgYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uXG4gICAgICogYGFuZ3VsYXIubW9kdWxlYCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIENyZWF0ZSBhIG5ldyBtb2R1bGVcbiAgICAgKiB2YXIgbXlNb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlNb2R1bGUnLCBbXSk7XG4gICAgICpcbiAgICAgKiAvLyByZWdpc3RlciBhIG5ldyBzZXJ2aWNlXG4gICAgICogbXlNb2R1bGUudmFsdWUoJ2FwcE5hbWUnLCAnTXlDb29sQXBwJyk7XG4gICAgICpcbiAgICAgKiAvLyBjb25maWd1cmUgZXhpc3Rpbmcgc2VydmljZXMgaW5zaWRlIGluaXRpYWxpemF0aW9uIGJsb2Nrcy5cbiAgICAgKiBteU1vZHVsZS5jb25maWcoWyckbG9jYXRpb25Qcm92aWRlcicsIGZ1bmN0aW9uKCRsb2NhdGlvblByb3ZpZGVyKSB7XG4gICAgICogICAvLyBDb25maWd1cmUgZXhpc3RpbmcgcHJvdmlkZXJzXG4gICAgICogICAkbG9jYXRpb25Qcm92aWRlci5oYXNoUHJlZml4KCchJyk7XG4gICAgICogfV0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlbiB5b3UgY2FuIGNyZWF0ZSBhbiBpbmplY3RvciBhbmQgbG9hZCB5b3VyIG1vZHVsZXMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiB2YXIgaW5qZWN0b3IgPSBhbmd1bGFyLmluamVjdG9yKFsnbmcnLCAnbXlNb2R1bGUnXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEhvd2V2ZXIgaXQncyBtb3JlIGxpa2VseSB0aGF0IHlvdSdsbCBqdXN0IHVzZVxuICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdBcHAgbmdBcHB9IG9yXG4gICAgICoge0BsaW5rIGFuZ3VsYXIuYm9vdHN0cmFwfSB0byBzaW1wbGlmeSB0aGlzIHByb2Nlc3MgZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGNyZWF0ZSBvciByZXRyaWV2ZS5cbiAgICAgKiBAcGFyYW0geyFBcnJheS48c3RyaW5nPj19IHJlcXVpcmVzIElmIHNwZWNpZmllZCB0aGVuIG5ldyBtb2R1bGUgaXMgYmVpbmcgY3JlYXRlZC4gSWZcbiAgICAgKiAgICAgICAgdW5zcGVjaWZpZWQgdGhlbiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJldHJpZXZlZCBmb3IgZnVydGhlciBjb25maWd1cmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb249fSBjb25maWdGbiBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlLiBTYW1lIGFzXG4gICAgICogICAgICAgIHtAbGluayBhbmd1bGFyLk1vZHVsZSNjb25maWcgTW9kdWxlI2NvbmZpZygpfS5cbiAgICAgKiBAcmV0dXJucyB7YW5ndWxhci5Nb2R1bGV9IG5ldyBtb2R1bGUgd2l0aCB0aGUge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfSBhcGkuXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1vZHVsZShuYW1lLCByZXF1aXJlcywgY29uZmlnRm4pIHtcbiAgICAgIHZhciBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdoYXNPd25Qcm9wZXJ0eScpIHtcbiAgICAgICAgICB0aHJvdyBuZ01pbkVycignYmFkbmFtZScsICdoYXNPd25Qcm9wZXJ0eSBpcyBub3QgYSB2YWxpZCB7MH0gbmFtZScsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnbW9kdWxlJyk7XG4gICAgICBpZiAocmVxdWlyZXMgJiYgbW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBtb2R1bGVzW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnN1cmUobW9kdWxlcywgbmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghcmVxdWlyZXMpIHtcbiAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ25vbW9kJywgJ01vZHVsZSBcXCd7MH1cXCcgaXMgbm90IGF2YWlsYWJsZSEgWW91IGVpdGhlciBtaXNzcGVsbGVkICcgK1xuICAgICAgICAgICAgICd0aGUgbW9kdWxlIG5hbWUgb3IgZm9yZ290IHRvIGxvYWQgaXQuIElmIHJlZ2lzdGVyaW5nIGEgbW9kdWxlIGVuc3VyZSB0aGF0IHlvdSAnICtcbiAgICAgICAgICAgICAnc3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuJywgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogQHR5cGUgeyFBcnJheS48QXJyYXkuPCo+Pn0gKi9cbiAgICAgICAgdmFyIGludm9rZVF1ZXVlID0gW107XG5cbiAgICAgICAgLyoqIEB0eXBlIHshQXJyYXkuPEZ1bmN0aW9uPn0gKi9cbiAgICAgICAgdmFyIGNvbmZpZ0Jsb2NrcyA9IFtdO1xuXG4gICAgICAgIC8qKiBAdHlwZSB7IUFycmF5LjxGdW5jdGlvbj59ICovXG4gICAgICAgIHZhciBydW5CbG9ja3MgPSBbXTtcblxuICAgICAgICB2YXIgY29uZmlnID0gaW52b2tlTGF0ZXIoJyRpbmplY3RvcicsICdpbnZva2UnLCAncHVzaCcsIGNvbmZpZ0Jsb2Nrcyk7XG5cbiAgICAgICAgLyoqIEB0eXBlIHthbmd1bGFyLk1vZHVsZX0gKi9cbiAgICAgICAgdmFyIG1vZHVsZUluc3RhbmNlID0ge1xuICAgICAgICAgIC8vIFByaXZhdGUgc3RhdGVcbiAgICAgICAgICBfaW52b2tlUXVldWU6IGludm9rZVF1ZXVlLFxuICAgICAgICAgIF9jb25maWdCbG9ja3M6IGNvbmZpZ0Jsb2NrcyxcbiAgICAgICAgICBfcnVuQmxvY2tzOiBydW5CbG9ja3MsXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNyZXF1aXJlc1xuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIEhvbGRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgd2hpY2ggdGhlIGluamVjdG9yIHdpbGwgbG9hZCBiZWZvcmUgdGhlIGN1cnJlbnQgbW9kdWxlIGlzXG4gICAgICAgICAgICogbG9hZGVkLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHJlcXVpcmVzOiByZXF1aXJlcyxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eVxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI25hbWVcbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBOYW1lIG9mIHRoZSBtb2R1bGUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbmFtZTogbmFtZSxcblxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3Byb3ZpZGVyXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZVxuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyVHlwZSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGVcbiAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5cbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjcHJvdmlkZXIgJHByb3ZpZGUucHJvdmlkZXIoKX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgcHJvdmlkZXI6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJHByb3ZpZGUnLCAncHJvdmlkZXInKSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNmYWN0b3J5XG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHNlcnZpY2UgbmFtZVxuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByb3ZpZGVyRnVuY3Rpb24gRnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2VydmljZS5cbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSAkcHJvdmlkZS5mYWN0b3J5KCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZhY3Rvcnk6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJHByb3ZpZGUnLCAnZmFjdG9yeScpLFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI3NlcnZpY2VcbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lXG4gICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW5zdGFudGlhdGVkLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlICRwcm92aWRlLnNlcnZpY2UoKX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgc2VydmljZTogaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKCckcHJvdmlkZScsICdzZXJ2aWNlJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjdmFsdWVcbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgc2VydmljZSBuYW1lXG4gICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgU2VydmljZSBpbnN0YW5jZSBvYmplY3QuXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogU2VlIHtAbGluayBhdXRvLiRwcm92aWRlI3ZhbHVlICRwcm92aWRlLnZhbHVlKCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHZhbHVlOiBpbnZva2VMYXRlcignJHByb3ZpZGUnLCAndmFsdWUnKSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNjb25zdGFudFxuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBjb25zdGFudCBuYW1lXG4gICAgICAgICAgICogQHBhcmFtIHsqfSBvYmplY3QgQ29uc3RhbnQgdmFsdWUuXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogQmVjYXVzZSB0aGUgY29uc3RhbnRzIGFyZSBmaXhlZCwgdGhleSBnZXQgYXBwbGllZCBiZWZvcmUgb3RoZXIgcHJvdmlkZSBtZXRob2RzLlxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgYXV0by4kcHJvdmlkZSNjb25zdGFudCAkcHJvdmlkZS5jb25zdGFudCgpfS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdGFudDogaW52b2tlTGF0ZXIoJyRwcm92aWRlJywgJ2NvbnN0YW50JywgJ3Vuc2hpZnQnKSxcblxuICAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjZGVjb3JhdG9yXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGRlY29yYXRlLlxuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRlY29yRm4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgc2VydmljZSBuZWVkcyB0byBiZVxuICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkIGFuZCBzaG91bGQgcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc2VydmljZSBpbnN0YW5jZS5cbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIGF1dG8uJHByb3ZpZGUjZGVjb3JhdG9yICRwcm92aWRlLmRlY29yYXRvcigpfS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBkZWNvcmF0b3I6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJHByb3ZpZGUnLCAnZGVjb3JhdG9yJywgY29uZmlnQmxvY2tzKSxcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICAgKiBAbmFtZSBhbmd1bGFyLk1vZHVsZSNhbmltYXRpb25cbiAgICAgICAgICAgKiBAbW9kdWxlIG5nXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgYW5pbWF0aW9uIG5hbWVcbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhbmltYXRpb25GYWN0b3J5IEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiBhblxuICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqXG4gICAgICAgICAgICogKipOT1RFKio6IGFuaW1hdGlvbnMgdGFrZSBlZmZlY3Qgb25seSBpZiB0aGUgKipuZ0FuaW1hdGUqKiBtb2R1bGUgaXMgbG9hZGVkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEZWZpbmVzIGFuIGFuaW1hdGlvbiBob29rIHRoYXQgY2FuIGJlIGxhdGVyIHVzZWQgd2l0aFxuICAgICAgICAgICAqIHtAbGluayAkYW5pbWF0ZSAkYW5pbWF0ZX0gc2VydmljZSBhbmQgZGlyZWN0aXZlcyB0aGF0IHVzZSB0aGlzIHNlcnZpY2UuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBgYGBqc1xuICAgICAgICAgICAqIG1vZHVsZS5hbmltYXRpb24oJy5hbmltYXRpb24tbmFtZScsIGZ1bmN0aW9uKCRpbmplY3QxLCAkaW5qZWN0Mikge1xuICAgICAgICAgICAqICAgcmV0dXJuIHtcbiAgICAgICAgICAgKiAgICAgZXZlbnROYW1lIDogZnVuY3Rpb24oZWxlbWVudCwgZG9uZSkge1xuICAgICAgICAgICAqICAgICAgIC8vY29kZSB0byBydW4gdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAqICAgICAgIC8vb25jZSBjb21wbGV0ZSwgdGhlbiBydW4gZG9uZSgpXG4gICAgICAgICAgICogICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNhbmNlbGxhdGlvbkZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgKiAgICAgICAgIC8vY29kZSB0byBjYW5jZWwgdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAqICAgICAgIH1cbiAgICAgICAgICAgKiAgICAgfVxuICAgICAgICAgICAqICAgfVxuICAgICAgICAgICAqIH0pXG4gICAgICAgICAgICogYGBgXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRhbmltYXRlUHJvdmlkZXIjcmVnaXN0ZXIgJGFuaW1hdGVQcm92aWRlci5yZWdpc3RlcigpfSBhbmRcbiAgICAgICAgICAgKiB7QGxpbmsgbmdBbmltYXRlIG5nQW5pbWF0ZSBtb2R1bGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGFuaW1hdGlvbjogaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKCckYW5pbWF0ZVByb3ZpZGVyJywgJ3JlZ2lzdGVyJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjZmlsdGVyXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEZpbHRlciBuYW1lIC0gdGhpcyBtdXN0IGJlIGEgdmFsaWQgYW5ndWxhciBleHByZXNzaW9uIGlkZW50aWZpZXJcbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXJGYWN0b3J5IEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZSBvZiBmaWx0ZXIuXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogU2VlIHtAbGluayBuZy4kZmlsdGVyUHJvdmlkZXIjcmVnaXN0ZXIgJGZpbHRlclByb3ZpZGVyLnJlZ2lzdGVyKCl9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAgICAgICAgICAgKiAqKk5vdGU6KiogRmlsdGVyIG5hbWVzIG11c3QgYmUgdmFsaWQgYW5ndWxhciB7QGxpbmsgZXhwcmVzc2lvbn0gaWRlbnRpZmllcnMsIHN1Y2ggYXMgYHVwcGVyY2FzZWAgb3IgYG9yZGVyQnlgLlxuICAgICAgICAgICAqIE5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGh5cGhlbnMgYW5kIGRvdHMsIGFyZSBub3QgYWxsb3dlZC4gSWYgeW91IHdpc2ggdG8gbmFtZXNwYWNlXG4gICAgICAgICAgICogeW91ciBmaWx0ZXJzLCB0aGVuIHlvdSBjYW4gdXNlIGNhcGl0YWxpemF0aW9uIChgbXlhcHBTdWJzZWN0aW9uRmlsdGVyeGApIG9yIHVuZGVyc2NvcmVzXG4gICAgICAgICAgICogKGBteWFwcF9zdWJzZWN0aW9uX2ZpbHRlcnhgKS5cbiAgICAgICAgICAgKiA8L2Rpdj5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmaWx0ZXI6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJGZpbHRlclByb3ZpZGVyJywgJ3JlZ2lzdGVyJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29udHJvbGxlclxuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgQ29udHJvbGxlciBuYW1lLCBvciBhbiBvYmplY3QgbWFwIG9mIGNvbnRyb2xsZXJzIHdoZXJlIHRoZVxuICAgICAgICAgICAqICAgIGtleXMgYXJlIHRoZSBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGNvbnN0cnVjdG9ycy5cbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBDb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNyZWdpc3RlciAkY29udHJvbGxlclByb3ZpZGVyLnJlZ2lzdGVyKCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnRyb2xsZXI6IGludm9rZUxhdGVyQW5kU2V0TW9kdWxlTmFtZSgnJGNvbnRyb2xsZXJQcm92aWRlcicsICdyZWdpc3RlcicpLFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2RpcmVjdGl2ZVxuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IG5hbWUgRGlyZWN0aXZlIG5hbWUsIG9yIGFuIG9iamVjdCBtYXAgb2YgZGlyZWN0aXZlcyB3aGVyZSB0aGVcbiAgICAgICAgICAgKiAgICBrZXlzIGFyZSB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBmYWN0b3JpZXMuXG4gICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZGlyZWN0aXZlRmFjdG9yeSBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2Ugb2ZcbiAgICAgICAgICAgKiBkaXJlY3RpdmVzLlxuICAgICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgJGNvbXBpbGVQcm92aWRlci5kaXJlY3RpdmUoKX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgZGlyZWN0aXZlOiBpbnZva2VMYXRlckFuZFNldE1vZHVsZU5hbWUoJyRjb21waWxlUHJvdmlkZXInLCAnZGlyZWN0aXZlJyksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjY29tcG9uZW50XG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbiBjYW1lbC1jYXNlIChpLmUuIG15Q29tcCB3aGljaCB3aWxsIG1hdGNoIGFzIG15LWNvbXApXG4gICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQ29tcG9uZW50IGRlZmluaXRpb24gb2JqZWN0IChhIHNpbXBsaWZpZWRcbiAgICAgICAgICAgKiAgICB7QGxpbmsgbmcuJGNvbXBpbGUjZGlyZWN0aXZlLWRlZmluaXRpb24tb2JqZWN0IGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdH0pXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICAgKiBTZWUge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjY29tcG9uZW50ICRjb21waWxlUHJvdmlkZXIuY29tcG9uZW50KCl9LlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbXBvbmVudDogaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKCckY29tcGlsZVByb3ZpZGVyJywgJ2NvbXBvbmVudCcpLFxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICAgICAqIEBuYW1lIGFuZ3VsYXIuTW9kdWxlI2NvbmZpZ1xuICAgICAgICAgICAqIEBtb2R1bGUgbmdcbiAgICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25maWdGbiBFeGVjdXRlIHRoaXMgZnVuY3Rpb24gb24gbW9kdWxlIGxvYWQuIFVzZWZ1bCBmb3Igc2VydmljZVxuICAgICAgICAgICAqICAgIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHdvcmsgd2hpY2ggbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIG1vZHVsZSBsb2FkaW5nLlxuICAgICAgICAgICAqIEZvciBtb3JlIGFib3V0IGhvdyB0byBjb25maWd1cmUgc2VydmljZXMsIHNlZVxuICAgICAgICAgICAqIHtAbGluayBwcm92aWRlcnMjcHJvdmlkZXItcmVjaXBlIFByb3ZpZGVyIFJlY2lwZX0uXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uZmlnOiBjb25maWcsXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAgICogQG5hbWUgYW5ndWxhci5Nb2R1bGUjcnVuXG4gICAgICAgICAgICogQG1vZHVsZSBuZ1xuICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGluaXRpYWxpemF0aW9uRm4gRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIGFmdGVyIGluamVjdG9yIGNyZWF0aW9uLlxuICAgICAgICAgICAqICAgIFVzZWZ1bCBmb3IgYXBwbGljYXRpb24gaW5pdGlhbGl6YXRpb24uXG4gICAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHdvcmsgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBpbmplY3RvciBpcyBkb25lXG4gICAgICAgICAgICogbG9hZGluZyBhbGwgbW9kdWxlcy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBydW46IGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgICAgICAgICBydW5CbG9ja3MucHVzaChibG9jayk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZuKSB7XG4gICAgICAgICAgY29uZmlnKGNvbmZpZ0ZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtb2R1bGVJbnN0YW5jZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmc9fSBpbnNlcnRNZXRob2RcbiAgICAgICAgICogQHJldHVybnMge2FuZ3VsYXIuTW9kdWxlfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaW52b2tlTGF0ZXIocHJvdmlkZXIsIG1ldGhvZCwgaW5zZXJ0TWV0aG9kLCBxdWV1ZSkge1xuICAgICAgICAgIGlmICghcXVldWUpIHF1ZXVlID0gaW52b2tlUXVldWU7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcXVldWVbaW5zZXJ0TWV0aG9kIHx8ICdwdXNoJ10oW3Byb3ZpZGVyLCBtZXRob2QsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUluc3RhbmNlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAgICAgICAgICogQHJldHVybnMge2FuZ3VsYXIuTW9kdWxlfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaW52b2tlTGF0ZXJBbmRTZXRNb2R1bGVOYW1lKHByb3ZpZGVyLCBtZXRob2QsIHF1ZXVlKSB7XG4gICAgICAgICAgaWYgKCFxdWV1ZSkgcXVldWUgPSBpbnZva2VRdWV1ZTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ocmVjaXBlTmFtZSwgZmFjdG9yeUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZmFjdG9yeUZ1bmN0aW9uICYmIGlzRnVuY3Rpb24oZmFjdG9yeUZ1bmN0aW9uKSkgZmFjdG9yeUZ1bmN0aW9uLiQkbW9kdWxlTmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKFtwcm92aWRlciwgbWV0aG9kLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbnN0YW5jZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9KTtcblxufVxuXG4vKiBnbG9iYWwgc2hhbGxvd0NvcHk6IHRydWUgKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mIGFuIG9iamVjdCwgYW4gYXJyYXkgb3IgYSBwcmltaXRpdmUuXG4gKlxuICogQXNzdW1lcyB0aGF0IHRoZXJlIGFyZSBubyBwcm90byBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBzaGFsbG93Q29weShzcmMsIGRzdCkge1xuICBpZiAoaXNBcnJheShzcmMpKSB7XG4gICAgZHN0ID0gZHN0IHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGRzdFtpXSA9IHNyY1tpXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkge1xuICAgIGRzdCA9IGRzdCB8fCB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIGlmICghKGtleS5jaGFyQXQoMCkgPT09ICckJyAmJiBrZXkuY2hhckF0KDEpID09PSAnJCcpKSB7XG4gICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdCB8fCBzcmM7XG59XG5cbi8qIGdsb2JhbCB0b0RlYnVnU3RyaW5nOiB0cnVlICovXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZU9iamVjdChvYmopIHtcbiAgdmFyIHNlZW4gPSBbXTtcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrZXksIHZhbCkge1xuICAgIHZhbCA9IHRvSnNvblJlcGxhY2VyKGtleSwgdmFsKTtcbiAgICBpZiAoaXNPYmplY3QodmFsKSkge1xuXG4gICAgICBpZiAoc2Vlbi5pbmRleE9mKHZhbCkgPj0gMCkgcmV0dXJuICcuLi4nO1xuXG4gICAgICBzZWVuLnB1c2godmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGVidWdTdHJpbmcob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG9iai50b1N0cmluZygpLnJlcGxhY2UoLyBcXHtbXFxzXFxTXSokLywgJycpO1xuICB9IGVsc2UgaWYgKGlzVW5kZWZpbmVkKG9iaikpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc2VyaWFsaXplT2JqZWN0KG9iaik7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyogZ2xvYmFsIGFuZ3VsYXJNb2R1bGU6IHRydWUsXG4gIHZlcnNpb246IHRydWUsXG5cbiAgJENvbXBpbGVQcm92aWRlcixcblxuICBodG1sQW5jaG9yRGlyZWN0aXZlLFxuICBpbnB1dERpcmVjdGl2ZSxcbiAgaW5wdXREaXJlY3RpdmUsXG4gIGZvcm1EaXJlY3RpdmUsXG4gIHNjcmlwdERpcmVjdGl2ZSxcbiAgc2VsZWN0RGlyZWN0aXZlLFxuICBvcHRpb25EaXJlY3RpdmUsXG4gIG5nQmluZERpcmVjdGl2ZSxcbiAgbmdCaW5kSHRtbERpcmVjdGl2ZSxcbiAgbmdCaW5kVGVtcGxhdGVEaXJlY3RpdmUsXG4gIG5nQ2xhc3NEaXJlY3RpdmUsXG4gIG5nQ2xhc3NFdmVuRGlyZWN0aXZlLFxuICBuZ0NsYXNzT2RkRGlyZWN0aXZlLFxuICBuZ0Nsb2FrRGlyZWN0aXZlLFxuICBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIG5nRm9ybURpcmVjdGl2ZSxcbiAgbmdIaWRlRGlyZWN0aXZlLFxuICBuZ0lmRGlyZWN0aXZlLFxuICBuZ0luY2x1ZGVEaXJlY3RpdmUsXG4gIG5nSW5jbHVkZUZpbGxDb250ZW50RGlyZWN0aXZlLFxuICBuZ0luaXREaXJlY3RpdmUsXG4gIG5nTm9uQmluZGFibGVEaXJlY3RpdmUsXG4gIG5nUGx1cmFsaXplRGlyZWN0aXZlLFxuICBuZ1JlcGVhdERpcmVjdGl2ZSxcbiAgbmdTaG93RGlyZWN0aXZlLFxuICBuZ1N0eWxlRGlyZWN0aXZlLFxuICBuZ1N3aXRjaERpcmVjdGl2ZSxcbiAgbmdTd2l0Y2hXaGVuRGlyZWN0aXZlLFxuICBuZ1N3aXRjaERlZmF1bHREaXJlY3RpdmUsXG4gIG5nT3B0aW9uc0RpcmVjdGl2ZSxcbiAgbmdUcmFuc2NsdWRlRGlyZWN0aXZlLFxuICBuZ01vZGVsRGlyZWN0aXZlLFxuICBuZ0xpc3REaXJlY3RpdmUsXG4gIG5nQ2hhbmdlRGlyZWN0aXZlLFxuICBwYXR0ZXJuRGlyZWN0aXZlLFxuICBwYXR0ZXJuRGlyZWN0aXZlLFxuICByZXF1aXJlZERpcmVjdGl2ZSxcbiAgcmVxdWlyZWREaXJlY3RpdmUsXG4gIG1pbmxlbmd0aERpcmVjdGl2ZSxcbiAgbWlubGVuZ3RoRGlyZWN0aXZlLFxuICBtYXhsZW5ndGhEaXJlY3RpdmUsXG4gIG1heGxlbmd0aERpcmVjdGl2ZSxcbiAgbmdWYWx1ZURpcmVjdGl2ZSxcbiAgbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUsXG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzLFxuICBuZ0V2ZW50RGlyZWN0aXZlcyxcblxuICAkQW5jaG9yU2Nyb2xsUHJvdmlkZXIsXG4gICRBbmltYXRlUHJvdmlkZXIsXG4gICRDb3JlQW5pbWF0ZUNzc1Byb3ZpZGVyLFxuICAkJENvcmVBbmltYXRlSnNQcm92aWRlcixcbiAgJCRDb3JlQW5pbWF0ZVF1ZXVlUHJvdmlkZXIsXG4gICQkQW5pbWF0ZVJ1bm5lckZhY3RvcnlQcm92aWRlcixcbiAgJCRBbmltYXRlQXN5bmNSdW5GYWN0b3J5UHJvdmlkZXIsXG4gICRCcm93c2VyUHJvdmlkZXIsXG4gICRDYWNoZUZhY3RvcnlQcm92aWRlcixcbiAgJENvbnRyb2xsZXJQcm92aWRlcixcbiAgJERhdGVQcm92aWRlcixcbiAgJERvY3VtZW50UHJvdmlkZXIsXG4gICQkSXNEb2N1bWVudEhpZGRlblByb3ZpZGVyLFxuICAkRXhjZXB0aW9uSGFuZGxlclByb3ZpZGVyLFxuICAkRmlsdGVyUHJvdmlkZXIsXG4gICQkRm9yY2VSZWZsb3dQcm92aWRlcixcbiAgJEludGVycG9sYXRlUHJvdmlkZXIsXG4gICRJbnRlcnZhbFByb3ZpZGVyLFxuICAkJEhhc2hNYXBQcm92aWRlcixcbiAgJEh0dHBQcm92aWRlcixcbiAgJEh0dHBQYXJhbVNlcmlhbGl6ZXJQcm92aWRlcixcbiAgJEh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2VQcm92aWRlcixcbiAgJEh0dHBCYWNrZW5kUHJvdmlkZXIsXG4gICR4aHJGYWN0b3J5UHJvdmlkZXIsXG4gICRqc29ucENhbGxiYWNrc1Byb3ZpZGVyLFxuICAkTG9jYXRpb25Qcm92aWRlcixcbiAgJExvZ1Byb3ZpZGVyLFxuICAkUGFyc2VQcm92aWRlcixcbiAgJFJvb3RTY29wZVByb3ZpZGVyLFxuICAkUVByb3ZpZGVyLFxuICAkJFFQcm92aWRlcixcbiAgJCRTYW5pdGl6ZVVyaVByb3ZpZGVyLFxuICAkU2NlUHJvdmlkZXIsXG4gICRTY2VEZWxlZ2F0ZVByb3ZpZGVyLFxuICAkU25pZmZlclByb3ZpZGVyLFxuICAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyLFxuICAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIsXG4gICQkVGVzdGFiaWxpdHlQcm92aWRlcixcbiAgJFRpbWVvdXRQcm92aWRlcixcbiAgJCRSQUZQcm92aWRlcixcbiAgJFdpbmRvd1Byb3ZpZGVyLFxuICAkJGpxTGl0ZVByb3ZpZGVyLFxuICAkJENvb2tpZVJlYWRlclByb3ZpZGVyXG4qL1xuXG5cbi8qKlxuICogQG5nZG9jIG9iamVjdFxuICogQG5hbWUgYW5ndWxhci52ZXJzaW9uXG4gKiBAbW9kdWxlIG5nXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IEFuZ3VsYXJKUyB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgZnVsbGAg4oCTIGB7c3RyaW5nfWAg4oCTIEZ1bGwgdmVyc2lvbiBzdHJpbmcsIHN1Y2ggYXMgXCIwLjkuMThcIi5cbiAqIC0gYG1ham9yYCDigJMgYHtudW1iZXJ9YCDigJMgTWFqb3IgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgXCIwXCIuXG4gKiAtIGBtaW5vcmAg4oCTIGB7bnVtYmVyfWAg4oCTIE1pbm9yIHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIFwiOVwiLlxuICogLSBgZG90YCDigJMgYHtudW1iZXJ9YCDigJMgRG90IHZlcnNpb24gbnVtYmVyLCBzdWNoIGFzIFwiMThcIi5cbiAqIC0gYGNvZGVOYW1lYCDigJMgYHtzdHJpbmd9YCDigJMgQ29kZSBuYW1lIG9mIHRoZSByZWxlYXNlLCBzdWNoIGFzIFwiamlnZ2xpbmctYXJtZmF0XCIuXG4gKi9cbnZhciB2ZXJzaW9uID0ge1xuICAvLyBUaGVzZSBwbGFjZWhvbGRlciBzdHJpbmdzIHdpbGwgYmUgcmVwbGFjZWQgYnkgZ3J1bnQncyBgYnVpbGRgIHRhc2suXG4gIC8vIFRoZXkgbmVlZCB0byBiZSBkb3VibGUtIG9yIHNpbmdsZS1xdW90ZWQuXG4gIGZ1bGw6ICcxLjYuMCcsXG4gIG1ham9yOiAxLFxuICBtaW5vcjogNixcbiAgZG90OiAwLFxuICBjb2RlTmFtZTogJ3JhaW5ib3ctdHN1bmFtaSdcbn07XG5cblxuZnVuY3Rpb24gcHVibGlzaEV4dGVybmFsQVBJKGFuZ3VsYXIpIHtcbiAgZXh0ZW5kKGFuZ3VsYXIsIHtcbiAgICAnYm9vdHN0cmFwJzogYm9vdHN0cmFwLFxuICAgICdjb3B5JzogY29weSxcbiAgICAnZXh0ZW5kJzogZXh0ZW5kLFxuICAgICdtZXJnZSc6IG1lcmdlLFxuICAgICdlcXVhbHMnOiBlcXVhbHMsXG4gICAgJ2VsZW1lbnQnOiBqcUxpdGUsXG4gICAgJ2ZvckVhY2gnOiBmb3JFYWNoLFxuICAgICdpbmplY3Rvcic6IGNyZWF0ZUluamVjdG9yLFxuICAgICdub29wJzogbm9vcCxcbiAgICAnYmluZCc6IGJpbmQsXG4gICAgJ3RvSnNvbic6IHRvSnNvbixcbiAgICAnZnJvbUpzb24nOiBmcm9tSnNvbixcbiAgICAnaWRlbnRpdHknOiBpZGVudGl0eSxcbiAgICAnaXNVbmRlZmluZWQnOiBpc1VuZGVmaW5lZCxcbiAgICAnaXNEZWZpbmVkJzogaXNEZWZpbmVkLFxuICAgICdpc1N0cmluZyc6IGlzU3RyaW5nLFxuICAgICdpc0Z1bmN0aW9uJzogaXNGdW5jdGlvbixcbiAgICAnaXNPYmplY3QnOiBpc09iamVjdCxcbiAgICAnaXNOdW1iZXInOiBpc051bWJlcixcbiAgICAnaXNFbGVtZW50JzogaXNFbGVtZW50LFxuICAgICdpc0FycmF5JzogaXNBcnJheSxcbiAgICAndmVyc2lvbic6IHZlcnNpb24sXG4gICAgJ2lzRGF0ZSc6IGlzRGF0ZSxcbiAgICAnbG93ZXJjYXNlJzogbG93ZXJjYXNlLFxuICAgICd1cHBlcmNhc2UnOiB1cHBlcmNhc2UsXG4gICAgJ2NhbGxiYWNrcyc6IHskJGNvdW50ZXI6IDB9LFxuICAgICdnZXRUZXN0YWJpbGl0eSc6IGdldFRlc3RhYmlsaXR5LFxuICAgICdyZWxvYWRXaXRoRGVidWdJbmZvJzogcmVsb2FkV2l0aERlYnVnSW5mbyxcbiAgICAnJCRtaW5FcnInOiBtaW5FcnIsXG4gICAgJyQkY3NwJzogY3NwLFxuICAgICckJGVuY29kZVVyaVNlZ21lbnQnOiBlbmNvZGVVcmlTZWdtZW50LFxuICAgICckJGVuY29kZVVyaVF1ZXJ5JzogZW5jb2RlVXJpUXVlcnksXG4gICAgJyQkc3RyaW5naWZ5Jzogc3RyaW5naWZ5XG4gIH0pO1xuXG4gIGFuZ3VsYXJNb2R1bGUgPSBzZXR1cE1vZHVsZUxvYWRlcih3aW5kb3cpO1xuXG4gIGFuZ3VsYXJNb2R1bGUoJ25nJywgWyduZ0xvY2FsZSddLCBbJyRwcm92aWRlJyxcbiAgICBmdW5jdGlvbiBuZ01vZHVsZSgkcHJvdmlkZSkge1xuICAgICAgLy8gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyIG5lZWRzIHRvIGJlIGJlZm9yZSAkY29tcGlsZVByb3ZpZGVyIGFzIGl0IGlzIHVzZWQgYnkgaXQuXG4gICAgICAkcHJvdmlkZS5wcm92aWRlcih7XG4gICAgICAgICQkc2FuaXRpemVVcmk6ICQkU2FuaXRpemVVcmlQcm92aWRlclxuICAgICAgfSk7XG4gICAgICAkcHJvdmlkZS5wcm92aWRlcignJGNvbXBpbGUnLCAkQ29tcGlsZVByb3ZpZGVyKS5cbiAgICAgICAgZGlyZWN0aXZlKHtcbiAgICAgICAgICAgIGE6IGh0bWxBbmNob3JEaXJlY3RpdmUsXG4gICAgICAgICAgICBpbnB1dDogaW5wdXREaXJlY3RpdmUsXG4gICAgICAgICAgICB0ZXh0YXJlYTogaW5wdXREaXJlY3RpdmUsXG4gICAgICAgICAgICBmb3JtOiBmb3JtRGlyZWN0aXZlLFxuICAgICAgICAgICAgc2NyaXB0OiBzY3JpcHREaXJlY3RpdmUsXG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG9wdGlvbjogb3B0aW9uRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdCaW5kOiBuZ0JpbmREaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0JpbmRIdG1sOiBuZ0JpbmRIdG1sRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdCaW5kVGVtcGxhdGU6IG5nQmluZFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdDbGFzczogbmdDbGFzc0RpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nQ2xhc3NFdmVuOiBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nQ2xhc3NPZGQ6IG5nQ2xhc3NPZGREaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0Nsb2FrOiBuZ0Nsb2FrRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdDb250cm9sbGVyOiBuZ0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0Zvcm06IG5nRm9ybURpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nSGlkZTogbmdIaWRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdJZjogbmdJZkRpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nSW5jbHVkZTogbmdJbmNsdWRlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdJbml0OiBuZ0luaXREaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ05vbkJpbmRhYmxlOiBuZ05vbkJpbmRhYmxlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdQbHVyYWxpemU6IG5nUGx1cmFsaXplRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdSZXBlYXQ6IG5nUmVwZWF0RGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdTaG93OiBuZ1Nob3dEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ1N0eWxlOiBuZ1N0eWxlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdTd2l0Y2g6IG5nU3dpdGNoRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdTd2l0Y2hXaGVuOiBuZ1N3aXRjaFdoZW5EaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ1N3aXRjaERlZmF1bHQ6IG5nU3dpdGNoRGVmYXVsdERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nT3B0aW9uczogbmdPcHRpb25zRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdUcmFuc2NsdWRlOiBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ01vZGVsOiBuZ01vZGVsRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdMaXN0OiBuZ0xpc3REaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ0NoYW5nZTogbmdDaGFuZ2VEaXJlY3RpdmUsXG4gICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdQYXR0ZXJuOiBwYXR0ZXJuRGlyZWN0aXZlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdSZXF1aXJlZDogcmVxdWlyZWREaXJlY3RpdmUsXG4gICAgICAgICAgICBtaW5sZW5ndGg6IG1pbmxlbmd0aERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nTWlubGVuZ3RoOiBtaW5sZW5ndGhEaXJlY3RpdmUsXG4gICAgICAgICAgICBtYXhsZW5ndGg6IG1heGxlbmd0aERpcmVjdGl2ZSxcbiAgICAgICAgICAgIG5nTWF4bGVuZ3RoOiBtYXhsZW5ndGhEaXJlY3RpdmUsXG4gICAgICAgICAgICBuZ1ZhbHVlOiBuZ1ZhbHVlRGlyZWN0aXZlLFxuICAgICAgICAgICAgbmdNb2RlbE9wdGlvbnM6IG5nTW9kZWxPcHRpb25zRGlyZWN0aXZlXG4gICAgICAgIH0pLlxuICAgICAgICBkaXJlY3RpdmUoe1xuICAgICAgICAgIG5nSW5jbHVkZTogbmdJbmNsdWRlRmlsbENvbnRlbnREaXJlY3RpdmVcbiAgICAgICAgfSkuXG4gICAgICAgIGRpcmVjdGl2ZShuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcykuXG4gICAgICAgIGRpcmVjdGl2ZShuZ0V2ZW50RGlyZWN0aXZlcyk7XG4gICAgICAkcHJvdmlkZS5wcm92aWRlcih7XG4gICAgICAgICRhbmNob3JTY3JvbGw6ICRBbmNob3JTY3JvbGxQcm92aWRlcixcbiAgICAgICAgJGFuaW1hdGU6ICRBbmltYXRlUHJvdmlkZXIsXG4gICAgICAgICRhbmltYXRlQ3NzOiAkQ29yZUFuaW1hdGVDc3NQcm92aWRlcixcbiAgICAgICAgJCRhbmltYXRlSnM6ICQkQ29yZUFuaW1hdGVKc1Byb3ZpZGVyLFxuICAgICAgICAkJGFuaW1hdGVRdWV1ZTogJCRDb3JlQW5pbWF0ZVF1ZXVlUHJvdmlkZXIsXG4gICAgICAgICQkQW5pbWF0ZVJ1bm5lcjogJCRBbmltYXRlUnVubmVyRmFjdG9yeVByb3ZpZGVyLFxuICAgICAgICAkJGFuaW1hdGVBc3luY1J1bjogJCRBbmltYXRlQXN5bmNSdW5GYWN0b3J5UHJvdmlkZXIsXG4gICAgICAgICRicm93c2VyOiAkQnJvd3NlclByb3ZpZGVyLFxuICAgICAgICAkY2FjaGVGYWN0b3J5OiAkQ2FjaGVGYWN0b3J5UHJvdmlkZXIsXG4gICAgICAgICRjb250cm9sbGVyOiAkQ29udHJvbGxlclByb3ZpZGVyLFxuICAgICAgICAkZG9jdW1lbnQ6ICREb2N1bWVudFByb3ZpZGVyLFxuICAgICAgICAkJGlzRG9jdW1lbnRIaWRkZW46ICQkSXNEb2N1bWVudEhpZGRlblByb3ZpZGVyLFxuICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcjogJEV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlcixcbiAgICAgICAgJGZpbHRlcjogJEZpbHRlclByb3ZpZGVyLFxuICAgICAgICAkJGZvcmNlUmVmbG93OiAkJEZvcmNlUmVmbG93UHJvdmlkZXIsXG4gICAgICAgICRpbnRlcnBvbGF0ZTogJEludGVycG9sYXRlUHJvdmlkZXIsXG4gICAgICAgICRpbnRlcnZhbDogJEludGVydmFsUHJvdmlkZXIsXG4gICAgICAgICRodHRwOiAkSHR0cFByb3ZpZGVyLFxuICAgICAgICAkaHR0cFBhcmFtU2VyaWFsaXplcjogJEh0dHBQYXJhbVNlcmlhbGl6ZXJQcm92aWRlcixcbiAgICAgICAgJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2U6ICRIdHRwUGFyYW1TZXJpYWxpemVySlFMaWtlUHJvdmlkZXIsXG4gICAgICAgICRodHRwQmFja2VuZDogJEh0dHBCYWNrZW5kUHJvdmlkZXIsXG4gICAgICAgICR4aHJGYWN0b3J5OiAkeGhyRmFjdG9yeVByb3ZpZGVyLFxuICAgICAgICAkanNvbnBDYWxsYmFja3M6ICRqc29ucENhbGxiYWNrc1Byb3ZpZGVyLFxuICAgICAgICAkbG9jYXRpb246ICRMb2NhdGlvblByb3ZpZGVyLFxuICAgICAgICAkbG9nOiAkTG9nUHJvdmlkZXIsXG4gICAgICAgICRwYXJzZTogJFBhcnNlUHJvdmlkZXIsXG4gICAgICAgICRyb290U2NvcGU6ICRSb290U2NvcGVQcm92aWRlcixcbiAgICAgICAgJHE6ICRRUHJvdmlkZXIsXG4gICAgICAgICQkcTogJCRRUHJvdmlkZXIsXG4gICAgICAgICRzY2U6ICRTY2VQcm92aWRlcixcbiAgICAgICAgJHNjZURlbGVnYXRlOiAkU2NlRGVsZWdhdGVQcm92aWRlcixcbiAgICAgICAgJHNuaWZmZXI6ICRTbmlmZmVyUHJvdmlkZXIsXG4gICAgICAgICR0ZW1wbGF0ZUNhY2hlOiAkVGVtcGxhdGVDYWNoZVByb3ZpZGVyLFxuICAgICAgICAkdGVtcGxhdGVSZXF1ZXN0OiAkVGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIsXG4gICAgICAgICQkdGVzdGFiaWxpdHk6ICQkVGVzdGFiaWxpdHlQcm92aWRlcixcbiAgICAgICAgJHRpbWVvdXQ6ICRUaW1lb3V0UHJvdmlkZXIsXG4gICAgICAgICR3aW5kb3c6ICRXaW5kb3dQcm92aWRlcixcbiAgICAgICAgJCRyQUY6ICQkUkFGUHJvdmlkZXIsXG4gICAgICAgICQkanFMaXRlOiAkJGpxTGl0ZVByb3ZpZGVyLFxuICAgICAgICAkJEhhc2hNYXA6ICQkSGFzaE1hcFByb3ZpZGVyLFxuICAgICAgICAkJGNvb2tpZVJlYWRlcjogJCRDb29raWVSZWFkZXJQcm92aWRlclxuICAgICAgfSk7XG4gICAgfVxuICBdKTtcbn1cblxuLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKlxuICogICAgIEFueSBjb21taXRzIHRvIHRoaXMgZmlsZSBzaG91bGQgYmUgcmV2aWV3ZWQgd2l0aCBzZWN1cml0eSBpbiBtaW5kLiAgKlxuICogICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBjYW4gcG90ZW50aWFsbHkgY3JlYXRlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gKlxuICogICAgICAgICAgQW4gYXBwcm92YWwgZnJvbSAyIENvcmUgbWVtYmVycyB3aXRoIGhpc3Rvcnkgb2YgbW9kaWZ5aW5nICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlIGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogIERvZXMgdGhlIGNoYW5nZSBzb21laG93IGFsbG93IGZvciBhcmJpdHJhcnkgamF2YXNjcmlwdCB0byBiZSBleGVjdXRlZD8gKlxuICogICAgT3IgYWxsb3dzIGZvciBzb21lb25lIHRvIGNoYW5nZSB0aGUgcHJvdG90eXBlIG9mIGJ1aWx0LWluIG9iamVjdHM/ICAgKlxuICogICAgIE9yIGdpdmVzIHVuZGVzaXJlZCBhY2Nlc3MgdG8gdmFyaWFibGVzIGxpa2VzIGRvY3VtZW50IG9yIHdpbmRvdz8gICAgKlxuICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi9cblxuLyogZ2xvYmFsXG4gIEpRTGl0ZVByb3RvdHlwZTogdHJ1ZSxcbiAgQk9PTEVBTl9BVFRSOiB0cnVlLFxuICBBTElBU0VEX0FUVFI6IHRydWVcbiovXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vSlFMaXRlXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQG5nZG9jIGZ1bmN0aW9uXG4gKiBAbmFtZSBhbmd1bGFyLmVsZW1lbnRcbiAqIEBtb2R1bGUgbmdcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBXcmFwcyBhIHJhdyBET00gZWxlbWVudCBvciBIVE1MIHN0cmluZyBhcyBhIFtqUXVlcnldKGh0dHA6Ly9qcXVlcnkuY29tKSBlbGVtZW50LlxuICpcbiAqIElmIGpRdWVyeSBpcyBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgIGlzIGFuIGFsaWFzIGZvciB0aGVcbiAqIFtqUXVlcnldKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9qUXVlcnkvKSBmdW5jdGlvbi4gSWYgalF1ZXJ5IGlzIG5vdCBhdmFpbGFibGUsIGBhbmd1bGFyLmVsZW1lbnRgXG4gKiBkZWxlZ2F0ZXMgdG8gQW5ndWxhcidzIGJ1aWx0LWluIHN1YnNldCBvZiBqUXVlcnksIGNhbGxlZCBcImpRdWVyeSBsaXRlXCIgb3IgKipqcUxpdGUqKi5cbiAqXG4gKiBqcUxpdGUgaXMgYSB0aW55LCBBUEktY29tcGF0aWJsZSBzdWJzZXQgb2YgalF1ZXJ5IHRoYXQgYWxsb3dzXG4gKiBBbmd1bGFyIHRvIG1hbmlwdWxhdGUgdGhlIERPTSBpbiBhIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJsZSB3YXkuIGpxTGl0ZSBpbXBsZW1lbnRzIG9ubHkgdGhlIG1vc3RcbiAqIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgaGF2aW5nIGEgdmVyeSBzbWFsbCBmb290cHJpbnQuXG4gKlxuICogVG8gdXNlIGBqUXVlcnlgLCBzaW1wbHkgZW5zdXJlIGl0IGlzIGxvYWRlZCBiZWZvcmUgdGhlIGBhbmd1bGFyLmpzYCBmaWxlLiBZb3UgY2FuIGFsc28gdXNlIHRoZVxuICoge0BsaW5rIG5nSnEgYG5nSnFgfSBkaXJlY3RpdmUgdG8gc3BlY2lmeSB0aGF0IGpxbGl0ZSBzaG91bGQgYmUgdXNlZCBvdmVyIGpRdWVyeSwgb3IgdG8gdXNlIGFcbiAqIHNwZWNpZmljIHZlcnNpb24gb2YgalF1ZXJ5IGlmIG11bHRpcGxlIHZlcnNpb25zIGV4aXN0IG9uIHRoZSBwYWdlLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+KipOb3RlOioqIEFsbCBlbGVtZW50IHJlZmVyZW5jZXMgaW4gQW5ndWxhciBhcmUgYWx3YXlzIHdyYXBwZWQgd2l0aCBqUXVlcnkgb3JcbiAqIGpxTGl0ZSAoc3VjaCBhcyB0aGUgZWxlbWVudCBhcmd1bWVudCBpbiBhIGRpcmVjdGl2ZSdzIGNvbXBpbGUgLyBsaW5rIGZ1bmN0aW9uKS4gVGhleSBhcmUgbmV2ZXIgcmF3IERPTSByZWZlcmVuY2VzLjwvZGl2PlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+KipOb3RlOioqIEtlZXAgaW4gbWluZCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZmluZCBlbGVtZW50c1xuICogYnkgdGFnIG5hbWUgLyBDU1Mgc2VsZWN0b3IuIEZvciBsb29rdXBzIGJ5IHRhZyBuYW1lLCB0cnkgaW5zdGVhZCBgYW5ndWxhci5lbGVtZW50KGRvY3VtZW50KS5maW5kKC4uLilgXG4gKiBvciBgJGRvY3VtZW50LmZpbmQoKWAsIG9yIHVzZSB0aGUgc3RhbmRhcmQgRE9NIEFQSXMsIGUuZy4gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKWAuPC9kaXY+XG4gKlxuICogIyMgQW5ndWxhcidzIGpxTGl0ZVxuICoganFMaXRlIHByb3ZpZGVzIG9ubHkgdGhlIGZvbGxvd2luZyBqUXVlcnkgbWV0aG9kczpcbiAqXG4gKiAtIFtgYWRkQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hZGRDbGFzcy8pIC0gRG9lcyBub3Qgc3VwcG9ydCBhIGZ1bmN0aW9uIGFzIGZpcnN0IGFyZ3VtZW50XG4gKiAtIFtgYWZ0ZXIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9hZnRlci8pXG4gKiAtIFtgYXBwZW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYXBwZW5kLylcbiAqIC0gW2BhdHRyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vYXR0ci8pIC0gRG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbnMgYXMgcGFyYW1ldGVyc1xuICogLSBbYGJpbmQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9iaW5kLykgKF9kZXByZWNhdGVkXywgdXNlIFtgb24oKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9vbi8pKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YVxuICogLSBbYGNoaWxkcmVuKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY2hpbGRyZW4vKSAtIERvZXMgbm90IHN1cHBvcnQgc2VsZWN0b3JzXG4gKiAtIFtgY2xvbmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jbG9uZS8pXG4gKiAtIFtgY29udGVudHMoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9jb250ZW50cy8pXG4gKiAtIFtgY3NzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vY3NzLykgLSBPbmx5IHJldHJpZXZlcyBpbmxpbmUtc3R5bGVzLCBkb2VzIG5vdCBjYWxsIGBnZXRDb21wdXRlZFN0eWxlKClgLlxuICogICBBcyBhIHNldHRlciwgZG9lcyBub3QgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ3Mgb3IgYXBwZW5kICdweCcsIGFuZCBhbHNvIGRvZXMgbm90IGhhdmUgYXV0b21hdGljIHByb3BlcnR5IHByZWZpeGluZy5cbiAqIC0gW2BkYXRhKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZGF0YS8pXG4gKiAtIFtgZGV0YWNoKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZGV0YWNoLylcbiAqIC0gW2BlbXB0eSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VtcHR5LylcbiAqIC0gW2BlcSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2VxLylcbiAqIC0gW2BmaW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vZmluZC8pIC0gTGltaXRlZCB0byBsb29rdXBzIGJ5IHRhZyBuYW1lXG4gKiAtIFtgaGFzQ2xhc3MoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9oYXNDbGFzcy8pXG4gKiAtIFtgaHRtbCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL2h0bWwvKVxuICogLSBbYG5leHQoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9uZXh0LykgLSBEb2VzIG5vdCBzdXBwb3J0IHNlbGVjdG9yc1xuICogLSBbYG9uKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vb24vKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcywgc2VsZWN0b3JzIG9yIGV2ZW50RGF0YVxuICogLSBbYG9mZigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29mZi8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzLCBzZWxlY3RvcnMgb3IgZXZlbnQgb2JqZWN0IGFzIHBhcmFtZXRlclxuICogLSBbYG9uZSgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29uZS8pIC0gRG9lcyBub3Qgc3VwcG9ydCBuYW1lc3BhY2VzIG9yIHNlbGVjdG9yc1xuICogLSBbYHBhcmVudCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3BhcmVudC8pIC0gRG9lcyBub3Qgc3VwcG9ydCBzZWxlY3RvcnNcbiAqIC0gW2BwcmVwZW5kKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcHJlcGVuZC8pXG4gKiAtIFtgcHJvcCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3Byb3AvKVxuICogLSBbYHJlYWR5KClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVhZHkvKSAoX2RlcHJlY2F0ZWRfLCB1c2UgYGFuZ3VsYXIuZWxlbWVudChjYWxsYmFjaylgIGluc3RlYWQgb2YgYGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkucmVhZHkoY2FsbGJhY2spYClcbiAqIC0gW2ByZW1vdmUoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmUvKVxuICogLSBbYHJlbW92ZUF0dHIoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZW1vdmVBdHRyLykgLSBEb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGF0dHJpYnV0ZXNcbiAqIC0gW2ByZW1vdmVDbGFzcygpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3JlbW92ZUNsYXNzLykgLSBEb2VzIG5vdCBzdXBwb3J0IGEgZnVuY3Rpb24gYXMgZmlyc3QgYXJndW1lbnRcbiAqIC0gW2ByZW1vdmVEYXRhKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vcmVtb3ZlRGF0YS8pXG4gKiAtIFtgcmVwbGFjZVdpdGgoKWBdKGh0dHA6Ly9hcGkuanF1ZXJ5LmNvbS9yZXBsYWNlV2l0aC8pXG4gKiAtIFtgdGV4dCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3RleHQvKVxuICogLSBbYHRvZ2dsZUNsYXNzKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdG9nZ2xlQ2xhc3MvKSAtIERvZXMgbm90IHN1cHBvcnQgYSBmdW5jdGlvbiBhcyBmaXJzdCBhcmd1bWVudFxuICogLSBbYHRyaWdnZXJIYW5kbGVyKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdHJpZ2dlckhhbmRsZXIvKSAtIFBhc3NlcyBhIGR1bW15IGV2ZW50IG9iamVjdCB0byBoYW5kbGVyc1xuICogLSBbYHVuYmluZCgpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL3VuYmluZC8pIChfZGVwcmVjYXRlZF8sIHVzZSBbYG9mZigpYF0oaHR0cDovL2FwaS5qcXVlcnkuY29tL29mZi8pKSAtIERvZXMgbm90IHN1cHBvcnQgbmFtZXNwYWNlcyBvciBldmVudCBvYmplY3QgYXMgcGFyYW1ldGVyXG4gKiAtIFtgdmFsKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vdmFsLylcbiAqIC0gW2B3cmFwKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vd3JhcC8pXG4gKlxuICogIyMgalF1ZXJ5L2pxTGl0ZSBFeHRyYXNcbiAqIEFuZ3VsYXIgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgZXZlbnRzIHRvIGJvdGggalF1ZXJ5IGFuZCBqcUxpdGU6XG4gKlxuICogIyMjIEV2ZW50c1xuICogLSBgJGRlc3Ryb3lgIC0gQW5ndWxhckpTIGludGVyY2VwdHMgYWxsIGpxTGl0ZS9qUXVlcnkncyBET00gZGVzdHJ1Y3Rpb24gYXBpcyBhbmQgZmlyZXMgdGhpcyBldmVudFxuICogICAgb24gYWxsIERPTSBub2RlcyBiZWluZyByZW1vdmVkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjbGVhbiB1cCBhbnkgM3JkIHBhcnR5IGJpbmRpbmdzIHRvIHRoZSBET01cbiAqICAgIGVsZW1lbnQgYmVmb3JlIGl0IGlzIHJlbW92ZWQuXG4gKlxuICogIyMjIE1ldGhvZHNcbiAqIC0gYGNvbnRyb2xsZXIobmFtZSlgIC0gcmV0cmlldmVzIHRoZSBjb250cm9sbGVyIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgaXRzIHBhcmVudC4gQnkgZGVmYXVsdFxuICogICByZXRyaWV2ZXMgY29udHJvbGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGBuZ0NvbnRyb2xsZXJgIGRpcmVjdGl2ZS4gSWYgYG5hbWVgIGlzIHByb3ZpZGVkIGFzXG4gKiAgIGNhbWVsQ2FzZSBkaXJlY3RpdmUgbmFtZSwgdGhlbiB0aGUgY29udHJvbGxlciBmb3IgdGhpcyBkaXJlY3RpdmUgd2lsbCBiZSByZXRyaWV2ZWQgKGUuZy5cbiAqICAgYCduZ01vZGVsJ2ApLlxuICogLSBgaW5qZWN0b3IoKWAgLSByZXRyaWV2ZXMgdGhlIGluamVjdG9yIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgaXRzIHBhcmVudC5cbiAqIC0gYHNjb3BlKClgIC0gcmV0cmlldmVzIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0gb2YgdGhlIGN1cnJlbnRcbiAqICAgZWxlbWVudCBvciBpdHMgcGFyZW50LiBSZXF1aXJlcyB7QGxpbmsgZ3VpZGUvcHJvZHVjdGlvbiNkaXNhYmxpbmctZGVidWctZGF0YSBEZWJ1ZyBEYXRhfSB0b1xuICogICBiZSBlbmFibGVkLlxuICogLSBgaXNvbGF0ZVNjb3BlKClgIC0gcmV0cmlldmVzIGFuIGlzb2xhdGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgc2NvcGV9IGlmIG9uZSBpcyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGVcbiAqICAgY3VycmVudCBlbGVtZW50LiBUaGlzIGdldHRlciBzaG91bGQgYmUgdXNlZCBvbmx5IG9uIGVsZW1lbnRzIHRoYXQgY29udGFpbiBhIGRpcmVjdGl2ZSB3aGljaCBzdGFydHMgYSBuZXcgaXNvbGF0ZVxuICogICBzY29wZS4gQ2FsbGluZyBgc2NvcGUoKWAgb24gdGhpcyBlbGVtZW50IGFsd2F5cyByZXR1cm5zIHRoZSBvcmlnaW5hbCBub24taXNvbGF0ZSBzY29wZS5cbiAqICAgUmVxdWlyZXMge0BsaW5rIGd1aWRlL3Byb2R1Y3Rpb24jZGlzYWJsaW5nLWRlYnVnLWRhdGEgRGVidWcgRGF0YX0gdG8gYmUgZW5hYmxlZC5cbiAqIC0gYGluaGVyaXRlZERhdGEoKWAgLSBzYW1lIGFzIGBkYXRhKClgLCBidXQgd2Fsa3MgdXAgdGhlIERPTSB1bnRpbCBhIHZhbHVlIGlzIGZvdW5kIG9yIHRoZSB0b3BcbiAqICAgcGFyZW50IGVsZW1lbnQgaXMgcmVhY2hlZC5cbiAqXG4gKiBAa25vd25Jc3N1ZSBZb3UgY2Fubm90IHNweSBvbiBgYW5ndWxhci5lbGVtZW50YCBpZiB5b3UgYXJlIHVzaW5nIEphc21pbmUgdmVyc2lvbiAxLnguIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTQyNTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RE9NRWxlbWVudH0gZWxlbWVudCBIVE1MIHN0cmluZyBvciBET01FbGVtZW50IHRvIGJlIHdyYXBwZWQgaW50byBqUXVlcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBqUXVlcnkgb2JqZWN0LlxuICovXG5cbkpRTGl0ZS5leHBhbmRvID0gJ25nMzM5JztcblxudmFyIGpxQ2FjaGUgPSBKUUxpdGUuY2FjaGUgPSB7fSxcbiAgICBqcUlkID0gMTtcblxuLypcbiAqICEhISBUaGlzIGlzIGFuIHVuZG9jdW1lbnRlZCBcInByaXZhdGVcIiBmdW5jdGlvbiAhISFcbiAqL1xuSlFMaXRlLl9kYXRhID0gZnVuY3Rpb24obm9kZSkge1xuICAvL2pRdWVyeSBhbHdheXMgcmV0dXJucyBhbiBvYmplY3Qgb24gY2FjaGUgbWlzc1xuICByZXR1cm4gdGhpcy5jYWNoZVtub2RlW3RoaXMuZXhwYW5kb11dIHx8IHt9O1xufTtcblxuZnVuY3Rpb24ganFOZXh0SWQoKSB7IHJldHVybiArK2pxSWQ7IH1cblxuXG52YXIgREFTSF9MT1dFUkNBU0VfUkVHRVhQID0gLy0oW2Etel0pL2c7XG52YXIgTVNfSEFDS19SRUdFWFAgPSAvXi1tcy0vO1xudmFyIE1PVVNFX0VWRU5UX01BUCA9IHsgbW91c2VsZWF2ZTogJ21vdXNlb3V0JywgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicgfTtcbnZhciBqcUxpdGVNaW5FcnIgPSBtaW5FcnIoJ2pxTGl0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGtlYmFiLWNhc2UgdG8gY2FtZWxDYXNlLlxuICogVGhlcmUgaXMgYWxzbyBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlIG1zIHByZWZpeCBzdGFydGluZyB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gbm9ybWFsaXplXG4gKi9cbmZ1bmN0aW9uIGNzc0tlYmFiVG9DYW1lbChuYW1lKSB7XG4gICAgcmV0dXJuIGtlYmFiVG9DYW1lbChuYW1lLnJlcGxhY2UoTVNfSEFDS19SRUdFWFAsICdtcy0nKSk7XG59XG5cbmZ1bmN0aW9uIGZuQ2FtZWxDYXNlUmVwbGFjZShhbGwsIGxldHRlcikge1xuICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQ29udmVydHMga2ViYWItY2FzZSB0byBjYW1lbENhc2UuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIHRvIG5vcm1hbGl6ZVxuICovXG5mdW5jdGlvbiBrZWJhYlRvQ2FtZWwobmFtZSkge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKERBU0hfTE9XRVJDQVNFX1JFR0VYUCwgZm5DYW1lbENhc2VSZXBsYWNlKTtcbn1cblxudmFyIFNJTkdMRV9UQUdfUkVHRVhQID0gL148KFtcXHctXSspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvO1xudmFyIEhUTUxfUkVHRVhQID0gLzx8JiM/XFx3KzsvO1xudmFyIFRBR19OQU1FX1JFR0VYUCA9IC88KFtcXHc6LV0rKS87XG52YXIgWEhUTUxfVEFHX1JFR0VYUCA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6LV0rKVtePl0qKVxcLz4vZ2k7XG5cbnZhciB3cmFwTWFwID0ge1xuICAnb3B0aW9uJzogWzEsICc8c2VsZWN0IG11bHRpcGxlPVwibXVsdGlwbGVcIj4nLCAnPC9zZWxlY3Q+J10sXG5cbiAgJ3RoZWFkJzogWzEsICc8dGFibGU+JywgJzwvdGFibGU+J10sXG4gICdjb2wnOiBbMiwgJzx0YWJsZT48Y29sZ3JvdXA+JywgJzwvY29sZ3JvdXA+PC90YWJsZT4nXSxcbiAgJ3RyJzogWzIsICc8dGFibGU+PHRib2R5PicsICc8L3Rib2R5PjwvdGFibGU+J10sXG4gICd0ZCc6IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddLFxuICAnX2RlZmF1bHQnOiBbMCwgJycsICcnXVxufTtcblxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG5cbmZ1bmN0aW9uIGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkge1xuICByZXR1cm4gIUhUTUxfUkVHRVhQLnRlc3QoaHRtbCk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZUFjY2VwdHNEYXRhKG5vZGUpIHtcbiAgLy8gVGhlIHdpbmRvdyBvYmplY3QgY2FuIGFjY2VwdCBkYXRhIGJ1dCBoYXMgbm8gbm9kZVR5cGVcbiAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZWxlbWVudHMgKDEpIGFuZCBkb2N1bWVudHMgKDkpXG4gIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gIHJldHVybiBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQgfHwgIW5vZGVUeXBlIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRE9DVU1FTlQ7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZUhhc0RhdGEobm9kZSkge1xuICBmb3IgKHZhciBrZXkgaW4ganFDYWNoZVtub2RlLm5nMzM5XSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24ganFMaXRlQ2xlYW5EYXRhKG5vZGVzKSB7XG4gIGZvciAodmFyIGkgPSAwLCBpaSA9IG5vZGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICBqcUxpdGVSZW1vdmVEYXRhKG5vZGVzW2ldKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBqcUxpdGVCdWlsZEZyYWdtZW50KGh0bWwsIGNvbnRleHQpIHtcbiAgdmFyIHRtcCwgdGFnLCB3cmFwLFxuICAgICAgZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgIG5vZGVzID0gW10sIGk7XG5cbiAgaWYgKGpxTGl0ZUlzVGV4dE5vZGUoaHRtbCkpIHtcbiAgICAvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcbiAgICBub2Rlcy5wdXNoKGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoaHRtbCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuICAgIHRtcCA9IGZyYWdtZW50LmFwcGVuZENoaWxkKGNvbnRleHQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgIHRhZyA9IChUQUdfTkFNRV9SRUdFWFAuZXhlYyhodG1sKSB8fCBbJycsICcnXSlbMV0udG9Mb3dlckNhc2UoKTtcbiAgICB3cmFwID0gd3JhcE1hcFt0YWddIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG4gICAgdG1wLmlubmVySFRNTCA9IHdyYXBbMV0gKyBodG1sLnJlcGxhY2UoWEhUTUxfVEFHX1JFR0VYUCwgJzwkMT48LyQyPicpICsgd3JhcFsyXTtcblxuICAgIC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuICAgIGkgPSB3cmFwWzBdO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgbm9kZXMgPSBjb25jYXQobm9kZXMsIHRtcC5jaGlsZE5vZGVzKTtcblxuICAgIHRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG4gICAgdG1wLnRleHRDb250ZW50ID0gJyc7XG4gIH1cblxuICAvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG4gIGZyYWdtZW50LnRleHRDb250ZW50ID0gJyc7XG4gIGZyYWdtZW50LmlubmVySFRNTCA9ICcnOyAvLyBDbGVhciBpbm5lciBIVE1MXG4gIGZvckVhY2gobm9kZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBqcUxpdGVQYXJzZUhUTUwoaHRtbCwgY29udGV4dCkge1xuICBjb250ZXh0ID0gY29udGV4dCB8fCB3aW5kb3cuZG9jdW1lbnQ7XG4gIHZhciBwYXJzZWQ7XG5cbiAgaWYgKChwYXJzZWQgPSBTSU5HTEVfVEFHX1JFR0VYUC5leGVjKGh0bWwpKSkge1xuICAgIHJldHVybiBbY29udGV4dC5jcmVhdGVFbGVtZW50KHBhcnNlZFsxXSldO1xuICB9XG5cbiAgaWYgKChwYXJzZWQgPSBqcUxpdGVCdWlsZEZyYWdtZW50KGh0bWwsIGNvbnRleHQpKSkge1xuICAgIHJldHVybiBwYXJzZWQuY2hpbGROb2RlcztcbiAgfVxuXG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24ganFMaXRlV3JhcE5vZGUobm9kZSwgd3JhcHBlcikge1xuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gIGlmIChwYXJlbnQpIHtcbiAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHdyYXBwZXIsIG5vZGUpO1xuICB9XG5cbiAgd3JhcHBlci5hcHBlbmRDaGlsZChub2RlKTtcbn1cblxuXG4vLyBJRTktMTEgaGFzIG5vIG1ldGhvZCBcImNvbnRhaW5zXCIgaW4gU1ZHIGVsZW1lbnQgYW5kIGluIE5vZGUucHJvdG90eXBlLiBCdWcgIzEwMjU5LlxudmFyIGpxTGl0ZUNvbnRhaW5zID0gd2luZG93Lk5vZGUucHJvdG90eXBlLmNvbnRhaW5zIHx8IC8qKiBAdGhpcyAqLyBmdW5jdGlvbihhcmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuICEhKHRoaXMuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYXJnKSAmIDE2KTtcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gSlFMaXRlKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKUUxpdGUpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHZhciBhcmdJc1N0cmluZztcblxuICBpZiAoaXNTdHJpbmcoZWxlbWVudCkpIHtcbiAgICBlbGVtZW50ID0gdHJpbShlbGVtZW50KTtcbiAgICBhcmdJc1N0cmluZyA9IHRydWU7XG4gIH1cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEpRTGl0ZSkpIHtcbiAgICBpZiAoYXJnSXNTdHJpbmcgJiYgZWxlbWVudC5jaGFyQXQoMCkgIT09ICc8Jykge1xuICAgICAgdGhyb3cganFMaXRlTWluRXJyKCdub3NlbCcsICdMb29raW5nIHVwIGVsZW1lbnRzIHZpYSBzZWxlY3RvcnMgaXMgbm90IHN1cHBvcnRlZCBieSBqcUxpdGUhIFNlZTogaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvYW5ndWxhci5lbGVtZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSlFMaXRlKGVsZW1lbnQpO1xuICB9XG5cbiAgaWYgKGFyZ0lzU3RyaW5nKSB7XG4gICAganFMaXRlQWRkTm9kZXModGhpcywganFMaXRlUGFyc2VIVE1MKGVsZW1lbnQpKTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGVsZW1lbnQpKSB7XG4gICAganFMaXRlUmVhZHkoZWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAganFMaXRlQWRkTm9kZXModGhpcywgZWxlbWVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlQ2xvbmUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZURlYWxvYyhlbGVtZW50LCBvbmx5RGVzY2VuZGFudHMpIHtcbiAgaWYgKCFvbmx5RGVzY2VuZGFudHMpIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCk7XG5cbiAgaWYgKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gZGVzY2VuZGFudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBqcUxpdGVSZW1vdmVEYXRhKGRlc2NlbmRhbnRzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlT2ZmKGVsZW1lbnQsIHR5cGUsIGZuLCB1bnN1cHBvcnRlZCkge1xuICBpZiAoaXNEZWZpbmVkKHVuc3VwcG9ydGVkKSkgdGhyb3cganFMaXRlTWluRXJyKCdvZmZhcmdzJywgJ2pxTGl0ZSNvZmYoKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIGFyZ3VtZW50Jyk7XG5cbiAgdmFyIGV4cGFuZG9TdG9yZSA9IGpxTGl0ZUV4cGFuZG9TdG9yZShlbGVtZW50KTtcbiAgdmFyIGV2ZW50cyA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZXZlbnRzO1xuICB2YXIgaGFuZGxlID0gZXhwYW5kb1N0b3JlICYmIGV4cGFuZG9TdG9yZS5oYW5kbGU7XG5cbiAgaWYgKCFoYW5kbGUpIHJldHVybjsgLy9ubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZFxuXG4gIGlmICghdHlwZSkge1xuICAgIGZvciAodHlwZSBpbiBldmVudHMpIHtcbiAgICAgIGlmICh0eXBlICE9PSAnJGRlc3Ryb3knKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICB9XG4gIH0gZWxzZSB7XG5cbiAgICB2YXIgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lckZucyA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChpc0RlZmluZWQoZm4pKSB7XG4gICAgICAgIGFycmF5UmVtb3ZlKGxpc3RlbmVyRm5zIHx8IFtdLCBmbik7XG4gICAgICB9XG4gICAgICBpZiAoIShpc0RlZmluZWQoZm4pICYmIGxpc3RlbmVyRm5zICYmIGxpc3RlbmVyRm5zLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGUpO1xuICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3JFYWNoKHR5cGUuc3BsaXQoJyAnKSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgcmVtb3ZlSGFuZGxlcih0eXBlKTtcbiAgICAgIGlmIChNT1VTRV9FVkVOVF9NQVBbdHlwZV0pIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihNT1VTRV9FVkVOVF9NQVBbdHlwZV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZURhdGEoZWxlbWVudCwgbmFtZSkge1xuICB2YXIgZXhwYW5kb0lkID0gZWxlbWVudC5uZzMzOTtcbiAgdmFyIGV4cGFuZG9TdG9yZSA9IGV4cGFuZG9JZCAmJiBqcUNhY2hlW2V4cGFuZG9JZF07XG5cbiAgaWYgKGV4cGFuZG9TdG9yZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBkZWxldGUgZXhwYW5kb1N0b3JlLmRhdGFbbmFtZV07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4cGFuZG9TdG9yZS5oYW5kbGUpIHtcbiAgICAgIGlmIChleHBhbmRvU3RvcmUuZXZlbnRzLiRkZXN0cm95KSB7XG4gICAgICAgIGV4cGFuZG9TdG9yZS5oYW5kbGUoe30sICckZGVzdHJveScpO1xuICAgICAgfVxuICAgICAganFMaXRlT2ZmKGVsZW1lbnQpO1xuICAgIH1cbiAgICBkZWxldGUganFDYWNoZVtleHBhbmRvSWRdO1xuICAgIGVsZW1lbnQubmczMzkgPSB1bmRlZmluZWQ7IC8vIGRvbid0IGRlbGV0ZSBET00gZXhwYW5kb3MuIElFIGFuZCBDaHJvbWUgZG9uJ3QgbGlrZSBpdFxuICB9XG59XG5cblxuZnVuY3Rpb24ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIGNyZWF0ZUlmTmVjZXNzYXJ5KSB7XG4gIHZhciBleHBhbmRvSWQgPSBlbGVtZW50Lm5nMzM5LFxuICAgICAgZXhwYW5kb1N0b3JlID0gZXhwYW5kb0lkICYmIGpxQ2FjaGVbZXhwYW5kb0lkXTtcblxuICBpZiAoY3JlYXRlSWZOZWNlc3NhcnkgJiYgIWV4cGFuZG9TdG9yZSkge1xuICAgIGVsZW1lbnQubmczMzkgPSBleHBhbmRvSWQgPSBqcU5leHRJZCgpO1xuICAgIGV4cGFuZG9TdG9yZSA9IGpxQ2FjaGVbZXhwYW5kb0lkXSA9IHtldmVudHM6IHt9LCBkYXRhOiB7fSwgaGFuZGxlOiB1bmRlZmluZWR9O1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZG9TdG9yZTtcbn1cblxuXG5mdW5jdGlvbiBqcUxpdGVEYXRhKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGpxTGl0ZUFjY2VwdHNEYXRhKGVsZW1lbnQpKSB7XG4gICAgdmFyIHByb3A7XG5cbiAgICB2YXIgaXNTaW1wbGVTZXR0ZXIgPSBpc0RlZmluZWQodmFsdWUpO1xuICAgIHZhciBpc1NpbXBsZUdldHRlciA9ICFpc1NpbXBsZVNldHRlciAmJiBrZXkgJiYgIWlzT2JqZWN0KGtleSk7XG4gICAgdmFyIG1hc3NHZXR0ZXIgPSAha2V5O1xuICAgIHZhciBleHBhbmRvU3RvcmUgPSBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCwgIWlzU2ltcGxlR2V0dGVyKTtcbiAgICB2YXIgZGF0YSA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZGF0YTtcblxuICAgIGlmIChpc1NpbXBsZVNldHRlcikgeyAvLyBkYXRhKCdrZXknLCB2YWx1ZSlcbiAgICAgIGRhdGFba2ViYWJUb0NhbWVsKGtleSldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYXNzR2V0dGVyKSB7ICAvLyBkYXRhKClcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTaW1wbGVHZXR0ZXIpIHsgLy8gZGF0YSgna2V5JylcbiAgICAgICAgICAvLyBkb24ndCBmb3JjZSBjcmVhdGlvbiBvZiBleHBhbmRvU3RvcmUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXRcbiAgICAgICAgICByZXR1cm4gZGF0YSAmJiBkYXRhW2tlYmFiVG9DYW1lbChrZXkpXTtcbiAgICAgICAgfSBlbHNlIHsgLy8gbWFzcy1zZXR0ZXI6IGRhdGEoe2tleTE6IHZhbDEsIGtleTI6IHZhbDJ9KVxuICAgICAgICAgIGZvciAocHJvcCBpbiBrZXkpIHtcbiAgICAgICAgICAgIGRhdGFba2ViYWJUb0NhbWVsKHByb3ApXSA9IGtleVtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlSGFzQ2xhc3MoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgaWYgKCFlbGVtZW50LmdldEF0dHJpYnV0ZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKCgnICcgKyAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgJyAnKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCAnICcpLlxuICAgICAgaW5kZXhPZignICcgKyBzZWxlY3RvciArICcgJykgPiAtMSk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZVJlbW92ZUNsYXNzKGVsZW1lbnQsIGNzc0NsYXNzZXMpIHtcbiAgaWYgKGNzc0NsYXNzZXMgJiYgZWxlbWVudC5zZXRBdHRyaWJ1dGUpIHtcbiAgICBmb3JFYWNoKGNzc0NsYXNzZXMuc3BsaXQoJyAnKSwgZnVuY3Rpb24oY3NzQ2xhc3MpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHRyaW0oXG4gICAgICAgICAgKCcgJyArIChlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoL1tcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAucmVwbGFjZSgnICcgKyB0cmltKGNzc0NsYXNzKSArICcgJywgJyAnKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlQWRkQ2xhc3MoZWxlbWVudCwgY3NzQ2xhc3Nlcykge1xuICBpZiAoY3NzQ2xhc3NlcyAmJiBlbGVtZW50LnNldEF0dHJpYnV0ZSkge1xuICAgIHZhciBleGlzdGluZ0NsYXNzZXMgPSAoJyAnICsgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIHx8ICcnKSArICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcblxcdF0vZywgJyAnKTtcblxuICAgIGZvckVhY2goY3NzQ2xhc3Nlcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjc3NDbGFzcykge1xuICAgICAgY3NzQ2xhc3MgPSB0cmltKGNzc0NsYXNzKTtcbiAgICAgIGlmIChleGlzdGluZ0NsYXNzZXMuaW5kZXhPZignICcgKyBjc3NDbGFzcyArICcgJykgPT09IC0xKSB7XG4gICAgICAgIGV4aXN0aW5nQ2xhc3NlcyArPSBjc3NDbGFzcyArICcgJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIHRyaW0oZXhpc3RpbmdDbGFzc2VzKSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBqcUxpdGVBZGROb2Rlcyhyb290LCBlbGVtZW50cykge1xuICAvLyBUSElTIENPREUgSVMgVkVSWSBIT1QuIERvbid0IG1ha2UgY2hhbmdlcyB3aXRob3V0IGJlbmNobWFya2luZy5cblxuICBpZiAoZWxlbWVudHMpIHtcblxuICAgIC8vIGlmIGEgTm9kZSAodGhlIG1vc3QgY29tbW9uIGNhc2UpXG4gICAgaWYgKGVsZW1lbnRzLm5vZGVUeXBlKSB7XG4gICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgIC8vIGlmIGFuIEFycmF5IG9yIE5vZGVMaXN0IGFuZCBub3QgYSBXaW5kb3dcbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJyAmJiBlbGVtZW50cy53aW5kb3cgIT09IGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb290W3Jvb3QubGVuZ3RoKytdID0gZWxlbWVudHM7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuZnVuY3Rpb24ganFMaXRlQ29udHJvbGxlcihlbGVtZW50LCBuYW1lKSB7XG4gIHJldHVybiBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQsICckJyArIChuYW1lIHx8ICduZ0NvbnRyb2xsZXInKSArICdDb250cm9sbGVyJyk7XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZUluaGVyaXRlZERhdGEoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcbiAgLy8gaWYgZWxlbWVudCBpcyB0aGUgZG9jdW1lbnQgb2JqZWN0IHdvcmsgd2l0aCB0aGUgaHRtbCBlbGVtZW50IGluc3RlYWRcbiAgLy8gdGhpcyBtYWtlcyAkKGRvY3VtZW50KS5zY29wZSgpIHBvc3NpYmxlXG4gIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOT0RFX1RZUEVfRE9DVU1FTlQpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgdmFyIG5hbWVzID0gaXNBcnJheShuYW1lKSA/IG5hbWUgOiBbbmFtZV07XG5cbiAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBuYW1lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlID0ganFMaXRlLmRhdGEoZWxlbWVudCwgbmFtZXNbaV0pKSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIGRlYWxpbmcgd2l0aCBhIGRvY3VtZW50IGZyYWdtZW50IG5vZGUgd2l0aCBhIGhvc3QgZWxlbWVudCwgYW5kIG5vIHBhcmVudCwgdXNlIHRoZSBob3N0XG4gICAgLy8gZWxlbWVudCBhcyB0aGUgcGFyZW50LiBUaGlzIGVuYWJsZXMgZGlyZWN0aXZlcyB3aXRoaW4gYSBTaGFkb3cgRE9NIG9yIHBvbHlmaWxsZWQgU2hhZG93IERPTVxuICAgIC8vIHRvIGxvb2t1cCBwYXJlbnQgY29udHJvbGxlcnMuXG4gICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSB8fCAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UICYmIGVsZW1lbnQuaG9zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlRW1wdHkoZWxlbWVudCkge1xuICBqcUxpdGVEZWFsb2MoZWxlbWVudCwgdHJ1ZSk7XG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ganFMaXRlUmVtb3ZlKGVsZW1lbnQsIGtlZXBEYXRhKSB7XG4gIGlmICgha2VlcERhdGEpIGpxTGl0ZURlYWxvYyhlbGVtZW50KTtcbiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xufVxuXG5cbmZ1bmN0aW9uIGpxTGl0ZURvY3VtZW50TG9hZGVkKGFjdGlvbiwgd2luKSB7XG4gIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG4gIGlmICh3aW4uZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgIC8vIEZvcmNlIHRoZSBhY3Rpb24gdG8gYmUgcnVuIGFzeW5jIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgLy8gZnJvbSB0aGUgYWN0aW9uJ3MgcG9pbnQgb2Ygdmlld1xuICAgIC8vIGkuZS4gaXQgd2lsbCBkZWZpbml0ZWx5IG5vdCBiZSBpbiBhICRhcHBseVxuICAgIHdpbi5zZXRUaW1lb3V0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gbmVlZCB0byB1bmJpbmQgdGhpcyBoYW5kbGVyIGFzIGxvYWQgaXMgb25seSBldmVyIGNhbGxlZCBvbmNlXG4gICAganFMaXRlKHdpbikub24oJ2xvYWQnLCBhY3Rpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGpxTGl0ZVJlYWR5KGZuKSB7XG4gIGZ1bmN0aW9uIHRyaWdnZXIoKSB7XG4gICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0cmlnZ2VyKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRyaWdnZXIpO1xuICAgIGZuKCk7XG4gIH1cblxuICAvLyBjaGVjayBpZiBkb2N1bWVudCBpcyBhbHJlYWR5IGxvYWRlZFxuICBpZiAod2luZG93LmRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICB3aW5kb3cuc2V0VGltZW91dChmbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIG5vdCB1c2UganFMaXRlIHNpbmNlIHdlIGFyZSBub3QgZG9uZSBsb2FkaW5nIGFuZCBqUXVlcnkgY291bGQgYmUgbG9hZGVkIGxhdGVyLlxuXG4gICAgLy8gV29ya3MgZm9yIG1vZGVybiBicm93c2VycyBhbmQgSUU5XG4gICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0cmlnZ2VyKTtcblxuICAgIC8vIEZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQgZm9yIG90aGVyc1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdHJpZ2dlcik7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBGdW5jdGlvbnMgd2hpY2ggYXJlIGRlY2xhcmVkIGRpcmVjdGx5LlxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG52YXIgSlFMaXRlUHJvdG90eXBlID0gSlFMaXRlLnByb3RvdHlwZSA9IHtcbiAgcmVhZHk6IGpxTGl0ZVJlYWR5LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gW107XG4gICAgZm9yRWFjaCh0aGlzLCBmdW5jdGlvbihlKSB7IHZhbHVlLnB1c2goJycgKyBlKTt9KTtcbiAgICByZXR1cm4gJ1snICsgdmFsdWUuam9pbignLCAnKSArICddJztcbiAgfSxcblxuICBlcTogZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIHJldHVybiAoaW5kZXggPj0gMCkgPyBqcUxpdGUodGhpc1tpbmRleF0pIDoganFMaXRlKHRoaXNbdGhpcy5sZW5ndGggKyBpbmRleF0pO1xuICB9LFxuXG4gIGxlbmd0aDogMCxcbiAgcHVzaDogcHVzaCxcbiAgc29ydDogW10uc29ydCxcbiAgc3BsaWNlOiBbXS5zcGxpY2Vcbn07XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyBnZXR0ZXIvc2V0dGVycy5cbi8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gc2VsZiBvbiBzZXR0ZXIgYW5kXG4vLyB2YWx1ZSBvbiBnZXQuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbnZhciBCT09MRUFOX0FUVFIgPSB7fTtcbmZvckVhY2goJ211bHRpcGxlLHNlbGVjdGVkLGNoZWNrZWQsZGlzYWJsZWQscmVhZE9ubHkscmVxdWlyZWQsb3Blbicuc3BsaXQoJywnKSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgQk9PTEVBTl9BVFRSW2xvd2VyY2FzZSh2YWx1ZSldID0gdmFsdWU7XG59KTtcbnZhciBCT09MRUFOX0VMRU1FTlRTID0ge307XG5mb3JFYWNoKCdpbnB1dCxzZWxlY3Qsb3B0aW9uLHRleHRhcmVhLGJ1dHRvbixmb3JtLGRldGFpbHMnLnNwbGl0KCcsJyksIGZ1bmN0aW9uKHZhbHVlKSB7XG4gIEJPT0xFQU5fRUxFTUVOVFNbdmFsdWVdID0gdHJ1ZTtcbn0pO1xudmFyIEFMSUFTRURfQVRUUiA9IHtcbiAgJ25nTWlubGVuZ3RoJzogJ21pbmxlbmd0aCcsXG4gICduZ01heGxlbmd0aCc6ICdtYXhsZW5ndGgnLFxuICAnbmdNaW4nOiAnbWluJyxcbiAgJ25nTWF4JzogJ21heCcsXG4gICduZ1BhdHRlcm4nOiAncGF0dGVybicsXG4gICduZ1N0ZXAnOiAnc3RlcCdcbn07XG5cbmZ1bmN0aW9uIGdldEJvb2xlYW5BdHRyTmFtZShlbGVtZW50LCBuYW1lKSB7XG4gIC8vIGNoZWNrIGRvbSBsYXN0IHNpbmNlIHdlIHdpbGwgbW9zdCBsaWtlbHkgZmFpbCBvbiBuYW1lXG4gIHZhciBib29sZWFuQXR0ciA9IEJPT0xFQU5fQVRUUltuYW1lLnRvTG93ZXJDYXNlKCldO1xuXG4gIC8vIGJvb2xlYW5BdHRyIGlzIGhlcmUgdHdpY2UgdG8gbWluaW1pemUgRE9NIGFjY2Vzc1xuICByZXR1cm4gYm9vbGVhbkF0dHIgJiYgQk9PTEVBTl9FTEVNRU5UU1tub2RlTmFtZV8oZWxlbWVudCldICYmIGJvb2xlYW5BdHRyO1xufVxuXG5mdW5jdGlvbiBnZXRBbGlhc2VkQXR0ck5hbWUobmFtZSkge1xuICByZXR1cm4gQUxJQVNFRF9BVFRSW25hbWVdO1xufVxuXG5mb3JFYWNoKHtcbiAgZGF0YToganFMaXRlRGF0YSxcbiAgcmVtb3ZlRGF0YToganFMaXRlUmVtb3ZlRGF0YSxcbiAgaGFzRGF0YToganFMaXRlSGFzRGF0YSxcbiAgY2xlYW5EYXRhOiBqcUxpdGVDbGVhbkRhdGFcbn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7XG4gIEpRTGl0ZVtuYW1lXSA9IGZuO1xufSk7XG5cbmZvckVhY2goe1xuICBkYXRhOiBqcUxpdGVEYXRhLFxuICBpbmhlcml0ZWREYXRhOiBqcUxpdGVJbmhlcml0ZWREYXRhLFxuXG4gIHNjb3BlOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgLy8gQ2FuJ3QgdXNlIGpxTGl0ZURhdGEgaGVyZSBkaXJlY3RseSBzbyB3ZSBzdGF5IGNvbXBhdGlibGUgd2l0aCBqUXVlcnkhXG4gICAgcmV0dXJuIGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckc2NvcGUnKSB8fCBqcUxpdGVJbmhlcml0ZWREYXRhKGVsZW1lbnQucGFyZW50Tm9kZSB8fCBlbGVtZW50LCBbJyRpc29sYXRlU2NvcGUnLCAnJHNjb3BlJ10pO1xuICB9LFxuXG4gIGlzb2xhdGVTY29wZTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIC8vIENhbid0IHVzZSBqcUxpdGVEYXRhIGhlcmUgZGlyZWN0bHkgc28gd2Ugc3RheSBjb21wYXRpYmxlIHdpdGggalF1ZXJ5IVxuICAgIHJldHVybiBqcUxpdGUuZGF0YShlbGVtZW50LCAnJGlzb2xhdGVTY29wZScpIHx8IGpxTGl0ZS5kYXRhKGVsZW1lbnQsICckaXNvbGF0ZVNjb3BlTm9UZW1wbGF0ZScpO1xuICB9LFxuXG4gIGNvbnRyb2xsZXI6IGpxTGl0ZUNvbnRyb2xsZXIsXG5cbiAgaW5qZWN0b3I6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByZXR1cm4ganFMaXRlSW5oZXJpdGVkRGF0YShlbGVtZW50LCAnJGluamVjdG9yJyk7XG4gIH0sXG5cbiAgcmVtb3ZlQXR0cjogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9LFxuXG4gIGhhc0NsYXNzOiBqcUxpdGVIYXNDbGFzcyxcblxuICBjc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IGNzc0tlYmFiVG9DYW1lbChuYW1lKTtcblxuICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICBlbGVtZW50LnN0eWxlW25hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnN0eWxlW25hbWVdO1xuICAgIH1cbiAgfSxcblxuICBhdHRyOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciByZXQ7XG4gICAgdmFyIG5vZGVUeXBlID0gZWxlbWVudC5ub2RlVHlwZTtcbiAgICBpZiAobm9kZVR5cGUgPT09IE5PREVfVFlQRV9URVhUIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfQVRUUklCVVRFIHx8IG5vZGVUeXBlID09PSBOT0RFX1RZUEVfQ09NTUVOVCB8fFxuICAgICAgIWVsZW1lbnQuZ2V0QXR0cmlidXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyY2FzZWROYW1lID0gbG93ZXJjYXNlKG5hbWUpO1xuICAgIHZhciBpc0Jvb2xlYW5BdHRyID0gQk9PTEVBTl9BVFRSW2xvd2VyY2FzZWROYW1lXTtcblxuICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAvLyBzZXR0ZXJcblxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8ICh2YWx1ZSA9PT0gZmFsc2UgJiYgaXNCb29sZWFuQXR0cikpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBpc0Jvb2xlYW5BdHRyID8gbG93ZXJjYXNlZE5hbWUgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGdldHRlclxuXG4gICAgICByZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgaWYgKGlzQm9vbGVhbkF0dHIgJiYgcmV0ICE9PSBudWxsKSB7XG4gICAgICAgIHJldCA9IGxvd2VyY2FzZWROYW1lO1xuICAgICAgfVxuICAgICAgLy8gTm9ybWFsaXplIG5vbi1leGlzdGluZyBhdHRyaWJ1dGVzIHRvIHVuZGVmaW5lZCAoYXMgalF1ZXJ5KS5cbiAgICAgIHJldHVybiByZXQgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG4gICAgfVxuICB9LFxuXG4gIHByb3A6IGZ1bmN0aW9uKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGVsZW1lbnRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnRbbmFtZV07XG4gICAgfVxuICB9LFxuXG4gIHRleHQ6IChmdW5jdGlvbigpIHtcbiAgICBnZXRUZXh0LiRkdiA9ICcnO1xuICAgIHJldHVybiBnZXRUZXh0O1xuXG4gICAgZnVuY3Rpb24gZ2V0VGV4dChlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICB2YXIgbm9kZVR5cGUgPSBlbGVtZW50Lm5vZGVUeXBlO1xuICAgICAgICByZXR1cm4gKG5vZGVUeXBlID09PSBOT0RFX1RZUEVfRUxFTUVOVCB8fCBub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQpID8gZWxlbWVudC50ZXh0Q29udGVudCA6ICcnO1xuICAgICAgfVxuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgIH1cbiAgfSkoKSxcblxuICB2YWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgaWYgKGVsZW1lbnQubXVsdGlwbGUgJiYgbm9kZU5hbWVfKGVsZW1lbnQpID09PSAnc2VsZWN0Jykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGZvckVhY2goZWxlbWVudC5vcHRpb25zLCBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24udmFsdWUgfHwgb3B0aW9uLnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG4gICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICB9LFxuXG4gIGh0bWw6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBqcUxpdGVEZWFsb2MoZWxlbWVudCwgdHJ1ZSk7XG4gICAgZWxlbWVudC5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfSxcblxuICBlbXB0eToganFMaXRlRW1wdHlcbn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7XG4gIC8qKlxuICAgKiBQcm9wZXJ0aWVzOiB3cml0ZXMgcmV0dXJuIHNlbGVjdGlvbiwgcmVhZHMgcmV0dXJuIGZpcnN0IHZhbHVlXG4gICAqL1xuICBKUUxpdGUucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oYXJnMSwgYXJnMikge1xuICAgIHZhciBpLCBrZXk7XG4gICAgdmFyIG5vZGVDb3VudCA9IHRoaXMubGVuZ3RoO1xuXG4gICAgLy8ganFMaXRlSGFzQ2xhc3MgaGFzIG9ubHkgdHdvIGFyZ3VtZW50cywgYnV0IGlzIGEgZ2V0dGVyLW9ubHkgZm4sIHNvIHdlIG5lZWQgdG8gc3BlY2lhbC1jYXNlIGl0XG4gICAgLy8gaW4gYSB3YXkgdGhhdCBzdXJ2aXZlcyBtaW5pZmljYXRpb24uXG4gICAgLy8ganFMaXRlRW1wdHkgdGFrZXMgbm8gYXJndW1lbnRzIGJ1dCBpcyBhIHNldHRlci5cbiAgICBpZiAoZm4gIT09IGpxTGl0ZUVtcHR5ICYmXG4gICAgICAgIChpc1VuZGVmaW5lZCgoZm4ubGVuZ3RoID09PSAyICYmIChmbiAhPT0ganFMaXRlSGFzQ2xhc3MgJiYgZm4gIT09IGpxTGl0ZUNvbnRyb2xsZXIpKSA/IGFyZzEgOiBhcmcyKSkpIHtcbiAgICAgIGlmIChpc09iamVjdChhcmcxKSkge1xuXG4gICAgICAgIC8vIHdlIGFyZSBhIHdyaXRlLCBidXQgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSB0aGUga2V5L3ZhbHVlc1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHtcbiAgICAgICAgICBpZiAoZm4gPT09IGpxTGl0ZURhdGEpIHtcbiAgICAgICAgICAgIC8vIGRhdGEoKSB0YWtlcyB0aGUgd2hvbGUgb2JqZWN0IGluIGpRdWVyeVxuICAgICAgICAgICAgZm4odGhpc1tpXSwgYXJnMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIGFyZzEpIHtcbiAgICAgICAgICAgICAgZm4odGhpc1tpXSwga2V5LCBhcmcxW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXR1cm4gc2VsZiBmb3IgY2hhaW5pbmdcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3ZSBhcmUgYSByZWFkLCBzbyByZWFkIHRoZSBmaXJzdCBjaGlsZC5cbiAgICAgICAgLy8gVE9ETzogZG8gd2Ugc3RpbGwgbmVlZCB0aGlzP1xuICAgICAgICB2YXIgdmFsdWUgPSBmbi4kZHY7XG4gICAgICAgIC8vIE9ubHkgaWYgd2UgaGF2ZSAkZHYgZG8gd2UgaXRlcmF0ZSBvdmVyIGFsbCwgb3RoZXJ3aXNlIGl0IGlzIGp1c3QgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICAgIHZhciBqaiA9IChpc1VuZGVmaW5lZCh2YWx1ZSkpID8gTWF0aC5taW4obm9kZUNvdW50LCAxKSA6IG5vZGVDb3VudDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgdmFyIG5vZGVWYWx1ZSA9IGZuKHRoaXNbal0sIGFyZzEsIGFyZzIpO1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyB2YWx1ZSArIG5vZGVWYWx1ZSA6IG5vZGVWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGFyZSBhIHdyaXRlLCBzbyBhcHBseSB0byBhbGwgY2hpbGRyZW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlQ291bnQ7IGkrKykge1xuICAgICAgICBmbih0aGlzW2ldLCBhcmcxLCBhcmcyKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzZWxmIGZvciBjaGFpbmluZ1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudHMpIHtcbiAgdmFyIGV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50LCB0eXBlKSB7XG4gICAgLy8galF1ZXJ5IHNwZWNpZmljIGFwaVxuICAgIGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfTtcblxuICAgIHZhciBldmVudEZucyA9IGV2ZW50c1t0eXBlIHx8IGV2ZW50LnR5cGVdO1xuICAgIHZhciBldmVudEZuc0xlbmd0aCA9IGV2ZW50Rm5zID8gZXZlbnRGbnMubGVuZ3RoIDogMDtcblxuICAgIGlmICghZXZlbnRGbnNMZW5ndGgpIHJldHVybjtcblxuICAgIGlmIChpc1VuZGVmaW5lZChldmVudC5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpKSB7XG4gICAgICB2YXIgb3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZXZlbnQuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICBvcmlnaW5hbFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2ZW50LmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9PT0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gU29tZSBldmVudHMgaGF2ZSBzcGVjaWFsIGhhbmRsZXJzIHRoYXQgd3JhcCB0aGUgcmVhbCBoYW5kbGVyXG4gICAgdmFyIGhhbmRsZXJXcmFwcGVyID0gZXZlbnRGbnMuc3BlY2lhbEhhbmRsZXJXcmFwcGVyIHx8IGRlZmF1bHRIYW5kbGVyV3JhcHBlcjtcblxuICAgIC8vIENvcHkgZXZlbnQgaGFuZGxlcnMgaW4gY2FzZSBldmVudCBoYW5kbGVycyBhcnJheSBpcyBtb2RpZmllZCBkdXJpbmcgZXhlY3V0aW9uLlxuICAgIGlmICgoZXZlbnRGbnNMZW5ndGggPiAxKSkge1xuICAgICAgZXZlbnRGbnMgPSBzaGFsbG93Q29weShldmVudEZucyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudEZuc0xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgaGFuZGxlcldyYXBwZXIoZWxlbWVudCwgZXZlbnQsIGV2ZW50Rm5zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gVE9ETzogdGhpcyBpcyBhIGhhY2sgZm9yIGFuZ3VsYXJNb2Nrcy9jbGVhckRhdGFDYWNoZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGRlcmVnaXN0ZXIgYWxsXG4gIC8vICAgICAgIGV2ZW50cyBvbiBgZWxlbWVudGBcbiAgZXZlbnRIYW5kbGVyLmVsZW0gPSBlbGVtZW50O1xuICByZXR1cm4gZXZlbnRIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0SGFuZGxlcldyYXBwZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gc3BlY2lhbE1vdXNlSGFuZGxlcldyYXBwZXIodGFyZ2V0LCBldmVudCwgaGFuZGxlcikge1xuICAvLyBSZWZlciB0byBqUXVlcnkncyBpbXBsZW1lbnRhdGlvbiBvZiBtb3VzZWVudGVyICYgbW91c2VsZWF2ZVxuICAvLyBSZWFkIGFib3V0IG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmU6XG4gIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX21vdXNlLmh0bWwjbGluazhcbiAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAvLyBGb3IgbW91c2VudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG4gIC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG4gIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqcUxpdGVDb250YWlucy5jYWxsKHRhcmdldCwgcmVsYXRlZCkpKSB7XG4gICAgaGFuZGxlci5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRnVuY3Rpb25zIGl0ZXJhdGluZyB0cmF2ZXJzYWwuXG4vLyBUaGVzZSBmdW5jdGlvbnMgY2hhaW4gcmVzdWx0cyBpbnRvIGEgc2luZ2xlXG4vLyBzZWxlY3Rvci5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZm9yRWFjaCh7XG4gIHJlbW92ZURhdGE6IGpxTGl0ZVJlbW92ZURhdGEsXG5cbiAgb246IGZ1bmN0aW9uIGpxTGl0ZU9uKGVsZW1lbnQsIHR5cGUsIGZuLCB1bnN1cHBvcnRlZCkge1xuICAgIGlmIChpc0RlZmluZWQodW5zdXBwb3J0ZWQpKSB0aHJvdyBqcUxpdGVNaW5FcnIoJ29uYXJncycsICdqcUxpdGUjb24oKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgc2VsZWN0b3JgIG9yIGBldmVudERhdGFgIHBhcmFtZXRlcnMnKTtcblxuICAgIC8vIERvIG5vdCBhZGQgZXZlbnQgaGFuZGxlcnMgdG8gbm9uLWVsZW1lbnRzIGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSBjbGVhbmVkIHVwLlxuICAgIGlmICghanFMaXRlQWNjZXB0c0RhdGEoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXhwYW5kb1N0b3JlID0ganFMaXRlRXhwYW5kb1N0b3JlKGVsZW1lbnQsIHRydWUpO1xuICAgIHZhciBldmVudHMgPSBleHBhbmRvU3RvcmUuZXZlbnRzO1xuICAgIHZhciBoYW5kbGUgPSBleHBhbmRvU3RvcmUuaGFuZGxlO1xuXG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIGhhbmRsZSA9IGV4cGFuZG9TdG9yZS5oYW5kbGUgPSBjcmVhdGVFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnRzKTtcbiAgICB9XG5cbiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9zdHJpbmctaW5kZXhvZi12cy1zcGxpdFxuICAgIHZhciB0eXBlcyA9IHR5cGUuaW5kZXhPZignICcpID49IDAgPyB0eXBlLnNwbGl0KCcgJykgOiBbdHlwZV07XG4gICAgdmFyIGkgPSB0eXBlcy5sZW5ndGg7XG5cbiAgICB2YXIgYWRkSGFuZGxlciA9IGZ1bmN0aW9uKHR5cGUsIHNwZWNpYWxIYW5kbGVyV3JhcHBlciwgbm9FdmVudExpc3RlbmVyKSB7XG4gICAgICB2YXIgZXZlbnRGbnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICghZXZlbnRGbnMpIHtcbiAgICAgICAgZXZlbnRGbnMgPSBldmVudHNbdHlwZV0gPSBbXTtcbiAgICAgICAgZXZlbnRGbnMuc3BlY2lhbEhhbmRsZXJXcmFwcGVyID0gc3BlY2lhbEhhbmRsZXJXcmFwcGVyO1xuICAgICAgICBpZiAodHlwZSAhPT0gJyRkZXN0cm95JyAmJiAhbm9FdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZXZlbnRGbnMucHVzaChmbik7XG4gICAgfTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgIGlmIChNT1VTRV9FVkVOVF9NQVBbdHlwZV0pIHtcbiAgICAgICAgYWRkSGFuZGxlcihNT1VTRV9FVkVOVF9NQVBbdHlwZV0sIHNwZWNpYWxNb3VzZUhhbmRsZXJXcmFwcGVyKTtcbiAgICAgICAgYWRkSGFuZGxlcih0eXBlLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkSGFuZGxlcih0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgb2ZmOiBqcUxpdGVPZmYsXG5cbiAgb25lOiBmdW5jdGlvbihlbGVtZW50LCB0eXBlLCBmbikge1xuICAgIGVsZW1lbnQgPSBqcUxpdGUoZWxlbWVudCk7XG5cbiAgICAvL2FkZCB0aGUgbGlzdGVuZXIgdHdpY2Ugc28gdGhhdCB3aGVuIGl0IGlzIGNhbGxlZFxuICAgIC8veW91IGNhbiByZW1vdmUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGFuZCBzdGlsbCBiZVxuICAgIC8vYWJsZSB0byBjYWxsIGVsZW1lbnQub2ZmKGV2LCBmbikgbm9ybWFsbHlcbiAgICBlbGVtZW50Lm9uKHR5cGUsIGZ1bmN0aW9uIG9uRm4oKSB7XG4gICAgICBlbGVtZW50Lm9mZih0eXBlLCBmbik7XG4gICAgICBlbGVtZW50Lm9mZih0eXBlLCBvbkZuKTtcbiAgICB9KTtcbiAgICBlbGVtZW50Lm9uKHR5cGUsIGZuKTtcbiAgfSxcblxuICByZXBsYWNlV2l0aDogZnVuY3Rpb24oZWxlbWVudCwgcmVwbGFjZU5vZGUpIHtcbiAgICB2YXIgaW5kZXgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICBqcUxpdGVEZWFsb2MoZWxlbWVudCk7XG4gICAgZm9yRWFjaChuZXcgSlFMaXRlKHJlcGxhY2VOb2RlKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgaW5kZXgubmV4dFNpYmxpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZChub2RlLCBlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gbm9kZTtcbiAgICB9KTtcbiAgfSxcblxuICBjaGlsZHJlbjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIGZvckVhY2goZWxlbWVudC5jaGlsZE5vZGVzLCBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH0sXG5cbiAgY29udGVudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgZWxlbWVudC5jaGlsZE5vZGVzIHx8IFtdO1xuICB9LFxuXG4gIGFwcGVuZDogZnVuY3Rpb24oZWxlbWVudCwgbm9kZSkge1xuICAgIHZhciBub2RlVHlwZSA9IGVsZW1lbnQubm9kZVR5cGU7XG4gICAgaWYgKG5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCAmJiBub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UKSByZXR1cm47XG5cbiAgICBub2RlID0gbmV3IEpRTGl0ZShub2RlKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5vZGUubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfSxcblxuICBwcmVwZW5kOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7XG4gICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5PREVfVFlQRV9FTEVNRU5UKSB7XG4gICAgICB2YXIgaW5kZXggPSBlbGVtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICBmb3JFYWNoKG5ldyBKUUxpdGUobm9kZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIGVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbmRleCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgd3JhcDogZnVuY3Rpb24oZWxlbWVudCwgd3JhcE5vZGUpIHtcbiAgICBqcUxpdGVXcmFwTm9kZShlbGVtZW50LCBqcUxpdGUod3JhcE5vZGUpLmVxKDApLmNsb25lKClbMF0pO1xuICB9LFxuXG4gIHJlbW92ZToganFMaXRlUmVtb3ZlLFxuXG4gIGRldGFjaDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIGpxTGl0ZVJlbW92ZShlbGVtZW50LCB0cnVlKTtcbiAgfSxcblxuICBhZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgbmV3RWxlbWVudCkge1xuICAgIHZhciBpbmRleCA9IGVsZW1lbnQsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICBuZXdFbGVtZW50ID0gbmV3IEpRTGl0ZShuZXdFbGVtZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG5ld0VsZW1lbnQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBuZXdFbGVtZW50W2ldO1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBpbmRleC5uZXh0U2libGluZyk7XG4gICAgICBpbmRleCA9IG5vZGU7XG4gICAgfVxuICB9LFxuXG4gIGFkZENsYXNzOiBqcUxpdGVBZGRDbGFzcyxcbiAgcmVtb3ZlQ2xhc3M6IGpxTGl0ZVJlbW92ZUNsYXNzLFxuXG4gIHRvZ2dsZUNsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBzZWxlY3RvciwgY29uZGl0aW9uKSB7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBmb3JFYWNoKHNlbGVjdG9yLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgY2xhc3NDb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChjbGFzc0NvbmRpdGlvbikpIHtcbiAgICAgICAgICBjbGFzc0NvbmRpdGlvbiA9ICFqcUxpdGVIYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIChjbGFzc0NvbmRpdGlvbiA/IGpxTGl0ZUFkZENsYXNzIDoganFMaXRlUmVtb3ZlQ2xhc3MpKGVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgcGFyZW50OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gTk9ERV9UWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UID8gcGFyZW50IDogbnVsbDtcbiAgfSxcblxuICBuZXh0OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICB9LFxuXG4gIGZpbmQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfSxcblxuICBjbG9uZToganFMaXRlQ2xvbmUsXG5cbiAgdHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCBleHRyYVBhcmFtZXRlcnMpIHtcblxuICAgIHZhciBkdW1teUV2ZW50LCBldmVudEZuc0NvcHksIGhhbmRsZXJBcmdzO1xuICAgIHZhciBldmVudE5hbWUgPSBldmVudC50eXBlIHx8IGV2ZW50O1xuICAgIHZhciBleHBhbmRvU3RvcmUgPSBqcUxpdGVFeHBhbmRvU3RvcmUoZWxlbWVudCk7XG4gICAgdmFyIGV2ZW50cyA9IGV4cGFuZG9TdG9yZSAmJiBleHBhbmRvU3RvcmUuZXZlbnRzO1xuICAgIHZhciBldmVudEZucyA9IGV2ZW50cyAmJiBldmVudHNbZXZlbnROYW1lXTtcblxuICAgIGlmIChldmVudEZucykge1xuICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgZXZlbnQgdG8gcGFzcyB0byB0aGUgaGFuZGxlcnNcbiAgICAgIGR1bW15RXZlbnQgPSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsgfSxcbiAgICAgICAgaXNEZWZhdWx0UHJldmVudGVkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdHJ1ZTsgfSxcbiAgICAgICAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsgdGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlOyB9LFxuICAgICAgICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9PT0gdHJ1ZTsgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBub29wLFxuICAgICAgICB0eXBlOiBldmVudE5hbWUsXG4gICAgICAgIHRhcmdldDogZWxlbWVudFxuICAgICAgfTtcblxuICAgICAgLy8gSWYgYSBjdXN0b20gZXZlbnQgd2FzIHByb3ZpZGVkIHRoZW4gZXh0ZW5kIG91ciBkdW1teSBldmVudCB3aXRoIGl0XG4gICAgICBpZiAoZXZlbnQudHlwZSkge1xuICAgICAgICBkdW1teUV2ZW50ID0gZXh0ZW5kKGR1bW15RXZlbnQsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29weSBldmVudCBoYW5kbGVycyBpbiBjYXNlIGV2ZW50IGhhbmRsZXJzIGFycmF5IGlzIG1vZGlmaWVkIGR1cmluZyBleGVjdXRpb24uXG4gICAgICBldmVudEZuc0NvcHkgPSBzaGFsbG93Q29weShldmVudEZucyk7XG4gICAgICBoYW5kbGVyQXJncyA9IGV4dHJhUGFyYW1ldGVycyA/IFtkdW1teUV2ZW50XS5jb25jYXQoZXh0cmFQYXJhbWV0ZXJzKSA6IFtkdW1teUV2ZW50XTtcblxuICAgICAgZm9yRWFjaChldmVudEZuc0NvcHksIGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgIGlmICghZHVtbXlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgICAgZm4uYXBwbHkoZWxlbWVudCwgaGFuZGxlckFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0sIGZ1bmN0aW9uKGZuLCBuYW1lKSB7XG4gIC8qKlxuICAgKiBjaGFpbmluZyBmdW5jdGlvbnNcbiAgICovXG4gIEpRTGl0ZS5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gdGhpcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gZm4odGhpc1tpXSwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgLy8gYW55IGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSBuZWVkcyB0byBiZSB3cmFwcGVkXG4gICAgICAgICAgdmFsdWUgPSBqcUxpdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqcUxpdGVBZGROb2Rlcyh2YWx1ZSwgZm4odGhpc1tpXSwgYXJnMSwgYXJnMiwgYXJnMykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNEZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogdGhpcztcbiAgfTtcbn0pO1xuXG4vLyBiaW5kIGxlZ2FjeSBiaW5kL3VuYmluZCB0byBvbi9vZmZcbkpRTGl0ZS5wcm90b3R5cGUuYmluZCA9IEpRTGl0ZS5wcm90b3R5cGUub247XG5KUUxpdGUucHJvdG90eXBlLnVuYmluZCA9IEpRTGl0ZS5wcm90b3R5cGUub2ZmO1xuXG5cbi8vIFByb3ZpZGVyIGZvciBwcml2YXRlICQkanFMaXRlIHNlcnZpY2Vcbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJCRqcUxpdGVQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24gJCRqcUxpdGUoKSB7XG4gICAgcmV0dXJuIGV4dGVuZChKUUxpdGUsIHtcbiAgICAgIGhhc0NsYXNzOiBmdW5jdGlvbihub2RlLCBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChub2RlLmF0dHIpIG5vZGUgPSBub2RlWzBdO1xuICAgICAgICByZXR1cm4ganFMaXRlSGFzQ2xhc3Mobm9kZSwgY2xhc3Nlcyk7XG4gICAgICB9LFxuICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKG5vZGUsIGNsYXNzZXMpIHtcbiAgICAgICAgaWYgKG5vZGUuYXR0cikgbm9kZSA9IG5vZGVbMF07XG4gICAgICAgIHJldHVybiBqcUxpdGVBZGRDbGFzcyhub2RlLCBjbGFzc2VzKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVDbGFzczogZnVuY3Rpb24obm9kZSwgY2xhc3Nlcykge1xuICAgICAgICBpZiAobm9kZS5hdHRyKSBub2RlID0gbm9kZVswXTtcbiAgICAgICAgcmV0dXJuIGpxTGl0ZVJlbW92ZUNsYXNzKG5vZGUsIGNsYXNzZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGEgaGFzaCBvZiBhbiAnb2JqJy5cbiAqIEhhc2ggb2YgYTpcbiAqICBzdHJpbmcgaXMgc3RyaW5nXG4gKiAgbnVtYmVyIGlzIG51bWJlciBhcyBzdHJpbmdcbiAqICBvYmplY3QgaXMgZWl0aGVyIHJlc3VsdCBvZiBjYWxsaW5nICQkaGFzaEtleSBmdW5jdGlvbiBvbiB0aGUgb2JqZWN0IG9yIHVuaXF1ZWx5IGdlbmVyYXRlZCBpZCxcbiAqICAgICAgICAgdGhhdCBpcyBhbHNvIGFzc2lnbmVkIHRvIHRoZSAkJGhhc2hLZXkgcHJvcGVydHkgb2YgdGhlIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBoYXNoIHN0cmluZyBzdWNoIHRoYXQgdGhlIHNhbWUgaW5wdXQgd2lsbCBoYXZlIHRoZSBzYW1lIGhhc2ggc3RyaW5nLlxuICogICAgICAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyBrZXkgaXMgaW4gJ3R5cGU6aGFzaEtleScgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBoYXNoS2V5KG9iaiwgbmV4dFVpZEZuKSB7XG4gIHZhciBrZXkgPSBvYmogJiYgb2JqLiQkaGFzaEtleTtcblxuICBpZiAoa2V5KSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGtleSA9IG9iai4kJGhhc2hLZXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHZhciBvYmpUeXBlID0gdHlwZW9mIG9iajtcbiAgaWYgKG9ialR5cGUgPT09ICdmdW5jdGlvbicgfHwgKG9ialR5cGUgPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkpIHtcbiAgICBrZXkgPSBvYmouJCRoYXNoS2V5ID0gb2JqVHlwZSArICc6JyArIChuZXh0VWlkRm4gfHwgbmV4dFVpZCkoKTtcbiAgfSBlbHNlIHtcbiAgICBrZXkgPSBvYmpUeXBlICsgJzonICsgb2JqO1xuICB9XG5cbiAgcmV0dXJuIGtleTtcbn1cblxuLyoqXG4gKiBIYXNoTWFwIHdoaWNoIGNhbiB1c2Ugb2JqZWN0cyBhcyBrZXlzXG4gKi9cbmZ1bmN0aW9uIEhhc2hNYXAoYXJyYXksIGlzb2xhdGVkVWlkKSB7XG4gIGlmIChpc29sYXRlZFVpZCkge1xuICAgIHZhciB1aWQgPSAwO1xuICAgIHRoaXMubmV4dFVpZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICsrdWlkO1xuICAgIH07XG4gIH1cbiAgZm9yRWFjaChhcnJheSwgdGhpcy5wdXQsIHRoaXMpO1xufVxuSGFzaE1hcC5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBTdG9yZSBrZXkgdmFsdWUgcGFpclxuICAgKiBAcGFyYW0ga2V5IGtleSB0byBzdG9yZSBjYW4gYmUgYW55IHR5cGVcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHN0b3JlIGNhbiBiZSBhbnkgdHlwZVxuICAgKi9cbiAgcHV0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdGhpc1toYXNoS2V5KGtleSwgdGhpcy5uZXh0VWlkKV0gPSB2YWx1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgdmFsdWUgZm9yIHRoZSBrZXlcbiAgICovXG4gIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIHRoaXNbaGFzaEtleShrZXksIHRoaXMubmV4dFVpZCldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGtleS92YWx1ZSBwYWlyXG4gICAqIEBwYXJhbSBrZXlcbiAgICovXG4gIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gdGhpc1trZXkgPSBoYXNoS2V5KGtleSwgdGhpcy5uZXh0VWlkKV07XG4gICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbnZhciAkJEhhc2hNYXBQcm92aWRlciA9IFsvKiogQHRoaXMgKi9mdW5jdGlvbigpIHtcbiAgdGhpcy4kZ2V0ID0gW2Z1bmN0aW9uKCkge1xuICAgIHJldHVybiBIYXNoTWFwO1xuICB9XTtcbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG1vZHVsZSBuZ1xuICogQG5hbWUgYW5ndWxhci5pbmplY3RvclxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENyZWF0ZXMgYW4gaW5qZWN0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJldHJpZXZpbmcgc2VydmljZXMgYXMgd2VsbCBhcyBmb3JcbiAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uIChzZWUge0BsaW5rIGd1aWRlL2RpIGRlcGVuZGVuY3kgaW5qZWN0aW9ufSkuXG4gKlxuICogQHBhcmFtIHtBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gbW9kdWxlcyBBIGxpc3Qgb2YgbW9kdWxlIGZ1bmN0aW9ucyBvciB0aGVpciBhbGlhc2VzLiBTZWVcbiAqICAgICB7QGxpbmsgYW5ndWxhci5tb2R1bGV9LiBUaGUgYG5nYCBtb2R1bGUgbXVzdCBiZSBleHBsaWNpdGx5IGFkZGVkLlxuICogQHBhcmFtIHtib29sZWFuPX0gW3N0cmljdERpPWZhbHNlXSBXaGV0aGVyIHRoZSBpbmplY3RvciBzaG91bGQgYmUgaW4gc3RyaWN0IG1vZGUsIHdoaWNoXG4gKiAgICAgZGlzYWxsb3dzIGFyZ3VtZW50IG5hbWUgYW5ub3RhdGlvbiBpbmZlcmVuY2UuXG4gKiBAcmV0dXJucyB7aW5qZWN0b3J9IEluamVjdG9yIG9iamVjdC4gU2VlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBUeXBpY2FsIHVzYWdlXG4gKiBgYGBqc1xuICogICAvLyBjcmVhdGUgYW4gaW5qZWN0b3JcbiAqICAgdmFyICRpbmplY3RvciA9IGFuZ3VsYXIuaW5qZWN0b3IoWyduZyddKTtcbiAqXG4gKiAgIC8vIHVzZSB0aGUgaW5qZWN0b3IgdG8ga2ljayBvZmYgeW91ciBhcHBsaWNhdGlvblxuICogICAvLyB1c2UgdGhlIHR5cGUgaW5mZXJlbmNlIHRvIGF1dG8gaW5qZWN0IGFyZ3VtZW50cywgb3IgdXNlIGltcGxpY2l0IGluamVjdGlvblxuICogICAkaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRyb290U2NvcGUsICRjb21waWxlLCAkZG9jdW1lbnQpIHtcbiAqICAgICAkY29tcGlsZSgkZG9jdW1lbnQpKCRyb290U2NvcGUpO1xuICogICAgICRyb290U2NvcGUuJGRpZ2VzdCgpO1xuICogICB9KTtcbiAqIGBgYFxuICpcbiAqIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBnZXQgYWNjZXNzIHRvIHRoZSBpbmplY3RvciBvZiBhIGN1cnJlbnRseSBydW5uaW5nIEFuZ3VsYXIgYXBwXG4gKiBmcm9tIG91dHNpZGUgQW5ndWxhci4gUGVyaGFwcywgeW91IHdhbnQgdG8gaW5qZWN0IGFuZCBjb21waWxlIHNvbWUgbWFya3VwIGFmdGVyIHRoZVxuICogYXBwbGljYXRpb24gaGFzIGJlZW4gYm9vdHN0cmFwcGVkLiBZb3UgY2FuIGRvIHRoaXMgdXNpbmcgdGhlIGV4dHJhIGBpbmplY3RvcigpYCBhZGRlZFxuICogdG8gSlF1ZXJ5L2pxTGl0ZSBlbGVtZW50cy4gU2VlIHtAbGluayBhbmd1bGFyLmVsZW1lbnR9LlxuICpcbiAqICpUaGlzIGlzIGZhaXJseSByYXJlIGJ1dCBjb3VsZCBiZSB0aGUgY2FzZSBpZiBhIHRoaXJkIHBhcnR5IGxpYnJhcnkgaXMgaW5qZWN0aW5nIHRoZVxuICogbWFya3VwLipcbiAqXG4gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYSBuZXcgYmxvY2sgb2YgSFRNTCBjb250YWluaW5nIGEgYG5nLWNvbnRyb2xsZXJgXG4gKiBkaXJlY3RpdmUgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQgYm9keSBieSBKUXVlcnkuIFdlIHRoZW4gY29tcGlsZSBhbmQgbGlua1xuICogaXQgaW50byB0aGUgY3VycmVudCBBbmd1bGFySlMgc2NvcGUuXG4gKlxuICogYGBganNcbiAqIHZhciAkZGl2ID0gJCgnPGRpdiBuZy1jb250cm9sbGVyPVwiTXlDdHJsXCI+e3tjb250ZW50LmxhYmVsfX08L2Rpdj4nKTtcbiAqICQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCRkaXYpO1xuICpcbiAqIGFuZ3VsYXIuZWxlbWVudChkb2N1bWVudCkuaW5qZWN0b3IoKS5pbnZva2UoZnVuY3Rpb24oJGNvbXBpbGUpIHtcbiAqICAgdmFyIHNjb3BlID0gYW5ndWxhci5lbGVtZW50KCRkaXYpLnNjb3BlKCk7XG4gKiAgICRjb21waWxlKCRkaXYpKHNjb3BlKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBtb2R1bGVcbiAqIEBuYW1lIGF1dG9cbiAqIEBpbnN0YWxsYXRpb25cbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEltcGxpY2l0IG1vZHVsZSB3aGljaCBnZXRzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gZWFjaCB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS5cbiAqL1xuXG52YXIgQVJST1dfQVJHID0gL14oW14oXSs/KT0+LztcbnZhciBGTl9BUkdTID0gL15bXihdKlxcKFxccyooW14pXSopXFwpL207XG52YXIgRk5fQVJHX1NQTElUID0gLywvO1xudmFyIEZOX0FSRyA9IC9eXFxzKihfPykoXFxTKz8pXFwxXFxzKiQvO1xudmFyIFNUUklQX0NPTU1FTlRTID0gLygoXFwvXFwvLiokKXwoXFwvXFwqW1xcc1xcU10qP1xcKlxcLykpL21nO1xudmFyICRpbmplY3Rvck1pbkVyciA9IG1pbkVycignJGluamVjdG9yJyk7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUZuKGZuKSB7XG4gIC8vIFN1cHBvcnQ6IENocm9tZSA1MC01MSBvbmx5XG4gIC8vIENyZWF0aW5nIGEgbmV3IHN0cmluZyBieSBhZGRpbmcgYCcgJ2AgYXQgdGhlIGVuZCwgdG8gaGFjayBhcm91bmQgc29tZSBidWcgaW4gQ2hyb21lIHY1MC81MVxuICAvLyAoU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzE0NDg3LilcbiAgLy8gVE9ETyAoZ2thbHBhayk6IFJlbW92ZSB3b3JrYXJvdW5kIHdoZW4gQ2hyb21lIHY1MiBpcyByZWxlYXNlZFxuICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZm4pICsgJyAnO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QXJncyhmbikge1xuICB2YXIgZm5UZXh0ID0gc3RyaW5naWZ5Rm4oZm4pLnJlcGxhY2UoU1RSSVBfQ09NTUVOVFMsICcnKSxcbiAgICAgIGFyZ3MgPSBmblRleHQubWF0Y2goQVJST1dfQVJHKSB8fCBmblRleHQubWF0Y2goRk5fQVJHUyk7XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBhbm9uRm4oZm4pIHtcbiAgLy8gRm9yIGFub255bW91cyBmdW5jdGlvbnMsIHNob3dpbmcgYXQgdGhlIHZlcnkgbGVhc3QgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gaGVscCBpblxuICAvLyBkZWJ1Z2dpbmcuXG4gIHZhciBhcmdzID0gZXh0cmFjdEFyZ3MoZm4pO1xuICBpZiAoYXJncykge1xuICAgIHJldHVybiAnZnVuY3Rpb24oJyArIChhcmdzWzFdIHx8ICcnKS5yZXBsYWNlKC9bXFxzXFxyXFxuXSsvLCAnICcpICsgJyknO1xuICB9XG4gIHJldHVybiAnZm4nO1xufVxuXG5mdW5jdGlvbiBhbm5vdGF0ZShmbiwgc3RyaWN0RGksIG5hbWUpIHtcbiAgdmFyICRpbmplY3QsXG4gICAgICBhcmdEZWNsLFxuICAgICAgbGFzdDtcblxuICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKCEoJGluamVjdCA9IGZuLiRpbmplY3QpKSB7XG4gICAgICAkaW5qZWN0ID0gW107XG4gICAgICBpZiAoZm4ubGVuZ3RoKSB7XG4gICAgICAgIGlmIChzdHJpY3REaSkge1xuICAgICAgICAgIGlmICghaXNTdHJpbmcobmFtZSkgfHwgIW5hbWUpIHtcbiAgICAgICAgICAgIG5hbWUgPSBmbi5uYW1lIHx8IGFub25Gbihmbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignc3RyaWN0ZGknLFxuICAgICAgICAgICAgJ3swfSBpcyBub3QgdXNpbmcgZXhwbGljaXQgYW5ub3RhdGlvbiBhbmQgY2Fubm90IGJlIGludm9rZWQgaW4gc3RyaWN0IG1vZGUnLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBhcmdEZWNsID0gZXh0cmFjdEFyZ3MoZm4pO1xuICAgICAgICBmb3JFYWNoKGFyZ0RlY2xbMV0uc3BsaXQoRk5fQVJHX1NQTElUKSwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgICAgYXJnLnJlcGxhY2UoRk5fQVJHLCBmdW5jdGlvbihhbGwsIHVuZGVyc2NvcmUsIG5hbWUpIHtcbiAgICAgICAgICAgICRpbmplY3QucHVzaChuYW1lKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmbi4kaW5qZWN0ID0gJGluamVjdDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNBcnJheShmbikpIHtcbiAgICBsYXN0ID0gZm4ubGVuZ3RoIC0gMTtcbiAgICBhc3NlcnRBcmdGbihmbltsYXN0XSwgJ2ZuJyk7XG4gICAgJGluamVjdCA9IGZuLnNsaWNlKDAsIGxhc3QpO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydEFyZ0ZuKGZuLCAnZm4nLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gJGluamVjdDtcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRpbmplY3RvclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIGAkaW5qZWN0b3JgIGlzIHVzZWQgdG8gcmV0cmlldmUgb2JqZWN0IGluc3RhbmNlcyBhcyBkZWZpbmVkIGJ5XG4gKiB7QGxpbmsgYXV0by4kcHJvdmlkZSBwcm92aWRlcn0sIGluc3RhbnRpYXRlIHR5cGVzLCBpbnZva2UgbWV0aG9kcyxcbiAqIGFuZCBsb2FkIG1vZHVsZXMuXG4gKlxuICogVGhlIGZvbGxvd2luZyBhbHdheXMgaG9sZHMgdHJ1ZTpcbiAqXG4gKiBgYGBqc1xuICogICB2YXIgJGluamVjdG9yID0gYW5ndWxhci5pbmplY3RvcigpO1xuICogICBleHBlY3QoJGluamVjdG9yLmdldCgnJGluamVjdG9yJykpLnRvQmUoJGluamVjdG9yKTtcbiAqICAgZXhwZWN0KCRpbmplY3Rvci5pbnZva2UoZnVuY3Rpb24oJGluamVjdG9yKSB7XG4gKiAgICAgcmV0dXJuICRpbmplY3RvcjtcbiAqICAgfSkpLnRvQmUoJGluamVjdG9yKTtcbiAqIGBgYFxuICpcbiAqICMgSW5qZWN0aW9uIEZ1bmN0aW9uIEFubm90YXRpb25cbiAqXG4gKiBKYXZhU2NyaXB0IGRvZXMgbm90IGhhdmUgYW5ub3RhdGlvbnMsIGFuZCBhbm5vdGF0aW9ucyBhcmUgbmVlZGVkIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi4gVGhlXG4gKiBmb2xsb3dpbmcgYXJlIGFsbCB2YWxpZCB3YXlzIG9mIGFubm90YXRpbmcgZnVuY3Rpb24gd2l0aCBpbmplY3Rpb24gYXJndW1lbnRzIGFuZCBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBgYGBqc1xuICogICAvLyBpbmZlcnJlZCAob25seSB3b3JrcyBpZiBjb2RlIG5vdCBtaW5pZmllZC9vYmZ1c2NhdGVkKVxuICogICAkaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKHNlcnZpY2VBKXt9KTtcbiAqXG4gKiAgIC8vIGFubm90YXRlZFxuICogICBmdW5jdGlvbiBleHBsaWNpdChzZXJ2aWNlQSkge307XG4gKiAgIGV4cGxpY2l0LiRpbmplY3QgPSBbJ3NlcnZpY2VBJ107XG4gKiAgICRpbmplY3Rvci5pbnZva2UoZXhwbGljaXQpO1xuICpcbiAqICAgLy8gaW5saW5lXG4gKiAgICRpbmplY3Rvci5pbnZva2UoWydzZXJ2aWNlQScsIGZ1bmN0aW9uKHNlcnZpY2VBKXt9XSk7XG4gKiBgYGBcbiAqXG4gKiAjIyBJbmZlcmVuY2VcbiAqXG4gKiBJbiBKYXZhU2NyaXB0IGNhbGxpbmcgYHRvU3RyaW5nKClgIG9uIGEgZnVuY3Rpb24gcmV0dXJucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhlIGRlZmluaXRpb25cbiAqIGNhbiB0aGVuIGJlIHBhcnNlZCBhbmQgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjYW4gYmUgZXh0cmFjdGVkLiBUaGlzIG1ldGhvZCBvZiBkaXNjb3ZlcmluZ1xuICogYW5ub3RhdGlvbnMgaXMgZGlzYWxsb3dlZCB3aGVuIHRoZSBpbmplY3RvciBpcyBpbiBzdHJpY3QgbW9kZS5cbiAqICpOT1RFOiogVGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggbWluaWZpY2F0aW9uLCBhbmQgb2JmdXNjYXRpb24gdG9vbHMgc2luY2UgdGhlc2UgdG9vbHMgY2hhbmdlIHRoZVxuICogYXJndW1lbnQgbmFtZXMuXG4gKlxuICogIyMgYCRpbmplY3RgIEFubm90YXRpb25cbiAqIEJ5IGFkZGluZyBhbiBgJGluamVjdGAgcHJvcGVydHkgb250byBhIGZ1bmN0aW9uIHRoZSBpbmplY3Rpb24gcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkLlxuICpcbiAqICMjIElubGluZVxuICogQXMgYW4gYXJyYXkgb2YgaW5qZWN0aW9uIG5hbWVzLCB3aGVyZSB0aGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpcyB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRpbmplY3RvciNnZXRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmljZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0ge3N0cmluZz19IGNhbGxlciBBbiBvcHRpb25hbCBzdHJpbmcgdG8gcHJvdmlkZSB0aGUgb3JpZ2luIG9mIHRoZSBmdW5jdGlvbiBjYWxsIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEByZXR1cm4geyp9IFRoZSBpbnN0YW5jZS5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRpbmplY3RvciNpbnZva2VcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEludm9rZSB0aGUgbWV0aG9kIGFuZCBzdXBwbHkgdGhlIG1ldGhvZCBhcmd1bWVudHMgZnJvbSB0aGUgYCRpbmplY3RvcmAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gZm4gVGhlIGluamVjdGFibGUgZnVuY3Rpb24gdG8gaW52b2tlLiBGdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZVxuICogICBpbmplY3RlZCBhY2NvcmRpbmcgdG8gdGhlIHtAbGluayBndWlkZS9kaSAkaW5qZWN0IEFubm90YXRpb259IHJ1bGVzLlxuICogQHBhcmFtIHtPYmplY3Q9fSBzZWxmIFRoZSBgdGhpc2AgZm9yIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gbG9jYWxzIE9wdGlvbmFsIG9iamVjdC4gSWYgcHJlc2V0IHRoZW4gYW55IGFyZ3VtZW50IG5hbWVzIGFyZSByZWFkIGZyb20gdGhpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZpcnN0LCBiZWZvcmUgdGhlIGAkaW5qZWN0b3JgIGlzIGNvbnN1bHRlZC5cbiAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGludm9rZWQgYGZuYCBmdW5jdGlvbi5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRpbmplY3RvciNoYXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFsbG93cyB0aGUgdXNlciB0byBxdWVyeSBpZiB0aGUgcGFydGljdWxhciBzZXJ2aWNlIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBpbmplY3RvciBoYXMgZ2l2ZW4gc2VydmljZS5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRpbmplY3RvciNpbnN0YW50aWF0ZVxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgSlMgdHlwZS4gVGhlIG1ldGhvZCB0YWtlcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBpbnZva2VzIHRoZSBuZXdcbiAqIG9wZXJhdG9yLCBhbmQgc3VwcGxpZXMgYWxsIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGFzIHNwZWNpZmllZCBieSB0aGVcbiAqIGNvbnN0cnVjdG9yIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gVHlwZSBBbm5vdGF0ZWQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge09iamVjdD19IGxvY2FscyBPcHRpb25hbCBvYmplY3QuIElmIHByZXNldCB0aGVuIGFueSBhcmd1bWVudCBuYW1lcyBhcmUgcmVhZCBmcm9tIHRoaXNcbiAqIG9iamVjdCBmaXJzdCwgYmVmb3JlIHRoZSBgJGluamVjdG9yYCBpcyBjb25zdWx0ZWQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXcgaW5zdGFuY2Ugb2YgYFR5cGVgLlxuICovXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJGluamVjdG9yI2Fubm90YXRlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNlcnZpY2UgbmFtZXMgd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIHJlcXVlc3RpbmcgZm9yIGluamVjdGlvbi4gVGhpcyBBUEkgaXNcbiAqIHVzZWQgYnkgdGhlIGluamVjdG9yIHRvIGRldGVybWluZSB3aGljaCBzZXJ2aWNlcyBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGZ1bmN0aW9uIHdoZW4gdGhlXG4gKiBmdW5jdGlvbiBpcyBpbnZva2VkLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyBpbiB3aGljaCB0aGUgZnVuY3Rpb24gY2FuIGJlIGFubm90YXRlZCB3aXRoIHRoZSBuZWVkZWRcbiAqIGRlcGVuZGVuY2llcy5cbiAqXG4gKiAjIEFyZ3VtZW50IG5hbWVzXG4gKlxuICogVGhlIHNpbXBsZXN0IGZvcm0gaXMgdG8gZXh0cmFjdCB0aGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgaXMgZG9uZVxuICogYnkgY29udmVydGluZyB0aGUgZnVuY3Rpb24gaW50byBhIHN0cmluZyB1c2luZyBgdG9TdHJpbmcoKWAgbWV0aG9kIGFuZCBleHRyYWN0aW5nIHRoZSBhcmd1bWVudFxuICogbmFtZXMuXG4gKiBgYGBqc1xuICogICAvLyBHaXZlblxuICogICBmdW5jdGlvbiBNeUNvbnRyb2xsZXIoJHNjb3BlLCAkcm91dGUpIHtcbiAqICAgICAvLyAuLi5cbiAqICAgfVxuICpcbiAqICAgLy8gVGhlblxuICogICBleHBlY3QoaW5qZWN0b3IuYW5ub3RhdGUoTXlDb250cm9sbGVyKSkudG9FcXVhbChbJyRzY29wZScsICckcm91dGUnXSk7XG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIGRpc2FsbG93IHRoaXMgbWV0aG9kIGJ5IHVzaW5nIHN0cmljdCBpbmplY3Rpb24gbW9kZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIHdpdGggY29kZSBtaW5pZmljYXRpb24gLyBvYmZ1c2NhdGlvbi4gRm9yIHRoaXMgcmVhc29uIHRoZSBmb2xsb3dpbmdcbiAqIGFubm90YXRpb24gc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqICMgVGhlIGAkaW5qZWN0YCBwcm9wZXJ0eVxuICpcbiAqIElmIGEgZnVuY3Rpb24gaGFzIGFuIGAkaW5qZWN0YCBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MsIHRoZW4gdGhlIHN0cmluZ3NcbiAqIHJlcHJlc2VudCBuYW1lcyBvZiBzZXJ2aWNlcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBmdW5jdGlvbi5cbiAqIGBgYGpzXG4gKiAgIC8vIEdpdmVuXG4gKiAgIHZhciBNeUNvbnRyb2xsZXIgPSBmdW5jdGlvbihvYmZ1c2NhdGVkU2NvcGUsIG9iZnVzY2F0ZWRSb3V0ZSkge1xuICogICAgIC8vIC4uLlxuICogICB9XG4gKiAgIC8vIERlZmluZSBmdW5jdGlvbiBkZXBlbmRlbmNpZXNcbiAqICAgTXlDb250cm9sbGVyWyckaW5qZWN0J10gPSBbJyRzY29wZScsICckcm91dGUnXTtcbiAqXG4gKiAgIC8vIFRoZW5cbiAqICAgZXhwZWN0KGluamVjdG9yLmFubm90YXRlKE15Q29udHJvbGxlcikpLnRvRXF1YWwoWyckc2NvcGUnLCAnJHJvdXRlJ10pO1xuICogYGBgXG4gKlxuICogIyBUaGUgYXJyYXkgbm90YXRpb25cbiAqXG4gKiBJdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gaW5saW5lIEluamVjdGVkIGZ1bmN0aW9ucyBhbmQgdGhhdCdzIHdoZW4gc2V0dGluZyB0aGUgYCRpbmplY3RgIHByb3BlcnR5XG4gKiBpcyB2ZXJ5IGluY29udmVuaWVudC4gSW4gdGhlc2Ugc2l0dWF0aW9ucyB1c2luZyB0aGUgYXJyYXkgbm90YXRpb24gdG8gc3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGluXG4gKiBhIHdheSB0aGF0IHN1cnZpdmVzIG1pbmlmaWNhdGlvbiBpcyBhIGJldHRlciBjaG9pY2U6XG4gKlxuICogYGBganNcbiAqICAgLy8gV2Ugd2lzaCB0byB3cml0ZSB0aGlzIChub3QgbWluaWZpY2F0aW9uIC8gb2JmdXNjYXRpb24gc2FmZSlcbiAqICAgaW5qZWN0b3IuaW52b2tlKGZ1bmN0aW9uKCRjb21waWxlLCAkcm9vdFNjb3BlKSB7XG4gKiAgICAgLy8gLi4uXG4gKiAgIH0pO1xuICpcbiAqICAgLy8gV2UgYXJlIGZvcmNlZCB0byB3cml0ZSBicmVhayBpbmxpbmluZ1xuICogICB2YXIgdG1wRm4gPSBmdW5jdGlvbihvYmZ1c2NhdGVkQ29tcGlsZSwgb2JmdXNjYXRlZFJvb3RTY29wZSkge1xuICogICAgIC8vIC4uLlxuICogICB9O1xuICogICB0bXBGbi4kaW5qZWN0ID0gWyckY29tcGlsZScsICckcm9vdFNjb3BlJ107XG4gKiAgIGluamVjdG9yLmludm9rZSh0bXBGbik7XG4gKlxuICogICAvLyBUbyBiZXR0ZXIgc3VwcG9ydCBpbmxpbmUgZnVuY3Rpb24gdGhlIGlubGluZSBhbm5vdGF0aW9uIGlzIHN1cHBvcnRlZFxuICogICBpbmplY3Rvci5pbnZva2UoWyckY29tcGlsZScsICckcm9vdFNjb3BlJywgZnVuY3Rpb24ob2JmQ29tcGlsZSwgb2JmUm9vdFNjb3BlKSB7XG4gKiAgICAgLy8gLi4uXG4gKiAgIH1dKTtcbiAqXG4gKiAgIC8vIFRoZXJlZm9yZVxuICogICBleHBlY3QoaW5qZWN0b3IuYW5ub3RhdGUoXG4gKiAgICAgIFsnJGNvbXBpbGUnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKG9iZnVzXyRjb21waWxlLCBvYmZ1c18kcm9vdFNjb3BlKSB7fV0pXG4gKiAgICApLnRvRXF1YWwoWyckY29tcGlsZScsICckcm9vdFNjb3BlJ10pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gZm4gRnVuY3Rpb24gZm9yIHdoaWNoIGRlcGVuZGVudCBzZXJ2aWNlIG5hbWVzIG5lZWQgdG9cbiAqIGJlIHJldHJpZXZlZCBhcyBkZXNjcmliZWQgYWJvdmUuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gW3N0cmljdERpPWZhbHNlXSBEaXNhbGxvdyBhcmd1bWVudCBuYW1lIGFubm90YXRpb24gaW5mZXJlbmNlLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheS48c3RyaW5nPn0gVGhlIG5hbWVzIG9mIHRoZSBzZXJ2aWNlcyB3aGljaCB0aGUgZnVuY3Rpb24gcmVxdWlyZXMuXG4gKi9cblxuXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRwcm92aWRlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogVGhlIHtAbGluayBhdXRvLiRwcm92aWRlICRwcm92aWRlfSBzZXJ2aWNlIGhhcyBhIG51bWJlciBvZiBtZXRob2RzIGZvciByZWdpc3RlcmluZyBjb21wb25lbnRzXG4gKiB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS4gTWFueSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGFsc28gZXhwb3NlZCBvblxuICoge0BsaW5rIGFuZ3VsYXIuTW9kdWxlfS5cbiAqXG4gKiBBbiBBbmd1bGFyICoqc2VydmljZSoqIGlzIGEgc2luZ2xldG9uIG9iamVjdCBjcmVhdGVkIGJ5IGEgKipzZXJ2aWNlIGZhY3RvcnkqKi4gIFRoZXNlICoqc2VydmljZVxuICogZmFjdG9yaWVzKiogYXJlIGZ1bmN0aW9ucyB3aGljaCwgaW4gdHVybiwgYXJlIGNyZWF0ZWQgYnkgYSAqKnNlcnZpY2UgcHJvdmlkZXIqKi5cbiAqIFRoZSAqKnNlcnZpY2UgcHJvdmlkZXJzKiogYXJlIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucy4gV2hlbiBpbnN0YW50aWF0ZWQgdGhleSBtdXN0IGNvbnRhaW4gYVxuICogcHJvcGVydHkgY2FsbGVkIGAkZ2V0YCwgd2hpY2ggaG9sZHMgdGhlICoqc2VydmljZSBmYWN0b3J5KiogZnVuY3Rpb24uXG4gKlxuICogV2hlbiB5b3UgcmVxdWVzdCBhIHNlcnZpY2UsIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfSBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyB0aGVcbiAqIGNvcnJlY3QgKipzZXJ2aWNlIHByb3ZpZGVyKiosIGluc3RhbnRpYXRpbmcgaXQgYW5kIHRoZW4gY2FsbGluZyBpdHMgYCRnZXRgICoqc2VydmljZSBmYWN0b3J5KipcbiAqIGZ1bmN0aW9uIHRvIGdldCB0aGUgaW5zdGFuY2Ugb2YgdGhlICoqc2VydmljZSoqLlxuICpcbiAqIE9mdGVuIHNlcnZpY2VzIGhhdmUgbm8gY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGFkZCBtZXRob2RzIHRvIHRoZSBzZXJ2aWNlXG4gKiBwcm92aWRlci4gIFRoZSBwcm92aWRlciB3aWxsIGJlIG5vIG1vcmUgdGhhbiBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpdGggYSBgJGdldGAgcHJvcGVydHkuIEZvclxuICogdGhlc2UgY2FzZXMgdGhlIHtAbGluayBhdXRvLiRwcm92aWRlICRwcm92aWRlfSBzZXJ2aWNlIGhhcyBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIHRvIHJlZ2lzdGVyXG4gKiBzZXJ2aWNlcyB3aXRob3V0IHNwZWNpZnlpbmcgYSBwcm92aWRlci5cbiAqXG4gKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI3Byb3ZpZGVyIHByb3ZpZGVyKG5hbWUsIHByb3ZpZGVyKX0gLSByZWdpc3RlcnMgYSAqKnNlcnZpY2UgcHJvdmlkZXIqKiB3aXRoIHRoZVxuICogICAgIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9XG4gKiAqIHtAbGluayBhdXRvLiRwcm92aWRlI2NvbnN0YW50IGNvbnN0YW50KG5hbWUsIG9iail9IC0gcmVnaXN0ZXJzIGEgdmFsdWUvb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5XG4gKiAgICAgcHJvdmlkZXJzIGFuZCBzZXJ2aWNlcy5cbiAqICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjdmFsdWUgdmFsdWUobmFtZSwgb2JqKX0gLSByZWdpc3RlcnMgYSB2YWx1ZS9vYmplY3QgdGhhdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBieVxuICogICAgIHNlcnZpY2VzLCBub3QgcHJvdmlkZXJzLlxuICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNmYWN0b3J5IGZhY3RvcnkobmFtZSwgZm4pfSAtIHJlZ2lzdGVycyBhIHNlcnZpY2UgKipmYWN0b3J5IGZ1bmN0aW9uKipcbiAqICAgICB0aGF0IHdpbGwgYmUgd3JhcHBlZCBpbiBhICoqc2VydmljZSBwcm92aWRlcioqIG9iamVjdCwgd2hvc2UgYCRnZXRgIHByb3BlcnR5IHdpbGwgY29udGFpbiB0aGVcbiAqICAgICBnaXZlbiBmYWN0b3J5IGZ1bmN0aW9uLlxuICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNzZXJ2aWNlIHNlcnZpY2UobmFtZSwgRm4pfSAtIHJlZ2lzdGVycyBhICoqY29uc3RydWN0b3IgZnVuY3Rpb24qKlxuICogICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGluIGEgKipzZXJ2aWNlIHByb3ZpZGVyKiogb2JqZWN0LCB3aG9zZSBgJGdldGAgcHJvcGVydHkgd2lsbCBpbnN0YW50aWF0ZVxuICogICAgICBhIG5ldyBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICogKiB7QGxpbmsgYXV0by4kcHJvdmlkZSNkZWNvcmF0b3IgZGVjb3JhdG9yKG5hbWUsIGRlY29yRm4pfSAtIHJlZ2lzdGVycyBhICoqZGVjb3JhdG9yIGZ1bmN0aW9uKiogdGhhdFxuICogICAgICB3aWxsIGJlIGFibGUgdG8gbW9kaWZ5IG9yIHJlcGxhY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFub3RoZXIgc2VydmljZS5cbiAqXG4gKiBTZWUgdGhlIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXMuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkcHJvdmlkZSNwcm92aWRlclxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUmVnaXN0ZXIgYSAqKnByb3ZpZGVyIGZ1bmN0aW9uKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIFByb3ZpZGVyIGZ1bmN0aW9uc1xuICogYXJlIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucywgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXNwb25zaWJsZSBmb3IgXCJwcm92aWRpbmdcIiBhIGZhY3RvcnkgZm9yIGFcbiAqIHNlcnZpY2UuXG4gKlxuICogU2VydmljZSBwcm92aWRlciBuYW1lcyBzdGFydCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoZXkgcHJvdmlkZSBmb2xsb3dlZCBieSBgUHJvdmlkZXJgLlxuICogRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgbmcuJGxvZyAkbG9nfSBzZXJ2aWNlIGhhcyBhIHByb3ZpZGVyIGNhbGxlZFxuICoge0BsaW5rIG5nLiRsb2dQcm92aWRlciAkbG9nUHJvdmlkZXJ9LlxuICpcbiAqIFNlcnZpY2UgcHJvdmlkZXIgb2JqZWN0cyBjYW4gaGF2ZSBhZGRpdGlvbmFsIG1ldGhvZHMgd2hpY2ggYWxsb3cgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvdmlkZXJcbiAqIGFuZCBpdHMgc2VydmljZS4gSW1wb3J0YW50bHksIHlvdSBjYW4gY29uZmlndXJlIHdoYXQga2luZCBvZiBzZXJ2aWNlIGlzIGNyZWF0ZWQgYnkgdGhlIGAkZ2V0YFxuICogbWV0aG9kLCBvciBob3cgdGhhdCBzZXJ2aWNlIHdpbGwgYWN0LiBGb3IgZXhhbXBsZSwgdGhlIHtAbGluayBuZy4kbG9nUHJvdmlkZXIgJGxvZ1Byb3ZpZGVyfSBoYXMgYVxuICogbWV0aG9kIHtAbGluayBuZy4kbG9nUHJvdmlkZXIjZGVidWdFbmFibGVkIGRlYnVnRW5hYmxlZH1cbiAqIHdoaWNoIGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0aGUge0BsaW5rIG5nLiRsb2cgJGxvZ30gc2VydmljZSB3aWxsIGxvZyBkZWJ1ZyBtZXNzYWdlcyB0byB0aGVcbiAqIGNvbnNvbGUgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZS4gTk9URTogdGhlIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIHVuZGVyIGBuYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdQcm92aWRlcidgIGtleS5cbiAqIEBwYXJhbSB7KE9iamVjdHxmdW5jdGlvbigpKX0gcHJvdmlkZXIgSWYgdGhlIHByb3ZpZGVyIGlzOlxuICpcbiAqICAgLSBgT2JqZWN0YDogdGhlbiBpdCBzaG91bGQgaGF2ZSBhIGAkZ2V0YCBtZXRob2QuIFRoZSBgJGdldGAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB1c2luZ1xuICogICAgIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgJGluamVjdG9yLmludm9rZSgpfSB3aGVuIGFuIGluc3RhbmNlIG5lZWRzIHRvIGJlIGNyZWF0ZWQuXG4gKiAgIC0gYENvbnN0cnVjdG9yYDogYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIHdpbGwgYmUgY3JlYXRlZCB1c2luZ1xuICogICAgIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnN0YW50aWF0ZSAkaW5qZWN0b3IuaW5zdGFudGlhdGUoKX0sIHRoZW4gdHJlYXRlZCBhcyBgb2JqZWN0YC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlXG5cbiAqIEBleGFtcGxlXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjcmVhdGUgYSBzaW1wbGUgZXZlbnQgdHJhY2tpbmcgc2VydmljZSBhbmQgcmVnaXN0ZXIgaXQgdXNpbmdcbiAqIHtAbGluayBhdXRvLiRwcm92aWRlI3Byb3ZpZGVyICRwcm92aWRlLnByb3ZpZGVyKCl9LlxuICpcbiAqIGBgYGpzXG4gKiAgLy8gRGVmaW5lIHRoZSBldmVudFRyYWNrZXIgcHJvdmlkZXJcbiAqICBmdW5jdGlvbiBFdmVudFRyYWNrZXJQcm92aWRlcigpIHtcbiAqICAgIHZhciB0cmFja2luZ1VybCA9ICcvdHJhY2snO1xuICpcbiAqICAgIC8vIEEgcHJvdmlkZXIgbWV0aG9kIGZvciBjb25maWd1cmluZyB3aGVyZSB0aGUgdHJhY2tlZCBldmVudHMgc2hvdWxkIGJlZW4gc2F2ZWRcbiAqICAgIHRoaXMuc2V0VHJhY2tpbmdVcmwgPSBmdW5jdGlvbih1cmwpIHtcbiAqICAgICAgdHJhY2tpbmdVcmwgPSB1cmw7XG4gKiAgICB9O1xuICpcbiAqICAgIC8vIFRoZSBzZXJ2aWNlIGZhY3RvcnkgZnVuY3Rpb25cbiAqICAgIHRoaXMuJGdldCA9IFsnJGh0dHAnLCBmdW5jdGlvbigkaHR0cCkge1xuICogICAgICB2YXIgdHJhY2tlZEV2ZW50cyA9IHt9O1xuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC8vIENhbGwgdGhpcyB0byB0cmFjayBhbiBldmVudFxuICogICAgICAgIGV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICogICAgICAgICAgdmFyIGNvdW50ID0gdHJhY2tlZEV2ZW50c1tldmVudF0gfHwgMDtcbiAqICAgICAgICAgIGNvdW50ICs9IDE7XG4gKiAgICAgICAgICB0cmFja2VkRXZlbnRzW2V2ZW50XSA9IGNvdW50O1xuICogICAgICAgICAgcmV0dXJuIGNvdW50O1xuICogICAgICAgIH0sXG4gKiAgICAgICAgLy8gQ2FsbCB0aGlzIHRvIHNhdmUgdGhlIHRyYWNrZWQgZXZlbnRzIHRvIHRoZSB0cmFja2luZ1VybFxuICogICAgICAgIHNhdmU6IGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgJGh0dHAucG9zdCh0cmFja2luZ1VybCwgdHJhY2tlZEV2ZW50cyk7XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogICAgfV07XG4gKiAgfVxuICpcbiAqICBkZXNjcmliZSgnZXZlbnRUcmFja2VyJywgZnVuY3Rpb24oKSB7XG4gKiAgICB2YXIgcG9zdFNweTtcbiAqXG4gKiAgICBiZWZvcmVFYWNoKG1vZHVsZShmdW5jdGlvbigkcHJvdmlkZSkge1xuICogICAgICAvLyBSZWdpc3RlciB0aGUgZXZlbnRUcmFja2VyIHByb3ZpZGVyXG4gKiAgICAgICRwcm92aWRlLnByb3ZpZGVyKCdldmVudFRyYWNrZXInLCBFdmVudFRyYWNrZXJQcm92aWRlcik7XG4gKiAgICB9KSk7XG4gKlxuICogICAgYmVmb3JlRWFjaChtb2R1bGUoZnVuY3Rpb24oZXZlbnRUcmFja2VyUHJvdmlkZXIpIHtcbiAqICAgICAgLy8gQ29uZmlndXJlIGV2ZW50VHJhY2tlciBwcm92aWRlclxuICogICAgICBldmVudFRyYWNrZXJQcm92aWRlci5zZXRUcmFja2luZ1VybCgnL2N1c3RvbS10cmFjaycpO1xuICogICAgfSkpO1xuICpcbiAqICAgIGl0KCd0cmFja3MgZXZlbnRzJywgaW5qZWN0KGZ1bmN0aW9uKGV2ZW50VHJhY2tlcikge1xuICogICAgICBleHBlY3QoZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpKS50b0VxdWFsKDEpO1xuICogICAgICBleHBlY3QoZXZlbnRUcmFja2VyLmV2ZW50KCdsb2dpbicpKS50b0VxdWFsKDIpO1xuICogICAgfSkpO1xuICpcbiAqICAgIGl0KCdzYXZlcyB0byB0aGUgdHJhY2tpbmcgdXJsJywgaW5qZWN0KGZ1bmN0aW9uKGV2ZW50VHJhY2tlciwgJGh0dHApIHtcbiAqICAgICAgcG9zdFNweSA9IHNweU9uKCRodHRwLCAncG9zdCcpO1xuICogICAgICBldmVudFRyYWNrZXIuZXZlbnQoJ2xvZ2luJyk7XG4gKiAgICAgIGV2ZW50VHJhY2tlci5zYXZlKCk7XG4gKiAgICAgIGV4cGVjdChwb3N0U3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gKiAgICAgIGV4cGVjdChwb3N0U3B5Lm1vc3RSZWNlbnRDYWxsLmFyZ3NbMF0pLm5vdC50b0VxdWFsKCcvdHJhY2snKTtcbiAqICAgICAgZXhwZWN0KHBvc3RTcHkubW9zdFJlY2VudENhbGwuYXJnc1swXSkudG9FcXVhbCgnL2N1c3RvbS10cmFjaycpO1xuICogICAgICBleHBlY3QocG9zdFNweS5tb3N0UmVjZW50Q2FsbC5hcmdzWzFdKS50b0VxdWFsKHsgJ2xvZ2luJzogMSB9KTtcbiAqICAgIH0pKTtcbiAqICB9KTtcbiAqIGBgYFxuICovXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJHByb3ZpZGUjZmFjdG9yeVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUmVnaXN0ZXIgYSAqKnNlcnZpY2UgZmFjdG9yeSoqLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB0byByZXR1cm4gdGhlIHNlcnZpY2UgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHNob3J0IGZvciByZWdpc3RlcmluZyBhIHNlcnZpY2Ugd2hlcmUgaXRzIHByb3ZpZGVyIGNvbnNpc3RzIG9mIG9ubHkgYSBgJGdldGAgcHJvcGVydHksXG4gKiB3aGljaCBpcyB0aGUgZ2l2ZW4gc2VydmljZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICogWW91IHNob3VsZCB1c2Uge0BsaW5rIGF1dG8uJHByb3ZpZGUjZmFjdG9yeSAkcHJvdmlkZS5mYWN0b3J5KGdldEZuKX0gaWYgeW91IGRvIG5vdCBuZWVkIHRvXG4gKiBjb25maWd1cmUgeW91ciBzZXJ2aWNlIGluIGEgcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gJGdldEZuIFRoZSBpbmplY3RhYmxlICRnZXRGbiBmb3IgdGhlIGluc3RhbmNlIGNyZWF0aW9uLlxuICogICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxseSB0aGlzIGlzIGEgc2hvcnQgaGFuZCBmb3IgYCRwcm92aWRlLnByb3ZpZGVyKG5hbWUsIHskZ2V0OiAkZ2V0Rm59KWAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlXG4gKlxuICogQGV4YW1wbGVcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIHNlcnZpY2VcbiAqIGBgYGpzXG4gKiAgICRwcm92aWRlLmZhY3RvcnkoJ3BpbmcnLCBbJyRodHRwJywgZnVuY3Rpb24oJGh0dHApIHtcbiAqICAgICByZXR1cm4gZnVuY3Rpb24gcGluZygpIHtcbiAqICAgICAgIHJldHVybiAkaHR0cC5zZW5kKCcvcGluZycpO1xuICogICAgIH07XG4gKiAgIH1dKTtcbiAqIGBgYFxuICogWW91IHdvdWxkIHRoZW4gaW5qZWN0IGFuZCB1c2UgdGhpcyBzZXJ2aWNlIGxpa2UgdGhpczpcbiAqIGBgYGpzXG4gKiAgIHNvbWVNb2R1bGUuY29udHJvbGxlcignQ3RybCcsIFsncGluZycsIGZ1bmN0aW9uKHBpbmcpIHtcbiAqICAgICBwaW5nKCk7XG4gKiAgIH1dKTtcbiAqIGBgYFxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkcHJvdmlkZSNzZXJ2aWNlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBSZWdpc3RlciBhICoqc2VydmljZSBjb25zdHJ1Y3RvcioqLCB3aGljaCB3aWxsIGJlIGludm9rZWQgd2l0aCBgbmV3YCB0byBjcmVhdGUgdGhlIHNlcnZpY2VcbiAqIGluc3RhbmNlLlxuICogVGhpcyBpcyBzaG9ydCBmb3IgcmVnaXN0ZXJpbmcgYSBzZXJ2aWNlIHdoZXJlIGl0cyBwcm92aWRlcidzIGAkZ2V0YCBwcm9wZXJ0eSBpcyBhIGZhY3RvcnlcbiAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGluamVjdG9yIGZyb20gdGhlIHNlcnZpY2UgY29uc3RydWN0b3JcbiAqIGZ1bmN0aW9uLlxuICpcbiAqIEludGVybmFsbHkgaXQgbG9va3MgYSBiaXQgbGlrZSB0aGlzOlxuICpcbiAqIGBgYFxuICoge1xuICogICAkZ2V0OiBmdW5jdGlvbigpIHtcbiAqICAgICByZXR1cm4gJGluamVjdG9yLmluc3RhbnRpYXRlKGNvbnN0cnVjdG9yKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICpcbiAqIFlvdSBzaG91bGQgdXNlIHtAbGluayBhdXRvLiRwcm92aWRlI3NlcnZpY2UgJHByb3ZpZGUuc2VydmljZShjbGFzcyl9IGlmIHlvdSBkZWZpbmUgeW91ciBzZXJ2aWNlXG4gKiBhcyBhIHR5cGUvY2xhc3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gY29uc3RydWN0b3IgQW4gaW5qZWN0YWJsZSBjbGFzcyAoY29uc3RydWN0b3IgZnVuY3Rpb24pXG4gKiAgICAgdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IHJlZ2lzdGVyZWQgcHJvdmlkZXIgaW5zdGFuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHJlZ2lzdGVyaW5nIGEgc2VydmljZSB1c2luZ1xuICoge0BsaW5rIGF1dG8uJHByb3ZpZGUjc2VydmljZSAkcHJvdmlkZS5zZXJ2aWNlKGNsYXNzKX0uXG4gKiBgYGBqc1xuICogICB2YXIgUGluZyA9IGZ1bmN0aW9uKCRodHRwKSB7XG4gKiAgICAgdGhpcy4kaHR0cCA9ICRodHRwO1xuICogICB9O1xuICpcbiAqICAgUGluZy4kaW5qZWN0ID0gWyckaHR0cCddO1xuICpcbiAqICAgUGluZy5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKCkge1xuICogICAgIHJldHVybiB0aGlzLiRodHRwLmdldCgnL3BpbmcnKTtcbiAqICAgfTtcbiAqICAgJHByb3ZpZGUuc2VydmljZSgncGluZycsIFBpbmcpO1xuICogYGBgXG4gKiBZb3Ugd291bGQgdGhlbiBpbmplY3QgYW5kIHVzZSB0aGlzIHNlcnZpY2UgbGlrZSB0aGlzOlxuICogYGBganNcbiAqICAgc29tZU1vZHVsZS5jb250cm9sbGVyKCdDdHJsJywgWydwaW5nJywgZnVuY3Rpb24ocGluZykge1xuICogICAgIHBpbmcuc2VuZCgpO1xuICogICB9XSk7XG4gKiBgYGBcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJHByb3ZpZGUjdmFsdWVcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFJlZ2lzdGVyIGEgKip2YWx1ZSBzZXJ2aWNlKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0sIHN1Y2ggYXMgYSBzdHJpbmcsIGFcbiAqIG51bWJlciwgYW4gYXJyYXksIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLiBUaGlzIGlzIHNob3J0IGZvciByZWdpc3RlcmluZyBhIHNlcnZpY2Ugd2hlcmUgaXRzXG4gKiBwcm92aWRlcidzIGAkZ2V0YCBwcm9wZXJ0eSBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlICoqdmFsdWVcbiAqIHNlcnZpY2UqKi4gVGhhdCBhbHNvIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmplY3Qgb3RoZXIgc2VydmljZXMgaW50byBhIHZhbHVlIHNlcnZpY2UuXG4gKlxuICogVmFsdWUgc2VydmljZXMgYXJlIHNpbWlsYXIgdG8gY29uc3RhbnQgc2VydmljZXMsIGV4Y2VwdCB0aGF0IHRoZXkgY2Fubm90IGJlIGluamVjdGVkIGludG8gYVxuICogbW9kdWxlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKHNlZSB7QGxpbmsgYW5ndWxhci5Nb2R1bGUjY29uZmlnfSkgYnV0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnlcbiAqIGFuIEFuZ3VsYXIge0BsaW5rIGF1dG8uJHByb3ZpZGUjZGVjb3JhdG9yIGRlY29yYXRvcn0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSByZWdpc3RlcmVkIHByb3ZpZGVyIGluc3RhbmNlXG4gKlxuICogQGV4YW1wbGVcbiAqIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgY3JlYXRpbmcgdmFsdWUgc2VydmljZXMuXG4gKiBgYGBqc1xuICogICAkcHJvdmlkZS52YWx1ZSgnQURNSU5fVVNFUicsICdhZG1pbicpO1xuICpcbiAqICAgJHByb3ZpZGUudmFsdWUoJ1JvbGVMb29rdXAnLCB7IGFkbWluOiAwLCB3cml0ZXI6IDEsIHJlYWRlcjogMiB9KTtcbiAqXG4gKiAgICRwcm92aWRlLnZhbHVlKCdoYWxmT2YnLCBmdW5jdGlvbih2YWx1ZSkge1xuICogICAgIHJldHVybiB2YWx1ZSAvIDI7XG4gKiAgIH0pO1xuICogYGBgXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRwcm92aWRlI2NvbnN0YW50XG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBSZWdpc3RlciBhICoqY29uc3RhbnQgc2VydmljZSoqIHdpdGggdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LCBzdWNoIGFzIGEgc3RyaW5nLFxuICogYSBudW1iZXIsIGFuIGFycmF5LCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbi4gTGlrZSB0aGUge0BsaW5rIGF1dG8uJHByb3ZpZGUjdmFsdWUgdmFsdWV9LCBpdCBpcyBub3RcbiAqIHBvc3NpYmxlIHRvIGluamVjdCBvdGhlciBzZXJ2aWNlcyBpbnRvIGEgY29uc3RhbnQuXG4gKlxuICogQnV0IHVubGlrZSB7QGxpbmsgYXV0by4kcHJvdmlkZSN2YWx1ZSB2YWx1ZX0sIGEgY29uc3RhbnQgY2FuIGJlXG4gKiBpbmplY3RlZCBpbnRvIGEgbW9kdWxlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKHNlZSB7QGxpbmsgYW5ndWxhci5Nb2R1bGUjY29uZmlnfSkgYW5kIGl0IGNhbm5vdFxuICogYmUgb3ZlcnJpZGRlbiBieSBhbiBBbmd1bGFyIHtAbGluayBhdXRvLiRwcm92aWRlI2RlY29yYXRvciBkZWNvcmF0b3J9LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb25zdGFudC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIGNvbnN0YW50IHZhbHVlLlxuICogQHJldHVybnMge09iamVjdH0gcmVnaXN0ZXJlZCBpbnN0YW5jZVxuICpcbiAqIEBleGFtcGxlXG4gKiBIZXJlIGEgc29tZSBleGFtcGxlcyBvZiBjcmVhdGluZyBjb25zdGFudHM6XG4gKiBgYGBqc1xuICogICAkcHJvdmlkZS5jb25zdGFudCgnU0hBUkRfSEVJR0hUJywgMzA2KTtcbiAqXG4gKiAgICRwcm92aWRlLmNvbnN0YW50KCdNWV9DT0xPVVJTJywgWydyZWQnLCAnYmx1ZScsICdncmV5J10pO1xuICpcbiAqICAgJHByb3ZpZGUuY29uc3RhbnQoJ2RvdWJsZScsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgICAgcmV0dXJuIHZhbHVlICogMjtcbiAqICAgfSk7XG4gKiBgYGBcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgJHByb3ZpZGUjZGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBSZWdpc3RlciBhICoqZGVjb3JhdG9yIGZ1bmN0aW9uKiogd2l0aCB0aGUge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIEEgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKiBpbnRlcmNlcHRzIHRoZSBjcmVhdGlvbiBvZiBhIHNlcnZpY2UsIGFsbG93aW5nIGl0IHRvIG92ZXJyaWRlIG9yIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgdGhlXG4gKiBzZXJ2aWNlLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkZWNvcmF0b3IgZnVuY3Rpb24gbWF5IGJlIHRoZSBvcmlnaW5hbCBzZXJ2aWNlLCBvciBhIG5ldyBzZXJ2aWNlXG4gKiB0aGF0IHJlcGxhY2VzIChvciB3cmFwcyBhbmQgZGVsZWdhdGVzIHRvKSB0aGUgb3JpZ2luYWwgc2VydmljZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdXNpbmcgZGVjb3JhdG9ycyBpbiB0aGUge0BsaW5rIGd1aWRlL2RlY29yYXRvcnN9IGd1aWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGRlY29yYXRlLlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheS48c3RyaW5nfEZ1bmN0aW9uPn0gZGVjb3JhdG9yIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHNlcnZpY2UgbmVlZHMgdG8gYmVcbiAqICAgIHByb3ZpZGVkIGFuZCBzaG91bGQgcmV0dXJuIHRoZSBkZWNvcmF0ZWQgc2VydmljZSBpbnN0YW5jZS4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1c2luZ1xuICogICAgdGhlIHtAbGluayBhdXRvLiRpbmplY3RvciNpbnZva2UgaW5qZWN0b3IuaW52b2tlfSBtZXRob2QgYW5kIGlzIHRoZXJlZm9yZSBmdWxseSBpbmplY3RhYmxlLlxuICogICAgTG9jYWwgaW5qZWN0aW9uIGFyZ3VtZW50czpcbiAqXG4gKiAgICAqIGAkZGVsZWdhdGVgIC0gVGhlIG9yaWdpbmFsIHNlcnZpY2UgaW5zdGFuY2UsIHdoaWNoIGNhbiBiZSByZXBsYWNlZCwgbW9ua2V5IHBhdGNoZWQsIGNvbmZpZ3VyZWQsXG4gKiAgICAgIGRlY29yYXRlZCBvciBkZWxlZ2F0ZWQgdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqIEhlcmUgd2UgZGVjb3JhdGUgdGhlIHtAbGluayBuZy4kbG9nICRsb2d9IHNlcnZpY2UgdG8gY29udmVydCB3YXJuaW5ncyB0byBlcnJvcnMgYnkgaW50ZXJjZXB0aW5nXG4gKiBjYWxscyB0byB7QGxpbmsgbmcuJGxvZyNlcnJvciAkbG9nLndhcm4oKX0uXG4gKiBgYGBqc1xuICogICAkcHJvdmlkZS5kZWNvcmF0b3IoJyRsb2cnLCBbJyRkZWxlZ2F0ZScsIGZ1bmN0aW9uKCRkZWxlZ2F0ZSkge1xuICogICAgICRkZWxlZ2F0ZS53YXJuID0gJGRlbGVnYXRlLmVycm9yO1xuICogICAgIHJldHVybiAkZGVsZWdhdGU7XG4gKiAgIH1dKTtcbiAqIGBgYFxuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlSW5qZWN0b3IobW9kdWxlc1RvTG9hZCwgc3RyaWN0RGkpIHtcbiAgc3RyaWN0RGkgPSAoc3RyaWN0RGkgPT09IHRydWUpO1xuICB2YXIgSU5TVEFOVElBVElORyA9IHt9LFxuICAgICAgcHJvdmlkZXJTdWZmaXggPSAnUHJvdmlkZXInLFxuICAgICAgcGF0aCA9IFtdLFxuICAgICAgbG9hZGVkTW9kdWxlcyA9IG5ldyBIYXNoTWFwKFtdLCB0cnVlKSxcbiAgICAgIHByb3ZpZGVyQ2FjaGUgPSB7XG4gICAgICAgICRwcm92aWRlOiB7XG4gICAgICAgICAgICBwcm92aWRlcjogc3VwcG9ydE9iamVjdChwcm92aWRlciksXG4gICAgICAgICAgICBmYWN0b3J5OiBzdXBwb3J0T2JqZWN0KGZhY3RvcnkpLFxuICAgICAgICAgICAgc2VydmljZTogc3VwcG9ydE9iamVjdChzZXJ2aWNlKSxcbiAgICAgICAgICAgIHZhbHVlOiBzdXBwb3J0T2JqZWN0KHZhbHVlKSxcbiAgICAgICAgICAgIGNvbnN0YW50OiBzdXBwb3J0T2JqZWN0KGNvbnN0YW50KSxcbiAgICAgICAgICAgIGRlY29yYXRvcjogZGVjb3JhdG9yXG4gICAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3ZpZGVySW5qZWN0b3IgPSAocHJvdmlkZXJDYWNoZS4kaW5qZWN0b3IgPVxuICAgICAgICAgIGNyZWF0ZUludGVybmFsSW5qZWN0b3IocHJvdmlkZXJDYWNoZSwgZnVuY3Rpb24oc2VydmljZU5hbWUsIGNhbGxlcikge1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNTdHJpbmcoY2FsbGVyKSkge1xuICAgICAgICAgICAgICBwYXRoLnB1c2goY2FsbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycigndW5wcicsICdVbmtub3duIHByb3ZpZGVyOiB7MH0nLCBwYXRoLmpvaW4oJyA8LSAnKSk7XG4gICAgICAgICAgfSkpLFxuICAgICAgaW5zdGFuY2VDYWNoZSA9IHt9LFxuICAgICAgcHJvdG9JbnN0YW5jZUluamVjdG9yID1cbiAgICAgICAgICBjcmVhdGVJbnRlcm5hbEluamVjdG9yKGluc3RhbmNlQ2FjaGUsIGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBjYWxsZXIpIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IHByb3ZpZGVySW5qZWN0b3IuZ2V0KHNlcnZpY2VOYW1lICsgcHJvdmlkZXJTdWZmaXgsIGNhbGxlcik7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VJbmplY3Rvci5pbnZva2UoXG4gICAgICAgICAgICAgICAgcHJvdmlkZXIuJGdldCwgcHJvdmlkZXIsIHVuZGVmaW5lZCwgc2VydmljZU5hbWUpO1xuICAgICAgICAgIH0pLFxuICAgICAgaW5zdGFuY2VJbmplY3RvciA9IHByb3RvSW5zdGFuY2VJbmplY3RvcjtcblxuICBwcm92aWRlckNhY2hlWyckaW5qZWN0b3InICsgcHJvdmlkZXJTdWZmaXhdID0geyAkZ2V0OiB2YWx1ZUZuKHByb3RvSW5zdGFuY2VJbmplY3RvcikgfTtcbiAgdmFyIHJ1bkJsb2NrcyA9IGxvYWRNb2R1bGVzKG1vZHVsZXNUb0xvYWQpO1xuICBpbnN0YW5jZUluamVjdG9yID0gcHJvdG9JbnN0YW5jZUluamVjdG9yLmdldCgnJGluamVjdG9yJyk7XG4gIGluc3RhbmNlSW5qZWN0b3Iuc3RyaWN0RGkgPSBzdHJpY3REaTtcbiAgZm9yRWFjaChydW5CbG9ja3MsIGZ1bmN0aW9uKGZuKSB7IGlmIChmbikgaW5zdGFuY2VJbmplY3Rvci5pbnZva2UoZm4pOyB9KTtcblxuICByZXR1cm4gaW5zdGFuY2VJbmplY3RvcjtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gJHByb3ZpZGVyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIGZ1bmN0aW9uIHN1cHBvcnRPYmplY3QoZGVsZWdhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgZm9yRWFjaChrZXksIHJldmVyc2VQYXJhbXMoZGVsZWdhdGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWxlZ2F0ZShrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvdmlkZXIobmFtZSwgcHJvdmlkZXJfKSB7XG4gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgJ3NlcnZpY2UnKTtcbiAgICBpZiAoaXNGdW5jdGlvbihwcm92aWRlcl8pIHx8IGlzQXJyYXkocHJvdmlkZXJfKSkge1xuICAgICAgcHJvdmlkZXJfID0gcHJvdmlkZXJJbmplY3Rvci5pbnN0YW50aWF0ZShwcm92aWRlcl8pO1xuICAgIH1cbiAgICBpZiAoIXByb3ZpZGVyXy4kZ2V0KSB7XG4gICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ3BnZXQnLCAnUHJvdmlkZXIgXFwnezB9XFwnIG11c3QgZGVmaW5lICRnZXQgZmFjdG9yeSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuICAgIHJldHVybiAocHJvdmlkZXJDYWNoZVtuYW1lICsgcHJvdmlkZXJTdWZmaXhdID0gcHJvdmlkZXJfKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZm9yY2VSZXR1cm5WYWx1ZShuYW1lLCBmYWN0b3J5KSB7XG4gICAgcmV0dXJuIC8qKiBAdGhpcyAqLyBmdW5jdGlvbiBlbmZvcmNlZFJldHVyblZhbHVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGluc3RhbmNlSW5qZWN0b3IuaW52b2tlKGZhY3RvcnksIHRoaXMpO1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgJGluamVjdG9yTWluRXJyKCd1bmRlZicsICdQcm92aWRlciBcXCd7MH1cXCcgbXVzdCByZXR1cm4gYSB2YWx1ZSBmcm9tICRnZXQgZmFjdG9yeSBtZXRob2QuJywgbmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBmYWN0b3J5KG5hbWUsIGZhY3RvcnlGbiwgZW5mb3JjZSkge1xuICAgIHJldHVybiBwcm92aWRlcihuYW1lLCB7XG4gICAgICAkZ2V0OiBlbmZvcmNlICE9PSBmYWxzZSA/IGVuZm9yY2VSZXR1cm5WYWx1ZShuYW1lLCBmYWN0b3J5Rm4pIDogZmFjdG9yeUZuXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXJ2aWNlKG5hbWUsIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkobmFtZSwgWyckaW5qZWN0b3InLCBmdW5jdGlvbigkaW5qZWN0b3IpIHtcbiAgICAgIHJldHVybiAkaW5qZWN0b3IuaW5zdGFudGlhdGUoY29uc3RydWN0b3IpO1xuICAgIH1dKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbHVlKG5hbWUsIHZhbCkgeyByZXR1cm4gZmFjdG9yeShuYW1lLCB2YWx1ZUZuKHZhbCksIGZhbHNlKTsgfVxuXG4gIGZ1bmN0aW9uIGNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgJ2NvbnN0YW50Jyk7XG4gICAgcHJvdmlkZXJDYWNoZVtuYW1lXSA9IHZhbHVlO1xuICAgIGluc3RhbmNlQ2FjaGVbbmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29yYXRvcihzZXJ2aWNlTmFtZSwgZGVjb3JGbikge1xuICAgIHZhciBvcmlnUHJvdmlkZXIgPSBwcm92aWRlckluamVjdG9yLmdldChzZXJ2aWNlTmFtZSArIHByb3ZpZGVyU3VmZml4KSxcbiAgICAgICAgb3JpZyRnZXQgPSBvcmlnUHJvdmlkZXIuJGdldDtcblxuICAgIG9yaWdQcm92aWRlci4kZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb3JpZ0luc3RhbmNlID0gaW5zdGFuY2VJbmplY3Rvci5pbnZva2Uob3JpZyRnZXQsIG9yaWdQcm92aWRlcik7XG4gICAgICByZXR1cm4gaW5zdGFuY2VJbmplY3Rvci5pbnZva2UoZGVjb3JGbiwgbnVsbCwgeyRkZWxlZ2F0ZTogb3JpZ0luc3RhbmNlfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBNb2R1bGUgTG9hZGluZ1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgZnVuY3Rpb24gbG9hZE1vZHVsZXMobW9kdWxlc1RvTG9hZCkge1xuICAgIGFzc2VydEFyZyhpc1VuZGVmaW5lZChtb2R1bGVzVG9Mb2FkKSB8fCBpc0FycmF5KG1vZHVsZXNUb0xvYWQpLCAnbW9kdWxlc1RvTG9hZCcsICdub3QgYW4gYXJyYXknKTtcbiAgICB2YXIgcnVuQmxvY2tzID0gW10sIG1vZHVsZUZuO1xuICAgIGZvckVhY2gobW9kdWxlc1RvTG9hZCwgZnVuY3Rpb24obW9kdWxlKSB7XG4gICAgICBpZiAobG9hZGVkTW9kdWxlcy5nZXQobW9kdWxlKSkgcmV0dXJuO1xuICAgICAgbG9hZGVkTW9kdWxlcy5wdXQobW9kdWxlLCB0cnVlKTtcblxuICAgICAgZnVuY3Rpb24gcnVuSW52b2tlUXVldWUocXVldWUpIHtcbiAgICAgICAgdmFyIGksIGlpO1xuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHF1ZXVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICB2YXIgaW52b2tlQXJncyA9IHF1ZXVlW2ldLFxuICAgICAgICAgICAgICBwcm92aWRlciA9IHByb3ZpZGVySW5qZWN0b3IuZ2V0KGludm9rZUFyZ3NbMF0pO1xuXG4gICAgICAgICAgcHJvdmlkZXJbaW52b2tlQXJnc1sxXV0uYXBwbHkocHJvdmlkZXIsIGludm9rZUFyZ3NbMl0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhtb2R1bGUpKSB7XG4gICAgICAgICAgbW9kdWxlRm4gPSBhbmd1bGFyTW9kdWxlKG1vZHVsZSk7XG4gICAgICAgICAgcnVuQmxvY2tzID0gcnVuQmxvY2tzLmNvbmNhdChsb2FkTW9kdWxlcyhtb2R1bGVGbi5yZXF1aXJlcykpLmNvbmNhdChtb2R1bGVGbi5fcnVuQmxvY2tzKTtcbiAgICAgICAgICBydW5JbnZva2VRdWV1ZShtb2R1bGVGbi5faW52b2tlUXVldWUpO1xuICAgICAgICAgIHJ1bkludm9rZVF1ZXVlKG1vZHVsZUZuLl9jb25maWdCbG9ja3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24obW9kdWxlKSkge1xuICAgICAgICAgICAgcnVuQmxvY2tzLnB1c2gocHJvdmlkZXJJbmplY3Rvci5pbnZva2UobW9kdWxlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShtb2R1bGUpKSB7XG4gICAgICAgICAgICBydW5CbG9ja3MucHVzaChwcm92aWRlckluamVjdG9yLmludm9rZShtb2R1bGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnRBcmdGbihtb2R1bGUsICdtb2R1bGUnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNBcnJheShtb2R1bGUpKSB7XG4gICAgICAgICAgbW9kdWxlID0gbW9kdWxlW21vZHVsZS5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS5tZXNzYWdlICYmIGUuc3RhY2sgJiYgZS5zdGFjay5pbmRleE9mKGUubWVzc2FnZSkgPT09IC0xKSB7XG4gICAgICAgICAgLy8gU2FmYXJpICYgRkYncyBzdGFjayB0cmFjZXMgZG9uJ3QgY29udGFpbiBlcnJvci5tZXNzYWdlIGNvbnRlbnRcbiAgICAgICAgICAvLyB1bmxpa2UgdGhvc2Ugb2YgQ2hyb21lIGFuZCBJRVxuICAgICAgICAgIC8vIFNvIGlmIHN0YWNrIGRvZXNuJ3QgY29udGFpbiBtZXNzYWdlLCB3ZSBjcmVhdGUgYSBuZXcgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aC5cbiAgICAgICAgICAvLyBTaW5jZSBlcnJvci5zdGFjayBpcyByZWFkLW9ubHkgaW4gU2FmYXJpLCBJJ20gb3ZlcnJpZGluZyBlIGFuZCBub3QgZS5zdGFjayBoZXJlLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leC1hc3NpZ25cbiAgICAgICAgICBlID0gZS5tZXNzYWdlICsgJ1xcbicgKyBlLnN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignbW9kdWxlcnInLCAnRmFpbGVkIHRvIGluc3RhbnRpYXRlIG1vZHVsZSB7MH0gZHVlIHRvOlxcbnsxfScsXG4gICAgICAgICAgICAgICAgICBtb2R1bGUsIGUuc3RhY2sgfHwgZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBydW5CbG9ja3M7XG4gIH1cblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gaW50ZXJuYWwgSW5qZWN0b3JcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxJbmplY3RvcihjYWNoZSwgZmFjdG9yeSkge1xuXG4gICAgZnVuY3Rpb24gZ2V0U2VydmljZShzZXJ2aWNlTmFtZSwgY2FsbGVyKSB7XG4gICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICAgIGlmIChjYWNoZVtzZXJ2aWNlTmFtZV0gPT09IElOU1RBTlRJQVRJTkcpIHtcbiAgICAgICAgICB0aHJvdyAkaW5qZWN0b3JNaW5FcnIoJ2NkZXAnLCAnQ2lyY3VsYXIgZGVwZW5kZW5jeSBmb3VuZDogezB9JyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgKyAnIDwtICcgKyBwYXRoLmpvaW4oJyA8LSAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3NlcnZpY2VOYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGF0aC51bnNoaWZ0KHNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBjYWNoZVtzZXJ2aWNlTmFtZV0gPSBJTlNUQU5USUFUSU5HO1xuICAgICAgICAgIGNhY2hlW3NlcnZpY2VOYW1lXSA9IGZhY3Rvcnkoc2VydmljZU5hbWUsIGNhbGxlcik7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlW3NlcnZpY2VOYW1lXTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGNhY2hlW3NlcnZpY2VOYW1lXSA9PT0gSU5TVEFOVElBVElORykge1xuICAgICAgICAgICAgZGVsZXRlIGNhY2hlW3NlcnZpY2VOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHBhdGguc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gaW5qZWN0aW9uQXJncyhmbiwgbG9jYWxzLCBzZXJ2aWNlTmFtZSkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICAkaW5qZWN0ID0gY3JlYXRlSW5qZWN0b3IuJCRhbm5vdGF0ZShmbiwgc3RyaWN0RGksIHNlcnZpY2VOYW1lKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9ICRpbmplY3QubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9ICRpbmplY3RbaV07XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93ICRpbmplY3Rvck1pbkVycignaXRrbicsXG4gICAgICAgICAgICAgICAgICAnSW5jb3JyZWN0IGluamVjdGlvbiB0b2tlbiEgRXhwZWN0ZWQgc2VydmljZSBuYW1lIGFzIHN0cmluZywgZ290IHswfScsIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5wdXNoKGxvY2FscyAmJiBsb2NhbHMuaGFzT3duUHJvcGVydHkoa2V5KSA/IGxvY2Fsc1trZXldIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2Uoa2V5LCBzZXJ2aWNlTmFtZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNDbGFzcyhmdW5jKSB7XG4gICAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHlcbiAgICAgIC8vIElFIDktMTEgZG8gbm90IHN1cHBvcnQgY2xhc3NlcyBhbmQgSUU5IGxlYWtzIHdpdGggdGhlIGNvZGUgYmVsb3cuXG4gICAgICBpZiAobXNpZSB8fCB0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gZnVuYy4kJG5nSXNDbGFzcztcbiAgICAgIGlmICghaXNCb29sZWFuKHJlc3VsdCkpIHtcbiAgICAgICAgLy8gU3VwcG9ydDogRWRnZSAxMi0xMyBvbmx5XG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvNjE1NjEzNS9cbiAgICAgICAgcmVzdWx0ID0gZnVuYy4kJG5nSXNDbGFzcyA9IC9eKD86Y2xhc3NcXGJ8Y29uc3RydWN0b3JcXCgpLy50ZXN0KHN0cmluZ2lmeUZuKGZ1bmMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52b2tlKGZuLCBzZWxmLCBsb2NhbHMsIHNlcnZpY2VOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIGxvY2FscyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2VydmljZU5hbWUgPSBsb2NhbHM7XG4gICAgICAgIGxvY2FscyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmdzID0gaW5qZWN0aW9uQXJncyhmbiwgbG9jYWxzLCBzZXJ2aWNlTmFtZSk7XG4gICAgICBpZiAoaXNBcnJheShmbikpIHtcbiAgICAgICAgZm4gPSBmbltmbi5sZW5ndGggLSAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NsYXNzKGZuKSkge1xuICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9hbmd1bGFyanMtaW52b2tlLWFwcGx5LXZzLXN3aXRjaFxuICAgICAgICAvLyAjNTM4OFxuICAgICAgICByZXR1cm4gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmdzLnVuc2hpZnQobnVsbCk7XG4gICAgICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KGZuLCBhcmdzKSkoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlKFR5cGUsIGxvY2Fscywgc2VydmljZU5hbWUpIHtcbiAgICAgIC8vIENoZWNrIGlmIFR5cGUgaXMgYW5ub3RhdGVkIGFuZCB1c2UganVzdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gYXQgbi0xIGFzIHBhcmFtZXRlclxuICAgICAgLy8gZS5nLiBzb21lTW9kdWxlLmZhY3RvcnkoJ2dyZWV0ZXInLCBbJyR3aW5kb3cnLCBmdW5jdGlvbihyZW5hbWVkJHdpbmRvdykge31dKTtcbiAgICAgIHZhciBjdG9yID0gKGlzQXJyYXkoVHlwZSkgPyBUeXBlW1R5cGUubGVuZ3RoIC0gMV0gOiBUeXBlKTtcbiAgICAgIHZhciBhcmdzID0gaW5qZWN0aW9uQXJncyhUeXBlLCBsb2NhbHMsIHNlcnZpY2VOYW1lKTtcbiAgICAgIC8vIEVtcHR5IG9iamVjdCBhdCBwb3NpdGlvbiAwIGlzIGlnbm9yZWQgZm9yIGludm9jYXRpb24gd2l0aCBgbmV3YCwgYnV0IHJlcXVpcmVkLlxuICAgICAgYXJncy51bnNoaWZ0KG51bGwpO1xuICAgICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoY3RvciwgYXJncykpKCk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4ge1xuICAgICAgaW52b2tlOiBpbnZva2UsXG4gICAgICBpbnN0YW50aWF0ZTogaW5zdGFudGlhdGUsXG4gICAgICBnZXQ6IGdldFNlcnZpY2UsXG4gICAgICBhbm5vdGF0ZTogY3JlYXRlSW5qZWN0b3IuJCRhbm5vdGF0ZSxcbiAgICAgIGhhczogZnVuY3Rpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gcHJvdmlkZXJDYWNoZS5oYXNPd25Qcm9wZXJ0eShuYW1lICsgcHJvdmlkZXJTdWZmaXgpIHx8IGNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuY3JlYXRlSW5qZWN0b3IuJCRhbm5vdGF0ZSA9IGFubm90YXRlO1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGFuY2hvclNjcm9sbFByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlIGAkYW5jaG9yU2Nyb2xsUHJvdmlkZXJgIHRvIGRpc2FibGUgYXV0b21hdGljIHNjcm9sbGluZyB3aGVuZXZlclxuICoge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9IGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uICRBbmNob3JTY3JvbGxQcm92aWRlcigpIHtcblxuICB2YXIgYXV0b1Njcm9sbGluZ0VuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRhbmNob3JTY3JvbGxQcm92aWRlciNkaXNhYmxlQXV0b1Njcm9sbGluZ1xuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQnkgZGVmYXVsdCwge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwgJGFuY2hvclNjcm9sbCgpfSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgdG9cbiAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9IGFuZCBzY3JvbGwgdG8gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIG5ldyBoYXNoLjxiciAvPlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZGlzYWJsZSBhdXRvbWF0aWMgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBJZiBhdXRvbWF0aWMgc2Nyb2xsaW5nIGlzIGRpc2FibGVkLCBvbmUgbXVzdCBleHBsaWNpdGx5IGNhbGxcbiAgICoge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwgJGFuY2hvclNjcm9sbCgpfSBpbiBvcmRlciB0byBzY3JvbGwgdG8gdGhlIGVsZW1lbnQgcmVsYXRlZCB0byB0aGVcbiAgICogY3VycmVudCBoYXNoLlxuICAgKi9cbiAgdGhpcy5kaXNhYmxlQXV0b1Njcm9sbGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIGF1dG9TY3JvbGxpbmdFbmFibGVkID0gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAqIEBuYW1lICRhbmNob3JTY3JvbGxcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICogQHJlcXVpcmVzICR3aW5kb3dcbiAgICogQHJlcXVpcmVzICRsb2NhdGlvblxuICAgKiBAcmVxdWlyZXMgJHJvb3RTY29wZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBjYWxsZWQsIGl0IHNjcm9sbHMgdG8gdGhlIGVsZW1lbnQgcmVsYXRlZCB0byB0aGUgc3BlY2lmaWVkIGBoYXNoYCBvciAoaWYgb21pdHRlZCkgdG8gdGhlXG4gICAqIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rIG5nLiRsb2NhdGlvbiNoYXNoICRsb2NhdGlvbi5oYXNoKCl9LCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHNwZWNpZmllZFxuICAgKiBpbiB0aGVcbiAgICogW0hUTUw1IHNwZWNdKGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvZHJhZnRzL2h0bWwvbWFzdGVyL2Jyb3dzZXJzLmh0bWwjYW4taW5kaWNhdGVkLXBhcnQtb2YtdGhlLWRvY3VtZW50KS5cbiAgICpcbiAgICogSXQgYWxzbyB3YXRjaGVzIHRoZSB7QGxpbmsgbmcuJGxvY2F0aW9uI2hhc2ggJGxvY2F0aW9uLmhhc2goKX0gYW5kIGF1dG9tYXRpY2FsbHkgc2Nyb2xscyB0b1xuICAgKiBtYXRjaCBhbnkgYW5jaG9yIHdoZW5ldmVyIGl0IGNoYW5nZXMuIFRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IGNhbGxpbmdcbiAgICoge0BsaW5rIG5nLiRhbmNob3JTY3JvbGxQcm92aWRlciNkaXNhYmxlQXV0b1Njcm9sbGluZyAkYW5jaG9yU2Nyb2xsUHJvdmlkZXIuZGlzYWJsZUF1dG9TY3JvbGxpbmcoKX0uXG4gICAqXG4gICAqIEFkZGl0aW9uYWxseSwgeW91IGNhbiB1c2UgaXRzIHtAbGluayBuZy4kYW5jaG9yU2Nyb2xsI3lPZmZzZXQgeU9mZnNldH0gcHJvcGVydHkgdG8gc3BlY2lmeSBhXG4gICAqIHZlcnRpY2FsIHNjcm9sbC1vZmZzZXQgKGVpdGhlciBmaXhlZCBvciBkeW5hbWljKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBoYXNoIFRoZSBoYXNoIHNwZWNpZnlpbmcgdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIHRvLiBJZiBvbWl0dGVkLCB0aGUgdmFsdWUgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBuZy4kbG9jYXRpb24jaGFzaCAkbG9jYXRpb24uaGFzaCgpfSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7KG51bWJlcnxmdW5jdGlvbnxqcUxpdGUpfSB5T2Zmc2V0XG4gICAqIElmIHNldCwgc3BlY2lmaWVzIGEgdmVydGljYWwgc2Nyb2xsLW9mZnNldC4gVGhpcyBpcyBvZnRlbiB1c2VmdWwgd2hlbiB0aGVyZSBhcmUgZml4ZWRcbiAgICogcG9zaXRpb25lZCBlbGVtZW50cyBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLCBzdWNoIGFzIG5hdmJhcnMsIGhlYWRlcnMgZXRjLlxuICAgKlxuICAgKiBgeU9mZnNldGAgY2FuIGJlIHNwZWNpZmllZCBpbiB2YXJpb3VzIHdheXM6XG4gICAqIC0gKipudW1iZXIqKjogQSBmaXhlZCBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIHVzZWQgYXMgb2Zmc2V0LjxiciAvPjxiciAvPlxuICAgKiAtICoqZnVuY3Rpb24qKjogQSBnZXR0ZXIgZnVuY3Rpb24gY2FsbGVkIGV2ZXJ5dGltZSBgJGFuY2hvclNjcm9sbCgpYCBpcyBleGVjdXRlZC4gTXVzdCByZXR1cm5cbiAgICogICBhIG51bWJlciByZXByZXNlbnRpbmcgdGhlIG9mZnNldCAoaW4gcGl4ZWxzKS48YnIgLz48YnIgLz5cbiAgICogLSAqKmpxTGl0ZSoqOiBBIGpxTGl0ZS9qUXVlcnkgZWxlbWVudCB0byBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBvZmZzZXQuIFRoZSBkaXN0YW5jZSBmcm9tXG4gICAqICAgdGhlIHRvcCBvZiB0aGUgcGFnZSB0byB0aGUgZWxlbWVudCdzIGJvdHRvbSB3aWxsIGJlIHVzZWQgYXMgb2Zmc2V0LjxiciAvPlxuICAgKiAgICoqTm90ZSoqOiBUaGUgZWxlbWVudCB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBvbmx5IGFzIGxvbmcgYXMgaXRzIGBwb3NpdGlvbmAgaXMgc2V0IHRvXG4gICAqICAgYGZpeGVkYC4gVGhpcyBvcHRpb24gaXMgdXNlZnVsLCB3aGVuIGRlYWxpbmcgd2l0aCByZXNwb25zaXZlIG5hdmJhcnMvaGVhZGVycyB0aGF0IGFkanVzdFxuICAgKiAgIHRoZWlyIGhlaWdodCBhbmQvb3IgcG9zaXRpb25pbmcgYWNjb3JkaW5nIHRvIHRoZSB2aWV3cG9ydCdzIHNpemUuXG4gICAqXG4gICAqIDxiciAvPlxuICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgKiBJbiBvcmRlciBmb3IgYHlPZmZzZXRgIHRvIHdvcmsgcHJvcGVybHksIHNjcm9sbGluZyBzaG91bGQgdGFrZSBwbGFjZSBvbiB0aGUgZG9jdW1lbnQncyByb290IGFuZFxuICAgKiBub3Qgc29tZSBjaGlsZCBlbGVtZW50LlxuICAgKiA8L2Rpdj5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgPGV4YW1wbGUgbW9kdWxlPVwiYW5jaG9yU2Nyb2xsRXhhbXBsZVwiIG5hbWU9XCJhbmNob3Itc2Nyb2xsXCI+XG4gICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgIDxkaXYgaWQ9XCJzY3JvbGxBcmVhXCIgbmctY29udHJvbGxlcj1cIlNjcm9sbENvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGEgbmctY2xpY2s9XCJnb3RvQm90dG9tKClcIj5HbyB0byBib3R0b208L2E+XG4gICAgICAgICAgIDxhIGlkPVwiYm90dG9tXCI+PC9hPiBZb3UncmUgYXQgdGhlIGJvdHRvbSFcbiAgICAgICAgIDwvZGl2PlxuICAgICAgIDwvZmlsZT5cbiAgICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnYW5jaG9yU2Nyb2xsRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignU2Nyb2xsQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRsb2NhdGlvbicsICckYW5jaG9yU2Nyb2xsJyxcbiAgICAgICAgICAgICBmdW5jdGlvbigkc2NvcGUsICRsb2NhdGlvbiwgJGFuY2hvclNjcm9sbCkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmdvdG9Cb3R0b20gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBsb2NhdGlvbi5oYXNoIHRvIHRoZSBpZCBvZlxuICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB5b3Ugd2lzaCB0byBzY3JvbGwgdG8uXG4gICAgICAgICAgICAgICAgICRsb2NhdGlvbi5oYXNoKCdib3R0b20nKTtcblxuICAgICAgICAgICAgICAgICAvLyBjYWxsICRhbmNob3JTY3JvbGwoKVxuICAgICAgICAgICAgICAgICAkYW5jaG9yU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgIH1dKTtcbiAgICAgICA8L2ZpbGU+XG4gICAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgICAgI3Njcm9sbEFyZWEge1xuICAgICAgICAgICBoZWlnaHQ6IDI4MHB4O1xuICAgICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgIH1cblxuICAgICAgICAgI2JvdHRvbSB7XG4gICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICBtYXJnaW4tdG9wOiAyMDAwcHg7XG4gICAgICAgICB9XG4gICAgICAgPC9maWxlPlxuICAgICA8L2V4YW1wbGU+XG4gICAqXG4gICAqIDxociAvPlxuICAgKiBUaGUgZXhhbXBsZSBiZWxvdyBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGEgdmVydGljYWwgc2Nyb2xsLW9mZnNldCAoc3BlY2lmaWVkIGFzIGEgZml4ZWQgdmFsdWUpLlxuICAgKiBTZWUge0BsaW5rIG5nLiRhbmNob3JTY3JvbGwjeU9mZnNldCAkYW5jaG9yU2Nyb2xsLnlPZmZzZXR9IGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgIDxleGFtcGxlIG1vZHVsZT1cImFuY2hvclNjcm9sbE9mZnNldEV4YW1wbGVcIiBuYW1lPVwiYW5jaG9yLXNjcm9sbC1vZmZzZXRcIj5cbiAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPGRpdiBjbGFzcz1cImZpeGVkLWhlYWRlclwiIG5nLWNvbnRyb2xsZXI9XCJoZWFkZXJDdHJsXCI+XG4gICAgICAgICAgIDxhIGhyZWY9XCJcIiBuZy1jbGljaz1cImdvdG9BbmNob3IoeClcIiBuZy1yZXBlYXQ9XCJ4IGluIFsxLDIsMyw0LDVdXCI+XG4gICAgICAgICAgICAgR28gdG8gYW5jaG9yIHt7eH19XG4gICAgICAgICAgIDwvYT5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPGRpdiBpZD1cImFuY2hvcnt7eH19XCIgY2xhc3M9XCJhbmNob3JcIiBuZy1yZXBlYXQ9XCJ4IGluIFsxLDIsMyw0LDVdXCI+XG4gICAgICAgICAgIEFuY2hvciB7e3h9fSBvZiA1XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICA8L2ZpbGU+XG4gICAgICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2FuY2hvclNjcm9sbE9mZnNldEV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgLnJ1bihbJyRhbmNob3JTY3JvbGwnLCBmdW5jdGlvbigkYW5jaG9yU2Nyb2xsKSB7XG4gICAgICAgICAgICAgJGFuY2hvclNjcm9sbC55T2Zmc2V0ID0gNTA7ICAgLy8gYWx3YXlzIHNjcm9sbCBieSA1MCBleHRyYSBwaXhlbHNcbiAgICAgICAgICAgfV0pXG4gICAgICAgICAgIC5jb250cm9sbGVyKCdoZWFkZXJDdHJsJywgWyckYW5jaG9yU2Nyb2xsJywgJyRsb2NhdGlvbicsICckc2NvcGUnLFxuICAgICAgICAgICAgIGZ1bmN0aW9uKCRhbmNob3JTY3JvbGwsICRsb2NhdGlvbiwgJHNjb3BlKSB7XG4gICAgICAgICAgICAgICAkc2NvcGUuZ290b0FuY2hvciA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgICAgICAgdmFyIG5ld0hhc2ggPSAnYW5jaG9yJyArIHg7XG4gICAgICAgICAgICAgICAgIGlmICgkbG9jYXRpb24uaGFzaCgpICE9PSBuZXdIYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSAkbG9jYXRpb24uaGFzaCB0byBgbmV3SGFzaGAgYW5kXG4gICAgICAgICAgICAgICAgICAgLy8gJGFuY2hvclNjcm9sbCB3aWxsIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIHRvIGl0XG4gICAgICAgICAgICAgICAgICAgJGxvY2F0aW9uLmhhc2goJ2FuY2hvcicgKyB4KTtcbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAvLyBjYWxsICRhbmNob3JTY3JvbGwoKSBleHBsaWNpdGx5LFxuICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlICRsb2NhdGlvbi5oYXNoIGhhc24ndCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgXSk7XG4gICAgICAgPC9maWxlPlxuICAgICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICAgIGJvZHkge1xuICAgICAgICAgICBwYWRkaW5nLXRvcDogNTBweDtcbiAgICAgICAgIH1cblxuICAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCBEYXJrT3JjaGlkO1xuICAgICAgICAgICBwYWRkaW5nOiAxMHB4IDEwcHggMjAwcHggMTBweDtcbiAgICAgICAgIH1cblxuICAgICAgICAgLmZpeGVkLWhlYWRlciB7XG4gICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgICAgICAgaGVpZ2h0OiA1MHB4O1xuICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgICAgIHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7XG4gICAgICAgICB9XG5cbiAgICAgICAgIC5maXhlZC1oZWFkZXIgPiBhIHtcbiAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICAgICBtYXJnaW46IDVweCAxNXB4O1xuICAgICAgICAgfVxuICAgICAgIDwvZmlsZT5cbiAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgdGhpcy4kZ2V0ID0gWyckd2luZG93JywgJyRsb2NhdGlvbicsICckcm9vdFNjb3BlJywgZnVuY3Rpb24oJHdpbmRvdywgJGxvY2F0aW9uLCAkcm9vdFNjb3BlKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gJHdpbmRvdy5kb2N1bWVudDtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgZmlyc3QgYW5jaG9yIGZyb20gYSBOb2RlTGlzdFxuICAgIC8vICh1c2luZyBgQXJyYXkjc29tZSgpYCBpbnN0ZWFkIG9mIGBhbmd1bGFyI2ZvckVhY2goKWAgc2luY2UgaXQncyBtb3JlIHBlcmZvcm1hbnRcbiAgICAvLyAgYW5kIHdvcmtpbmcgaW4gYWxsIHN1cHBvcnRlZCBicm93c2Vycy4pXG4gICAgZnVuY3Rpb24gZ2V0Rmlyc3RBbmNob3IobGlzdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGxpc3QsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKG5vZGVOYW1lXyhlbGVtZW50KSA9PT0gJ2EnKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZWxlbWVudDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFlPZmZzZXQoKSB7XG5cbiAgICAgIHZhciBvZmZzZXQgPSBzY3JvbGwueU9mZnNldDtcblxuICAgICAgaWYgKGlzRnVuY3Rpb24ob2Zmc2V0KSkge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNFbGVtZW50KG9mZnNldCkpIHtcbiAgICAgICAgdmFyIGVsZW0gPSBvZmZzZXRbMF07XG4gICAgICAgIHZhciBzdHlsZSA9ICR3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uICE9PSAnZml4ZWQnKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNOdW1iZXIob2Zmc2V0KSkge1xuICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW0pIHtcbiAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgIGVsZW0uc2Nyb2xsSW50b1ZpZXcoKTtcblxuICAgICAgICB2YXIgb2Zmc2V0ID0gZ2V0WU9mZnNldCgpO1xuXG4gICAgICAgIGlmIChvZmZzZXQpIHtcbiAgICAgICAgICAvLyBgb2Zmc2V0YCBpcyB0aGUgbnVtYmVyIG9mIHBpeGVscyB3ZSBzaG91bGQgc2Nyb2xsIFVQIGluIG9yZGVyIHRvIGFsaWduIGBlbGVtYCBwcm9wZXJseS5cbiAgICAgICAgICAvLyBUaGlzIGlzIHRydWUgT05MWSBpZiB0aGUgY2FsbCB0byBgZWxlbS5zY3JvbGxJbnRvVmlldygpYCBpbml0aWFsbHkgYWxpZ25zIGBlbGVtYCBhdCB0aGVcbiAgICAgICAgICAvLyB0b3Agb2YgdGhlIHZpZXdwb3J0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSUYgdGhlIG51bWJlciBvZiBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIGBlbGVtYCB0byB0aGUgZW5kIG9mIHRoZSBwYWdlJ3MgY29udGVudCBpcyBsZXNzXG4gICAgICAgICAgLy8gdGhhbiB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCwgdGhlbiBgZWxlbS5zY3JvbGxJbnRvVmlldygpYCB3aWxsIGFsaWduIHRoZSBgZWxlbWAgc29tZVxuICAgICAgICAgIC8vIHdheSBkb3duIHRoZSBwYWdlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvZnRlbiB0aGUgY2FzZSBmb3IgZWxlbWVudHMgbmVhciB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSW4gc3VjaCBjYXNlcyB3ZSBkbyBub3QgbmVlZCB0byBzY3JvbGwgdGhlIHdob2xlIGBvZmZzZXRgIHVwLCBqdXN0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW5cbiAgICAgICAgICAvLyB0aGUgdG9wIG9mIHRoZSBlbGVtZW50IGFuZCB0aGUgb2Zmc2V0LCB3aGljaCBpcyBlbm91Z2ggdG8gYWxpZ24gdGhlIHRvcCBvZiBgZWxlbWAgYXQgdGhlXG4gICAgICAgICAgLy8gZGVzaXJlZCBwb3NpdGlvbi5cbiAgICAgICAgICB2YXIgZWxlbVRvcCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICR3aW5kb3cuc2Nyb2xsQnkoMCwgZWxlbVRvcCAtIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICR3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Nyb2xsKGhhc2gpIHtcbiAgICAgIC8vIEFsbG93IG51bWVyaWMgaGFzaGVzXG4gICAgICBoYXNoID0gaXNTdHJpbmcoaGFzaCkgPyBoYXNoIDogaXNOdW1iZXIoaGFzaCkgPyBoYXNoLnRvU3RyaW5nKCkgOiAkbG9jYXRpb24uaGFzaCgpO1xuICAgICAgdmFyIGVsbTtcblxuICAgICAgLy8gZW1wdHkgaGFzaCwgc2Nyb2xsIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2VcbiAgICAgIGlmICghaGFzaCkgc2Nyb2xsVG8obnVsbCk7XG5cbiAgICAgIC8vIGVsZW1lbnQgd2l0aCBnaXZlbiBpZFxuICAgICAgZWxzZSBpZiAoKGVsbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhhc2gpKSkgc2Nyb2xsVG8oZWxtKTtcblxuICAgICAgLy8gZmlyc3QgYW5jaG9yIHdpdGggZ2l2ZW4gbmFtZSA6LURcbiAgICAgIGVsc2UgaWYgKChlbG0gPSBnZXRGaXJzdEFuY2hvcihkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShoYXNoKSkpKSBzY3JvbGxUbyhlbG0pO1xuXG4gICAgICAvLyBubyBlbGVtZW50IGFuZCBoYXNoID09PSAndG9wJywgc2Nyb2xsIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2VcbiAgICAgIGVsc2UgaWYgKGhhc2ggPT09ICd0b3AnKSBzY3JvbGxUbyhudWxsKTtcbiAgICB9XG5cbiAgICAvLyBkb2VzIG5vdCBzY3JvbGwgd2hlbiB1c2VyIGNsaWNrcyBvbiBhbmNob3IgbGluayB0aGF0IGlzIGN1cnJlbnRseSBvblxuICAgIC8vIChubyB1cmwgY2hhbmdlLCBubyAkbG9jYXRpb24uaGFzaCgpIGNoYW5nZSksIGJyb3dzZXIgbmF0aXZlIGRvZXMgc2Nyb2xsXG4gICAgaWYgKGF1dG9TY3JvbGxpbmdFbmFibGVkKSB7XG4gICAgICAkcm9vdFNjb3BlLiR3YXRjaChmdW5jdGlvbiBhdXRvU2Nyb2xsV2F0Y2goKSB7cmV0dXJuICRsb2NhdGlvbi5oYXNoKCk7fSxcbiAgICAgICAgZnVuY3Rpb24gYXV0b1Njcm9sbFdhdGNoQWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgaW5pdGlhbCBzY3JvbGwgaWYgJGxvY2F0aW9uLmhhc2ggaXMgZW1wdHlcbiAgICAgICAgICBpZiAobmV3VmFsID09PSBvbGRWYWwgJiYgbmV3VmFsID09PSAnJykgcmV0dXJuO1xuXG4gICAgICAgICAganFMaXRlRG9jdW1lbnRMb2FkZWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAkcm9vdFNjb3BlLiRldmFsQXN5bmMoc2Nyb2xsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjcm9sbDtcbiAgfV07XG59XG5cbnZhciAkYW5pbWF0ZU1pbkVyciA9IG1pbkVycignJGFuaW1hdGUnKTtcbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIE5HX0FOSU1BVEVfQ0xBU1NOQU1FID0gJ25nLWFuaW1hdGUnO1xuXG5mdW5jdGlvbiBtZXJnZUNsYXNzZXMoYSxiKSB7XG4gIGlmICghYSAmJiAhYikgcmV0dXJuICcnO1xuICBpZiAoIWEpIHJldHVybiBiO1xuICBpZiAoIWIpIHJldHVybiBhO1xuICBpZiAoaXNBcnJheShhKSkgYSA9IGEuam9pbignICcpO1xuICBpZiAoaXNBcnJheShiKSkgYiA9IGIuam9pbignICcpO1xuICByZXR1cm4gYSArICcgJyArIGI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbGVtZW50Tm9kZShlbGVtZW50KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbG0gPSBlbGVtZW50W2ldO1xuICAgIGlmIChlbG0ubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuIGVsbTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3BsaXRDbGFzc2VzKGNsYXNzZXMpIHtcbiAgaWYgKGlzU3RyaW5nKGNsYXNzZXMpKSB7XG4gICAgY2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgfVxuXG4gIC8vIFVzZSBjcmVhdGVNYXAoKSB0byBwcmV2ZW50IGNsYXNzIGFzc3VtcHRpb25zIGludm9sdmluZyBwcm9wZXJ0eSBuYW1lcyBpblxuICAvLyBPYmplY3QucHJvdG90eXBlXG4gIHZhciBvYmogPSBjcmVhdGVNYXAoKTtcbiAgZm9yRWFjaChjbGFzc2VzLCBmdW5jdGlvbihrbGFzcykge1xuICAgIC8vIHNvbWV0aW1lcyB0aGUgc3BsaXQgbGVhdmVzIGVtcHR5IHN0cmluZyB2YWx1ZXNcbiAgICAvLyBpbmNhc2UgZXh0cmEgc3BhY2VzIHdlcmUgYXBwbGllZCB0byB0aGUgb3B0aW9uc1xuICAgIGlmIChrbGFzcy5sZW5ndGgpIHtcbiAgICAgIG9ialtrbGFzc10gPSB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8vIGlmIGFueSBvdGhlciB0eXBlIG9mIG9wdGlvbnMgdmFsdWUgYmVzaWRlcyBhbiBPYmplY3QgdmFsdWUgaXNcbi8vIHBhc3NlZCBpbnRvIHRoZSAkYW5pbWF0ZS5tZXRob2QoKSBhbmltYXRpb24gdGhlbiB0aGlzIGhlbHBlciBjb2RlXG4vLyB3aWxsIGJlIHJ1biB3aGljaCB3aWxsIGlnbm9yZSBpdC4gV2hpbGUgdGhpcyBwYXRjaCBpcyBub3QgdGhlXG4vLyBncmVhdGVzdCBzb2x1dGlvbiB0byB0aGlzLCBhIGxvdCBvZiBleGlzdGluZyBwbHVnaW5zIGRlcGVuZCBvblxuLy8gJGFuaW1hdGUgdG8gZWl0aGVyIGNhbGwgdGhlIGNhbGxiYWNrICg8IDEuMikgb3IgcmV0dXJuIGEgcHJvbWlzZVxuLy8gdGhhdCBjYW4gYmUgY2hhbmdlZC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBvcHRpb25zXG4vLyBhcmUgd2lwZWQgY2xlYW4gaW5jYXNlIGEgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcHJvdmlkZWQuXG5mdW5jdGlvbiBwcmVwYXJlQW5pbWF0ZU9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gaXNPYmplY3Qob3B0aW9ucylcbiAgICAgID8gb3B0aW9uc1xuICAgICAgOiB7fTtcbn1cblxudmFyICQkQ29yZUFuaW1hdGVKc1Byb3ZpZGVyID0gLyoqIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuICB0aGlzLiRnZXQgPSBub29wO1xufTtcblxuLy8gdGhpcyBpcyBwcmVmaXhlZCB3aXRoIENvcmUgc2luY2UgaXQgY29uZmxpY3RzIHdpdGhcbi8vIHRoZSBhbmltYXRlUXVldWVQcm92aWRlciBkZWZpbmVkIGluIG5nQW5pbWF0ZS9hbmltYXRlUXVldWUuanNcbnZhciAkJENvcmVBbmltYXRlUXVldWVQcm92aWRlciA9IC8qKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcbiAgdmFyIHBvc3REaWdlc3RRdWV1ZSA9IG5ldyBIYXNoTWFwKCk7XG4gIHZhciBwb3N0RGlnZXN0RWxlbWVudHMgPSBbXTtcblxuICB0aGlzLiRnZXQgPSBbJyQkQW5pbWF0ZVJ1bm5lcicsICckcm9vdFNjb3BlJyxcbiAgICAgICBmdW5jdGlvbigkJEFuaW1hdGVSdW5uZXIsICAgJHJvb3RTY29wZSkge1xuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiBub29wLFxuICAgICAgb246IG5vb3AsXG4gICAgICBvZmY6IG5vb3AsXG4gICAgICBwaW46IG5vb3AsXG5cbiAgICAgIHB1c2g6IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCBvcHRpb25zLCBkb21PcGVyYXRpb24pIHtcbiAgICAgICAgaWYgKGRvbU9wZXJhdGlvbikge1xuICAgICAgICAgIGRvbU9wZXJhdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChvcHRpb25zLmZyb20pIHtcbiAgICAgICAgICBlbGVtZW50LmNzcyhvcHRpb25zLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRvKSB7XG4gICAgICAgICAgZWxlbWVudC5jc3Mob3B0aW9ucy50byk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5hZGRDbGFzcyB8fCBvcHRpb25zLnJlbW92ZUNsYXNzKSB7XG4gICAgICAgICAgYWRkUmVtb3ZlQ2xhc3Nlc1Bvc3REaWdlc3QoZWxlbWVudCwgb3B0aW9ucy5hZGRDbGFzcywgb3B0aW9ucy5yZW1vdmVDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcnVubmVyID0gbmV3ICQkQW5pbWF0ZVJ1bm5lcigpO1xuXG4gICAgICAgIC8vIHNpbmNlIHRoZXJlIGFyZSBubyBhbmltYXRpb25zIHRvIHJ1biB0aGUgcnVubmVyIG5lZWRzIHRvIGJlXG4gICAgICAgIC8vIG5vdGlmaWVkIHRoYXQgdGhlIGFuaW1hdGlvbiBjYWxsIGlzIGNvbXBsZXRlLlxuICAgICAgICBydW5uZXIuY29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuIHJ1bm5lcjtcbiAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBmdW5jdGlvbiB1cGRhdGVEYXRhKGRhdGEsIGNsYXNzZXMsIHZhbHVlKSB7XG4gICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgaWYgKGNsYXNzZXMpIHtcbiAgICAgICAgY2xhc3NlcyA9IGlzU3RyaW5nKGNsYXNzZXMpID8gY2xhc3Nlcy5zcGxpdCgnICcpIDpcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXkoY2xhc3NlcykgPyBjbGFzc2VzIDogW107XG4gICAgICAgIGZvckVhY2goY2xhc3NlcywgZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBkYXRhW2NsYXNzTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlQ1NTQ2xhc3NDaGFuZ2VzKCkge1xuICAgICAgZm9yRWFjaChwb3N0RGlnZXN0RWxlbWVudHMsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBwb3N0RGlnZXN0UXVldWUuZ2V0KGVsZW1lbnQpO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IHNwbGl0Q2xhc3NlcyhlbGVtZW50LmF0dHIoJ2NsYXNzJykpO1xuICAgICAgICAgIHZhciB0b0FkZCA9ICcnO1xuICAgICAgICAgIHZhciB0b1JlbW92ZSA9ICcnO1xuICAgICAgICAgIGZvckVhY2goZGF0YSwgZnVuY3Rpb24oc3RhdHVzLCBjbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHZhciBoYXNDbGFzcyA9ICEhZXhpc3RpbmdbY2xhc3NOYW1lXTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IGhhc0NsYXNzKSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICB0b0FkZCArPSAodG9BZGQubGVuZ3RoID8gJyAnIDogJycpICsgY2xhc3NOYW1lO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvUmVtb3ZlICs9ICh0b1JlbW92ZS5sZW5ndGggPyAnICcgOiAnJykgKyBjbGFzc05hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGZvckVhY2goZWxlbWVudCwgZnVuY3Rpb24oZWxtKSB7XG4gICAgICAgICAgICBpZiAodG9BZGQpIHtcbiAgICAgICAgICAgICAganFMaXRlQWRkQ2xhc3MoZWxtLCB0b0FkZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAganFMaXRlUmVtb3ZlQ2xhc3MoZWxtLCB0b1JlbW92ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9zdERpZ2VzdFF1ZXVlLnJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwb3N0RGlnZXN0RWxlbWVudHMubGVuZ3RoID0gMDtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGFkZFJlbW92ZUNsYXNzZXNQb3N0RGlnZXN0KGVsZW1lbnQsIGFkZCwgcmVtb3ZlKSB7XG4gICAgICB2YXIgZGF0YSA9IHBvc3REaWdlc3RRdWV1ZS5nZXQoZWxlbWVudCkgfHwge307XG5cbiAgICAgIHZhciBjbGFzc2VzQWRkZWQgPSB1cGRhdGVEYXRhKGRhdGEsIGFkZCwgdHJ1ZSk7XG4gICAgICB2YXIgY2xhc3Nlc1JlbW92ZWQgPSB1cGRhdGVEYXRhKGRhdGEsIHJlbW92ZSwgZmFsc2UpO1xuXG4gICAgICBpZiAoY2xhc3Nlc0FkZGVkIHx8IGNsYXNzZXNSZW1vdmVkKSB7XG5cbiAgICAgICAgcG9zdERpZ2VzdFF1ZXVlLnB1dChlbGVtZW50LCBkYXRhKTtcbiAgICAgICAgcG9zdERpZ2VzdEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHBvc3REaWdlc3RFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAkcm9vdFNjb3BlLiQkcG9zdERpZ2VzdChoYW5kbGVDU1NDbGFzc0NoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XTtcbn07XG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkYW5pbWF0ZVByb3ZpZGVyXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICRhbmltYXRlIHRoYXQgZG9lc24ndCBwZXJmb3JtIGFueSBhbmltYXRpb25zLCBpbnN0ZWFkIGp1c3RcbiAqIHN5bmNocm9ub3VzbHkgcGVyZm9ybXMgRE9NIHVwZGF0ZXMgYW5kIHJlc29sdmVzIHRoZSByZXR1cm5lZCBydW5uZXIgcHJvbWlzZS5cbiAqXG4gKiBJbiBvcmRlciB0byBlbmFibGUgYW5pbWF0aW9ucyB0aGUgYG5nQW5pbWF0ZWAgbW9kdWxlIGhhcyB0byBiZSBsb2FkZWQuXG4gKlxuICogVG8gc2VlIHRoZSBmdW5jdGlvbmFsIGltcGxlbWVudGF0aW9uIGNoZWNrIG91dCBgc3JjL25nQW5pbWF0ZS9hbmltYXRlLmpzYC5cbiAqL1xudmFyICRBbmltYXRlUHJvdmlkZXIgPSBbJyRwcm92aWRlJywgLyoqIEB0aGlzICovIGZ1bmN0aW9uKCRwcm92aWRlKSB7XG4gIHZhciBwcm92aWRlciA9IHRoaXM7XG5cbiAgdGhpcy4kJHJlZ2lzdGVyZWRBbmltYXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGFuaW1hdGVQcm92aWRlciNyZWdpc3RlclxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIGEgbmV3IGluamVjdGFibGUgYW5pbWF0aW9uIGZhY3RvcnkgZnVuY3Rpb24uIFRoZSBmYWN0b3J5IGZ1bmN0aW9uIHByb2R1Y2VzIHRoZVxuICAgKiBhbmltYXRpb24gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgZWFjaCBldmVudCB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlXG4gICAqIGFuaW1hdGVkLlxuICAgKlxuICAgKiAgICogYGV2ZW50Rm5gOiBgZnVuY3Rpb24oZWxlbWVudCwgLi4uICwgZG9uZUZ1bmN0aW9uLCBvcHRpb25zKWBcbiAgICogICBUaGUgZWxlbWVudCB0byBhbmltYXRlLCB0aGUgYGRvbmVGdW5jdGlvbmAgYW5kIHRoZSBvcHRpb25zIGZlZCBpbnRvIHRoZSBhbmltYXRpb24uIERlcGVuZGluZ1xuICAgKiAgIG9uIHRoZSB0eXBlIG9mIGFuaW1hdGlvbiBhZGRpdGlvbmFsIGFyZ3VtZW50cyB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGFuaW1hdGlvbiBmdW5jdGlvbi4gVGhlXG4gICAqICAgbGlzdCBiZWxvdyBleHBsYWlucyB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlcyBmb3IgdGhlIGRpZmZlcmVudCBhbmltYXRpb24gbWV0aG9kczpcbiAgICpcbiAgICogICAtIHNldENsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBhZGRlZENsYXNzZXMsIHJlbW92ZWRDbGFzc2VzLCBkb25lRnVuY3Rpb24sIG9wdGlvbnMpXG4gICAqICAgLSBhZGRDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgYWRkZWRDbGFzc2VzLCBkb25lRnVuY3Rpb24sIG9wdGlvbnMpXG4gICAqICAgLSByZW1vdmVDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgcmVtb3ZlZENsYXNzZXMsIGRvbmVGdW5jdGlvbiwgb3B0aW9ucylcbiAgICogICAtIGVudGVyLCBsZWF2ZSwgbW92ZTogZnVuY3Rpb24oZWxlbWVudCwgZG9uZUZ1bmN0aW9uLCBvcHRpb25zKVxuICAgKiAgIC0gYW5pbWF0ZTogZnVuY3Rpb24oZWxlbWVudCwgZnJvbVN0eWxlcywgdG9TdHlsZXMsIGRvbmVGdW5jdGlvbiwgb3B0aW9ucylcbiAgICpcbiAgICogICBNYWtlIHN1cmUgdG8gdHJpZ2dlciB0aGUgYGRvbmVGdW5jdGlvbmAgb25jZSB0aGUgYW5pbWF0aW9uIGlzIGZ1bGx5IGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgIHJldHVybiB7XG4gICAqICAgICAvL2VudGVyLCBsZWF2ZSwgbW92ZSBzaWduYXR1cmVcbiAgICogICAgIGV2ZW50Rm4gOiBmdW5jdGlvbihlbGVtZW50LCBkb25lLCBvcHRpb25zKSB7XG4gICAqICAgICAgIC8vY29kZSB0byBydW4gdGhlIGFuaW1hdGlvblxuICAgKiAgICAgICAvL29uY2UgY29tcGxldGUsIHRoZW4gcnVuIGRvbmUoKVxuICAgKiAgICAgICByZXR1cm4gZnVuY3Rpb24gZW5kRnVuY3Rpb24od2FzQ2FuY2VsbGVkKSB7XG4gICAqICAgICAgICAgLy9jb2RlIHRvIGNhbmNlbCB0aGUgYW5pbWF0aW9uXG4gICAqICAgICAgIH1cbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYW5pbWF0aW9uICh0aGlzIGlzIHdoYXQgdGhlIGNsYXNzLWJhc2VkIENTUyB2YWx1ZSB3aWxsIGJlIGNvbXBhcmVkIHRvKS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmFjdG9yeSBUaGUgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgdG8gcmV0dXJuIHRoZSBhbmltYXRpb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuXG4gICAqL1xuICB0aGlzLnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgZmFjdG9yeSkge1xuICAgIGlmIChuYW1lICYmIG5hbWUuY2hhckF0KDApICE9PSAnLicpIHtcbiAgICAgIHRocm93ICRhbmltYXRlTWluRXJyKCdub3Rjc2VsJywgJ0V4cGVjdGluZyBjbGFzcyBzZWxlY3RvciBzdGFydGluZyB3aXRoIFxcJy5cXCcgZ290IFxcJ3swfVxcJy4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gbmFtZSArICctYW5pbWF0aW9uJztcbiAgICBwcm92aWRlci4kJHJlZ2lzdGVyZWRBbmltYXRpb25zW25hbWUuc3Vic3RyKDEpXSA9IGtleTtcbiAgICAkcHJvdmlkZS5mYWN0b3J5KGtleSwgZmFjdG9yeSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGFuaW1hdGVQcm92aWRlciNjbGFzc05hbWVGaWx0ZXJcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYW5kL29yIHJldHVybnMgdGhlIENTUyBjbGFzcyByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyBjaGVja2VkIHdoZW4gcGVyZm9ybWluZ1xuICAgKiBhbiBhbmltYXRpb24uIFVwb24gYm9vdHN0cmFwIHRoZSBjbGFzc05hbWVGaWx0ZXIgdmFsdWUgaXMgbm90IHNldCBhdCBhbGwgYW5kIHdpbGxcbiAgICogdGhlcmVmb3JlIGVuYWJsZSAkYW5pbWF0ZSB0byBhdHRlbXB0IHRvIHBlcmZvcm0gYW4gYW5pbWF0aW9uIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgdHJpZ2dlcmVkLlxuICAgKiBXaGVuIHNldHRpbmcgdGhlIGBjbGFzc05hbWVGaWx0ZXJgIHZhbHVlLCBhbmltYXRpb25zIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgb24gZWxlbWVudHNcbiAgICogdGhhdCBzdWNjZXNzZnVsbHkgbWF0Y2ggdGhlIGZpbHRlciBleHByZXNzaW9uLiBUaGlzIGluIHR1cm4gY2FuIGJvb3N0IHBlcmZvcm1hbmNlXG4gICAqIGZvciBsb3ctcG93ZXJlZCBkZXZpY2VzIGFzIHdlbGwgYXMgYXBwbGljYXRpb25zIGNvbnRhaW5pbmcgYSBsb3Qgb2Ygc3RydWN0dXJhbCBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0ge1JlZ0V4cD19IGV4cHJlc3Npb24gVGhlIGNsYXNzTmFtZSBleHByZXNzaW9uIHdoaWNoIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCBhbmltYXRpb25zXG4gICAqIEByZXR1cm4ge1JlZ0V4cH0gVGhlIGN1cnJlbnQgQ1NTIGNsYXNzTmFtZSBleHByZXNzaW9uIHZhbHVlLiBJZiBudWxsIHRoZW4gdGhlcmUgaXMgbm8gZXhwcmVzc2lvbiB2YWx1ZVxuICAgKi9cbiAgdGhpcy5jbGFzc05hbWVGaWx0ZXIgPSBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuJCRjbGFzc05hbWVGaWx0ZXIgPSAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFJlZ0V4cCkgPyBleHByZXNzaW9uIDogbnVsbDtcbiAgICAgIGlmICh0aGlzLiQkY2xhc3NOYW1lRmlsdGVyKSB7XG4gICAgICAgIHZhciByZXNlcnZlZFJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFxcXFxzK3xcXFxcLyknICsgTkdfQU5JTUFURV9DTEFTU05BTUUgKyAnKFxcXFxzK3xcXFxcLyknKTtcbiAgICAgICAgaWYgKHJlc2VydmVkUmVnZXgudGVzdCh0aGlzLiQkY2xhc3NOYW1lRmlsdGVyLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgdGhyb3cgJGFuaW1hdGVNaW5FcnIoJ25vbmdjbHMnLCckYW5pbWF0ZVByb3ZpZGVyLmNsYXNzTmFtZUZpbHRlcihyZWdleCkgcHJvaGliaXRzIGFjY2VwdGluZyBhIHJlZ2V4IHZhbHVlIHdoaWNoIG1hdGNoZXMvY29udGFpbnMgdGhlIFwiezB9XCIgQ1NTIGNsYXNzLicsIE5HX0FOSU1BVEVfQ0xBU1NOQU1FKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4kJGNsYXNzTmFtZUZpbHRlcjtcbiAgfTtcblxuICB0aGlzLiRnZXQgPSBbJyQkYW5pbWF0ZVF1ZXVlJywgZnVuY3Rpb24oJCRhbmltYXRlUXVldWUpIHtcbiAgICBmdW5jdGlvbiBkb21JbnNlcnQoZWxlbWVudCwgcGFyZW50RWxlbWVudCwgYWZ0ZXJFbGVtZW50KSB7XG4gICAgICAvLyBpZiBmb3Igc29tZSByZWFzb24gdGhlIHByZXZpb3VzIGVsZW1lbnQgd2FzIHJlbW92ZWRcbiAgICAgIC8vIGZyb20gdGhlIGRvbSBzb21ldGltZSBiZWZvcmUgdGhpcyBjb2RlIHJ1bnMgdGhlbiBsZXQnc1xuICAgICAgLy8ganVzdCBzdGljayB0byB1c2luZyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIGFuY2hvclxuICAgICAgaWYgKGFmdGVyRWxlbWVudCkge1xuICAgICAgICB2YXIgYWZ0ZXJOb2RlID0gZXh0cmFjdEVsZW1lbnROb2RlKGFmdGVyRWxlbWVudCk7XG4gICAgICAgIGlmIChhZnRlck5vZGUgJiYgIWFmdGVyTm9kZS5wYXJlbnROb2RlICYmICFhZnRlck5vZGUucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgICAgIGFmdGVyRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhZnRlckVsZW1lbnQpIHtcbiAgICAgICAgYWZ0ZXJFbGVtZW50LmFmdGVyKGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyZW50RWxlbWVudC5wcmVwZW5kKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAgICogQG5hbWUgJGFuaW1hdGVcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlICRhbmltYXRlIHNlcnZpY2UgZXhwb3NlcyBhIHNlcmllcyBvZiBET00gdXRpbGl0eSBtZXRob2RzIHRoYXQgcHJvdmlkZSBzdXBwb3J0XG4gICAgICogZm9yIGFuaW1hdGlvbiBob29rcy4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhlIGFwcGxpY2F0aW9uIG9mIERPTSBvcGVyYXRpb25zLCBob3dldmVyLFxuICAgICAqIHdoZW4gYW4gYW5pbWF0aW9uIGlzIGRldGVjdGVkIChhbmQgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCksICRhbmltYXRlIHdpbGwgZG8gdGhlIGhlYXZ5IGxpZnRpbmdcbiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbmltYXRpb24gcnVucyB3aXRoIHRoZSB0cmlnZ2VyZWQgRE9NIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgJGFuaW1hdGUgZG9lc24ndCB0cmlnZ2VyIGFueSBhbmltYXRpb25zLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGBuZ0FuaW1hdGVgIG1vZHVsZSBpc24ndFxuICAgICAqIGluY2x1ZGVkIGFuZCBvbmx5IHdoZW4gaXQgaXMgYWN0aXZlIHRoZW4gdGhlIGFuaW1hdGlvbiBob29rcyB0aGF0IGAkYW5pbWF0ZWAgdHJpZ2dlcnMgd2lsbCBiZVxuICAgICAqIGZ1bmN0aW9uYWwuIE9uY2UgYWN0aXZlIHRoZW4gYWxsIHN0cnVjdHVyYWwgYG5nLWAgZGlyZWN0aXZlcyB3aWxsIHRyaWdnZXIgYW5pbWF0aW9ucyBhcyB0aGV5IHBlcmZvcm1cbiAgICAgKiB0aGVpciBET00tcmVsYXRlZCBvcGVyYXRpb25zIChlbnRlciwgbGVhdmUgYW5kIG1vdmUpLiBPdGhlciBkaXJlY3RpdmVzIHN1Y2ggYXMgYG5nQ2xhc3NgLFxuICAgICAqIGBuZ1Nob3dgLCBgbmdIaWRlYCBhbmQgYG5nTWVzc2FnZXNgIGFsc28gcHJvdmlkZSBzdXBwb3J0IGZvciBhbmltYXRpb25zLlxuICAgICAqXG4gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGVgJGFuaW1hdGVgIHNlcnZpY2UgaXMgYWx3YXlzIHVzZWQgd2hlbiBleGVjdXRpbmcgRE9NLXJlbGF0ZWQgcHJvY2VkdXJlcyB3aXRoaW4gZGlyZWN0aXZlcy5cbiAgICAgKlxuICAgICAqIFRvIGxlYXJuIG1vcmUgYWJvdXQgZW5hYmxpbmcgYW5pbWF0aW9uIHN1cHBvcnQsIGNsaWNrIGhlcmUgdG8gdmlzaXQgdGhlXG4gICAgICoge0BsaW5rIG5nQW5pbWF0ZSBuZ0FuaW1hdGUgbW9kdWxlIHBhZ2V9LlxuICAgICAqL1xuICAgIHJldHVybiB7XG4gICAgICAvLyB3ZSBkb24ndCBjYWxsIGl0IGRpcmVjdGx5IHNpbmNlIG5vbi1leGlzdGFudCBhcmd1bWVudHMgbWF5XG4gICAgICAvLyBiZSBpbnRlcnByZXRlZCBhcyBudWxsIHdpdGhpbiB0aGUgc3ViIGVuYWJsZWQgZnVuY3Rpb25cblxuICAgICAgLyoqXG4gICAgICAgKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjb25cbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBhbiBldmVudCBsaXN0ZW5lciB0byBmaXJlIHdoZW5ldmVyIHRoZSBhbmltYXRpb24gZXZlbnQgKGVudGVyLCBsZWF2ZSwgbW92ZSwgZXRjLi4uKVxuICAgICAgICogICAgaGFzIGZpcmVkIG9uIHRoZSBnaXZlbiBlbGVtZW50IG9yIGFtb25nIGFueSBvZiBpdHMgY2hpbGRyZW4uIE9uY2UgdGhlIGxpc3RlbmVyIGlzIGZpcmVkLCB0aGUgcHJvdmlkZWQgY2FsbGJhY2tcbiAgICAgICAqICAgIGlzIGZpcmVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbXM6XG4gICAgICAgKlxuICAgICAgICogYGBganNcbiAgICAgICAqICRhbmltYXRlLm9uKCdlbnRlcicsIGNvbnRhaW5lcixcbiAgICAgICAqICAgIGZ1bmN0aW9uIGNhbGxiYWNrKGVsZW1lbnQsIHBoYXNlKSB7XG4gICAgICAgKiAgICAgIC8vIGNvb2wgd2UgZGV0ZWN0ZWQgYW4gZW50ZXIgYW5pbWF0aW9uIHdpdGhpbiB0aGUgY29udGFpbmVyXG4gICAgICAgKiAgICB9XG4gICAgICAgKiApO1xuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IHRoZSBhbmltYXRpb24gZXZlbnQgdGhhdCB3aWxsIGJlIGNhcHR1cmVkIChlLmcuIGVudGVyLCBsZWF2ZSwgbW92ZSwgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBldGMuLi4pXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciB0aGUgY29udGFpbmVyIGVsZW1lbnQgdGhhdCB3aWxsIGNhcHR1cmUgZWFjaCBvZiB0aGUgYW5pbWF0aW9uIGV2ZW50cyB0aGF0IGFyZSBmaXJlZCBvbiBpdHNlbGZcbiAgICAgICAqICAgICBhcyB3ZWxsIGFzIGFtb25nIGl0cyBjaGlsZHJlblxuICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIHRoZSBsaXN0ZW5lciBpcyB0cmlnZ2VyZWRcbiAgICAgICAqXG4gICAgICAgKiBUaGUgYXJndW1lbnRzIHByZXNlbnQgaW4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFyZTpcbiAgICAgICAqICogYGVsZW1lbnRgIC0gVGhlIGNhcHR1cmVkIERPTSBlbGVtZW50IHRoYXQgdGhlIGFuaW1hdGlvbiB3YXMgZmlyZWQgb24uXG4gICAgICAgKiAqIGBwaGFzZWAgLSBUaGUgcGhhc2Ugb2YgdGhlIGFuaW1hdGlvbi4gVGhlIHR3byBwb3NzaWJsZSBwaGFzZXMgYXJlICoqc3RhcnQqKiAod2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cykgYW5kICoqY2xvc2UqKiAod2hlbiBpdCBlbmRzKS5cbiAgICAgICAqL1xuICAgICAgb246ICQkYW5pbWF0ZVF1ZXVlLm9uLFxuXG4gICAgICAvKipcbiAgICAgICAqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNvZmZcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKiBAZGVzY3JpcHRpb24gRGVyZWdpc3RlcnMgYW4gZXZlbnQgbGlzdGVuZXIgYmFzZWQgb24gdGhlIGV2ZW50IHdoaWNoIGhhcyBiZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgZWxlbWVudC4gVGhpcyBtZXRob2RcbiAgICAgICAqIGNhbiBiZSB1c2VkIGluIHRocmVlIGRpZmZlcmVudCB3YXlzIGRlcGVuZGluZyBvbiB0aGUgYXJndW1lbnRzOlxuICAgICAgICpcbiAgICAgICAqIGBgYGpzXG4gICAgICAgKiAvLyByZW1vdmUgYWxsIHRoZSBhbmltYXRpb24gZXZlbnQgbGlzdGVuZXJzIGxpc3RlbmluZyBmb3IgYGVudGVyYFxuICAgICAgICogJGFuaW1hdGUub2ZmKCdlbnRlcicpO1xuICAgICAgICpcbiAgICAgICAqIC8vIHJlbW92ZSBsaXN0ZW5lcnMgZm9yIGFsbCBhbmltYXRpb24gZXZlbnRzIGZyb20gdGhlIGNvbnRhaW5lciBlbGVtZW50XG4gICAgICAgKiAkYW5pbWF0ZS5vZmYoY29udGFpbmVyKTtcbiAgICAgICAqXG4gICAgICAgKiAvLyByZW1vdmUgYWxsIHRoZSBhbmltYXRpb24gZXZlbnQgbGlzdGVuZXJzIGxpc3RlbmluZyBmb3IgYGVudGVyYCBvbiB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgaXRzIGNoaWxkcmVuXG4gICAgICAgKiAkYW5pbWF0ZS5vZmYoJ2VudGVyJywgY29udGFpbmVyKTtcbiAgICAgICAqXG4gICAgICAgKiAvLyByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IGBjYWxsYmFja2AgdGhhdCBpcyBzZXRcbiAgICAgICAqIC8vIHRvIGxpc3RlbiBmb3IgYGVudGVyYCBvbiB0aGUgZ2l2ZW4gYGNvbnRhaW5lcmAgYXMgd2VsbCBhcyBpdHMgY2hpbGRyZW5cbiAgICAgICAqICRhbmltYXRlLm9mZignZW50ZXInLCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfERPTUVsZW1lbnR9IGV2ZW50fGNvbnRhaW5lciB0aGUgYW5pbWF0aW9uIGV2ZW50IChlLmcuIGVudGVyLCBsZWF2ZSwgbW92ZSxcbiAgICAgICAqIGFkZENsYXNzLCByZW1vdmVDbGFzcywgZXRjLi4uKSwgb3IgdGhlIGNvbnRhaW5lciBlbGVtZW50LiBJZiBpdCBpcyB0aGUgZWxlbWVudCwgYWxsIG90aGVyXG4gICAgICAgKiBhcmd1bWVudHMgYXJlIGlnbm9yZWQuXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnQ9fSBjb250YWluZXIgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRoZSBldmVudCBsaXN0ZW5lciB3YXMgcGxhY2VkIG9uXG4gICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2FzIHJlZ2lzdGVyZWQgYXMgdGhlIGxpc3RlbmVyXG4gICAgICAgKi9cbiAgICAgIG9mZjogJCRhbmltYXRlUXVldWUub2ZmLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRhbmltYXRlI3BpblxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqIEBkZXNjcmlwdGlvbiBBc3NvY2lhdGVzIHRoZSBwcm92aWRlZCBlbGVtZW50IHdpdGggYSBob3N0IHBhcmVudCBlbGVtZW50IHRvIGFsbG93IHRoZSBlbGVtZW50IHRvIGJlIGFuaW1hdGVkIGV2ZW4gaWYgaXQgZXhpc3RzXG4gICAgICAgKiAgICBvdXRzaWRlIG9mIHRoZSBET00gc3RydWN0dXJlIG9mIHRoZSBBbmd1bGFyIGFwcGxpY2F0aW9uLiBCeSBkb2luZyBzbywgYW55IGFuaW1hdGlvbiB0cmlnZ2VyZWQgdmlhIGAkYW5pbWF0ZWAgY2FuIGJlIGlzc3VlZCBvbiB0aGVcbiAgICAgICAqICAgIGVsZW1lbnQgZGVzcGl0ZSBiZWluZyBvdXRzaWRlIHRoZSByZWFsbSBvZiB0aGUgYXBwbGljYXRpb24gb3Igd2l0aGluIGFub3RoZXIgYXBwbGljYXRpb24uIFNheSBmb3IgZXhhbXBsZSBpZiB0aGUgYXBwbGljYXRpb25cbiAgICAgICAqICAgIHdhcyBib290c3RyYXBwZWQgb24gYW4gZWxlbWVudCB0aGF0IGlzIHNvbWV3aGVyZSBpbnNpZGUgb2YgdGhlIGA8Ym9keT5gIHRhZywgYnV0IHdlIHdhbnRlZCB0byBhbGxvdyBmb3IgYW4gZWxlbWVudCB0byBiZSBzaXR1YXRlZFxuICAgICAgICogICAgYXMgYSBkaXJlY3QgY2hpbGQgb2YgYGRvY3VtZW50LmJvZHlgLCB0aGVuIHRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHBpbm5pbmcgdGhlIGVsZW1lbnQgdmlhIGAkYW5pbWF0ZS5waW4oZWxlbWVudClgLiBLZWVwIGluIG1pbmRcbiAgICAgICAqICAgIHRoYXQgY2FsbGluZyBgJGFuaW1hdGUucGluKGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpYCB3aWxsIG5vdCBhY3R1YWxseSBpbnNlcnQgaW50byB0aGUgRE9NIGFueXdoZXJlOyBpdCB3aWxsIGp1c3QgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi5cbiAgICAgICAqXG4gICAgICAgKiAgICBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIG9ubHkgYWN0aXZlIHdoZW4gdGhlIGBuZ0FuaW1hdGVgIG1vZHVsZSBpcyB1c2VkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZXh0ZXJuYWwgZWxlbWVudCB0aGF0IHdpbGwgYmUgcGlubmVkXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudEVsZW1lbnQgdGhlIGhvc3QgcGFyZW50IGVsZW1lbnQgdGhhdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgZWxlbWVudFxuICAgICAgICovXG4gICAgICBwaW46ICQkYW5pbWF0ZVF1ZXVlLnBpbixcblxuICAgICAgLyoqXG4gICAgICAgKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjZW5hYmxlZFxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCBhbmQgc2V0IHdoZXRoZXIgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCBvciBub3Qgb24gdGhlIGVudGlyZSBhcHBsaWNhdGlvbiBvciBvbiBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW4uIFRoaXNcbiAgICAgICAqIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gZm91ciB3YXlzOlxuICAgICAgICpcbiAgICAgICAqIGBgYGpzXG4gICAgICAgKiAvLyByZXR1cm5zIHRydWUgb3IgZmFsc2VcbiAgICAgICAqICRhbmltYXRlLmVuYWJsZWQoKTtcbiAgICAgICAqXG4gICAgICAgKiAvLyBjaGFuZ2VzIHRoZSBlbmFibGVkIHN0YXRlIGZvciBhbGwgYW5pbWF0aW9uc1xuICAgICAgICogJGFuaW1hdGUuZW5hYmxlZChmYWxzZSk7XG4gICAgICAgKiAkYW5pbWF0ZS5lbmFibGVkKHRydWUpO1xuICAgICAgICpcbiAgICAgICAqIC8vIHJldHVybnMgdHJ1ZSBvciBmYWxzZSBpZiBhbmltYXRpb25zIGFyZSBlbmFibGVkIGZvciBhbiBlbGVtZW50XG4gICAgICAgKiAkYW5pbWF0ZS5lbmFibGVkKGVsZW1lbnQpO1xuICAgICAgICpcbiAgICAgICAqIC8vIGNoYW5nZXMgdGhlIGVuYWJsZWQgc3RhdGUgZm9yIGFuIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlblxuICAgICAgICogJGFuaW1hdGUuZW5hYmxlZChlbGVtZW50LCB0cnVlKTtcbiAgICAgICAqICRhbmltYXRlLmVuYWJsZWQoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50PX0gZWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgY2hlY2tpbmcvc2V0dGluZyB0aGUgZW5hYmxlZCBzdGF0ZVxuICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZW5hYmxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgYW5pbWF0aW9ucyB3aWxsIGJlIGVuYWJsZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgKlxuICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciBvciBub3QgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZFxuICAgICAgICovXG4gICAgICBlbmFibGVkOiAkJGFuaW1hdGVRdWV1ZS5lbmFibGVkLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRhbmltYXRlI2NhbmNlbFxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqIEBkZXNjcmlwdGlvbiBDYW5jZWxzIHRoZSBwcm92aWRlZCBhbmltYXRpb24uXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtQcm9taXNlfSBhbmltYXRpb25Qcm9taXNlIFRoZSBhbmltYXRpb24gcHJvbWlzZSB0aGF0IGlzIHJldHVybmVkIHdoZW4gYW4gYW5pbWF0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgICAgKi9cbiAgICAgIGNhbmNlbDogZnVuY3Rpb24ocnVubmVyKSB7XG4gICAgICAgIGlmIChydW5uZXIuZW5kKSB7XG4gICAgICAgICAgcnVubmVyLmVuZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNlbnRlclxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIHRoZSBlbGVtZW50IGludG8gdGhlIERPTSBlaXRoZXIgYWZ0ZXIgdGhlIGBhZnRlcmAgZWxlbWVudCAoaWYgcHJvdmlkZWQpIG9yXG4gICAgICAgKiAgIGFzIHRoZSBmaXJzdCBjaGlsZCB3aXRoaW4gdGhlIGBwYXJlbnRgIGVsZW1lbnQgYW5kIHRoZW4gdHJpZ2dlcnMgYW4gYW5pbWF0aW9uLlxuICAgICAgICogICBBIHByb21pc2UgaXMgcmV0dXJuZWQgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGR1cmluZyB0aGUgbmV4dCBkaWdlc3Qgb25jZSB0aGUgYW5pbWF0aW9uXG4gICAgICAgKiAgIGhhcyBjb21wbGV0ZWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudCB0aGUgcGFyZW50IGVsZW1lbnQgd2hpY2ggd2lsbCBhcHBlbmQgdGhlIGVsZW1lbnQgYXNcbiAgICAgICAqICAgYSBjaGlsZCAoc28gbG9uZyBhcyB0aGUgYWZ0ZXIgZWxlbWVudCBpcyBub3QgcHJlc2VudClcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudD19IGFmdGVyIHRoZSBzaWJsaW5nIGVsZW1lbnQgYWZ0ZXIgd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZFxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucy9zdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgIFRoZSBvYmplY3QgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICpcbiAgICAgICAqICAgLSAqKmFkZENsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50XG4gICAgICAgKiAgIC0gKipmcm9tKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgdG9gXG4gICAgICAgKiAgIC0gKipyZW1vdmVDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byByZW1vdmUgZnJvbSBlbGVtZW50XG4gICAgICAgKiAgIC0gKip0byoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IGVuZCBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgZnJvbWBcbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2VcbiAgICAgICAqL1xuICAgICAgZW50ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIHBhcmVudCwgYWZ0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50ICYmIGpxTGl0ZShwYXJlbnQpO1xuICAgICAgICBhZnRlciA9IGFmdGVyICYmIGpxTGl0ZShhZnRlcik7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudCB8fCBhZnRlci5wYXJlbnQoKTtcbiAgICAgICAgZG9tSW5zZXJ0KGVsZW1lbnQsIHBhcmVudCwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gJCRhbmltYXRlUXVldWUucHVzaChlbGVtZW50LCAnZW50ZXInLCBwcmVwYXJlQW5pbWF0ZU9wdGlvbnMob3B0aW9ucykpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjbW92ZVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIChtb3ZlcykgdGhlIGVsZW1lbnQgaW50byBpdHMgbmV3IHBvc2l0aW9uIGluIHRoZSBET00gZWl0aGVyIGFmdGVyXG4gICAgICAgKiAgIHRoZSBgYWZ0ZXJgIGVsZW1lbnQgKGlmIHByb3ZpZGVkKSBvciBhcyB0aGUgZmlyc3QgY2hpbGQgd2l0aGluIHRoZSBgcGFyZW50YCBlbGVtZW50XG4gICAgICAgKiAgIGFuZCB0aGVuIHRyaWdnZXJzIGFuIGFuaW1hdGlvbi4gQSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZFxuICAgICAgICogICBkdXJpbmcgdGhlIG5leHQgZGlnZXN0IG9uY2UgdGhlIGFuaW1hdGlvbiBoYXMgY29tcGxldGVkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gZWxlbWVudCB0aGUgZWxlbWVudCB3aGljaCB3aWxsIGJlIG1vdmVkIGludG8gdGhlIG5ldyBET00gcG9zaXRpb25cbiAgICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50IHRoZSBwYXJlbnQgZWxlbWVudCB3aGljaCB3aWxsIGFwcGVuZCB0aGUgZWxlbWVudCBhc1xuICAgICAgICogICBhIGNoaWxkIChzbyBsb25nIGFzIHRoZSBhZnRlciBlbGVtZW50IGlzIG5vdCBwcmVzZW50KVxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50PX0gYWZ0ZXIgdGhlIHNpYmxpbmcgZWxlbWVudCBhZnRlciB3aGljaCB0aGUgZWxlbWVudCB3aWxsIGJlIGFwcGVuZGVkXG4gICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zL3N0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC5cbiAgICAgICAqICAgVGhlIG9iamVjdCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgKlxuICAgICAgICogICAtICoqYWRkQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnRcbiAgICAgICAqICAgLSAqKmZyb20qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuaW1hdGlvbi4gTXVzdCBoYXZlIG1hdGNoaW5nIGB0b2BcbiAgICAgICAqICAgLSAqKnJlbW92ZUNsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIHJlbW92ZSBmcm9tIGVsZW1lbnRcbiAgICAgICAqICAgLSAqKnRvKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgZW5kIG9mIGFuaW1hdGlvbi4gTXVzdCBoYXZlIG1hdGNoaW5nIGBmcm9tYFxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZVxuICAgICAgICovXG4gICAgICBtb3ZlOiBmdW5jdGlvbihlbGVtZW50LCBwYXJlbnQsIGFmdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudCAmJiBqcUxpdGUocGFyZW50KTtcbiAgICAgICAgYWZ0ZXIgPSBhZnRlciAmJiBqcUxpdGUoYWZ0ZXIpO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQgfHwgYWZ0ZXIucGFyZW50KCk7XG4gICAgICAgIGRvbUluc2VydChlbGVtZW50LCBwYXJlbnQsIGFmdGVyKTtcbiAgICAgICAgcmV0dXJuICQkYW5pbWF0ZVF1ZXVlLnB1c2goZWxlbWVudCwgJ21vdmUnLCBwcmVwYXJlQW5pbWF0ZU9wdGlvbnMob3B0aW9ucykpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNsZWF2ZVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqIEBkZXNjcmlwdGlvbiBUcmlnZ2VycyBhbiBhbmltYXRpb24gYW5kIHRoZW4gcmVtb3ZlcyB0aGUgZWxlbWVudCBmcm9tIHRoZSBET00uXG4gICAgICAgKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYSBwcm9taXNlIGlzIHJldHVybmVkIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBkdXJpbmcgdGhlIG5leHRcbiAgICAgICAqIGRpZ2VzdCBvbmNlIHRoZSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucy9zdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgIFRoZSBvYmplY3QgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICpcbiAgICAgICAqICAgLSAqKmFkZENsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50XG4gICAgICAgKiAgIC0gKipmcm9tKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgdG9gXG4gICAgICAgKiAgIC0gKipyZW1vdmVDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byByZW1vdmUgZnJvbSBlbGVtZW50XG4gICAgICAgKiAgIC0gKip0byoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IGVuZCBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgZnJvbWBcbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2VcbiAgICAgICAqL1xuICAgICAgbGVhdmU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuICQkYW5pbWF0ZVF1ZXVlLnB1c2goZWxlbWVudCwgJ2xlYXZlJywgcHJlcGFyZUFuaW1hdGVPcHRpb25zKG9wdGlvbnMpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGFuaW1hdGUjYWRkQ2xhc3NcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXJzIGFuIGFkZENsYXNzIGFuaW1hdGlvbiBzdXJyb3VuZGluZyB0aGUgYWRkaXRpb24gb2YgdGhlIHByb3ZpZGVkIENTUyBjbGFzcyhlcykuIFVwb25cbiAgICAgICAqICAgZXhlY3V0aW9uLCB0aGUgYWRkQ2xhc3Mgb3BlcmF0aW9uIHdpbGwgb25seSBiZSBoYW5kbGVkIGFmdGVyIHRoZSBuZXh0IGRpZ2VzdCBhbmQgaXQgd2lsbCBub3QgdHJpZ2dlciBhblxuICAgICAgICogICBhbmltYXRpb24gaWYgZWxlbWVudCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBDU1MgY2xhc3Mgb3IgaWYgdGhlIGNsYXNzIGlzIHJlbW92ZWQgYXQgYSBsYXRlciBzdGVwLlxuICAgICAgICogICBOb3RlIHRoYXQgY2xhc3MtYmFzZWQgYW5pbWF0aW9ucyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSBjb21wYXJlZCB0byBzdHJ1Y3R1cmFsIGFuaW1hdGlvbnNcbiAgICAgICAqICAgKGxpa2UgZW50ZXIsIG1vdmUgYW5kIGxlYXZlKSBzaW5jZSB0aGUgQ1NTIGNsYXNzZXMgbWF5IGJlIGFkZGVkL3JlbW92ZWQgYXQgZGlmZmVyZW50IHBvaW50c1xuICAgICAgICogICBkZXBlbmRpbmcgaWYgQ1NTIG9yIEphdmFTY3JpcHQgYW5pbWF0aW9ucyBhcmUgdXNlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggdGhlIENTUyBjbGFzc2VzIHdpbGwgYmUgYXBwbGllZCB0b1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSB0aGUgQ1NTIGNsYXNzKGVzKSB0aGF0IHdpbGwgYmUgYWRkZWQgKG11bHRpcGxlIGNsYXNzZXMgYXJlIHNlcGFyYXRlZCB2aWEgc3BhY2VzKVxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucy9zdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgIFRoZSBvYmplY3QgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICpcbiAgICAgICAqICAgLSAqKmFkZENsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50XG4gICAgICAgKiAgIC0gKipmcm9tKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgdG9gXG4gICAgICAgKiAgIC0gKipyZW1vdmVDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byByZW1vdmUgZnJvbSBlbGVtZW50XG4gICAgICAgKiAgIC0gKip0byoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IGVuZCBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgZnJvbWBcbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2VcbiAgICAgICAqL1xuICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gcHJlcGFyZUFuaW1hdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLmFkZENsYXNzID0gbWVyZ2VDbGFzc2VzKG9wdGlvbnMuYWRkY2xhc3MsIGNsYXNzTmFtZSk7XG4gICAgICAgIHJldHVybiAkJGFuaW1hdGVRdWV1ZS5wdXNoKGVsZW1lbnQsICdhZGRDbGFzcycsIG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNyZW1vdmVDbGFzc1xuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb24gVHJpZ2dlcnMgYSByZW1vdmVDbGFzcyBhbmltYXRpb24gc3Vycm91bmRpbmcgdGhlIHJlbW92YWwgb2YgdGhlIHByb3ZpZGVkIENTUyBjbGFzcyhlcykuIFVwb25cbiAgICAgICAqICAgZXhlY3V0aW9uLCB0aGUgcmVtb3ZlQ2xhc3Mgb3BlcmF0aW9uIHdpbGwgb25seSBiZSBoYW5kbGVkIGFmdGVyIHRoZSBuZXh0IGRpZ2VzdCBhbmQgaXQgd2lsbCBub3QgdHJpZ2dlciBhblxuICAgICAgICogICBhbmltYXRpb24gaWYgZWxlbWVudCBkb2VzIG5vdCBjb250YWluIHRoZSBDU1MgY2xhc3Mgb3IgaWYgdGhlIGNsYXNzIGlzIGFkZGVkIGF0IGEgbGF0ZXIgc3RlcC5cbiAgICAgICAqICAgTm90ZSB0aGF0IGNsYXNzLWJhc2VkIGFuaW1hdGlvbnMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgY29tcGFyZWQgdG8gc3RydWN0dXJhbCBhbmltYXRpb25zXG4gICAgICAgKiAgIChsaWtlIGVudGVyLCBtb3ZlIGFuZCBsZWF2ZSkgc2luY2UgdGhlIENTUyBjbGFzc2VzIG1heSBiZSBhZGRlZC9yZW1vdmVkIGF0IGRpZmZlcmVudCBwb2ludHNcbiAgICAgICAqICAgZGVwZW5kaW5nIGlmIENTUyBvciBKYXZhU2NyaXB0IGFuaW1hdGlvbnMgYXJlIHVzZWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHRoZSBDU1MgY2xhc3NlcyB3aWxsIGJlIGFwcGxpZWQgdG9cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgdGhlIENTUyBjbGFzcyhlcykgdGhhdCB3aWxsIGJlIHJlbW92ZWQgKG11bHRpcGxlIGNsYXNzZXMgYXJlIHNlcGFyYXRlZCB2aWEgc3BhY2VzKVxuICAgICAgICogQHBhcmFtIHtvYmplY3Q9fSBvcHRpb25zIGFuIG9wdGlvbmFsIGNvbGxlY3Rpb24gb2Ygb3B0aW9ucy9zdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiAgIFRoZSBvYmplY3QgY2FuIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICpcbiAgICAgICAqICAgLSAqKmFkZENsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50XG4gICAgICAgKiAgIC0gKipmcm9tKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgdG9gXG4gICAgICAgKiAgIC0gKipyZW1vdmVDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byByZW1vdmUgZnJvbSBlbGVtZW50XG4gICAgICAgKiAgIC0gKip0byoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IGVuZCBvZiBhbmltYXRpb24uIE11c3QgaGF2ZSBtYXRjaGluZyBgZnJvbWBcbiAgICAgICAqXG4gICAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrIHByb21pc2VcbiAgICAgICAqL1xuICAgICAgcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gcHJlcGFyZUFuaW1hdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zLnJlbW92ZUNsYXNzID0gbWVyZ2VDbGFzc2VzKG9wdGlvbnMucmVtb3ZlQ2xhc3MsIGNsYXNzTmFtZSk7XG4gICAgICAgIHJldHVybiAkJGFuaW1hdGVRdWV1ZS5wdXNoKGVsZW1lbnQsICdyZW1vdmVDbGFzcycsIG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNzZXRDbGFzc1xuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb24gUGVyZm9ybXMgYm90aCB0aGUgYWRkaXRpb24gYW5kIHJlbW92YWwgb2YgYSBDU1MgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGFuZCAoZHVyaW5nIHRoZSBwcm9jZXNzKVxuICAgICAgICogICAgdHJpZ2dlcnMgYW4gYW5pbWF0aW9uIHN1cnJvdW5kaW5nIHRoZSBjbGFzcyBhZGRpdGlvbi9yZW1vdmFsLiBNdWNoIGxpa2UgYCRhbmltYXRlLmFkZENsYXNzYCBhbmRcbiAgICAgICAqICAgIGAkYW5pbWF0ZS5yZW1vdmVDbGFzc2AsIGBzZXRDbGFzc2Agd2lsbCBvbmx5IGV2YWx1YXRlIHRoZSBjbGFzc2VzIGJlaW5nIGFkZGVkL3JlbW92ZWQgb25jZSBhIGRpZ2VzdCBoYXNcbiAgICAgICAqICAgIHBhc3NlZC4gTm90ZSB0aGF0IGNsYXNzLWJhc2VkIGFuaW1hdGlvbnMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgY29tcGFyZWQgdG8gc3RydWN0dXJhbCBhbmltYXRpb25zXG4gICAgICAgKiAgICAobGlrZSBlbnRlciwgbW92ZSBhbmQgbGVhdmUpIHNpbmNlIHRoZSBDU1MgY2xhc3NlcyBtYXkgYmUgYWRkZWQvcmVtb3ZlZCBhdCBkaWZmZXJlbnQgcG9pbnRzXG4gICAgICAgKiAgICBkZXBlbmRpbmcgaWYgQ1NTIG9yIEphdmFTY3JpcHQgYW5pbWF0aW9ucyBhcmUgdXNlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgdGhlIGVsZW1lbnQgd2hpY2ggdGhlIENTUyBjbGFzc2VzIHdpbGwgYmUgYXBwbGllZCB0b1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGFkZCB0aGUgQ1NTIGNsYXNzKGVzKSB0aGF0IHdpbGwgYmUgYWRkZWQgKG11bHRpcGxlIGNsYXNzZXMgYXJlIHNlcGFyYXRlZCB2aWEgc3BhY2VzKVxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJlbW92ZSB0aGUgQ1NTIGNsYXNzKGVzKSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCAobXVsdGlwbGUgY2xhc3NlcyBhcmUgc2VwYXJhdGVkIHZpYSBzcGFjZXMpXG4gICAgICAgKiBAcGFyYW0ge29iamVjdD19IG9wdGlvbnMgYW4gb3B0aW9uYWwgY29sbGVjdGlvbiBvZiBvcHRpb25zL3N0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC5cbiAgICAgICAqICAgVGhlIG9iamVjdCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgICAgKlxuICAgICAgICogICAtICoqYWRkQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnRcbiAgICAgICAqICAgLSAqKmZyb20qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuaW1hdGlvbi4gTXVzdCBoYXZlIG1hdGNoaW5nIGB0b2BcbiAgICAgICAqICAgLSAqKnJlbW92ZUNsYXNzKiogLSBge3N0cmluZ31gIC0gc3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzc2VzIHRvIHJlbW92ZSBmcm9tIGVsZW1lbnRcbiAgICAgICAqICAgLSAqKnRvKiogLSBge09iamVjdH1gIC0gQ1NTIHByb3BlcnRpZXMgJiB2YWx1ZXMgYXQgZW5kIG9mIGFuaW1hdGlvbi4gTXVzdCBoYXZlIG1hdGNoaW5nIGBmcm9tYFxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSBhbmltYXRpb24gY2FsbGJhY2sgcHJvbWlzZVxuICAgICAgICovXG4gICAgICBzZXRDbGFzczogZnVuY3Rpb24oZWxlbWVudCwgYWRkLCByZW1vdmUsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHByZXBhcmVBbmltYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5hZGRDbGFzcyA9IG1lcmdlQ2xhc3NlcyhvcHRpb25zLmFkZENsYXNzLCBhZGQpO1xuICAgICAgICBvcHRpb25zLnJlbW92ZUNsYXNzID0gbWVyZ2VDbGFzc2VzKG9wdGlvbnMucmVtb3ZlQ2xhc3MsIHJlbW92ZSk7XG4gICAgICAgIHJldHVybiAkJGFuaW1hdGVRdWV1ZS5wdXNoKGVsZW1lbnQsICdzZXRDbGFzcycsIG9wdGlvbnMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkYW5pbWF0ZSNhbmltYXRlXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBQZXJmb3JtcyBhbiBpbmxpbmUgYW5pbWF0aW9uIG9uIHRoZSBlbGVtZW50IHdoaWNoIGFwcGxpZXMgdGhlIHByb3ZpZGVkIHRvIGFuZCBmcm9tIENTUyBzdHlsZXMgdG8gdGhlIGVsZW1lbnQuXG4gICAgICAgKiBJZiBhbnkgZGV0ZWN0ZWQgQ1NTIHRyYW5zaXRpb24sIGtleWZyYW1lIG9yIEphdmFTY3JpcHQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY2xhc3NOYW1lIHZhbHVlLCB0aGVuIHRoZSBhbmltYXRpb24gd2lsbCB0YWtlXG4gICAgICAgKiBvbiB0aGUgcHJvdmlkZWQgc3R5bGVzLiBGb3IgZXhhbXBsZSwgaWYgYSB0cmFuc2l0aW9uIGFuaW1hdGlvbiBpcyBzZXQgZm9yIHRoZSBnaXZlbiBjbGFzc05hbWUsIHRoZW4gdGhlIHByb3ZpZGVkIGBmcm9tYCBhbmRcbiAgICAgICAqIGB0b2Agc3R5bGVzIHdpbGwgYmUgYXBwbGllZCBhbG9uZ3NpZGUgdGhlIGdpdmVuIHRyYW5zaXRpb24uIElmIHRoZSBDU1Mgc3R5bGUgcHJvdmlkZWQgaW4gYGZyb21gIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nXG4gICAgICAgKiBzdHlsZSBpbiBgdG9gLCB0aGUgc3R5bGUgaW4gYGZyb21gIGlzIGFwcGxpZWQgaW1tZWRpYXRlbHksIGFuZCBubyBhbmltYXRpb24gaXMgcnVuLlxuICAgICAgICogSWYgYSBKYXZhU2NyaXB0IGFuaW1hdGlvbiBpcyBkZXRlY3RlZCB0aGVuIHRoZSBwcm92aWRlZCBzdHlsZXMgd2lsbCBiZSBnaXZlbiBpbiBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzIGludG8gdGhlIGBhbmltYXRlYFxuICAgICAgICogbWV0aG9kIChvciBhcyBwYXJ0IG9mIHRoZSBgb3B0aW9uc2AgcGFyYW1ldGVyKTpcbiAgICAgICAqXG4gICAgICAgKiBgYGBqc1xuICAgICAgICogbmdNb2R1bGUuYW5pbWF0aW9uKCcubXktaW5saW5lLWFuaW1hdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICogICByZXR1cm4ge1xuICAgICAgICogICAgIGFuaW1hdGUgOiBmdW5jdGlvbihlbGVtZW50LCBmcm9tLCB0bywgZG9uZSwgb3B0aW9ucykge1xuICAgICAgICogICAgICAgLy9hbmltYXRpb25cbiAgICAgICAqICAgICAgIGRvbmUoKTtcbiAgICAgICAqICAgICB9XG4gICAgICAgKiAgIH1cbiAgICAgICAqIH0pO1xuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHRoZSBlbGVtZW50IHdoaWNoIHRoZSBDU1Mgc3R5bGVzIHdpbGwgYmUgYXBwbGllZCB0b1xuICAgICAgICogQHBhcmFtIHtvYmplY3R9IGZyb20gdGhlIGZyb20gKHN0YXJ0aW5nKSBDU1Mgc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IGFuZCBhY3Jvc3MgdGhlIGFuaW1hdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0byB0aGUgdG8gKGRlc3RpbmF0aW9uKSBDU1Mgc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IGFuZCBhY3Jvc3MgdGhlIGFuaW1hdGlvbi5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gY2xhc3NOYW1lIGFuIG9wdGlvbmFsIENTUyBjbGFzcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24uIElmXG4gICAgICAgKiAgICB0aGlzIHZhbHVlIGlzIGxlZnQgYXMgZW1wdHkgdGhlbiBhIENTUyBjbGFzcyBvZiBgbmctaW5saW5lLWFuaW1hdGVgIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudC5cbiAgICAgICAqICAgIChOb3RlIHRoYXQgaWYgbm8gYW5pbWF0aW9uIGlzIGRldGVjdGVkIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LilcbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBhbiBvcHRpb25hbCBjb2xsZWN0aW9uIG9mIG9wdGlvbnMvc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50LlxuICAgICAgICogICBUaGUgb2JqZWN0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAgICAqXG4gICAgICAgKiAgIC0gKiphZGRDbGFzcyoqIC0gYHtzdHJpbmd9YCAtIHNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudFxuICAgICAgICogICAtICoqZnJvbSoqIC0gYHtPYmplY3R9YCAtIENTUyBwcm9wZXJ0aWVzICYgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYHRvYFxuICAgICAgICogICAtICoqcmVtb3ZlQ2xhc3MqKiAtIGB7c3RyaW5nfWAgLSBzcGFjZS1zZXBhcmF0ZWQgQ1NTIGNsYXNzZXMgdG8gcmVtb3ZlIGZyb20gZWxlbWVudFxuICAgICAgICogICAtICoqdG8qKiAtIGB7T2JqZWN0fWAgLSBDU1MgcHJvcGVydGllcyAmIHZhbHVlcyBhdCBlbmQgb2YgYW5pbWF0aW9uLiBNdXN0IGhhdmUgbWF0Y2hpbmcgYGZyb21gXG4gICAgICAgKlxuICAgICAgICogQHJldHVybiB7UHJvbWlzZX0gdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBwcm9taXNlXG4gICAgICAgKi9cbiAgICAgIGFuaW1hdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGZyb20sIHRvLCBjbGFzc05hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IHByZXBhcmVBbmltYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgb3B0aW9ucy5mcm9tID0gb3B0aW9ucy5mcm9tID8gZXh0ZW5kKG9wdGlvbnMuZnJvbSwgZnJvbSkgOiBmcm9tO1xuICAgICAgICBvcHRpb25zLnRvICAgPSBvcHRpb25zLnRvICAgPyBleHRlbmQob3B0aW9ucy50bywgdG8pICAgICA6IHRvO1xuXG4gICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSB8fCAnbmctaW5saW5lLWFuaW1hdGUnO1xuICAgICAgICBvcHRpb25zLnRlbXBDbGFzc2VzID0gbWVyZ2VDbGFzc2VzKG9wdGlvbnMudGVtcENsYXNzZXMsIGNsYXNzTmFtZSk7XG4gICAgICAgIHJldHVybiAkJGFuaW1hdGVRdWV1ZS5wdXNoKGVsZW1lbnQsICdhbmltYXRlJywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfTtcbiAgfV07XG59XTtcblxudmFyICQkQW5pbWF0ZUFzeW5jUnVuRmFjdG9yeVByb3ZpZGVyID0gLyoqIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuICB0aGlzLiRnZXQgPSBbJyQkckFGJywgZnVuY3Rpb24oJCRyQUYpIHtcbiAgICB2YXIgd2FpdFF1ZXVlID0gW107XG5cbiAgICBmdW5jdGlvbiB3YWl0Rm9yVGljayhmbikge1xuICAgICAgd2FpdFF1ZXVlLnB1c2goZm4pO1xuICAgICAgaWYgKHdhaXRRdWV1ZS5sZW5ndGggPiAxKSByZXR1cm47XG4gICAgICAkJHJBRihmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3YWl0UXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB3YWl0UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICB3YWl0UXVldWUgPSBbXTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXNzZWQgPSBmYWxzZTtcbiAgICAgIHdhaXRGb3JUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2FpdEZvclRpY2soY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gIH1dO1xufTtcblxudmFyICQkQW5pbWF0ZVJ1bm5lckZhY3RvcnlQcm92aWRlciA9IC8qKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckcScsICckc25pZmZlcicsICckJGFuaW1hdGVBc3luY1J1bicsICckJGlzRG9jdW1lbnRIaWRkZW4nLCAnJHRpbWVvdXQnLFxuICAgICAgIGZ1bmN0aW9uKCRxLCAgICRzbmlmZmVyLCAgICQkYW5pbWF0ZUFzeW5jUnVuLCAgICQkaXNEb2N1bWVudEhpZGRlbiwgICAkdGltZW91dCkge1xuXG4gICAgdmFyIElOSVRJQUxfU1RBVEUgPSAwO1xuICAgIHZhciBET05FX1BFTkRJTkdfU1RBVEUgPSAxO1xuICAgIHZhciBET05FX0NPTVBMRVRFX1NUQVRFID0gMjtcblxuICAgIEFuaW1hdGVSdW5uZXIuY2hhaW4gPSBmdW5jdGlvbihjaGFpbiwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBpbmRleCA9IDA7XG5cbiAgICAgIG5leHQoKTtcbiAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gY2hhaW4ubGVuZ3RoKSB7XG4gICAgICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhaW5baW5kZXhdKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY2FsbGJhY2soZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIEFuaW1hdGVSdW5uZXIuYWxsID0gZnVuY3Rpb24ocnVubmVycywgY2FsbGJhY2spIHtcbiAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICB2YXIgc3RhdHVzID0gdHJ1ZTtcbiAgICAgIGZvckVhY2gocnVubmVycywgZnVuY3Rpb24ocnVubmVyKSB7XG4gICAgICAgIHJ1bm5lci5kb25lKG9uUHJvZ3Jlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIG9uUHJvZ3Jlc3MocmVzcG9uc2UpIHtcbiAgICAgICAgc3RhdHVzID0gc3RhdHVzICYmIHJlc3BvbnNlO1xuICAgICAgICBpZiAoKytjb3VudCA9PT0gcnVubmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBjYWxsYmFjayhzdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEFuaW1hdGVSdW5uZXIoaG9zdCkge1xuICAgICAgdGhpcy5zZXRIb3N0KGhvc3QpO1xuXG4gICAgICB2YXIgcmFmVGljayA9ICQkYW5pbWF0ZUFzeW5jUnVuKCk7XG4gICAgICB2YXIgdGltZW91dFRpY2sgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAkdGltZW91dChmbiwgMCwgZmFsc2UpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5fZG9uZUNhbGxiYWNrcyA9IFtdO1xuICAgICAgdGhpcy5fdGljayA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgIGlmICgkJGlzRG9jdW1lbnRIaWRkZW4oKSkge1xuICAgICAgICAgIHRpbWVvdXRUaWNrKGZuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByYWZUaWNrKGZuKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG5cbiAgICBBbmltYXRlUnVubmVyLnByb3RvdHlwZSA9IHtcbiAgICAgIHNldEhvc3Q6IGZ1bmN0aW9uKGhvc3QpIHtcbiAgICAgICAgdGhpcy5ob3N0ID0gaG9zdCB8fCB7fTtcbiAgICAgIH0sXG5cbiAgICAgIGRvbmU6IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gRE9ORV9DT01QTEVURV9TVEFURSkge1xuICAgICAgICAgIGZuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZG9uZUNhbGxiYWNrcy5wdXNoKGZuKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgcHJvZ3Jlc3M6IG5vb3AsXG5cbiAgICAgIGdldFByb21pc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMucHJvbWlzZSkge1xuICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICB0aGlzLnByb21pc2UgPSAkcShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHNlbGYuZG9uZShmdW5jdGlvbihzdGF0dXMpIHtcbiAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgICB9LFxuXG4gICAgICB0aGVuOiBmdW5jdGlvbihyZXNvbHZlSGFuZGxlciwgcmVqZWN0SGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9taXNlKCkudGhlbihyZXNvbHZlSGFuZGxlciwgcmVqZWN0SGFuZGxlcik7XG4gICAgICB9LFxuXG4gICAgICAnY2F0Y2gnOiBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFByb21pc2UoKVsnY2F0Y2gnXShoYW5kbGVyKTtcbiAgICAgIH0sXG5cbiAgICAgICdmaW5hbGx5JzogZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcm9taXNlKClbJ2ZpbmFsbHknXShoYW5kbGVyKTtcbiAgICAgIH0sXG5cbiAgICAgIHBhdXNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuaG9zdC5wYXVzZSkge1xuICAgICAgICAgIHRoaXMuaG9zdC5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICByZXN1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5ob3N0LnJlc3VtZSkge1xuICAgICAgICAgIHRoaXMuaG9zdC5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuaG9zdC5lbmQpIHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmhvc3QuY2FuY2VsKSB7XG4gICAgICAgICAgdGhpcy5ob3N0LmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc29sdmUoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHNlbGYuX3N0YXRlID09PSBJTklUSUFMX1NUQVRFKSB7XG4gICAgICAgICAgc2VsZi5fc3RhdGUgPSBET05FX1BFTkRJTkdfU1RBVEU7XG4gICAgICAgICAgc2VsZi5fdGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuX3Jlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBfcmVzb2x2ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBET05FX0NPTVBMRVRFX1NUQVRFKSB7XG4gICAgICAgICAgZm9yRWFjaCh0aGlzLl9kb25lQ2FsbGJhY2tzLCBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZm4ocmVzcG9uc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX2RvbmVDYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IERPTkVfQ09NUExFVEVfU1RBVEU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIEFuaW1hdGVSdW5uZXI7XG4gIH1dO1xufTtcblxuLyogZXhwb3J0ZWQgJENvcmVBbmltYXRlQ3NzUHJvdmlkZXIgKi9cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJGFuaW1hdGVDc3NcbiAqIEBraW5kIG9iamVjdFxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgaXMgdGhlIGNvcmUgdmVyc2lvbiBvZiBgJGFuaW1hdGVDc3NgLiBCeSBkZWZhdWx0LCBvbmx5IHdoZW4gdGhlIGBuZ0FuaW1hdGVgIGlzIGluY2x1ZGVkLFxuICogdGhlbiB0aGUgYCRhbmltYXRlQ3NzYCBzZXJ2aWNlIHdpbGwgYWN0dWFsbHkgcGVyZm9ybSBhbmltYXRpb25zLlxuICpcbiAqIENsaWNrIGhlcmUge0BsaW5rIG5nQW5pbWF0ZS4kYW5pbWF0ZUNzcyB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciAkYW5pbWF0ZUNzc30uXG4gKi9cbnZhciAkQ29yZUFuaW1hdGVDc3NQcm92aWRlciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLiRnZXQgPSBbJyQkckFGJywgJyRxJywgJyQkQW5pbWF0ZVJ1bm5lcicsIGZ1bmN0aW9uKCQkckFGLCAkcSwgJCRBbmltYXRlUnVubmVyKSB7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oZWxlbWVudCwgaW5pdGlhbE9wdGlvbnMpIHtcbiAgICAgIC8vIGFsbCBvZiB0aGUgYW5pbWF0aW9uIGZ1bmN0aW9ucyBzaG91bGQgY3JlYXRlXG4gICAgICAvLyBhIGNvcHkgb2YgdGhlIG9wdGlvbnMgZGF0YSwgaG93ZXZlciwgaWYgYVxuICAgICAgLy8gcGFyZW50IHNlcnZpY2UgaGFzIGFscmVhZHkgY3JlYXRlZCBhIGNvcHkgdGhlblxuICAgICAgLy8gd2Ugc2hvdWxkIHN0aWNrIHRvIHVzaW5nIHRoYXRcbiAgICAgIHZhciBvcHRpb25zID0gaW5pdGlhbE9wdGlvbnMgfHwge307XG4gICAgICBpZiAoIW9wdGlvbnMuJCRwcmVwYXJlZCkge1xuICAgICAgICBvcHRpb25zID0gY29weShvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhlcmUgaXMgbm8gcG9pbnQgaW4gYXBwbHlpbmcgdGhlIHN0eWxlcyBzaW5jZVxuICAgICAgLy8gdGhlcmUgaXMgbm8gYW5pbWF0aW9uIHRoYXQgZ29lcyBvbiBhdCBhbGwgaW5cbiAgICAgIC8vIHRoaXMgdmVyc2lvbiBvZiAkYW5pbWF0ZUNzcy5cbiAgICAgIGlmIChvcHRpb25zLmNsZWFudXBTdHlsZXMpIHtcbiAgICAgICAgb3B0aW9ucy5mcm9tID0gb3B0aW9ucy50byA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmZyb20pIHtcbiAgICAgICAgZWxlbWVudC5jc3Mob3B0aW9ucy5mcm9tKTtcbiAgICAgICAgb3B0aW9ucy5mcm9tID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGNsb3NlZCwgcnVubmVyID0gbmV3ICQkQW5pbWF0ZVJ1bm5lcigpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHJ1bixcbiAgICAgICAgZW5kOiBydW5cbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgICAgJCRyQUYoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgYXBwbHlBbmltYXRpb25Db250ZW50cygpO1xuICAgICAgICAgIGlmICghY2xvc2VkKSB7XG4gICAgICAgICAgICBydW5uZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBydW5uZXI7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFwcGx5QW5pbWF0aW9uQ29udGVudHMoKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmFkZENsYXNzKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRDbGFzcyhvcHRpb25zLmFkZENsYXNzKTtcbiAgICAgICAgICBvcHRpb25zLmFkZENsYXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5yZW1vdmVDbGFzcykge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3Mob3B0aW9ucy5yZW1vdmVDbGFzcyk7XG4gICAgICAgICAgb3B0aW9ucy5yZW1vdmVDbGFzcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMudG8pIHtcbiAgICAgICAgICBlbGVtZW50LmNzcyhvcHRpb25zLnRvKTtcbiAgICAgICAgICBvcHRpb25zLnRvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1dO1xufTtcblxuLyogZ2xvYmFsIHN0cmlwSGFzaDogdHJ1ZSAqL1xuXG4vKipcbiAqICEgVGhpcyBpcyBhIHByaXZhdGUgdW5kb2N1bWVudGVkIHNlcnZpY2UgIVxuICpcbiAqIEBuYW1lICRicm93c2VyXG4gKiBAcmVxdWlyZXMgJGxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG9iamVjdCBoYXMgdHdvIGdvYWxzOlxuICpcbiAqIC0gaGlkZSBhbGwgdGhlIGdsb2JhbCBzdGF0ZSBpbiB0aGUgYnJvd3NlciBjYXVzZWQgYnkgdGhlIHdpbmRvdyBvYmplY3RcbiAqIC0gYWJzdHJhY3QgYXdheSBhbGwgdGhlIGJyb3dzZXIgc3BlY2lmaWMgZmVhdHVyZXMgYW5kIGluY29uc2lzdGVuY2llc1xuICpcbiAqIEZvciB0ZXN0cyB3ZSBwcm92aWRlIHtAbGluayBuZ01vY2suJGJyb3dzZXIgbW9jayBpbXBsZW1lbnRhdGlvbn0gb2YgdGhlIGAkYnJvd3NlcmBcbiAqIHNlcnZpY2UsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBjb252ZW5pZW50IHRlc3Rpbmcgb2YgdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgdGhlIGludGVyYWN0aW9uIHdpdGhcbiAqIHRoZSByZWFsIGJyb3dzZXIgYXBpcy5cbiAqL1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gd2luZG93IFRoZSBnbG9iYWwgd2luZG93IG9iamVjdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkb2N1bWVudCBqUXVlcnkgd3JhcHBlZCBkb2N1bWVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSAkbG9nIHdpbmRvdy5jb25zb2xlIG9yIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGludGVyZmFjZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSAkc25pZmZlciAkc25pZmZlciBzZXJ2aWNlXG4gKi9cbmZ1bmN0aW9uIEJyb3dzZXIod2luZG93LCBkb2N1bWVudCwgJGxvZywgJHNuaWZmZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24sXG4gICAgICBoaXN0b3J5ID0gd2luZG93Lmhpc3RvcnksXG4gICAgICBzZXRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQsXG4gICAgICBjbGVhclRpbWVvdXQgPSB3aW5kb3cuY2xlYXJUaW1lb3V0LFxuICAgICAgcGVuZGluZ0RlZmVySWRzID0ge307XG5cbiAgc2VsZi5pc01vY2sgPSBmYWxzZTtcblxuICB2YXIgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSAwO1xuICB2YXIgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzID0gW107XG5cbiAgLy8gVE9ETyh2b2p0YSk6IHJlbW92ZSB0aGlzIHRlbXBvcmFyeSBhcGlcbiAgc2VsZi4kJGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0ID0gY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3Q7XG4gIHNlbGYuJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCA9IGZ1bmN0aW9uKCkgeyBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCsrOyB9O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbihzdXBwb3J0cyBjdXJyeWluZykgYW5kIGRlY3JlbWVudHMgdGhlIGBvdXRzdGFuZGluZ1JlcXVlc3RDYWxsYmFja3NgXG4gICAqIGNvdW50ZXIuIElmIHRoZSBjb3VudGVyIHJlYWNoZXMgMCwgYWxsIHRoZSBgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzYCBhcmUgZXhlY3V0ZWQuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdChmbikge1xuICAgIHRyeSB7XG4gICAgICBmbi5hcHBseShudWxsLCBzbGljZUFyZ3MoYXJndW1lbnRzLCAxKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIG91dHN0YW5kaW5nUmVxdWVzdENvdW50LS07XG4gICAgICBpZiAob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgd2hpbGUgKG91dHN0YW5kaW5nUmVxdWVzdENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgJGxvZy5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRIYXNoKHVybCkge1xuICAgIHZhciBpbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgcmV0dXJuIGluZGV4ID09PSAtMSA/ICcnIDogdXJsLnN1YnN0cihpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogTm90ZTogdGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IGJ5IHNjZW5hcmlvIHJ1bm5lclxuICAgKiBUT0RPKHZvanRhKTogcHJlZml4IHRoaXMgbWV0aG9kIHdpdGggJCQgP1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBubyBvdXRzdGFuZGluZyByZXF1ZXN0XG4gICAqL1xuICBzZWxmLm5vdGlmeVdoZW5Ob091dHN0YW5kaW5nUmVxdWVzdHMgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGlmIChvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0c3RhbmRpbmdSZXF1ZXN0Q2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBVUkwgQVBJXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgdmFyIGNhY2hlZFN0YXRlLCBsYXN0SGlzdG9yeVN0YXRlLFxuICAgICAgbGFzdEJyb3dzZXJVcmwgPSBsb2NhdGlvbi5ocmVmLFxuICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5maW5kKCdiYXNlJyksXG4gICAgICBwZW5kaW5nTG9jYXRpb24gPSBudWxsLFxuICAgICAgZ2V0Q3VycmVudFN0YXRlID0gISRzbmlmZmVyLmhpc3RvcnkgPyBub29wIDogZnVuY3Rpb24gZ2V0Q3VycmVudFN0YXRlKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBoaXN0b3J5LnN0YXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gTVNJRSBjYW4gcmVwb3J0ZWRseSB0aHJvdyB3aGVuIHRoZXJlIGlzIG5vIHN0YXRlIChVTkNPTkZJUk1FRCkuXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgY2FjaGVTdGF0ZSgpO1xuICBsYXN0SGlzdG9yeVN0YXRlID0gY2FjaGVkU3RhdGU7XG5cbiAgLyoqXG4gICAqIEBuYW1lICRicm93c2VyI3VybFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR0VUVEVSOlxuICAgKiBXaXRob3V0IGFueSBhcmd1bWVudCwgdGhpcyBtZXRob2QganVzdCByZXR1cm5zIGN1cnJlbnQgdmFsdWUgb2YgbG9jYXRpb24uaHJlZi5cbiAgICpcbiAgICogU0VUVEVSOlxuICAgKiBXaXRoIGF0IGxlYXN0IG9uZSBhcmd1bWVudCwgdGhpcyBtZXRob2Qgc2V0cyB1cmwgdG8gbmV3IHZhbHVlLlxuICAgKiBJZiBodG1sNSBoaXN0b3J5IGFwaSBzdXBwb3J0ZWQsIHB1c2hTdGF0ZS9yZXBsYWNlU3RhdGUgaXMgdXNlZCwgb3RoZXJ3aXNlXG4gICAqIGxvY2F0aW9uLmhyZWYvbG9jYXRpb24ucmVwbGFjZSBpcyB1c2VkLlxuICAgKiBSZXR1cm5zIGl0cyBvd24gaW5zdGFuY2UgdG8gYWxsb3cgY2hhaW5pbmdcbiAgICpcbiAgICogTk9URTogdGhpcyBhcGkgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSAkbG9jYXRpb24gc2VydmljZS4gUGxlYXNlIHVzZSB0aGVcbiAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb24gc2VydmljZX0gdG8gY2hhbmdlIHVybC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBOZXcgdXJsICh3aGVuIHVzZWQgYXMgc2V0dGVyKVxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZXBsYWNlIFNob3VsZCBuZXcgdXJsIHJlcGxhY2UgY3VycmVudCBoaXN0b3J5IHJlY29yZD9cbiAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZSBvYmplY3QgdG8gdXNlIHdpdGggcHVzaFN0YXRlL3JlcGxhY2VTdGF0ZVxuICAgKi9cbiAgc2VsZi51cmwgPSBmdW5jdGlvbih1cmwsIHJlcGxhY2UsIHN0YXRlKSB7XG4gICAgLy8gSW4gbW9kZXJuIGJyb3dzZXJzIGBoaXN0b3J5LnN0YXRlYCBpcyBgbnVsbGAgYnkgZGVmYXVsdDsgdHJlYXRpbmcgaXQgc2VwYXJhdGVseVxuICAgIC8vIGZyb20gYHVuZGVmaW5lZGAgd291bGQgY2F1c2UgYCRicm93c2VyLnVybCgnL2ZvbycpYCB0byBjaGFuZ2UgYGhpc3Rvcnkuc3RhdGVgXG4gICAgLy8gdG8gdW5kZWZpbmVkIHZpYSBgcHVzaFN0YXRlYC4gSW5zdGVhZCwgbGV0J3MgY2hhbmdlIGB1bmRlZmluZWRgIHRvIGBudWxsYCBoZXJlLlxuICAgIGlmIChpc1VuZGVmaW5lZChzdGF0ZSkpIHtcbiAgICAgIHN0YXRlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBbmRyb2lkIEJyb3dzZXIgQkZDYWNoZSBjYXVzZXMgbG9jYXRpb24sIGhpc3RvcnkgcmVmZXJlbmNlIHRvIGJlY29tZSBzdGFsZS5cbiAgICBpZiAobG9jYXRpb24gIT09IHdpbmRvdy5sb2NhdGlvbikgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG4gICAgaWYgKGhpc3RvcnkgIT09IHdpbmRvdy5oaXN0b3J5KSBoaXN0b3J5ID0gd2luZG93Lmhpc3Rvcnk7XG5cbiAgICAvLyBzZXR0ZXJcbiAgICBpZiAodXJsKSB7XG4gICAgICB2YXIgc2FtZVN0YXRlID0gbGFzdEhpc3RvcnlTdGF0ZSA9PT0gc3RhdGU7XG5cbiAgICAgIC8vIERvbid0IGNoYW5nZSBhbnl0aGluZyBpZiBwcmV2aW91cyBhbmQgY3VycmVudCBVUkxzIGFuZCBzdGF0ZXMgbWF0Y2guIFRoaXMgYWxzbyBwcmV2ZW50c1xuICAgICAgLy8gSUU8MTAgZnJvbSBnZXR0aW5nIGludG8gcmVkaXJlY3QgbG9vcCB3aGVuIGluIExvY2F0aW9uSGFzaGJhbmdJbkh0bWw1VXJsIG1vZGUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9jb21taXQvZmZiMjcwMVxuICAgICAgaWYgKGxhc3RCcm93c2VyVXJsID09PSB1cmwgJiYgKCEkc25pZmZlci5oaXN0b3J5IHx8IHNhbWVTdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG4gICAgICB2YXIgc2FtZUJhc2UgPSBsYXN0QnJvd3NlclVybCAmJiBzdHJpcEhhc2gobGFzdEJyb3dzZXJVcmwpID09PSBzdHJpcEhhc2godXJsKTtcbiAgICAgIGxhc3RCcm93c2VyVXJsID0gdXJsO1xuICAgICAgbGFzdEhpc3RvcnlTdGF0ZSA9IHN0YXRlO1xuICAgICAgLy8gRG9uJ3QgdXNlIGhpc3RvcnkgQVBJIGlmIG9ubHkgdGhlIGhhc2ggY2hhbmdlZFxuICAgICAgLy8gZHVlIHRvIGEgYnVnIGluIElFMTAvSUUxMSB3aGljaCBsZWFkc1xuICAgICAgLy8gdG8gbm90IGZpcmluZyBhIGBoYXNoY2hhbmdlYCBub3IgYHBvcHN0YXRlYCBldmVudFxuICAgICAgLy8gaW4gc29tZSBjYXNlcyAoc2VlICM5MTQzKS5cbiAgICAgIGlmICgkc25pZmZlci5oaXN0b3J5ICYmICghc2FtZUJhc2UgfHwgIXNhbWVTdGF0ZSkpIHtcbiAgICAgICAgaGlzdG9yeVtyZXBsYWNlID8gJ3JlcGxhY2VTdGF0ZScgOiAncHVzaFN0YXRlJ10oc3RhdGUsICcnLCB1cmwpO1xuICAgICAgICBjYWNoZVN0YXRlKCk7XG4gICAgICAgIC8vIERvIHRoZSBhc3NpZ25tZW50IGFnYWluIHNvIHRoYXQgdGhvc2UgdHdvIHZhcmlhYmxlcyBhcmUgcmVmZXJlbnRpYWxseSBpZGVudGljYWwuXG4gICAgICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBjYWNoZWRTdGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc2FtZUJhc2UpIHtcbiAgICAgICAgICBwZW5kaW5nTG9jYXRpb24gPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICBsb2NhdGlvbi5yZXBsYWNlKHVybCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXNhbWVCYXNlKSB7XG4gICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhdGlvbi5oYXNoID0gZ2V0SGFzaCh1cmwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhdGlvbi5ocmVmICE9PSB1cmwpIHtcbiAgICAgICAgICBwZW5kaW5nTG9jYXRpb24gPSB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwZW5kaW5nTG9jYXRpb24pIHtcbiAgICAgICAgcGVuZGluZ0xvY2F0aW9uID0gdXJsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgLy8gZ2V0dGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIC0gcGVuZGluZ0xvY2F0aW9uIGlzIG5lZWRlZCBhcyBicm93c2VycyBkb24ndCBhbGxvdyB0byByZWFkIG91dFxuICAgICAgLy8gICB0aGUgbmV3IGxvY2F0aW9uLmhyZWYgaWYgYSByZWxvYWQgaGFwcGVuZWQgb3IgaWYgdGhlcmUgaXMgYSBidWcgbGlrZSBpbiBpT1MgOSAoc2VlXG4gICAgICAvLyAgIGh0dHBzOi8vb3BlbnJhZGFyLmFwcHNwb3QuY29tLzIyMTg2MTA5KS5cbiAgICAgIC8vIC0gdGhlIHJlcGxhY2VtZW50IGlzIGEgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDA3MTcyXG4gICAgICByZXR1cm4gcGVuZGluZ0xvY2F0aW9uIHx8IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvJTI3L2csJ1xcJycpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5hbWUgJGJyb3dzZXIjc3RhdGVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGEgZ2V0dGVyLlxuICAgKlxuICAgKiBSZXR1cm4gaGlzdG9yeS5zdGF0ZSBvciBudWxsIGlmIGhpc3Rvcnkuc3RhdGUgaXMgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBzdGF0ZVxuICAgKi9cbiAgc2VsZi5zdGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjYWNoZWRTdGF0ZTtcbiAgfTtcblxuICB2YXIgdXJsQ2hhbmdlTGlzdGVuZXJzID0gW10sXG4gICAgICB1cmxDaGFuZ2VJbml0ID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gY2FjaGVTdGF0ZUFuZEZpcmVVcmxDaGFuZ2UoKSB7XG4gICAgcGVuZGluZ0xvY2F0aW9uID0gbnVsbDtcbiAgICBjYWNoZVN0YXRlKCk7XG4gICAgZmlyZVVybENoYW5nZSgpO1xuICB9XG5cbiAgLy8gVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgdXNlZCAqb25seSogaW5zaWRlIHRoZSBjYWNoZVN0YXRlIGZ1bmN0aW9uLlxuICB2YXIgbGFzdENhY2hlZFN0YXRlID0gbnVsbDtcbiAgZnVuY3Rpb24gY2FjaGVTdGF0ZSgpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgb25seSBwbGFjZSBpbiAkYnJvd3NlciB3aGVyZSBgaGlzdG9yeS5zdGF0ZWAgaXMgcmVhZC5cbiAgICBjYWNoZWRTdGF0ZSA9IGdldEN1cnJlbnRTdGF0ZSgpO1xuICAgIGNhY2hlZFN0YXRlID0gaXNVbmRlZmluZWQoY2FjaGVkU3RhdGUpID8gbnVsbCA6IGNhY2hlZFN0YXRlO1xuXG4gICAgLy8gUHJldmVudCBjYWxsYmFja3MgZm8gZmlyZSB0d2ljZSBpZiBib3RoIGhhc2hjaGFuZ2UgJiBwb3BzdGF0ZSB3ZXJlIGZpcmVkLlxuICAgIGlmIChlcXVhbHMoY2FjaGVkU3RhdGUsIGxhc3RDYWNoZWRTdGF0ZSkpIHtcbiAgICAgIGNhY2hlZFN0YXRlID0gbGFzdENhY2hlZFN0YXRlO1xuICAgIH1cbiAgICBsYXN0Q2FjaGVkU3RhdGUgPSBjYWNoZWRTdGF0ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpcmVVcmxDaGFuZ2UoKSB7XG4gICAgaWYgKGxhc3RCcm93c2VyVXJsID09PSBzZWxmLnVybCgpICYmIGxhc3RIaXN0b3J5U3RhdGUgPT09IGNhY2hlZFN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGFzdEJyb3dzZXJVcmwgPSBzZWxmLnVybCgpO1xuICAgIGxhc3RIaXN0b3J5U3RhdGUgPSBjYWNoZWRTdGF0ZTtcbiAgICBmb3JFYWNoKHVybENoYW5nZUxpc3RlbmVycywgZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyKHNlbGYudXJsKCksIGNhY2hlZFN0YXRlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmFtZSAkYnJvd3NlciNvblVybENoYW5nZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCwgd2hlbiB1cmwgY2hhbmdlcy5cbiAgICpcbiAgICogSXQncyBvbmx5IGNhbGxlZCB3aGVuIHRoZSB1cmwgaXMgY2hhbmdlZCBmcm9tIG91dHNpZGUgb2YgYW5ndWxhcjpcbiAgICogLSB1c2VyIHR5cGVzIGRpZmZlcmVudCB1cmwgaW50byBhZGRyZXNzIGJhclxuICAgKiAtIHVzZXIgY2xpY2tzIG9uIGhpc3RvcnkgKGZvcndhcmQvYmFjaykgYnV0dG9uXG4gICAqIC0gdXNlciBjbGlja3Mgb24gYSBsaW5rXG4gICAqXG4gICAqIEl0J3Mgbm90IGNhbGxlZCB3aGVuIHVybCBpcyBjaGFuZ2VkIGJ5ICRicm93c2VyLnVybCgpIG1ldGhvZFxuICAgKlxuICAgKiBUaGUgbGlzdGVuZXIgZ2V0cyBjYWxsZWQgd2l0aCBuZXcgdXJsIGFzIHBhcmFtZXRlci5cbiAgICpcbiAgICogTk9URTogdGhpcyBhcGkgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGJ5IHRoZSAkbG9jYXRpb24gc2VydmljZS4gUGxlYXNlIHVzZSB0aGVcbiAgICoge0BsaW5rIG5nLiRsb2NhdGlvbiAkbG9jYXRpb24gc2VydmljZX0gdG8gbW9uaXRvciB1cmwgY2hhbmdlcyBpbiBhbmd1bGFyIGFwcHMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKX0gbGlzdGVuZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdXJsIGNoYW5nZXMuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9uKHN0cmluZyl9IFJldHVybnMgdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXIgZm4gLSBoYW5keSBpZiB0aGUgZm4gaXMgYW5vbnltb3VzLlxuICAgKi9cbiAgc2VsZi5vblVybENoYW5nZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgLy8gVE9ETyh2b2p0YSk6IHJlZmFjdG9yIHRvIHVzZSBub2RlJ3Mgc3ludGF4IGZvciBldmVudHNcbiAgICBpZiAoIXVybENoYW5nZUluaXQpIHtcbiAgICAgIC8vIFdlIGxpc3RlbiBvbiBib3RoIChoYXNoY2hhbmdlL3BvcHN0YXRlKSB3aGVuIGF2YWlsYWJsZSwgYXMgc29tZSBicm93c2VycyAoZS5nLiBPcGVyYSlcbiAgICAgIC8vIGRvbid0IGZpcmUgcG9wc3RhdGUgd2hlbiB1c2VyIGNoYW5nZSB0aGUgYWRkcmVzcyBiYXIgYW5kIGRvbid0IGZpcmUgaGFzaGNoYW5nZSB3aGVuIHVybFxuICAgICAgLy8gY2hhbmdlZCBieSBwdXNoL3JlcGxhY2VTdGF0ZVxuXG4gICAgICAvLyBodG1sNSBoaXN0b3J5IGFwaSAtIHBvcHN0YXRlIGV2ZW50XG4gICAgICBpZiAoJHNuaWZmZXIuaGlzdG9yeSkganFMaXRlKHdpbmRvdykub24oJ3BvcHN0YXRlJywgY2FjaGVTdGF0ZUFuZEZpcmVVcmxDaGFuZ2UpO1xuICAgICAgLy8gaGFzaGNoYW5nZSBldmVudFxuICAgICAganFMaXRlKHdpbmRvdykub24oJ2hhc2hjaGFuZ2UnLCBjYWNoZVN0YXRlQW5kRmlyZVVybENoYW5nZSk7XG5cbiAgICAgIHVybENoYW5nZUluaXQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVybENoYW5nZUxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gY2FsbGJhY2s7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIFJlbW92ZSBwb3BzdGF0ZSBhbmQgaGFzaGNoYW5nZSBoYW5kbGVyIGZyb20gd2luZG93LlxuICAgKlxuICAgKiBOT1RFOiB0aGlzIGFwaSBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgYnkgJHJvb3RTY29wZS5cbiAgICovXG4gIHNlbGYuJCRhcHBsaWNhdGlvbkRlc3Ryb3llZCA9IGZ1bmN0aW9uKCkge1xuICAgIGpxTGl0ZSh3aW5kb3cpLm9mZignaGFzaGNoYW5nZSBwb3BzdGF0ZScsIGNhY2hlU3RhdGVBbmRGaXJlVXJsQ2hhbmdlKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVybCBoYXMgY2hhbmdlZCBvdXRzaWRlIG9mIEFuZ3VsYXIuXG4gICAqIE5lZWRzIHRvIGJlIGV4cG9ydGVkIHRvIGJlIGFibGUgdG8gY2hlY2sgZm9yIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gZG9uZSBpbiBzeW5jLFxuICAgKiBhcyBoYXNoY2hhbmdlL3BvcHN0YXRlIGV2ZW50cyBmaXJlIGluIGFzeW5jLlxuICAgKi9cbiAgc2VsZi4kJGNoZWNrVXJsQ2hhbmdlID0gZmlyZVVybENoYW5nZTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBNaXNjIEFQSVxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8qKlxuICAgKiBAbmFtZSAkYnJvd3NlciNiYXNlSHJlZlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyBjdXJyZW50IDxiYXNlIGhyZWY+XG4gICAqIChhbHdheXMgcmVsYXRpdmUgLSB3aXRob3V0IGRvbWFpbilcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgYmFzZSBocmVmXG4gICAqL1xuICBzZWxmLmJhc2VIcmVmID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhyZWYgPSBiYXNlRWxlbWVudC5hdHRyKCdocmVmJyk7XG4gICAgcmV0dXJuIGhyZWYgPyBocmVmLnJlcGxhY2UoL14oaHR0cHM/Oik/XFwvXFwvW14vXSovLCAnJykgOiAnJztcbiAgfTtcblxuICAvKipcbiAgICogQG5hbWUgJGJyb3dzZXIjZGVmZXJcbiAgICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBBIGZ1bmN0aW9uLCB3aG8ncyBleGVjdXRpb24gc2hvdWxkIGJlIGRlZmVycmVkLlxuICAgKiBAcGFyYW0ge251bWJlcj19IFtkZWxheT0wXSBvZiBtaWxsaXNlY29uZHMgdG8gZGVmZXIgdGhlIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cbiAgICogQHJldHVybnMgeyp9IERlZmVySWQgdGhhdCBjYW4gYmUgdXNlZCB0byBjYW5jZWwgdGhlIHRhc2sgdmlhIGAkYnJvd3Nlci5kZWZlci5jYW5jZWwoKWAuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBFeGVjdXRlcyBhIGZuIGFzeW5jaHJvbm91c2x5IHZpYSBgc2V0VGltZW91dChmbiwgZGVsYXkpYC5cbiAgICpcbiAgICogVW5saWtlIHdoZW4gY2FsbGluZyBgc2V0VGltZW91dGAgZGlyZWN0bHksIGluIHRlc3QgdGhpcyBmdW5jdGlvbiBpcyBtb2NrZWQgYW5kIGluc3RlYWQgb2YgdXNpbmdcbiAgICogYHNldFRpbWVvdXRgIGluIHRlc3RzLCB0aGUgZm5zIGFyZSBxdWV1ZWQgaW4gYW4gYXJyYXksIHdoaWNoIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGZsdXNoZWRcbiAgICogdmlhIGAkYnJvd3Nlci5kZWZlci5mbHVzaCgpYC5cbiAgICpcbiAgICovXG4gIHNlbGYuZGVmZXIgPSBmdW5jdGlvbihmbiwgZGVsYXkpIHtcbiAgICB2YXIgdGltZW91dElkO1xuICAgIG91dHN0YW5kaW5nUmVxdWVzdENvdW50Kys7XG4gICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGRlbGV0ZSBwZW5kaW5nRGVmZXJJZHNbdGltZW91dElkXTtcbiAgICAgIGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KGZuKTtcbiAgICB9LCBkZWxheSB8fCAwKTtcbiAgICBwZW5kaW5nRGVmZXJJZHNbdGltZW91dElkXSA9IHRydWU7XG4gICAgcmV0dXJuIHRpbWVvdXRJZDtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBAbmFtZSAkYnJvd3NlciNkZWZlci5jYW5jZWxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENhbmNlbHMgYSBkZWZlcnJlZCB0YXNrIGlkZW50aWZpZWQgd2l0aCBgZGVmZXJJZGAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGVmZXJJZCBUb2tlbiByZXR1cm5lZCBieSB0aGUgYCRicm93c2VyLmRlZmVyYCBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGhhc24ndCBleGVjdXRlZCB5ZXQgYW5kIHdhcyBzdWNjZXNzZnVsbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkLlxuICAgKi9cbiAgc2VsZi5kZWZlci5jYW5jZWwgPSBmdW5jdGlvbihkZWZlcklkKSB7XG4gICAgaWYgKHBlbmRpbmdEZWZlcklkc1tkZWZlcklkXSkge1xuICAgICAgZGVsZXRlIHBlbmRpbmdEZWZlcklkc1tkZWZlcklkXTtcbiAgICAgIGNsZWFyVGltZW91dChkZWZlcklkKTtcbiAgICAgIGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KG5vb3ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxufVxuXG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICRCcm93c2VyUHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsICckbG9nJywgJyRzbmlmZmVyJywgJyRkb2N1bWVudCcsXG4gICAgICBmdW5jdGlvbigkd2luZG93LCAkbG9nLCAkc25pZmZlciwgJGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgQnJvd3Nlcigkd2luZG93LCAkZG9jdW1lbnQsICRsb2csICRzbmlmZmVyKTtcbiAgICAgIH1dO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkY2FjaGVGYWN0b3J5XG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRmFjdG9yeSB0aGF0IGNvbnN0cnVjdHMge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdHMgYW5kIGdpdmVzIGFjY2VzcyB0b1xuICogdGhlbS5cbiAqXG4gKiBgYGBqc1xuICpcbiAqICB2YXIgY2FjaGUgPSAkY2FjaGVGYWN0b3J5KCdjYWNoZUlkJyk7XG4gKiAgZXhwZWN0KCRjYWNoZUZhY3RvcnkuZ2V0KCdjYWNoZUlkJykpLnRvQmUoY2FjaGUpO1xuICogIGV4cGVjdCgkY2FjaGVGYWN0b3J5LmdldCgnbm9TdWNoQ2FjaGVJZCcpKS5ub3QudG9CZURlZmluZWQoKTtcbiAqXG4gKiAgY2FjaGUucHV0KFwia2V5XCIsIFwidmFsdWVcIik7XG4gKiAgY2FjaGUucHV0KFwiYW5vdGhlciBrZXlcIiwgXCJhbm90aGVyIHZhbHVlXCIpO1xuICpcbiAqICAvLyBXZSd2ZSBzcGVjaWZpZWQgbm8gb3B0aW9ucyBvbiBjcmVhdGlvblxuICogIGV4cGVjdChjYWNoZS5pbmZvKCkpLnRvRXF1YWwoe2lkOiAnY2FjaGVJZCcsIHNpemU6IDJ9KTtcbiAqXG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlSWQgTmFtZSBvciBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZCBjYWNoZS5cbiAqIEBwYXJhbSB7b2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgY2FjaGUgYmVoYXZpb3IuIFByb3BlcnRpZXM6XG4gKlxuICogICAtIGB7bnVtYmVyPX1gIGBjYXBhY2l0eWAg4oCUIHR1cm5zIHRoZSBjYWNoZSBpbnRvIExSVSBjYWNoZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBOZXdseSBjcmVhdGVkIGNhY2hlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0IG9mIG1ldGhvZHM6XG4gKlxuICogLSBge29iamVjdH1gIGBpbmZvKClgIOKAlCBSZXR1cm5zIGlkLCBzaXplLCBhbmQgb3B0aW9ucyBvZiBjYWNoZS5cbiAqIC0gYHt7Kn19YCBgcHV0KHtzdHJpbmd9IGtleSwgeyp9IHZhbHVlKWAg4oCUIFB1dHMgYSBuZXcga2V5LXZhbHVlIHBhaXIgaW50byB0aGUgY2FjaGUgYW5kIHJldHVybnNcbiAqICAgaXQuXG4gKiAtIGB7eyp9fWAgYGdldCh7c3RyaW5nfSBrZXkpYCDigJQgUmV0dXJucyBjYWNoZWQgdmFsdWUgZm9yIGBrZXlgIG9yIHVuZGVmaW5lZCBmb3IgY2FjaGUgbWlzcy5cbiAqIC0gYHt2b2lkfWAgYHJlbW92ZSh7c3RyaW5nfSBrZXkpYCDigJQgUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGNhY2hlLlxuICogLSBge3ZvaWR9YCBgcmVtb3ZlQWxsKClgIOKAlCBSZW1vdmVzIGFsbCBjYWNoZWQgdmFsdWVzLlxuICogLSBge3ZvaWR9YCBgZGVzdHJveSgpYCDigJQgUmVtb3ZlcyByZWZlcmVuY2VzIHRvIHRoaXMgY2FjaGUgZnJvbSAkY2FjaGVGYWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJjYWNoZUV4YW1wbGVBcHBcIiBuYW1lPVwiY2FjaGUtZmFjdG9yeVwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkNhY2hlQ29udHJvbGxlclwiPlxuICAgICAgICAgPGlucHV0IG5nLW1vZGVsPVwibmV3Q2FjaGVLZXlcIiBwbGFjZWhvbGRlcj1cIktleVwiPlxuICAgICAgICAgPGlucHV0IG5nLW1vZGVsPVwibmV3Q2FjaGVWYWx1ZVwiIHBsYWNlaG9sZGVyPVwiVmFsdWVcIj5cbiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJwdXQobmV3Q2FjaGVLZXksIG5ld0NhY2hlVmFsdWUpXCI+Q2FjaGU8L2J1dHRvbj5cblxuICAgICAgICAgPHAgbmctaWY9XCJrZXlzLmxlbmd0aFwiPkNhY2hlZCBWYWx1ZXM8L3A+XG4gICAgICAgICA8ZGl2IG5nLXJlcGVhdD1cImtleSBpbiBrZXlzXCI+XG4gICAgICAgICAgIDxzcGFuIG5nLWJpbmQ9XCJrZXlcIj48L3NwYW4+XG4gICAgICAgICAgIDxzcGFuPjogPC9zcGFuPlxuICAgICAgICAgICA8YiBuZy1iaW5kPVwiY2FjaGUuZ2V0KGtleSlcIj48L2I+XG4gICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgPHA+Q2FjaGUgSW5mbzwvcD5cbiAgICAgICAgIDxkaXYgbmctcmVwZWF0PVwiKGtleSwgdmFsdWUpIGluIGNhY2hlLmluZm8oKVwiPlxuICAgICAgICAgICA8c3BhbiBuZy1iaW5kPVwia2V5XCI+PC9zcGFuPlxuICAgICAgICAgICA8c3Bhbj46IDwvc3Bhbj5cbiAgICAgICAgICAgPGIgbmctYmluZD1cInZhbHVlXCI+PC9iPlxuICAgICAgICAgPC9kaXY+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjYWNoZUV4YW1wbGVBcHAnLCBbXSkuXG4gICAgICAgICBjb250cm9sbGVyKCdDYWNoZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckY2FjaGVGYWN0b3J5JywgZnVuY3Rpb24oJHNjb3BlLCAkY2FjaGVGYWN0b3J5KSB7XG4gICAgICAgICAgICRzY29wZS5rZXlzID0gW107XG4gICAgICAgICAgICRzY29wZS5jYWNoZSA9ICRjYWNoZUZhY3RvcnkoJ2NhY2hlSWQnKTtcbiAgICAgICAgICAgJHNjb3BlLnB1dCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc1VuZGVmaW5lZCgkc2NvcGUuY2FjaGUuZ2V0KGtleSkpKSB7XG4gICAgICAgICAgICAgICAkc2NvcGUua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgICRzY29wZS5jYWNoZS5wdXQoa2V5LCBhbmd1bGFyLmlzVW5kZWZpbmVkKHZhbHVlKSA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgICAgIH07XG4gICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIHAge1xuICAgICAgICAgbWFyZ2luOiAxMHB4IDAgM3B4O1xuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiAkQ2FjaGVGYWN0b3J5UHJvdmlkZXIoKSB7XG5cbiAgdGhpcy4kZ2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNhY2hlcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gY2FjaGVGYWN0b3J5KGNhY2hlSWQsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChjYWNoZUlkIGluIGNhY2hlcykge1xuICAgICAgICB0aHJvdyBtaW5FcnIoJyRjYWNoZUZhY3RvcnknKSgnaWlkJywgJ0NhY2hlSWQgXFwnezB9XFwnIGlzIGFscmVhZHkgdGFrZW4hJywgY2FjaGVJZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaXplID0gMCxcbiAgICAgICAgICBzdGF0cyA9IGV4dGVuZCh7fSwgb3B0aW9ucywge2lkOiBjYWNoZUlkfSksXG4gICAgICAgICAgZGF0YSA9IGNyZWF0ZU1hcCgpLFxuICAgICAgICAgIGNhcGFjaXR5ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5jYXBhY2l0eSkgfHwgTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBscnVIYXNoID0gY3JlYXRlTWFwKCksXG4gICAgICAgICAgZnJlc2hFbmQgPSBudWxsLFxuICAgICAgICAgIHN0YWxlRW5kID0gbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgdHlwZVxuICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZVxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogQSBjYWNoZSBvYmplY3QgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YSwgcHJpbWFyaWx5IHVzZWQgYnlcbiAgICAgICAqIHtAbGluayAkaHR0cCAkaHR0cH0gYW5kIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOnNjcmlwdCBzY3JpcHR9IGRpcmVjdGl2ZSB0byBjYWNoZVxuICAgICAgICogdGVtcGxhdGVzIGFuZCBvdGhlciBkYXRhLlxuICAgICAgICpcbiAgICAgICAqIGBgYGpzXG4gICAgICAgKiAgYW5ndWxhci5tb2R1bGUoJ3N1cGVyQ2FjaGUnKVxuICAgICAgICogICAgLmZhY3RvcnkoJ3N1cGVyQ2FjaGUnLCBbJyRjYWNoZUZhY3RvcnknLCBmdW5jdGlvbigkY2FjaGVGYWN0b3J5KSB7XG4gICAgICAgKiAgICAgIHJldHVybiAkY2FjaGVGYWN0b3J5KCdzdXBlci1jYWNoZScpO1xuICAgICAgICogICAgfV0pO1xuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICogRXhhbXBsZSB0ZXN0OlxuICAgICAgICpcbiAgICAgICAqIGBgYGpzXG4gICAgICAgKiAgaXQoJ3Nob3VsZCBiZWhhdmUgbGlrZSBhIGNhY2hlJywgaW5qZWN0KGZ1bmN0aW9uKHN1cGVyQ2FjaGUpIHtcbiAgICAgICAqICAgIHN1cGVyQ2FjaGUucHV0KCdrZXknLCAndmFsdWUnKTtcbiAgICAgICAqICAgIHN1cGVyQ2FjaGUucHV0KCdhbm90aGVyIGtleScsICdhbm90aGVyIHZhbHVlJyk7XG4gICAgICAgKlxuICAgICAgICogICAgZXhwZWN0KHN1cGVyQ2FjaGUuaW5mbygpKS50b0VxdWFsKHtcbiAgICAgICAqICAgICAgaWQ6ICdzdXBlci1jYWNoZScsXG4gICAgICAgKiAgICAgIHNpemU6IDJcbiAgICAgICAqICAgIH0pO1xuICAgICAgICpcbiAgICAgICAqICAgIHN1cGVyQ2FjaGUucmVtb3ZlKCdhbm90aGVyIGtleScpO1xuICAgICAgICogICAgZXhwZWN0KHN1cGVyQ2FjaGUuZ2V0KCdhbm90aGVyIGtleScpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICAgKlxuICAgICAgICogICAgc3VwZXJDYWNoZS5yZW1vdmVBbGwoKTtcbiAgICAgICAqICAgIGV4cGVjdChzdXBlckNhY2hlLmluZm8oKSkudG9FcXVhbCh7XG4gICAgICAgKiAgICAgIGlkOiAnc3VwZXItY2FjaGUnLFxuICAgICAgICogICAgICBzaXplOiAwXG4gICAgICAgKiAgICB9KTtcbiAgICAgICAqICB9KSk7XG4gICAgICAgKiBgYGBcbiAgICAgICAqL1xuICAgICAgcmV0dXJuIChjYWNoZXNbY2FjaGVJZF0gPSB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNwdXRcbiAgICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEluc2VydHMgYSBuYW1lZCBlbnRyeSBpbnRvIHRoZSB7QGxpbmsgJGNhY2hlRmFjdG9yeS5DYWNoZSBDYWNoZX0gb2JqZWN0IHRvIGJlXG4gICAgICAgICAqIHJldHJpZXZlZCBsYXRlciwgYW5kIGluY3JlbWVudGluZyB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUgaWYgdGhlIGtleSB3YXMgbm90IGFscmVhZHlcbiAgICAgICAgICogcHJlc2VudCBpbiB0aGUgY2FjaGUuIElmIGJlaGF2aW5nIGxpa2UgYW4gTFJVIGNhY2hlLCBpdCB3aWxsIGFsc28gcmVtb3ZlIHN0YWxlXG4gICAgICAgICAqIGVudHJpZXMgZnJvbSB0aGUgc2V0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJdCB3aWxsIG5vdCBpbnNlcnQgdW5kZWZpbmVkIHZhbHVlcyBpbnRvIHRoZSBjYWNoZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IHVuZGVyIHdoaWNoIHRoZSBjYWNoZWQgZGF0YSBpcyBzdG9yZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgdGhlIHZhbHVlIHRvIHN0b3JlIGFsb25nc2lkZSB0aGUga2V5LiBJZiBpdCBpcyB1bmRlZmluZWQsIHRoZSBrZXlcbiAgICAgICAgICogICAgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIHZhbHVlIHN0b3JlZC5cbiAgICAgICAgICovXG4gICAgICAgIHB1dDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgICBpZiAoY2FwYWNpdHkgPCBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB2YXIgbHJ1RW50cnkgPSBscnVIYXNoW2tleV0gfHwgKGxydUhhc2hba2V5XSA9IHtrZXk6IGtleX0pO1xuXG4gICAgICAgICAgICByZWZyZXNoKGxydUVudHJ5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShrZXkgaW4gZGF0YSkpIHNpemUrKztcbiAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChzaXplID4gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKHN0YWxlRW5kLmtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjZ2V0XG4gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXRyaWV2ZXMgbmFtZWQgZGF0YSBzdG9yZWQgaW4gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGF0YSB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgICogQHJldHVybnMgeyp9IHRoZSB2YWx1ZSBzdG9yZWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIGlmIChjYXBhY2l0eSA8IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIHZhciBscnVFbnRyeSA9IGxydUhhc2hba2V5XTtcblxuICAgICAgICAgICAgaWYgKCFscnVFbnRyeSkgcmV0dXJuO1xuXG4gICAgICAgICAgICByZWZyZXNoKGxydUVudHJ5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNyZW1vdmVcbiAgICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAgICpcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJlbW92ZXMgYW4gZW50cnkgZnJvbSB0aGUge0BsaW5rICRjYWNoZUZhY3RvcnkuQ2FjaGUgQ2FjaGV9IG9iamVjdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBlbnRyeSB0byBiZSByZW1vdmVkXG4gICAgICAgICAqL1xuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIGlmIChjYXBhY2l0eSA8IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIHZhciBscnVFbnRyeSA9IGxydUhhc2hba2V5XTtcblxuICAgICAgICAgICAgaWYgKCFscnVFbnRyeSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAobHJ1RW50cnkgPT09IGZyZXNoRW5kKSBmcmVzaEVuZCA9IGxydUVudHJ5LnA7XG4gICAgICAgICAgICBpZiAobHJ1RW50cnkgPT09IHN0YWxlRW5kKSBzdGFsZUVuZCA9IGxydUVudHJ5Lm47XG4gICAgICAgICAgICBsaW5rKGxydUVudHJ5Lm4sbHJ1RW50cnkucCk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBscnVIYXNoW2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEoa2V5IGluIGRhdGEpKSByZXR1cm47XG5cbiAgICAgICAgICBkZWxldGUgZGF0YVtrZXldO1xuICAgICAgICAgIHNpemUtLTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjcmVtb3ZlQWxsXG4gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIG9iamVjdCBvZiBhbnkgZW50cmllcy5cbiAgICAgICAgICovXG4gICAgICAgIHJlbW92ZUFsbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZGF0YSA9IGNyZWF0ZU1hcCgpO1xuICAgICAgICAgIHNpemUgPSAwO1xuICAgICAgICAgIGxydUhhc2ggPSBjcmVhdGVNYXAoKTtcbiAgICAgICAgICBmcmVzaEVuZCA9IHN0YWxlRW5kID0gbnVsbDtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgICAqIEBuYW1lICRjYWNoZUZhY3RvcnkuQ2FjaGUjZGVzdHJveVxuICAgICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogRGVzdHJveXMgdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfSBvYmplY3QgZW50aXJlbHksXG4gICAgICAgICAqIHJlbW92aW5nIGl0IGZyb20gdGhlIHtAbGluayAkY2FjaGVGYWN0b3J5ICRjYWNoZUZhY3Rvcnl9IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGRhdGEgPSBudWxsO1xuICAgICAgICAgIHN0YXRzID0gbnVsbDtcbiAgICAgICAgICBscnVIYXNoID0gbnVsbDtcbiAgICAgICAgICBkZWxldGUgY2FjaGVzW2NhY2hlSWRdO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAgICogQG5hbWUgJGNhY2hlRmFjdG9yeS5DYWNoZSNpbmZvXG4gICAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYSBwYXJ0aWN1bGFyIHtAbGluayAkY2FjaGVGYWN0b3J5LkNhY2hlIENhY2hlfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge29iamVjdH0gYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAgICAgKiAgIDx1bD5cbiAgICAgICAgICogICAgIDxsaT4qKmlkKio6IHRoZSBpZCBvZiB0aGUgY2FjaGUgaW5zdGFuY2U8L2xpPlxuICAgICAgICAgKiAgICAgPGxpPioqc2l6ZSoqOiB0aGUgbnVtYmVyIG9mIGVudHJpZXMga2VwdCBpbiB0aGUgY2FjaGUgaW5zdGFuY2U8L2xpPlxuICAgICAgICAgKiAgICAgPGxpPioqLi4uKio6IGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZnJvbSB0aGUgb3B0aW9ucyBvYmplY3Qgd2hlbiBjcmVhdGluZyB0aGVcbiAgICAgICAgICogICAgICAgY2FjaGUuPC9saT5cbiAgICAgICAgICogICA8L3VsPlxuICAgICAgICAgKi9cbiAgICAgICAgaW5mbzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgc3RhdHMsIHtzaXplOiBzaXplfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIC8qKlxuICAgICAgICogbWFrZXMgdGhlIGBlbnRyeWAgdGhlIGZyZXNoRW5kIG9mIHRoZSBMUlUgbGlua2VkIGxpc3RcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gcmVmcmVzaChlbnRyeSkge1xuICAgICAgICBpZiAoZW50cnkgIT09IGZyZXNoRW5kKSB7XG4gICAgICAgICAgaWYgKCFzdGFsZUVuZCkge1xuICAgICAgICAgICAgc3RhbGVFbmQgPSBlbnRyeTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWxlRW5kID09PSBlbnRyeSkge1xuICAgICAgICAgICAgc3RhbGVFbmQgPSBlbnRyeS5uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpbmsoZW50cnkubiwgZW50cnkucCk7XG4gICAgICAgICAgbGluayhlbnRyeSwgZnJlc2hFbmQpO1xuICAgICAgICAgIGZyZXNoRW5kID0gZW50cnk7XG4gICAgICAgICAgZnJlc2hFbmQubiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvKipcbiAgICAgICAqIGJpZGlyZWN0aW9uYWxseSBsaW5rcyB0d28gZW50cmllcyBvZiB0aGUgTFJVIGxpbmtlZCBsaXN0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGxpbmsobmV4dEVudHJ5LCBwcmV2RW50cnkpIHtcbiAgICAgICAgaWYgKG5leHRFbnRyeSAhPT0gcHJldkVudHJ5KSB7XG4gICAgICAgICAgaWYgKG5leHRFbnRyeSkgbmV4dEVudHJ5LnAgPSBwcmV2RW50cnk7IC8vcCBzdGFuZHMgZm9yIHByZXZpb3VzLCAncHJldicgZGlkbid0IG1pbmlmeVxuICAgICAgICAgIGlmIChwcmV2RW50cnkpIHByZXZFbnRyeS5uID0gbmV4dEVudHJ5OyAvL24gc3RhbmRzIGZvciBuZXh0LCAnbmV4dCcgZGlkbid0IG1pbmlmeVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNhY2hlRmFjdG9yeSNpbmZvXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBjYWNoZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZFxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIGtleS12YWx1ZSBtYXAgb2YgYGNhY2hlSWRgIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBgY2FjaGUjaW5mb2BcbiAgICovXG4gICAgY2FjaGVGYWN0b3J5LmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpbmZvID0ge307XG4gICAgICBmb3JFYWNoKGNhY2hlcywgZnVuY3Rpb24oY2FjaGUsIGNhY2hlSWQpIHtcbiAgICAgICAgaW5mb1tjYWNoZUlkXSA9IGNhY2hlLmluZm8oKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfTtcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjYWNoZUZhY3RvcnkjZ2V0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXQgYWNjZXNzIHRvIGEgY2FjaGUgb2JqZWN0IGJ5IHRoZSBgY2FjaGVJZGAgdXNlZCB3aGVuIGl0IHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVJZCBOYW1lIG9yIGlkIG9mIGEgY2FjaGUgdG8gYWNjZXNzLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBDYWNoZSBvYmplY3QgaWRlbnRpZmllZCBieSB0aGUgY2FjaGVJZCBvciB1bmRlZmluZWQgaWYgbm8gc3VjaCBjYWNoZS5cbiAgICovXG4gICAgY2FjaGVGYWN0b3J5LmdldCA9IGZ1bmN0aW9uKGNhY2hlSWQpIHtcbiAgICAgIHJldHVybiBjYWNoZXNbY2FjaGVJZF07XG4gICAgfTtcblxuXG4gICAgcmV0dXJuIGNhY2hlRmFjdG9yeTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJHRlbXBsYXRlQ2FjaGVcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgZmlyc3QgdGltZSBhIHRlbXBsYXRlIGlzIHVzZWQsIGl0IGlzIGxvYWRlZCBpbiB0aGUgdGVtcGxhdGUgY2FjaGUgZm9yIHF1aWNrIHJldHJpZXZhbC4gWW91XG4gKiBjYW4gbG9hZCB0ZW1wbGF0ZXMgZGlyZWN0bHkgaW50byB0aGUgY2FjaGUgaW4gYSBgc2NyaXB0YCB0YWcsIG9yIGJ5IGNvbnN1bWluZyB0aGVcbiAqIGAkdGVtcGxhdGVDYWNoZWAgc2VydmljZSBkaXJlY3RseS5cbiAqXG4gKiBBZGRpbmcgdmlhIHRoZSBgc2NyaXB0YCB0YWc6XG4gKlxuICogYGBgaHRtbFxuICogICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L25nLXRlbXBsYXRlXCIgaWQ9XCJ0ZW1wbGF0ZUlkLmh0bWxcIj5cbiAqICAgICA8cD5UaGlzIGlzIHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZTwvcD5cbiAqICAgPC9zY3JpcHQ+XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGU6KiogdGhlIGBzY3JpcHRgIHRhZyBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBgaGVhZGAgb2ZcbiAqIHRoZSBkb2N1bWVudCwgYnV0IGl0IG11c3QgYmUgYSBkZXNjZW5kZW50IG9mIHRoZSB7QGxpbmsgbmcuJHJvb3RFbGVtZW50ICRyb290RWxlbWVudH0gKElFLFxuICogZWxlbWVudCB3aXRoIG5nLWFwcCBhdHRyaWJ1dGUpLCBvdGhlcndpc2UgdGhlIHRlbXBsYXRlIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBBZGRpbmcgdmlhIHRoZSBgJHRlbXBsYXRlQ2FjaGVgIHNlcnZpY2U6XG4gKlxuICogYGBganNcbiAqIHZhciBteUFwcCA9IGFuZ3VsYXIubW9kdWxlKCdteUFwcCcsIFtdKTtcbiAqIG15QXBwLnJ1bihmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkge1xuICogICAkdGVtcGxhdGVDYWNoZS5wdXQoJ3RlbXBsYXRlSWQuaHRtbCcsICdUaGlzIGlzIHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZScpO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBUbyByZXRyaWV2ZSB0aGUgdGVtcGxhdGUgbGF0ZXIsIHNpbXBseSB1c2UgaXQgaW4geW91ciBjb21wb25lbnQ6XG4gKiBgYGBqc1xuICogbXlBcHAuY29tcG9uZW50KCdteUNvbXBvbmVudCcsIHtcbiAqICAgIHRlbXBsYXRlVXJsOiAndGVtcGxhdGVJZC5odG1sJ1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBvciBnZXQgaXQgdmlhIHRoZSBgJHRlbXBsYXRlQ2FjaGVgIHNlcnZpY2U6XG4gKiBgYGBqc1xuICogJHRlbXBsYXRlQ2FjaGUuZ2V0KCd0ZW1wbGF0ZUlkLmh0bWwnKVxuICogYGBgXG4gKlxuICogU2VlIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5ICRjYWNoZUZhY3Rvcnl9LlxuICpcbiAqL1xuZnVuY3Rpb24gJFRlbXBsYXRlQ2FjaGVQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckY2FjaGVGYWN0b3J5JywgZnVuY3Rpb24oJGNhY2hlRmFjdG9yeSkge1xuICAgIHJldHVybiAkY2FjaGVGYWN0b3J5KCd0ZW1wbGF0ZXMnKTtcbiAgfV07XG59XG5cbi8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICpcbiAqICAgICBBbnkgY29tbWl0cyB0byB0aGlzIGZpbGUgc2hvdWxkIGJlIHJldmlld2VkIHdpdGggc2VjdXJpdHkgaW4gbWluZC4gICpcbiAqICAgQ2hhbmdlcyB0byB0aGlzIGZpbGUgY2FuIHBvdGVudGlhbGx5IGNyZWF0ZSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMuICpcbiAqICAgICAgICAgIEFuIGFwcHJvdmFsIGZyb20gMiBDb3JlIG1lbWJlcnMgd2l0aCBoaXN0b3J5IG9mIG1vZGlmeWluZyAgICAgICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZSBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAqICBEb2VzIHRoZSBjaGFuZ2Ugc29tZWhvdyBhbGxvdyBmb3IgYXJiaXRyYXJ5IGphdmFzY3JpcHQgdG8gYmUgZXhlY3V0ZWQ/ICpcbiAqICAgIE9yIGFsbG93cyBmb3Igc29tZW9uZSB0byBjaGFuZ2UgdGhlIHByb3RvdHlwZSBvZiBidWlsdC1pbiBvYmplY3RzPyAgICpcbiAqICAgICBPciBnaXZlcyB1bmRlc2lyZWQgYWNjZXNzIHRvIHZhcmlhYmxlcyBsaWtlIGRvY3VtZW50IG9yIHdpbmRvdz8gICAgKlxuICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi9cblxuLyogISBWQVJJQUJMRS9GVU5DVElPTiBOQU1JTkcgQ09OVkVOVElPTlMgVEhBVCBBUFBMWSBUTyBUSElTIEZJTEUhXG4gKlxuICogRE9NLXJlbGF0ZWQgdmFyaWFibGVzOlxuICpcbiAqIC0gXCJub2RlXCIgLSBET00gTm9kZVxuICogLSBcImVsZW1lbnRcIiAtIERPTSBFbGVtZW50IG9yIE5vZGVcbiAqIC0gXCIkbm9kZVwiIG9yIFwiJGVsZW1lbnRcIiAtIGpxTGl0ZS13cmFwcGVkIG5vZGUgb3IgZWxlbWVudFxuICpcbiAqXG4gKiBDb21waWxlciByZWxhdGVkIHN0dWZmOlxuICpcbiAqIC0gXCJsaW5rRm5cIiAtIGxpbmtpbmcgZm4gb2YgYSBzaW5nbGUgZGlyZWN0aXZlXG4gKiAtIFwibm9kZUxpbmtGblwiIC0gZnVuY3Rpb24gdGhhdCBhZ2dyZWdhdGVzIGFsbCBsaW5raW5nIGZucyBmb3IgYSBwYXJ0aWN1bGFyIG5vZGVcbiAqIC0gXCJjaGlsZExpbmtGblwiIC0gIGZ1bmN0aW9uIHRoYXQgYWdncmVnYXRlcyBhbGwgbGlua2luZyBmbnMgZm9yIGNoaWxkIG5vZGVzIG9mIGEgcGFydGljdWxhciBub2RlXG4gKiAtIFwiY29tcG9zaXRlTGlua0ZuXCIgLSBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgYWxsIGxpbmtpbmcgZm5zIGZvciBhIGNvbXBpbGF0aW9uIHJvb3QgKG5vZGVMaXN0KVxuICovXG5cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJGNvbXBpbGVcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb21waWxlcyBhbiBIVE1MIHN0cmluZyBvciBET00gaW50byBhIHRlbXBsYXRlIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIGZ1bmN0aW9uLCB3aGljaFxuICogY2FuIHRoZW4gYmUgdXNlZCB0byBsaW5rIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIGBzY29wZWB9IGFuZCB0aGUgdGVtcGxhdGUgdG9nZXRoZXIuXG4gKlxuICogVGhlIGNvbXBpbGF0aW9uIGlzIGEgcHJvY2VzcyBvZiB3YWxraW5nIHRoZSBET00gdHJlZSBhbmQgbWF0Y2hpbmcgRE9NIGVsZW1lbnRzIHRvXG4gKiB7QGxpbmsgbmcuJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmUgZGlyZWN0aXZlc30uXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZToqKiBUaGlzIGRvY3VtZW50IGlzIGFuIGluLWRlcHRoIHJlZmVyZW5jZSBvZiBhbGwgZGlyZWN0aXZlIG9wdGlvbnMuXG4gKiBGb3IgYSBnZW50bGUgaW50cm9kdWN0aW9uIHRvIGRpcmVjdGl2ZXMgd2l0aCBleGFtcGxlcyBvZiBjb21tb24gdXNlIGNhc2VzLFxuICogc2VlIHRoZSB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlIGRpcmVjdGl2ZSBndWlkZX0uXG4gKiA8L2Rpdj5cbiAqXG4gKiAjIyBDb21wcmVoZW5zaXZlIERpcmVjdGl2ZSBBUElcbiAqXG4gKiBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgb3B0aW9ucyBmb3IgYSBkaXJlY3RpdmUuXG4gKlxuICogVGhlIGRpZmZlcmVuY2UgcmVzaWRlcyBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICogWW91IGNhbiBlaXRoZXIgcmV0dXJuIGEge0BsaW5rICRjb21waWxlI2RpcmVjdGl2ZS1kZWZpbml0aW9uLW9iamVjdCBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3QgKHNlZSBiZWxvdyl9XG4gKiB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzLCBvciBqdXN0IHRoZSBgcG9zdExpbmtgIGZ1bmN0aW9uIChhbGwgb3RoZXIgcHJvcGVydGllcyB3aWxsIGhhdmVcbiAqIHRoZSBkZWZhdWx0IHZhbHVlcykuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAqICoqQmVzdCBQcmFjdGljZToqKiBJdCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgXCJkaXJlY3RpdmUgZGVmaW5pdGlvbiBvYmplY3RcIiBmb3JtLlxuICogPC9kaXY+XG4gKlxuICogSGVyZSdzIGFuIGV4YW1wbGUgZGlyZWN0aXZlIGRlY2xhcmVkIHdpdGggYSBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3Q6XG4gKlxuICogYGBganNcbiAqICAgdmFyIG15TW9kdWxlID0gYW5ndWxhci5tb2R1bGUoLi4uKTtcbiAqXG4gKiAgIG15TW9kdWxlLmRpcmVjdGl2ZSgnZGlyZWN0aXZlTmFtZScsIGZ1bmN0aW9uIGZhY3RvcnkoaW5qZWN0YWJsZXMpIHtcbiAqICAgICB2YXIgZGlyZWN0aXZlRGVmaW5pdGlvbk9iamVjdCA9IHtcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtcHJpb3JpdHktIHByaW9yaXR5fTogMCxcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtdGVtcGxhdGUtIHRlbXBsYXRlfTogJzxkaXY+PC9kaXY+JywgLy8gb3IgLy8gZnVuY3Rpb24odEVsZW1lbnQsIHRBdHRycykgeyAuLi4gfSxcbiAqICAgICAgIC8vIG9yXG4gKiAgICAgICAvLyB7QGxpbmsgJGNvbXBpbGUjLXRlbXBsYXRldXJsLSB0ZW1wbGF0ZVVybH06ICdkaXJlY3RpdmUuaHRtbCcsIC8vIG9yIC8vIGZ1bmN0aW9uKHRFbGVtZW50LCB0QXR0cnMpIHsgLi4uIH0sXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLXRyYW5zY2x1ZGUtIHRyYW5zY2x1ZGV9OiBmYWxzZSxcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtcmVzdHJpY3QtIHJlc3RyaWN0fTogJ0EnLFxuICogICAgICAge0BsaW5rICRjb21waWxlIy10ZW1wbGF0ZW5hbWVzcGFjZS0gdGVtcGxhdGVOYW1lc3BhY2V9OiAnaHRtbCcsXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLXNjb3BlLSBzY29wZX06IGZhbHNlLFxuICogICAgICAge0BsaW5rICRjb21waWxlIy1jb250cm9sbGVyLSBjb250cm9sbGVyfTogZnVuY3Rpb24oJHNjb3BlLCAkZWxlbWVudCwgJGF0dHJzLCAkdHJhbnNjbHVkZSwgb3RoZXJJbmplY3RhYmxlcykgeyAuLi4gfSxcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtY29udHJvbGxlcmFzLSBjb250cm9sbGVyQXN9OiAnc3RyaW5nSWRlbnRpZmllcicsXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLWJpbmR0b2NvbnRyb2xsZXItIGJpbmRUb0NvbnRyb2xsZXJ9OiBmYWxzZSxcbiAqICAgICAgIHtAbGluayAkY29tcGlsZSMtcmVxdWlyZS0gcmVxdWlyZX06ICdzaWJsaW5nRGlyZWN0aXZlTmFtZScsIC8vIG9yIC8vIFsnXnBhcmVudERpcmVjdGl2ZU5hbWUnLCAnP29wdGlvbmFsRGlyZWN0aXZlTmFtZScsICc/Xm9wdGlvbmFsUGFyZW50J10sXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLW11bHRpZWxlbWVudC0gbXVsdGlFbGVtZW50fTogZmFsc2UsXG4gKiAgICAgICB7QGxpbmsgJGNvbXBpbGUjLWNvbXBpbGUtIGNvbXBpbGV9OiBmdW5jdGlvbiBjb21waWxlKHRFbGVtZW50LCB0QXR0cnMsIHRyYW5zY2x1ZGUpIHtcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICAge0BsaW5rICRjb21waWxlI3ByZS1saW5raW5nLWZ1bmN0aW9uIHByZX06IGZ1bmN0aW9uIHByZUxpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMsIGNvbnRyb2xsZXIpIHsgLi4uIH0sXG4gKiAgICAgICAgICAgIHtAbGluayAkY29tcGlsZSNwb3N0LWxpbmtpbmctZnVuY3Rpb24gcG9zdH06IGZ1bmN0aW9uIHBvc3RMaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyKSB7IC4uLiB9XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgLy8gb3JcbiAqICAgICAgICAgLy8gcmV0dXJuIGZ1bmN0aW9uIHBvc3RMaW5rKCAuLi4gKSB7IC4uLiB9XG4gKiAgICAgICB9LFxuICogICAgICAgLy8gb3JcbiAqICAgICAgIC8vIHtAbGluayAkY29tcGlsZSMtbGluay0gbGlua306IHtcbiAqICAgICAgIC8vICB7QGxpbmsgJGNvbXBpbGUjcHJlLWxpbmtpbmctZnVuY3Rpb24gcHJlfTogZnVuY3Rpb24gcHJlTGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfSxcbiAqICAgICAgIC8vICB7QGxpbmsgJGNvbXBpbGUjcG9zdC1saW5raW5nLWZ1bmN0aW9uIHBvc3R9OiBmdW5jdGlvbiBwb3N0TGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycywgY29udHJvbGxlcikgeyAuLi4gfVxuICogICAgICAgLy8gfVxuICogICAgICAgLy8gb3JcbiAqICAgICAgIC8vIHtAbGluayAkY29tcGlsZSMtbGluay0gbGlua306IGZ1bmN0aW9uIHBvc3RMaW5rKCAuLi4gKSB7IC4uLiB9XG4gKiAgICAgfTtcbiAqICAgICByZXR1cm4gZGlyZWN0aXZlRGVmaW5pdGlvbk9iamVjdDtcbiAqICAgfSk7XG4gKiBgYGBcbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIEFueSB1bnNwZWNpZmllZCBvcHRpb25zIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIHNlZSB0aGUgZGVmYXVsdCB2YWx1ZXMgYmVsb3cuXG4gKiA8L2Rpdj5cbiAqXG4gKiBUaGVyZWZvcmUgdGhlIGFib3ZlIGNhbiBiZSBzaW1wbGlmaWVkIGFzOlxuICpcbiAqIGBgYGpzXG4gKiAgIHZhciBteU1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKC4uLik7XG4gKlxuICogICBteU1vZHVsZS5kaXJlY3RpdmUoJ2RpcmVjdGl2ZU5hbWUnLCBmdW5jdGlvbiBmYWN0b3J5KGluamVjdGFibGVzKSB7XG4gKiAgICAgdmFyIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3QgPSB7XG4gKiAgICAgICBsaW5rOiBmdW5jdGlvbiBwb3N0TGluayhzY29wZSwgaUVsZW1lbnQsIGlBdHRycykgeyAuLi4gfVxuICogICAgIH07XG4gKiAgICAgcmV0dXJuIGRpcmVjdGl2ZURlZmluaXRpb25PYmplY3Q7XG4gKiAgICAgLy8gb3JcbiAqICAgICAvLyByZXR1cm4gZnVuY3Rpb24gcG9zdExpbmsoc2NvcGUsIGlFbGVtZW50LCBpQXR0cnMpIHsgLi4uIH1cbiAqICAgfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgTGlmZS1jeWNsZSBob29rc1xuICogRGlyZWN0aXZlIGNvbnRyb2xsZXJzIGNhbiBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgQW5ndWxhciBhdCBwb2ludHMgaW4gdGhlIGxpZmUtY3ljbGUgb2YgdGhlXG4gKiBkaXJlY3RpdmU6XG4gKiAqIGAkb25Jbml0KClgIC0gQ2FsbGVkIG9uIGVhY2ggY29udHJvbGxlciBhZnRlciBhbGwgdGhlIGNvbnRyb2xsZXJzIG9uIGFuIGVsZW1lbnQgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIGFuZFxuICogICBoYWQgdGhlaXIgYmluZGluZ3MgaW5pdGlhbGl6ZWQgKGFuZCBiZWZvcmUgdGhlIHByZSAmYW1wOyBwb3N0IGxpbmtpbmcgZnVuY3Rpb25zIGZvciB0aGUgZGlyZWN0aXZlcyBvblxuICogICB0aGlzIGVsZW1lbnQpLiBUaGlzIGlzIGEgZ29vZCBwbGFjZSB0byBwdXQgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgeW91ciBjb250cm9sbGVyLlxuICogKiBgJG9uQ2hhbmdlcyhjaGFuZ2VzT2JqKWAgLSBDYWxsZWQgd2hlbmV2ZXIgb25lLXdheSAoYDxgKSBvciBpbnRlcnBvbGF0aW9uIChgQGApIGJpbmRpbmdzIGFyZSB1cGRhdGVkLiBUaGVcbiAqICAgYGNoYW5nZXNPYmpgIGlzIGEgaGFzaCB3aG9zZSBrZXlzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGJvdW5kIHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgdmFsdWVzIGFyZSBhblxuICogICBvYmplY3Qgb2YgdGhlIGZvcm0gYHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBpc0ZpcnN0Q2hhbmdlKCkgfWAuIFVzZSB0aGlzIGhvb2sgdG8gdHJpZ2dlciB1cGRhdGVzIHdpdGhpbiBhXG4gKiAgIGNvbXBvbmVudCBzdWNoIGFzIGNsb25pbmcgdGhlIGJvdW5kIHZhbHVlIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBtdXRhdGlvbiBvZiB0aGUgb3V0ZXIgdmFsdWUuXG4gKiAqIGAkZG9DaGVjaygpYCAtIENhbGxlZCBvbiBlYWNoIHR1cm4gb2YgdGhlIGRpZ2VzdCBjeWNsZS4gUHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gZGV0ZWN0IGFuZCBhY3Qgb25cbiAqICAgY2hhbmdlcy4gQW55IGFjdGlvbnMgdGhhdCB5b3Ugd2lzaCB0byB0YWtlIGluIHJlc3BvbnNlIHRvIHRoZSBjaGFuZ2VzIHRoYXQgeW91IGRldGVjdCBtdXN0IGJlXG4gKiAgIGludm9rZWQgZnJvbSB0aGlzIGhvb2s7IGltcGxlbWVudGluZyB0aGlzIGhhcyBubyBlZmZlY3Qgb24gd2hlbiBgJG9uQ2hhbmdlc2AgaXMgY2FsbGVkLiBGb3IgZXhhbXBsZSwgdGhpcyBob29rXG4gKiAgIGNvdWxkIGJlIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byBwZXJmb3JtIGEgZGVlcCBlcXVhbGl0eSBjaGVjaywgb3IgdG8gY2hlY2sgYSBEYXRlIG9iamVjdCwgY2hhbmdlcyB0byB3aGljaCB3b3VsZCBub3RcbiAqICAgYmUgZGV0ZWN0ZWQgYnkgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3RvciBhbmQgdGh1cyBub3QgdHJpZ2dlciBgJG9uQ2hhbmdlc2AuIFRoaXMgaG9vayBpcyBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzO1xuICogICBpZiBkZXRlY3RpbmcgY2hhbmdlcywgeW91IG11c3Qgc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlKHMpIGZvciBjb21wYXJpc29uIHRvIHRoZSBjdXJyZW50IHZhbHVlcy5cbiAqICogYCRvbkRlc3Ryb3koKWAgLSBDYWxsZWQgb24gYSBjb250cm9sbGVyIHdoZW4gaXRzIGNvbnRhaW5pbmcgc2NvcGUgaXMgZGVzdHJveWVkLiBVc2UgdGhpcyBob29rIGZvciByZWxlYXNpbmdcbiAqICAgZXh0ZXJuYWwgcmVzb3VyY2VzLCB3YXRjaGVzIGFuZCBldmVudCBoYW5kbGVycy4gTm90ZSB0aGF0IGNvbXBvbmVudHMgaGF2ZSB0aGVpciBgJG9uRGVzdHJveSgpYCBob29rcyBjYWxsZWQgaW5cbiAqICAgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGAkc2NvcGUuJGJyb2FkY2FzdGAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQsIHdoaWNoIGlzIHRvcCBkb3duLiBUaGlzIG1lYW5zIHRoYXQgcGFyZW50XG4gKiAgIGNvbXBvbmVudHMgd2lsbCBoYXZlIHRoZWlyIGAkb25EZXN0cm95KClgIGhvb2sgY2FsbGVkIGJlZm9yZSBjaGlsZCBjb21wb25lbnRzLlxuICogKiBgJHBvc3RMaW5rKClgIC0gQ2FsbGVkIGFmdGVyIHRoaXMgY29udHJvbGxlcidzIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gbGlua2VkLiBTaW1pbGFyIHRvIHRoZSBwb3N0LWxpbmtcbiAqICAgZnVuY3Rpb24gdGhpcyBob29rIGNhbiBiZSB1c2VkIHRvIHNldCB1cCBET00gZXZlbnQgaGFuZGxlcnMgYW5kIGRvIGRpcmVjdCBET00gbWFuaXB1bGF0aW9uLlxuICogICBOb3RlIHRoYXQgY2hpbGQgZWxlbWVudHMgdGhhdCBjb250YWluIGB0ZW1wbGF0ZVVybGAgZGlyZWN0aXZlcyB3aWxsIG5vdCBoYXZlIGJlZW4gY29tcGlsZWQgYW5kIGxpbmtlZCBzaW5jZVxuICogICB0aGV5IGFyZSB3YWl0aW5nIGZvciB0aGVpciB0ZW1wbGF0ZSB0byBsb2FkIGFzeW5jaHJvbm91c2x5IGFuZCB0aGVpciBvd24gY29tcGlsYXRpb24gYW5kIGxpbmtpbmcgaGFzIGJlZW5cbiAqICAgc3VzcGVuZGVkIHVudGlsIHRoYXQgb2NjdXJzLlxuICpcbiAqICMjIyMgQ29tcGFyaXNvbiB3aXRoIEFuZ3VsYXIgMiBsaWZlLWN5Y2xlIGhvb2tzXG4gKiBBbmd1bGFyIDIgYWxzbyB1c2VzIGxpZmUtY3ljbGUgaG9va3MgZm9yIGl0cyBjb21wb25lbnRzLiBXaGlsZSB0aGUgQW5ndWxhciAxIGxpZmUtY3ljbGUgaG9va3MgYXJlIHNpbWlsYXIgdGhlcmUgYXJlXG4gKiBzb21lIGRpZmZlcmVuY2VzIHRoYXQgeW91IHNob3VsZCBiZSBhd2FyZSBvZiwgZXNwZWNpYWxseSB3aGVuIGl0IGNvbWVzIHRvIG1vdmluZyB5b3VyIGNvZGUgZnJvbSBBbmd1bGFyIDEgdG8gQW5ndWxhciAyOlxuICpcbiAqICogQW5ndWxhciAxIGhvb2tzIGFyZSBwcmVmaXhlZCB3aXRoIGAkYCwgc3VjaCBhcyBgJG9uSW5pdGAuIEFuZ3VsYXIgMiBob29rcyBhcmUgcHJlZml4ZWQgd2l0aCBgbmdgLCBzdWNoIGFzIGBuZ09uSW5pdGAuXG4gKiAqIEFuZ3VsYXIgMSBob29rcyBjYW4gYmUgZGVmaW5lZCBvbiB0aGUgY29udHJvbGxlciBwcm90b3R5cGUgb3IgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgaW5zaWRlIGl0cyBjb25zdHJ1Y3Rvci5cbiAqICAgSW4gQW5ndWxhciAyIHlvdSBjYW4gb25seSBkZWZpbmUgaG9va3Mgb24gdGhlIHByb3RvdHlwZSBvZiB0aGUgQ29tcG9uZW50IGNsYXNzLlxuICogKiBEdWUgdG8gdGhlIGRpZmZlcmVuY2VzIGluIGNoYW5nZS1kZXRlY3Rpb24sIHlvdSBtYXkgZ2V0IG1hbnkgbW9yZSBjYWxscyB0byBgJGRvQ2hlY2tgIGluIEFuZ3VsYXIgMSB0aGFuIHlvdSB3b3VsZCB0b1xuICogICBgbmdEb0NoZWNrYCBpbiBBbmd1bGFyIDJcbiAqICogQ2hhbmdlcyB0byB0aGUgbW9kZWwgaW5zaWRlIGAkZG9DaGVja2Agd2lsbCB0cmlnZ2VyIG5ldyB0dXJucyBvZiB0aGUgZGlnZXN0IGxvb3AsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGNoYW5nZXMgdG8gYmVcbiAqICAgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqICAgQW5ndWxhciAyIGRvZXMgbm90IGFsbG93IHRoZSBgbmdEb0NoZWNrYCBob29rIHRvIHRyaWdnZXIgYSBjaGFuZ2Ugb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50LiBJdCB3aWxsIGVpdGhlciB0aHJvdyBhblxuICogICBlcnJvciBvciBkbyBub3RoaW5nIGRlcGVuZGluZyB1cG9uIHRoZSBzdGF0ZSBvZiBgZW5hYmxlUHJvZE1vZGUoKWAuXG4gKlxuICogIyMjIyBMaWZlLWN5Y2xlIGhvb2sgZXhhbXBsZXNcbiAqXG4gKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBjYW4gY2hlY2sgZm9yIG11dGF0aW9ucyB0byBhIERhdGUgb2JqZWN0IGV2ZW4gdGhvdWdoIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0XG4gKiBoYXMgbm90IGNoYW5nZWQuXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cImRvQ2hlY2tEYXRlRXhhbXBsZVwiIG1vZHVsZT1cImRvLWNoZWNrLW1vZHVsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgICAgYW5ndWxhci5tb2R1bGUoJ2RvLWNoZWNrLW1vZHVsZScsIFtdKVxuICogICAgICAgLmNvbXBvbmVudCgnYXBwJywge1xuICogICAgICAgICB0ZW1wbGF0ZTpcbiAqICAgICAgICAgICAnTW9udGg6IDxpbnB1dCBuZy1tb2RlbD1cIiRjdHJsLm1vbnRoXCIgbmctY2hhbmdlPVwiJGN0cmwudXBkYXRlRGF0ZSgpXCI+JyArXG4gKiAgICAgICAgICAgJ0RhdGU6IHt7ICRjdHJsLmRhdGUgfX0nICtcbiAqICAgICAgICAgICAnPHRlc3QgZGF0ZT1cIiRjdHJsLmRhdGVcIj48L3Rlc3Q+JyxcbiAqICAgICAgICAgY29udHJvbGxlcjogZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUoKTtcbiAqICAgICAgICAgICB0aGlzLm1vbnRoID0gdGhpcy5kYXRlLmdldE1vbnRoKCk7XG4gKiAgICAgICAgICAgdGhpcy51cGRhdGVEYXRlID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgICB0aGlzLmRhdGUuc2V0TW9udGgodGhpcy5tb250aCk7XG4gKiAgICAgICAgICAgfTtcbiAqICAgICAgICAgfVxuICogICAgICAgfSlcbiAqICAgICAgIC5jb21wb25lbnQoJ3Rlc3QnLCB7XG4gKiAgICAgICAgIGJpbmRpbmdzOiB7IGRhdGU6ICc8JyB9LFxuICogICAgICAgICB0ZW1wbGF0ZTpcbiAqICAgICAgICAgICAnPHByZT57eyAkY3RybC5sb2cgfCBqc29uIH19PC9wcmU+JyxcbiAqICAgICAgICAgY29udHJvbGxlcjogZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgdmFyIHByZXZpb3VzVmFsdWU7XG4gKiAgICAgICAgICAgdGhpcy5sb2cgPSBbXTtcbiAqICAgICAgICAgICB0aGlzLiRkb0NoZWNrID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGhpcy5kYXRlICYmIHRoaXMuZGF0ZS52YWx1ZU9mKCk7XG4gKiAgICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZSAhPT0gY3VycmVudFZhbHVlKSB7XG4gKiAgICAgICAgICAgICAgIHRoaXMubG9nLnB1c2goJ2RvQ2hlY2s6IGRhdGUgbXV0YXRlZDogJyArIHRoaXMuZGF0ZSk7XG4gKiAgICAgICAgICAgICAgIHByZXZpb3VzVmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgfTtcbiAqICAgICAgICAgfVxuICogICAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8YXBwPjwvYXBwPlxuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogVGhpcyBleGFtcGxlIHNob3cgaG93IHlvdSBtaWdodCB1c2UgYCRkb0NoZWNrYCB0byB0cmlnZ2VyIGNoYW5nZXMgaW4geW91ciBjb21wb25lbnQncyBpbnB1dHMgZXZlbiBpZiB0aGVcbiAqIGFjdHVhbCBpZGVudGl0eSBvZiB0aGUgY29tcG9uZW50IGRvZXNuJ3QgY2hhbmdlLiAoQmUgYXdhcmUgdGhhdCBjbG9uaW5nIGFuZCBkZWVwIGVxdWFsaXR5IGNoZWNrcyBvbiBsYXJnZVxuICogYXJyYXlzIG9yIG9iamVjdHMgY2FuIGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24geW91ciBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSlcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwiZG9DaGVja0FycmF5RXhhbXBsZVwiIG1vZHVsZT1cImRvLWNoZWNrLW1vZHVsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgIDxkaXYgbmctaW5pdD1cIml0ZW1zID0gW11cIj5cbiAqICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJpdGVtcy5wdXNoKGl0ZW1zLmxlbmd0aClcIj5BZGQgSXRlbTwvYnV0dG9uPlxuICogICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cIml0ZW1zID0gW11cIj5SZXNldCBJdGVtczwvYnV0dG9uPlxuICogICAgICAgPHByZT57eyBpdGVtcyB9fTwvcHJlPlxuICogICAgICAgPHRlc3QgaXRlbXM9XCJpdGVtc1wiPjwvdGVzdD5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgICAgIGFuZ3VsYXIubW9kdWxlKCdkby1jaGVjay1tb2R1bGUnLCBbXSlcbiAqICAgICAgICAuY29tcG9uZW50KCd0ZXN0Jywge1xuICogICAgICAgICAgYmluZGluZ3M6IHsgaXRlbXM6ICc8JyB9LFxuICogICAgICAgICAgdGVtcGxhdGU6XG4gKiAgICAgICAgICAgICc8cHJlPnt7ICRjdHJsLmxvZyB8IGpzb24gfX08L3ByZT4nLFxuICogICAgICAgICAgY29udHJvbGxlcjogZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgIHRoaXMubG9nID0gW107XG4gKlxuICogICAgICAgICAgICB0aGlzLiRkb0NoZWNrID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNfcmVmICE9PSB0aGlzLml0ZW1zKSB7XG4gKiAgICAgICAgICAgICAgICB0aGlzLmxvZy5wdXNoKCdkb0NoZWNrOiBpdGVtcyBjaGFuZ2VkJyk7XG4gKiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zX3JlZiA9IHRoaXMuaXRlbXM7XG4gKiAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgIGlmICghYW5ndWxhci5lcXVhbHModGhpcy5pdGVtc19jbG9uZSwgdGhpcy5pdGVtcykpIHtcbiAqICAgICAgICAgICAgICAgIHRoaXMubG9nLnB1c2goJ2RvQ2hlY2s6IGl0ZW1zIG11dGF0ZWQnKTtcbiAqICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNfY2xvbmUgPSBhbmd1bGFyLmNvcHkodGhpcy5pdGVtcyk7XG4gKiAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICB9O1xuICogICAgICAgICAgfVxuICogICAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICpcbiAqICMjIyBEaXJlY3RpdmUgRGVmaW5pdGlvbiBPYmplY3RcbiAqXG4gKiBUaGUgZGlyZWN0aXZlIGRlZmluaXRpb24gb2JqZWN0IHByb3ZpZGVzIGluc3RydWN0aW9ucyB0byB0aGUge0BsaW5rIG5nLiRjb21waWxlXG4gKiBjb21waWxlcn0uIFRoZSBhdHRyaWJ1dGVzIGFyZTpcbiAqXG4gKiAjIyMjIGBtdWx0aUVsZW1lbnRgXG4gKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUgKGRlZmF1bHQgaXMgYGZhbHNlYCksIHRoZSBIVE1MIGNvbXBpbGVyIHdpbGwgY29sbGVjdCBET00gbm9kZXMgYmV0d2VlblxuICogbm9kZXMgd2l0aCB0aGUgYXR0cmlidXRlcyBgZGlyZWN0aXZlLW5hbWUtc3RhcnRgIGFuZCBgZGlyZWN0aXZlLW5hbWUtZW5kYCwgYW5kIGdyb3VwIHRoZW1cbiAqIHRvZ2V0aGVyIGFzIHRoZSBkaXJlY3RpdmUgZWxlbWVudHMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBmZWF0dXJlIGJlIHVzZWQgb24gZGlyZWN0aXZlc1xuICogd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBiZWhhdmlvcmFsIChzdWNoIGFzIHtAbGluayBuZ0NsaWNrfSksIGFuZCB3aGljaFxuICogZG8gbm90IG1hbmlwdWxhdGUgb3IgcmVwbGFjZSBjaGlsZCBub2RlcyAoc3VjaCBhcyB7QGxpbmsgbmdJbmNsdWRlfSkuXG4gKlxuICogIyMjIyBgcHJpb3JpdHlgXG4gKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXJlY3RpdmVzIGRlZmluZWQgb24gYSBzaW5nbGUgRE9NIGVsZW1lbnQsIHNvbWV0aW1lcyBpdFxuICogaXMgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXJlY3RpdmVzIGFyZSBhcHBsaWVkLiBUaGUgYHByaW9yaXR5YCBpcyB1c2VkXG4gKiB0byBzb3J0IHRoZSBkaXJlY3RpdmVzIGJlZm9yZSB0aGVpciBgY29tcGlsZWAgZnVuY3Rpb25zIGdldCBjYWxsZWQuIFByaW9yaXR5IGlzIGRlZmluZWQgYXMgYVxuICogbnVtYmVyLiBEaXJlY3RpdmVzIHdpdGggZ3JlYXRlciBudW1lcmljYWwgYHByaW9yaXR5YCBhcmUgY29tcGlsZWQgZmlyc3QuIFByZS1saW5rIGZ1bmN0aW9uc1xuICogYXJlIGFsc28gcnVuIGluIHByaW9yaXR5IG9yZGVyLCBidXQgcG9zdC1saW5rIGZ1bmN0aW9ucyBhcmUgcnVuIGluIHJldmVyc2Ugb3JkZXIuIFRoZSBvcmRlclxuICogb2YgZGlyZWN0aXZlcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5IGlzIHVuZGVmaW5lZC4gVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgYDBgLlxuICpcbiAqICMjIyMgYHRlcm1pbmFsYFxuICogSWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgY3VycmVudCBgcHJpb3JpdHlgIHdpbGwgYmUgdGhlIGxhc3Qgc2V0IG9mIGRpcmVjdGl2ZXNcbiAqIHdoaWNoIHdpbGwgZXhlY3V0ZSAoYW55IGRpcmVjdGl2ZXMgYXQgdGhlIGN1cnJlbnQgcHJpb3JpdHkgd2lsbCBzdGlsbCBleGVjdXRlXG4gKiBhcyB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uIG9uIHNhbWUgYHByaW9yaXR5YCBpcyB1bmRlZmluZWQpLiBOb3RlIHRoYXQgZXhwcmVzc2lvbnNcbiAqIGFuZCBvdGhlciBkaXJlY3RpdmVzIHVzZWQgaW4gdGhlIGRpcmVjdGl2ZSdzIHRlbXBsYXRlIHdpbGwgYWxzbyBiZSBleGNsdWRlZCBmcm9tIGV4ZWN1dGlvbi5cbiAqXG4gKiAjIyMjIGBzY29wZWBcbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBjYW4gYmUgYGZhbHNlYCwgYHRydWVgLCBvciBhbiBvYmplY3Q6XG4gKlxuICogKiAqKmBmYWxzZWAgKGRlZmF1bHQpOioqIE5vIHNjb3BlIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIGRpcmVjdGl2ZS4gVGhlIGRpcmVjdGl2ZSB3aWxsIHVzZSBpdHNcbiAqIHBhcmVudCdzIHNjb3BlLlxuICpcbiAqICogKipgdHJ1ZWA6KiogQSBuZXcgY2hpbGQgc2NvcGUgdGhhdCBwcm90b3R5cGljYWxseSBpbmhlcml0cyBmcm9tIGl0cyBwYXJlbnQgd2lsbCBiZSBjcmVhdGVkIGZvclxuICogdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuIElmIG11bHRpcGxlIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgZWxlbWVudCByZXF1ZXN0IGEgbmV3IHNjb3BlLFxuICogb25seSBvbmUgbmV3IHNjb3BlIGlzIGNyZWF0ZWQuXG4gKlxuICogKiAqKmB7Li4ufWAgKGFuIG9iamVjdCBoYXNoKToqKiBBIG5ldyBcImlzb2xhdGVcIiBzY29wZSBpcyBjcmVhdGVkIGZvciB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudC4gVGhlXG4gKiAnaXNvbGF0ZScgc2NvcGUgZGlmZmVycyBmcm9tIG5vcm1hbCBzY29wZSBpbiB0aGF0IGl0IGRvZXMgbm90IHByb3RvdHlwaWNhbGx5IGluaGVyaXQgZnJvbSBpdHMgcGFyZW50XG4gKiBzY29wZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBjcmVhdGluZyByZXVzYWJsZSBjb21wb25lbnRzLCB3aGljaCBzaG91bGQgbm90IGFjY2lkZW50YWxseSByZWFkIG9yIG1vZGlmeVxuICogZGF0YSBpbiB0aGUgcGFyZW50IHNjb3BlLlxuICpcbiAqIFRoZSAnaXNvbGF0ZScgc2NvcGUgb2JqZWN0IGhhc2ggZGVmaW5lcyBhIHNldCBvZiBsb2NhbCBzY29wZSBwcm9wZXJ0aWVzIGRlcml2ZWQgZnJvbSBhdHRyaWJ1dGVzIG9uIHRoZVxuICogZGlyZWN0aXZlJ3MgZWxlbWVudC4gVGhlc2UgbG9jYWwgcHJvcGVydGllcyBhcmUgdXNlZnVsIGZvciBhbGlhc2luZyB2YWx1ZXMgZm9yIHRlbXBsYXRlcy4gVGhlIGtleXMgaW5cbiAqIHRoZSBvYmplY3QgaGFzaCBtYXAgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9uIHRoZSBpc29sYXRlIHNjb3BlOyB0aGUgdmFsdWVzIGRlZmluZSBob3cgdGhlIHByb3BlcnR5XG4gKiBpcyBib3VuZCB0byB0aGUgcGFyZW50IHNjb3BlLCB2aWEgbWF0Y2hpbmcgYXR0cmlidXRlcyBvbiB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudDpcbiAqXG4gKiAqIGBAYCBvciBgQGF0dHJgIC0gYmluZCBhIGxvY2FsIHNjb3BlIHByb3BlcnR5IHRvIHRoZSB2YWx1ZSBvZiBET00gYXR0cmlidXRlLiBUaGUgcmVzdWx0IGlzXG4gKiAgIGFsd2F5cyBhIHN0cmluZyBzaW5jZSBET00gYXR0cmlidXRlcyBhcmUgc3RyaW5ncy4gSWYgbm8gYGF0dHJgIG5hbWUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlXG4gKiAgIGF0dHJpYnV0ZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGxvY2FsIG5hbWUuIEdpdmVuIGA8bXktY29tcG9uZW50XG4gKiAgIG15LWF0dHI9XCJoZWxsbyB7e25hbWV9fVwiPmAgYW5kIHRoZSBpc29sYXRlIHNjb3BlIGRlZmluaXRpb24gYHNjb3BlOiB7IGxvY2FsTmFtZTonQG15QXR0cicgfWAsXG4gKiAgIHRoZSBkaXJlY3RpdmUncyBzY29wZSBwcm9wZXJ0eSBgbG9jYWxOYW1lYCB3aWxsIHJlZmxlY3QgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBvZiBgaGVsbG9cbiAqICAge3tuYW1lfX1gLiBBcyB0aGUgYG5hbWVgIGF0dHJpYnV0ZSBjaGFuZ2VzIHNvIHdpbGwgdGhlIGBsb2NhbE5hbWVgIHByb3BlcnR5IG9uIHRoZSBkaXJlY3RpdmUnc1xuICogICBzY29wZS4gVGhlIGBuYW1lYCBpcyByZWFkIGZyb20gdGhlIHBhcmVudCBzY29wZSAobm90IHRoZSBkaXJlY3RpdmUncyBzY29wZSkuXG4gKlxuICogKiBgPWAgb3IgYD1hdHRyYCAtIHNldCB1cCBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgbG9jYWwgc2NvcGUgcHJvcGVydHkgYW5kIGFuIGV4cHJlc3Npb25cbiAqICAgcGFzc2VkIHZpYSB0aGUgYXR0cmlidXRlIGBhdHRyYC4gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgc2NvcGUuXG4gKiAgIElmIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbFxuICogICBuYW1lLiBHaXZlbiBgPG15LWNvbXBvbmVudCBteS1hdHRyPVwicGFyZW50TW9kZWxcIj5gIGFuZCB0aGUgaXNvbGF0ZSBzY29wZSBkZWZpbml0aW9uIGBzY29wZToge1xuICogICBsb2NhbE1vZGVsOiAnPW15QXR0cicgfWAsIHRoZSBwcm9wZXJ0eSBgbG9jYWxNb2RlbGAgb24gdGhlIGRpcmVjdGl2ZSdzIHNjb3BlIHdpbGwgcmVmbGVjdCB0aGVcbiAqICAgdmFsdWUgb2YgYHBhcmVudE1vZGVsYCBvbiB0aGUgcGFyZW50IHNjb3BlLiBDaGFuZ2VzIHRvIGBwYXJlbnRNb2RlbGAgd2lsbCBiZSByZWZsZWN0ZWQgaW5cbiAqICAgYGxvY2FsTW9kZWxgIGFuZCB2aWNlIHZlcnNhLiBPcHRpb25hbCBhdHRyaWJ1dGVzIHNob3VsZCBiZSBtYXJrZWQgYXMgc3VjaCB3aXRoIGEgcXVlc3Rpb24gbWFyazpcbiAqICAgYD0/YCBvciBgPT9hdHRyYC4gSWYgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBpcyBub24tYXNzaWduYWJsZSwgb3IgaWYgdGhlIGF0dHJpYnV0ZSBpc24ndFxuICogICBvcHRpb25hbCBhbmQgZG9lc24ndCBleGlzdCwgYW4gZXhjZXB0aW9uICh7QGxpbmsgZXJyb3IvJGNvbXBpbGUvbm9uYXNzaWduIGAkY29tcGlsZTpub25hc3NpZ25gfSlcbiAqICAgd2lsbCBiZSB0aHJvd24gdXBvbiBkaXNjb3ZlcmluZyBjaGFuZ2VzIHRvIHRoZSBsb2NhbCB2YWx1ZSwgc2luY2UgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIHN5bmNcbiAqICAgdGhlbSBiYWNrIHRvIHRoZSBwYXJlbnQgc2NvcGUuIEJ5IGRlZmF1bHQsIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggYCR3YXRjaGB9XG4gKiAgIG1ldGhvZCBpcyB1c2VkIGZvciB0cmFja2luZyBjaGFuZ2VzLCBhbmQgdGhlIGVxdWFsaXR5IGNoZWNrIGlzIGJhc2VkIG9uIG9iamVjdCBpZGVudGl0eS5cbiAqICAgSG93ZXZlciwgaWYgYW4gb2JqZWN0IGxpdGVyYWwgb3IgYW4gYXJyYXkgbGl0ZXJhbCBpcyBwYXNzZWQgYXMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiwgdGhlXG4gKiAgIGVxdWFsaXR5IGNoZWNrIGlzIGRvbmUgYnkgdmFsdWUgKHVzaW5nIHRoZSB7QGxpbmsgYW5ndWxhci5lcXVhbHN9IGZ1bmN0aW9uKS4gSXQncyBhbHNvIHBvc3NpYmxlXG4gKiAgIHRvIHdhdGNoIHRoZSBldmFsdWF0ZWQgdmFsdWUgc2hhbGxvd2x5IHdpdGgge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoQ29sbGVjdGlvblxuICogICBgJHdhdGNoQ29sbGVjdGlvbmB9OiB1c2UgYD0qYCBvciBgPSphdHRyYCAoYD0qP2Agb3IgYD0qP2F0dHJgIGlmIHRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwpLlxuICpcbiAgKiAqIGA8YCBvciBgPGF0dHJgIC0gc2V0IHVwIGEgb25lLXdheSAob25lLWRpcmVjdGlvbmFsKSBiaW5kaW5nIGJldHdlZW4gYSBsb2NhbCBzY29wZSBwcm9wZXJ0eSBhbmQgYW5cbiAqICAgZXhwcmVzc2lvbiBwYXNzZWQgdmlhIHRoZSBhdHRyaWJ1dGUgYGF0dHJgLiBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlXG4gKiAgIHBhcmVudCBzY29wZS4gSWYgbm8gYGF0dHJgIG5hbWUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlXG4gKiAgIGxvY2FsIG5hbWUuIFlvdSBjYW4gYWxzbyBtYWtlIHRoZSBiaW5kaW5nIG9wdGlvbmFsIGJ5IGFkZGluZyBgP2A6IGA8P2Agb3IgYDw/YXR0cmAuXG4gKlxuICogICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYDxteS1jb21wb25lbnQgbXktYXR0cj1cInBhcmVudE1vZGVsXCI+YCBhbmQgZGlyZWN0aXZlIGRlZmluaXRpb24gb2ZcbiAqICAgYHNjb3BlOiB7IGxvY2FsTW9kZWw6JzxteUF0dHInIH1gLCB0aGVuIHRoZSBpc29sYXRlZCBzY29wZSBwcm9wZXJ0eSBgbG9jYWxNb2RlbGAgd2lsbCByZWZsZWN0IHRoZVxuICogICB2YWx1ZSBvZiBgcGFyZW50TW9kZWxgIG9uIHRoZSBwYXJlbnQgc2NvcGUuIEFueSBjaGFuZ2VzIHRvIGBwYXJlbnRNb2RlbGAgd2lsbCBiZSByZWZsZWN0ZWRcbiAqICAgaW4gYGxvY2FsTW9kZWxgLCBidXQgY2hhbmdlcyBpbiBgbG9jYWxNb2RlbGAgd2lsbCBub3QgcmVmbGVjdCBpbiBgcGFyZW50TW9kZWxgLiBUaGVyZSBhcmUgaG93ZXZlclxuICogICB0d28gY2F2ZWF0czpcbiAqICAgICAxLiBvbmUtd2F5IGJpbmRpbmcgZG9lcyBub3QgY29weSB0aGUgdmFsdWUgZnJvbSB0aGUgcGFyZW50IHRvIHRoZSBpc29sYXRlIHNjb3BlLCBpdCBzaW1wbHlcbiAqICAgICBzZXRzIHRoZSBzYW1lIHZhbHVlLiBUaGF0IG1lYW5zIGlmIHlvdXIgYm91bmQgdmFsdWUgaXMgYW4gb2JqZWN0LCBjaGFuZ2VzIHRvIGl0cyBwcm9wZXJ0aWVzXG4gKiAgICAgaW4gdGhlIGlzb2xhdGVkIHNjb3BlIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBwYXJlbnQgc2NvcGUgKGJlY2F1c2UgYm90aCByZWZlcmVuY2UgdGhlIHNhbWUgb2JqZWN0KS5cbiAqICAgICAyLiBvbmUtd2F5IGJpbmRpbmcgd2F0Y2hlcyBjaGFuZ2VzIHRvIHRoZSAqKmlkZW50aXR5Kiogb2YgdGhlIHBhcmVudCB2YWx1ZS4gVGhhdCBtZWFucyB0aGVcbiAqICAgICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggYCR3YXRjaGB9IG9uIHRoZSBwYXJlbnQgdmFsdWUgb25seSBmaXJlcyBpZiB0aGUgcmVmZXJlbmNlXG4gKiAgICAgdG8gdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLiBJbiBtb3N0IGNhc2VzLCB0aGlzIHNob3VsZCBub3QgYmUgb2YgY29uY2VybiwgYnV0IGNhbiBiZSBpbXBvcnRhbnRcbiAqICAgICB0byBrbm93IGlmIHlvdSBvbmUtd2F5IGJpbmQgdG8gYW4gb2JqZWN0LCBhbmQgdGhlbiByZXBsYWNlIHRoYXQgb2JqZWN0IGluIHRoZSBpc29sYXRlZCBzY29wZS5cbiAqICAgICBJZiB5b3Ugbm93IGNoYW5nZSBhIHByb3BlcnR5IG9mIHRoZSBvYmplY3QgaW4geW91ciBwYXJlbnQgc2NvcGUsIHRoZSBjaGFuZ2Ugd2lsbCBub3QgYmVcbiAqICAgICBwcm9wYWdhdGVkIHRvIHRoZSBpc29sYXRlZCBzY29wZSwgYmVjYXVzZSB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdCBvbiB0aGUgcGFyZW50IHNjb3BlXG4gKiAgICAgaGFzIG5vdCBjaGFuZ2VkLiBJbnN0ZWFkIHlvdSBtdXN0IGFzc2lnbiBhIG5ldyBvYmplY3QuXG4gKlxuICogICBPbmUtd2F5IGJpbmRpbmcgaXMgdXNlZnVsIGlmIHlvdSBkbyBub3QgcGxhbiB0byBwcm9wYWdhdGUgY2hhbmdlcyB0byB5b3VyIGlzb2xhdGVkIHNjb3BlIGJpbmRpbmdzXG4gKiAgIGJhY2sgdG8gdGhlIHBhcmVudC4gSG93ZXZlciwgaXQgZG9lcyBub3QgbWFrZSB0aGlzIGNvbXBsZXRlbHkgaW1wb3NzaWJsZS5cbiAqXG4gKiAqIGAmYCBvciBgJmF0dHJgIC0gcHJvdmlkZXMgYSB3YXkgdG8gZXhlY3V0ZSBhbiBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgc2NvcGUuIElmXG4gKiAgIG5vIGBhdHRyYCBuYW1lIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lLlxuICogICBHaXZlbiBgPG15LWNvbXBvbmVudCBteS1hdHRyPVwiY291bnQgPSBjb3VudCArIHZhbHVlXCI+YCBhbmQgdGhlIGlzb2xhdGUgc2NvcGUgZGVmaW5pdGlvbiBgc2NvcGU6IHtcbiAqICAgbG9jYWxGbjonJm15QXR0cicgfWAsIHRoZSBpc29sYXRlIHNjb3BlIHByb3BlcnR5IGBsb2NhbEZuYCB3aWxsIHBvaW50IHRvIGEgZnVuY3Rpb24gd3JhcHBlciBmb3JcbiAqICAgdGhlIGBjb3VudCA9IGNvdW50ICsgdmFsdWVgIGV4cHJlc3Npb24uIE9mdGVuIGl0J3MgZGVzaXJhYmxlIHRvIHBhc3MgZGF0YSBmcm9tIHRoZSBpc29sYXRlZCBzY29wZVxuICogICB2aWEgYW4gZXhwcmVzc2lvbiB0byB0aGUgcGFyZW50IHNjb3BlLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHBhc3NpbmcgYSBtYXAgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXNcbiAqICAgYW5kIHZhbHVlcyBpbnRvIHRoZSBleHByZXNzaW9uIHdyYXBwZXIgZm4uIEZvciBleGFtcGxlLCBpZiB0aGUgZXhwcmVzc2lvbiBpcyBgaW5jcmVtZW50KGFtb3VudClgXG4gKiAgIHRoZW4gd2UgY2FuIHNwZWNpZnkgdGhlIGFtb3VudCB2YWx1ZSBieSBjYWxsaW5nIHRoZSBgbG9jYWxGbmAgYXMgYGxvY2FsRm4oe2Ftb3VudDogMjJ9KWAuXG4gKlxuICogSW4gZ2VuZXJhbCBpdCdzIHBvc3NpYmxlIHRvIGFwcGx5IG1vcmUgdGhhbiBvbmUgZGlyZWN0aXZlIHRvIG9uZSBlbGVtZW50LCBidXQgdGhlcmUgbWlnaHQgYmUgbGltaXRhdGlvbnNcbiAqIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBzY29wZSByZXF1aXJlZCBieSB0aGUgZGlyZWN0aXZlcy4gVGhlIGZvbGxvd2luZyBwb2ludHMgd2lsbCBoZWxwIGV4cGxhaW4gdGhlc2UgbGltaXRhdGlvbnMuXG4gKiBGb3Igc2ltcGxpY2l0eSBvbmx5IHR3byBkaXJlY3RpdmVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQsIGJ1dCBpdCBpcyBhbHNvIGFwcGxpY2FibGUgZm9yIHNldmVyYWwgZGlyZWN0aXZlczpcbiAqXG4gKiAqICoqbm8gc2NvcGUqKiArICoqbm8gc2NvcGUqKiA9PiBUd28gZGlyZWN0aXZlcyB3aGljaCBkb24ndCByZXF1aXJlIHRoZWlyIG93biBzY29wZSB3aWxsIHVzZSB0aGVpciBwYXJlbnQncyBzY29wZVxuICogKiAqKmNoaWxkIHNjb3BlKiogKyAqKm5vIHNjb3BlKiogPT4gIEJvdGggZGlyZWN0aXZlcyB3aWxsIHNoYXJlIG9uZSBzaW5nbGUgY2hpbGQgc2NvcGVcbiAqICogKipjaGlsZCBzY29wZSoqICsgKipjaGlsZCBzY29wZSoqID0+ICBCb3RoIGRpcmVjdGl2ZXMgd2lsbCBzaGFyZSBvbmUgc2luZ2xlIGNoaWxkIHNjb3BlXG4gKiAqICoqaXNvbGF0ZWQgc2NvcGUqKiArICoqbm8gc2NvcGUqKiA9PiAgVGhlIGlzb2xhdGVkIGRpcmVjdGl2ZSB3aWxsIHVzZSBpdCdzIG93biBjcmVhdGVkIGlzb2xhdGVkIHNjb3BlLiBUaGUgb3RoZXIgZGlyZWN0aXZlIHdpbGwgdXNlXG4gKiBpdHMgcGFyZW50J3Mgc2NvcGVcbiAqICogKippc29sYXRlZCBzY29wZSoqICsgKipjaGlsZCBzY29wZSoqID0+ICAqKldvbid0IHdvcmshKiogT25seSBvbmUgc2NvcGUgY2FuIGJlIHJlbGF0ZWQgdG8gb25lIGVsZW1lbnQuIFRoZXJlZm9yZSB0aGVzZSBkaXJlY3RpdmVzIGNhbm5vdFxuICogYmUgYXBwbGllZCB0byB0aGUgc2FtZSBlbGVtZW50LlxuICogKiAqKmlzb2xhdGVkIHNjb3BlKiogKyAqKmlzb2xhdGVkIHNjb3BlKiogID0+ICAqKldvbid0IHdvcmshKiogT25seSBvbmUgc2NvcGUgY2FuIGJlIHJlbGF0ZWQgdG8gb25lIGVsZW1lbnQuIFRoZXJlZm9yZSB0aGVzZSBkaXJlY3RpdmVzXG4gKiBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUgc2FtZSBlbGVtZW50LlxuICpcbiAqXG4gKiAjIyMjIGBiaW5kVG9Db250cm9sbGVyYFxuICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGJpbmQgc2NvcGUgcHJvcGVydGllcyBkaXJlY3RseSB0byB0aGUgY29udHJvbGxlci4gSXQgY2FuIGJlIGVpdGhlclxuICogYHRydWVgIG9yIGFuIG9iamVjdCBoYXNoIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBgc2NvcGVgIHByb3BlcnR5LlxuICpcbiAqIFdoZW4gYW4gaXNvbGF0ZSBzY29wZSBpcyB1c2VkIGZvciBhIGRpcmVjdGl2ZSAoc2VlIGFib3ZlKSwgYGJpbmRUb0NvbnRyb2xsZXI6IHRydWVgIHdpbGxcbiAqIGFsbG93IGEgY29tcG9uZW50IHRvIGhhdmUgaXRzIHByb3BlcnRpZXMgYm91bmQgdG8gdGhlIGNvbnRyb2xsZXIsIHJhdGhlciB0aGFuIHRvIHNjb3BlLlxuICpcbiAqIEFmdGVyIHRoZSBjb250cm9sbGVyIGlzIGluc3RhbnRpYXRlZCwgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBpc29sYXRlIHNjb3BlIGJpbmRpbmdzIHdpbGwgYmUgYm91bmQgdG8gdGhlIGNvbnRyb2xsZXJcbiAqIHByb3BlcnRpZXMuIFlvdSBjYW4gYWNjZXNzIHRoZXNlIGJpbmRpbmdzIG9uY2UgdGhleSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYnkgcHJvdmlkaW5nIGEgY29udHJvbGxlciBtZXRob2QgY2FsbGVkXG4gKiBgJG9uSW5pdGAsIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGNvbnRyb2xsZXJzIG9uIGFuIGVsZW1lbnQgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIGFuZCBoYWQgdGhlaXIgYmluZGluZ3NcbiAqIGluaXRpYWxpemVkLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKkRlcHJlY2F0aW9uIHdhcm5pbmc6KiogYWx0aG91Z2ggYmluZGluZ3MgZm9yIG5vbi1FUzYgY2xhc3MgY29udHJvbGxlcnMgYXJlIGN1cnJlbnRseVxuICogYm91bmQgdG8gYHRoaXNgIGJlZm9yZSB0aGUgY29udHJvbGxlciBjb25zdHJ1Y3RvciBpcyBjYWxsZWQsIHRoaXMgdXNlIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgcGxhY2UgaW5pdGlhbGl6YXRpb25cbiAqIGNvZGUgdGhhdCByZWxpZXMgdXBvbiBiaW5kaW5ncyBpbnNpZGUgYSBgJG9uSW5pdGAgbWV0aG9kIG9uIHRoZSBjb250cm9sbGVyLCBpbnN0ZWFkLlxuICogPC9kaXY+XG4gKlxuICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZXQgYGJpbmRUb0NvbnRyb2xsZXJgIHRvIGFuIG9iamVjdCBoYXNoIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBgc2NvcGVgIHByb3BlcnR5LlxuICogVGhpcyB3aWxsIHNldCB1cCB0aGUgc2NvcGUgYmluZGluZ3MgdG8gdGhlIGNvbnRyb2xsZXIgZGlyZWN0bHkuIE5vdGUgdGhhdCBgc2NvcGVgIGNhbiBzdGlsbCBiZSB1c2VkXG4gKiB0byBkZWZpbmUgd2hpY2gga2luZCBvZiBzY29wZSBpcyBjcmVhdGVkLiBCeSBkZWZhdWx0LCBubyBzY29wZSBpcyBjcmVhdGVkLiBVc2UgYHNjb3BlOiB7fWAgdG8gY3JlYXRlIGFuIGlzb2xhdGVcbiAqIHNjb3BlICh1c2VmdWwgZm9yIGNvbXBvbmVudCBkaXJlY3RpdmVzKS5cbiAqXG4gKiBJZiBib3RoIGBiaW5kVG9Db250cm9sbGVyYCBhbmQgYHNjb3BlYCBhcmUgZGVmaW5lZCBhbmQgaGF2ZSBvYmplY3QgaGFzaGVzLCBgYmluZFRvQ29udHJvbGxlcmAgb3ZlcnJpZGVzIGBzY29wZWAuXG4gKlxuICpcbiAqICMjIyMgYGNvbnRyb2xsZXJgXG4gKiBDb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLiBUaGUgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQgYmVmb3JlIHRoZVxuICogcHJlLWxpbmtpbmcgcGhhc2UgYW5kIGNhbiBiZSBhY2Nlc3NlZCBieSBvdGhlciBkaXJlY3RpdmVzIChzZWVcbiAqIGByZXF1aXJlYCBhdHRyaWJ1dGUpLiBUaGlzIGFsbG93cyB0aGUgZGlyZWN0aXZlcyB0byBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgYW5kIGF1Z21lbnRcbiAqIGVhY2ggb3RoZXIncyBiZWhhdmlvci4gVGhlIGNvbnRyb2xsZXIgaXMgaW5qZWN0YWJsZSAoYW5kIHN1cHBvcnRzIGJyYWNrZXQgbm90YXRpb24pIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhbHM6XG4gKlxuICogKiBgJHNjb3BlYCAtIEN1cnJlbnQgc2NvcGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50XG4gKiAqIGAkZWxlbWVudGAgLSBDdXJyZW50IGVsZW1lbnRcbiAqICogYCRhdHRyc2AgLSBDdXJyZW50IGF0dHJpYnV0ZXMgb2JqZWN0IGZvciB0aGUgZWxlbWVudFxuICogKiBgJHRyYW5zY2x1ZGVgIC0gQSB0cmFuc2NsdWRlIGxpbmtpbmcgZnVuY3Rpb24gcHJlLWJvdW5kIHRvIHRoZSBjb3JyZWN0IHRyYW5zY2x1c2lvbiBzY29wZTpcbiAqICAgYGZ1bmN0aW9uKFtzY29wZV0sIGNsb25lTGlua2luZ0ZuLCBmdXR1cmVQYXJlbnRFbGVtZW50LCBzbG90TmFtZSlgOlxuICogICAgKiBgc2NvcGVgOiAob3B0aW9uYWwpIG92ZXJyaWRlIHRoZSBzY29wZS5cbiAqICAgICogYGNsb25lTGlua2luZ0ZuYDogKG9wdGlvbmFsKSBhcmd1bWVudCB0byBjcmVhdGUgY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0cmFuc2NsdWRlZCBjb250ZW50LlxuICogICAgKiBgZnV0dXJlUGFyZW50RWxlbWVudGAgKG9wdGlvbmFsKTpcbiAqICAgICAgICAqIGRlZmluZXMgdGhlIHBhcmVudCB0byB3aGljaCB0aGUgYGNsb25lTGlua2luZ0ZuYCB3aWxsIGFkZCB0aGUgY2xvbmVkIGVsZW1lbnRzLlxuICogICAgICAgICogZGVmYXVsdDogYCRlbGVtZW50LnBhcmVudCgpYCByZXNwLiBgJGVsZW1lbnRgIGZvciBgdHJhbnNjbHVkZTonZWxlbWVudCdgIHJlc3AuIGB0cmFuc2NsdWRlOnRydWVgLlxuICogICAgICAgICogb25seSBuZWVkZWQgZm9yIHRyYW5zY2x1ZGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbiBub24gaHRtbCBlbGVtZW50cyAoZS5nLiBTVkcgZWxlbWVudHMpXG4gKiAgICAgICAgICBhbmQgd2hlbiB0aGUgYGNsb25lTGlua2luZ0ZuYCBpcyBwYXNzZWQsXG4gKiAgICAgICAgICBhcyB0aG9zZSBlbGVtZW50cyBuZWVkIHRvIGNyZWF0ZWQgYW5kIGNsb25lZCBpbiBhIHNwZWNpYWwgd2F5IHdoZW4gdGhleSBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZWlyXG4gKiAgICAgICAgICB1c3VhbCBjb250YWluZXJzIChlLmcuIGxpa2UgYDxzdmc+YCkuXG4gKiAgICAgICAgKiBTZWUgYWxzbyB0aGUgYGRpcmVjdGl2ZS50ZW1wbGF0ZU5hbWVzcGFjZWAgcHJvcGVydHkuXG4gKiAgICAqIGBzbG90TmFtZWA6IChvcHRpb25hbCkgdGhlIG5hbWUgb2YgdGhlIHNsb3QgdG8gdHJhbnNjbHVkZS4gSWYgZmFsc3kgKGUuZy4gYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgJydgKVxuICogICAgICB0aGVuIHRoZSBkZWZhdWx0IHRyYW5zY2x1c2lvbiBpcyBwcm92aWRlZC5cbiAqICAgIFRoZSBgJHRyYW5zY2x1ZGVgIGZ1bmN0aW9uIGFsc28gaGFzIGEgbWV0aG9kIG9uIGl0LCBgJHRyYW5zY2x1ZGUuaXNTbG90RmlsbGVkKHNsb3ROYW1lKWAsIHdoaWNoIHJldHVybnNcbiAqICAgIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIHNsb3QgY29udGFpbnMgY29udGVudCAoaS5lLiBvbmUgb3IgbW9yZSBET00gbm9kZXMpLlxuICpcbiAqICMjIyMgYHJlcXVpcmVgXG4gKiBSZXF1aXJlIGFub3RoZXIgZGlyZWN0aXZlIGFuZCBpbmplY3QgaXRzIGNvbnRyb2xsZXIgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCB0byB0aGUgbGlua2luZyBmdW5jdGlvbi4gVGhlXG4gKiBgcmVxdWlyZWAgcHJvcGVydHkgY2FuIGJlIGEgc3RyaW5nLCBhbiBhcnJheSBvciBhbiBvYmplY3Q6XG4gKiAqIGEgKipzdHJpbmcqKiBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUgdG8gcGFzcyB0byB0aGUgbGlua2luZyBmdW5jdGlvblxuICogKiBhbiAqKmFycmF5KiogY29udGFpbmluZyB0aGUgbmFtZXMgb2YgZGlyZWN0aXZlcyB0byBwYXNzIHRvIHRoZSBsaW5raW5nIGZ1bmN0aW9uLiBUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoZVxuICogbGlua2luZyBmdW5jdGlvbiB3aWxsIGJlIGFuIGFycmF5IG9mIGNvbnRyb2xsZXJzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBuYW1lcyBpbiB0aGUgYHJlcXVpcmVgIHByb3BlcnR5XG4gKiAqIGFuICoqb2JqZWN0Kiogd2hvc2UgcHJvcGVydHkgdmFsdWVzIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdGl2ZXMgdG8gcGFzcyB0byB0aGUgbGlua2luZyBmdW5jdGlvbi4gVGhlIGFyZ3VtZW50XG4gKiBwYXNzZWQgdG8gdGhlIGxpbmtpbmcgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIGFuIG9iamVjdCB3aXRoIG1hdGNoaW5nIGtleXMsIHdob3NlIHZhbHVlcyB3aWxsIGhvbGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIGNvbnRyb2xsZXJzLlxuICpcbiAqIElmIHRoZSBgcmVxdWlyZWAgcHJvcGVydHkgaXMgYW4gb2JqZWN0IGFuZCBgYmluZFRvQ29udHJvbGxlcmAgaXMgdHJ1dGh5LCB0aGVuIHRoZSByZXF1aXJlZCBjb250cm9sbGVycyBhcmVcbiAqIGJvdW5kIHRvIHRoZSBjb250cm9sbGVyIHVzaW5nIHRoZSBrZXlzIG9mIHRoZSBgcmVxdWlyZWAgcHJvcGVydHkuIFRoaXMgYmluZGluZyBvY2N1cnMgYWZ0ZXIgYWxsIHRoZSBjb250cm9sbGVyc1xuICogaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIGJ1dCBiZWZvcmUgYCRvbkluaXRgIGlzIGNhbGxlZC5cbiAqIElmIHRoZSBuYW1lIG9mIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBsb2NhbCBuYW1lICh0aGUga2V5KSwgdGhlIG5hbWUgY2FuIGJlXG4gKiBvbWl0dGVkLiBGb3IgZXhhbXBsZSwgYHtwYXJlbnREaXI6ICdeXid9YCBpcyBlcXVpdmFsZW50IHRvIGB7cGFyZW50RGlyOiAnXl5wYXJlbnREaXInfWAuXG4gKiBTZWUgdGhlIHtAbGluayAkY29tcGlsZVByb3ZpZGVyI2NvbXBvbmVudH0gaGVscGVyIGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGlzIGNhbiBiZSB1c2VkLlxuICogSWYgbm8gc3VjaCByZXF1aXJlZCBkaXJlY3RpdmUocykgY2FuIGJlIGZvdW5kLCBvciBpZiB0aGUgZGlyZWN0aXZlIGRvZXMgbm90IGhhdmUgYSBjb250cm9sbGVyLCB0aGVuIGFuIGVycm9yIGlzXG4gKiByYWlzZWQgKHVubGVzcyBubyBsaW5rIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCBhbmQgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXJzIGFyZSBub3QgYmVpbmcgYm91bmQgdG8gdGhlIGRpcmVjdGl2ZVxuICogY29udHJvbGxlciwgaW4gd2hpY2ggY2FzZSBlcnJvciBjaGVja2luZyBpcyBza2lwcGVkKS4gVGhlIG5hbWUgY2FuIGJlIHByZWZpeGVkIHdpdGg6XG4gKlxuICogKiAobm8gcHJlZml4KSAtIExvY2F0ZSB0aGUgcmVxdWlyZWQgY29udHJvbGxlciBvbiB0aGUgY3VycmVudCBlbGVtZW50LiBUaHJvdyBhbiBlcnJvciBpZiBub3QgZm91bmQuXG4gKiAqIGA/YCAtIEF0dGVtcHQgdG8gbG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIG9yIHBhc3MgYG51bGxgIHRvIHRoZSBgbGlua2AgZm4gaWYgbm90IGZvdW5kLlxuICogKiBgXmAgLSBMb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50IGFuZCBpdHMgcGFyZW50cy4gVGhyb3cgYW4gZXJyb3IgaWYgbm90IGZvdW5kLlxuICogKiBgXl5gIC0gTG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIGJ5IHNlYXJjaGluZyB0aGUgZWxlbWVudCdzIHBhcmVudHMuIFRocm93IGFuIGVycm9yIGlmIG5vdCBmb3VuZC5cbiAqICogYD9eYCAtIEF0dGVtcHQgdG8gbG9jYXRlIHRoZSByZXF1aXJlZCBjb250cm9sbGVyIGJ5IHNlYXJjaGluZyB0aGUgZWxlbWVudCBhbmQgaXRzIHBhcmVudHMgb3IgcGFzc1xuICogICBgbnVsbGAgdG8gdGhlIGBsaW5rYCBmbiBpZiBub3QgZm91bmQuXG4gKiAqIGA/Xl5gIC0gQXR0ZW1wdCB0byBsb2NhdGUgdGhlIHJlcXVpcmVkIGNvbnRyb2xsZXIgYnkgc2VhcmNoaW5nIHRoZSBlbGVtZW50J3MgcGFyZW50cywgb3IgcGFzc1xuICogICBgbnVsbGAgdG8gdGhlIGBsaW5rYCBmbiBpZiBub3QgZm91bmQuXG4gKlxuICpcbiAqICMjIyMgYGNvbnRyb2xsZXJBc2BcbiAqIElkZW50aWZpZXIgbmFtZSBmb3IgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRyb2xsZXIgaW4gdGhlIGRpcmVjdGl2ZSdzIHNjb3BlLlxuICogVGhpcyBhbGxvd3MgdGhlIGNvbnRyb2xsZXIgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIHRoZSBkaXJlY3RpdmUgdGVtcGxhdGUuIFRoaXMgaXMgZXNwZWNpYWxseVxuICogdXNlZnVsIHdoZW4gYSBkaXJlY3RpdmUgaXMgdXNlZCBhcyBjb21wb25lbnQsIGkuZS4gd2l0aCBhbiBgaXNvbGF0ZWAgc2NvcGUuIEl0J3MgYWxzbyBwb3NzaWJsZVxuICogdG8gdXNlIGl0IGluIGEgZGlyZWN0aXZlIHdpdGhvdXQgYW4gYGlzb2xhdGVgIC8gYG5ld2Agc2NvcGUsIGJ1dCB5b3UgbmVlZCB0byBiZSBhd2FyZSB0aGF0IHRoZVxuICogYGNvbnRyb2xsZXJBc2AgcmVmZXJlbmNlIG1pZ2h0IG92ZXJ3cml0ZSBhIHByb3BlcnR5IHRoYXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIHBhcmVudCBzY29wZS5cbiAqXG4gKlxuICogIyMjIyBgcmVzdHJpY3RgXG4gKiBTdHJpbmcgb2Ygc3Vic2V0IG9mIGBFQUNNYCB3aGljaCByZXN0cmljdHMgdGhlIGRpcmVjdGl2ZSB0byBhIHNwZWNpZmljIGRpcmVjdGl2ZVxuICogZGVjbGFyYXRpb24gc3R5bGUuIElmIG9taXR0ZWQsIHRoZSBkZWZhdWx0cyAoZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMpIGFyZSB1c2VkLlxuICpcbiAqICogYEVgIC0gRWxlbWVudCBuYW1lIChkZWZhdWx0KTogYDxteS1kaXJlY3RpdmU+PC9teS1kaXJlY3RpdmU+YFxuICogKiBgQWAgLSBBdHRyaWJ1dGUgKGRlZmF1bHQpOiBgPGRpdiBteS1kaXJlY3RpdmU9XCJleHBcIj48L2Rpdj5gXG4gKiAqIGBDYCAtIENsYXNzOiBgPGRpdiBjbGFzcz1cIm15LWRpcmVjdGl2ZTogZXhwO1wiPjwvZGl2PmBcbiAqICogYE1gIC0gQ29tbWVudDogYDwhLS0gZGlyZWN0aXZlOiBteS1kaXJlY3RpdmUgZXhwIC0tPmBcbiAqXG4gKlxuICogIyMjIyBgdGVtcGxhdGVOYW1lc3BhY2VgXG4gKiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkb2N1bWVudCB0eXBlIHVzZWQgYnkgdGhlIG1hcmt1cCBpbiB0aGUgdGVtcGxhdGUuXG4gKiBBbmd1bGFySlMgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbiBhcyB0aG9zZSBlbGVtZW50cyBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIGNsb25lZFxuICogaW4gYSBzcGVjaWFsIHdheSB3aGVuIHRoZXkgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGVpciB1c3VhbCBjb250YWluZXJzIGxpa2UgYDxzdmc+YCBhbmQgYDxtYXRoPmAuXG4gKlxuICogKiBgaHRtbGAgLSBBbGwgcm9vdCBub2RlcyBpbiB0aGUgdGVtcGxhdGUgYXJlIEhUTUwuIFJvb3Qgbm9kZXMgbWF5IGFsc28gYmVcbiAqICAgdG9wLWxldmVsIGVsZW1lbnRzIHN1Y2ggYXMgYDxzdmc+YCBvciBgPG1hdGg+YC5cbiAqICogYHN2Z2AgLSBUaGUgcm9vdCBub2RlcyBpbiB0aGUgdGVtcGxhdGUgYXJlIFNWRyBlbGVtZW50cyAoZXhjbHVkaW5nIGA8bWF0aD5gKS5cbiAqICogYG1hdGhgIC0gVGhlIHJvb3Qgbm9kZXMgaW4gdGhlIHRlbXBsYXRlIGFyZSBNYXRoTUwgZWxlbWVudHMgKGV4Y2x1ZGluZyBgPHN2Zz5gKS5cbiAqXG4gKiBJZiBubyBgdGVtcGxhdGVOYW1lc3BhY2VgIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgbmFtZXNwYWNlIGlzIGNvbnNpZGVyZWQgdG8gYmUgYGh0bWxgLlxuICpcbiAqICMjIyMgYHRlbXBsYXRlYFxuICogSFRNTCBtYXJrdXAgdGhhdCBtYXk6XG4gKiAqIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IChkZWZhdWx0KS5cbiAqICogUmVwbGFjZSB0aGUgZGlyZWN0aXZlJ3MgZWxlbWVudCBpdHNlbGYgKGlmIGByZXBsYWNlYCBpcyB0cnVlIC0gREVQUkVDQVRFRCkuXG4gKiAqIFdyYXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IChpZiBgdHJhbnNjbHVkZWAgaXMgdHJ1ZSkuXG4gKlxuICogVmFsdWUgbWF5IGJlOlxuICpcbiAqICogQSBzdHJpbmcuIEZvciBleGFtcGxlIGA8ZGl2IHJlZC1vbi1ob3Zlcj57e2RlbGV0ZV9zdHJ9fTwvZGl2PmAuXG4gKiAqIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50cyBgdEVsZW1lbnRgIGFuZCBgdEF0dHJzYCAoZGVzY3JpYmVkIGluIHRoZSBgY29tcGlsZWBcbiAqICAgZnVuY3Rpb24gYXBpIGJlbG93KSBhbmQgcmV0dXJucyBhIHN0cmluZyB2YWx1ZS5cbiAqXG4gKlxuICogIyMjIyBgdGVtcGxhdGVVcmxgXG4gKiBUaGlzIGlzIHNpbWlsYXIgdG8gYHRlbXBsYXRlYCBidXQgdGhlIHRlbXBsYXRlIGlzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBCZWNhdXNlIHRlbXBsYXRlIGxvYWRpbmcgaXMgYXN5bmNocm9ub3VzIHRoZSBjb21waWxlciB3aWxsIHN1c3BlbmQgY29tcGlsYXRpb24gb2YgZGlyZWN0aXZlcyBvbiB0aGF0IGVsZW1lbnRcbiAqIGZvciBsYXRlciB3aGVuIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiByZXNvbHZlZC4gIEluIHRoZSBtZWFudGltZSBpdCB3aWxsIGNvbnRpbnVlIHRvIGNvbXBpbGUgYW5kIGxpbmtcbiAqIHNpYmxpbmcgYW5kIHBhcmVudCBlbGVtZW50cyBhcyB0aG91Z2ggdGhpcyBlbGVtZW50IGhhZCBub3QgY29udGFpbmVkIGFueSBkaXJlY3RpdmVzLlxuICpcbiAqIFRoZSBjb21waWxlciBkb2VzIG5vdCBzdXNwZW5kIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdG8gd2FpdCBmb3IgdGVtcGxhdGVzIHRvIGJlIGxvYWRlZCBiZWNhdXNlIHRoaXNcbiAqIHdvdWxkIHJlc3VsdCBpbiB0aGUgd2hvbGUgYXBwIFwic3RhbGxpbmdcIiB1bnRpbCBhbGwgdGVtcGxhdGVzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkgLSBldmVuIGluIHRoZVxuICogY2FzZSB3aGVuIG9ubHkgb25lIGRlZXBseSBuZXN0ZWQgZGlyZWN0aXZlIGhhcyBgdGVtcGxhdGVVcmxgLlxuICpcbiAqIFRlbXBsYXRlIGxvYWRpbmcgaXMgYXN5bmNocm9ub3VzIGV2ZW4gaWYgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHByZWxvYWRlZCBpbnRvIHRoZSB7QGxpbmsgJHRlbXBsYXRlQ2FjaGV9XG4gKlxuICogWW91IGNhbiBzcGVjaWZ5IGB0ZW1wbGF0ZVVybGAgYXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwgb3IgYXMgYSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0d29cbiAqIGFyZ3VtZW50cyBgdEVsZW1lbnRgIGFuZCBgdEF0dHJzYCAoZGVzY3JpYmVkIGluIHRoZSBgY29tcGlsZWAgZnVuY3Rpb24gYXBpIGJlbG93KSBhbmQgcmV0dXJuc1xuICogYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB1cmwuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHRlbXBsYXRlIFVSTCBpcyBwYXNzZWQgdGhyb3VnaCB7QGxpbmtcbiAqICRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsICRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsfS5cbiAqXG4gKlxuICogIyMjIyBgcmVwbGFjZWAgKFsqREVQUkVDQVRFRCohXSwgd2lsbCBiZSByZW1vdmVkIGluIG5leHQgbWFqb3IgcmVsZWFzZSAtIGkuZS4gdjIuMClcbiAqIHNwZWNpZnkgd2hhdCB0aGUgdGVtcGxhdGUgc2hvdWxkIHJlcGxhY2UuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogKiBgdHJ1ZWAgLSB0aGUgdGVtcGxhdGUgd2lsbCByZXBsYWNlIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50LlxuICogKiBgZmFsc2VgIC0gdGhlIHRlbXBsYXRlIHdpbGwgcmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuXG4gKlxuICogVGhlIHJlcGxhY2VtZW50IHByb2Nlc3MgbWlncmF0ZXMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIC8gY2xhc3NlcyBmcm9tIHRoZSBvbGQgZWxlbWVudCB0byB0aGUgbmV3XG4gKiBvbmUuIFNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSN0ZW1wbGF0ZS1leHBhbmRpbmctZGlyZWN0aXZlXG4gKiBEaXJlY3RpdmVzIEd1aWRlfSBmb3IgYW4gZXhhbXBsZS5cbiAqXG4gKiBUaGVyZSBhcmUgdmVyeSBmZXcgc2NlbmFyaW9zIHdoZXJlIGVsZW1lbnQgcmVwbGFjZW1lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZSBhcHBsaWNhdGlvbiBmdW5jdGlvbixcbiAqIHRoZSBtYWluIG9uZSBiZWluZyByZXVzYWJsZSBjdXN0b20gY29tcG9uZW50cyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBTVkcgY29udGV4dHNcbiAqIChiZWNhdXNlIFNWRyBkb2Vzbid0IHdvcmsgd2l0aCBjdXN0b20gZWxlbWVudHMgaW4gdGhlIERPTSB0cmVlKS5cbiAqXG4gKiAjIyMjIGB0cmFuc2NsdWRlYFxuICogRXh0cmFjdCB0aGUgY29udGVudHMgb2YgdGhlIGVsZW1lbnQgd2hlcmUgdGhlIGRpcmVjdGl2ZSBhcHBlYXJzIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB0byB0aGUgZGlyZWN0aXZlLlxuICogVGhlIGNvbnRlbnRzIGFyZSBjb21waWxlZCBhbmQgcHJvdmlkZWQgdG8gdGhlIGRpcmVjdGl2ZSBhcyBhICoqdHJhbnNjbHVzaW9uIGZ1bmN0aW9uKiouIFNlZSB0aGVcbiAqIHtAbGluayAkY29tcGlsZSN0cmFuc2NsdXNpb24gVHJhbnNjbHVzaW9ufSBzZWN0aW9uIGJlbG93LlxuICpcbiAqXG4gKiAjIyMjIGBjb21waWxlYFxuICpcbiAqIGBgYGpzXG4gKiAgIGZ1bmN0aW9uIGNvbXBpbGUodEVsZW1lbnQsIHRBdHRycywgdHJhbnNjbHVkZSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogVGhlIGNvbXBpbGUgZnVuY3Rpb24gZGVhbHMgd2l0aCB0cmFuc2Zvcm1pbmcgdGhlIHRlbXBsYXRlIERPTS4gU2luY2UgbW9zdCBkaXJlY3RpdmVzIGRvIG5vdCBkb1xuICogdGVtcGxhdGUgdHJhbnNmb3JtYXRpb24sIGl0IGlzIG5vdCB1c2VkIG9mdGVuLiBUaGUgY29tcGlsZSBmdW5jdGlvbiB0YWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czpcbiAqXG4gKiAgICogYHRFbGVtZW50YCAtIHRlbXBsYXRlIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aGVyZSB0aGUgZGlyZWN0aXZlIGhhcyBiZWVuIGRlY2xhcmVkLiBJdCBpc1xuICogICAgIHNhZmUgdG8gZG8gdGVtcGxhdGUgdHJhbnNmb3JtYXRpb24gb24gdGhlIGVsZW1lbnQgYW5kIGNoaWxkIGVsZW1lbnRzIG9ubHkuXG4gKlxuICogICAqIGB0QXR0cnNgIC0gdGVtcGxhdGUgYXR0cmlidXRlcyAtIE5vcm1hbGl6ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIGRlY2xhcmVkIG9uIHRoaXMgZWxlbWVudCBzaGFyZWRcbiAqICAgICBiZXR3ZWVuIGFsbCBkaXJlY3RpdmUgY29tcGlsZSBmdW5jdGlvbnMuXG4gKlxuICogICAqIGB0cmFuc2NsdWRlYCAtICBbKkRFUFJFQ0FURUQqIV0gQSB0cmFuc2NsdWRlIGxpbmtpbmcgZnVuY3Rpb246IGBmdW5jdGlvbihzY29wZSwgY2xvbmVMaW5raW5nRm4pYFxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKk5vdGU6KiogVGhlIHRlbXBsYXRlIGluc3RhbmNlIGFuZCB0aGUgbGluayBpbnN0YW5jZSBtYXkgYmUgZGlmZmVyZW50IG9iamVjdHMgaWYgdGhlIHRlbXBsYXRlIGhhc1xuICogYmVlbiBjbG9uZWQuIEZvciB0aGlzIHJlYXNvbiBpdCBpcyAqKm5vdCoqIHNhZmUgdG8gZG8gYW55dGhpbmcgb3RoZXIgdGhhbiBET00gdHJhbnNmb3JtYXRpb25zIHRoYXRcbiAqIGFwcGx5IHRvIGFsbCBjbG9uZWQgRE9NIG5vZGVzIHdpdGhpbiB0aGUgY29tcGlsZSBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBET00gbGlzdGVuZXIgcmVnaXN0cmF0aW9uXG4gKiBzaG91bGQgYmUgZG9uZSBpbiBhIGxpbmtpbmcgZnVuY3Rpb24gcmF0aGVyIHRoYW4gaW4gYSBjb21waWxlIGZ1bmN0aW9uLlxuICogPC9kaXY+XG5cbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKk5vdGU6KiogVGhlIGNvbXBpbGUgZnVuY3Rpb24gY2Fubm90IGhhbmRsZSBkaXJlY3RpdmVzIHRoYXQgcmVjdXJzaXZlbHkgdXNlIHRoZW1zZWx2ZXMgaW4gdGhlaXJcbiAqIG93biB0ZW1wbGF0ZXMgb3IgY29tcGlsZSBmdW5jdGlvbnMuIENvbXBpbGluZyB0aGVzZSBkaXJlY3RpdmVzIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcCBhbmRcbiAqIHN0YWNrIG92ZXJmbG93IGVycm9ycy5cbiAqXG4gKiBUaGlzIGNhbiBiZSBhdm9pZGVkIGJ5IG1hbnVhbGx5IHVzaW5nICRjb21waWxlIGluIHRoZSBwb3N0TGluayBmdW5jdGlvbiB0byBpbXBlcmF0aXZlbHkgY29tcGlsZVxuICogYSBkaXJlY3RpdmUncyB0ZW1wbGF0ZSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYXV0b21hdGljIHRlbXBsYXRlIGNvbXBpbGF0aW9uIHZpYSBgdGVtcGxhdGVgIG9yXG4gKiBgdGVtcGxhdGVVcmxgIGRlY2xhcmF0aW9uIG9yIG1hbnVhbCBjb21waWxhdGlvbiBpbnNpZGUgdGhlIGNvbXBpbGUgZnVuY3Rpb24uXG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+XG4gKiAqKk5vdGU6KiogVGhlIGB0cmFuc2NsdWRlYCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29tcGlsZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCBhcyBpdFxuICogICBlLmcuIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHJpZ2h0IG91dGVyIHNjb3BlLiBQbGVhc2UgdXNlIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIHRoYXQgaXMgcGFzc2VkXG4gKiAgIHRvIHRoZSBsaW5rIGZ1bmN0aW9uIGluc3RlYWQuXG4gKiA8L2Rpdj5cblxuICogQSBjb21waWxlIGZ1bmN0aW9uIGNhbiBoYXZlIGEgcmV0dXJuIHZhbHVlIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QuXG4gKlxuICogKiByZXR1cm5pbmcgYSAocG9zdC1saW5rKSBmdW5jdGlvbiAtIGlzIGVxdWl2YWxlbnQgdG8gcmVnaXN0ZXJpbmcgdGhlIGxpbmtpbmcgZnVuY3Rpb24gdmlhIHRoZVxuICogICBgbGlua2AgcHJvcGVydHkgb2YgdGhlIGNvbmZpZyBvYmplY3Qgd2hlbiB0aGUgY29tcGlsZSBmdW5jdGlvbiBpcyBlbXB0eS5cbiAqXG4gKiAqIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBmdW5jdGlvbihzKSByZWdpc3RlcmVkIHZpYSBgcHJlYCBhbmQgYHBvc3RgIHByb3BlcnRpZXMgLSBhbGxvd3MgeW91IHRvXG4gKiAgIGNvbnRyb2wgd2hlbiBhIGxpbmtpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGxpbmtpbmcgcGhhc2UuIFNlZSBpbmZvIGFib3V0XG4gKiAgIHByZS1saW5raW5nIGFuZCBwb3N0LWxpbmtpbmcgZnVuY3Rpb25zIGJlbG93LlxuICpcbiAqXG4gKiAjIyMjIGBsaW5rYFxuICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgaWYgdGhlIGBjb21waWxlYCBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBgYGBqc1xuICogICBmdW5jdGlvbiBsaW5rKHNjb3BlLCBpRWxlbWVudCwgaUF0dHJzLCBjb250cm9sbGVyLCB0cmFuc2NsdWRlRm4pIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIFRoZSBsaW5rIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyBET00gbGlzdGVuZXJzIGFzIHdlbGwgYXMgdXBkYXRpbmcgdGhlIERPTS4gSXQgaXNcbiAqIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiBjbG9uZWQuIFRoaXMgaXMgd2hlcmUgbW9zdCBvZiB0aGUgZGlyZWN0aXZlIGxvZ2ljIHdpbGwgYmVcbiAqIHB1dC5cbiAqXG4gKiAgICogYHNjb3BlYCAtIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIFNjb3BlfSAtIFRoZSBzY29wZSB0byBiZSB1c2VkIGJ5IHRoZVxuICogICAgIGRpcmVjdGl2ZSBmb3IgcmVnaXN0ZXJpbmcge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXN9LlxuICpcbiAqICAgKiBgaUVsZW1lbnRgIC0gaW5zdGFuY2UgZWxlbWVudCAtIFRoZSBlbGVtZW50IHdoZXJlIHRoZSBkaXJlY3RpdmUgaXMgdG8gYmUgdXNlZC4gSXQgaXMgc2FmZSB0b1xuICogICAgIG1hbmlwdWxhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50IG9ubHkgaW4gYHBvc3RMaW5rYCBmdW5jdGlvbiBzaW5jZSB0aGUgY2hpbGRyZW4gaGF2ZVxuICogICAgIGFscmVhZHkgYmVlbiBsaW5rZWQuXG4gKlxuICogICAqIGBpQXR0cnNgIC0gaW5zdGFuY2UgYXR0cmlidXRlcyAtIE5vcm1hbGl6ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIGRlY2xhcmVkIG9uIHRoaXMgZWxlbWVudCBzaGFyZWRcbiAqICAgICBiZXR3ZWVuIGFsbCBkaXJlY3RpdmUgbGlua2luZyBmdW5jdGlvbnMuXG4gKlxuICogICAqIGBjb250cm9sbGVyYCAtIHRoZSBkaXJlY3RpdmUncyByZXF1aXJlZCBjb250cm9sbGVyIGluc3RhbmNlKHMpIC0gSW5zdGFuY2VzIGFyZSBzaGFyZWRcbiAqICAgICBhbW9uZyBhbGwgZGlyZWN0aXZlcywgd2hpY2ggYWxsb3dzIHRoZSBkaXJlY3RpdmVzIHRvIHVzZSB0aGUgY29udHJvbGxlcnMgYXMgYSBjb21tdW5pY2F0aW9uXG4gKiAgICAgY2hhbm5lbC4gVGhlIGV4YWN0IHZhbHVlIGRlcGVuZHMgb24gdGhlIGRpcmVjdGl2ZSdzIGByZXF1aXJlYCBwcm9wZXJ0eTpcbiAqICAgICAgICogbm8gY29udHJvbGxlcihzKSByZXF1aXJlZDogdGhlIGRpcmVjdGl2ZSdzIG93biBjb250cm9sbGVyLCBvciBgdW5kZWZpbmVkYCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lXG4gKiAgICAgICAqIGBzdHJpbmdgOiB0aGUgY29udHJvbGxlciBpbnN0YW5jZVxuICogICAgICAgKiBgYXJyYXlgOiBhcnJheSBvZiBjb250cm9sbGVyIGluc3RhbmNlc1xuICpcbiAqICAgICBJZiBhIHJlcXVpcmVkIGNvbnRyb2xsZXIgY2Fubm90IGJlIGZvdW5kLCBhbmQgaXQgaXMgb3B0aW9uYWwsIHRoZSBpbnN0YW5jZSBpcyBgbnVsbGAsXG4gKiAgICAgb3RoZXJ3aXNlIHRoZSB7QGxpbmsgZXJyb3I6JGNvbXBpbGU6Y3RyZXEgTWlzc2luZyBSZXF1aXJlZCBDb250cm9sbGVyfSBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogICAgIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gcmVxdWlyZSB0aGUgZGlyZWN0aXZlJ3Mgb3duIGNvbnRyb2xsZXIgLSBpdCB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGxpa2VcbiAqICAgICBhbnkgb3RoZXIgY29udHJvbGxlci5cbiAqXG4gKiAgICogYHRyYW5zY2x1ZGVGbmAgLSBBIHRyYW5zY2x1ZGUgbGlua2luZyBmdW5jdGlvbiBwcmUtYm91bmQgdG8gdGhlIGNvcnJlY3QgdHJhbnNjbHVzaW9uIHNjb3BlLlxuICogICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGAkdHJhbnNjbHVkZWAgcGFyYW1ldGVyIG9mIGRpcmVjdGl2ZSBjb250cm9sbGVycyxcbiAqICAgICBzZWUge0BsaW5rIG5nLiRjb21waWxlIy1jb250cm9sbGVyLSB0aGUgY29udHJvbGxlciBzZWN0aW9uIGZvciBkZXRhaWxzfS5cbiAqICAgICBgZnVuY3Rpb24oW3Njb3BlXSwgY2xvbmVMaW5raW5nRm4sIGZ1dHVyZVBhcmVudEVsZW1lbnQpYC5cbiAqXG4gKiAjIyMjIFByZS1saW5raW5nIGZ1bmN0aW9uXG4gKlxuICogRXhlY3V0ZWQgYmVmb3JlIHRoZSBjaGlsZCBlbGVtZW50cyBhcmUgbGlua2VkLiBOb3Qgc2FmZSB0byBkbyBET00gdHJhbnNmb3JtYXRpb24gc2luY2UgdGhlXG4gKiBjb21waWxlciBsaW5raW5nIGZ1bmN0aW9uIHdpbGwgZmFpbCB0byBsb2NhdGUgdGhlIGNvcnJlY3QgZWxlbWVudHMgZm9yIGxpbmtpbmcuXG4gKlxuICogIyMjIyBQb3N0LWxpbmtpbmcgZnVuY3Rpb25cbiAqXG4gKiBFeGVjdXRlZCBhZnRlciB0aGUgY2hpbGQgZWxlbWVudHMgYXJlIGxpbmtlZC5cbiAqXG4gKiBOb3RlIHRoYXQgY2hpbGQgZWxlbWVudHMgdGhhdCBjb250YWluIGB0ZW1wbGF0ZVVybGAgZGlyZWN0aXZlcyB3aWxsIG5vdCBoYXZlIGJlZW4gY29tcGlsZWRcbiAqIGFuZCBsaW5rZWQgc2luY2UgdGhleSBhcmUgd2FpdGluZyBmb3IgdGhlaXIgdGVtcGxhdGUgdG8gbG9hZCBhc3luY2hyb25vdXNseSBhbmQgdGhlaXIgb3duXG4gKiBjb21waWxhdGlvbiBhbmQgbGlua2luZyBoYXMgYmVlbiBzdXNwZW5kZWQgdW50aWwgdGhhdCBvY2N1cnMuXG4gKlxuICogSXQgaXMgc2FmZSB0byBkbyBET00gdHJhbnNmb3JtYXRpb24gaW4gdGhlIHBvc3QtbGlua2luZyBmdW5jdGlvbiBvbiBlbGVtZW50cyB0aGF0IGFyZSBub3Qgd2FpdGluZ1xuICogZm9yIHRoZWlyIGFzeW5jIHRlbXBsYXRlcyB0byBiZSByZXNvbHZlZC5cbiAqXG4gKlxuICogIyMjIFRyYW5zY2x1c2lvblxuICpcbiAqIFRyYW5zY2x1c2lvbiBpcyB0aGUgcHJvY2VzcyBvZiBleHRyYWN0aW5nIGEgY29sbGVjdGlvbiBvZiBET00gZWxlbWVudHMgZnJvbSBvbmUgcGFydCBvZiB0aGUgRE9NIGFuZFxuICogY29weWluZyB0aGVtIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgRE9NLCB3aGlsZSBtYWludGFpbmluZyB0aGVpciBjb25uZWN0aW9uIHRvIHRoZSBvcmlnaW5hbCBBbmd1bGFySlNcbiAqIHNjb3BlIGZyb20gd2hlcmUgdGhleSB3ZXJlIHRha2VuLlxuICpcbiAqIFRyYW5zY2x1c2lvbiBpcyB1c2VkIChvZnRlbiB3aXRoIHtAbGluayBuZ1RyYW5zY2x1ZGV9KSB0byBpbnNlcnQgdGhlXG4gKiBvcmlnaW5hbCBjb250ZW50cyBvZiBhIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaW50byBhIHNwZWNpZmllZCBwbGFjZSBpbiB0aGUgdGVtcGxhdGUgb2YgdGhlIGRpcmVjdGl2ZS5cbiAqIFRoZSBiZW5lZml0IG9mIHRyYW5zY2x1c2lvbiwgb3ZlciBzaW1wbHkgbW92aW5nIHRoZSBET00gZWxlbWVudHMgbWFudWFsbHksIGlzIHRoYXQgdGhlIHRyYW5zY2x1ZGVkXG4gKiBjb250ZW50IGhhcyBhY2Nlc3MgdG8gdGhlIHByb3BlcnRpZXMgb24gdGhlIHNjb3BlIGZyb20gd2hpY2ggaXQgd2FzIHRha2VuLCBldmVuIGlmIHRoZSBkaXJlY3RpdmVcbiAqIGhhcyBpc29sYXRlZCBzY29wZS5cbiAqIFNlZSB0aGUge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSNjcmVhdGluZy1hLWRpcmVjdGl2ZS10aGF0LXdyYXBzLW90aGVyLWVsZW1lbnRzIERpcmVjdGl2ZXMgR3VpZGV9LlxuICpcbiAqIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZSB3aWRnZXQgdG8gaGF2ZSBwcml2YXRlIHN0YXRlIGZvciBpdHMgdGVtcGxhdGUsIHdoaWxlIHRoZSB0cmFuc2NsdWRlZFxuICogY29udGVudCBoYXMgYWNjZXNzIHRvIGl0cyBvcmlnaW5hdGluZyBzY29wZS5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIFdoZW4gdGVzdGluZyBhbiBlbGVtZW50IHRyYW5zY2x1ZGUgZGlyZWN0aXZlIHlvdSBtdXN0IG5vdCBwbGFjZSB0aGUgZGlyZWN0aXZlIGF0IHRoZSByb290IG9mIHRoZVxuICogRE9NIGZyYWdtZW50IHRoYXQgaXMgYmVpbmcgY29tcGlsZWQuIFNlZSB7QGxpbmsgZ3VpZGUvdW5pdC10ZXN0aW5nI3Rlc3RpbmctdHJhbnNjbHVzaW9uLWRpcmVjdGl2ZXNcbiAqIFRlc3RpbmcgVHJhbnNjbHVzaW9uIERpcmVjdGl2ZXN9LlxuICogPC9kaXY+XG4gKlxuICogVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIHRyYW5zY2x1c2lvbiBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHlvdSB3YW50IHRvIHRyYW5zY2x1ZGUganVzdCB0aGUgY29udGVudHMgb2YgdGhlXG4gKiBkaXJlY3RpdmUncyBlbGVtZW50LCB0aGUgZW50aXJlIGVsZW1lbnQgb3IgbXVsdGlwbGUgcGFydHMgb2YgdGhlIGVsZW1lbnQgY29udGVudHM6XG4gKlxuICogKiBgdHJ1ZWAgLSB0cmFuc2NsdWRlIHRoZSBjb250ZW50IChpLmUuIHRoZSBjaGlsZCBub2Rlcykgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQuXG4gKiAqIGAnZWxlbWVudCdgIC0gdHJhbnNjbHVkZSB0aGUgd2hvbGUgb2YgdGhlIGRpcmVjdGl2ZSdzIGVsZW1lbnQgaW5jbHVkaW5nIGFueSBkaXJlY3RpdmVzIG9uIHRoaXNcbiAqICAgZWxlbWVudCB0aGF0IGRlZmluZWQgYXQgYSBsb3dlciBwcmlvcml0eSB0aGFuIHRoaXMgZGlyZWN0aXZlLiBXaGVuIHVzZWQsIHRoZSBgdGVtcGxhdGVgXG4gKiAgIHByb3BlcnR5IGlzIGlnbm9yZWQuXG4gKiAqICoqYHsuLi59YCAoYW4gb2JqZWN0IGhhc2gpOioqIC0gbWFwIGVsZW1lbnRzIG9mIHRoZSBjb250ZW50IG9udG8gdHJhbnNjbHVzaW9uIFwic2xvdHNcIiBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogKipNdWx0LXNsb3QgdHJhbnNjbHVzaW9uKiogaXMgZGVjbGFyZWQgYnkgcHJvdmlkaW5nIGFuIG9iamVjdCBmb3IgdGhlIGB0cmFuc2NsdWRlYCBwcm9wZXJ0eS5cbiAqXG4gKiBUaGlzIG9iamVjdCBpcyBhIG1hcCB3aGVyZSB0aGUga2V5cyBhcmUgdGhlIG5hbWUgb2YgdGhlIHNsb3QgdG8gZmlsbCBhbmQgdGhlIHZhbHVlIGlzIGFuIGVsZW1lbnQgc2VsZWN0b3JcbiAqIHVzZWQgdG8gbWF0Y2ggdGhlIEhUTUwgdG8gdGhlIHNsb3QuIFRoZSBlbGVtZW50IHNlbGVjdG9yIHNob3VsZCBiZSBpbiBub3JtYWxpemVkIGZvcm0gKGUuZy4gYG15RWxlbWVudGApXG4gKiBhbmQgd2lsbCBtYXRjaCB0aGUgc3RhbmRhcmQgZWxlbWVudCB2YXJpYW50cyAoZS5nLiBgbXktZWxlbWVudGAsIGBteTplbGVtZW50YCwgYGRhdGEtbXktZWxlbWVudGAsIGV0YykuXG4gKlxuICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2hlY2sgb3V0IHRoZSBndWlkZSBvbiB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlI21hdGNoaW5nLWRpcmVjdGl2ZXMgTWF0Y2hpbmcgRGlyZWN0aXZlc31cbiAqXG4gKiBJZiB0aGUgZWxlbWVudCBzZWxlY3RvciBpcyBwcmVmaXhlZCB3aXRoIGEgYD9gIHRoZW4gdGhhdCBzbG90IGlzIG9wdGlvbmFsLlxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgdHJhbnNjbHVkZSBvYmplY3QgYHsgc2xvdEE6ICc/bXlDdXN0b21FbGVtZW50JyB9YCBtYXBzIGA8bXktY3VzdG9tLWVsZW1lbnQ+YCBlbGVtZW50cyB0b1xuICogdGhlIGBzbG90QWAgc2xvdCwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgYCR0cmFuc2NsdWRlYCBmdW5jdGlvbiBvciB2aWEgdGhlIHtAbGluayBuZ1RyYW5zY2x1ZGV9IGRpcmVjdGl2ZS5cbiAqXG4gKiBTbG90cyB0aGF0IGFyZSBub3QgbWFya2VkIGFzIG9wdGlvbmFsIChgP2ApIHdpbGwgdHJpZ2dlciBhIGNvbXBpbGUgdGltZSBlcnJvciBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgZWxlbWVudHNcbiAqIGluIHRoZSB0cmFuc2NsdWRlIGNvbnRlbnQuIElmIHlvdSB3aXNoIHRvIGtub3cgaWYgYW4gb3B0aW9uYWwgc2xvdCB3YXMgZmlsbGVkIHdpdGggY29udGVudCwgdGhlbiB5b3UgY2FuIGNhbGxcbiAqIGAkdHJhbnNjbHVkZS5pc1Nsb3RGaWxsZWQoc2xvdE5hbWUpYCBvbiB0aGUgdHJhbnNjbHVkZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGRpcmVjdGl2ZSdzIGxpbmsgZnVuY3Rpb24gYW5kXG4gKiBpbmplY3RhYmxlIGludG8gdGhlIGRpcmVjdGl2ZSdzIGNvbnRyb2xsZXIuXG4gKlxuICpcbiAqICMjIyMgVHJhbnNjbHVzaW9uIEZ1bmN0aW9uc1xuICpcbiAqIFdoZW4gYSBkaXJlY3RpdmUgcmVxdWVzdHMgdHJhbnNjbHVzaW9uLCB0aGUgY29tcGlsZXIgZXh0cmFjdHMgaXRzIGNvbnRlbnRzIGFuZCBwcm92aWRlcyBhICoqdHJhbnNjbHVzaW9uXG4gKiBmdW5jdGlvbioqIHRvIHRoZSBkaXJlY3RpdmUncyBgbGlua2AgZnVuY3Rpb24gYW5kIGBjb250cm9sbGVyYC4gVGhpcyB0cmFuc2NsdXNpb24gZnVuY3Rpb24gaXMgYSBzcGVjaWFsXG4gKiAqKmxpbmtpbmcgZnVuY3Rpb24qKiB0aGF0IHdpbGwgcmV0dXJuIHRoZSBjb21waWxlZCBjb250ZW50cyBsaW5rZWQgdG8gYSBuZXcgdHJhbnNjbHVzaW9uIHNjb3BlLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiBJZiB5b3UgYXJlIGp1c3QgdXNpbmcge0BsaW5rIG5nVHJhbnNjbHVkZX0gdGhlbiB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIGZ1bmN0aW9uLCBzaW5jZVxuICogbmdUcmFuc2NsdWRlIHdpbGwgZGVhbCB3aXRoIGl0IGZvciB1cy5cbiAqIDwvZGl2PlxuICpcbiAqIElmIHlvdSB3YW50IHRvIG1hbnVhbGx5IGNvbnRyb2wgdGhlIGluc2VydGlvbiBhbmQgcmVtb3ZhbCBvZiB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBpbiB5b3VyIGRpcmVjdGl2ZVxuICogdGhlbiB5b3UgbXVzdCB1c2UgdGhpcyB0cmFuc2NsdWRlIGZ1bmN0aW9uLiBXaGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVkZSBmdW5jdGlvbiBpdCByZXR1cm5zIGEgYSBqcUxpdGUvSlF1ZXJ5XG4gKiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgY29tcGlsZWQgRE9NLCB3aGljaCBpcyBsaW5rZWQgdG8gdGhlIGNvcnJlY3QgdHJhbnNjbHVzaW9uIHNjb3BlLlxuICpcbiAqIFdoZW4geW91IGNhbGwgYSB0cmFuc2NsdXNpb24gZnVuY3Rpb24geW91IGNhbiBwYXNzIGluIGEgKipjbG9uZSBhdHRhY2ggZnVuY3Rpb24qKi4gVGhpcyBmdW5jdGlvbiBhY2NlcHRzXG4gKiB0d28gcGFyYW1ldGVycywgYGZ1bmN0aW9uKGNsb25lLCBzY29wZSkgeyAuLi4gfWAsIHdoZXJlIHRoZSBgY2xvbmVgIGlzIGEgZnJlc2ggY29tcGlsZWQgY29weSBvZiB5b3VyIHRyYW5zY2x1ZGVkXG4gKiBjb250ZW50IGFuZCB0aGUgYHNjb3BlYCBpcyB0aGUgbmV3bHkgY3JlYXRlZCB0cmFuc2NsdXNpb24gc2NvcGUsIHdoaWNoIHRoZSBjbG9uZSB3aWxsIGJlIGxpbmtlZCB0by5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICogKipCZXN0IFByYWN0aWNlKio6IEFsd2F5cyBwcm92aWRlIGEgYGNsb25lRm5gIChjbG9uZSBhdHRhY2ggZnVuY3Rpb24pIHdoZW4geW91IGNhbGwgYSB0cmFuc2NsdWRlIGZ1bmN0aW9uXG4gKiBzaW5jZSB5b3UgdGhlbiBnZXQgYSBmcmVzaCBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgRE9NIGFuZCBhbHNvIGhhdmUgYWNjZXNzIHRvIHRoZSBuZXcgdHJhbnNjbHVzaW9uIHNjb3BlLlxuICogPC9kaXY+XG4gKlxuICogSXQgaXMgbm9ybWFsIHByYWN0aWNlIHRvIGF0dGFjaCB5b3VyIHRyYW5zY2x1ZGVkIGNvbnRlbnQgKGBjbG9uZWApIHRvIHRoZSBET00gaW5zaWRlIHlvdXIgKipjbG9uZVxuICogYXR0YWNoIGZ1bmN0aW9uKio6XG4gKlxuICogYGBganNcbiAqIHZhciB0cmFuc2NsdWRlZENvbnRlbnQsIHRyYW5zY2x1c2lvblNjb3BlO1xuICpcbiAqICR0cmFuc2NsdWRlKGZ1bmN0aW9uKGNsb25lLCBzY29wZSkge1xuICogICBlbGVtZW50LmFwcGVuZChjbG9uZSk7XG4gKiAgIHRyYW5zY2x1ZGVkQ29udGVudCA9IGNsb25lO1xuICogICB0cmFuc2NsdXNpb25TY29wZSA9IHNjb3BlO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBMYXRlciwgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSB0cmFuc2NsdWRlZCBjb250ZW50IGZyb20geW91ciBET00gdGhlbiB5b3Ugc2hvdWxkIGFsc28gZGVzdHJveSB0aGVcbiAqIGFzc29jaWF0ZWQgdHJhbnNjbHVzaW9uIHNjb3BlOlxuICpcbiAqIGBgYGpzXG4gKiB0cmFuc2NsdWRlZENvbnRlbnQucmVtb3ZlKCk7XG4gKiB0cmFuc2NsdXNpb25TY29wZS4kZGVzdHJveSgpO1xuICogYGBgXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cbiAqICoqQmVzdCBQcmFjdGljZSoqOiBpZiB5b3UgaW50ZW5kIHRvIGFkZCBhbmQgcmVtb3ZlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgbWFudWFsbHkgaW4geW91ciBkaXJlY3RpdmVcbiAqIChieSBjYWxsaW5nIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIHRvIGdldCB0aGUgRE9NIGFuZCBjYWxsaW5nIGBlbGVtZW50LnJlbW92ZSgpYCB0byByZW1vdmUgaXQpLFxuICogdGhlbiB5b3UgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgYCRkZXN0cm95YCBvbiB0aGUgdHJhbnNjbHVzaW9uIHNjb3BlLlxuICogPC9kaXY+XG4gKlxuICogVGhlIGJ1aWx0LWluIERPTSBtYW5pcHVsYXRpb24gZGlyZWN0aXZlcywgc3VjaCBhcyB7QGxpbmsgbmdJZn0sIHtAbGluayBuZ1N3aXRjaH0gYW5kIHtAbGluayBuZ1JlcGVhdH1cbiAqIGF1dG9tYXRpY2FsbHkgZGVzdHJveSB0aGVpciB0cmFuc2NsdWRlZCBjbG9uZXMgYXMgbmVjZXNzYXJ5IHNvIHlvdSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIGlmXG4gKiB5b3UgYXJlIHNpbXBseSB1c2luZyB7QGxpbmsgbmdUcmFuc2NsdWRlfSB0byBpbmplY3QgdGhlIHRyYW5zY2x1c2lvbiBpbnRvIHlvdXIgZGlyZWN0aXZlLlxuICpcbiAqXG4gKiAjIyMjIFRyYW5zY2x1c2lvbiBTY29wZXNcbiAqXG4gKiBXaGVuIHlvdSBjYWxsIGEgdHJhbnNjbHVkZSBmdW5jdGlvbiBpdCByZXR1cm5zIGEgRE9NIGZyYWdtZW50IHRoYXQgaXMgcHJlLWJvdW5kIHRvIGEgKip0cmFuc2NsdXNpb25cbiAqIHNjb3BlKiouIFRoaXMgc2NvcGUgaXMgc3BlY2lhbCwgaW4gdGhhdCBpdCBpcyBhIGNoaWxkIG9mIHRoZSBkaXJlY3RpdmUncyBzY29wZSAoYW5kIHNvIGdldHMgZGVzdHJveWVkXG4gKiB3aGVuIHRoZSBkaXJlY3RpdmUncyBzY29wZSBnZXRzIGRlc3Ryb3llZCkgYnV0IGl0IGluaGVyaXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzY29wZSBmcm9tIHdoaWNoIGl0XG4gKiB3YXMgdGFrZW4uXG4gKlxuICogRm9yIGV4YW1wbGUgY29uc2lkZXIgYSBkaXJlY3RpdmUgdGhhdCB1c2VzIHRyYW5zY2x1c2lvbiBhbmQgaXNvbGF0ZWQgc2NvcGUuIFRoZSBET00gaGllcmFyY2h5IG1pZ2h0IGxvb2tcbiAqIGxpa2UgdGhpczpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IG5nLWFwcD5cbiAqICAgPGRpdiBpc29sYXRlPlxuICogICAgIDxkaXYgdHJhbnNjbHVzaW9uPlxuICogICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogVGhlIGAkcGFyZW50YCBzY29wZSBoaWVyYXJjaHkgd2lsbCBsb29rIGxpa2UgdGhpczpcbiAqXG4gICBgYGBcbiAgIC0gJHJvb3RTY29wZVxuICAgICAtIGlzb2xhdGVcbiAgICAgICAtIHRyYW5zY2x1c2lvblxuICAgYGBgXG4gKlxuICogYnV0IHRoZSBzY29wZXMgd2lsbCBpbmhlcml0IHByb3RvdHlwaWNhbGx5IGZyb20gZGlmZmVyZW50IHNjb3BlcyB0byB0aGVpciBgJHBhcmVudGAuXG4gKlxuICAgYGBgXG4gICAtICRyb290U2NvcGVcbiAgICAgLSB0cmFuc2NsdXNpb25cbiAgIC0gaXNvbGF0ZVxuICAgYGBgXG4gKlxuICpcbiAqICMjIyBBdHRyaWJ1dGVzXG4gKlxuICogVGhlIHtAbGluayBuZy4kY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyBBdHRyaWJ1dGVzfSBvYmplY3QgLSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaW4gdGhlXG4gKiBgbGluaygpYCBvciBgY29tcGlsZSgpYCBmdW5jdGlvbnMuIEl0IGhhcyBhIHZhcmlldHkgb2YgdXNlcy5cbiAqXG4gKiAqICpBY2Nlc3Npbmcgbm9ybWFsaXplZCBhdHRyaWJ1dGUgbmFtZXM6KiBEaXJlY3RpdmVzIGxpa2UgJ25nQmluZCcgY2FuIGJlIGV4cHJlc3NlZCBpbiBtYW55IHdheXM6XG4gKiAgICduZzpiaW5kJywgYGRhdGEtbmctYmluZGAsIG9yICd4LW5nLWJpbmQnLiBUaGUgYXR0cmlidXRlcyBvYmplY3QgYWxsb3dzIGZvciBub3JtYWxpemVkIGFjY2Vzc1xuICogICB0byB0aGUgYXR0cmlidXRlcy5cbiAqXG4gKiAqICpEaXJlY3RpdmUgaW50ZXItY29tbXVuaWNhdGlvbjoqIEFsbCBkaXJlY3RpdmVzIHNoYXJlIHRoZSBzYW1lIGluc3RhbmNlIG9mIHRoZSBhdHRyaWJ1dGVzXG4gKiAgIG9iamVjdCB3aGljaCBhbGxvd3MgdGhlIGRpcmVjdGl2ZXMgdG8gdXNlIHRoZSBhdHRyaWJ1dGVzIG9iamVjdCBhcyBpbnRlciBkaXJlY3RpdmVcbiAqICAgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiAqICpTdXBwb3J0cyBpbnRlcnBvbGF0aW9uOiogSW50ZXJwb2xhdGlvbiBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlIG9iamVjdFxuICogICBhbGxvd2luZyBvdGhlciBkaXJlY3RpdmVzIHRvIHJlYWQgdGhlIGludGVycG9sYXRlZCB2YWx1ZS5cbiAqXG4gKiAqICpPYnNlcnZpbmcgaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZXM6KiBVc2UgYCRvYnNlcnZlYCB0byBvYnNlcnZlIHRoZSB2YWx1ZSBjaGFuZ2VzIG9mIGF0dHJpYnV0ZXNcbiAqICAgdGhhdCBjb250YWluIGludGVycG9sYXRpb24gKGUuZy4gYHNyYz1cInt7YmFyfX1cImApLiBOb3Qgb25seSBpcyB0aGlzIHZlcnkgZWZmaWNpZW50IGJ1dCBpdCdzIGFsc29cbiAqICAgdGhlIG9ubHkgd2F5IHRvIGVhc2lseSBnZXQgdGhlIGFjdHVhbCB2YWx1ZSBiZWNhdXNlIGR1cmluZyB0aGUgbGlua2luZyBwaGFzZSB0aGUgaW50ZXJwb2xhdGlvblxuICogICBoYXNuJ3QgYmVlbiBldmFsdWF0ZWQgeWV0IGFuZCBzbyB0aGUgdmFsdWUgaXMgYXQgdGhpcyB0aW1lIHNldCB0byBgdW5kZWZpbmVkYC5cbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gbGlua2luZ0ZuKHNjb3BlLCBlbG0sIGF0dHJzLCBjdHJsKSB7XG4gKiAgIC8vIGdldCB0aGUgYXR0cmlidXRlIHZhbHVlXG4gKiAgIGNvbnNvbGUubG9nKGF0dHJzLm5nTW9kZWwpO1xuICpcbiAqICAgLy8gY2hhbmdlIHRoZSBhdHRyaWJ1dGVcbiAqICAgYXR0cnMuJHNldCgnbmdNb2RlbCcsICduZXcgdmFsdWUnKTtcbiAqXG4gKiAgIC8vIG9ic2VydmUgY2hhbmdlcyB0byBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlXG4gKiAgIGF0dHJzLiRvYnNlcnZlKCduZ01vZGVsJywgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgICBjb25zb2xlLmxvZygnbmdNb2RlbCBoYXMgY2hhbmdlZCB2YWx1ZSB0byAnICsgdmFsdWUpO1xuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlKio6IFR5cGljYWxseSBkaXJlY3RpdmVzIGFyZSByZWdpc3RlcmVkIHdpdGggYG1vZHVsZS5kaXJlY3RpdmVgLiBUaGUgZXhhbXBsZSBiZWxvdyBpc1xuICogdG8gaWxsdXN0cmF0ZSBob3cgYCRjb21waWxlYCB3b3Jrcy5cbiAqIDwvZGl2PlxuICpcbiA8ZXhhbXBsZSBtb2R1bGU9XCJjb21waWxlRXhhbXBsZVwiIG5hbWU9XCJjb21waWxlXCI+XG4gICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgIDxzY3JpcHQ+XG4gICAgICBhbmd1bGFyLm1vZHVsZSgnY29tcGlsZUV4YW1wbGUnLCBbXSwgZnVuY3Rpb24oJGNvbXBpbGVQcm92aWRlcikge1xuICAgICAgICAvLyBjb25maWd1cmUgbmV3ICdjb21waWxlJyBkaXJlY3RpdmUgYnkgcGFzc2luZyBhIGRpcmVjdGl2ZVxuICAgICAgICAvLyBmYWN0b3J5IGZ1bmN0aW9uLiBUaGUgZmFjdG9yeSBmdW5jdGlvbiBpbmplY3RzIHRoZSAnJGNvbXBpbGUnXG4gICAgICAgICRjb21waWxlUHJvdmlkZXIuZGlyZWN0aXZlKCdjb21waWxlJywgZnVuY3Rpb24oJGNvbXBpbGUpIHtcbiAgICAgICAgICAvLyBkaXJlY3RpdmUgZmFjdG9yeSBjcmVhdGVzIGEgbGluayBmdW5jdGlvblxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaChcbiAgICAgICAgICAgICAgZnVuY3Rpb24oc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgLy8gd2F0Y2ggdGhlICdjb21waWxlJyBleHByZXNzaW9uIGZvciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLiRldmFsKGF0dHJzLmNvbXBpbGUpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlICdjb21waWxlJyBleHByZXNzaW9uIGNoYW5nZXNcbiAgICAgICAgICAgICAgICAvLyBhc3NpZ24gaXQgaW50byB0aGUgY3VycmVudCBET01cbiAgICAgICAgICAgICAgICBlbGVtZW50Lmh0bWwodmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gY29tcGlsZSB0aGUgbmV3IERPTSBhbmQgbGluayBpdCB0byB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIC8vIHNjb3BlLlxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IHdlIG9ubHkgY29tcGlsZSAuY2hpbGROb2RlcyBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZ2V0IGludG8gaW5maW5pdGUgbG9vcCBjb21waWxpbmcgb3Vyc2VsdmVzXG4gICAgICAgICAgICAgICAgJGNvbXBpbGUoZWxlbWVudC5jb250ZW50cygpKShzY29wZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNvbnRyb2xsZXIoJ0dyZWV0ZXJDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgJHNjb3BlLm5hbWUgPSAnQW5ndWxhcic7XG4gICAgICAgICRzY29wZS5odG1sID0gJ0hlbGxvIHt7bmFtZX19JztcbiAgICAgIH1dKTtcbiAgICA8L3NjcmlwdD5cbiAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJHcmVldGVyQ29udHJvbGxlclwiPlxuICAgICAgPGlucHV0IG5nLW1vZGVsPVwibmFtZVwiPiA8YnIvPlxuICAgICAgPHRleHRhcmVhIG5nLW1vZGVsPVwiaHRtbFwiPjwvdGV4dGFyZWE+IDxici8+XG4gICAgICA8ZGl2IGNvbXBpbGU9XCJodG1sXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICA8L2ZpbGU+XG4gICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgIGl0KCdzaG91bGQgYXV0byBjb21waWxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgdmFyIHRleHRhcmVhID0gJCgndGV4dGFyZWEnKTtcbiAgICAgICB2YXIgb3V0cHV0ID0gJCgnZGl2W2NvbXBpbGVdJyk7XG4gICAgICAgLy8gVGhlIGluaXRpYWwgc3RhdGUgcmVhZHMgJ0hlbGxvIEFuZ3VsYXInLlxuICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0JlKCdIZWxsbyBBbmd1bGFyJyk7XG4gICAgICAgdGV4dGFyZWEuY2xlYXIoKTtcbiAgICAgICB0ZXh0YXJlYS5zZW5kS2V5cygne3tuYW1lfX0hJyk7XG4gICAgICAgZXhwZWN0KG91dHB1dC5nZXRUZXh0KCkpLnRvQmUoJ0FuZ3VsYXIhJyk7XG4gICAgIH0pO1xuICAgPC9maWxlPlxuIDwvZXhhbXBsZT5cblxuICpcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xET01FbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgb3IgSFRNTCBzdHJpbmcgdG8gY29tcGlsZSBpbnRvIGEgdGVtcGxhdGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZSBmdW5jdGlvbiBhdmFpbGFibGUgdG8gZGlyZWN0aXZlcyAtIERFUFJFQ0FURUQuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPlxuICogKipOb3RlOioqIFBhc3NpbmcgYSBgdHJhbnNjbHVkZWAgZnVuY3Rpb24gdG8gdGhlICRjb21waWxlIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIGFzIGl0XG4gKiAgIGUuZy4gd2lsbCBub3QgdXNlIHRoZSByaWdodCBvdXRlciBzY29wZS4gUGxlYXNlIHBhc3MgdGhlIHRyYW5zY2x1ZGUgZnVuY3Rpb24gYXMgYVxuICogICBgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm5gIHRvIHRoZSBsaW5rIGZ1bmN0aW9uIGluc3RlYWQuXG4gKiA8L2Rpdj5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4UHJpb3JpdHkgb25seSBhcHBseSBkaXJlY3RpdmVzIGxvd2VyIHRoYW4gZ2l2ZW4gcHJpb3JpdHkgKE9ubHkgZWZmZWN0cyB0aGVcbiAqICAgICAgICAgICAgICAgICByb290IGVsZW1lbnQocyksIG5vdCB0aGVpciBjaGlsZHJlbilcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzY29wZSwgY2xvbmVBdHRhY2hGbj0sIG9wdGlvbnM9KX0gYSBsaW5rIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gYmluZCB0ZW1wbGF0ZVxuICogKGEgRE9NIGVsZW1lbnQvdHJlZSkgdG8gYSBzY29wZS4gV2hlcmU6XG4gKlxuICogICogYHNjb3BlYCAtIEEge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUgU2NvcGV9IHRvIGJpbmQgdG8uXG4gKiAgKiBgY2xvbmVBdHRhY2hGbmAgLSBJZiBgY2xvbmVBdHRhY2hGbmAgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGxpbmsgZnVuY3Rpb24gd2lsbCBjbG9uZSB0aGVcbiAqICBgdGVtcGxhdGVgIGFuZCBjYWxsIHRoZSBgY2xvbmVBdHRhY2hGbmAgZnVuY3Rpb24gYWxsb3dpbmcgdGhlIGNhbGxlciB0byBhdHRhY2ggdGhlXG4gKiAgY2xvbmVkIGVsZW1lbnRzIHRvIHRoZSBET00gZG9jdW1lbnQgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiBUaGUgYGNsb25lQXR0YWNoRm5gIGlzXG4gKiAgY2FsbGVkIGFzOiA8YnIvPiBgY2xvbmVBdHRhY2hGbihjbG9uZWRFbGVtZW50LCBzY29wZSlgIHdoZXJlOlxuICpcbiAqICAgICAgKiBgY2xvbmVkRWxlbWVudGAgLSBpcyBhIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBgZWxlbWVudGAgcGFzc2VkIGludG8gdGhlIGNvbXBpbGVyLlxuICogICAgICAqIGBzY29wZWAgLSBpcyB0aGUgY3VycmVudCBzY29wZSB3aXRoIHdoaWNoIHRoZSBsaW5raW5nIGZ1bmN0aW9uIGlzIHdvcmtpbmcgd2l0aC5cbiAqXG4gKiAgKiBgb3B0aW9uc2AgLSBBbiBvcHRpb25hbCBvYmplY3QgaGFzaCB3aXRoIGxpbmtpbmcgb3B0aW9ucy4gSWYgYG9wdGlvbnNgIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSBmb2xsb3dpbmdcbiAqICBrZXlzIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgbGlua2luZyBiZWhhdmlvcjpcbiAqXG4gKiAgICAgICogYHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuYCAtIHRoZSB0cmFuc2NsdWRlIGZ1bmN0aW9uIG1hZGUgYXZhaWxhYmxlIHRvXG4gKiAgICAgICAgZGlyZWN0aXZlczsgaWYgZ2l2ZW4sIGl0IHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGxpbmsgZnVuY3Rpb25zIG9mXG4gKiAgICAgICAgZGlyZWN0aXZlcyBmb3VuZCBpbiBgZWxlbWVudGAgZHVyaW5nIGNvbXBpbGF0aW9uLlxuICogICAgICAqIGB0cmFuc2NsdWRlQ29udHJvbGxlcnNgIC0gYW4gb2JqZWN0IGhhc2ggd2l0aCBrZXlzIHRoYXQgbWFwIGNvbnRyb2xsZXIgbmFtZXNcbiAqICAgICAgICB0byBhIGhhc2ggd2l0aCB0aGUga2V5IGBpbnN0YW5jZWAsIHdoaWNoIG1hcHMgdG8gdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2U7XG4gKiAgICAgICAgaWYgZ2l2ZW4sIGl0IHdpbGwgbWFrZSB0aGUgY29udHJvbGxlcnMgYXZhaWxhYmxlIHRvIGRpcmVjdGl2ZXMgb24gdGhlIGNvbXBpbGVOb2RlOlxuICogICAgICAgIGBgYFxuICogICAgICAgIHtcbiAqICAgICAgICAgIHBhcmVudDoge1xuICogICAgICAgICAgICBpbnN0YW5jZTogcGFyZW50Q29udHJvbGxlckluc3RhbmNlXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICAgIGBgYFxuICogICAgICAqIGBmdXR1cmVQYXJlbnRFbGVtZW50YCAtIGRlZmluZXMgdGhlIHBhcmVudCB0byB3aGljaCB0aGUgYGNsb25lQXR0YWNoRm5gIHdpbGwgYWRkXG4gKiAgICAgICAgdGhlIGNsb25lZCBlbGVtZW50czsgb25seSBuZWVkZWQgZm9yIHRyYW5zY2x1ZGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbiBub24gaHRtbFxuICogICAgICAgIGVsZW1lbnRzIChlLmcuIFNWRyBlbGVtZW50cykuIFNlZSBhbHNvIHRoZSBkaXJlY3RpdmUuY29udHJvbGxlciBwcm9wZXJ0eS5cbiAqXG4gKiBDYWxsaW5nIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVsZW1lbnQgb2YgdGhlIHRlbXBsYXRlLiBJdCBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsXG4gKiBlbGVtZW50IHBhc3NlZCBpbiwgb3IgdGhlIGNsb25lIG9mIHRoZSBlbGVtZW50IGlmIHRoZSBgY2xvbmVBdHRhY2hGbmAgaXMgcHJvdmlkZWQuXG4gKlxuICogQWZ0ZXIgbGlua2luZyB0aGUgdmlldyBpcyBub3QgdXBkYXRlZCB1bnRpbCBhZnRlciBhIGNhbGwgdG8gJGRpZ2VzdCB3aGljaCB0eXBpY2FsbHkgaXMgZG9uZSBieVxuICogQW5ndWxhciBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIElmIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUgYm91bmQgdmlldywgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIGl0OlxuICpcbiAqIC0gSWYgeW91IGFyZSBub3QgYXNraW5nIHRoZSBsaW5raW5nIGZ1bmN0aW9uIHRvIGNsb25lIHRoZSB0ZW1wbGF0ZSwgY3JlYXRlIHRoZSBET00gZWxlbWVudChzKVxuICogICBiZWZvcmUgeW91IHNlbmQgdGhlbSB0byB0aGUgY29tcGlsZXIgYW5kIGtlZXAgdGhpcyByZWZlcmVuY2UgYXJvdW5kLlxuICogICBgYGBqc1xuICogICAgIHZhciBlbGVtZW50ID0gJGNvbXBpbGUoJzxwPnt7dG90YWx9fTwvcD4nKShzY29wZSk7XG4gKiAgIGBgYFxuICpcbiAqIC0gaWYgb24gdGhlIG90aGVyIGhhbmQsIHlvdSBuZWVkIHRoZSBlbGVtZW50IHRvIGJlIGNsb25lZCwgdGhlIHZpZXcgcmVmZXJlbmNlIGZyb20gdGhlIG9yaWdpbmFsXG4gKiAgIGV4YW1wbGUgd291bGQgbm90IHBvaW50IHRvIHRoZSBjbG9uZSwgYnV0IHJhdGhlciB0byB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdGhhdCB3YXMgY2xvbmVkLiBJblxuICogICB0aGlzIGNhc2UsIHlvdSBjYW4gYWNjZXNzIHRoZSBjbG9uZSB2aWEgdGhlIGNsb25lQXR0YWNoRm46XG4gKiAgIGBgYGpzXG4gKiAgICAgdmFyIHRlbXBsYXRlRWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudCgnPHA+e3t0b3RhbH19PC9wPicpLFxuICogICAgICAgICBzY29wZSA9IC4uLi47XG4gKlxuICogICAgIHZhciBjbG9uZWRFbGVtZW50ID0gJGNvbXBpbGUodGVtcGxhdGVFbGVtZW50KShzY29wZSwgZnVuY3Rpb24oY2xvbmVkRWxlbWVudCwgc2NvcGUpIHtcbiAqICAgICAgIC8vYXR0YWNoIHRoZSBjbG9uZSB0byBET00gZG9jdW1lbnQgYXQgdGhlIHJpZ2h0IHBsYWNlXG4gKiAgICAgfSk7XG4gKlxuICogICAgIC8vbm93IHdlIGhhdmUgcmVmZXJlbmNlIHRvIHRoZSBjbG9uZWQgRE9NIHZpYSBgY2xvbmVkRWxlbWVudGBcbiAqICAgYGBgXG4gKlxuICpcbiAqIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdGhlIGNvbXBpbGVyIHdvcmtzLCBzZWUgdGhlXG4gKiB7QGxpbmsgZ3VpZGUvY29tcGlsZXIgQW5ndWxhciBIVE1MIENvbXBpbGVyfSBzZWN0aW9uIG9mIHRoZSBEZXZlbG9wZXIgR3VpZGUuXG4gKlxuICogQGtub3duSXNzdWVcbiAqXG4gKiAjIyMgRG91YmxlIENvbXBpbGF0aW9uXG4gKlxuICAgRG91YmxlIGNvbXBpbGF0aW9uIG9jY3VycyB3aGVuIGFuIGFscmVhZHkgY29tcGlsZWQgcGFydCBvZiB0aGUgRE9NIGdldHNcbiAgIGNvbXBpbGVkIGFnYWluLiBUaGlzIGlzIGFuIHVuZGVzaXJlZCBlZmZlY3QgYW5kIGNhbiBsZWFkIHRvIG1pc2JlaGF2aW5nIGRpcmVjdGl2ZXMsIHBlcmZvcm1hbmNlIGlzc3VlcyxcbiAgIGFuZCBtZW1vcnkgbGVha3MuIFJlZmVyIHRvIHRoZSBDb21waWxlciBHdWlkZSB7QGxpbmsgZ3VpZGUvY29tcGlsZXIjZG91YmxlLWNvbXBpbGF0aW9uLWFuZC1ob3ctdG8tYXZvaWQtaXRcbiAgIHNlY3Rpb24gb24gZG91YmxlIGNvbXBpbGF0aW9ufSBmb3IgYW4gaW4tZGVwdGggZXhwbGFuYXRpb24gYW5kIHdheXMgdG8gYXZvaWQgaXQuXG4gKlxuICovXG5cbnZhciAkY29tcGlsZU1pbkVyciA9IG1pbkVycignJGNvbXBpbGUnKTtcblxuZnVuY3Rpb24gVU5JTklUSUFMSVpFRF9WQUxVRSgpIHt9XG52YXIgX1VOSU5JVElBTElaRURfVkFMVUUgPSBuZXcgVU5JTklUSUFMSVpFRF9WQUxVRSgpO1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGNvbXBpbGVQcm92aWRlclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICovXG4kQ29tcGlsZVByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJywgJyQkc2FuaXRpemVVcmlQcm92aWRlciddO1xuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkQ29tcGlsZVByb3ZpZGVyKCRwcm92aWRlLCAkJHNhbml0aXplVXJpUHJvdmlkZXIpIHtcbiAgdmFyIGhhc0RpcmVjdGl2ZXMgPSB7fSxcbiAgICAgIFN1ZmZpeCA9ICdEaXJlY3RpdmUnLFxuICAgICAgQ09NTUVOVF9ESVJFQ1RJVkVfUkVHRVhQID0gL15cXHMqZGlyZWN0aXZlOlxccyooW1xcdy1dKylcXHMrKC4qKSQvLFxuICAgICAgQ0xBU1NfRElSRUNUSVZFX1JFR0VYUCA9IC8oKFtcXHctXSspKD86OihbXjtdKykpPzs/KS8sXG4gICAgICBBTExfT1JfTk9USElOR19BVFRSUyA9IG1ha2VNYXAoJ25nU3JjLG5nU3Jjc2V0LHNyYyxzcmNzZXQnKSxcbiAgICAgIFJFUVVJUkVfUFJFRklYX1JFR0VYUCA9IC9eKD86KFxcXlxcXj8pPyhcXD8pPyhcXF5cXF4/KT8pPy87XG5cbiAgLy8gUmVmOiBodHRwOi8vZGV2ZWxvcGVycy53aGF0d2cub3JnL3dlYmFwcGFwaXMuaHRtbCNldmVudC1oYW5kbGVyLWlkbC1hdHRyaWJ1dGVzXG4gIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgZnV0dXJlIERPTSBldmVudCBhdHRyaWJ1dGUgbmFtZXMgd2lsbCBiZWdpbiB3aXRoXG4gIC8vICdvbicgYW5kIGJlIGNvbXBvc2VkIG9mIG9ubHkgRW5nbGlzaCBsZXR0ZXJzLlxuICB2YXIgRVZFTlRfSEFORExFUl9BVFRSX1JFR0VYUCA9IC9eKG9uW2Etel0rfGZvcm1hY3Rpb24pJC87XG4gIHZhciBiaW5kaW5nQ2FjaGUgPSBjcmVhdGVNYXAoKTtcblxuICBmdW5jdGlvbiBwYXJzZUlzb2xhdGVCaW5kaW5ncyhzY29wZSwgZGlyZWN0aXZlTmFtZSwgaXNDb250cm9sbGVyKSB7XG4gICAgdmFyIExPQ0FMX1JFR0VYUCA9IC9eXFxzKihbQCY8XXw9KFxcKj8pKShcXD8/KVxccyooXFx3KilcXHMqJC87XG5cbiAgICB2YXIgYmluZGluZ3MgPSBjcmVhdGVNYXAoKTtcblxuICAgIGZvckVhY2goc2NvcGUsIGZ1bmN0aW9uKGRlZmluaXRpb24sIHNjb3BlTmFtZSkge1xuICAgICAgaWYgKGRlZmluaXRpb24gaW4gYmluZGluZ0NhY2hlKSB7XG4gICAgICAgIGJpbmRpbmdzW3Njb3BlTmFtZV0gPSBiaW5kaW5nQ2FjaGVbZGVmaW5pdGlvbl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBtYXRjaCA9IGRlZmluaXRpb24ubWF0Y2goTE9DQUxfUkVHRVhQKTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignaXNjcCcsXG4gICAgICAgICAgICAnSW52YWxpZCB7M30gZm9yIGRpcmVjdGl2ZSBcXCd7MH1cXCcuJyArXG4gICAgICAgICAgICAnIERlZmluaXRpb246IHsuLi4gezF9OiBcXCd7Mn1cXCcgLi4ufScsXG4gICAgICAgICAgICBkaXJlY3RpdmVOYW1lLCBzY29wZU5hbWUsIGRlZmluaXRpb24sXG4gICAgICAgICAgICAoaXNDb250cm9sbGVyID8gJ2NvbnRyb2xsZXIgYmluZGluZ3MgZGVmaW5pdGlvbicgOlxuICAgICAgICAgICAgJ2lzb2xhdGUgc2NvcGUgZGVmaW5pdGlvbicpKTtcbiAgICAgIH1cblxuICAgICAgYmluZGluZ3Nbc2NvcGVOYW1lXSA9IHtcbiAgICAgICAgbW9kZTogbWF0Y2hbMV1bMF0sXG4gICAgICAgIGNvbGxlY3Rpb246IG1hdGNoWzJdID09PSAnKicsXG4gICAgICAgIG9wdGlvbmFsOiBtYXRjaFszXSA9PT0gJz8nLFxuICAgICAgICBhdHRyTmFtZTogbWF0Y2hbNF0gfHwgc2NvcGVOYW1lXG4gICAgICB9O1xuICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgIGJpbmRpbmdDYWNoZVtkZWZpbml0aW9uXSA9IGJpbmRpbmdzW3Njb3BlTmFtZV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYmluZGluZ3M7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZURpcmVjdGl2ZUJpbmRpbmdzKGRpcmVjdGl2ZSwgZGlyZWN0aXZlTmFtZSkge1xuICAgIHZhciBiaW5kaW5ncyA9IHtcbiAgICAgIGlzb2xhdGVTY29wZTogbnVsbCxcbiAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IG51bGxcbiAgICB9O1xuICAgIGlmIChpc09iamVjdChkaXJlY3RpdmUuc2NvcGUpKSB7XG4gICAgICBpZiAoZGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIgPT09IHRydWUpIHtcbiAgICAgICAgYmluZGluZ3MuYmluZFRvQ29udHJvbGxlciA9IHBhcnNlSXNvbGF0ZUJpbmRpbmdzKGRpcmVjdGl2ZS5zY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsIHRydWUpO1xuICAgICAgICBiaW5kaW5ncy5pc29sYXRlU2NvcGUgPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpbmRpbmdzLmlzb2xhdGVTY29wZSA9IHBhcnNlSXNvbGF0ZUJpbmRpbmdzKGRpcmVjdGl2ZS5zY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlTmFtZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPYmplY3QoZGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIpKSB7XG4gICAgICBiaW5kaW5ncy5iaW5kVG9Db250cm9sbGVyID1cbiAgICAgICAgICBwYXJzZUlzb2xhdGVCaW5kaW5ncyhkaXJlY3RpdmUuYmluZFRvQ29udHJvbGxlciwgZGlyZWN0aXZlTmFtZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChiaW5kaW5ncy5iaW5kVG9Db250cm9sbGVyICYmICFkaXJlY3RpdmUuY29udHJvbGxlcikge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gY29udHJvbGxlclxuICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ25vY3RybCcsXG4gICAgICAgICAgICAnQ2Fubm90IGJpbmQgdG8gY29udHJvbGxlciB3aXRob3V0IGRpcmVjdGl2ZSBcXCd7MH1cXCdzIGNvbnRyb2xsZXIuJyxcbiAgICAgICAgICAgIGRpcmVjdGl2ZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gYmluZGluZ3M7XG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRWYWxpZERpcmVjdGl2ZU5hbWUobmFtZSkge1xuICAgIHZhciBsZXR0ZXIgPSBuYW1lLmNoYXJBdCgwKTtcbiAgICBpZiAoIWxldHRlciB8fCBsZXR0ZXIgIT09IGxvd2VyY2FzZShsZXR0ZXIpKSB7XG4gICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignYmFkZGlyJywgJ0RpcmVjdGl2ZS9Db21wb25lbnQgbmFtZSBcXCd7MH1cXCcgaXMgaW52YWxpZC4gVGhlIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEgbG93ZXJjYXNlIGxldHRlcicsIG5hbWUpO1xuICAgIH1cbiAgICBpZiAobmFtZSAhPT0gbmFtZS50cmltKCkpIHtcbiAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdiYWRkaXInLFxuICAgICAgICAgICAgJ0RpcmVjdGl2ZS9Db21wb25lbnQgbmFtZSBcXCd7MH1cXCcgaXMgaW52YWxpZC4gVGhlIG5hbWUgc2hvdWxkIG5vdCBjb250YWluIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZXMnLFxuICAgICAgICAgICAgbmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlUmVxdWlyZShkaXJlY3RpdmUpIHtcbiAgICB2YXIgcmVxdWlyZSA9IGRpcmVjdGl2ZS5yZXF1aXJlIHx8IChkaXJlY3RpdmUuY29udHJvbGxlciAmJiBkaXJlY3RpdmUubmFtZSk7XG5cbiAgICBpZiAoIWlzQXJyYXkocmVxdWlyZSkgJiYgaXNPYmplY3QocmVxdWlyZSkpIHtcbiAgICAgIGZvckVhY2gocmVxdWlyZSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5tYXRjaChSRVFVSVJFX1BSRUZJWF9SRUdFWFApO1xuICAgICAgICB2YXIgbmFtZSA9IHZhbHVlLnN1YnN0cmluZyhtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICBpZiAoIW5hbWUpIHJlcXVpcmVba2V5XSA9IG1hdGNoWzBdICsga2V5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVpcmU7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXJlY3RpdmVSZXN0cmljdChyZXN0cmljdCwgbmFtZSkge1xuICAgIGlmIChyZXN0cmljdCAmJiAhKGlzU3RyaW5nKHJlc3RyaWN0KSAmJiAvW0VBQ01dLy50ZXN0KHJlc3RyaWN0KSkpIHtcbiAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdiYWRyZXN0cmljdCcsXG4gICAgICAgICAgJ1Jlc3RyaWN0IHByb3BlcnR5IFxcJ3swfVxcJyBvZiBkaXJlY3RpdmUgXFwnezF9XFwnIGlzIGludmFsaWQnLFxuICAgICAgICAgIHJlc3RyaWN0LFxuICAgICAgICAgIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN0cmljdCB8fCAnRUEnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNkaXJlY3RpdmVcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGRpcmVjdGl2ZSB3aXRoIHRoZSBjb21waWxlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBuYW1lIE5hbWUgb2YgdGhlIGRpcmVjdGl2ZSBpbiBjYW1lbC1jYXNlIChpLmUuIDxjb2RlPm5nQmluZDwvY29kZT4gd2hpY2hcbiAgICogICAgd2lsbCBtYXRjaCBhcyA8Y29kZT5uZy1iaW5kPC9jb2RlPiksIG9yIGFuIG9iamVjdCBtYXAgb2YgZGlyZWN0aXZlcyB3aGVyZSB0aGUga2V5cyBhcmUgdGhlXG4gICAqICAgIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgZmFjdG9yaWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBkaXJlY3RpdmVGYWN0b3J5IEFuIGluamVjdGFibGUgZGlyZWN0aXZlIGZhY3RvcnkgZnVuY3Rpb24uIFNlZSB0aGVcbiAgICogICAge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmUgZ3VpZGV9IGFuZCB0aGUge0BsaW5rICRjb21waWxlIGNvbXBpbGUgQVBJfSBmb3IgbW9yZSBpbmZvLlxuICAgKiBAcmV0dXJucyB7bmcuJGNvbXBpbGVQcm92aWRlcn0gU2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICB0aGlzLmRpcmVjdGl2ZSA9IGZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZUZhY3RvcnkpIHtcbiAgICBhc3NlcnRBcmcobmFtZSwgJ25hbWUnKTtcbiAgICBhc3NlcnROb3RIYXNPd25Qcm9wZXJ0eShuYW1lLCAnZGlyZWN0aXZlJyk7XG4gICAgaWYgKGlzU3RyaW5nKG5hbWUpKSB7XG4gICAgICBhc3NlcnRWYWxpZERpcmVjdGl2ZU5hbWUobmFtZSk7XG4gICAgICBhc3NlcnRBcmcoZGlyZWN0aXZlRmFjdG9yeSwgJ2RpcmVjdGl2ZUZhY3RvcnknKTtcbiAgICAgIGlmICghaGFzRGlyZWN0aXZlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBoYXNEaXJlY3RpdmVzW25hbWVdID0gW107XG4gICAgICAgICRwcm92aWRlLmZhY3RvcnkobmFtZSArIFN1ZmZpeCwgWyckaW5qZWN0b3InLCAnJGV4Y2VwdGlvbkhhbmRsZXInLFxuICAgICAgICAgIGZ1bmN0aW9uKCRpbmplY3RvciwgJGV4Y2VwdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3RpdmVzID0gW107XG4gICAgICAgICAgICBmb3JFYWNoKGhhc0RpcmVjdGl2ZXNbbmFtZV0sIGZ1bmN0aW9uKGRpcmVjdGl2ZUZhY3RvcnksIGluZGV4KSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZSA9ICRpbmplY3Rvci5pbnZva2UoZGlyZWN0aXZlRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGlyZWN0aXZlKSkge1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlID0geyBjb21waWxlOiB2YWx1ZUZuKGRpcmVjdGl2ZSkgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RpdmUuY29tcGlsZSAmJiBkaXJlY3RpdmUubGluaykge1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLmNvbXBpbGUgPSB2YWx1ZUZuKGRpcmVjdGl2ZS5saW5rKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlLnByaW9yaXR5ID0gZGlyZWN0aXZlLnByaW9yaXR5IHx8IDA7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlLm5hbWUgPSBkaXJlY3RpdmUubmFtZSB8fCBuYW1lO1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5yZXF1aXJlID0gZ2V0RGlyZWN0aXZlUmVxdWlyZShkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5yZXN0cmljdCA9IGdldERpcmVjdGl2ZVJlc3RyaWN0KGRpcmVjdGl2ZS5yZXN0cmljdCwgbmFtZSk7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlLiQkbW9kdWxlTmFtZSA9IGRpcmVjdGl2ZUZhY3RvcnkuJCRtb2R1bGVOYW1lO1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZXM7XG4gICAgICAgICAgfV0pO1xuICAgICAgfVxuICAgICAgaGFzRGlyZWN0aXZlc1tuYW1lXS5wdXNoKGRpcmVjdGl2ZUZhY3RvcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JFYWNoKG5hbWUsIHJldmVyc2VQYXJhbXMocmVnaXN0ZXJEaXJlY3RpdmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNjb21wb25lbnRcbiAgICogQG1vZHVsZSBuZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgaW4gY2FtZWxDYXNlIChpLmUuIGBteUNvbXBgIHdoaWNoIHdpbGwgbWF0Y2ggYDxteS1jb21wPmApXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbXBvbmVudCBkZWZpbml0aW9uIG9iamVjdCAoYSBzaW1wbGlmaWVkXG4gICAqICAgIHtAbGluayBuZy4kY29tcGlsZSNkaXJlY3RpdmUtZGVmaW5pdGlvbi1vYmplY3QgZGlyZWN0aXZlIGRlZmluaXRpb24gb2JqZWN0fSksXG4gICAqICAgIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIChhbGwgb3B0aW9uYWwpOlxuICAgKlxuICAgKiAgICAtIGBjb250cm9sbGVyYCDigJMgYHsoc3RyaW5nfGZ1bmN0aW9uKCk9fWAg4oCTIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmVcbiAgICogICAgICBhc3NvY2lhdGVkIHdpdGggbmV3bHkgY3JlYXRlZCBzY29wZSBvciB0aGUgbmFtZSBvZiBhIHtAbGluayBuZy4kY29tcGlsZSMtY29udHJvbGxlci1cbiAgICogICAgICByZWdpc3RlcmVkIGNvbnRyb2xsZXJ9IGlmIHBhc3NlZCBhcyBhIHN0cmluZy4gQW4gZW1wdHkgYG5vb3BgIGZ1bmN0aW9uIGJ5IGRlZmF1bHQuXG4gICAqICAgIC0gYGNvbnRyb2xsZXJBc2Ag4oCTIGB7c3RyaW5nPX1gIOKAkyBpZGVudGlmaWVyIG5hbWUgZm9yIHRvIHJlZmVyZW5jZSB0aGUgY29udHJvbGxlciBpbiB0aGUgY29tcG9uZW50J3Mgc2NvcGUuXG4gICAqICAgICAgSWYgcHJlc2VudCwgdGhlIGNvbnRyb2xsZXIgd2lsbCBiZSBwdWJsaXNoZWQgdG8gc2NvcGUgdW5kZXIgdGhlIGBjb250cm9sbGVyQXNgIG5hbWUuXG4gICAqICAgICAgSWYgbm90IHByZXNlbnQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIGJlIGAkY3RybGAuXG4gICAqICAgIC0gYHRlbXBsYXRlYCDigJMgYHtzdHJpbmc9fGZ1bmN0aW9uKCk9fWAg4oCTIGh0bWwgdGVtcGxhdGUgYXMgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbiB0aGF0XG4gICAqICAgICAgcmV0dXJucyBhbiBodG1sIHRlbXBsYXRlIGFzIGEgc3RyaW5nIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvbXBvbmVudC5cbiAgICogICAgICBFbXB0eSBzdHJpbmcgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogICAgICBJZiBgdGVtcGxhdGVgIGlzIGEgZnVuY3Rpb24sIHRoZW4gaXQgaXMge0BsaW5rIGF1dG8uJGluamVjdG9yI2ludm9rZSBpbmplY3RlZH0gd2l0aFxuICAgKiAgICAgIHRoZSBmb2xsb3dpbmcgbG9jYWxzOlxuICAgKlxuICAgKiAgICAgIC0gYCRlbGVtZW50YCAtIEN1cnJlbnQgZWxlbWVudFxuICAgKiAgICAgIC0gYCRhdHRyc2AgLSBDdXJyZW50IGF0dHJpYnV0ZXMgb2JqZWN0IGZvciB0aGUgZWxlbWVudFxuICAgKlxuICAgKiAgICAtIGB0ZW1wbGF0ZVVybGAg4oCTIGB7c3RyaW5nPXxmdW5jdGlvbigpPX1gIOKAkyBwYXRoIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHBhdGggdG8gYW4gaHRtbFxuICAgKiAgICAgIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgIGFzIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogICAgICBJZiBgdGVtcGxhdGVVcmxgIGlzIGEgZnVuY3Rpb24sIHRoZW4gaXQgaXMge0BsaW5rIGF1dG8uJGluamVjdG9yI2ludm9rZSBpbmplY3RlZH0gd2l0aFxuICAgKiAgICAgIHRoZSBmb2xsb3dpbmcgbG9jYWxzOlxuICAgKlxuICAgKiAgICAgIC0gYCRlbGVtZW50YCAtIEN1cnJlbnQgZWxlbWVudFxuICAgKiAgICAgIC0gYCRhdHRyc2AgLSBDdXJyZW50IGF0dHJpYnV0ZXMgb2JqZWN0IGZvciB0aGUgZWxlbWVudFxuICAgKlxuICAgKiAgICAtIGBiaW5kaW5nc2Ag4oCTIGB7b2JqZWN0PX1gIOKAkyBkZWZpbmVzIGJpbmRpbmdzIGJldHdlZW4gRE9NIGF0dHJpYnV0ZXMgYW5kIGNvbXBvbmVudCBwcm9wZXJ0aWVzLlxuICAgKiAgICAgIENvbXBvbmVudCBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgYm91bmQgdG8gdGhlIGNvbXBvbmVudCBjb250cm9sbGVyIGFuZCBub3QgdG8gdGhlIHNjb3BlLlxuICAgKiAgICAgIFNlZSB7QGxpbmsgbmcuJGNvbXBpbGUjLWJpbmR0b2NvbnRyb2xsZXItIGBiaW5kVG9Db250cm9sbGVyYH0uXG4gICAqICAgIC0gYHRyYW5zY2x1ZGVgIOKAkyBge2Jvb2xlYW49fWAg4oCTIHdoZXRoZXIge0BsaW5rICRjb21waWxlI3RyYW5zY2x1c2lvbiBjb250ZW50IHRyYW5zY2x1c2lvbn0gaXMgZW5hYmxlZC5cbiAgICogICAgICBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgKiAgICAtIGByZXF1aXJlYCAtIGB7T2JqZWN0PHN0cmluZywgc3RyaW5nPj19YCAtIHJlcXVpcmVzIHRoZSBjb250cm9sbGVycyBvZiBvdGhlciBkaXJlY3RpdmVzIGFuZCBiaW5kcyB0aGVtIHRvXG4gICAqICAgICAgdGhpcyBjb21wb25lbnQncyBjb250cm9sbGVyLiBUaGUgb2JqZWN0IGtleXMgc3BlY2lmeSB0aGUgcHJvcGVydHkgbmFtZXMgdW5kZXIgd2hpY2ggdGhlIHJlcXVpcmVkXG4gICAqICAgICAgY29udHJvbGxlcnMgKG9iamVjdCB2YWx1ZXMpIHdpbGwgYmUgYm91bmQuIFNlZSB7QGxpbmsgbmcuJGNvbXBpbGUjLXJlcXVpcmUtIGByZXF1aXJlYH0uXG4gICAqICAgIC0gYCQuLi5gIOKAkyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYXR0YWNoIHRvIHRoZSBkaXJlY3RpdmUgZmFjdG9yeSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2xsZXJcbiAgICogICAgICBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gKFRoaXMgaXMgdXNlZCBieSB0aGUgY29tcG9uZW50IHJvdXRlciB0byBhbm5vdGF0ZSlcbiAgICpcbiAgICogQHJldHVybnMge25nLiRjb21waWxlUHJvdmlkZXJ9IHRoZSBjb21waWxlIHByb3ZpZGVyIGl0c2VsZiwgZm9yIGNoYWluaW5nIG9mIGZ1bmN0aW9uIGNhbGxzLlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXIgYSAqKmNvbXBvbmVudCBkZWZpbml0aW9uKiogd2l0aCB0aGUgY29tcGlsZXIuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yIHJlZ2lzdGVyaW5nIGEgc3BlY2lhbFxuICAgKiB0eXBlIG9mIGRpcmVjdGl2ZSwgd2hpY2ggcmVwcmVzZW50cyBhIHNlbGYtY29udGFpbmVkIFVJIGNvbXBvbmVudCBpbiB5b3VyIGFwcGxpY2F0aW9uLiBTdWNoIGNvbXBvbmVudHNcbiAgICogYXJlIGFsd2F5cyBpc29sYXRlZCAoaS5lLiBgc2NvcGU6IHt9YCkgYW5kIGFyZSBhbHdheXMgcmVzdHJpY3RlZCB0byBlbGVtZW50cyAoaS5lLiBgcmVzdHJpY3Q6ICdFJ2ApLlxuICAgKlxuICAgKiBDb21wb25lbnQgZGVmaW5pdGlvbnMgYXJlIHZlcnkgc2ltcGxlIGFuZCBkbyBub3QgcmVxdWlyZSBhcyBtdWNoIGNvbmZpZ3VyYXRpb24gYXMgZGVmaW5pbmcgZ2VuZXJhbFxuICAgKiBkaXJlY3RpdmVzLiBDb21wb25lbnQgZGVmaW5pdGlvbnMgdXN1YWxseSBjb25zaXN0IG9ubHkgb2YgYSB0ZW1wbGF0ZSBhbmQgYSBjb250cm9sbGVyIGJhY2tpbmcgaXQuXG4gICAqXG4gICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRlZmluaXRpb24gZWFzaWVyLCBjb21wb25lbnRzIGVuZm9yY2UgYmVzdCBwcmFjdGljZXMgbGlrZSB1c2Ugb2YgYGNvbnRyb2xsZXJBc2AsXG4gICAqIGBiaW5kVG9Db250cm9sbGVyYC4gVGhleSBhbHdheXMgaGF2ZSAqKmlzb2xhdGUgc2NvcGUqKiBhbmQgYXJlIHJlc3RyaWN0ZWQgdG8gZWxlbWVudHMuXG4gICAqXG4gICAqIEhlcmUgYXJlIGEgZmV3IGV4YW1wbGVzIG9mIGhvdyB5b3Ugd291bGQgdXN1YWxseSBkZWZpbmUgY29tcG9uZW50czpcbiAgICpcbiAgICogYGBganNcbiAgICogICB2YXIgbXlNb2QgPSBhbmd1bGFyLm1vZHVsZSguLi4pO1xuICAgKiAgIG15TW9kLmNvbXBvbmVudCgnbXlDb21wJywge1xuICAgKiAgICAgdGVtcGxhdGU6ICc8ZGl2Pk15IG5hbWUgaXMge3skY3RybC5uYW1lfX08L2Rpdj4nLFxuICAgKiAgICAgY29udHJvbGxlcjogZnVuY3Rpb24oKSB7XG4gICAqICAgICAgIHRoaXMubmFtZSA9ICdzaGFoYXInO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIG15TW9kLmNvbXBvbmVudCgnbXlDb21wJywge1xuICAgKiAgICAgdGVtcGxhdGU6ICc8ZGl2Pk15IG5hbWUgaXMge3skY3RybC5uYW1lfX08L2Rpdj4nLFxuICAgKiAgICAgYmluZGluZ3M6IHtuYW1lOiAnQCd9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgbXlNb2QuY29tcG9uZW50KCdteUNvbXAnLCB7XG4gICAqICAgICB0ZW1wbGF0ZVVybDogJ3ZpZXdzL215LWNvbXAuaHRtbCcsXG4gICAqICAgICBjb250cm9sbGVyOiAnTXlDdHJsJyxcbiAgICogICAgIGNvbnRyb2xsZXJBczogJ2N0cmwnLFxuICAgKiAgICAgYmluZGluZ3M6IHtuYW1lOiAnQCd9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIGBgYFxuICAgKiBGb3IgbW9yZSBleGFtcGxlcywgYW5kIGFuIGluLWRlcHRoIGd1aWRlLCBzZWUgdGhlIHtAbGluayBndWlkZS9jb21wb25lbnQgY29tcG9uZW50IGd1aWRlfS5cbiAgICpcbiAgICogPGJyIC8+XG4gICAqIFNlZSBhbHNvIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RpcmVjdGl2ZSAkY29tcGlsZVByb3ZpZGVyLmRpcmVjdGl2ZSgpfS5cbiAgICovXG4gIHRoaXMuY29tcG9uZW50ID0gZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnQobmFtZSwgb3B0aW9ucykge1xuICAgIHZhciBjb250cm9sbGVyID0gb3B0aW9ucy5jb250cm9sbGVyIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICBmdW5jdGlvbiBmYWN0b3J5KCRpbmplY3Rvcikge1xuICAgICAgZnVuY3Rpb24gbWFrZUluamVjdGFibGUoZm4pIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZm4pIHx8IGlzQXJyYXkoZm4pKSB7XG4gICAgICAgICAgcmV0dXJuIC8qKiBAdGhpcyAqLyBmdW5jdGlvbih0RWxlbWVudCwgdEF0dHJzKSB7XG4gICAgICAgICAgICByZXR1cm4gJGluamVjdG9yLmludm9rZShmbiwgdGhpcywgeyRlbGVtZW50OiB0RWxlbWVudCwgJGF0dHJzOiB0QXR0cnN9KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdGVtcGxhdGUgPSAoIW9wdGlvbnMudGVtcGxhdGUgJiYgIW9wdGlvbnMudGVtcGxhdGVVcmwgPyAnJyA6IG9wdGlvbnMudGVtcGxhdGUpO1xuICAgICAgdmFyIGRkbyA9IHtcbiAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgY29udHJvbGxlckFzOiBpZGVudGlmaWVyRm9yQ29udHJvbGxlcihvcHRpb25zLmNvbnRyb2xsZXIpIHx8IG9wdGlvbnMuY29udHJvbGxlckFzIHx8ICckY3RybCcsXG4gICAgICAgIHRlbXBsYXRlOiBtYWtlSW5qZWN0YWJsZSh0ZW1wbGF0ZSksXG4gICAgICAgIHRlbXBsYXRlVXJsOiBtYWtlSW5qZWN0YWJsZShvcHRpb25zLnRlbXBsYXRlVXJsKSxcbiAgICAgICAgdHJhbnNjbHVkZTogb3B0aW9ucy50cmFuc2NsdWRlLFxuICAgICAgICBzY29wZToge30sXG4gICAgICAgIGJpbmRUb0NvbnRyb2xsZXI6IG9wdGlvbnMuYmluZGluZ3MgfHwge30sXG4gICAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICAgIHJlcXVpcmU6IG9wdGlvbnMucmVxdWlyZVxuICAgICAgfTtcblxuICAgICAgLy8gQ29weSBhbm5vdGF0aW9ucyAoc3RhcnRpbmcgd2l0aCAkKSBvdmVyIHRvIHRoZSBERE9cbiAgICAgIGZvckVhY2gob3B0aW9ucywgZnVuY3Rpb24odmFsLCBrZXkpIHtcbiAgICAgICAgaWYgKGtleS5jaGFyQXQoMCkgPT09ICckJykgZGRvW2tleV0gPSB2YWw7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRkbztcbiAgICB9XG5cbiAgICAvLyBUT0RPKHBldGUpIHJlbW92ZSB0aGUgZm9sbG93aW5nIGBmb3JFYWNoYCBiZWZvcmUgd2UgcmVsZWFzZSAxLjYuMFxuICAgIC8vIFRoZSBjb21wb25lbnQtcm91dGVyQDAuMi4wIGxvb2tzIGZvciB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIGNvbnRyb2xsZXIgY29uc3RydWN0b3JcbiAgICAvLyBOb3RoaW5nIGluIEFuZ3VsYXIgbG9va3MgZm9yIGFubm90YXRpb25zIG9uIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGJ1dCB3ZSBjYW4ndCByZW1vdmVcbiAgICAvLyBpdCBmcm9tIDEuNS54IHlldC5cblxuICAgIC8vIENvcHkgYW55IGFubm90YXRpb24gcHJvcGVydGllcyAoc3RhcnRpbmcgd2l0aCAkKSBvdmVyIHRvIHRoZSBmYWN0b3J5IGFuZCBjb250cm9sbGVyIGNvbnN0cnVjdG9yIGZ1bmN0aW9uc1xuICAgIC8vIFRoZXNlIGNvdWxkIGJlIHVzZWQgYnkgbGlicmFyaWVzIHN1Y2ggYXMgdGhlIG5ldyBjb21wb25lbnQgcm91dGVyXG4gICAgZm9yRWFjaChvcHRpb25zLCBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgaWYgKGtleS5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICBmYWN0b3J5W2tleV0gPSB2YWw7XG4gICAgICAgIC8vIERvbid0IHRyeSB0byBjb3B5IG92ZXIgYW5ub3RhdGlvbnMgdG8gbmFtZWQgY29udHJvbGxlclxuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb250cm9sbGVyKSkgY29udHJvbGxlcltrZXldID0gdmFsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZmFjdG9yeS4kaW5qZWN0ID0gWyckaW5qZWN0b3InXTtcblxuICAgIHJldHVybiB0aGlzLmRpcmVjdGl2ZShuYW1lLCBmYWN0b3J5KTtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3RcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHJpZXZlcyBvciBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBmb3Igd2hpdGVsaXN0aW5nIG9mIHNhZmVcbiAgICogdXJscyBkdXJpbmcgYVtocmVmXSBzYW5pdGl6YXRpb24uXG4gICAqXG4gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnRpbmcgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuXG4gICAqXG4gICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gYVtocmVmXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvXG4gICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdGBcbiAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsXG4gICAqIHRoZSBhYnNvbHV0ZSB1cmwgaXMgcHJlZml4ZWQgd2l0aCBgJ3Vuc2FmZTonYCBzdHJpbmcgYW5kIG9ubHkgdGhlbiBpcyBpdCB3cml0dGVuIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLlxuICAgKiBAcmV0dXJucyB7UmVnRXhwfG5nLiRjb21waWxlUHJvdmlkZXJ9IEN1cnJlbnQgUmVnRXhwIGlmIGNhbGxlZCB3aXRob3V0IHZhbHVlIG9yIHNlbGYgZm9yXG4gICAqICAgIGNoYWluaW5nIG90aGVyd2lzZS5cbiAgICovXG4gIHRoaXMuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHtcbiAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHtcbiAgICAgICQkc2FuaXRpemVVcmlQcm92aWRlci5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdChyZWdleHApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAkJHNhbml0aXplVXJpUHJvdmlkZXIuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKTtcbiAgICB9XG4gIH07XG5cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyI2ltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdFxuICAgKiBAa2luZCBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZVxuICAgKiB1cmxzIGR1cmluZyBpbWdbc3JjXSBzYW5pdGl6YXRpb24uXG4gICAqXG4gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuXG4gICAqXG4gICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gaW1nW3NyY10gdmlhIGRhdGEtYmluZGluZyBpcyBmaXJzdCBub3JtYWxpemVkIGFuZCB0dXJuZWQgaW50b1xuICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YFxuICAgKiByZWd1bGFyIGV4cHJlc3Npb24uIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBvcmlnaW5hbCB1cmwgaXMgd3JpdHRlbiBpbnRvIHRoZSBkb20uIE90aGVyd2lzZSxcbiAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlZ0V4cD19IHJlZ2V4cCBOZXcgcmVnZXhwIHRvIHdoaXRlbGlzdCB1cmxzIHdpdGguXG4gICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3JcbiAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLlxuICAgKi9cbiAgdGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHtcbiAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHtcbiAgICAgICQkc2FuaXRpemVVcmlQcm92aWRlci5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QocmVnZXhwKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJCRzYW5pdGl6ZVVyaVByb3ZpZGVyLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAgJGNvbXBpbGVQcm92aWRlciNkZWJ1Z0luZm9FbmFibGVkXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGVuYWJsZWQgdXBkYXRlIHRoZSBkZWJ1Z0luZm9FbmFibGVkIHN0YXRlIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UganVzdCByZXR1cm4gdGhlXG4gICAqIGN1cnJlbnQgZGVidWdJbmZvRW5hYmxlZCBzdGF0ZVxuICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlclxuICAgKlxuICAgKiBAa2luZCBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBlbmFibGUvZGlzYWJsZSB2YXJpb3VzIGRlYnVnIHJ1bnRpbWUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbXBpbGVyIHN1Y2ggYXMgYWRkaW5nXG4gICAqIGJpbmRpbmcgaW5mb3JtYXRpb24gYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9uIHRvIERPTSBlbGVtZW50cy5cbiAgICogSWYgZW5hYmxlZCwgdGhlIGNvbXBpbGVyIHdpbGwgYWRkIHRoZSBmb2xsb3dpbmcgdG8gRE9NIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGJvdW5kIHRvIHRoZSBzY29wZVxuICAgKiAqIGBuZy1iaW5kaW5nYCBDU1MgY2xhc3NcbiAgICogKiBgJGJpbmRpbmdgIGRhdGEgcHJvcGVydHkgY29udGFpbmluZyBhbiBhcnJheSBvZiB0aGUgYmluZGluZyBleHByZXNzaW9uc1xuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGluIHByb2R1Y3Rpb24gZm9yIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgYm9vc3QuIFNlZVxuICAgKiB7QGxpbmsgZ3VpZGUvcHJvZHVjdGlvbiNkaXNhYmxpbmctZGVidWctZGF0YSBEaXNhYmxpbmcgRGVidWcgRGF0YX0gZm9yIG1vcmUuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuXG4gICAqL1xuICB2YXIgZGVidWdJbmZvRW5hYmxlZCA9IHRydWU7XG4gIHRoaXMuZGVidWdJbmZvRW5hYmxlZCA9IGZ1bmN0aW9uKGVuYWJsZWQpIHtcbiAgICBpZiAoaXNEZWZpbmVkKGVuYWJsZWQpKSB7XG4gICAgICBkZWJ1Z0luZm9FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gZGVidWdJbmZvRW5hYmxlZDtcbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAgJGNvbXBpbGVQcm92aWRlciNwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZW5hYmxlZCB1cGRhdGUgdGhlIHByZUFzc2lnbkJpbmRpbmdzRW5hYmxlZCBzdGF0ZSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGp1c3QgcmV0dXJuIHRoZVxuICAgKiBjdXJyZW50IHByZUFzc2lnbkJpbmRpbmdzRW5hYmxlZCBzdGF0ZVxuICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlclxuICAgKlxuICAgKiBAa2luZCBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBlbmFibGUvZGlzYWJsZSB3aGV0aGVyIGRpcmVjdGl2ZSBjb250cm9sbGVycyBhcmUgYXNzaWduZWQgYmluZGluZ3MgYmVmb3JlXG4gICAqIGNhbGxpbmcgdGhlIGNvbnRyb2xsZXIncyBjb25zdHJ1Y3Rvci5cbiAgICogSWYgZW5hYmxlZCAodHJ1ZSksIHRoZSBjb21waWxlciBhc3NpZ25zIHRoZSB2YWx1ZSBvZiBlYWNoIG9mIHRoZSBiaW5kaW5ncyB0byB0aGVcbiAgICogcHJvcGVydGllcyBvZiB0aGUgY29udHJvbGxlciBvYmplY3QgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIG9iamVjdCBpcyBjYWxsZWQuXG4gICAqXG4gICAqIElmIGRpc2FibGVkIChmYWxzZSksIHRoZSBjb21waWxlciBjYWxscyB0aGUgY29uc3RydWN0b3IgZmlyc3QgYmVmb3JlIGFzc2lnbmluZyBiaW5kaW5ncy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZSBpbiBBbmd1bGFyIDEuNS54IGJ1dCB3aWxsIHN3aXRjaCB0byBmYWxzZSBpbiBBbmd1bGFyIDEuNi54LlxuICAgKi9cbiAgdmFyIHByZUFzc2lnbkJpbmRpbmdzRW5hYmxlZCA9IGZhbHNlO1xuICB0aGlzLnByZUFzc2lnbkJpbmRpbmdzRW5hYmxlZCA9IGZ1bmN0aW9uKGVuYWJsZWQpIHtcbiAgICBpZiAoaXNEZWZpbmVkKGVuYWJsZWQpKSB7XG4gICAgICBwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBwcmVBc3NpZ25CaW5kaW5nc0VuYWJsZWQ7XG4gIH07XG5cblxuICB2YXIgVFRMID0gMTA7XG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb21waWxlUHJvdmlkZXIjb25DaGFuZ2VzVHRsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgdGltZXMgYCRvbkNoYW5nZXNgIGhvb2tzIGNhbiB0cmlnZ2VyIG5ldyBjaGFuZ2VzIGJlZm9yZSBnaXZpbmcgdXAgYW5kXG4gICAqIGFzc3VtaW5nIHRoYXQgdGhlIG1vZGVsIGlzIHVuc3RhYmxlLlxuICAgKlxuICAgKiBUaGUgY3VycmVudCBkZWZhdWx0IGlzIDEwIGl0ZXJhdGlvbnMuXG4gICAqXG4gICAqIEluIGNvbXBsZXggYXBwbGljYXRpb25zIGl0J3MgcG9zc2libGUgdGhhdCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBgJG9uQ2hhbmdlc2AgaG9va3MgYW5kIGJpbmRpbmdzIHdpbGwgcmVzdWx0XG4gICAqIGluIHNldmVyYWwgaXRlcmF0aW9ucyBvZiBjYWxscyB0byB0aGVzZSBob29rcy4gSG93ZXZlciBpZiBhbiBhcHBsaWNhdGlvbiBuZWVkcyBtb3JlIHRoYW4gdGhlIGRlZmF1bHQgMTBcbiAgICogaXRlcmF0aW9ucyB0byBzdGFiaWxpemUgdGhlbiB5b3Ugc2hvdWxkIGludmVzdGlnYXRlIHdoYXQgaXMgY2F1c2luZyB0aGUgbW9kZWwgdG8gY29udGludW91c2x5IGNoYW5nZSBkdXJpbmdcbiAgICogdGhlIGAkb25DaGFuZ2VzYCBob29rIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogSW5jcmVhc2luZyB0aGUgVFRMIGNvdWxkIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLCBzbyB5b3Ugc2hvdWxkIG5vdCBjaGFuZ2UgaXQgd2l0aG91dCBwcm9wZXIganVzdGlmaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSBudW1iZXIgb2YgYCRvbkNoYW5nZXNgIGhvb2sgaXRlcmF0aW9ucy5cbiAgICogQHJldHVybnMge251bWJlcnxvYmplY3R9IHRoZSBjdXJyZW50IGxpbWl0IChvciBgdGhpc2AgaWYgY2FsbGVkIGFzIGEgc2V0dGVyIGZvciBjaGFpbmluZylcbiAgICovXG4gIHRoaXMub25DaGFuZ2VzVHRsID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgVFRMID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRUTDtcbiAgfTtcblxuICB2YXIgY29tbWVudERpcmVjdGl2ZXNFbmFibGVkQ29uZmlnID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGNvbXBpbGVQcm92aWRlciNjb21tZW50RGlyZWN0aXZlc0VuYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEl0IGluZGljYXRlcyB0byB0aGUgY29tcGlsZXJcbiAgICogd2hldGhlciBvciBub3QgZGlyZWN0aXZlcyBvbiBjb21tZW50cyBzaG91bGQgYmUgY29tcGlsZWQuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggZmFsc2UgZGlzYWJsZXMgdGhlIGNvbXBpbGF0aW9uIG9mIGRpcmVjdGl2ZXNcbiAgICogb24gY29tbWVudHMgZm9yIHRoZSB3aG9sZSBhcHBsaWNhdGlvbi5cbiAgICogVGhpcyByZXN1bHRzIGluIGEgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UgZ2FpbixcbiAgICogYXMgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgaGF2ZSB0byBjaGVjayBjb21tZW50cyB3aGVuIGxvb2tpbmcgZm9yIGRpcmVjdGl2ZXMuXG4gICAqIFRoaXMgc2hvdWxkIGhvd2V2ZXIgb25seSBiZSB1c2VkIGlmIHlvdSBhcmUgc3VyZSB0aGF0IG5vIGNvbW1lbnQgZGlyZWN0aXZlcyBhcmUgdXNlZCBpblxuICAgKiB0aGUgYXBwbGljYXRpb24gKGluY2x1ZGluZyBhbnkgM3JkIHBhcnR5IGRpcmVjdGl2ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgYGZhbHNlYCBpZiB0aGUgY29tcGlsZXIgbWF5IGlnbm9yZSBkaXJlY3RpdmVzIG9uIGNvbW1lbnRzXG4gICAqIEByZXR1cm5zIHtib29sZWFufG9iamVjdH0gdGhlIGN1cnJlbnQgdmFsdWUgKG9yIGB0aGlzYCBpZiBjYWxsZWQgYXMgYSBzZXR0ZXIgZm9yIGNoYWluaW5nKVxuICAgKi9cbiAgdGhpcy5jb21tZW50RGlyZWN0aXZlc0VuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjb21tZW50RGlyZWN0aXZlc0VuYWJsZWRDb25maWcgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWVudERpcmVjdGl2ZXNFbmFibGVkQ29uZmlnO1xuICB9O1xuXG5cbiAgdmFyIGNzc0NsYXNzRGlyZWN0aXZlc0VuYWJsZWRDb25maWcgPSB0cnVlO1xuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29tcGlsZVByb3ZpZGVyI2Nzc0NsYXNzRGlyZWN0aXZlc0VuYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEl0IGluZGljYXRlcyB0byB0aGUgY29tcGlsZXJcbiAgICogd2hldGhlciBvciBub3QgZGlyZWN0aXZlcyBvbiBlbGVtZW50IGNsYXNzZXMgc2hvdWxkIGJlIGNvbXBpbGVkLlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aXRoIGZhbHNlIGRpc2FibGVzIHRoZSBjb21waWxhdGlvbiBvZiBkaXJlY3RpdmVzXG4gICAqIG9uIGVsZW1lbnQgY2xhc3NlcyBmb3IgdGhlIHdob2xlIGFwcGxpY2F0aW9uLlxuICAgKiBUaGlzIHJlc3VsdHMgaW4gYSBjb21waWxhdGlvbiBwZXJmb3JtYW5jZSBnYWluLFxuICAgKiBhcyB0aGUgY29tcGlsZXIgZG9lc24ndCBoYXZlIHRvIGNoZWNrIGVsZW1lbnQgY2xhc3NlcyB3aGVuIGxvb2tpbmcgZm9yIGRpcmVjdGl2ZXMuXG4gICAqIFRoaXMgc2hvdWxkIGhvd2V2ZXIgb25seSBiZSB1c2VkIGlmIHlvdSBhcmUgc3VyZSB0aGF0IG5vIGNsYXNzIGRpcmVjdGl2ZXMgYXJlIHVzZWQgaW5cbiAgICogdGhlIGFwcGxpY2F0aW9uIChpbmNsdWRpbmcgYW55IDNyZCBwYXJ0eSBkaXJlY3RpdmVzKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIGBmYWxzZWAgaWYgdGhlIGNvbXBpbGVyIG1heSBpZ25vcmUgZGlyZWN0aXZlcyBvbiBlbGVtZW50IGNsYXNzZXNcbiAgICogQHJldHVybnMge2Jvb2xlYW58b2JqZWN0fSB0aGUgY3VycmVudCB2YWx1ZSAob3IgYHRoaXNgIGlmIGNhbGxlZCBhcyBhIHNldHRlciBmb3IgY2hhaW5pbmcpXG4gICAqL1xuICB0aGlzLmNzc0NsYXNzRGlyZWN0aXZlc0VuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkQ29uZmlnID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGNzc0NsYXNzRGlyZWN0aXZlc0VuYWJsZWRDb25maWc7XG4gIH07XG5cbiAgdGhpcy4kZ2V0ID0gW1xuICAgICAgICAgICAgJyRpbmplY3RvcicsICckaW50ZXJwb2xhdGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJHRlbXBsYXRlUmVxdWVzdCcsICckcGFyc2UnLFxuICAgICAgICAgICAgJyRjb250cm9sbGVyJywgJyRyb290U2NvcGUnLCAnJHNjZScsICckYW5pbWF0ZScsICckJHNhbml0aXplVXJpJyxcbiAgICBmdW5jdGlvbigkaW5qZWN0b3IsICAgJGludGVycG9sYXRlLCAgICRleGNlcHRpb25IYW5kbGVyLCAgICR0ZW1wbGF0ZVJlcXVlc3QsICAgJHBhcnNlLFxuICAgICAgICAgICAgICRjb250cm9sbGVyLCAgICRyb290U2NvcGUsICAgJHNjZSwgICAkYW5pbWF0ZSwgICAkJHNhbml0aXplVXJpKSB7XG5cbiAgICB2YXIgU0lNUExFX0FUVFJfTkFNRSA9IC9eXFx3LztcbiAgICB2YXIgc3BlY2lhbEF0dHJIb2xkZXIgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cblxuICAgIHZhciBjb21tZW50RGlyZWN0aXZlc0VuYWJsZWQgPSBjb21tZW50RGlyZWN0aXZlc0VuYWJsZWRDb25maWc7XG4gICAgdmFyIGNzc0NsYXNzRGlyZWN0aXZlc0VuYWJsZWQgPSBjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkQ29uZmlnO1xuXG5cbiAgICB2YXIgb25DaGFuZ2VzVHRsID0gVFRMO1xuICAgIC8vIFRoZSBvbkNoYW5nZXMgaG9va3Mgc2hvdWxkIGFsbCBiZSBydW4gdG9nZXRoZXIgaW4gYSBzaW5nbGUgZGlnZXN0XG4gICAgLy8gV2hlbiBjaGFuZ2VzIG9jY3VyLCB0aGUgY2FsbCB0byB0cmlnZ2VyIHRoZWlyIGhvb2tzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBxdWV1ZVxuICAgIHZhciBvbkNoYW5nZXNRdWV1ZTtcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGEgJCRwb3N0RGlnZXN0IHRvIHRyaWdnZXIgYWxsIHRoZSBvbkNoYW5nZXMgaG9va3MgaW4gYSBzaW5nbGUgZGlnZXN0XG4gICAgZnVuY3Rpb24gZmx1c2hPbkNoYW5nZXNRdWV1ZSgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKC0tb25DaGFuZ2VzVHRsKSkge1xuICAgICAgICAgIC8vIFdlIGhhdmUgaGl0IHRoZSBUVEwgbGltaXQgc28gcmVzZXQgZXZlcnl0aGluZ1xuICAgICAgICAgIG9uQ2hhbmdlc1F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCdpbmZjaG5nJywgJ3swfSAkb25DaGFuZ2VzKCkgaXRlcmF0aW9ucyByZWFjaGVkLiBBYm9ydGluZyFcXG4nLCBUVEwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG11c3QgcnVuIHRoaXMgaG9vayBpbiBhbiBhcHBseSBzaW5jZSB0aGUgJCRwb3N0RGlnZXN0IHJ1bnMgb3V0c2lkZSBhcHBseVxuICAgICAgICAkcm9vdFNjb3BlLiRhcHBseShmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gb25DaGFuZ2VzUXVldWUubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgb25DaGFuZ2VzUXVldWVbaV0oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJlc2V0IHRoZSBxdWV1ZSB0byB0cmlnZ2VyIGEgbmV3IHNjaGVkdWxlIG5leHQgdGltZSB0aGVyZSBpcyBhIGNoYW5nZVxuICAgICAgICAgIG9uQ2hhbmdlc1F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcnM7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIG9uQ2hhbmdlc1R0bCsrO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gQXR0cmlidXRlcyhlbGVtZW50LCBhdHRyaWJ1dGVzVG9Db3B5KSB7XG4gICAgICBpZiAoYXR0cmlidXRlc1RvQ29weSkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXNUb0NvcHkpO1xuICAgICAgICB2YXIgaSwgbCwga2V5O1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgdGhpc1trZXldID0gYXR0cmlidXRlc1RvQ29weVtrZXldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiRhdHRyID0ge307XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJCRlbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICBBdHRyaWJ1dGVzLnByb3RvdHlwZSA9IHtcbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGNvbXBpbGUuZGlyZWN0aXZlLkF0dHJpYnV0ZXMjJG5vcm1hbGl6ZVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIENvbnZlcnRzIGFuIGF0dHJpYnV0ZSBuYW1lIChlLmcuIGRhc2gvY29sb24vdW5kZXJzY29yZS1kZWxpbWl0ZWQgc3RyaW5nLCBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggYHgtYCBvclxuICAgICAgICogYGRhdGEtYCkgdG8gaXRzIG5vcm1hbGl6ZWQsIGNhbWVsQ2FzZSBmb3JtLlxuICAgICAgICpcbiAgICAgICAqIEFsc28gdGhlcmUgaXMgc3BlY2lhbCBjYXNlIGZvciBNb3ogcHJlZml4IHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZSBsZXR0ZXIuXG4gICAgICAgKlxuICAgICAgICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gY2hlY2sgb3V0IHRoZSBndWlkZSBvbiB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlI21hdGNoaW5nLWRpcmVjdGl2ZXMgTWF0Y2hpbmcgRGlyZWN0aXZlc31cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIHRvIG5vcm1hbGl6ZVxuICAgICAgICovXG4gICAgICAkbm9ybWFsaXplOiBkaXJlY3RpdmVOb3JtYWxpemUsXG5cblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkYWRkQ2xhc3NcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBBZGRzIHRoZSBDU1MgY2xhc3MgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBjbGFzc1ZhbCBwYXJhbWV0ZXIgdG8gdGhlIGVsZW1lbnQuIElmIGFuaW1hdGlvbnNcbiAgICAgICAqIGFyZSBlbmFibGVkIHRoZW4gYW4gYW5pbWF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIGZvciB0aGUgY2xhc3MgYWRkaXRpb24uXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVmFsIFRoZSBjbGFzc05hbWUgdmFsdWUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50XG4gICAgICAgKi9cbiAgICAgICRhZGRDbGFzczogZnVuY3Rpb24oY2xhc3NWYWwpIHtcbiAgICAgICAgaWYgKGNsYXNzVmFsICYmIGNsYXNzVmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgY2xhc3NWYWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRyZW1vdmVDbGFzc1xuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIFJlbW92ZXMgdGhlIENTUyBjbGFzcyB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGNsYXNzVmFsIHBhcmFtZXRlciBmcm9tIHRoZSBlbGVtZW50LiBJZlxuICAgICAgICogYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCB0aGVuIGFuIGFuaW1hdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgdGhlIGNsYXNzIHJlbW92YWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzVmFsIFRoZSBjbGFzc05hbWUgdmFsdWUgdGhhdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudFxuICAgICAgICovXG4gICAgICAkcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKGNsYXNzVmFsKSB7XG4gICAgICAgIGlmIChjbGFzc1ZhbCAmJiBjbGFzc1ZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIGNsYXNzVmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlcyMkdXBkYXRlQ2xhc3NcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBBZGRzIGFuZCByZW1vdmVzIHRoZSBhcHByb3ByaWF0ZSBDU1MgY2xhc3MgdmFsdWVzIHRvIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlXG4gICAgICAgKiBiZXR3ZWVuIHRoZSBuZXcgYW5kIG9sZCBDU1MgY2xhc3MgdmFsdWVzIChzcGVjaWZpZWQgYXMgbmV3Q2xhc3NlcyBhbmQgb2xkQ2xhc3NlcykuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0NsYXNzZXMgVGhlIGN1cnJlbnQgQ1NTIGNsYXNzTmFtZSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZENsYXNzZXMgVGhlIGZvcm1lciBDU1MgY2xhc3NOYW1lIHZhbHVlXG4gICAgICAgKi9cbiAgICAgICR1cGRhdGVDbGFzczogZnVuY3Rpb24obmV3Q2xhc3Nlcywgb2xkQ2xhc3Nlcykge1xuICAgICAgICB2YXIgdG9BZGQgPSB0b2tlbkRpZmZlcmVuY2UobmV3Q2xhc3Nlcywgb2xkQ2xhc3Nlcyk7XG4gICAgICAgIGlmICh0b0FkZCAmJiB0b0FkZC5sZW5ndGgpIHtcbiAgICAgICAgICAkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgdG9BZGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvUmVtb3ZlID0gdG9rZW5EaWZmZXJlbmNlKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpO1xuICAgICAgICBpZiAodG9SZW1vdmUgJiYgdG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICAgICAgJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIHRvUmVtb3ZlKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBub3JtYWxpemVkIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpbiBhIHdheSBzdWNoIHRoYXQgYWxsIGRpcmVjdGl2ZXNcbiAgICAgICAqIGNhbiBzaGFyZSB0aGUgYXR0cmlidXRlLiBUaGlzIGZ1bmN0aW9uIHByb3Blcmx5IGhhbmRsZXMgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOb3JtYWxpemVkIGtleS4gKGllIG5nQXR0cmlidXRlKVxuICAgICAgICogQHBhcmFtIHtzdHJpbmd8Ym9vbGVhbn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC4gSWYgYG51bGxgIGF0dHJpYnV0ZSB3aWxsIGJlIGRlbGV0ZWQuXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB3cml0ZUF0dHIgSWYgZmFsc2UsIGRvZXMgbm90IHdyaXRlIHRoZSB2YWx1ZSB0byBET00gZWxlbWVudCBhdHRyaWJ1dGUuXG4gICAgICAgKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYXR0ck5hbWUgT3B0aW9uYWwgbm9uZSBub3JtYWxpemVkIG5hbWUuIERlZmF1bHRzIHRvIGtleS5cbiAgICAgICAqL1xuICAgICAgJHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSwgd3JpdGVBdHRyLCBhdHRyTmFtZSkge1xuICAgICAgICAvLyBUT0RPOiBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gdGhyb3cgYW4gZXJyb3IgaWYgXCJjbGFzc1wiXG4gICAgICAgIC8vaXMgc2V0IHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzaW5jZSBpdCBtYXkgY2F1c2UgJHVwZGF0ZUNsYXNzIHRvXG4gICAgICAgIC8vYmVjb21lIHVuc3RhYmxlLlxuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy4kJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBib29sZWFuS2V5ID0gZ2V0Qm9vbGVhbkF0dHJOYW1lKG5vZGUsIGtleSksXG4gICAgICAgICAgICBhbGlhc2VkS2V5ID0gZ2V0QWxpYXNlZEF0dHJOYW1lKGtleSksXG4gICAgICAgICAgICBvYnNlcnZlciA9IGtleSxcbiAgICAgICAgICAgIG5vZGVOYW1lO1xuXG4gICAgICAgIGlmIChib29sZWFuS2V5KSB7XG4gICAgICAgICAgdGhpcy4kJGVsZW1lbnQucHJvcChrZXksIHZhbHVlKTtcbiAgICAgICAgICBhdHRyTmFtZSA9IGJvb2xlYW5LZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxpYXNlZEtleSkge1xuICAgICAgICAgIHRoaXNbYWxpYXNlZEtleV0gPSB2YWx1ZTtcbiAgICAgICAgICBvYnNlcnZlciA9IGFsaWFzZWRLZXk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcblxuICAgICAgICAvLyB0cmFuc2xhdGUgbm9ybWFsaXplZCBrZXkgdG8gYWN0dWFsIGtleVxuICAgICAgICBpZiAoYXR0ck5hbWUpIHtcbiAgICAgICAgICB0aGlzLiRhdHRyW2tleV0gPSBhdHRyTmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyTmFtZSA9IHRoaXMuJGF0dHJba2V5XTtcbiAgICAgICAgICBpZiAoIWF0dHJOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLiRhdHRyW2tleV0gPSBhdHRyTmFtZSA9IHNuYWtlX2Nhc2Uoa2V5LCAnLScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGVOYW1lID0gbm9kZU5hbWVfKHRoaXMuJCRlbGVtZW50KTtcblxuICAgICAgICBpZiAoKG5vZGVOYW1lID09PSAnYScgJiYgKGtleSA9PT0gJ2hyZWYnIHx8IGtleSA9PT0gJ3hsaW5rSHJlZicpKSB8fFxuICAgICAgICAgICAgKG5vZGVOYW1lID09PSAnaW1nJyAmJiBrZXkgPT09ICdzcmMnKSkge1xuICAgICAgICAgIC8vIHNhbml0aXplIGFbaHJlZl0gYW5kIGltZ1tzcmNdIHZhbHVlc1xuICAgICAgICAgIHRoaXNba2V5XSA9IHZhbHVlID0gJCRzYW5pdGl6ZVVyaSh2YWx1ZSwga2V5ID09PSAnc3JjJyk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbWcnICYmIGtleSA9PT0gJ3NyY3NldCcgJiYgaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgIC8vIHNhbml0aXplIGltZ1tzcmNzZXRdIHZhbHVlc1xuICAgICAgICAgIHZhciByZXN1bHQgPSAnJztcblxuICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHRoZXJlIGFyZSBzcGFjZXMgYmVjYXVzZSBpdCdzIG5vdCB0aGUgc2FtZSBwYXR0ZXJuXG4gICAgICAgICAgdmFyIHRyaW1tZWRTcmNzZXQgPSB0cmltKHZhbHVlKTtcbiAgICAgICAgICAvLyAgICAgICAgICAgICAgICAoICAgOTk5eCAgICx8ICAgOTk5dyAgICx8ICAgLHwsICAgKVxuICAgICAgICAgIHZhciBzcmNQYXR0ZXJuID0gLyhcXHMrXFxkK3hcXHMqLHxcXHMrXFxkK3dcXHMqLHxcXHMrLHwsXFxzKykvO1xuICAgICAgICAgIHZhciBwYXR0ZXJuID0gL1xccy8udGVzdCh0cmltbWVkU3Jjc2V0KSA/IHNyY1BhdHRlcm4gOiAvKCwpLztcblxuICAgICAgICAgIC8vIHNwbGl0IHNyY3NldCBpbnRvIHR1cGxlIG9mIHVyaSBhbmQgZGVzY3JpcHRvciBleGNlcHQgZm9yIHRoZSBsYXN0IGl0ZW1cbiAgICAgICAgICB2YXIgcmF3VXJpcyA9IHRyaW1tZWRTcmNzZXQuc3BsaXQocGF0dGVybik7XG5cbiAgICAgICAgICAvLyBmb3IgZWFjaCB0dXBsZXNcbiAgICAgICAgICB2YXIgbmJyVXJpc1dpdGgycGFydHMgPSBNYXRoLmZsb29yKHJhd1VyaXMubGVuZ3RoIC8gMik7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYnJVcmlzV2l0aDJwYXJ0czsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaW5uZXJJZHggPSBpICogMjtcbiAgICAgICAgICAgIC8vIHNhbml0aXplIHRoZSB1cmlcbiAgICAgICAgICAgIHJlc3VsdCArPSAkJHNhbml0aXplVXJpKHRyaW0ocmF3VXJpc1tpbm5lcklkeF0pLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgZGVzY3JpcHRvclxuICAgICAgICAgICAgcmVzdWx0ICs9ICgnICcgKyB0cmltKHJhd1VyaXNbaW5uZXJJZHggKyAxXSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNwbGl0IHRoZSBsYXN0IGl0ZW0gaW50byB1cmkgYW5kIGRlc2NyaXB0b3JcbiAgICAgICAgICB2YXIgbGFzdFR1cGxlID0gdHJpbShyYXdVcmlzW2kgKiAyXSkuc3BsaXQoL1xccy8pO1xuXG4gICAgICAgICAgLy8gc2FuaXRpemUgdGhlIGxhc3QgdXJpXG4gICAgICAgICAgcmVzdWx0ICs9ICQkc2FuaXRpemVVcmkodHJpbShsYXN0VHVwbGVbMF0pLCB0cnVlKTtcblxuICAgICAgICAgIC8vIGFuZCBhZGQgdGhlIGxhc3QgZGVzY3JpcHRvciBpZiBhbnlcbiAgICAgICAgICBpZiAobGFzdFR1cGxlLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICgnICcgKyB0cmltKGxhc3RUdXBsZVsxXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZSA9IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3cml0ZUF0dHIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy4kJGVsZW1lbnQucmVtb3ZlQXR0cihhdHRyTmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChTSU1QTEVfQVRUUl9OQU1FLnRlc3QoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuJCRlbGVtZW50LmF0dHIoYXR0ck5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFNwZWNpYWxBdHRyKHRoaXMuJCRlbGVtZW50WzBdLCBhdHRyTmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcmUgb2JzZXJ2ZXJzXG4gICAgICAgIHZhciAkJG9ic2VydmVycyA9IHRoaXMuJCRvYnNlcnZlcnM7XG4gICAgICAgIGlmICgkJG9ic2VydmVycykge1xuICAgICAgICAgIGZvckVhY2goJCRvYnNlcnZlcnNbb2JzZXJ2ZXJdLCBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm4odmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRvYnNlcnZlXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogT2JzZXJ2ZXMgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIG9uY2UgZHVyaW5nIHRoZSBuZXh0IGAkZGlnZXN0YCBmb2xsb3dpbmdcbiAgICAgICAqIGNvbXBpbGF0aW9uLiBUaGUgb2JzZXJ2ZXIgaXMgdGhlbiBpbnZva2VkIHdoZW5ldmVyIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWVcbiAgICAgICAqIGNoYW5nZXMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBOb3JtYWxpemVkIGtleS4gKGllIG5nQXR0cmlidXRlKSAuXG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGludGVycG9sYXRlZFZhbHVlKX0gZm4gRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlclxuICAgICAgICAgICAgICAgIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBjaGFuZ2VzLlxuICAgICAgICogICAgICAgIFNlZSB0aGUge0BsaW5rIGd1aWRlL2ludGVycG9sYXRpb24jaG93LXRleHQtYW5kLWF0dHJpYnV0ZS1iaW5kaW5ncy13b3JrIEludGVycG9sYXRpb25cbiAgICAgICAqICAgICAgICBndWlkZX0gZm9yIG1vcmUgaW5mby5cbiAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbigpfSBSZXR1cm5zIGEgZGVyZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgb2JzZXJ2ZXIuXG4gICAgICAgKi9cbiAgICAgICRvYnNlcnZlOiBmdW5jdGlvbihrZXksIGZuKSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMsXG4gICAgICAgICAgICAkJG9ic2VydmVycyA9IChhdHRycy4kJG9ic2VydmVycyB8fCAoYXR0cnMuJCRvYnNlcnZlcnMgPSBjcmVhdGVNYXAoKSkpLFxuICAgICAgICAgICAgbGlzdGVuZXJzID0gKCQkb2JzZXJ2ZXJzW2tleV0gfHwgKCQkb2JzZXJ2ZXJzW2tleV0gPSBbXSkpO1xuXG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGZuKTtcbiAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICghbGlzdGVuZXJzLiQkaW50ZXIgJiYgYXR0cnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhaXNVbmRlZmluZWQoYXR0cnNba2V5XSkpIHtcbiAgICAgICAgICAgIC8vIG5vIG9uZSByZWdpc3RlcmVkIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLCBzbyBsZXRzIGNhbGwgaXQgbWFudWFsbHlcbiAgICAgICAgICAgIGZuKGF0dHJzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGFycmF5UmVtb3ZlKGxpc3RlbmVycywgZm4pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzZXRTcGVjaWFsQXR0cihlbGVtZW50LCBhdHRyTmFtZSwgdmFsdWUpIHtcbiAgICAgIC8vIEF0dHJpYnV0ZXMgbmFtZXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBsZXR0ZXJzIChzdWNoIGFzIGAoY2xpY2spYCkgY2Fubm90IGJlIHNldCB1c2luZyBgc2V0QXR0cmlidXRlYFxuICAgICAgLy8gc28gd2UgaGF2ZSB0byBqdW1wIHRocm91Z2ggc29tZSBob29wcyB0byBnZXQgc3VjaCBhbiBhdHRyaWJ1dGVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvcHVsbC8xMzMxOFxuICAgICAgc3BlY2lhbEF0dHJIb2xkZXIuaW5uZXJIVE1MID0gJzxzcGFuICcgKyBhdHRyTmFtZSArICc+JztcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3BlY2lhbEF0dHJIb2xkZXIuZmlyc3RDaGlsZC5hdHRyaWJ1dGVzO1xuICAgICAgdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbMF07XG4gICAgICAvLyBXZSBoYXZlIHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlIGZyb20gaXRzIGNvbnRhaW5lciBlbGVtZW50IGJlZm9yZSB3ZSBjYW4gYWRkIGl0IHRvIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gICAgICBhdHRyaWJ1dGVzLnJlbW92ZU5hbWVkSXRlbShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICBhdHRyaWJ1dGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGVsZW1lbnQuYXR0cmlidXRlcy5zZXROYW1lZEl0ZW0oYXR0cmlidXRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzYWZlQWRkQ2xhc3MoJGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlLCBzaW5jZSBpdCBtZWFucyB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gc2V0IGNsYXNzIG9uXG4gICAgICAgIC8vIFNWRyBlbGVtZW50LCB3aGVyZSBjbGFzcyBuYW1lIGlzIHJlYWQtb25seS5cbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdGFydFN5bWJvbCA9ICRpbnRlcnBvbGF0ZS5zdGFydFN5bWJvbCgpLFxuICAgICAgICBlbmRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sKCksXG4gICAgICAgIGRlbm9ybWFsaXplVGVtcGxhdGUgPSAoc3RhcnRTeW1ib2wgPT09ICd7eycgJiYgZW5kU3ltYm9sICA9PT0gJ319JylcbiAgICAgICAgICAgID8gaWRlbnRpdHlcbiAgICAgICAgICAgIDogZnVuY3Rpb24gZGVub3JtYWxpemVUZW1wbGF0ZSh0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFx7XFx7L2csIHN0YXJ0U3ltYm9sKS5yZXBsYWNlKC99fS9nLCBlbmRTeW1ib2wpO1xuICAgICAgICB9LFxuICAgICAgICBOR19BVFRSX0JJTkRJTkcgPSAvXm5nQXR0cltBLVpdLztcbiAgICB2YXIgTVVMVElfRUxFTUVOVF9ESVJfUkUgPSAvXiguKylTdGFydCQvO1xuXG4gICAgY29tcGlsZS4kJGFkZEJpbmRpbmdJbmZvID0gZGVidWdJbmZvRW5hYmxlZCA/IGZ1bmN0aW9uICQkYWRkQmluZGluZ0luZm8oJGVsZW1lbnQsIGJpbmRpbmcpIHtcbiAgICAgIHZhciBiaW5kaW5ncyA9ICRlbGVtZW50LmRhdGEoJyRiaW5kaW5nJykgfHwgW107XG5cbiAgICAgIGlmIChpc0FycmF5KGJpbmRpbmcpKSB7XG4gICAgICAgIGJpbmRpbmdzID0gYmluZGluZ3MuY29uY2F0KGJpbmRpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmluZGluZ3MucHVzaChiaW5kaW5nKTtcbiAgICAgIH1cblxuICAgICAgJGVsZW1lbnQuZGF0YSgnJGJpbmRpbmcnLCBiaW5kaW5ncyk7XG4gICAgfSA6IG5vb3A7XG5cbiAgICBjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzID0gZGVidWdJbmZvRW5hYmxlZCA/IGZ1bmN0aW9uICQkYWRkQmluZGluZ0NsYXNzKCRlbGVtZW50KSB7XG4gICAgICBzYWZlQWRkQ2xhc3MoJGVsZW1lbnQsICduZy1iaW5kaW5nJyk7XG4gICAgfSA6IG5vb3A7XG5cbiAgICBjb21waWxlLiQkYWRkU2NvcGVJbmZvID0gZGVidWdJbmZvRW5hYmxlZCA/IGZ1bmN0aW9uICQkYWRkU2NvcGVJbmZvKCRlbGVtZW50LCBzY29wZSwgaXNvbGF0ZWQsIG5vVGVtcGxhdGUpIHtcbiAgICAgIHZhciBkYXRhTmFtZSA9IGlzb2xhdGVkID8gKG5vVGVtcGxhdGUgPyAnJGlzb2xhdGVTY29wZU5vVGVtcGxhdGUnIDogJyRpc29sYXRlU2NvcGUnKSA6ICckc2NvcGUnO1xuICAgICAgJGVsZW1lbnQuZGF0YShkYXRhTmFtZSwgc2NvcGUpO1xuICAgIH0gOiBub29wO1xuXG4gICAgY29tcGlsZS4kJGFkZFNjb3BlQ2xhc3MgPSBkZWJ1Z0luZm9FbmFibGVkID8gZnVuY3Rpb24gJCRhZGRTY29wZUNsYXNzKCRlbGVtZW50LCBpc29sYXRlZCkge1xuICAgICAgc2FmZUFkZENsYXNzKCRlbGVtZW50LCBpc29sYXRlZCA/ICduZy1pc29sYXRlLXNjb3BlJyA6ICduZy1zY29wZScpO1xuICAgIH0gOiBub29wO1xuXG4gICAgY29tcGlsZS4kJGNyZWF0ZUNvbW1lbnQgPSBmdW5jdGlvbihkaXJlY3RpdmVOYW1lLCBjb21tZW50KSB7XG4gICAgICB2YXIgY29udGVudCA9ICcnO1xuICAgICAgaWYgKGRlYnVnSW5mb0VuYWJsZWQpIHtcbiAgICAgICAgY29udGVudCA9ICcgJyArIChkaXJlY3RpdmVOYW1lIHx8ICcnKSArICc6ICc7XG4gICAgICAgIGlmIChjb21tZW50KSBjb250ZW50ICs9IGNvbW1lbnQgKyAnICc7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY29udGVudCk7XG4gICAgfTtcblxuICAgIHJldHVybiBjb21waWxlO1xuXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgZnVuY3Rpb24gY29tcGlsZSgkY29tcGlsZU5vZGVzLCB0cmFuc2NsdWRlRm4sIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0KSB7XG4gICAgICBpZiAoISgkY29tcGlsZU5vZGVzIGluc3RhbmNlb2YganFMaXRlKSkge1xuICAgICAgICAvLyBqcXVlcnkgYWx3YXlzIHJld3JhcHMsIHdoZXJlYXMgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2VsZWN0b3Igc28gdGhhdCB3ZSBjYW5cbiAgICAgICAgLy8gbW9kaWZ5IGl0LlxuICAgICAgICAkY29tcGlsZU5vZGVzID0ganFMaXRlKCRjb21waWxlTm9kZXMpO1xuICAgICAgfVxuICAgICAgdmFyIGNvbXBvc2l0ZUxpbmtGbiA9XG4gICAgICAgICAgICAgIGNvbXBpbGVOb2RlcygkY29tcGlsZU5vZGVzLCB0cmFuc2NsdWRlRm4sICRjb21waWxlTm9kZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KTtcbiAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUNsYXNzKCRjb21waWxlTm9kZXMpO1xuICAgICAgdmFyIG5hbWVzcGFjZSA9IG51bGw7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gcHVibGljTGlua0ZuKHNjb3BlLCBjbG9uZUNvbm5lY3RGbiwgb3B0aW9ucykge1xuICAgICAgICBpZiAoISRjb21waWxlTm9kZXMpIHtcbiAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignbXVsdGlsaW5rJywgJ1RoaXMgZWxlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGxpbmtlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRBcmcoc2NvcGUsICdzY29wZScpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c0NvbXBpbGVDb250ZXh0ICYmIHByZXZpb3VzQ29tcGlsZUNvbnRleHQubmVlZHNOZXdTY29wZSkge1xuICAgICAgICAgIC8vIEEgcGFyZW50IGRpcmVjdGl2ZSBkaWQgYSByZXBsYWNlIGFuZCBhIGRpcmVjdGl2ZSBvbiB0aGlzIGVsZW1lbnQgYXNrZWRcbiAgICAgICAgICAvLyBmb3IgdHJhbnNjbHVzaW9uLCB3aGljaCBjYXVzZWQgdXMgdG8gbG9zZSBhIGxheWVyIG9mIGVsZW1lbnQgb24gd2hpY2hcbiAgICAgICAgICAvLyB3ZSBjb3VsZCBob2xkIHRoZSBuZXcgdHJhbnNjbHVzaW9uIHNjb3BlLCBzbyB3ZSB3aWxsIGNyZWF0ZSBpdCBtYW51YWxseVxuICAgICAgICAgIC8vIGhlcmUuXG4gICAgICAgICAgc2NvcGUgPSBzY29wZS4kcGFyZW50LiRuZXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gPSBvcHRpb25zLnBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLFxuICAgICAgICAgIHRyYW5zY2x1ZGVDb250cm9sbGVycyA9IG9wdGlvbnMudHJhbnNjbHVkZUNvbnRyb2xsZXJzLFxuICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQgPSBvcHRpb25zLmZ1dHVyZVBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gV2hlbiBgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm5gIGlzIHBhc3NlZCwgaXQgaXMgYVxuICAgICAgICAvLyBgY29udHJvbGxlcnNCb3VuZFRyYW5zY2x1ZGVgIGZ1bmN0aW9uIChpdCB3YXMgcHJldmlvdXNseSBwYXNzZWRcbiAgICAgICAgLy8gYXMgYHRyYW5zY2x1ZGVgIHRvIGRpcmVjdGl2ZS5saW5rKSBzbyB3ZSBtdXN0IHVud3JhcCBpdCB0byBnZXRcbiAgICAgICAgLy8gaXRzIGBib3VuZFRyYW5zY2x1ZGVGbmBcbiAgICAgICAgaWYgKHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuICYmIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuLiQkYm91bmRUcmFuc2NsdWRlKSB7XG4gICAgICAgICAgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4gPSBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbi4kJGJvdW5kVHJhbnNjbHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmFtZXNwYWNlKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gZGV0ZWN0TmFtZXNwYWNlRm9yQ2hpbGRFbGVtZW50cyhmdXR1cmVQYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgJGxpbmtOb2RlO1xuICAgICAgICBpZiAobmFtZXNwYWNlICE9PSAnaHRtbCcpIHtcbiAgICAgICAgICAvLyBXaGVuIHVzaW5nIGEgZGlyZWN0aXZlIHdpdGggcmVwbGFjZTp0cnVlIGFuZCB0ZW1wbGF0ZVVybCB0aGUgJGNvbXBpbGVOb2Rlc1xuICAgICAgICAgIC8vIChvciBhIGNoaWxkIGVsZW1lbnQgaW5zaWRlIG9mIHRoZW0pXG4gICAgICAgICAgLy8gbWlnaHQgY2hhbmdlLCBzbyB3ZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSBuYW1lc3BhY2UgYWRhcHRlZCBjb21waWxlTm9kZXNcbiAgICAgICAgICAvLyBmb3IgY2FsbCB0byB0aGUgbGluayBmdW5jdGlvbi5cbiAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYWxyZWFkeSBjbG9uZSB0aGUgbm9kZXMuLi5cbiAgICAgICAgICAkbGlua05vZGUgPSBqcUxpdGUoXG4gICAgICAgICAgICB3cmFwVGVtcGxhdGUobmFtZXNwYWNlLCBqcUxpdGUoJzxkaXY+JykuYXBwZW5kKCRjb21waWxlTm9kZXMpLmh0bWwoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGNsb25lQ29ubmVjdEZuKSB7XG4gICAgICAgICAgLy8gaW1wb3J0YW50ISE6IHdlIG11c3QgY2FsbCBvdXIganFMaXRlLmNsb25lKCkgc2luY2UgdGhlIGpRdWVyeSBvbmUgaXMgdHJ5aW5nIHRvIGJlIHNtYXJ0XG4gICAgICAgICAgLy8gYW5kIHNvbWV0aW1lcyBjaGFuZ2VzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIERPTS5cbiAgICAgICAgICAkbGlua05vZGUgPSBKUUxpdGVQcm90b3R5cGUuY2xvbmUuY2FsbCgkY29tcGlsZU5vZGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkbGlua05vZGUgPSAkY29tcGlsZU5vZGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyYW5zY2x1ZGVDb250cm9sbGVycykge1xuICAgICAgICAgIGZvciAodmFyIGNvbnRyb2xsZXJOYW1lIGluIHRyYW5zY2x1ZGVDb250cm9sbGVycykge1xuICAgICAgICAgICAgJGxpbmtOb2RlLmRhdGEoJyQnICsgY29udHJvbGxlck5hbWUgKyAnQ29udHJvbGxlcicsIHRyYW5zY2x1ZGVDb250cm9sbGVyc1tjb250cm9sbGVyTmFtZV0uaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUluZm8oJGxpbmtOb2RlLCBzY29wZSk7XG5cbiAgICAgICAgaWYgKGNsb25lQ29ubmVjdEZuKSBjbG9uZUNvbm5lY3RGbigkbGlua05vZGUsIHNjb3BlKTtcbiAgICAgICAgaWYgKGNvbXBvc2l0ZUxpbmtGbikgY29tcG9zaXRlTGlua0ZuKHNjb3BlLCAkbGlua05vZGUsICRsaW5rTm9kZSwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pO1xuXG4gICAgICAgIGlmICghY2xvbmVDb25uZWN0Rm4pIHtcbiAgICAgICAgICAkY29tcGlsZU5vZGVzID0gY29tcG9zaXRlTGlua0ZuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJGxpbmtOb2RlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXRlY3ROYW1lc3BhY2VGb3JDaGlsZEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgIC8vIFRPRE86IE1ha2UgdGhpcyBkZXRlY3QgTWF0aE1MIGFzIHdlbGwuLi5cbiAgICAgIHZhciBub2RlID0gcGFyZW50RWxlbWVudCAmJiBwYXJlbnRFbGVtZW50WzBdO1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybiAnaHRtbCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbm9kZU5hbWVfKG5vZGUpICE9PSAnZm9yZWlnbm9iamVjdCcgJiYgdG9TdHJpbmcuY2FsbChub2RlKS5tYXRjaCgvU1ZHLykgPyAnc3ZnJyA6ICdodG1sJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21waWxlIGZ1bmN0aW9uIG1hdGNoZXMgZWFjaCBub2RlIGluIG5vZGVMaXN0IGFnYWluc3QgdGhlIGRpcmVjdGl2ZXMuIE9uY2UgYWxsIGRpcmVjdGl2ZXNcbiAgICAgKiBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUgYXJlIGNvbGxlY3RlZCB0aGVpciBjb21waWxlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQuIFRoZSBjb21waWxlXG4gICAgICogZnVuY3Rpb25zIHJldHVybiB2YWx1ZXMgLSB0aGUgbGlua2luZyBmdW5jdGlvbnMgLSBhcmUgY29tYmluZWQgaW50byBhIGNvbXBvc2l0ZSBsaW5raW5nXG4gICAgICogZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSBhIGxpbmtpbmcgZnVuY3Rpb24gZm9yIHRoZSBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlTGlzdH0gbm9kZUxpc3QgYW4gYXJyYXkgb2Ygbm9kZXMgb3IgTm9kZUxpc3QgdG8gY29tcGlsZVxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oYW5ndWxhci5TY29wZSwgY2xvbmVBdHRhY2hGbj0pfSB0cmFuc2NsdWRlRm4gQSBsaW5raW5nIGZ1bmN0aW9uLCB3aGVyZSB0aGVcbiAgICAgKiAgICAgICAgc2NvcGUgYXJndW1lbnQgaXMgYXV0by1nZW5lcmF0ZWQgdG8gdGhlIG5ldyBjaGlsZCBvZiB0aGUgdHJhbnNjbHVkZWQgcGFyZW50IHNjb3BlLlxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudD19ICRyb290RWxlbWVudCBJZiB0aGUgbm9kZUxpc3QgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBpbGF0aW9uIHRyZWUgdGhlblxuICAgICAqICAgICAgICB0aGUgcm9vdEVsZW1lbnQgbXVzdCBiZSBzZXQgdGhlIGpxTGl0ZSBjb2xsZWN0aW9uIG9mIHRoZSBjb21waWxlIHJvb3QuIFRoaXMgaXNcbiAgICAgKiAgICAgICAgbmVlZGVkIHNvIHRoYXQgdGhlIGpxTGl0ZSBjb2xsZWN0aW9uIGl0ZW1zIGNhbiBiZSByZXBsYWNlZCB3aXRoIHdpZGdldHMuXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBtYXhQcmlvcml0eSBNYXggZGlyZWN0aXZlIHByaW9yaXR5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBjb21wb3NpdGUgbGlua2luZyBmdW5jdGlvbiBvZiBhbGwgb2YgdGhlIG1hdGNoZWQgZGlyZWN0aXZlcyBvciBudWxsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBpbGVOb2Rlcyhub2RlTGlzdCwgdHJhbnNjbHVkZUZuLCAkcm9vdEVsZW1lbnQsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dCkge1xuICAgICAgdmFyIGxpbmtGbnMgPSBbXSxcbiAgICAgICAgICAvLyBgbm9kZUxpc3RgIGNhbiBiZSBlaXRoZXIgYW4gZWxlbWVudCdzIGAuY2hpbGROb2Rlc2AgKGxpdmUgTm9kZUxpc3QpXG4gICAgICAgICAgLy8gb3IgYSBqcUxpdGUvalF1ZXJ5IGNvbGxlY3Rpb24gb3IgYW4gYXJyYXlcbiAgICAgICAgICBub3RMaXZlTGlzdCA9IGlzQXJyYXkobm9kZUxpc3QpIHx8IChub2RlTGlzdCBpbnN0YW5jZW9mIGpxTGl0ZSksXG4gICAgICAgICAgYXR0cnMsIGRpcmVjdGl2ZXMsIG5vZGVMaW5rRm4sIGNoaWxkTm9kZXMsIGNoaWxkTGlua0ZuLCBsaW5rRm5Gb3VuZCwgbm9kZUxpbmtGbkZvdW5kO1xuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXR0cnMgPSBuZXcgQXR0cmlidXRlcygpO1xuXG4gICAgICAgIC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcbiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgIzExNzgxIGFuZCAjMTQ5MjRcbiAgICAgICAgaWYgKG1zaWUgPT09IDExKSB7XG4gICAgICAgICAgbWVyZ2VDb25zZWN1dGl2ZVRleHROb2Rlcyhub2RlTGlzdCwgaSwgbm90TGl2ZUxpc3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgcmVmZXIgdG8gYG5vZGVMaXN0W2ldYCBoZXJlYWZ0ZXIsXG4gICAgICAgIC8vIHNpbmNlIHRoZSBub2RlcyBjYW4gYmUgcmVwbGFjZWQgdW5kZXJuZWF0aCB1cy5cbiAgICAgICAgZGlyZWN0aXZlcyA9IGNvbGxlY3REaXJlY3RpdmVzKG5vZGVMaXN0W2ldLCBbXSwgYXR0cnMsIGkgPT09IDAgPyBtYXhQcmlvcml0eSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVEaXJlY3RpdmUpO1xuXG4gICAgICAgIG5vZGVMaW5rRm4gPSAoZGlyZWN0aXZlcy5sZW5ndGgpXG4gICAgICAgICAgICA/IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBub2RlTGlzdFtpXSwgYXR0cnMsIHRyYW5zY2x1ZGVGbiwgJHJvb3RFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBbXSwgW10sIHByZXZpb3VzQ29tcGlsZUNvbnRleHQpXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgaWYgKG5vZGVMaW5rRm4gJiYgbm9kZUxpbmtGbi5zY29wZSkge1xuICAgICAgICAgIGNvbXBpbGUuJCRhZGRTY29wZUNsYXNzKGF0dHJzLiQkZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZExpbmtGbiA9IChub2RlTGlua0ZuICYmIG5vZGVMaW5rRm4udGVybWluYWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAhKGNoaWxkTm9kZXMgPSBub2RlTGlzdFtpXS5jaGlsZE5vZGVzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICFjaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBjb21waWxlTm9kZXMoY2hpbGROb2RlcyxcbiAgICAgICAgICAgICAgICAgbm9kZUxpbmtGbiA/IChcbiAgICAgICAgICAgICAgICAgIChub2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50IHx8ICFub2RlTGlua0ZuLnRlbXBsYXRlT25UaGlzRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICYmIG5vZGVMaW5rRm4udHJhbnNjbHVkZSkgOiB0cmFuc2NsdWRlRm4pO1xuXG4gICAgICAgIGlmIChub2RlTGlua0ZuIHx8IGNoaWxkTGlua0ZuKSB7XG4gICAgICAgICAgbGlua0Zucy5wdXNoKGksIG5vZGVMaW5rRm4sIGNoaWxkTGlua0ZuKTtcbiAgICAgICAgICBsaW5rRm5Gb3VuZCA9IHRydWU7XG4gICAgICAgICAgbm9kZUxpbmtGbkZvdW5kID0gbm9kZUxpbmtGbkZvdW5kIHx8IG5vZGVMaW5rRm47XG4gICAgICAgIH1cblxuICAgICAgICAvL3VzZSB0aGUgcHJldmlvdXMgY29udGV4dCBvbmx5IGZvciB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgdmlydHVhbCBncm91cFxuICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gcmV0dXJuIGEgbGlua2luZyBmdW5jdGlvbiBpZiB3ZSBoYXZlIGZvdW5kIGFueXRoaW5nLCBudWxsIG90aGVyd2lzZVxuICAgICAgcmV0dXJuIGxpbmtGbkZvdW5kID8gY29tcG9zaXRlTGlua0ZuIDogbnVsbDtcblxuICAgICAgZnVuY3Rpb24gY29tcG9zaXRlTGlua0ZuKHNjb3BlLCBub2RlTGlzdCwgJHJvb3RFbGVtZW50LCBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbikge1xuICAgICAgICB2YXIgbm9kZUxpbmtGbiwgY2hpbGRMaW5rRm4sIG5vZGUsIGNoaWxkU2NvcGUsIGksIGlpLCBpZHgsIGNoaWxkQm91bmRUcmFuc2NsdWRlRm47XG4gICAgICAgIHZhciBzdGFibGVOb2RlTGlzdDtcblxuXG4gICAgICAgIGlmIChub2RlTGlua0ZuRm91bmQpIHtcbiAgICAgICAgICAvLyBjb3B5IG5vZGVMaXN0IHNvIHRoYXQgaWYgYSBub2RlTGlua0ZuIHJlbW92ZXMgb3IgYWRkcyBhbiBlbGVtZW50IGF0IHRoaXMgRE9NIGxldmVsIG91clxuICAgICAgICAgIC8vIG9mZnNldHMgZG9uJ3QgZ2V0IHNjcmV3ZWQgdXBcbiAgICAgICAgICB2YXIgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5sZW5ndGg7XG4gICAgICAgICAgc3RhYmxlTm9kZUxpc3QgPSBuZXcgQXJyYXkobm9kZUxpc3RMZW5ndGgpO1xuXG4gICAgICAgICAgLy8gY3JlYXRlIGEgc3BhcnNlIGFycmF5IGJ5IG9ubHkgY29weWluZyB0aGUgZWxlbWVudHMgd2hpY2ggaGF2ZSBhIGxpbmtGblxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5rRm5zLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBpZHggPSBsaW5rRm5zW2ldO1xuICAgICAgICAgICAgc3RhYmxlTm9kZUxpc3RbaWR4XSA9IG5vZGVMaXN0W2lkeF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YWJsZU5vZGVMaXN0ID0gbm9kZUxpc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGxpbmtGbnMubGVuZ3RoOyBpIDwgaWk7KSB7XG4gICAgICAgICAgbm9kZSA9IHN0YWJsZU5vZGVMaXN0W2xpbmtGbnNbaSsrXV07XG4gICAgICAgICAgbm9kZUxpbmtGbiA9IGxpbmtGbnNbaSsrXTtcbiAgICAgICAgICBjaGlsZExpbmtGbiA9IGxpbmtGbnNbaSsrXTtcblxuICAgICAgICAgIGlmIChub2RlTGlua0ZuKSB7XG4gICAgICAgICAgICBpZiAobm9kZUxpbmtGbi5zY29wZSkge1xuICAgICAgICAgICAgICBjaGlsZFNjb3BlID0gc2NvcGUuJG5ldygpO1xuICAgICAgICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVJbmZvKGpxTGl0ZShub2RlKSwgY2hpbGRTY29wZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZFNjb3BlID0gc2NvcGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4gPSBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihcbiAgICAgICAgICAgICAgICAgIHNjb3BlLCBub2RlTGlua0ZuLnRyYW5zY2x1ZGUsIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICghbm9kZUxpbmtGbi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQgJiYgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pIHtcbiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbiAmJiB0cmFuc2NsdWRlRm4pIHtcbiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCB0cmFuc2NsdWRlRm4pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZUxpbmtGbihjaGlsZExpbmtGbiwgY2hpbGRTY29wZSwgbm9kZSwgJHJvb3RFbGVtZW50LCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTtcblxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRMaW5rRm4pIHtcbiAgICAgICAgICAgIGNoaWxkTGlua0ZuKHNjb3BlLCBub2RlLmNoaWxkTm9kZXMsIHVuZGVmaW5lZCwgcGFyZW50Qm91bmRUcmFuc2NsdWRlRm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uc2VjdXRpdmVUZXh0Tm9kZXMobm9kZUxpc3QsIGlkeCwgbm90TGl2ZUxpc3QpIHtcbiAgICAgIHZhciBub2RlID0gbm9kZUxpc3RbaWR4XTtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICB2YXIgc2libGluZztcblxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5PREVfVFlQRV9URVhUKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgc2libGluZyA9IHBhcmVudCA/IG5vZGUubmV4dFNpYmxpbmcgOiBub2RlTGlzdFtpZHggKyAxXTtcbiAgICAgICAgaWYgKCFzaWJsaW5nIHx8IHNpYmxpbmcubm9kZVR5cGUgIT09IE5PREVfVFlQRV9URVhUKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLm5vZGVWYWx1ZSA9IG5vZGUubm9kZVZhbHVlICsgc2libGluZy5ub2RlVmFsdWU7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHNpYmxpbmcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm90TGl2ZUxpc3QgJiYgc2libGluZyA9PT0gbm9kZUxpc3RbaWR4ICsgMV0pIHtcbiAgICAgICAgICBub2RlTGlzdC5zcGxpY2UoaWR4ICsgMSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCb3VuZFRyYW5zY2x1ZGVGbihzY29wZSwgdHJhbnNjbHVkZUZuLCBwcmV2aW91c0JvdW5kVHJhbnNjbHVkZUZuKSB7XG4gICAgICBmdW5jdGlvbiBib3VuZFRyYW5zY2x1ZGVGbih0cmFuc2NsdWRlZFNjb3BlLCBjbG9uZUZuLCBjb250cm9sbGVycywgZnV0dXJlUGFyZW50RWxlbWVudCwgY29udGFpbmluZ1Njb3BlKSB7XG5cbiAgICAgICAgaWYgKCF0cmFuc2NsdWRlZFNjb3BlKSB7XG4gICAgICAgICAgdHJhbnNjbHVkZWRTY29wZSA9IHNjb3BlLiRuZXcoZmFsc2UsIGNvbnRhaW5pbmdTY29wZSk7XG4gICAgICAgICAgdHJhbnNjbHVkZWRTY29wZS4kJHRyYW5zY2x1ZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFuc2NsdWRlRm4odHJhbnNjbHVkZWRTY29wZSwgY2xvbmVGbiwge1xuICAgICAgICAgIHBhcmVudEJvdW5kVHJhbnNjbHVkZUZuOiBwcmV2aW91c0JvdW5kVHJhbnNjbHVkZUZuLFxuICAgICAgICAgIHRyYW5zY2x1ZGVDb250cm9sbGVyczogY29udHJvbGxlcnMsXG4gICAgICAgICAgZnV0dXJlUGFyZW50RWxlbWVudDogZnV0dXJlUGFyZW50RWxlbWVudFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgbmVlZCAgdG8gYXR0YWNoIHRoZSB0cmFuc2NsdXNpb24gc2xvdHMgb250byB0aGUgYGJvdW5kVHJhbnNjbHVkZUZuYFxuICAgICAgLy8gc28gdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgaW5zaWRlIHRoZSBgY29udHJvbGxlcnNCb3VuZFRyYW5zY2x1ZGVgIGZ1bmN0aW9uXG4gICAgICB2YXIgYm91bmRTbG90cyA9IGJvdW5kVHJhbnNjbHVkZUZuLiQkc2xvdHMgPSBjcmVhdGVNYXAoKTtcbiAgICAgIGZvciAodmFyIHNsb3ROYW1lIGluIHRyYW5zY2x1ZGVGbi4kJHNsb3RzKSB7XG4gICAgICAgIGlmICh0cmFuc2NsdWRlRm4uJCRzbG90c1tzbG90TmFtZV0pIHtcbiAgICAgICAgICBib3VuZFNsb3RzW3Nsb3ROYW1lXSA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCB0cmFuc2NsdWRlRm4uJCRzbG90c1tzbG90TmFtZV0sIHByZXZpb3VzQm91bmRUcmFuc2NsdWRlRm4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvdW5kU2xvdHNbc2xvdE5hbWVdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYm91bmRUcmFuc2NsdWRlRm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9va3MgZm9yIGRpcmVjdGl2ZXMgb24gdGhlIGdpdmVuIG5vZGUgYW5kIGFkZHMgdGhlbSB0byB0aGUgZGlyZWN0aXZlIGNvbGxlY3Rpb24gd2hpY2ggaXNcbiAgICAgKiBzb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gZGlyZWN0aXZlcyBBbiBhcnJheSB0byB3aGljaCB0aGUgZGlyZWN0aXZlcyBhcmUgYWRkZWQgdG8uIFRoaXMgYXJyYXkgaXMgc29ydGVkIGJlZm9yZVxuICAgICAqICAgICAgICB0aGUgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIHNoYXJlZCBhdHRycyBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgbm9ybWFsaXplZCBhdHRyaWJ1dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gbWF4UHJpb3JpdHkgTWF4IGRpcmVjdGl2ZSBwcmlvcml0eS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb2xsZWN0RGlyZWN0aXZlcyhub2RlLCBkaXJlY3RpdmVzLCBhdHRycywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSkge1xuICAgICAgdmFyIG5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZSxcbiAgICAgICAgICBhdHRyc01hcCA9IGF0dHJzLiRhdHRyLFxuICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgIG5vZGVOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZTtcblxuICAgICAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgICAgICBjYXNlIE5PREVfVFlQRV9FTEVNRU5UOiAvKiBFbGVtZW50ICovXG5cbiAgICAgICAgICBub2RlTmFtZSA9IG5vZGVOYW1lXyhub2RlKTtcblxuICAgICAgICAgIC8vIHVzZSB0aGUgbm9kZSBuYW1lOiA8ZGlyZWN0aXZlPlxuICAgICAgICAgIGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLFxuICAgICAgICAgICAgICBkaXJlY3RpdmVOb3JtYWxpemUobm9kZU5hbWUpLCAnRScsIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUpO1xuXG4gICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgZm9yICh2YXIgYXR0ciwgbmFtZSwgbk5hbWUsIG5nQXR0ck5hbWUsIHZhbHVlLCBpc05nQXR0ciwgbkF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgIGogPSAwLCBqaiA9IG5BdHRycyAmJiBuQXR0cnMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgdmFyIGF0dHJTdGFydE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBhdHRyRW5kTmFtZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBhdHRyID0gbkF0dHJzW2pdO1xuICAgICAgICAgICAgbmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgICAgIHZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgICAgICAgICAgLy8gc3VwcG9ydCBuZ0F0dHIgYXR0cmlidXRlIGJpbmRpbmdcbiAgICAgICAgICAgIG5nQXR0ck5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUobmFtZSk7XG4gICAgICAgICAgICBpc05nQXR0ciA9IE5HX0FUVFJfQklORElORy50ZXN0KG5nQXR0ck5hbWUpO1xuICAgICAgICAgICAgaWYgKGlzTmdBdHRyKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoUFJFRklYX1JFR0VYUCwgJycpXG4gICAgICAgICAgICAgICAgLnN1YnN0cig4KS5yZXBsYWNlKC9fKC4pL2csIGZ1bmN0aW9uKG1hdGNoLCBsZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG11bHRpRWxlbWVudE1hdGNoID0gbmdBdHRyTmFtZS5tYXRjaChNVUxUSV9FTEVNRU5UX0RJUl9SRSk7XG4gICAgICAgICAgICBpZiAobXVsdGlFbGVtZW50TWF0Y2ggJiYgZGlyZWN0aXZlSXNNdWx0aUVsZW1lbnQobXVsdGlFbGVtZW50TWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgIGF0dHJTdGFydE5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICBhdHRyRW5kTmFtZSA9IG5hbWUuc3Vic3RyKDAsIG5hbWUubGVuZ3RoIC0gNSkgKyAnZW5kJztcbiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDAsIG5hbWUubGVuZ3RoIC0gNik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5OYW1lID0gZGlyZWN0aXZlTm9ybWFsaXplKG5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBhdHRyc01hcFtuTmFtZV0gPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGlzTmdBdHRyIHx8ICFhdHRycy5oYXNPd25Qcm9wZXJ0eShuTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0Qm9vbGVhbkF0dHJOYW1lKG5vZGUsIG5OYW1lKSkge1xuICAgICAgICAgICAgICAgICAgYXR0cnNbbk5hbWVdID0gdHJ1ZTsgLy8gcHJlc2VuY2UgbWVhbnMgdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZEF0dHJJbnRlcnBvbGF0ZURpcmVjdGl2ZShub2RlLCBkaXJlY3RpdmVzLCB2YWx1ZSwgbk5hbWUsIGlzTmdBdHRyKTtcbiAgICAgICAgICAgIGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLCBuTmFtZSwgJ0EnLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBhdHRyU3RhcnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyRW5kTmFtZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIG5vZGUuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAvLyBIaWRkZW4gaW5wdXQgZWxlbWVudHMgY2FuIGhhdmUgc3RyYW5nZSBiZWhhdmlvdXIgd2hlbiBuYXZpZ2F0aW5nIGJhY2sgdG8gdGhlIHBhZ2VcbiAgICAgICAgICAgIC8vIFRoaXMgdGVsbHMgdGhlIGJyb3dzZXIgbm90IHRvIHRyeSB0byBjYWNoZSBhbmQgcmVpbnN0YXRlIHByZXZpb3VzIHZhbHVlc1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdvZmYnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB1c2UgY2xhc3MgYXMgZGlyZWN0aXZlXG4gICAgICAgICAgaWYgKCFjc3NDbGFzc0RpcmVjdGl2ZXNFbmFibGVkKSBicmVhaztcbiAgICAgICAgICBjbGFzc05hbWUgPSBub2RlLmNsYXNzTmFtZTtcbiAgICAgICAgICBpZiAoaXNPYmplY3QoY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICAvLyBNYXliZSBTVkdBbmltYXRlZFN0cmluZ1xuICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuYW5pbVZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzU3RyaW5nKGNsYXNzTmFtZSkgJiYgY2xhc3NOYW1lICE9PSAnJykge1xuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IENMQVNTX0RJUkVDVElWRV9SRUdFWFAuZXhlYyhjbGFzc05hbWUpKSkge1xuICAgICAgICAgICAgICBuTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShtYXRjaFsyXSk7XG4gICAgICAgICAgICAgIGlmIChhZGREaXJlY3RpdmUoZGlyZWN0aXZlcywgbk5hbWUsICdDJywgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBhdHRyc1tuTmFtZV0gPSB0cmltKG1hdGNoWzNdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTk9ERV9UWVBFX1RFWFQ6IC8qIFRleHQgTm9kZSAqL1xuICAgICAgICAgIGFkZFRleHRJbnRlcnBvbGF0ZURpcmVjdGl2ZShkaXJlY3RpdmVzLCBub2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTk9ERV9UWVBFX0NPTU1FTlQ6IC8qIENvbW1lbnQgKi9cbiAgICAgICAgICBpZiAoIWNvbW1lbnREaXJlY3RpdmVzRW5hYmxlZCkgYnJlYWs7XG4gICAgICAgICAgY29sbGVjdENvbW1lbnREaXJlY3RpdmVzKG5vZGUsIGRpcmVjdGl2ZXMsIGF0dHJzLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGlyZWN0aXZlcy5zb3J0KGJ5UHJpb3JpdHkpO1xuICAgICAgcmV0dXJuIGRpcmVjdGl2ZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29sbGVjdENvbW1lbnREaXJlY3RpdmVzKG5vZGUsIGRpcmVjdGl2ZXMsIGF0dHJzLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKSB7XG4gICAgICAvLyBmdW5jdGlvbiBjcmVhdGVkIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UsIHRyeS9jYXRjaCBkaXNhYmxlc1xuICAgICAgLy8gdGhlIG9wdGltaXphdGlvbiBvZiB0aGUgd2hvbGUgZnVuY3Rpb24gIzE0ODQ4XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbWF0Y2ggPSBDT01NRU5UX0RJUkVDVElWRV9SRUdFWFAuZXhlYyhub2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhciBuTmFtZSA9IGRpcmVjdGl2ZU5vcm1hbGl6ZShtYXRjaFsxXSk7XG4gICAgICAgICAgaWYgKGFkZERpcmVjdGl2ZShkaXJlY3RpdmVzLCBuTmFtZSwgJ00nLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlKSkge1xuICAgICAgICAgICAgYXR0cnNbbk5hbWVdID0gdHJpbShtYXRjaFsyXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHR1cm5zIG91dCB0aGF0IHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBJRTkgdGhyb3dzIGVycm9ycyB3aGVuIG9uZSBhdHRlbXB0cyB0byByZWFkXG4gICAgICAgIC8vIGNvbW1lbnQncyBub2RlIHZhbHVlLlxuICAgICAgICAvLyBKdXN0IGlnbm9yZSBpdCBhbmQgY29udGludWUuIChDYW4ndCBzZWVtIHRvIHJlcHJvZHVjZSBpbiB0ZXN0IGNhc2UuKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgbm9kZSB3aXRoIGEgZGlyZWN0aXZlLXN0YXJ0IGl0IGNvbGxlY3RzIGFsbCBvZiB0aGUgc2libGluZ3MgdW50aWwgaXQgZmluZHNcbiAgICAgKiBkaXJlY3RpdmUtZW5kLlxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICogQHBhcmFtIGF0dHJTdGFydFxuICAgICAqIEBwYXJhbSBhdHRyRW5kXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ3JvdXBTY2FuKG5vZGUsIGF0dHJTdGFydCwgYXR0ckVuZCkge1xuICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICB2YXIgZGVwdGggPSAwO1xuICAgICAgaWYgKGF0dHJTdGFydCAmJiBub2RlLmhhc0F0dHJpYnV0ZSAmJiBub2RlLmhhc0F0dHJpYnV0ZShhdHRyU3RhcnQpKSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCd1dGVyZGlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAnVW50ZXJtaW5hdGVkIGF0dHJpYnV0ZSwgZm91bmQgXFwnezB9XFwnIGJ1dCBubyBtYXRjaGluZyBcXCd7MX1cXCcgZm91bmQuJyxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyU3RhcnQsIGF0dHJFbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0VMRU1FTlQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyU3RhcnQpKSBkZXB0aCsrO1xuICAgICAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJFbmQpKSBkZXB0aC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9IHdoaWxlIChkZXB0aCA+IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGpxTGl0ZShub2Rlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JhcHBlciBmb3IgbGlua2luZyBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBub3JtYWwgbGlua2luZyBmdW5jdGlvbiBpbnRvIGEgZ3JvdXBlZFxuICAgICAqIGxpbmtpbmcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIGxpbmtGblxuICAgICAqIEBwYXJhbSBhdHRyU3RhcnRcbiAgICAgKiBAcGFyYW0gYXR0ckVuZFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBncm91cEVsZW1lbnRzTGlua0ZuV3JhcHBlcihsaW5rRm4sIGF0dHJTdGFydCwgYXR0ckVuZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdyb3VwZWRFbGVtZW50c0xpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVycywgdHJhbnNjbHVkZUZuKSB7XG4gICAgICAgIGVsZW1lbnQgPSBncm91cFNjYW4oZWxlbWVudFswXSwgYXR0clN0YXJ0LCBhdHRyRW5kKTtcbiAgICAgICAgcmV0dXJuIGxpbmtGbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIGdlbmVyYXRvciB0aGF0IGlzIHVzZWQgdG8gc3VwcG9ydCBib3RoIGVhZ2VyIGFuZCBsYXp5IGNvbXBpbGF0aW9uXG4gICAgICogbGlua2luZyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gZWFnZXJcbiAgICAgKiBAcGFyYW0gJGNvbXBpbGVOb2Rlc1xuICAgICAqIEBwYXJhbSB0cmFuc2NsdWRlRm5cbiAgICAgKiBAcGFyYW0gbWF4UHJpb3JpdHlcbiAgICAgKiBAcGFyYW0gaWdub3JlRGlyZWN0aXZlXG4gICAgICogQHBhcmFtIHByZXZpb3VzQ29tcGlsZUNvbnRleHRcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGlsYXRpb25HZW5lcmF0b3IoZWFnZXIsICRjb21waWxlTm9kZXMsIHRyYW5zY2x1ZGVGbiwgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwgcHJldmlvdXNDb21waWxlQ29udGV4dCkge1xuICAgICAgdmFyIGNvbXBpbGVkO1xuXG4gICAgICBpZiAoZWFnZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGUoJGNvbXBpbGVOb2RlcywgdHJhbnNjbHVkZUZuLCBtYXhQcmlvcml0eSwgaWdub3JlRGlyZWN0aXZlLCBwcmV2aW91c0NvbXBpbGVDb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAvKiogQHRoaXMgKi8gZnVuY3Rpb24gbGF6eUNvbXBpbGF0aW9uKCkge1xuICAgICAgICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgICAgICAgY29tcGlsZWQgPSBjb21waWxlKCRjb21waWxlTm9kZXMsIHRyYW5zY2x1ZGVGbiwgbWF4UHJpb3JpdHksIGlnbm9yZURpcmVjdGl2ZSwgcHJldmlvdXNDb21waWxlQ29udGV4dCk7XG5cbiAgICAgICAgICAvLyBOdWxsIG91dCBhbGwgb2YgdGhlc2UgcmVmZXJlbmNlcyBpbiBvcmRlciB0byBtYWtlIHRoZW0gZWxpZ2libGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvblxuICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYSBwb3RlbnRpYWxseSBsb25nIGxpdmVkIGNsb3N1cmVcbiAgICAgICAgICAkY29tcGlsZU5vZGVzID0gdHJhbnNjbHVkZUZuID0gcHJldmlvdXNDb21waWxlQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBpbGVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uY2UgdGhlIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZCwgdGhlaXIgY29tcGlsZSBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkLiBUaGlzIG1ldGhvZFxuICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBpbmxpbmluZyBkaXJlY3RpdmUgdGVtcGxhdGVzIGFzIHdlbGwgYXMgdGVybWluYXRpbmcgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogb2YgdGhlIGRpcmVjdGl2ZXMgaWYgdGhlIHRlcm1pbmFsIGRpcmVjdGl2ZSBoYXMgYmVlbiByZWFjaGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGlyZWN0aXZlcyBBcnJheSBvZiBjb2xsZWN0ZWQgZGlyZWN0aXZlcyB0byBleGVjdXRlIHRoZWlyIGNvbXBpbGUgZnVuY3Rpb24uXG4gICAgICogICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgcHJlLXNvcnRlZCBieSBwcmlvcml0eSBvcmRlci5cbiAgICAgKiBAcGFyYW0ge05vZGV9IGNvbXBpbGVOb2RlIFRoZSByYXcgRE9NIG5vZGUgdG8gYXBwbHkgdGhlIGNvbXBpbGUgZnVuY3Rpb25zIHRvXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlQXR0cnMgVGhlIHNoYXJlZCBhdHRyaWJ1dGUgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFuZ3VsYXIuU2NvcGUsIGNsb25lQXR0YWNoRm49KX0gdHJhbnNjbHVkZUZuIEEgbGlua2luZyBmdW5jdGlvbiwgd2hlcmUgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlIGFyZ3VtZW50IGlzIGF1dG8tZ2VuZXJhdGVkIHRvIHRoZSBuZXdcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgb2YgdGhlIHRyYW5zY2x1ZGVkIHBhcmVudCBzY29wZS5cbiAgICAgKiBAcGFyYW0ge0pRTGl0ZX0ganFDb2xsZWN0aW9uIElmIHdlIGFyZSB3b3JraW5nIG9uIHRoZSByb290IG9mIHRoZSBjb21waWxlIHRyZWUgdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCBoYXMgdGhlIHJvb3QganFMaXRlIGFycmF5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2Ugbm9kZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGl0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3JpZ2luYWxSZXBsYWNlRGlyZWN0aXZlIEFuIG9wdGlvbmFsIGRpcmVjdGl2ZSB0aGF0IHdpbGwgYmUgaWdub3JlZCB3aGVuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nIHRoZSB0cmFuc2NsdXNpb24uXG4gICAgICogQHBhcmFtIHtBcnJheS48RnVuY3Rpb24+fSBwcmVMaW5rRm5zXG4gICAgICogQHBhcmFtIHtBcnJheS48RnVuY3Rpb24+fSBwb3N0TGlua0Zuc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcmV2aW91c0NvbXBpbGVDb250ZXh0IENvbnRleHQgdXNlZCBmb3IgcHJldmlvdXMgY29tcGlsYXRpb24gb2YgdGhlIGN1cnJlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBsaW5rRm5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcHBseURpcmVjdGl2ZXNUb05vZGUoZGlyZWN0aXZlcywgY29tcGlsZU5vZGUsIHRlbXBsYXRlQXR0cnMsIHRyYW5zY2x1ZGVGbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganFDb2xsZWN0aW9uLCBvcmlnaW5hbFJlcGxhY2VEaXJlY3RpdmUsIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0KSB7XG4gICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0ID0gcHJldmlvdXNDb21waWxlQ29udGV4dCB8fCB7fTtcblxuICAgICAgdmFyIHRlcm1pbmFsUHJpb3JpdHkgPSAtTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICBuZXdTY29wZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQubmV3U2NvcGVEaXJlY3RpdmUsXG4gICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXMgPSBwcmV2aW91c0NvbXBpbGVDb250ZXh0LmNvbnRyb2xsZXJEaXJlY3RpdmVzLFxuICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9IHByZXZpb3VzQ29tcGlsZUNvbnRleHQubmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLFxuICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC50ZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5ub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLFxuICAgICAgICAgIGhhc1RyYW5zY2x1ZGVEaXJlY3RpdmUgPSBmYWxzZSxcbiAgICAgICAgICBoYXNUZW1wbGF0ZSA9IGZhbHNlLFxuICAgICAgICAgIGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID0gcHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSxcbiAgICAgICAgICAkY29tcGlsZU5vZGUgPSB0ZW1wbGF0ZUF0dHJzLiQkZWxlbWVudCA9IGpxTGl0ZShjb21waWxlTm9kZSksXG4gICAgICAgICAgZGlyZWN0aXZlLFxuICAgICAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICAgICAgJHRlbXBsYXRlLFxuICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgPSBvcmlnaW5hbFJlcGxhY2VEaXJlY3RpdmUsXG4gICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSB0cmFuc2NsdWRlRm4sXG4gICAgICAgICAgbGlua0ZuLFxuICAgICAgICAgIGRpZFNjYW5Gb3JNdWx0aXBsZVRyYW5zY2x1c2lvbiA9IGZhbHNlLFxuICAgICAgICAgIG1pZ2h0SGF2ZU11bHRpcGxlVHJhbnNjbHVzaW9uRXJyb3IgPSBmYWxzZSxcbiAgICAgICAgICBkaXJlY3RpdmVWYWx1ZTtcblxuICAgICAgLy8gZXhlY3V0ZXMgYWxsIGRpcmVjdGl2ZXMgb24gdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbaV07XG4gICAgICAgIHZhciBhdHRyU3RhcnQgPSBkaXJlY3RpdmUuJCRzdGFydDtcbiAgICAgICAgdmFyIGF0dHJFbmQgPSBkaXJlY3RpdmUuJCRlbmQ7XG5cbiAgICAgICAgLy8gY29sbGVjdCBtdWx0aWJsb2NrIHNlY3Rpb25zXG4gICAgICAgIGlmIChhdHRyU3RhcnQpIHtcbiAgICAgICAgICAkY29tcGlsZU5vZGUgPSBncm91cFNjYW4oY29tcGlsZU5vZGUsIGF0dHJTdGFydCwgYXR0ckVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgJHRlbXBsYXRlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICh0ZXJtaW5hbFByaW9yaXR5ID4gZGlyZWN0aXZlLnByaW9yaXR5KSB7XG4gICAgICAgICAgYnJlYWs7IC8vIHByZXZlbnQgZnVydGhlciBwcm9jZXNzaW5nIG9mIGRpcmVjdGl2ZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcmVjdGl2ZVZhbHVlID0gZGlyZWN0aXZlLnNjb3BlO1xuXG4gICAgICAgIGlmIChkaXJlY3RpdmVWYWx1ZSkge1xuXG4gICAgICAgICAgLy8gc2tpcCB0aGUgY2hlY2sgZm9yIGRpcmVjdGl2ZXMgd2l0aCBhc3luYyB0ZW1wbGF0ZXMsIHdlJ2xsIGNoZWNrIHRoZSBkZXJpdmVkIHN5bmNcbiAgICAgICAgICAvLyBkaXJlY3RpdmUgd2hlbiB0aGUgdGVtcGxhdGUgYXJyaXZlc1xuICAgICAgICAgIGlmICghZGlyZWN0aXZlLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZGlyZWN0aXZlVmFsdWUpKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgZGlyZWN0aXZlIGlzIHRyeWluZyB0byBhZGQgYW4gaXNvbGF0ZWQgc2NvcGUuXG4gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgaXMgbm8gc2NvcGUgb2YgYW55IGtpbmQgYWxyZWFkeVxuICAgICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgnbmV3L2lzb2xhdGVkIHNjb3BlJywgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIHx8IG5ld1Njb3BlRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7XG4gICAgICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgZGlyZWN0aXZlIGlzIHRyeWluZyB0byBhZGQgYSBjaGlsZCBzY29wZS5cbiAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBpc29sYXRlZCBzY29wZSBhbHJlYWR5XG4gICAgICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCduZXcvaXNvbGF0ZWQgc2NvcGUnLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsIGRpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBpbGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdTY29wZURpcmVjdGl2ZSA9IG5ld1Njb3BlRGlyZWN0aXZlIHx8IGRpcmVjdGl2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmUubmFtZTtcblxuICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBjb25kaXRpb24gdGhhdCBjYW4gcmVzdWx0IGluIHRyYW5zY2x1c2lvbiBvbiB0aGUgZGlyZWN0aXZlLFxuICAgICAgICAvLyB0aGVuIHNjYW4gYWhlYWQgaW4gdGhlIHJlbWFpbmluZyBkaXJlY3RpdmVzIGZvciBvdGhlcnMgdGhhdCBtYXkgY2F1c2UgYSBtdWx0aXBsZVxuICAgICAgICAvLyB0cmFuc2NsdXNpb24gZXJyb3IgdG8gYmUgdGhyb3duIGR1cmluZyB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4gIElmIGEgbWF0Y2hpbmcgZGlyZWN0aXZlXG4gICAgICAgIC8vIGlzIGZvdW5kLCB0aGVuIHdlIGtub3cgdGhhdCB3aGVuIHdlIGVuY291bnRlciBhIHRyYW5zY2x1ZGVkIGRpcmVjdGl2ZSwgd2UgbmVlZCB0byBlYWdlcmx5XG4gICAgICAgIC8vIGNvbXBpbGUgdGhlIGB0cmFuc2NsdWRlYCBmdW5jdGlvbiByYXRoZXIgdGhhbiBkb2luZyBpdCBsYXppbHkgaW4gb3JkZXIgdG8gdGhyb3dcbiAgICAgICAgLy8gZXhjZXB0aW9ucyBhdCB0aGUgY29ycmVjdCB0aW1lXG4gICAgICAgIGlmICghZGlkU2NhbkZvck11bHRpcGxlVHJhbnNjbHVzaW9uICYmICgoZGlyZWN0aXZlLnJlcGxhY2UgJiYgKGRpcmVjdGl2ZS50ZW1wbGF0ZVVybCB8fCBkaXJlY3RpdmUudGVtcGxhdGUpKVxuICAgICAgICAgICAgfHwgKGRpcmVjdGl2ZS50cmFuc2NsdWRlICYmICFkaXJlY3RpdmUuJCR0bGIpKSkge1xuICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGVEaXJlY3RpdmU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBzY2FubmluZ0luZGV4ID0gaSArIDE7IChjYW5kaWRhdGVEaXJlY3RpdmUgPSBkaXJlY3RpdmVzW3NjYW5uaW5nSW5kZXgrK10pOykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbmRpZGF0ZURpcmVjdGl2ZS50cmFuc2NsdWRlICYmICFjYW5kaWRhdGVEaXJlY3RpdmUuJCR0bGIpXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2FuZGlkYXRlRGlyZWN0aXZlLnJlcGxhY2UgJiYgKGNhbmRpZGF0ZURpcmVjdGl2ZS50ZW1wbGF0ZVVybCB8fCBjYW5kaWRhdGVEaXJlY3RpdmUudGVtcGxhdGUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlnaHRIYXZlTXVsdGlwbGVUcmFuc2NsdXNpb25FcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRpZFNjYW5Gb3JNdWx0aXBsZVRyYW5zY2x1c2lvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpcmVjdGl2ZS50ZW1wbGF0ZVVybCAmJiBkaXJlY3RpdmUuY29udHJvbGxlcikge1xuICAgICAgICAgIGNvbnRyb2xsZXJEaXJlY3RpdmVzID0gY29udHJvbGxlckRpcmVjdGl2ZXMgfHwgY3JlYXRlTWFwKCk7XG4gICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ1xcJycgKyBkaXJlY3RpdmVOYW1lICsgJ1xcJyBjb250cm9sbGVyJyxcbiAgICAgICAgICAgICAgY29udHJvbGxlckRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0sIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTtcbiAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlc1tkaXJlY3RpdmVOYW1lXSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpcmVjdGl2ZVZhbHVlID0gZGlyZWN0aXZlLnRyYW5zY2x1ZGU7XG5cbiAgICAgICAgaWYgKGRpcmVjdGl2ZVZhbHVlKSB7XG4gICAgICAgICAgaGFzVHJhbnNjbHVkZURpcmVjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgbmdJZiBhbmQgbmdSZXBlYXQgc28gdGhhdCB3ZSBkb24ndCBjb21wbGFpbiBhYm91dCBkdXBsaWNhdGUgdHJhbnNjbHVzaW9uLlxuICAgICAgICAgIC8vIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgZGlyZWN0aXZlcyB0aGF0IGtub3cgaG93IHRvIHNhZmVseSBoYW5kbGUgZWxlbWVudCB0cmFuc2NsdXNpb24sXG4gICAgICAgICAgLy8gd2hlcmUgdGhlIHRyYW5zY2x1ZGVkIG5vZGVzIGFyZSBhZGRlZCBvciByZXBsYWNlZCBhZnRlciBsaW5raW5nLlxuICAgICAgICAgIGlmICghZGlyZWN0aXZlLiQkdGxiKSB7XG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZSgndHJhbnNjbHVzaW9uJywgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSwgZGlyZWN0aXZlLCAkY29tcGlsZU5vZGUpO1xuICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGlyZWN0aXZlVmFsdWUgPT09ICdlbGVtZW50Jykge1xuICAgICAgICAgICAgaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGVybWluYWxQcmlvcml0eSA9IGRpcmVjdGl2ZS5wcmlvcml0eTtcbiAgICAgICAgICAgICR0ZW1wbGF0ZSA9ICRjb21waWxlTm9kZTtcbiAgICAgICAgICAgICRjb21waWxlTm9kZSA9IHRlbXBsYXRlQXR0cnMuJCRlbGVtZW50ID1cbiAgICAgICAgICAgICAgICBqcUxpdGUoY29tcGlsZS4kJGNyZWF0ZUNvbW1lbnQoZGlyZWN0aXZlTmFtZSwgdGVtcGxhdGVBdHRyc1tkaXJlY3RpdmVOYW1lXSkpO1xuICAgICAgICAgICAgY29tcGlsZU5vZGUgPSAkY29tcGlsZU5vZGVbMF07XG4gICAgICAgICAgICByZXBsYWNlV2l0aChqcUNvbGxlY3Rpb24sIHNsaWNlQXJncygkdGVtcGxhdGUpLCBjb21waWxlTm9kZSk7XG5cbiAgICAgICAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8IDUwXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy8xNDA0MVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgdmVyc2lvbnMgb2YgVjggcHJpb3IgdG8gQ2hyb21lIDUwLCB0aGUgZG9jdW1lbnQgZnJhZ21lbnQgdGhhdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAvLyBpbiB0aGUgYHJlcGxhY2VXaXRoYCBmdW5jdGlvbiBpcyBpbXByb3Blcmx5IGdhcmJhZ2UgY29sbGVjdGVkIGRlc3BpdGUgc3RpbGxcbiAgICAgICAgICAgIC8vIGJlaW5nIHJlZmVyZW5jZWQgYnkgdGhlIGBwYXJlbnROb2RlYCBwcm9wZXJ0eSBvZiBhbGwgb2YgdGhlIGNoaWxkIG5vZGVzLiAgQnkgYWRkaW5nXG4gICAgICAgICAgICAvLyBhIHJlZmVyZW5jZSB0byB0aGUgZnJhZ21lbnQgdmlhIGEgZGlmZmVyZW50IHByb3BlcnR5LCB3ZSBjYW4gYXZvaWQgdGhhdCBpbmNvcnJlY3RcbiAgICAgICAgICAgIC8vIGJlaGF2aW9yLlxuICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgbGluZSBhZnRlciBDaHJvbWUgNTAgaGFzIGJlZW4gcmVsZWFzZWRcbiAgICAgICAgICAgICR0ZW1wbGF0ZVswXS4kJHBhcmVudE5vZGUgPSAkdGVtcGxhdGVbMF0ucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4gPSBjb21waWxhdGlvbkdlbmVyYXRvcihtaWdodEhhdmVNdWx0aXBsZVRyYW5zY2x1c2lvbkVycm9yLCAkdGVtcGxhdGUsIHRyYW5zY2x1ZGVGbiwgdGVybWluYWxQcmlvcml0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRGlyZWN0aXZlICYmIHJlcGxhY2VEaXJlY3RpdmUubmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcGFzcyBpbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gY29udHJvbGxlckRpcmVjdGl2ZXMgLSBvdGhlcndpc2Ugd2UnbGwgY3JlYXRlIGR1cGxpY2F0ZXMgY29udHJvbGxlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIG9yIHRlbXBsYXRlRGlyZWN0aXZlIC0gY29tYmluaW5nIHRlbXBsYXRlcyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVsZW1lbnQgdHJhbnNjbHVzaW9uIGRvZXNuJ3QgbWFrZSBzZW5zZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIG9ubHkgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZSBzbyB0aGF0IHdlIHByZXZlbnQgcHV0dGluZyB0cmFuc2NsdXNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBzYW1lIGVsZW1lbnQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlOiBub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgdmFyIHNsb3RzID0gY3JlYXRlTWFwKCk7XG5cbiAgICAgICAgICAgIGlmICghaXNPYmplY3QoZGlyZWN0aXZlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IGpxTGl0ZShqcUxpdGVDbG9uZShjb21waWxlTm9kZSkpLmNvbnRlbnRzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgdHJhbnNjbHVzaW9uIHNsb3RzLFxuICAgICAgICAgICAgICAvLyBjb2xsZWN0IHRoZW0gdXAsIGNvbXBpbGUgdGhlbSBhbmQgc3RvcmUgdGhlaXIgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAkdGVtcGxhdGUgPSBbXTtcblxuICAgICAgICAgICAgICB2YXIgc2xvdE1hcCA9IGNyZWF0ZU1hcCgpO1xuICAgICAgICAgICAgICB2YXIgZmlsbGVkU2xvdHMgPSBjcmVhdGVNYXAoKTtcblxuICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgZWxlbWVudCBzZWxlY3RvcnNcbiAgICAgICAgICAgICAgZm9yRWFjaChkaXJlY3RpdmVWYWx1ZSwgZnVuY3Rpb24oZWxlbWVudFNlbGVjdG9yLCBzbG90TmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGFuIGVsZW1lbnQgc2VsZWN0b3Igc3RhcnRzIHdpdGggYSA/IHRoZW4gaXQgaXMgb3B0aW9uYWxcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9uYWwgPSAoZWxlbWVudFNlbGVjdG9yLmNoYXJBdCgwKSA9PT0gJz8nKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3IgPSBvcHRpb25hbCA/IGVsZW1lbnRTZWxlY3Rvci5zdWJzdHJpbmcoMSkgOiBlbGVtZW50U2VsZWN0b3I7XG5cbiAgICAgICAgICAgICAgICBzbG90TWFwW2VsZW1lbnRTZWxlY3Rvcl0gPSBzbG90TmFtZTtcblxuICAgICAgICAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgYXNzaWduIGBudWxsYCBzaW5jZSB0aGlzIGltcGxpZXMgdGhhdCBhIHNsb3Qgd2FzIGRlZmluZWQgYnV0IG5vdCBmaWxsZWQuXG4gICAgICAgICAgICAgICAgLy8gTGF0ZXIgd2hlbiBjYWxsaW5nIGJvdW5kVHJhbnNjbHVzaW9uIGZ1bmN0aW9ucyB3aXRoIGEgc2xvdCBuYW1lIHdlIG9ubHkgZXJyb3IgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gc2xvdCBpcyBgdW5kZWZpbmVkYFxuICAgICAgICAgICAgICAgIHNsb3RzW3Nsb3ROYW1lXSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWxsZWRTbG90cyBjb250YWlucyBgdHJ1ZWAgZm9yIGFsbCBzbG90cyB0aGF0IGFyZSBlaXRoZXIgb3B0aW9uYWwgb3IgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gZmlsbGVkLiBUaGlzIGlzIHVzZWQgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBtaXNzZWQgYW55IHJlcXVpcmVkIHNsb3RzXG4gICAgICAgICAgICAgICAgZmlsbGVkU2xvdHNbc2xvdE5hbWVdID0gb3B0aW9uYWw7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEFkZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW50byB0aGVpciBzbG90XG4gICAgICAgICAgICAgIGZvckVhY2goJGNvbXBpbGVOb2RlLmNvbnRlbnRzKCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2xvdE5hbWUgPSBzbG90TWFwW2RpcmVjdGl2ZU5vcm1hbGl6ZShub2RlTmFtZV8obm9kZSkpXTtcbiAgICAgICAgICAgICAgICBpZiAoc2xvdE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIGZpbGxlZFNsb3RzW3Nsb3ROYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBzbG90c1tzbG90TmFtZV0gPSBzbG90c1tzbG90TmFtZV0gfHwgW107XG4gICAgICAgICAgICAgICAgICBzbG90c1tzbG90TmFtZV0ucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgJHRlbXBsYXRlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgc2xvdHMgdGhhdCB3ZXJlIG5vdCBmaWxsZWRcbiAgICAgICAgICAgICAgZm9yRWFjaChmaWxsZWRTbG90cywgZnVuY3Rpb24oZmlsbGVkLCBzbG90TmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICghZmlsbGVkKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigncmVxc2xvdCcsICdSZXF1aXJlZCB0cmFuc2NsdXNpb24gc2xvdCBgezB9YCB3YXMgbm90IGZpbGxlZC4nLCBzbG90TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBzbG90TmFtZSBpbiBzbG90cykge1xuICAgICAgICAgICAgICAgIGlmIChzbG90c1tzbG90TmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZGVmaW5lIGEgdHJhbnNjbHVzaW9uIGZ1bmN0aW9uIGlmIHRoZSBzbG90IHdhcyBmaWxsZWRcbiAgICAgICAgICAgICAgICAgIHNsb3RzW3Nsb3ROYW1lXSA9IGNvbXBpbGF0aW9uR2VuZXJhdG9yKG1pZ2h0SGF2ZU11bHRpcGxlVHJhbnNjbHVzaW9uRXJyb3IsIHNsb3RzW3Nsb3ROYW1lXSwgdHJhbnNjbHVkZUZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGNvbXBpbGVOb2RlLmVtcHR5KCk7IC8vIGNsZWFyIGNvbnRlbnRzXG4gICAgICAgICAgICBjaGlsZFRyYW5zY2x1ZGVGbiA9IGNvbXBpbGF0aW9uR2VuZXJhdG9yKG1pZ2h0SGF2ZU11bHRpcGxlVHJhbnNjbHVzaW9uRXJyb3IsICR0ZW1wbGF0ZSwgdHJhbnNjbHVkZUZuLCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB7IG5lZWRzTmV3U2NvcGU6IGRpcmVjdGl2ZS4kJGlzb2xhdGVTY29wZSB8fCBkaXJlY3RpdmUuJCRuZXdTY29wZX0pO1xuICAgICAgICAgICAgY2hpbGRUcmFuc2NsdWRlRm4uJCRzbG90cyA9IHNsb3RzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaXJlY3RpdmUudGVtcGxhdGUpIHtcbiAgICAgICAgICBoYXNUZW1wbGF0ZSA9IHRydWU7XG4gICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGUoJ3RlbXBsYXRlJywgdGVtcGxhdGVEaXJlY3RpdmUsIGRpcmVjdGl2ZSwgJGNvbXBpbGVOb2RlKTtcbiAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcblxuICAgICAgICAgIGRpcmVjdGl2ZVZhbHVlID0gKGlzRnVuY3Rpb24oZGlyZWN0aXZlLnRlbXBsYXRlKSlcbiAgICAgICAgICAgICAgPyBkaXJlY3RpdmUudGVtcGxhdGUoJGNvbXBpbGVOb2RlLCB0ZW1wbGF0ZUF0dHJzKVxuICAgICAgICAgICAgICA6IGRpcmVjdGl2ZS50ZW1wbGF0ZTtcblxuICAgICAgICAgIGRpcmVjdGl2ZVZhbHVlID0gZGVub3JtYWxpemVUZW1wbGF0ZShkaXJlY3RpdmVWYWx1ZSk7XG5cbiAgICAgICAgICBpZiAoZGlyZWN0aXZlLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG4gICAgICAgICAgICBpZiAoanFMaXRlSXNUZXh0Tm9kZShkaXJlY3RpdmVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgJHRlbXBsYXRlID0gW107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAkdGVtcGxhdGUgPSByZW1vdmVDb21tZW50cyh3cmFwVGVtcGxhdGUoZGlyZWN0aXZlLnRlbXBsYXRlTmFtZXNwYWNlLCB0cmltKGRpcmVjdGl2ZVZhbHVlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcGlsZU5vZGUgPSAkdGVtcGxhdGVbMF07XG5cbiAgICAgICAgICAgIGlmICgkdGVtcGxhdGUubGVuZ3RoICE9PSAxIHx8IGNvbXBpbGVOb2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfRUxFTUVOVCkge1xuICAgICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycigndHBscnQnLFxuICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlIGZvciBkaXJlY3RpdmUgXFwnezB9XFwnIG11c3QgaGF2ZSBleGFjdGx5IG9uZSByb290IGVsZW1lbnQuIHsxfScsXG4gICAgICAgICAgICAgICAgICBkaXJlY3RpdmVOYW1lLCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlcGxhY2VXaXRoKGpxQ29sbGVjdGlvbiwgJGNvbXBpbGVOb2RlLCBjb21waWxlTm9kZSk7XG5cbiAgICAgICAgICAgIHZhciBuZXdUZW1wbGF0ZUF0dHJzID0geyRhdHRyOiB7fX07XG5cbiAgICAgICAgICAgIC8vIGNvbWJpbmUgZGlyZWN0aXZlcyBmcm9tIHRoZSBvcmlnaW5hbCBub2RlIGFuZCBmcm9tIHRoZSB0ZW1wbGF0ZTpcbiAgICAgICAgICAgIC8vIC0gdGFrZSB0aGUgYXJyYXkgb2YgZGlyZWN0aXZlcyBmb3IgdGhpcyBlbGVtZW50XG4gICAgICAgICAgICAvLyAtIHNwbGl0IGl0IGludG8gdHdvIHBhcnRzLCB0aG9zZSB0aGF0IGFscmVhZHkgYXBwbGllZCAocHJvY2Vzc2VkKSBhbmQgdGhvc2UgdGhhdCB3ZXJlbid0ICh1bnByb2Nlc3NlZClcbiAgICAgICAgICAgIC8vIC0gY29sbGVjdCBkaXJlY3RpdmVzIGZyb20gdGhlIHRlbXBsYXRlIGFuZCBzb3J0IHRoZW0gYnkgcHJpb3JpdHlcbiAgICAgICAgICAgIC8vIC0gY29tYmluZSBkaXJlY3RpdmVzIGFzOiBwcm9jZXNzZWQgKyB0ZW1wbGF0ZSArIHVucHJvY2Vzc2VkXG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVEaXJlY3RpdmVzID0gY29sbGVjdERpcmVjdGl2ZXMoY29tcGlsZU5vZGUsIFtdLCBuZXdUZW1wbGF0ZUF0dHJzKTtcbiAgICAgICAgICAgIHZhciB1bnByb2Nlc3NlZERpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzLnNwbGljZShpICsgMSwgZGlyZWN0aXZlcy5sZW5ndGggLSAoaSArIDEpKTtcblxuICAgICAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSB8fCBuZXdTY29wZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgZGlyZWN0aXZlIGNhdXNlZCB0aGUgY3VycmVudCBlbGVtZW50IHRvIGJlIHJlcGxhY2VkIGJ1dCB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgLy8gYWxzbyBuZWVkcyB0byBoYXZlIGEgbmV3IHNjb3BlLCBzbyB3ZSBuZWVkIHRvIHRlbGwgdGhlIHRlbXBsYXRlIGRpcmVjdGl2ZXNcbiAgICAgICAgICAgICAgLy8gdGhhdCB0aGV5IHdvdWxkIG5lZWQgdG8gZ2V0IHRoZWlyIHNjb3BlIGZyb20gZnVydGhlciB1cCwgaWYgdGhleSByZXF1aXJlIHRyYW5zY2x1c2lvblxuICAgICAgICAgICAgICBtYXJrRGlyZWN0aXZlU2NvcGUodGVtcGxhdGVEaXJlY3RpdmVzLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsIG5ld1Njb3BlRGlyZWN0aXZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzLmNvbmNhdCh0ZW1wbGF0ZURpcmVjdGl2ZXMpLmNvbmNhdCh1bnByb2Nlc3NlZERpcmVjdGl2ZXMpO1xuICAgICAgICAgICAgbWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXModGVtcGxhdGVBdHRycywgbmV3VGVtcGxhdGVBdHRycyk7XG5cbiAgICAgICAgICAgIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRjb21waWxlTm9kZS5odG1sKGRpcmVjdGl2ZVZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlyZWN0aXZlLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgaGFzVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgICAgIGFzc2VydE5vRHVwbGljYXRlKCd0ZW1wbGF0ZScsIHRlbXBsYXRlRGlyZWN0aXZlLCBkaXJlY3RpdmUsICRjb21waWxlTm9kZSk7XG4gICAgICAgICAgdGVtcGxhdGVEaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG5cbiAgICAgICAgICBpZiAoZGlyZWN0aXZlLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIHJlcGxhY2VEaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZ1bmMtYXNzaWduXG4gICAgICAgICAgbm9kZUxpbmtGbiA9IGNvbXBpbGVUZW1wbGF0ZVVybChkaXJlY3RpdmVzLnNwbGljZShpLCBkaXJlY3RpdmVzLmxlbmd0aCAtIGkpLCAkY29tcGlsZU5vZGUsXG4gICAgICAgICAgICAgIHRlbXBsYXRlQXR0cnMsIGpxQ29sbGVjdGlvbiwgaGFzVHJhbnNjbHVkZURpcmVjdGl2ZSAmJiBjaGlsZFRyYW5zY2x1ZGVGbiwgcHJlTGlua0ZucywgcG9zdExpbmtGbnMsIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyRGlyZWN0aXZlczogY29udHJvbGxlckRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgbmV3U2NvcGVEaXJlY3RpdmU6IChuZXdTY29wZURpcmVjdGl2ZSAhPT0gZGlyZWN0aXZlKSAmJiBuZXdTY29wZURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmU6IG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZURpcmVjdGl2ZTogdGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZTogbm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICBpaSA9IGRpcmVjdGl2ZXMubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGl2ZS5jb21waWxlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpbmtGbiA9IGRpcmVjdGl2ZS5jb21waWxlKCRjb21waWxlTm9kZSwgdGVtcGxhdGVBdHRycywgY2hpbGRUcmFuc2NsdWRlRm4pO1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBkaXJlY3RpdmUuJCRvcmlnaW5hbERpcmVjdGl2ZSB8fCBkaXJlY3RpdmU7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihsaW5rRm4pKSB7XG4gICAgICAgICAgICAgIGFkZExpbmtGbnMobnVsbCwgYmluZChjb250ZXh0LCBsaW5rRm4pLCBhdHRyU3RhcnQsIGF0dHJFbmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5rRm4pIHtcbiAgICAgICAgICAgICAgYWRkTGlua0ZucyhiaW5kKGNvbnRleHQsIGxpbmtGbi5wcmUpLCBiaW5kKGNvbnRleHQsIGxpbmtGbi5wb3N0KSwgYXR0clN0YXJ0LCBhdHRyRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlLCBzdGFydGluZ1RhZygkY29tcGlsZU5vZGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlyZWN0aXZlLnRlcm1pbmFsKSB7XG4gICAgICAgICAgbm9kZUxpbmtGbi50ZXJtaW5hbCA9IHRydWU7XG4gICAgICAgICAgdGVybWluYWxQcmlvcml0eSA9IE1hdGgubWF4KHRlcm1pbmFsUHJpb3JpdHksIGRpcmVjdGl2ZS5wcmlvcml0eSk7XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICBub2RlTGlua0ZuLnNjb3BlID0gbmV3U2NvcGVEaXJlY3RpdmUgJiYgbmV3U2NvcGVEaXJlY3RpdmUuc2NvcGUgPT09IHRydWU7XG4gICAgICBub2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50ID0gaGFzVHJhbnNjbHVkZURpcmVjdGl2ZTtcbiAgICAgIG5vZGVMaW5rRm4udGVtcGxhdGVPblRoaXNFbGVtZW50ID0gaGFzVGVtcGxhdGU7XG4gICAgICBub2RlTGlua0ZuLnRyYW5zY2x1ZGUgPSBjaGlsZFRyYW5zY2x1ZGVGbjtcblxuICAgICAgcHJldmlvdXNDb21waWxlQ29udGV4dC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSA9IGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlO1xuXG4gICAgICAvLyBtaWdodCBiZSBub3JtYWwgb3IgZGVsYXllZCBub2RlTGlua0ZuIGRlcGVuZGluZyBvbiBpZiB0ZW1wbGF0ZVVybCBpcyBwcmVzZW50XG4gICAgICByZXR1cm4gbm9kZUxpbmtGbjtcblxuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgZnVuY3Rpb24gYWRkTGlua0ZucyhwcmUsIHBvc3QsIGF0dHJTdGFydCwgYXR0ckVuZCkge1xuICAgICAgICBpZiAocHJlKSB7XG4gICAgICAgICAgaWYgKGF0dHJTdGFydCkgcHJlID0gZ3JvdXBFbGVtZW50c0xpbmtGbldyYXBwZXIocHJlLCBhdHRyU3RhcnQsIGF0dHJFbmQpO1xuICAgICAgICAgIHByZS5yZXF1aXJlID0gZGlyZWN0aXZlLnJlcXVpcmU7XG4gICAgICAgICAgcHJlLmRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOYW1lO1xuICAgICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgPT09IGRpcmVjdGl2ZSB8fCBkaXJlY3RpdmUuJCRpc29sYXRlU2NvcGUpIHtcbiAgICAgICAgICAgIHByZSA9IGNsb25lQW5kQW5ub3RhdGVGbihwcmUsIHtpc29sYXRlU2NvcGU6IHRydWV9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJlTGlua0Zucy5wdXNoKHByZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc3QpIHtcbiAgICAgICAgICBpZiAoYXR0clN0YXJ0KSBwb3N0ID0gZ3JvdXBFbGVtZW50c0xpbmtGbldyYXBwZXIocG9zdCwgYXR0clN0YXJ0LCBhdHRyRW5kKTtcbiAgICAgICAgICBwb3N0LnJlcXVpcmUgPSBkaXJlY3RpdmUucmVxdWlyZTtcbiAgICAgICAgICBwb3N0LmRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOYW1lO1xuICAgICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgPT09IGRpcmVjdGl2ZSB8fCBkaXJlY3RpdmUuJCRpc29sYXRlU2NvcGUpIHtcbiAgICAgICAgICAgIHBvc3QgPSBjbG9uZUFuZEFubm90YXRlRm4ocG9zdCwge2lzb2xhdGVTY29wZTogdHJ1ZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3N0TGlua0Zucy5wdXNoKHBvc3QpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG5vZGVMaW5rRm4oY2hpbGRMaW5rRm4sIHNjb3BlLCBsaW5rTm9kZSwgJHJvb3RFbGVtZW50LCBib3VuZFRyYW5zY2x1ZGVGbikge1xuICAgICAgICB2YXIgaSwgaWksIGxpbmtGbiwgaXNvbGF0ZVNjb3BlLCBjb250cm9sbGVyU2NvcGUsIGVsZW1lbnRDb250cm9sbGVycywgdHJhbnNjbHVkZUZuLCAkZWxlbWVudCxcbiAgICAgICAgICAgIGF0dHJzLCBzY29wZUJpbmRpbmdJbmZvO1xuXG4gICAgICAgIGlmIChjb21waWxlTm9kZSA9PT0gbGlua05vZGUpIHtcbiAgICAgICAgICBhdHRycyA9IHRlbXBsYXRlQXR0cnM7XG4gICAgICAgICAgJGVsZW1lbnQgPSB0ZW1wbGF0ZUF0dHJzLiQkZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudCA9IGpxTGl0ZShsaW5rTm9kZSk7XG4gICAgICAgICAgYXR0cnMgPSBuZXcgQXR0cmlidXRlcygkZWxlbWVudCwgdGVtcGxhdGVBdHRycyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sbGVyU2NvcGUgPSBzY29wZTtcbiAgICAgICAgaWYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSkge1xuICAgICAgICAgIGlzb2xhdGVTY29wZSA9IHNjb3BlLiRuZXcodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3U2NvcGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICBjb250cm9sbGVyU2NvcGUgPSBzY29wZS4kcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJvdW5kVHJhbnNjbHVkZUZuKSB7XG4gICAgICAgICAgLy8gdHJhY2sgYGJvdW5kVHJhbnNjbHVkZUZuYCBzbyBpdCBjYW4gYmUgdW53cmFwcGVkIGlmIGB0cmFuc2NsdWRlRm5gXG4gICAgICAgICAgLy8gaXMgbGF0ZXIgcGFzc2VkIGFzIGBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbmAgdG8gYHB1YmxpY0xpbmtGbmBcbiAgICAgICAgICB0cmFuc2NsdWRlRm4gPSBjb250cm9sbGVyc0JvdW5kVHJhbnNjbHVkZTtcbiAgICAgICAgICB0cmFuc2NsdWRlRm4uJCRib3VuZFRyYW5zY2x1ZGUgPSBib3VuZFRyYW5zY2x1ZGVGbjtcbiAgICAgICAgICAvLyBleHBvc2UgdGhlIHNsb3RzIG9uIHRoZSBgJHRyYW5zY2x1ZGVgIGZ1bmN0aW9uXG4gICAgICAgICAgdHJhbnNjbHVkZUZuLmlzU2xvdEZpbGxlZCA9IGZ1bmN0aW9uKHNsb3ROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gISFib3VuZFRyYW5zY2x1ZGVGbi4kJHNsb3RzW3Nsb3ROYW1lXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyb2xsZXJEaXJlY3RpdmVzKSB7XG4gICAgICAgICAgZWxlbWVudENvbnRyb2xsZXJzID0gc2V0dXBDb250cm9sbGVycygkZWxlbWVudCwgYXR0cnMsIHRyYW5zY2x1ZGVGbiwgY29udHJvbGxlckRpcmVjdGl2ZXMsIGlzb2xhdGVTY29wZSwgc2NvcGUsIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlKSB7XG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBpc29sYXRlIHNjb3BlIGJpbmRpbmdzIGZvciBuZXcgaXNvbGF0ZSBzY29wZSBkaXJlY3RpdmUuXG4gICAgICAgICAgY29tcGlsZS4kJGFkZFNjb3BlSW5mbygkZWxlbWVudCwgaXNvbGF0ZVNjb3BlLCB0cnVlLCAhKHRlbXBsYXRlRGlyZWN0aXZlICYmICh0ZW1wbGF0ZURpcmVjdGl2ZSA9PT0gbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlIHx8XG4gICAgICAgICAgICAgIHRlbXBsYXRlRGlyZWN0aXZlID09PSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUuJCRvcmlnaW5hbERpcmVjdGl2ZSkpKTtcbiAgICAgICAgICBjb21waWxlLiQkYWRkU2NvcGVDbGFzcygkZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgaXNvbGF0ZVNjb3BlLiQkaXNvbGF0ZUJpbmRpbmdzID1cbiAgICAgICAgICAgICAgbmV3SXNvbGF0ZVNjb3BlRGlyZWN0aXZlLiQkaXNvbGF0ZUJpbmRpbmdzO1xuICAgICAgICAgIHNjb3BlQmluZGluZ0luZm8gPSBpbml0aWFsaXplRGlyZWN0aXZlQmluZGluZ3Moc2NvcGUsIGF0dHJzLCBpc29sYXRlU2NvcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZVNjb3BlLiQkaXNvbGF0ZUJpbmRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSk7XG4gICAgICAgICAgaWYgKHNjb3BlQmluZGluZ0luZm8ucmVtb3ZlV2F0Y2hlcykge1xuICAgICAgICAgICAgaXNvbGF0ZVNjb3BlLiRvbignJGRlc3Ryb3knLCBzY29wZUJpbmRpbmdJbmZvLnJlbW92ZVdhdGNoZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgYmluZFRvQ29udHJvbGxlciBiaW5kaW5nc1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIGVsZW1lbnRDb250cm9sbGVycykge1xuICAgICAgICAgIHZhciBjb250cm9sbGVyRGlyZWN0aXZlID0gY29udHJvbGxlckRpcmVjdGl2ZXNbbmFtZV07XG4gICAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBlbGVtZW50Q29udHJvbGxlcnNbbmFtZV07XG4gICAgICAgICAgdmFyIGJpbmRpbmdzID0gY29udHJvbGxlckRpcmVjdGl2ZS4kJGJpbmRpbmdzLmJpbmRUb0NvbnRyb2xsZXI7XG5cbiAgICAgICAgICBpZiAocHJlQXNzaWduQmluZGluZ3NFbmFibGVkKSB7XG4gICAgICAgICAgICBpZiAoYmluZGluZ3MpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5iaW5kaW5nSW5mbyA9XG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZURpcmVjdGl2ZUJpbmRpbmdzKGNvbnRyb2xsZXJTY29wZSwgYXR0cnMsIGNvbnRyb2xsZXIuaW5zdGFuY2UsIGJpbmRpbmdzLCBjb250cm9sbGVyRGlyZWN0aXZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuYmluZGluZ0luZm8gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbnRyb2xsZXJSZXN1bHQgPSBjb250cm9sbGVyKCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbGxlclJlc3VsdCAhPT0gY29udHJvbGxlci5pbnN0YW5jZSkge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udHJvbGxlciBjb25zdHJ1Y3RvciBoYXMgYSByZXR1cm4gdmFsdWUsIG92ZXJ3cml0ZSB0aGUgaW5zdGFuY2VcbiAgICAgICAgICAgICAgLy8gZnJvbSBzZXR1cENvbnRyb2xsZXJzXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuaW5zdGFuY2UgPSBjb250cm9sbGVyUmVzdWx0O1xuICAgICAgICAgICAgICAkZWxlbWVudC5kYXRhKCckJyArIGNvbnRyb2xsZXJEaXJlY3RpdmUubmFtZSArICdDb250cm9sbGVyJywgY29udHJvbGxlclJlc3VsdCk7XG4gICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmJpbmRpbmdJbmZvLnJlbW92ZVdhdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmJpbmRpbmdJbmZvLnJlbW92ZVdhdGNoZXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250cm9sbGVyLmJpbmRpbmdJbmZvID1cbiAgICAgICAgICAgICAgICBpbml0aWFsaXplRGlyZWN0aXZlQmluZGluZ3MoY29udHJvbGxlclNjb3BlLCBhdHRycywgY29udHJvbGxlci5pbnN0YW5jZSwgYmluZGluZ3MsIGNvbnRyb2xsZXJEaXJlY3RpdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmluc3RhbmNlID0gY29udHJvbGxlcigpO1xuICAgICAgICAgICAgJGVsZW1lbnQuZGF0YSgnJCcgKyBjb250cm9sbGVyRGlyZWN0aXZlLm5hbWUgKyAnQ29udHJvbGxlcicsIGNvbnRyb2xsZXIuaW5zdGFuY2UpO1xuICAgICAgICAgICAgY29udHJvbGxlci5iaW5kaW5nSW5mbyA9XG4gICAgICAgICAgICAgIGluaXRpYWxpemVEaXJlY3RpdmVCaW5kaW5ncyhjb250cm9sbGVyU2NvcGUsIGF0dHJzLCBjb250cm9sbGVyLmluc3RhbmNlLCBiaW5kaW5ncywgY29udHJvbGxlckRpcmVjdGl2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCB0aGUgcmVxdWlyZWQgY29udHJvbGxlcnMgdG8gdGhlIGNvbnRyb2xsZXIsIGlmIGByZXF1aXJlYCBpcyBhbiBvYmplY3QgYW5kIGBiaW5kVG9Db250cm9sbGVyYCBpcyB0cnV0aHlcbiAgICAgICAgZm9yRWFjaChjb250cm9sbGVyRGlyZWN0aXZlcywgZnVuY3Rpb24oY29udHJvbGxlckRpcmVjdGl2ZSwgbmFtZSkge1xuICAgICAgICAgIHZhciByZXF1aXJlID0gY29udHJvbGxlckRpcmVjdGl2ZS5yZXF1aXJlO1xuICAgICAgICAgIGlmIChjb250cm9sbGVyRGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIgJiYgIWlzQXJyYXkocmVxdWlyZSkgJiYgaXNPYmplY3QocmVxdWlyZSkpIHtcbiAgICAgICAgICAgIGV4dGVuZChlbGVtZW50Q29udHJvbGxlcnNbbmFtZV0uaW5zdGFuY2UsIGdldENvbnRyb2xsZXJzKG5hbWUsIHJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdCBhbmQgZGVzdHJveSBsaWZlY3ljbGUgaG9va3Mgb24gYWxsIGNvbnRyb2xsZXJzIHRoYXQgaGF2ZSB0aGVtXG4gICAgICAgIGZvckVhY2goZWxlbWVudENvbnRyb2xsZXJzLCBmdW5jdGlvbihjb250cm9sbGVyKSB7XG4gICAgICAgICAgdmFyIGNvbnRyb2xsZXJJbnN0YW5jZSA9IGNvbnRyb2xsZXIuaW5zdGFuY2U7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29udHJvbGxlckluc3RhbmNlLiRvbkNoYW5nZXMpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb250cm9sbGVySW5zdGFuY2UuJG9uQ2hhbmdlcyhjb250cm9sbGVyLmJpbmRpbmdJbmZvLmluaXRpYWxDaGFuZ2VzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRyb2xsZXJJbnN0YW5jZS4kb25Jbml0KSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29udHJvbGxlckluc3RhbmNlLiRvbkluaXQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRyb2xsZXJJbnN0YW5jZS4kZG9DaGVjaykpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXJTY29wZS4kd2F0Y2goZnVuY3Rpb24oKSB7IGNvbnRyb2xsZXJJbnN0YW5jZS4kZG9DaGVjaygpOyB9KTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXJJbnN0YW5jZS4kZG9DaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjb250cm9sbGVySW5zdGFuY2UuJG9uRGVzdHJveSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXJTY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24gY2FsbE9uRGVzdHJveUhvb2soKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJJbnN0YW5jZS4kb25EZXN0cm95KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBSRUxJTktJTkdcbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBwcmVMaW5rRm5zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICBsaW5rRm4gPSBwcmVMaW5rRm5zW2ldO1xuICAgICAgICAgIGludm9rZUxpbmtGbihsaW5rRm4sXG4gICAgICAgICAgICAgIGxpbmtGbi5pc29sYXRlU2NvcGUgPyBpc29sYXRlU2NvcGUgOiBzY29wZSxcbiAgICAgICAgICAgICAgJGVsZW1lbnQsXG4gICAgICAgICAgICAgIGF0dHJzLFxuICAgICAgICAgICAgICBsaW5rRm4ucmVxdWlyZSAmJiBnZXRDb250cm9sbGVycyhsaW5rRm4uZGlyZWN0aXZlTmFtZSwgbGlua0ZuLnJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpLFxuICAgICAgICAgICAgICB0cmFuc2NsdWRlRm5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUkVDVVJTSU9OXG4gICAgICAgIC8vIFdlIG9ubHkgcGFzcyB0aGUgaXNvbGF0ZSBzY29wZSwgaWYgdGhlIGlzb2xhdGUgZGlyZWN0aXZlIGhhcyBhIHRlbXBsYXRlLFxuICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGNoaWxkIGVsZW1lbnRzIGRvIG5vdCBiZWxvbmcgdG8gdGhlIGlzb2xhdGUgZGlyZWN0aXZlLlxuICAgICAgICB2YXIgc2NvcGVUb0NoaWxkID0gc2NvcGU7XG4gICAgICAgIGlmIChuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgJiYgKG5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZS50ZW1wbGF0ZSB8fCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUudGVtcGxhdGVVcmwgPT09IG51bGwpKSB7XG4gICAgICAgICAgc2NvcGVUb0NoaWxkID0gaXNvbGF0ZVNjb3BlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZExpbmtGbikge1xuICAgICAgICAgIGNoaWxkTGlua0ZuKHNjb3BlVG9DaGlsZCwgbGlua05vZGUuY2hpbGROb2RlcywgdW5kZWZpbmVkLCBib3VuZFRyYW5zY2x1ZGVGbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQT1NUTElOS0lOR1xuICAgICAgICBmb3IgKGkgPSBwb3N0TGlua0Zucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGxpbmtGbiA9IHBvc3RMaW5rRm5zW2ldO1xuICAgICAgICAgIGludm9rZUxpbmtGbihsaW5rRm4sXG4gICAgICAgICAgICAgIGxpbmtGbi5pc29sYXRlU2NvcGUgPyBpc29sYXRlU2NvcGUgOiBzY29wZSxcbiAgICAgICAgICAgICAgJGVsZW1lbnQsXG4gICAgICAgICAgICAgIGF0dHJzLFxuICAgICAgICAgICAgICBsaW5rRm4ucmVxdWlyZSAmJiBnZXRDb250cm9sbGVycyhsaW5rRm4uZGlyZWN0aXZlTmFtZSwgbGlua0ZuLnJlcXVpcmUsICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpLFxuICAgICAgICAgICAgICB0cmFuc2NsdWRlRm5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciAkcG9zdExpbmsgbGlmZWN5Y2xlIGhvb2tzXG4gICAgICAgIGZvckVhY2goZWxlbWVudENvbnRyb2xsZXJzLCBmdW5jdGlvbihjb250cm9sbGVyKSB7XG4gICAgICAgICAgdmFyIGNvbnRyb2xsZXJJbnN0YW5jZSA9IGNvbnRyb2xsZXIuaW5zdGFuY2U7XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29udHJvbGxlckluc3RhbmNlLiRwb3N0TGluaykpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXJJbnN0YW5jZS4kcG9zdExpbmsoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgaW5qZWN0ZWQgYXMgYCR0cmFuc2NsdWRlYC5cbiAgICAgICAgLy8gTm90ZTogYWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwhXG4gICAgICAgIGZ1bmN0aW9uIGNvbnRyb2xsZXJzQm91bmRUcmFuc2NsdWRlKHNjb3BlLCBjbG9uZUF0dGFjaEZuLCBmdXR1cmVQYXJlbnRFbGVtZW50LCBzbG90TmFtZSkge1xuICAgICAgICAgIHZhciB0cmFuc2NsdWRlQ29udHJvbGxlcnM7XG4gICAgICAgICAgLy8gTm8gc2NvcGUgcGFzc2VkIGluOlxuICAgICAgICAgIGlmICghaXNTY29wZShzY29wZSkpIHtcbiAgICAgICAgICAgIHNsb3ROYW1lID0gZnV0dXJlUGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGZ1dHVyZVBhcmVudEVsZW1lbnQgPSBjbG9uZUF0dGFjaEZuO1xuICAgICAgICAgICAgY2xvbmVBdHRhY2hGbiA9IHNjb3BlO1xuICAgICAgICAgICAgc2NvcGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICB0cmFuc2NsdWRlQ29udHJvbGxlcnMgPSBlbGVtZW50Q29udHJvbGxlcnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZnV0dXJlUGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgZnV0dXJlUGFyZW50RWxlbWVudCA9IGhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlID8gJGVsZW1lbnQucGFyZW50KCkgOiAkZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNsb3ROYW1lKSB7XG4gICAgICAgICAgICAvLyBzbG90VHJhbnNjbHVkZUZuIGNhbiBiZSBvbmUgb2YgdGhyZWUgdGhpbmdzOlxuICAgICAgICAgICAgLy8gICogYSB0cmFuc2NsdWRlIGZ1bmN0aW9uIC0gYSBmaWxsZWQgc2xvdFxuICAgICAgICAgICAgLy8gICogYG51bGxgIC0gYW4gb3B0aW9uYWwgc2xvdCB0aGF0IHdhcyBub3QgZmlsbGVkXG4gICAgICAgICAgICAvLyAgKiBgdW5kZWZpbmVkYCAtIGEgc2xvdCB0aGF0IHdhcyBub3QgZGVjbGFyZWQgKGkuZS4gaW52YWxpZClcbiAgICAgICAgICAgIHZhciBzbG90VHJhbnNjbHVkZUZuID0gYm91bmRUcmFuc2NsdWRlRm4uJCRzbG90c1tzbG90TmFtZV07XG4gICAgICAgICAgICBpZiAoc2xvdFRyYW5zY2x1ZGVGbikge1xuICAgICAgICAgICAgICByZXR1cm4gc2xvdFRyYW5zY2x1ZGVGbihzY29wZSwgY2xvbmVBdHRhY2hGbiwgdHJhbnNjbHVkZUNvbnRyb2xsZXJzLCBmdXR1cmVQYXJlbnRFbGVtZW50LCBzY29wZVRvQ2hpbGQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChzbG90VHJhbnNjbHVkZUZuKSkge1xuICAgICAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignbm9zbG90JyxcbiAgICAgICAgICAgICAgICdObyBwYXJlbnQgZGlyZWN0aXZlIHRoYXQgcmVxdWlyZXMgYSB0cmFuc2NsdXNpb24gd2l0aCBzbG90IG5hbWUgXCJ7MH1cIi4gJyArXG4gICAgICAgICAgICAgICAnRWxlbWVudDogezF9JyxcbiAgICAgICAgICAgICAgIHNsb3ROYW1lLCBzdGFydGluZ1RhZygkZWxlbWVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGNsb25lQXR0YWNoRm4sIHRyYW5zY2x1ZGVDb250cm9sbGVycywgZnV0dXJlUGFyZW50RWxlbWVudCwgc2NvcGVUb0NoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250cm9sbGVycyhkaXJlY3RpdmVOYW1lLCByZXF1aXJlLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKSB7XG4gICAgICB2YXIgdmFsdWU7XG5cbiAgICAgIGlmIChpc1N0cmluZyhyZXF1aXJlKSkge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZXF1aXJlLm1hdGNoKFJFUVVJUkVfUFJFRklYX1JFR0VYUCk7XG4gICAgICAgIHZhciBuYW1lID0gcmVxdWlyZS5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgdmFyIGluaGVyaXRUeXBlID0gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgICAgIHZhciBvcHRpb25hbCA9IG1hdGNoWzJdID09PSAnPyc7XG5cbiAgICAgICAgLy9JZiBvbmx5IHBhcmVudHMgdGhlbiBzdGFydCBhdCB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgaWYgKGluaGVyaXRUeXBlID09PSAnXl4nKSB7XG4gICAgICAgICAgJGVsZW1lbnQgPSAkZWxlbWVudC5wYXJlbnQoKTtcbiAgICAgICAgLy9PdGhlcndpc2UgYXR0ZW1wdCBnZXR0aW5nIHRoZSBjb250cm9sbGVyIGZyb20gZWxlbWVudENvbnRyb2xsZXJzIGluIGNhc2VcbiAgICAgICAgLy90aGUgZWxlbWVudCBpcyB0cmFuc2NsdWRlZCAoYW5kIGhhcyBubyBkYXRhKSBhbmQgdG8gYXZvaWQgLmRhdGEgaWYgcG9zc2libGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IGVsZW1lbnRDb250cm9sbGVycyAmJiBlbGVtZW50Q29udHJvbGxlcnNbbmFtZV07XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSAmJiB2YWx1ZS5pbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICB2YXIgZGF0YU5hbWUgPSAnJCcgKyBuYW1lICsgJ0NvbnRyb2xsZXInO1xuICAgICAgICAgIHZhbHVlID0gaW5oZXJpdFR5cGUgPyAkZWxlbWVudC5pbmhlcml0ZWREYXRhKGRhdGFOYW1lKSA6ICRlbGVtZW50LmRhdGEoZGF0YU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWx1ZSAmJiAhb3B0aW9uYWwpIHtcbiAgICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignY3RyZXEnLFxuICAgICAgICAgICAgICAnQ29udHJvbGxlciBcXCd7MH1cXCcsIHJlcXVpcmVkIGJ5IGRpcmVjdGl2ZSBcXCd7MX1cXCcsIGNhblxcJ3QgYmUgZm91bmQhJyxcbiAgICAgICAgICAgICAgbmFtZSwgZGlyZWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXF1aXJlKSkge1xuICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZXF1aXJlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICB2YWx1ZVtpXSA9IGdldENvbnRyb2xsZXJzKGRpcmVjdGl2ZU5hbWUsIHJlcXVpcmVbaV0sICRlbGVtZW50LCBlbGVtZW50Q29udHJvbGxlcnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHJlcXVpcmUpKSB7XG4gICAgICAgIHZhbHVlID0ge307XG4gICAgICAgIGZvckVhY2gocmVxdWlyZSwgZnVuY3Rpb24oY29udHJvbGxlciwgcHJvcGVydHkpIHtcbiAgICAgICAgICB2YWx1ZVtwcm9wZXJ0eV0gPSBnZXRDb250cm9sbGVycyhkaXJlY3RpdmVOYW1lLCBjb250cm9sbGVyLCAkZWxlbWVudCwgZWxlbWVudENvbnRyb2xsZXJzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZSB8fCBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldHVwQ29udHJvbGxlcnMoJGVsZW1lbnQsIGF0dHJzLCB0cmFuc2NsdWRlRm4sIGNvbnRyb2xsZXJEaXJlY3RpdmVzLCBpc29sYXRlU2NvcGUsIHNjb3BlLCBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUpIHtcbiAgICAgIHZhciBlbGVtZW50Q29udHJvbGxlcnMgPSBjcmVhdGVNYXAoKTtcbiAgICAgIGZvciAodmFyIGNvbnRyb2xsZXJLZXkgaW4gY29udHJvbGxlckRpcmVjdGl2ZXMpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGNvbnRyb2xsZXJEaXJlY3RpdmVzW2NvbnRyb2xsZXJLZXldO1xuICAgICAgICB2YXIgbG9jYWxzID0ge1xuICAgICAgICAgICRzY29wZTogZGlyZWN0aXZlID09PSBuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUgfHwgZGlyZWN0aXZlLiQkaXNvbGF0ZVNjb3BlID8gaXNvbGF0ZVNjb3BlIDogc2NvcGUsXG4gICAgICAgICAgJGVsZW1lbnQ6ICRlbGVtZW50LFxuICAgICAgICAgICRhdHRyczogYXR0cnMsXG4gICAgICAgICAgJHRyYW5zY2x1ZGU6IHRyYW5zY2x1ZGVGblxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBjb250cm9sbGVyID0gZGlyZWN0aXZlLmNvbnRyb2xsZXI7XG4gICAgICAgIGlmIChjb250cm9sbGVyID09PSAnQCcpIHtcbiAgICAgICAgICBjb250cm9sbGVyID0gYXR0cnNbZGlyZWN0aXZlLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbnRyb2xsZXJJbnN0YW5jZSA9ICRjb250cm9sbGVyKGNvbnRyb2xsZXIsIGxvY2FscywgdHJ1ZSwgZGlyZWN0aXZlLmNvbnRyb2xsZXJBcyk7XG5cbiAgICAgICAgLy8gRm9yIGRpcmVjdGl2ZXMgd2l0aCBlbGVtZW50IHRyYW5zY2x1c2lvbiB0aGUgZWxlbWVudCBpcyBhIGNvbW1lbnQuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSAuZGF0YSB3aWxsIG5vdCBhdHRhY2ggYW55IGRhdGEuXG4gICAgICAgIC8vIEluc3RlYWQsIHdlIHNhdmUgdGhlIGNvbnRyb2xsZXJzIGZvciB0aGUgZWxlbWVudCBpbiBhIGxvY2FsIGhhc2ggYW5kIGF0dGFjaCB0byAuZGF0YVxuICAgICAgICAvLyBsYXRlciwgb25jZSB3ZSBoYXZlIHRoZSBhY3R1YWwgZWxlbWVudC5cbiAgICAgICAgZWxlbWVudENvbnRyb2xsZXJzW2RpcmVjdGl2ZS5uYW1lXSA9IGNvbnRyb2xsZXJJbnN0YW5jZTtcbiAgICAgICAgJGVsZW1lbnQuZGF0YSgnJCcgKyBkaXJlY3RpdmUubmFtZSArICdDb250cm9sbGVyJywgY29udHJvbGxlckluc3RhbmNlLmluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50Q29udHJvbGxlcnM7XG4gICAgfVxuXG4gICAgLy8gRGVwZW5kaW5nIHVwb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggYSBkaXJlY3RpdmUgZmluZHMgaXRzZWxmIGl0IG1pZ2h0IG5lZWQgdG8gaGF2ZSBhIG5ldyBpc29sYXRlZFxuICAgIC8vIG9yIGNoaWxkIHNjb3BlIGNyZWF0ZWQuIEZvciBpbnN0YW5jZTpcbiAgICAvLyAqIGlmIHRoZSBkaXJlY3RpdmUgaGFzIGJlZW4gcHVsbGVkIGludG8gYSB0ZW1wbGF0ZSBiZWNhdXNlIGFub3RoZXIgZGlyZWN0aXZlIHdpdGggYSBoaWdoZXIgcHJpb3JpdHlcbiAgICAvLyBhc2tlZCBmb3IgZWxlbWVudCB0cmFuc2NsdXNpb25cbiAgICAvLyAqIGlmIHRoZSBkaXJlY3RpdmUgaXRzZWxmIGFza3MgZm9yIHRyYW5zY2x1c2lvbiBidXQgaXQgaXMgYXQgdGhlIHJvb3Qgb2YgYSB0ZW1wbGF0ZSBhbmQgdGhlIG9yaWdpbmFsXG4gICAgLy8gZWxlbWVudCB3YXMgcmVwbGFjZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy8xMjkzNlxuICAgIGZ1bmN0aW9uIG1hcmtEaXJlY3RpdmVTY29wZShkaXJlY3RpdmVzLCBpc29sYXRlU2NvcGUsIG5ld1Njb3BlKSB7XG4gICAgICBmb3IgKHZhciBqID0gMCwgamogPSBkaXJlY3RpdmVzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgZGlyZWN0aXZlc1tqXSA9IGluaGVyaXQoZGlyZWN0aXZlc1tqXSwgeyQkaXNvbGF0ZVNjb3BlOiBpc29sYXRlU2NvcGUsICQkbmV3U2NvcGU6IG5ld1Njb3BlfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9va3MgdXAgdGhlIGRpcmVjdGl2ZSBhbmQgZGVjb3JhdGVzIGl0IHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCBwcm9wZXIgcGFyYW1ldGVycy4gV2VcbiAgICAgKiBjYWxsIHRoaXMgdGhlIGJvdW5kRGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlIHRvIGxvb2sgdXAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIFRoZSBkaXJlY3RpdmUgbXVzdCBiZSBmb3VuZCBpbiBzcGVjaWZpYyBmb3JtYXQuXG4gICAgICogICBTdHJpbmcgY29udGFpbmluZyBhbnkgb2YgdGhlc2VzIGNoYXJhY3RlcnM6XG4gICAgICpcbiAgICAgKiAgICogYEVgOiBlbGVtZW50IG5hbWVcbiAgICAgKiAgICogYEEnOiBhdHRyaWJ1dGVcbiAgICAgKiAgICogYENgOiBjbGFzc1xuICAgICAqICAgKiBgTWA6IGNvbW1lbnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBkaXJlY3RpdmUgd2FzIGFkZGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZERpcmVjdGl2ZSh0RGlyZWN0aXZlcywgbmFtZSwgbG9jYXRpb24sIG1heFByaW9yaXR5LCBpZ25vcmVEaXJlY3RpdmUsIHN0YXJ0QXR0ck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEF0dHJOYW1lKSB7XG4gICAgICBpZiAobmFtZSA9PT0gaWdub3JlRGlyZWN0aXZlKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBtYXRjaCA9IG51bGw7XG4gICAgICBpZiAoaGFzRGlyZWN0aXZlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBmb3IgKHZhciBkaXJlY3RpdmUsIGRpcmVjdGl2ZXMgPSAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBTdWZmaXgpLFxuICAgICAgICAgICAgaSA9IDAsIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgZGlyZWN0aXZlID0gZGlyZWN0aXZlc1tpXTtcbiAgICAgICAgICBpZiAoKGlzVW5kZWZpbmVkKG1heFByaW9yaXR5KSB8fCBtYXhQcmlvcml0eSA+IGRpcmVjdGl2ZS5wcmlvcml0eSkgJiZcbiAgICAgICAgICAgICAgIGRpcmVjdGl2ZS5yZXN0cmljdC5pbmRleE9mKGxvY2F0aW9uKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChzdGFydEF0dHJOYW1lKSB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZSA9IGluaGVyaXQoZGlyZWN0aXZlLCB7JCRzdGFydDogc3RhcnRBdHRyTmFtZSwgJCRlbmQ6IGVuZEF0dHJOYW1lfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRpcmVjdGl2ZS4kJGJpbmRpbmdzKSB7XG4gICAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IGRpcmVjdGl2ZS4kJGJpbmRpbmdzID1cbiAgICAgICAgICAgICAgICAgIHBhcnNlRGlyZWN0aXZlQmluZGluZ3MoZGlyZWN0aXZlLCBkaXJlY3RpdmUubmFtZSk7XG4gICAgICAgICAgICAgIGlmIChpc09iamVjdChiaW5kaW5ncy5pc29sYXRlU2NvcGUpKSB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlLiQkaXNvbGF0ZUJpbmRpbmdzID0gYmluZGluZ3MuaXNvbGF0ZVNjb3BlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0RGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZSk7XG4gICAgICAgICAgICBtYXRjaCA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIGxvb2tzIHVwIHRoZSBkaXJlY3RpdmUgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIG11bHRpLWVsZW1lbnQgZGlyZWN0aXZlLFxuICAgICAqIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXMgRE9NIG5vZGVzIGJldHdlZW4gLXN0YXJ0IGFuZCAtZW5kIG1hcmtlcnMgdG8gYmUgZ3JvdXBlZFxuICAgICAqIHRvZ2V0aGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlIHRvIGxvb2sgdXAuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBkaXJlY3RpdmUgd2FzIHJlZ2lzdGVyZWQgYXMgbXVsdGktZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaXJlY3RpdmVJc011bHRpRWxlbWVudChuYW1lKSB7XG4gICAgICBpZiAoaGFzRGlyZWN0aXZlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBmb3IgKHZhciBkaXJlY3RpdmUsIGRpcmVjdGl2ZXMgPSAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBTdWZmaXgpLFxuICAgICAgICAgICAgaSA9IDAsIGlpID0gZGlyZWN0aXZlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgZGlyZWN0aXZlID0gZGlyZWN0aXZlc1tpXTtcbiAgICAgICAgICBpZiAoZGlyZWN0aXZlLm11bHRpRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgZWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIEhUTUwgdGVtcGxhdGUgdGhlbiB0aGUgbmV3IGF0dHJpYnV0ZXNcbiAgICAgKiBvbiB0aGUgdGVtcGxhdGUgbmVlZCB0byBiZSBtZXJnZWQgd2l0aCB0aGUgZXhpc3RpbmcgYXR0cmlidXRlcyBpbiB0aGUgRE9NLlxuICAgICAqIFRoZSBkZXNpcmVkIGVmZmVjdCBpcyB0byBoYXZlIGJvdGggb2YgdGhlIGF0dHJpYnV0ZXMgcHJlc2VudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkc3QgZGVzdGluYXRpb24gYXR0cmlidXRlcyAob3JpZ2luYWwgRE9NKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBzcmMgc291cmNlIGF0dHJpYnV0ZXMgKGZyb20gdGhlIGRpcmVjdGl2ZSB0ZW1wbGF0ZSlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZVRlbXBsYXRlQXR0cmlidXRlcyhkc3QsIHNyYykge1xuICAgICAgdmFyIHNyY0F0dHIgPSBzcmMuJGF0dHIsXG4gICAgICAgICAgZHN0QXR0ciA9IGRzdC4kYXR0cjtcblxuICAgICAgLy8gcmVhcHBseSB0aGUgb2xkIGF0dHJpYnV0ZXMgdG8gdGhlIG5ldyBlbGVtZW50XG4gICAgICBmb3JFYWNoKGRzdCwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSAhPT0gJyQnKSB7XG4gICAgICAgICAgaWYgKHNyY1trZXldICYmIHNyY1trZXldICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICB2YWx1ZSArPSAoa2V5ID09PSAnc3R5bGUnID8gJzsnIDogJyAnKSArIHNyY1trZXldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBzcmNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZHN0LiRzZXQoa2V5LCB2YWx1ZSwgdHJ1ZSwgc3JjQXR0cltrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGNvcHkgdGhlIG5ldyBhdHRyaWJ1dGVzIG9uIHRoZSBvbGQgYXR0cnMgb2JqZWN0XG4gICAgICBmb3JFYWNoKHNyYywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IHNldCB0aGlzIGF0dHJpYnV0ZSBpbiB0aGUgbG9vcCBhYm92ZS5cbiAgICAgICAgLy8gYGRzdGAgd2lsbCBuZXZlciBjb250YWluIGhhc093blByb3BlcnR5IGFzIERPTSBwYXJzZXIgd29uJ3QgbGV0IGl0LlxuICAgICAgICAvLyBZb3Ugd2lsbCBnZXQgYW4gXCJJbnZhbGlkQ2hhcmFjdGVyRXJyb3I6IERPTSBFeGNlcHRpb24gNVwiIGVycm9yIGlmIHlvdVxuICAgICAgICAvLyBoYXZlIGFuIGF0dHJpYnV0ZSBsaWtlIFwiaGFzLW93bi1wcm9wZXJ0eVwiIG9yIFwiZGF0YS1oYXMtb3duLXByb3BlcnR5XCIsIGV0Yy5cbiAgICAgICAgaWYgKCFkc3QuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkuY2hhckF0KDApICE9PSAnJCcpIHtcbiAgICAgICAgICBkc3Rba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgICAgaWYgKGtleSAhPT0gJ2NsYXNzJyAmJiBrZXkgIT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIGRzdEF0dHJba2V5XSA9IHNyY0F0dHJba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY29tcGlsZVRlbXBsYXRlVXJsKGRpcmVjdGl2ZXMsICRjb21waWxlTm9kZSwgdEF0dHJzLFxuICAgICAgICAkcm9vdEVsZW1lbnQsIGNoaWxkVHJhbnNjbHVkZUZuLCBwcmVMaW5rRm5zLCBwb3N0TGlua0ZucywgcHJldmlvdXNDb21waWxlQ29udGV4dCkge1xuICAgICAgdmFyIGxpbmtRdWV1ZSA9IFtdLFxuICAgICAgICAgIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLFxuICAgICAgICAgIGFmdGVyVGVtcGxhdGVDaGlsZExpbmtGbixcbiAgICAgICAgICBiZWZvcmVUZW1wbGF0ZUNvbXBpbGVOb2RlID0gJGNvbXBpbGVOb2RlWzBdLFxuICAgICAgICAgIG9yaWdBc3luY0RpcmVjdGl2ZSA9IGRpcmVjdGl2ZXMuc2hpZnQoKSxcbiAgICAgICAgICBkZXJpdmVkU3luY0RpcmVjdGl2ZSA9IGluaGVyaXQob3JpZ0FzeW5jRGlyZWN0aXZlLCB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogbnVsbCwgdHJhbnNjbHVkZTogbnVsbCwgcmVwbGFjZTogbnVsbCwgJCRvcmlnaW5hbERpcmVjdGl2ZTogb3JpZ0FzeW5jRGlyZWN0aXZlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGVtcGxhdGVVcmwgPSAoaXNGdW5jdGlvbihvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVVcmwpKVxuICAgICAgICAgICAgICA/IG9yaWdBc3luY0RpcmVjdGl2ZS50ZW1wbGF0ZVVybCgkY29tcGlsZU5vZGUsIHRBdHRycylcbiAgICAgICAgICAgICAgOiBvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVVcmwsXG4gICAgICAgICAgdGVtcGxhdGVOYW1lc3BhY2UgPSBvcmlnQXN5bmNEaXJlY3RpdmUudGVtcGxhdGVOYW1lc3BhY2U7XG5cbiAgICAgICRjb21waWxlTm9kZS5lbXB0eSgpO1xuXG4gICAgICAkdGVtcGxhdGVSZXF1ZXN0KHRlbXBsYXRlVXJsKVxuICAgICAgICAudGhlbihmdW5jdGlvbihjb250ZW50KSB7XG4gICAgICAgICAgdmFyIGNvbXBpbGVOb2RlLCB0ZW1wVGVtcGxhdGVBdHRycywgJHRlbXBsYXRlLCBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuO1xuXG4gICAgICAgICAgY29udGVudCA9IGRlbm9ybWFsaXplVGVtcGxhdGUoY29udGVudCk7XG5cbiAgICAgICAgICBpZiAob3JpZ0FzeW5jRGlyZWN0aXZlLnJlcGxhY2UpIHtcbiAgICAgICAgICAgIGlmIChqcUxpdGVJc1RleHROb2RlKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICR0ZW1wbGF0ZSA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgJHRlbXBsYXRlID0gcmVtb3ZlQ29tbWVudHMod3JhcFRlbXBsYXRlKHRlbXBsYXRlTmFtZXNwYWNlLCB0cmltKGNvbnRlbnQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21waWxlTm9kZSA9ICR0ZW1wbGF0ZVswXTtcblxuICAgICAgICAgICAgaWYgKCR0ZW1wbGF0ZS5sZW5ndGggIT09IDEgfHwgY29tcGlsZU5vZGUubm9kZVR5cGUgIT09IE5PREVfVFlQRV9FTEVNRU5UKSB7XG4gICAgICAgICAgICAgIHRocm93ICRjb21waWxlTWluRXJyKCd0cGxydCcsXG4gICAgICAgICAgICAgICAgICAnVGVtcGxhdGUgZm9yIGRpcmVjdGl2ZSBcXCd7MH1cXCcgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gezF9JyxcbiAgICAgICAgICAgICAgICAgIG9yaWdBc3luY0RpcmVjdGl2ZS5uYW1lLCB0ZW1wbGF0ZVVybCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlbXBUZW1wbGF0ZUF0dHJzID0geyRhdHRyOiB7fX07XG4gICAgICAgICAgICByZXBsYWNlV2l0aCgkcm9vdEVsZW1lbnQsICRjb21waWxlTm9kZSwgY29tcGlsZU5vZGUpO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGlyZWN0aXZlcyA9IGNvbGxlY3REaXJlY3RpdmVzKGNvbXBpbGVOb2RlLCBbXSwgdGVtcFRlbXBsYXRlQXR0cnMpO1xuXG4gICAgICAgICAgICBpZiAoaXNPYmplY3Qob3JpZ0FzeW5jRGlyZWN0aXZlLnNjb3BlKSkge1xuICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgZGlyZWN0aXZlIHRoYXQgY2F1c2VkIHRoZSB0ZW1wbGF0ZSB0byBiZSBsb2FkZWQgYXN5bmMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgLy8gYW4gaXNvbGF0ZSBzY29wZVxuICAgICAgICAgICAgICBtYXJrRGlyZWN0aXZlU2NvcGUodGVtcGxhdGVEaXJlY3RpdmVzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZURpcmVjdGl2ZXMuY29uY2F0KGRpcmVjdGl2ZXMpO1xuICAgICAgICAgICAgbWVyZ2VUZW1wbGF0ZUF0dHJpYnV0ZXModEF0dHJzLCB0ZW1wVGVtcGxhdGVBdHRycyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBpbGVOb2RlID0gYmVmb3JlVGVtcGxhdGVDb21waWxlTm9kZTtcbiAgICAgICAgICAgICRjb21waWxlTm9kZS5odG1sKGNvbnRlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpcmVjdGl2ZXMudW5zaGlmdChkZXJpdmVkU3luY0RpcmVjdGl2ZSk7XG5cbiAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbiA9IGFwcGx5RGlyZWN0aXZlc1RvTm9kZShkaXJlY3RpdmVzLCBjb21waWxlTm9kZSwgdEF0dHJzLFxuICAgICAgICAgICAgICBjaGlsZFRyYW5zY2x1ZGVGbiwgJGNvbXBpbGVOb2RlLCBvcmlnQXN5bmNEaXJlY3RpdmUsIHByZUxpbmtGbnMsIHBvc3RMaW5rRm5zLFxuICAgICAgICAgICAgICBwcmV2aW91c0NvbXBpbGVDb250ZXh0KTtcbiAgICAgICAgICBmb3JFYWNoKCRyb290RWxlbWVudCwgZnVuY3Rpb24obm9kZSwgaSkge1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IGNvbXBpbGVOb2RlKSB7XG4gICAgICAgICAgICAgICRyb290RWxlbWVudFtpXSA9ICRjb21waWxlTm9kZVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4gPSBjb21waWxlTm9kZXMoJGNvbXBpbGVOb2RlWzBdLmNoaWxkTm9kZXMsIGNoaWxkVHJhbnNjbHVkZUZuKTtcblxuICAgICAgICAgIHdoaWxlIChsaW5rUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgc2NvcGUgPSBsaW5rUXVldWUuc2hpZnQoKSxcbiAgICAgICAgICAgICAgICBiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlID0gbGlua1F1ZXVlLnNoaWZ0KCksXG4gICAgICAgICAgICAgICAgbGlua1Jvb3RFbGVtZW50ID0gbGlua1F1ZXVlLnNoaWZ0KCksXG4gICAgICAgICAgICAgICAgYm91bmRUcmFuc2NsdWRlRm4gPSBsaW5rUXVldWUuc2hpZnQoKSxcbiAgICAgICAgICAgICAgICBsaW5rTm9kZSA9ICRjb21waWxlTm9kZVswXTtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLiQkZGVzdHJveWVkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKGJlZm9yZVRlbXBsYXRlTGlua05vZGUgIT09IGJlZm9yZVRlbXBsYXRlQ29tcGlsZU5vZGUpIHtcbiAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSBiZWZvcmVUZW1wbGF0ZUxpbmtOb2RlLmNsYXNzTmFtZTtcblxuICAgICAgICAgICAgICBpZiAoIShwcmV2aW91c0NvbXBpbGVDb250ZXh0Lmhhc0VsZW1lbnRUcmFuc2NsdWRlRGlyZWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICBvcmlnQXN5bmNEaXJlY3RpdmUucmVwbGFjZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpdCB3YXMgY2xvbmVkIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGNsb25lIGFzIHdlbGwuXG4gICAgICAgICAgICAgICAgbGlua05vZGUgPSBqcUxpdGVDbG9uZShjb21waWxlTm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZVdpdGgobGlua1Jvb3RFbGVtZW50LCBqcUxpdGUoYmVmb3JlVGVtcGxhdGVMaW5rTm9kZSksIGxpbmtOb2RlKTtcblxuICAgICAgICAgICAgICAvLyBDb3B5IGluIENTUyBjbGFzc2VzIGZyb20gb3JpZ2luYWwgbm9kZVxuICAgICAgICAgICAgICBzYWZlQWRkQ2xhc3MoanFMaXRlKGxpbmtOb2RlKSwgb2xkQ2xhc3Nlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGNyZWF0ZUJvdW5kVHJhbnNjbHVkZUZuKHNjb3BlLCBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbi50cmFuc2NsdWRlLCBib3VuZFRyYW5zY2x1ZGVGbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gYm91bmRUcmFuc2NsdWRlRm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZnRlclRlbXBsYXRlTm9kZUxpbmtGbihhZnRlclRlbXBsYXRlQ2hpbGRMaW5rRm4sIHNjb3BlLCBsaW5rTm9kZSwgJHJvb3RFbGVtZW50LFxuICAgICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlua1F1ZXVlID0gbnVsbDtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2gobm9vcCk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiBkZWxheWVkTm9kZUxpbmtGbihpZ25vcmVDaGlsZExpbmtGbiwgc2NvcGUsIG5vZGUsIHJvb3RFbGVtZW50LCBib3VuZFRyYW5zY2x1ZGVGbikge1xuICAgICAgICB2YXIgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbiA9IGJvdW5kVHJhbnNjbHVkZUZuO1xuICAgICAgICBpZiAoc2NvcGUuJCRkZXN0cm95ZWQpIHJldHVybjtcbiAgICAgICAgaWYgKGxpbmtRdWV1ZSkge1xuICAgICAgICAgIGxpbmtRdWV1ZS5wdXNoKHNjb3BlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRCb3VuZFRyYW5zY2x1ZGVGbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50KSB7XG4gICAgICAgICAgICBjaGlsZEJvdW5kVHJhbnNjbHVkZUZuID0gY3JlYXRlQm91bmRUcmFuc2NsdWRlRm4oc2NvcGUsIGFmdGVyVGVtcGxhdGVOb2RlTGlua0ZuLnRyYW5zY2x1ZGUsIGJvdW5kVHJhbnNjbHVkZUZuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWZ0ZXJUZW1wbGF0ZU5vZGVMaW5rRm4oYWZ0ZXJUZW1wbGF0ZUNoaWxkTGlua0ZuLCBzY29wZSwgbm9kZSwgcm9vdEVsZW1lbnQsIGNoaWxkQm91bmRUcmFuc2NsdWRlRm4pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogU29ydGluZyBmdW5jdGlvbiBmb3IgYm91bmQgZGlyZWN0aXZlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBieVByaW9yaXR5KGEsIGIpIHtcbiAgICAgIHZhciBkaWZmID0gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gICAgICBpZiAoZGlmZiAhPT0gMCkgcmV0dXJuIGRpZmY7XG4gICAgICBpZiAoYS5uYW1lICE9PSBiLm5hbWUpIHJldHVybiAoYS5uYW1lIDwgYi5uYW1lKSA/IC0xIDogMTtcbiAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhc3NlcnROb0R1cGxpY2F0ZSh3aGF0LCBwcmV2aW91c0RpcmVjdGl2ZSwgZGlyZWN0aXZlLCBlbGVtZW50KSB7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBNb2R1bGVOYW1lSWZEZWZpbmVkKG1vZHVsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWUgP1xuICAgICAgICAgICgnIChtb2R1bGU6ICcgKyBtb2R1bGVOYW1lICsgJyknKSA6XG4gICAgICAgICAgJyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2aW91c0RpcmVjdGl2ZSkge1xuICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignbXVsdGlkaXInLCAnTXVsdGlwbGUgZGlyZWN0aXZlcyBbezB9ezF9LCB7Mn17M31dIGFza2luZyBmb3IgezR9IG9uOiB7NX0nLFxuICAgICAgICAgICAgcHJldmlvdXNEaXJlY3RpdmUubmFtZSwgd3JhcE1vZHVsZU5hbWVJZkRlZmluZWQocHJldmlvdXNEaXJlY3RpdmUuJCRtb2R1bGVOYW1lKSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZS5uYW1lLCB3cmFwTW9kdWxlTmFtZUlmRGVmaW5lZChkaXJlY3RpdmUuJCRtb2R1bGVOYW1lKSwgd2hhdCwgc3RhcnRpbmdUYWcoZWxlbWVudCkpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gYWRkVGV4dEludGVycG9sYXRlRGlyZWN0aXZlKGRpcmVjdGl2ZXMsIHRleHQpIHtcbiAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHRleHQsIHRydWUpO1xuICAgICAgaWYgKGludGVycG9sYXRlRm4pIHtcbiAgICAgICAgZGlyZWN0aXZlcy5wdXNoKHtcbiAgICAgICAgICBwcmlvcml0eTogMCxcbiAgICAgICAgICBjb21waWxlOiBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGVDb21waWxlRm4odGVtcGxhdGVOb2RlKSB7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVOb2RlUGFyZW50ID0gdGVtcGxhdGVOb2RlLnBhcmVudCgpLFxuICAgICAgICAgICAgICAgIGhhc0NvbXBpbGVQYXJlbnQgPSAhIXRlbXBsYXRlTm9kZVBhcmVudC5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdHJhbnNjbHVkaW5nIGEgdGVtcGxhdGUgdGhhdCBoYXMgYmluZGluZ3MgaW4gdGhlIHJvb3RcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgYW5kIHRodXMgbmVlZCB0byBhZGQgdGhlIGNsYXNzIGR1cmluZyBsaW5raW5nIGZuLlxuICAgICAgICAgICAgaWYgKGhhc0NvbXBpbGVQYXJlbnQpIGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModGVtcGxhdGVOb2RlUGFyZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZUxpbmtGbihzY29wZSwgbm9kZSkge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQoKTtcbiAgICAgICAgICAgICAgaWYgKCFoYXNDb21waWxlUGFyZW50KSBjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHBhcmVudCk7XG4gICAgICAgICAgICAgIGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhwYXJlbnQsIGludGVycG9sYXRlRm4uZXhwcmVzc2lvbnMpO1xuICAgICAgICAgICAgICBzY29wZS4kd2F0Y2goaW50ZXJwb2xhdGVGbiwgZnVuY3Rpb24gaW50ZXJwb2xhdGVGbldhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbm9kZVswXS5ub2RlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiB3cmFwVGVtcGxhdGUodHlwZSwgdGVtcGxhdGUpIHtcbiAgICAgIHR5cGUgPSBsb3dlcmNhc2UodHlwZSB8fCAnaHRtbCcpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdmcnOlxuICAgICAgY2FzZSAnbWF0aCc6XG4gICAgICAgIHZhciB3cmFwcGVyID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB3cmFwcGVyLmlubmVySFRNTCA9ICc8JyArIHR5cGUgKyAnPicgKyB0ZW1wbGF0ZSArICc8LycgKyB0eXBlICsgJz4nO1xuICAgICAgICByZXR1cm4gd3JhcHBlci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBnZXRUcnVzdGVkQ29udGV4dChub2RlLCBhdHRyTm9ybWFsaXplZE5hbWUpIHtcbiAgICAgIGlmIChhdHRyTm9ybWFsaXplZE5hbWUgPT09ICdzcmNkb2MnKSB7XG4gICAgICAgIHJldHVybiAkc2NlLkhUTUw7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gbm9kZU5hbWVfKG5vZGUpO1xuICAgICAgLy8gQWxsIHRhZ3Mgd2l0aCBzcmMgYXR0cmlidXRlcyByZXF1aXJlIGEgUkVTT1VSQ0VfVVJMIHZhbHVlLCBleGNlcHQgZm9yXG4gICAgICAvLyBpbWcgYW5kIHZhcmlvdXMgaHRtbDUgbWVkaWEgdGFncy5cbiAgICAgIGlmIChhdHRyTm9ybWFsaXplZE5hbWUgPT09ICdzcmMnIHx8IGF0dHJOb3JtYWxpemVkTmFtZSA9PT0gJ25nU3JjJykge1xuICAgICAgICBpZiAoWydpbWcnLCAndmlkZW8nLCAnYXVkaW8nLCAnc291cmNlJywgJ3RyYWNrJ10uaW5kZXhPZih0YWcpID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiAkc2NlLlJFU09VUkNFX1VSTDtcbiAgICAgICAgfVxuICAgICAgLy8gbWFjdGlvblt4bGluazpocmVmXSBjYW4gc291cmNlIFNWRy4gIEl0J3Mgbm90IGxpbWl0ZWQgdG8gPG1hY3Rpb24+LlxuICAgICAgfSBlbHNlIGlmIChhdHRyTm9ybWFsaXplZE5hbWUgPT09ICd4bGlua0hyZWYnIHx8XG4gICAgICAgICAgKHRhZyA9PT0gJ2Zvcm0nICYmIGF0dHJOb3JtYWxpemVkTmFtZSA9PT0gJ2FjdGlvbicpIHx8XG4gICAgICAgICAgLy8gbGlua3MgY2FuIGJlIHN0eWxlc2hlZXRzIG9yIGltcG9ydHMsIHdoaWNoIGNhbiBydW4gc2NyaXB0IGluIHRoZSBjdXJyZW50IG9yaWdpblxuICAgICAgICAgICh0YWcgPT09ICdsaW5rJyAmJiBhdHRyTm9ybWFsaXplZE5hbWUgPT09ICdocmVmJylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gJHNjZS5SRVNPVVJDRV9VUkw7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBhZGRBdHRySW50ZXJwb2xhdGVEaXJlY3RpdmUobm9kZSwgZGlyZWN0aXZlcywgdmFsdWUsIG5hbWUsIGlzTmdBdHRyKSB7XG4gICAgICB2YXIgdHJ1c3RlZENvbnRleHQgPSBnZXRUcnVzdGVkQ29udGV4dChub2RlLCBuYW1lKTtcbiAgICAgIHZhciBtdXN0SGF2ZUV4cHJlc3Npb24gPSAhaXNOZ0F0dHI7XG4gICAgICB2YXIgYWxsT3JOb3RoaW5nID0gQUxMX09SX05PVEhJTkdfQVRUUlNbbmFtZV0gfHwgaXNOZ0F0dHI7XG5cbiAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKHZhbHVlLCBtdXN0SGF2ZUV4cHJlc3Npb24sIHRydXN0ZWRDb250ZXh0LCBhbGxPck5vdGhpbmcpO1xuXG4gICAgICAvLyBubyBpbnRlcnBvbGF0aW9uIGZvdW5kIC0+IGlnbm9yZVxuICAgICAgaWYgKCFpbnRlcnBvbGF0ZUZuKSByZXR1cm47XG5cbiAgICAgIGlmIChuYW1lID09PSAnbXVsdGlwbGUnICYmIG5vZGVOYW1lXyhub2RlKSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ3NlbG11bHRpJyxcbiAgICAgICAgICAgICdCaW5kaW5nIHRvIHRoZSBcXCdtdWx0aXBsZVxcJyBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZC4gRWxlbWVudDogezB9JyxcbiAgICAgICAgICAgIHN0YXJ0aW5nVGFnKG5vZGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEVWRU5UX0hBTkRMRVJfQVRUUl9SRUdFWFAudGVzdChuYW1lKSkge1xuICAgICAgICB0aHJvdyAkY29tcGlsZU1pbkVycignbm9kb21ldmVudHMnLFxuICAgICAgICAgICAgJ0ludGVycG9sYXRpb25zIGZvciBIVE1MIERPTSBldmVudCBhdHRyaWJ1dGVzIGFyZSBkaXNhbGxvd2VkLiAgUGxlYXNlIHVzZSB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ25nLSB2ZXJzaW9ucyAoc3VjaCBhcyBuZy1jbGljayBpbnN0ZWFkIG9mIG9uY2xpY2spIGluc3RlYWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGRpcmVjdGl2ZXMucHVzaCh7XG4gICAgICAgIHByaW9yaXR5OiAxMDAsXG4gICAgICAgIGNvbXBpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcHJlOiBmdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVQcmVMaW5rRm4oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgJCRvYnNlcnZlcnMgPSAoYXR0ci4kJG9ic2VydmVycyB8fCAoYXR0ci4kJG9ic2VydmVycyA9IGNyZWF0ZU1hcCgpKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGhhcyBjaGFuZ2VkIHNpbmNlIGxhc3QgJGludGVycG9sYXRlKCllZFxuICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGF0dHJbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSBhZ2FpbiBzaW5jZSB0aGUgYXR0cmlidXRlIHZhbHVlIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGJ5IGFub3RoZXIgZGlyZWN0aXZlJ3MgY29tcGlsZSBmdW5jdGlvbilcbiAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB1bnNldC9lbXB0eSB2YWx1ZXMgbWFrZSBpbnRlcnBvbGF0ZUZuIGZhbHN5XG4gICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZUZuID0gbmV3VmFsdWUgJiYgJGludGVycG9sYXRlKG5ld1ZhbHVlLCB0cnVlLCB0cnVzdGVkQ29udGV4dCwgYWxsT3JOb3RoaW5nKTtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgYXR0cmlidXRlIHdhcyB1cGRhdGVkIHNvIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiBnb2luZyBvbiB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYW55IG9ic2VydmVyc1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJwb2xhdGVGbikgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhdHRyIG9iamVjdCBzbyB0aGF0IGl0J3MgcmVhZHkgaW4gY2FzZSB3ZSBuZWVkIHRoZSB2YWx1ZSBmb3IgaXNvbGF0ZVxuICAgICAgICAgICAgICAgIC8vIHNjb3BlIGluaXRpYWxpemF0aW9uLCBvdGhlcndpc2UgdGhlIHZhbHVlIHdvdWxkIG5vdCBiZSBhdmFpbGFibGUgZnJvbSBpc29sYXRlXG4gICAgICAgICAgICAgICAgLy8gZGlyZWN0aXZlJ3MgbGlua2luZyBmbiBkdXJpbmcgbGlua2luZyBwaGFzZVxuICAgICAgICAgICAgICAgIGF0dHJbbmFtZV0gPSBpbnRlcnBvbGF0ZUZuKHNjb3BlKTtcblxuICAgICAgICAgICAgICAgICgkJG9ic2VydmVyc1tuYW1lXSB8fCAoJCRvYnNlcnZlcnNbbmFtZV0gPSBbXSkpLiQkaW50ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIChhdHRyLiQkb2JzZXJ2ZXJzICYmIGF0dHIuJCRvYnNlcnZlcnNbbmFtZV0uJCRzY29wZSB8fCBzY29wZSkuXG4gICAgICAgICAgICAgICAgICAkd2F0Y2goaW50ZXJwb2xhdGVGbiwgZnVuY3Rpb24gaW50ZXJwb2xhdGVGbldhdGNoQWN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgY2xhc3MgYXR0cmlidXRlIGFkZGl0aW9uICsgcmVtb3ZhbFxuICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgY2xhc3MgY2hhbmdlcyBjYW4gdGFwIGludG8gdGhlIGFuaW1hdGlvblxuICAgICAgICAgICAgICAgICAgICAvL2hvb2tzIHByb3ZpZGVkIGJ5IHRoZSAkYW5pbWF0ZSBzZXJ2aWNlLiBCZSBzdXJlIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vc2tpcCBhbmltYXRpb25zIHdoZW4gdGhlIGZpcnN0IGRpZ2VzdCBvY2N1cnMgKHdoZW5cbiAgICAgICAgICAgICAgICAgICAgLy9ib3RoIHRoZSBuZXcgYW5kIHRoZSBvbGQgdmFsdWVzIGFyZSB0aGUgc2FtZSkgc2luY2VcbiAgICAgICAgICAgICAgICAgICAgLy90aGUgQ1NTIGNsYXNzZXMgYXJlIHRoZSBub24taW50ZXJwb2xhdGVkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJyAmJiBuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyLiR1cGRhdGVDbGFzcyhuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHIuJHNldChuYW1lLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIHNwZWNpYWwganFMaXRlLnJlcGxhY2VXaXRoLCB3aGljaCBjYW4gcmVwbGFjZSBpdGVtcyB3aGljaFxuICAgICAqIGhhdmUgbm8gcGFyZW50cywgcHJvdmlkZWQgdGhhdCB0aGUgY29udGFpbmluZyBqcUxpdGUgY29sbGVjdGlvbiBpcyBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SnFMaXRlPX0gJHJvb3RFbGVtZW50IFRoZSByb290IG9mIHRoZSBjb21waWxlIHRyZWUuIFVzZWQgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSBub2Rlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByb290IG9mIHRoZSB0cmVlLlxuICAgICAqIEBwYXJhbSB7SnFMaXRlfSBlbGVtZW50c1RvUmVtb3ZlIFRoZSBqcUxpdGUgZWxlbWVudCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcmVwbGFjZS4gV2Uga2VlcFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaGVsbCwgYnV0IHJlcGxhY2UgaXRzIERPTSBub2RlIHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgVGhlIG5ldyBET00gbm9kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlV2l0aCgkcm9vdEVsZW1lbnQsIGVsZW1lbnRzVG9SZW1vdmUsIG5ld05vZGUpIHtcbiAgICAgIHZhciBmaXJzdEVsZW1lbnRUb1JlbW92ZSA9IGVsZW1lbnRzVG9SZW1vdmVbMF0sXG4gICAgICAgICAgcmVtb3ZlQ291bnQgPSBlbGVtZW50c1RvUmVtb3ZlLmxlbmd0aCxcbiAgICAgICAgICBwYXJlbnQgPSBmaXJzdEVsZW1lbnRUb1JlbW92ZS5wYXJlbnROb2RlLFxuICAgICAgICAgIGksIGlpO1xuXG4gICAgICBpZiAoJHJvb3RFbGVtZW50KSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGlpID0gJHJvb3RFbGVtZW50Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICBpZiAoJHJvb3RFbGVtZW50W2ldID09PSBmaXJzdEVsZW1lbnRUb1JlbW92ZSkge1xuICAgICAgICAgICAgJHJvb3RFbGVtZW50W2krK10gPSBuZXdOb2RlO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IGksIGoyID0gaiArIHJlbW92ZUNvdW50IC0gMSxcbiAgICAgICAgICAgICAgICAgICAgIGpqID0gJHJvb3RFbGVtZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgaiA8IGpqOyBqKyssIGoyKyspIHtcbiAgICAgICAgICAgICAgaWYgKGoyIDwgamopIHtcbiAgICAgICAgICAgICAgICAkcm9vdEVsZW1lbnRbal0gPSAkcm9vdEVsZW1lbnRbajJdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAkcm9vdEVsZW1lbnRbal07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRyb290RWxlbWVudC5sZW5ndGggLT0gcmVtb3ZlQ291bnQgLSAxO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVwbGFjZWQgZWxlbWVudCBpcyBhbHNvIHRoZSBqUXVlcnkgLmNvbnRleHQgdGhlbiByZXBsYWNlIGl0XG4gICAgICAgICAgICAvLyAuY29udGV4dCBpcyBhIGRlcHJlY2F0ZWQgalF1ZXJ5IGFwaSwgc28gd2Ugc2hvdWxkIHNldCBpdCBvbmx5IHdoZW4galF1ZXJ5IHNldCBpdFxuICAgICAgICAgICAgLy8gaHR0cDovL2FwaS5qcXVlcnkuY29tL2NvbnRleHQvXG4gICAgICAgICAgICBpZiAoJHJvb3RFbGVtZW50LmNvbnRleHQgPT09IGZpcnN0RWxlbWVudFRvUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICRyb290RWxlbWVudC5jb250ZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgZmlyc3RFbGVtZW50VG9SZW1vdmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBlbmQgYWxsIHRoZSBgZWxlbWVudHNUb1JlbW92ZWAgdG8gYSBmcmFnbWVudC4gVGhpcyB3aWxsLi4uXG4gICAgICAvLyAtIHJlbW92ZSB0aGVtIGZyb20gdGhlIERPTVxuICAgICAgLy8gLSBhbGxvdyB0aGVtIHRvIHN0aWxsIGJlIHRyYXZlcnNlZCB3aXRoIC5uZXh0U2libGluZ1xuICAgICAgLy8gLSBhbGxvdyBhIHNpbmdsZSBmcmFnbWVudC5xU0EgdG8gZmV0Y2ggYWxsIGVsZW1lbnRzIGJlaW5nIHJlbW92ZWRcbiAgICAgIHZhciBmcmFnbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlQ291bnQ7IGkrKykge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50c1RvUmVtb3ZlW2ldKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGpxTGl0ZS5oYXNEYXRhKGZpcnN0RWxlbWVudFRvUmVtb3ZlKSkge1xuICAgICAgICAvLyBDb3B5IG92ZXIgdXNlciBkYXRhICh0aGF0IGluY2x1ZGVzIEFuZ3VsYXIncyAkc2NvcGUgZXRjLikuIERvbid0IGNvcHkgcHJpdmF0ZVxuICAgICAgICAvLyBkYXRhIGhlcmUgYmVjYXVzZSB0aGVyZSdzIG5vIHB1YmxpYyBpbnRlcmZhY2UgaW4galF1ZXJ5IHRvIGRvIHRoYXQgYW5kIGNvcHlpbmcgb3ZlclxuICAgICAgICAvLyBldmVudCBsaXN0ZW5lcnMgKHdoaWNoIGlzIHRoZSBtYWluIHVzZSBvZiBwcml2YXRlIGRhdGEpIHdvdWxkbid0IHdvcmsgYW55d2F5LlxuICAgICAgICBqcUxpdGUuZGF0YShuZXdOb2RlLCBqcUxpdGUuZGF0YShmaXJzdEVsZW1lbnRUb1JlbW92ZSkpO1xuXG4gICAgICAgIC8vIFJlbW92ZSAkZGVzdHJveSBldmVudCBsaXN0ZW5lcnMgZnJvbSBgZmlyc3RFbGVtZW50VG9SZW1vdmVgXG4gICAgICAgIGpxTGl0ZShmaXJzdEVsZW1lbnRUb1JlbW92ZSkub2ZmKCckZGVzdHJveScpO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhbnVwIGFueSBkYXRhL2xpc3RlbmVycyBvbiB0aGUgZWxlbWVudHMgYW5kIGNoaWxkcmVuLlxuICAgICAgLy8gVGhpcyBpbmNsdWRlcyBpbnZva2luZyB0aGUgJGRlc3Ryb3kgZXZlbnQgb24gYW55IGVsZW1lbnRzIHdpdGggbGlzdGVuZXJzLlxuICAgICAganFMaXRlLmNsZWFuRGF0YShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGpxTGl0ZSBjb2xsZWN0aW9uIHRvIG9ubHkgY29udGFpbiB0aGUgYG5ld05vZGVgXG4gICAgICBmb3IgKGkgPSAxOyBpIDwgcmVtb3ZlQ291bnQ7IGkrKykge1xuICAgICAgICBkZWxldGUgZWxlbWVudHNUb1JlbW92ZVtpXTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRzVG9SZW1vdmVbMF0gPSBuZXdOb2RlO1xuICAgICAgZWxlbWVudHNUb1JlbW92ZS5sZW5ndGggPSAxO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2xvbmVBbmRBbm5vdGF0ZUZuKGZuLCBhbm5vdGF0aW9uKSB7XG4gICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uKCkgeyByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfSwgZm4sIGFubm90YXRpb24pO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gaW52b2tlTGlua0ZuKGxpbmtGbiwgc2NvcGUsICRlbGVtZW50LCBhdHRycywgY29udHJvbGxlcnMsIHRyYW5zY2x1ZGVGbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGlua0ZuKHNjb3BlLCAkZWxlbWVudCwgYXR0cnMsIGNvbnRyb2xsZXJzLCB0cmFuc2NsdWRlRm4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlLCBzdGFydGluZ1RhZygkZWxlbWVudCkpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gU2V0IHVwICR3YXRjaGVzIGZvciBpc29sYXRlIHNjb3BlIGFuZCBjb250cm9sbGVyIGJpbmRpbmdzLlxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemVEaXJlY3RpdmVCaW5kaW5ncyhzY29wZSwgYXR0cnMsIGRlc3RpbmF0aW9uLCBiaW5kaW5ncywgZGlyZWN0aXZlKSB7XG4gICAgICB2YXIgcmVtb3ZlV2F0Y2hDb2xsZWN0aW9uID0gW107XG4gICAgICB2YXIgaW5pdGlhbENoYW5nZXMgPSB7fTtcbiAgICAgIHZhciBjaGFuZ2VzO1xuICAgICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24gaW5pdGlhbGl6ZUJpbmRpbmcoZGVmaW5pdGlvbiwgc2NvcGVOYW1lKSB7XG4gICAgICAgIHZhciBhdHRyTmFtZSA9IGRlZmluaXRpb24uYXR0ck5hbWUsXG4gICAgICAgIG9wdGlvbmFsID0gZGVmaW5pdGlvbi5vcHRpb25hbCxcbiAgICAgICAgbW9kZSA9IGRlZmluaXRpb24ubW9kZSwgLy8gQCwgPSwgPCwgb3IgJlxuICAgICAgICBsYXN0VmFsdWUsXG4gICAgICAgIHBhcmVudEdldCwgcGFyZW50U2V0LCBjb21wYXJlLCByZW1vdmVXYXRjaDtcblxuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcblxuICAgICAgICAgIGNhc2UgJ0AnOlxuICAgICAgICAgICAgaWYgKCFvcHRpb25hbCAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0gPSBhdHRyc1thdHRyTmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1vdmVXYXRjaCA9IGF0dHJzLiRvYnNlcnZlKGF0dHJOYW1lLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBkZXN0aW5hdGlvbltzY29wZU5hbWVdO1xuICAgICAgICAgICAgICAgIHJlY29yZENoYW5nZXMoc2NvcGVOYW1lLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhdHRycy4kJG9ic2VydmVyc1thdHRyTmFtZV0uJCRzY29wZSA9IHNjb3BlO1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gYXR0cnNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKGxhc3RWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBwcm92aWRlZCB0aGVuIHdlIHRyaWdnZXIgYW4gaW50ZXJwb2xhdGlvbiB0byBlbnN1cmVcbiAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIGlzIHRoZXJlIGZvciB1c2UgaW4gdGhlIGxpbmsgZm5cbiAgICAgICAgICAgICAgZGVzdGluYXRpb25bc2NvcGVOYW1lXSA9ICRpbnRlcnBvbGF0ZShsYXN0VmFsdWUpKHNjb3BlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNCb29sZWFuKGxhc3RWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZXMgaXMgb25lIG9mIHRoZSBCT09MRUFOX0FUVFIgdGhlbiBBbmd1bGFyIHdpbGwgaGF2ZSBjb252ZXJ0ZWRcbiAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIHRvIGJvb2xlYW4gcmF0aGVyIHRoYW4gYSBzdHJpbmcsIHNvIHdlIHNwZWNpYWwgY2FzZSB0aGlzIHNpdHVhdGlvblxuICAgICAgICAgICAgICBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gbGFzdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdGlhbENoYW5nZXNbc2NvcGVOYW1lXSA9IG5ldyBTaW1wbGVDaGFuZ2UoX1VOSU5JVElBTElaRURfVkFMVUUsIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0pO1xuICAgICAgICAgICAgcmVtb3ZlV2F0Y2hDb2xsZWN0aW9uLnB1c2gocmVtb3ZlV2F0Y2gpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICc9JzpcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChhdHRycywgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25hbCkgYnJlYWs7XG4gICAgICAgICAgICAgIGF0dHJzW2F0dHJOYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25hbCAmJiAhYXR0cnNbYXR0ck5hbWVdKSBicmVhaztcblxuICAgICAgICAgICAgcGFyZW50R2V0ID0gJHBhcnNlKGF0dHJzW2F0dHJOYW1lXSk7XG4gICAgICAgICAgICBpZiAocGFyZW50R2V0LmxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgY29tcGFyZSA9IGVxdWFscztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgICAgY29tcGFyZSA9IGZ1bmN0aW9uIHNpbXBsZUNvbXBhcmUoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudFNldCA9IHBhcmVudEdldC5hc3NpZ24gfHwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBjaGFuZ2UsIG9yIHdlIHdpbGwgdGhyb3cgdGhpcyBleGNlcHRpb24gb24gZXZlcnkgJGRpZ2VzdFxuICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gcGFyZW50R2V0KHNjb3BlKTtcbiAgICAgICAgICAgICAgdGhyb3cgJGNvbXBpbGVNaW5FcnIoJ25vbmFzc2lnbicsXG4gICAgICAgICAgICAgICAgICAnRXhwcmVzc2lvbiBcXCd7MH1cXCcgaW4gYXR0cmlidXRlIFxcJ3sxfVxcJyB1c2VkIHdpdGggZGlyZWN0aXZlIFxcJ3syfVxcJyBpcyBub24tYXNzaWduYWJsZSEnLFxuICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0ck5hbWVdLCBhdHRyTmFtZSwgZGlyZWN0aXZlLm5hbWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0gPSBwYXJlbnRHZXQoc2NvcGUpO1xuICAgICAgICAgICAgdmFyIHBhcmVudFZhbHVlV2F0Y2ggPSBmdW5jdGlvbiBwYXJlbnRWYWx1ZVdhdGNoKHBhcmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmICghY29tcGFyZShwYXJlbnRWYWx1ZSwgZGVzdGluYXRpb25bc2NvcGVOYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgb3V0IG9mIHN5bmMgYW5kIG5lZWQgdG8gY29weVxuICAgICAgICAgICAgICAgIGlmICghY29tcGFyZShwYXJlbnRWYWx1ZSwgbGFzdFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGNoYW5nZWQgYW5kIGl0IGhhcyBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gcGFyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgY2FuIGJlIGFzc2lnbmVkIHRoZW4gZG8gc29cbiAgICAgICAgICAgICAgICAgIHBhcmVudFNldChzY29wZSwgcGFyZW50VmFsdWUgPSBkZXN0aW5hdGlvbltzY29wZU5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFZhbHVlID0gcGFyZW50VmFsdWU7XG4gICAgICAgICAgICAgIHJldHVybiBsYXN0VmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcGFyZW50VmFsdWVXYXRjaC4kc3RhdGVmdWwgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGRlZmluaXRpb24uY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICByZW1vdmVXYXRjaCA9IHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oYXR0cnNbYXR0ck5hbWVdLCBwYXJlbnRWYWx1ZVdhdGNoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbW92ZVdhdGNoID0gc2NvcGUuJHdhdGNoKCRwYXJzZShhdHRyc1thdHRyTmFtZV0sIHBhcmVudFZhbHVlV2F0Y2gpLCBudWxsLCBwYXJlbnRHZXQubGl0ZXJhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1vdmVXYXRjaENvbGxlY3Rpb24ucHVzaChyZW1vdmVXYXRjaCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGF0dHJzLCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSBicmVhaztcbiAgICAgICAgICAgICAgYXR0cnNbYXR0ck5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbmFsICYmICFhdHRyc1thdHRyTmFtZV0pIGJyZWFrO1xuXG4gICAgICAgICAgICBwYXJlbnRHZXQgPSAkcGFyc2UoYXR0cnNbYXR0ck5hbWVdKTtcbiAgICAgICAgICAgIHZhciBkZWVwV2F0Y2ggPSBwYXJlbnRHZXQubGl0ZXJhbDtcblxuICAgICAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0gPSBwYXJlbnRHZXQoc2NvcGUpO1xuICAgICAgICAgICAgaW5pdGlhbENoYW5nZXNbc2NvcGVOYW1lXSA9IG5ldyBTaW1wbGVDaGFuZ2UoX1VOSU5JVElBTElaRURfVkFMVUUsIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0pO1xuXG4gICAgICAgICAgICByZW1vdmVXYXRjaCA9IHNjb3BlLiR3YXRjaChwYXJlbnRHZXQsIGZ1bmN0aW9uIHBhcmVudFZhbHVlV2F0Y2hBY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IGluaXRpYWxWYWx1ZSB8fCAoZGVlcFdhdGNoICYmIGVxdWFscyhvbGRWYWx1ZSwgaW5pdGlhbFZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVjb3JkQ2hhbmdlcyhzY29wZU5hbWUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Njb3BlTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIH0sIGRlZXBXYXRjaCk7XG5cbiAgICAgICAgICAgIHJlbW92ZVdhdGNoQ29sbGVjdGlvbi5wdXNoKHJlbW92ZVdhdGNoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICAvLyBEb24ndCBhc3NpZ24gT2JqZWN0LnByb3RvdHlwZSBtZXRob2QgdG8gc2NvcGVcbiAgICAgICAgICAgIHBhcmVudEdldCA9IGF0dHJzLmhhc093blByb3BlcnR5KGF0dHJOYW1lKSA/ICRwYXJzZShhdHRyc1thdHRyTmFtZV0pIDogbm9vcDtcblxuICAgICAgICAgICAgLy8gRG9uJ3QgYXNzaWduIG5vb3AgdG8gZGVzdGluYXRpb24gaWYgZXhwcmVzc2lvbiBpcyBub3QgdmFsaWRcbiAgICAgICAgICAgIGlmIChwYXJlbnRHZXQgPT09IG5vb3AgJiYgb3B0aW9uYWwpIGJyZWFrO1xuXG4gICAgICAgICAgICBkZXN0aW5hdGlvbltzY29wZU5hbWVdID0gZnVuY3Rpb24obG9jYWxzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJlbnRHZXQoc2NvcGUsIGxvY2Fscyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiByZWNvcmRDaGFuZ2VzKGtleSwgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGRlc3RpbmF0aW9uLiRvbkNoYW5nZXMpICYmIGN1cnJlbnRWYWx1ZSAhPT0gcHJldmlvdXNWYWx1ZSAmJlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgICAgICAgKGN1cnJlbnRWYWx1ZSA9PT0gY3VycmVudFZhbHVlIHx8IHByZXZpb3VzVmFsdWUgPT09IHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBzY2hlZHVsZWQgdGhlIHRvcCBsZXZlbCBvbkNoYW5nZXNRdWV1ZSBoYW5kbGVyIHRoZW4gZG8gc28gbm93XG4gICAgICAgICAgaWYgKCFvbkNoYW5nZXNRdWV1ZSkge1xuICAgICAgICAgICAgc2NvcGUuJCRwb3N0RGlnZXN0KGZsdXNoT25DaGFuZ2VzUXVldWUpO1xuICAgICAgICAgICAgb25DaGFuZ2VzUXVldWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBxdWV1ZWQgYSB0cmlnZ2VyIG9mIG9uQ2hhbmdlcyBmb3IgdGhpcyBjb250cm9sbGVyIHRoZW4gZG8gc28gbm93XG4gICAgICAgICAgaWYgKCFjaGFuZ2VzKSB7XG4gICAgICAgICAgICBjaGFuZ2VzID0ge307XG4gICAgICAgICAgICBvbkNoYW5nZXNRdWV1ZS5wdXNoKHRyaWdnZXJPbkNoYW5nZXNIb29rKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGhhcyBiZWVuIGEgY2hhbmdlIG9uIHRoaXMgcHJvcGVydHkgYWxyZWFkeSB0aGVuIHdlIG5lZWQgdG8gcmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgaWYgKGNoYW5nZXNba2V5XSkge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IGNoYW5nZXNba2V5XS5wcmV2aW91c1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBTdG9yZSB0aGlzIGNoYW5nZVxuICAgICAgICAgIGNoYW5nZXNba2V5XSA9IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmlnZ2VyT25DaGFuZ2VzSG9vaygpIHtcbiAgICAgICAgZGVzdGluYXRpb24uJG9uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgLy8gTm93IGNsZWFyIHRoZSBjaGFuZ2VzIHNvIHRoYXQgd2Ugc2NoZWR1bGUgb25DaGFuZ2VzIHdoZW4gbW9yZSBjaGFuZ2VzIGFycml2ZVxuICAgICAgICBjaGFuZ2VzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbml0aWFsQ2hhbmdlczogaW5pdGlhbENoYW5nZXMsXG4gICAgICAgIHJlbW92ZVdhdGNoZXM6IHJlbW92ZVdhdGNoQ29sbGVjdGlvbi5sZW5ndGggJiYgZnVuY3Rpb24gcmVtb3ZlV2F0Y2hlcygpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSByZW1vdmVXYXRjaENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgICAgICAgcmVtb3ZlV2F0Y2hDb2xsZWN0aW9uW2ldKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfV07XG59XG5cbmZ1bmN0aW9uIFNpbXBsZUNoYW5nZShwcmV2aW91cywgY3VycmVudCkge1xuICB0aGlzLnByZXZpb3VzVmFsdWUgPSBwcmV2aW91cztcbiAgdGhpcy5jdXJyZW50VmFsdWUgPSBjdXJyZW50O1xufVxuU2ltcGxlQ2hhbmdlLnByb3RvdHlwZS5pc0ZpcnN0Q2hhbmdlID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnByZXZpb3VzVmFsdWUgPT09IF9VTklOSVRJQUxJWkVEX1ZBTFVFOyB9O1xuXG5cbnZhciBQUkVGSVhfUkVHRVhQID0gL14oKD86eHxkYXRhKVs6XFwtX10pL2k7XG52YXIgU1BFQ0lBTF9DSEFSU19SRUdFWFAgPSAvWzpcXC1fXSsoLikvZztcblxuLyoqXG4gKiBDb252ZXJ0cyBhbGwgYWNjZXB0ZWQgZGlyZWN0aXZlcyBmb3JtYXQgaW50byBwcm9wZXIgZGlyZWN0aXZlIG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIHRvIG5vcm1hbGl6ZVxuICovXG5mdW5jdGlvbiBkaXJlY3RpdmVOb3JtYWxpemUobmFtZSkge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKFBSRUZJWF9SRUdFWFAsICcnKVxuICAgIC5yZXBsYWNlKFNQRUNJQUxfQ0hBUlNfUkVHRVhQLCBmbkNhbWVsQ2FzZVJlcGxhY2UpO1xufVxuXG4vKipcbiAqIEBuZ2RvYyB0eXBlXG4gKiBAbmFtZSAkY29tcGlsZS5kaXJlY3RpdmUuQXR0cmlidXRlc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSBzaGFyZWQgb2JqZWN0IGJldHdlZW4gZGlyZWN0aXZlIGNvbXBpbGUgLyBsaW5raW5nIGZ1bmN0aW9ucyB3aGljaCBjb250YWlucyBub3JtYWxpemVkIERPTVxuICogZWxlbWVudCBhdHRyaWJ1dGVzLiBUaGUgdmFsdWVzIHJlZmxlY3QgY3VycmVudCBiaW5kaW5nIHN0YXRlIGB7eyB9fWAuIFRoZSBub3JtYWxpemF0aW9uIGlzXG4gKiBuZWVkZWQgc2luY2UgYWxsIG9mIHRoZXNlIGFyZSB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgaW4gQW5ndWxhcjpcbiAqXG4gKiBgYGBcbiAqICAgIDxzcGFuIG5nOmJpbmQ9XCJhXCIgbmctYmluZD1cImFcIiBkYXRhLW5nLWJpbmQ9XCJhXCIgeC1uZy1iaW5kPVwiYVwiPlxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgcHJvcGVydHlcbiAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIG1hcCBvZiBET00gZWxlbWVudCBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbmFtZS4gVGhpcyBpc1xuICogbmVlZGVkIHRvIGRvIHJldmVyc2UgbG9va3VwIGZyb20gbm9ybWFsaXplZCBuYW1lIGJhY2sgdG8gYWN0dWFsIG5hbWUuXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lICRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRzZXRcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgRE9NIGVsZW1lbnQgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb3JtYWxpemVkIGVsZW1lbnQgYXR0cmlidXRlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIG1vZGlmeS4gVGhlIG5hbWUgaXNcbiAqICAgICAgICAgIHJldmVyc2UtdHJhbnNsYXRlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRjb21waWxlLmRpcmVjdGl2ZS5BdHRyaWJ1dGVzIyRhdHRyICRhdHRyfVxuICogICAgICAgICAgcHJvcGVydHkgdG8gdGhlIG9yaWdpbmFsIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVmFsdWUgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgdG8uIFRoZSB2YWx1ZSBjYW4gYmUgYW4gaW50ZXJwb2xhdGVkIHN0cmluZy5cbiAqL1xuXG5cblxuLyoqXG4gKiBDbG9zdXJlIGNvbXBpbGVyIHR5cGUgaW5mb3JtYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBub2Rlc2V0TGlua2luZ0ZuKFxuICAvKiBhbmd1bGFyLlNjb3BlICovIHNjb3BlLFxuICAvKiBOb2RlTGlzdCAqLyBub2RlTGlzdCxcbiAgLyogRWxlbWVudCAqLyByb290RWxlbWVudCxcbiAgLyogZnVuY3Rpb24oRnVuY3Rpb24pICovIGJvdW5kVHJhbnNjbHVkZUZuXG4pIHt9XG5cbmZ1bmN0aW9uIGRpcmVjdGl2ZUxpbmtpbmdGbihcbiAgLyogbm9kZXNldExpbmtpbmdGbiAqLyBub2Rlc2V0TGlua2luZ0ZuLFxuICAvKiBhbmd1bGFyLlNjb3BlICovIHNjb3BlLFxuICAvKiBOb2RlICovIG5vZGUsXG4gIC8qIEVsZW1lbnQgKi8gcm9vdEVsZW1lbnQsXG4gIC8qIGZ1bmN0aW9uKEZ1bmN0aW9uKSAqLyBib3VuZFRyYW5zY2x1ZGVGblxuKSB7fVxuXG5mdW5jdGlvbiB0b2tlbkRpZmZlcmVuY2Uoc3RyMSwgc3RyMikge1xuICB2YXIgdmFsdWVzID0gJycsXG4gICAgICB0b2tlbnMxID0gc3RyMS5zcGxpdCgvXFxzKy8pLFxuICAgICAgdG9rZW5zMiA9IHN0cjIuc3BsaXQoL1xccysvKTtcblxuICBvdXRlcjpcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMxLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRva2VuID0gdG9rZW5zMVtpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRva2VuczIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmICh0b2tlbiA9PT0gdG9rZW5zMltqXSkgY29udGludWUgb3V0ZXI7XG4gICAgfVxuICAgIHZhbHVlcyArPSAodmFsdWVzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyB0b2tlbjtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDb21tZW50cyhqcU5vZGVzKSB7XG4gIGpxTm9kZXMgPSBqcUxpdGUoanFOb2Rlcyk7XG4gIHZhciBpID0ganFOb2Rlcy5sZW5ndGg7XG5cbiAgaWYgKGkgPD0gMSkge1xuICAgIHJldHVybiBqcU5vZGVzO1xuICB9XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBub2RlID0ganFOb2Rlc1tpXTtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0NPTU1FTlQgfHxcbiAgICAgICAobm9kZS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX1RFWFQgJiYgbm9kZS5ub2RlVmFsdWUudHJpbSgpID09PSAnJykpIHtcbiAgICAgICAgIHNwbGljZS5jYWxsKGpxTm9kZXMsIGksIDEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ganFOb2Rlcztcbn1cblxudmFyICRjb250cm9sbGVyTWluRXJyID0gbWluRXJyKCckY29udHJvbGxlcicpO1xuXG5cbnZhciBDTlRSTF9SRUcgPSAvXihcXFMrKShcXHMrYXNcXHMrKFtcXHckXSspKT8kLztcbmZ1bmN0aW9uIGlkZW50aWZpZXJGb3JDb250cm9sbGVyKGNvbnRyb2xsZXIsIGlkZW50KSB7XG4gIGlmIChpZGVudCAmJiBpc1N0cmluZyhpZGVudCkpIHJldHVybiBpZGVudDtcbiAgaWYgKGlzU3RyaW5nKGNvbnRyb2xsZXIpKSB7XG4gICAgdmFyIG1hdGNoID0gQ05UUkxfUkVHLmV4ZWMoY29udHJvbGxlcik7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbM107XG4gIH1cbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGNvbnRyb2xsZXJQcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgbmcuJGNvbnRyb2xsZXIgJGNvbnRyb2xsZXIgc2VydmljZX0gaXMgdXNlZCBieSBBbmd1bGFyIHRvIGNyZWF0ZSBuZXdcbiAqIGNvbnRyb2xsZXJzLlxuICpcbiAqIFRoaXMgcHJvdmlkZXIgYWxsb3dzIGNvbnRyb2xsZXIgcmVnaXN0cmF0aW9uIHZpYSB0aGVcbiAqIHtAbGluayBuZy4kY29udHJvbGxlclByb3ZpZGVyI3JlZ2lzdGVyIHJlZ2lzdGVyfSBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uICRDb250cm9sbGVyUHJvdmlkZXIoKSB7XG4gIHZhciBjb250cm9sbGVycyA9IHt9LFxuICAgICAgZ2xvYmFscyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb250cm9sbGVyUHJvdmlkZXIjaGFzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENvbnRyb2xsZXIgbmFtZSB0byBjaGVjay5cbiAgICovXG4gIHRoaXMuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiBjb250cm9sbGVycy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkY29udHJvbGxlclByb3ZpZGVyI3JlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBDb250cm9sbGVyIG5hbWUsIG9yIGFuIG9iamVjdCBtYXAgb2YgY29udHJvbGxlcnMgd2hlcmUgdGhlIGtleXMgYXJlXG4gICAqICAgIHRoZSBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGNvbnN0cnVjdG9ycy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gY29uc3RydWN0b3IgQ29udHJvbGxlciBjb25zdHJ1Y3RvciBmbiAob3B0aW9uYWxseSBkZWNvcmF0ZWQgd2l0aCBESVxuICAgKiAgICBhbm5vdGF0aW9ucyBpbiB0aGUgYXJyYXkgbm90YXRpb24pLlxuICAgKi9cbiAgdGhpcy5yZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUsIGNvbnN0cnVjdG9yKSB7XG4gICAgYXNzZXJ0Tm90SGFzT3duUHJvcGVydHkobmFtZSwgJ2NvbnRyb2xsZXInKTtcbiAgICBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICAgIGV4dGVuZChjb250cm9sbGVycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRyb2xsZXJzW25hbWVdID0gY29uc3RydWN0b3I7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRjb250cm9sbGVyUHJvdmlkZXIjYWxsb3dHbG9iYWxzXG4gICAqIEBkZXNjcmlwdGlvbiBJZiBjYWxsZWQsIGFsbG93cyBgJGNvbnRyb2xsZXJgIHRvIGZpbmQgY29udHJvbGxlciBjb25zdHJ1Y3RvcnMgb24gYHdpbmRvd2BcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogc2luY2VWZXJzaW9uPVwidjEuMy4wXCJcbiAgICogcmVtb3ZlVmVyc2lvbj1cInYxLjcuMFwiXG4gICAqIFRoaXMgbWV0aG9kIG9mIGZpbmRpbmcgY29udHJvbGxlcnMgaGFzIGJlZW4gZGVwcmVjYXRlZC5cbiAgICovXG4gIHRoaXMuYWxsb3dHbG9iYWxzID0gZnVuY3Rpb24oKSB7XG4gICAgZ2xvYmFscyA9IHRydWU7XG4gIH07XG5cblxuICB0aGlzLiRnZXQgPSBbJyRpbmplY3RvcicsICckd2luZG93JywgZnVuY3Rpb24oJGluamVjdG9yLCAkd2luZG93KSB7XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2Mgc2VydmljZVxuICAgICAqIEBuYW1lICRjb250cm9sbGVyXG4gICAgICogQHJlcXVpcmVzICRpbmplY3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGNvbnN0cnVjdG9yIElmIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb24gdGhlbiBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgdGhlXG4gICAgICogICAgY29udHJvbGxlciBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gT3RoZXJ3aXNlIGl0J3MgY29uc2lkZXJlZCB0byBiZSBhIHN0cmluZyB3aGljaCBpcyB1c2VkXG4gICAgICogICAgdG8gcmV0cmlldmUgdGhlIGNvbnRyb2xsZXIgY29uc3RydWN0b3IgdXNpbmcgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICAgKlxuICAgICAqICAgICogY2hlY2sgaWYgYSBjb250cm9sbGVyIHdpdGggZ2l2ZW4gbmFtZSBpcyByZWdpc3RlcmVkIHZpYSBgJGNvbnRyb2xsZXJQcm92aWRlcmBcbiAgICAgKiAgICAqIGNoZWNrIGlmIGV2YWx1YXRpbmcgdGhlIHN0cmluZyBvbiB0aGUgY3VycmVudCBzY29wZSByZXR1cm5zIGEgY29uc3RydWN0b3JcbiAgICAgKiAgICAqIGlmICRjb250cm9sbGVyUHJvdmlkZXIjYWxsb3dHbG9iYWxzLCBjaGVjayBgd2luZG93W2NvbnN0cnVjdG9yXWAgb24gdGhlIGdsb2JhbFxuICAgICAqICAgICAgYHdpbmRvd2Agb2JqZWN0IChkZXByZWNhdGVkLCBub3QgcmVjb21tZW5kZWQpXG4gICAgICpcbiAgICAgKiAgICBUaGUgc3RyaW5nIGNhbiB1c2UgdGhlIGBjb250cm9sbGVyIGFzIHByb3BlcnR5YCBzeW50YXgsIHdoZXJlIHRoZSBjb250cm9sbGVyIGluc3RhbmNlIGlzIHB1Ymxpc2hlZFxuICAgICAqICAgIGFzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgb24gdGhlIGBzY29wZWA7IHRoZSBgc2NvcGVgIG11c3QgYmUgaW5qZWN0ZWQgaW50byBgbG9jYWxzYCBwYXJhbSBmb3IgdGhpc1xuICAgICAqICAgIHRvIHdvcmsgY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxvY2FscyBJbmplY3Rpb24gbG9jYWxzIGZvciBDb250cm9sbGVyLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gSW5zdGFuY2Ugb2YgZ2l2ZW4gY29udHJvbGxlci5cbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIGAkY29udHJvbGxlcmAgc2VydmljZSBpcyByZXNwb25zaWJsZSBmb3IgaW5zdGFudGlhdGluZyBjb250cm9sbGVycy5cbiAgICAgKlxuICAgICAqIEl0J3MganVzdCBhIHNpbXBsZSBjYWxsIHRvIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9LCBidXQgZXh0cmFjdGVkIGludG9cbiAgICAgKiBhIHNlcnZpY2UsIHNvIHRoYXQgb25lIGNhbiBvdmVycmlkZSB0aGlzIHNlcnZpY2Ugd2l0aCBbQkMgdmVyc2lvbl0oaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTY0OTc4OCkuXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uICRjb250cm9sbGVyKGV4cHJlc3Npb24sIGxvY2FscywgbGF0ZXIsIGlkZW50KSB7XG4gICAgICAvLyBQUklWQVRFIEFQSTpcbiAgICAgIC8vICAgcGFyYW0gYGxhdGVyYCAtLS0gaW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2xsZXIncyBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIGF0IGEgbGF0ZXIgdGltZS5cbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgSWYgdHJ1ZSwgJGNvbnRyb2xsZXIgd2lsbCBhbGxvY2F0ZSB0aGUgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3RcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlIGNoYWluLCBidXQgd2lsbCBub3QgaW52b2tlIHRoZSBjb250cm9sbGVyIHVudGlsIGEgcmV0dXJuZWRcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgaXMgaW52b2tlZC5cbiAgICAgIC8vICAgcGFyYW0gYGlkZW50YCAtLS0gQW4gb3B0aW9uYWwgbGFiZWwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBsYWJlbCBwYXJzZWQgZnJvbSB0aGUgY29udHJvbGxlclxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBpZiBhbnkuXG4gICAgICB2YXIgaW5zdGFuY2UsIG1hdGNoLCBjb25zdHJ1Y3RvciwgaWRlbnRpZmllcjtcbiAgICAgIGxhdGVyID0gbGF0ZXIgPT09IHRydWU7XG4gICAgICBpZiAoaWRlbnQgJiYgaXNTdHJpbmcoaWRlbnQpKSB7XG4gICAgICAgIGlkZW50aWZpZXIgPSBpZGVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3RyaW5nKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaChDTlRSTF9SRUcpO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgJGNvbnRyb2xsZXJNaW5FcnIoJ2N0cmxmbXQnLFxuICAgICAgICAgICAgJ0JhZGx5IGZvcm1lZCBjb250cm9sbGVyIHN0cmluZyBcXCd7MH1cXCcuICcgK1xuICAgICAgICAgICAgJ011c3QgbWF0Y2ggYF9fbmFtZV9fIGFzIF9faWRfX2Agb3IgYF9fbmFtZV9fYC4nLCBleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdHJ1Y3RvciA9IG1hdGNoWzFdO1xuICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllciB8fCBtYXRjaFszXTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGNvbnRyb2xsZXJzLmhhc093blByb3BlcnR5KGNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgPyBjb250cm9sbGVyc1tjb25zdHJ1Y3Rvcl1cbiAgICAgICAgICAgIDogZ2V0dGVyKGxvY2Fscy4kc2NvcGUsIGNvbnN0cnVjdG9yLCB0cnVlKSB8fFxuICAgICAgICAgICAgICAgIChnbG9iYWxzID8gZ2V0dGVyKCR3aW5kb3csIGNvbnN0cnVjdG9yLCB0cnVlKSA6IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgaWYgKCFleHByZXNzaW9uKSB7XG4gICAgICAgICAgdGhyb3cgJGNvbnRyb2xsZXJNaW5FcnIoJ2N0cmxyZWcnLFxuICAgICAgICAgICAgJ1RoZSBjb250cm9sbGVyIHdpdGggdGhlIG5hbWUgXFwnezB9XFwnIGlzIG5vdCByZWdpc3RlcmVkLicsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydEFyZ0ZuKGV4cHJlc3Npb24sIGNvbnN0cnVjdG9yLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhdGVyKSB7XG4gICAgICAgIC8vIEluc3RhbnRpYXRlIGNvbnRyb2xsZXIgbGF0ZXI6XG4gICAgICAgIC8vIFRoaXMgbWFjaGluZXJ5IGlzIHVzZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdGhlXG4gICAgICAgIC8vIGNvbnRyb2xsZXIncyBjb25zdHJ1Y3RvciBpdHNlbGYuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXIgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpc1xuICAgICAgICAvLyBpbnZva2VkLiBQcmltYXJpbHksIHRoaXMgaXMgdXNlZCBmb3IgaXNvbGF0ZSBzY29wZSBiaW5kaW5ncyBpbiAkY29tcGlsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucywgYW5kIGlzIHRodXMgbm90IGRvY3VtZW50ZWRcbiAgICAgICAgLy8gcHVibGljbHkuXG4gICAgICAgIC8vIE9iamVjdCBjcmVhdGlvbjogaHR0cDovL2pzcGVyZi5jb20vY3JlYXRlLWNvbnN0cnVjdG9yLzJcbiAgICAgICAgdmFyIGNvbnRyb2xsZXJQcm90b3R5cGUgPSAoaXNBcnJheShleHByZXNzaW9uKSA/XG4gICAgICAgICAgZXhwcmVzc2lvbltleHByZXNzaW9uLmxlbmd0aCAtIDFdIDogZXhwcmVzc2lvbikucHJvdG90eXBlO1xuICAgICAgICBpbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoY29udHJvbGxlclByb3RvdHlwZSB8fCBudWxsKTtcblxuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIGFkZElkZW50aWZpZXIobG9jYWxzLCBpZGVudGlmaWVyLCBpbnN0YW5jZSwgY29uc3RydWN0b3IgfHwgZXhwcmVzc2lvbi5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gJGNvbnRyb2xsZXJJbml0KCkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSAkaW5qZWN0b3IuaW52b2tlKGV4cHJlc3Npb24sIGluc3RhbmNlLCBsb2NhbHMsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSBpbnN0YW5jZSAmJiAoaXNPYmplY3QocmVzdWx0KSB8fCBpc0Z1bmN0aW9uKHJlc3VsdCkpKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIC8vIElmIHJlc3VsdCBjaGFuZ2VkLCByZS1hc3NpZ24gY29udHJvbGxlckFzIHZhbHVlIHRvIHNjb3BlLlxuICAgICAgICAgICAgICBhZGRJZGVudGlmaWVyKGxvY2FscywgaWRlbnRpZmllciwgaW5zdGFuY2UsIGNvbnN0cnVjdG9yIHx8IGV4cHJlc3Npb24ubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSwge1xuICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZSA9ICRpbmplY3Rvci5pbnN0YW50aWF0ZShleHByZXNzaW9uLCBsb2NhbHMsIGNvbnN0cnVjdG9yKTtcblxuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgYWRkSWRlbnRpZmllcihsb2NhbHMsIGlkZW50aWZpZXIsIGluc3RhbmNlLCBjb25zdHJ1Y3RvciB8fCBleHByZXNzaW9uLm5hbWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFkZElkZW50aWZpZXIobG9jYWxzLCBpZGVudGlmaWVyLCBpbnN0YW5jZSwgbmFtZSkge1xuICAgICAgaWYgKCEobG9jYWxzICYmIGlzT2JqZWN0KGxvY2Fscy4kc2NvcGUpKSkge1xuICAgICAgICB0aHJvdyBtaW5FcnIoJyRjb250cm9sbGVyJykoJ25vc2NwJyxcbiAgICAgICAgICAnQ2Fubm90IGV4cG9ydCBjb250cm9sbGVyIFxcJ3swfVxcJyBhcyBcXCd7MX1cXCchIE5vICRzY29wZSBvYmplY3QgcHJvdmlkZWQgdmlhIGBsb2NhbHNgLicsXG4gICAgICAgICAgbmFtZSwgaWRlbnRpZmllcik7XG4gICAgICB9XG5cbiAgICAgIGxvY2Fscy4kc2NvcGVbaWRlbnRpZmllcl0gPSBpbnN0YW5jZTtcbiAgICB9XG4gIH1dO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkZG9jdW1lbnRcbiAqIEByZXF1aXJlcyAkd2luZG93XG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQSB7QGxpbmsgYW5ndWxhci5lbGVtZW50IGpRdWVyeSBvciBqcUxpdGV9IHdyYXBwZXIgZm9yIHRoZSBicm93c2VyJ3MgYHdpbmRvdy5kb2N1bWVudGAgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJkb2N1bWVudEV4YW1wbGVcIiBuYW1lPVwiZG9jdW1lbnRcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPHA+JGRvY3VtZW50IHRpdGxlOiA8YiBuZy1iaW5kPVwidGl0bGVcIj48L2I+PC9wPlxuICAgICAgICAgPHA+d2luZG93LmRvY3VtZW50IHRpdGxlOiA8YiBuZy1iaW5kPVwid2luZG93VGl0bGVcIj48L2I+PC9wPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnZG9jdW1lbnRFeGFtcGxlJywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICckZG9jdW1lbnQnLCBmdW5jdGlvbigkc2NvcGUsICRkb2N1bWVudCkge1xuICAgICAgICAgICAkc2NvcGUudGl0bGUgPSAkZG9jdW1lbnRbMF0udGl0bGU7XG4gICAgICAgICAgICRzY29wZS53aW5kb3dUaXRsZSA9IGFuZ3VsYXIuZWxlbWVudCh3aW5kb3cuZG9jdW1lbnQpWzBdLnRpdGxlO1xuICAgICAgICAgfV0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbmZ1bmN0aW9uICREb2N1bWVudFByb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCBmdW5jdGlvbih3aW5kb3cpIHtcbiAgICByZXR1cm4ganFMaXRlKHdpbmRvdy5kb2N1bWVudCk7XG4gIH1dO1xufVxuXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEB0aGlzXG4gKiBMaXN0ZW5zIGZvciBkb2N1bWVudCB2aXNpYmlsaXR5IGNoYW5nZSBhbmQgbWFrZXMgdGhlIGN1cnJlbnQgc3RhdHVzIGFjY2Vzc2libGUuXG4gKi9cbmZ1bmN0aW9uICQkSXNEb2N1bWVudEhpZGRlblByb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSBbJyRkb2N1bWVudCcsICckcm9vdFNjb3BlJywgZnVuY3Rpb24oJGRvY3VtZW50LCAkcm9vdFNjb3BlKSB7XG4gICAgdmFyIGRvYyA9ICRkb2N1bWVudFswXTtcbiAgICB2YXIgaGlkZGVuID0gZG9jICYmIGRvYy5oaWRkZW47XG5cbiAgICAkZG9jdW1lbnQub24oJ3Zpc2liaWxpdHljaGFuZ2UnLCBjaGFuZ2VMaXN0ZW5lcik7XG5cbiAgICAkcm9vdFNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbigpIHtcbiAgICAgICRkb2N1bWVudC5vZmYoJ3Zpc2liaWxpdHljaGFuZ2UnLCBjaGFuZ2VMaXN0ZW5lcik7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjaGFuZ2VMaXN0ZW5lcigpIHtcbiAgICAgIGhpZGRlbiA9IGRvYy5oaWRkZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhpZGRlbjtcbiAgICB9O1xuICB9XTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJGV4Y2VwdGlvbkhhbmRsZXJcbiAqIEByZXF1aXJlcyBuZy4kbG9nXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBhbmd1bGFyIGV4cHJlc3Npb25zIGlzIGRlbGVnYXRlZCB0byB0aGlzIHNlcnZpY2UuXG4gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgZGVsZWdhdGVzIHRvIGAkbG9nLmVycm9yYCB3aGljaCBsb2dzIGl0IGludG9cbiAqIHRoZSBicm93c2VyIGNvbnNvbGUuXG4gKlxuICogSW4gdW5pdCB0ZXN0cywgaWYgYGFuZ3VsYXItbW9ja3MuanNgIGlzIGxvYWRlZCwgdGhpcyBzZXJ2aWNlIGlzIG92ZXJyaWRkZW4gYnlcbiAqIHtAbGluayBuZ01vY2suJGV4Y2VwdGlvbkhhbmRsZXIgbW9jayAkZXhjZXB0aW9uSGFuZGxlcn0gd2hpY2ggYWlkcyBpbiB0ZXN0aW5nLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICogVGhlIGV4YW1wbGUgYmVsb3cgd2lsbCBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgYCRleGNlcHRpb25IYW5kbGVyYCBpbiBvcmRlciB0byAoYSkgbG9nIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gdGhlIGJhY2tlbmQgZm9yIGxhdGVyIGluc3BlY3Rpb24gYnkgdGhlIGRldmVsb3BlcnMgYW5kIChiKSB0byB1c2UgYCRsb2cud2FybigpYCBpbnN0ZWFkXG4gKiBvZiBgJGxvZy5lcnJvcigpYC5cbiAqXG4gKiBgYGBqc1xuICogICBhbmd1bGFyLlxuICogICAgIG1vZHVsZSgnZXhjZXB0aW9uT3ZlcndyaXRlJywgW10pLlxuICogICAgIGZhY3RvcnkoJyRleGNlcHRpb25IYW5kbGVyJywgWyckbG9nJywgJ2xvZ0Vycm9yc1RvQmFja2VuZCcsIGZ1bmN0aW9uKCRsb2csIGxvZ0Vycm9yc1RvQmFja2VuZCkge1xuICogICAgICAgcmV0dXJuIGZ1bmN0aW9uIG15RXhjZXB0aW9uSGFuZGxlcihleGNlcHRpb24sIGNhdXNlKSB7XG4gKiAgICAgICAgIGxvZ0Vycm9yc1RvQmFja2VuZChleGNlcHRpb24sIGNhdXNlKTtcbiAqICAgICAgICAgJGxvZy53YXJuKGV4Y2VwdGlvbiwgY2F1c2UpO1xuICogICAgICAgfTtcbiAqICAgICB9XSk7XG4gKiBgYGBcbiAqXG4gKiA8aHIgLz5cbiAqIE5vdGUsIHRoYXQgY29kZSBleGVjdXRlZCBpbiBldmVudC1saXN0ZW5lcnMgKGV2ZW4gdGhvc2UgcmVnaXN0ZXJlZCB1c2luZyBqcUxpdGUncyBgb25gL2BiaW5kYFxuICogbWV0aG9kcykgZG9lcyBub3QgZGVsZWdhdGUgZXhjZXB0aW9ucyB0byB0aGUge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfVxuICogKHVubGVzcyBleGVjdXRlZCBkdXJpbmcgYSBkaWdlc3QpLlxuICpcbiAqIElmIHlvdSB3aXNoLCB5b3UgY2FuIG1hbnVhbGx5IGRlbGVnYXRlIGV4Y2VwdGlvbnMsIGUuZy5cbiAqIGB0cnkgeyAuLi4gfSBjYXRjaChlKSB7ICRleGNlcHRpb25IYW5kbGVyKGUpOyB9YFxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGV4Y2VwdGlvbiBFeGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gY2F1c2UgT3B0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRleHQgaW4gd2hpY2hcbiAqICAgICAgIHRoZSBlcnJvciB3YXMgdGhyb3duLlxuICpcbiAqL1xuZnVuY3Rpb24gJEV4Y2VwdGlvbkhhbmRsZXJQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckbG9nJywgZnVuY3Rpb24oJGxvZykge1xuICAgIHJldHVybiBmdW5jdGlvbihleGNlcHRpb24sIGNhdXNlKSB7XG4gICAgICAkbG9nLmVycm9yLmFwcGx5KCRsb2csIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfV07XG59XG5cbnZhciAkJEZvcmNlUmVmbG93UHJvdmlkZXIgPSAvKiogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG4gIHRoaXMuJGdldCA9IFsnJGRvY3VtZW50JywgZnVuY3Rpb24oJGRvY3VtZW50KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRvbU5vZGUpIHtcbiAgICAgIC8vdGhlIGxpbmUgYmVsb3cgd2lsbCBmb3JjZSB0aGUgYnJvd3NlciB0byBwZXJmb3JtIGEgcmVwYWludCBzb1xuICAgICAgLy90aGF0IGFsbCB0aGUgYW5pbWF0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBhbmltYXRpb24gZnJhbWUgd2lsbFxuICAgICAgLy9iZSBwcm9wZXJseSB1cGRhdGVkIGFuZCBkcmF3biBvbiBzY3JlZW4uIFRoaXMgaXMgcmVxdWlyZWQgdG9cbiAgICAgIC8vZW5zdXJlIHRoYXQgdGhlIHByZXBhcmF0aW9uIGFuaW1hdGlvbiBpcyBwcm9wZXJseSBmbHVzaGVkIHNvIHRoYXRcbiAgICAgIC8vdGhlIGFjdGl2ZSBzdGF0ZSBwaWNrcyB1cCBmcm9tIHRoZXJlLiBETyBOT1QgUkVNT1ZFIFRISVMgTElORS5cbiAgICAgIC8vRE8gTk9UIE9QVElNSVpFIFRISVMgTElORS4gVEhFIE1JTklGSUVSIFdJTEwgUkVNT1ZFIElUIE9USEVSV0lTRSBXSElDSFxuICAgICAgLy9XSUxMIFJFU1VMVCBJTiBBTiBVTlBSRURJQ1RBQkxFIEJVRyBUSEFUIElTIFZFUlkgSEFSRCBUTyBUUkFDSyBET1dOIEFORFxuICAgICAgLy9XSUxMIFRBS0UgWUVBUlMgQVdBWSBGUk9NIFlPVVIgTElGRS5cbiAgICAgIGlmIChkb21Ob2RlKSB7XG4gICAgICAgIGlmICghZG9tTm9kZS5ub2RlVHlwZSAmJiBkb21Ob2RlIGluc3RhbmNlb2YganFMaXRlKSB7XG4gICAgICAgICAgZG9tTm9kZSA9IGRvbU5vZGVbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbU5vZGUgPSAkZG9jdW1lbnRbMF0uYm9keTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkb21Ob2RlLm9mZnNldFdpZHRoICsgMTtcbiAgICB9O1xuICB9XTtcbn07XG5cbnZhciBBUFBMSUNBVElPTl9KU09OID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xudmFyIENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OID0geydDb250ZW50LVR5cGUnOiBBUFBMSUNBVElPTl9KU09OICsgJztjaGFyc2V0PXV0Zi04J307XG52YXIgSlNPTl9TVEFSVCA9IC9eXFxbfF5cXHsoPyFcXHspLztcbnZhciBKU09OX0VORFMgPSB7XG4gICdbJzogL10kLyxcbiAgJ3snOiAvfSQvXG59O1xudmFyIEpTT05fUFJPVEVDVElPTl9QUkVGSVggPSAvXlxcKV1cXH0nLD9cXG4vO1xudmFyICRodHRwTWluRXJyID0gbWluRXJyKCckaHR0cCcpO1xuXG5mdW5jdGlvbiBzZXJpYWxpemVWYWx1ZSh2KSB7XG4gIGlmIChpc09iamVjdCh2KSkge1xuICAgIHJldHVybiBpc0RhdGUodikgPyB2LnRvSVNPU3RyaW5nKCkgOiB0b0pzb24odik7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkSHR0cFBhcmFtU2VyaWFsaXplclByb3ZpZGVyKCkge1xuICAvKipcbiAgICogQG5nZG9jIHNlcnZpY2VcbiAgICogQG5hbWUgJGh0dHBQYXJhbVNlcmlhbGl6ZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIERlZmF1bHQge0BsaW5rICRodHRwIGAkaHR0cGB9IHBhcmFtcyBzZXJpYWxpemVyIHRoYXQgY29udmVydHMgb2JqZWN0cyB0byBzdHJpbmdzXG4gICAqIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOlxuICAgKlxuICAgKiAqIGB7J2Zvbyc6ICdiYXInfWAgcmVzdWx0cyBpbiBgZm9vPWJhcmBcbiAgICogKiBgeydmb28nOiBEYXRlLm5vdygpfWAgcmVzdWx0cyBpbiBgZm9vPTIwMTUtMDQtMDFUMDklM0E1MCUzQTQ5LjI2MlpgIChgdG9JU09TdHJpbmcoKWAgYW5kIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgYSBEYXRlIG9iamVjdClcbiAgICogKiBgeydmb28nOiBbJ2JhcicsICdiYXonXX1gIHJlc3VsdHMgaW4gYGZvbz1iYXImZm9vPWJhemAgKHJlcGVhdGVkIGtleSBmb3IgZWFjaCBhcnJheSBlbGVtZW50KVxuICAgKiAqIGB7J2Zvbyc6IHsnYmFyJzonYmF6J319YCByZXN1bHRzIGluIGBmb289JTdCJTIyYmFyJTIyJTNBJTIyYmF6JTIyJTdEYCAoc3RyaW5naWZpZWQgYW5kIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0KVxuICAgKlxuICAgKiBOb3RlIHRoYXQgc2VyaWFsaXplciB3aWxsIHNvcnQgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBhbHBoYWJldGljYWxseS5cbiAgICogKi9cblxuICB0aGlzLiRnZXQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmdQYXJhbVNlcmlhbGl6ZXIocGFyYW1zKSB7XG4gICAgICBpZiAoIXBhcmFtcykgcmV0dXJuICcnO1xuICAgICAgdmFyIHBhcnRzID0gW107XG4gICAgICBmb3JFYWNoU29ydGVkKHBhcmFtcywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGZvckVhY2godmFsdWUsIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5KSAgKyAnPScgKyBlbmNvZGVVcmlRdWVyeShzZXJpYWxpemVWYWx1ZSh2KSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkoa2V5KSArICc9JyArIGVuY29kZVVyaVF1ZXJ5KHNlcmlhbGl6ZVZhbHVlKHZhbHVlKSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyYnKTtcbiAgICB9O1xuICB9O1xufVxuXG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICRIdHRwUGFyYW1TZXJpYWxpemVySlFMaWtlUHJvdmlkZXIoKSB7XG4gIC8qKlxuICAgKiBAbmdkb2Mgc2VydmljZVxuICAgKiBAbmFtZSAkaHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICogQWx0ZXJuYXRpdmUge0BsaW5rICRodHRwIGAkaHR0cGB9IHBhcmFtcyBzZXJpYWxpemVyIHRoYXQgZm9sbG93c1xuICAgKiBqUXVlcnkncyBbYHBhcmFtKClgXShodHRwOi8vYXBpLmpxdWVyeS5jb20vanF1ZXJ5LnBhcmFtLykgbWV0aG9kIGxvZ2ljLlxuICAgKiBUaGUgc2VyaWFsaXplciB3aWxsIGFsc28gc29ydCB0aGUgcGFyYW1zIGFscGhhYmV0aWNhbGx5LlxuICAgKlxuICAgKiBUbyB1c2UgaXQgZm9yIHNlcmlhbGl6aW5nIGAkaHR0cGAgcmVxdWVzdCBwYXJhbWV0ZXJzLCBzZXQgaXQgYXMgdGhlIGBwYXJhbVNlcmlhbGl6ZXJgIHByb3BlcnR5OlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAkaHR0cCh7XG4gICAqICAgdXJsOiBteVVybCxcbiAgICogICBtZXRob2Q6ICdHRVQnLFxuICAgKiAgIHBhcmFtczogbXlQYXJhbXMsXG4gICAqICAgcGFyYW1TZXJpYWxpemVyOiAnJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2UnXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZXQgaXQgYXMgdGhlIGRlZmF1bHQgYHBhcmFtU2VyaWFsaXplcmAgaW4gdGhlXG4gICAqIHtAbGluayAkaHR0cFByb3ZpZGVyI2RlZmF1bHRzIGAkaHR0cFByb3ZpZGVyYH0uXG4gICAqXG4gICAqIEFkZGl0aW9uYWxseSwgeW91IGNhbiBpbmplY3QgdGhlIHNlcmlhbGl6ZXIgYW5kIHVzZSBpdCBleHBsaWNpdGx5LCBmb3IgZXhhbXBsZSB0byBzZXJpYWxpemVcbiAgICogZm9ybSBkYXRhIGZvciBzdWJtaXNzaW9uOlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAuY29udHJvbGxlcihmdW5jdGlvbigkaHR0cCwgJGh0dHBQYXJhbVNlcmlhbGl6ZXJKUUxpa2UpIHtcbiAgICogICAvLy4uLlxuICAgKlxuICAgKiAgICRodHRwKHtcbiAgICogICAgIHVybDogbXlVcmwsXG4gICAqICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICogICAgIGRhdGE6ICRodHRwUGFyYW1TZXJpYWxpemVySlFMaWtlKG15RGF0YSksXG4gICAqICAgICBoZWFkZXJzOiB7XG4gICAqICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqICovXG4gIHRoaXMuJGdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBqUXVlcnlMaWtlUGFyYW1TZXJpYWxpemVyKHBhcmFtcykge1xuICAgICAgaWYgKCFwYXJhbXMpIHJldHVybiAnJztcbiAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgc2VyaWFsaXplKHBhcmFtcywgJycsIHRydWUpO1xuICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJyYnKTtcblxuICAgICAgZnVuY3Rpb24gc2VyaWFsaXplKHRvU2VyaWFsaXplLCBwcmVmaXgsIHRvcExldmVsKSB7XG4gICAgICAgIGlmICh0b1NlcmlhbGl6ZSA9PT0gbnVsbCB8fCBpc1VuZGVmaW5lZCh0b1NlcmlhbGl6ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGlzQXJyYXkodG9TZXJpYWxpemUpKSB7XG4gICAgICAgICAgZm9yRWFjaCh0b1NlcmlhbGl6ZSwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICBzZXJpYWxpemUodmFsdWUsIHByZWZpeCArICdbJyArIChpc09iamVjdCh2YWx1ZSkgPyBpbmRleCA6ICcnKSArICddJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodG9TZXJpYWxpemUpICYmICFpc0RhdGUodG9TZXJpYWxpemUpKSB7XG4gICAgICAgICAgZm9yRWFjaFNvcnRlZCh0b1NlcmlhbGl6ZSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgc2VyaWFsaXplKHZhbHVlLCBwcmVmaXggK1xuICAgICAgICAgICAgICAgICh0b3BMZXZlbCA/ICcnIDogJ1snKSArXG4gICAgICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICAgICAodG9wTGV2ZWwgPyAnJyA6ICddJykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnRzLnB1c2goZW5jb2RlVXJpUXVlcnkocHJlZml4KSArICc9JyArIGVuY29kZVVyaVF1ZXJ5KHNlcmlhbGl6ZVZhbHVlKHRvU2VyaWFsaXplKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEh0dHBSZXNwb25zZVRyYW5zZm9ybShkYXRhLCBoZWFkZXJzKSB7XG4gIGlmIChpc1N0cmluZyhkYXRhKSkge1xuICAgIC8vIFN0cmlwIGpzb24gdnVsbmVyYWJpbGl0eSBwcm90ZWN0aW9uIHByZWZpeCBhbmQgdHJpbSB3aGl0ZXNwYWNlXG4gICAgdmFyIHRlbXBEYXRhID0gZGF0YS5yZXBsYWNlKEpTT05fUFJPVEVDVElPTl9QUkVGSVgsICcnKS50cmltKCk7XG5cbiAgICBpZiAodGVtcERhdGEpIHtcbiAgICAgIHZhciBjb250ZW50VHlwZSA9IGhlYWRlcnMoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgaWYgKChjb250ZW50VHlwZSAmJiAoY29udGVudFR5cGUuaW5kZXhPZihBUFBMSUNBVElPTl9KU09OKSA9PT0gMCkpIHx8IGlzSnNvbkxpa2UodGVtcERhdGEpKSB7XG4gICAgICAgIGRhdGEgPSBmcm9tSnNvbih0ZW1wRGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGlzSnNvbkxpa2Uoc3RyKSB7XG4gICAgdmFyIGpzb25TdGFydCA9IHN0ci5tYXRjaChKU09OX1NUQVJUKTtcbiAgICByZXR1cm4ganNvblN0YXJ0ICYmIEpTT05fRU5EU1tqc29uU3RhcnRbMF1dLnRlc3Qoc3RyKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8ga2V5IHZhbHVlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJzIFJhdyBoZWFkZXJzIGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQYXJzZWQgaGVhZGVycyBhcyBrZXkgdmFsdWUgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSBjcmVhdGVNYXAoKSwgaTtcblxuICBmdW5jdGlvbiBmaWxsSW5QYXJzZWQoa2V5LCB2YWwpIHtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc1N0cmluZyhoZWFkZXJzKSkge1xuICAgIGZvckVhY2goaGVhZGVycy5zcGxpdCgnXFxuJyksIGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgIGZpbGxJblBhcnNlZChsb3dlcmNhc2UodHJpbShsaW5lLnN1YnN0cigwLCBpKSkpLCB0cmltKGxpbmUuc3Vic3RyKGkgKyAxKSkpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhlYWRlcnMpKSB7XG4gICAgZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbihoZWFkZXJWYWwsIGhlYWRlcktleSkge1xuICAgICAgZmlsbEluUGFyc2VkKGxvd2VyY2FzZShoZWFkZXJLZXkpLCB0cmltKGhlYWRlclZhbCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYXJzZWQgaGVhZGVycy5cbiAqXG4gKiBIZWFkZXJzIGFyZSBsYXp5IHBhcnNlZCB3aGVuIGZpcnN0IHJlcXVlc3RlZC5cbiAqIEBzZWUgcGFyc2VIZWFkZXJzXG4gKlxuICogQHBhcmFtIHsoc3RyaW5nfE9iamVjdCl9IGhlYWRlcnMgSGVhZGVycyB0byBwcm92aWRlIGFjY2VzcyB0by5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmc9KX0gUmV0dXJucyBhIGdldHRlciBmdW5jdGlvbiB3aGljaCBpZiBjYWxsZWQgd2l0aDpcbiAqXG4gKiAgIC0gaWYgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgcmV0dXJucyBhIHNpbmdsZSBoZWFkZXIgdmFsdWUgb3IgbnVsbFxuICogICAtIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyByZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGFsbCBoZWFkZXJzLlxuICovXG5mdW5jdGlvbiBoZWFkZXJzR2V0dGVyKGhlYWRlcnMpIHtcbiAgdmFyIGhlYWRlcnNPYmo7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAoIWhlYWRlcnNPYmopIGhlYWRlcnNPYmogPSAgcGFyc2VIZWFkZXJzKGhlYWRlcnMpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGhlYWRlcnNPYmpbbG93ZXJjYXNlKG5hbWUpXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc09iajtcbiAgfTtcbn1cblxuXG4vKipcbiAqIENoYWluIGFsbCBnaXZlbiBmdW5jdGlvbnNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGJvdGggcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtaW5nXG4gKlxuICogQHBhcmFtIHsqfSBkYXRhIERhdGEgdG8gdHJhbnNmb3JtLlxuICogQHBhcmFtIHtmdW5jdGlvbihzdHJpbmc9KX0gaGVhZGVycyBIVFRQIGhlYWRlcnMgZ2V0dGVyIGZuLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1cyBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS5cbiAqIEBwYXJhbSB7KEZ1bmN0aW9ufEFycmF5LjxGdW5jdGlvbj4pfSBmbnMgRnVuY3Rpb24gb3IgYW4gYXJyYXkgb2YgZnVuY3Rpb25zLlxuICogQHJldHVybnMgeyp9IFRyYW5zZm9ybWVkIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgc3RhdHVzLCBmbnMpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm5zKSkge1xuICAgIHJldHVybiBmbnMoZGF0YSwgaGVhZGVycywgc3RhdHVzKTtcbiAgfVxuXG4gIGZvckVhY2goZm5zLCBmdW5jdGlvbihmbikge1xuICAgIGRhdGEgPSBmbihkYXRhLCBoZWFkZXJzLCBzdGF0dXMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuXG5mdW5jdGlvbiBpc1N1Y2Nlc3Moc3RhdHVzKSB7XG4gIHJldHVybiAyMDAgPD0gc3RhdHVzICYmIHN0YXR1cyA8IDMwMDtcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGh0dHBQcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZSBgJGh0dHBQcm92aWRlcmAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHNlcnZpY2UuXG4gKiAqL1xuZnVuY3Rpb24gJEh0dHBQcm92aWRlcigpIHtcbiAgLyoqXG4gICAqIEBuZ2RvYyBwcm9wZXJ0eVxuICAgKiBAbmFtZSAkaHR0cFByb3ZpZGVyI2RlZmF1bHRzXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBPYmplY3QgY29udGFpbmluZyBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHtAbGluayBuZy4kaHR0cCAkaHR0cH0gcmVxdWVzdHMuXG4gICAqXG4gICAqIC0gKipgZGVmYXVsdHMuY2FjaGVgKiogLSB7Ym9vbGVhbnxPYmplY3R9IC0gQSBib29sZWFuIHZhbHVlIG9yIG9iamVjdCBjcmVhdGVkIHdpdGhcbiAgICoge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgYCRjYWNoZUZhY3RvcnlgfSB0byBlbmFibGUgb3IgZGlzYWJsZSBjYWNoaW5nIG9mIEhUVFAgcmVzcG9uc2VzXG4gICAqIGJ5IGRlZmF1bHQuIFNlZSB7QGxpbmsgJGh0dHAjY2FjaGluZyAkaHR0cCBDYWNoaW5nfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogLSAqKmBkZWZhdWx0cy54c3JmQ29va2llTmFtZWAqKiAtIHtzdHJpbmd9IC0gTmFtZSBvZiBjb29raWUgY29udGFpbmluZyB0aGUgWFNSRiB0b2tlbi5cbiAgICogRGVmYXVsdHMgdmFsdWUgaXMgYCdYU1JGLVRPS0VOJ2AuXG4gICAqXG4gICAqIC0gKipgZGVmYXVsdHMueHNyZkhlYWRlck5hbWVgKiogLSB7c3RyaW5nfSAtIE5hbWUgb2YgSFRUUCBoZWFkZXIgdG8gcG9wdWxhdGUgd2l0aCB0aGVcbiAgICogWFNSRiB0b2tlbi4gRGVmYXVsdHMgdmFsdWUgaXMgYCdYLVhTUkYtVE9LRU4nYC5cbiAgICpcbiAgICogLSAqKmBkZWZhdWx0cy5oZWFkZXJzYCoqIC0ge09iamVjdH0gLSBEZWZhdWx0IGhlYWRlcnMgZm9yIGFsbCAkaHR0cCByZXF1ZXN0cy5cbiAgICogUmVmZXIgdG8ge0BsaW5rIG5nLiRodHRwI3NldHRpbmctaHR0cC1oZWFkZXJzICRodHRwfSBmb3IgZG9jdW1lbnRhdGlvbiBvblxuICAgKiBzZXR0aW5nIGRlZmF1bHQgaGVhZGVycy5cbiAgICogICAgIC0gKipgZGVmYXVsdHMuaGVhZGVycy5jb21tb25gKipcbiAgICogICAgIC0gKipgZGVmYXVsdHMuaGVhZGVycy5wb3N0YCoqXG4gICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMucHV0YCoqXG4gICAqICAgICAtICoqYGRlZmF1bHRzLmhlYWRlcnMucGF0Y2hgKipcbiAgICpcbiAgICpcbiAgICogLSAqKmBkZWZhdWx0cy5wYXJhbVNlcmlhbGl6ZXJgKiogLSBge3N0cmluZ3xmdW5jdGlvbihPYmplY3Q8c3RyaW5nLHN0cmluZz4pOnN0cmluZ31gIC0gQSBmdW5jdGlvblxuICAgKiAgdXNlZCB0byB0aGUgcHJlcGFyZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcmVxdWVzdCBwYXJhbWV0ZXJzIChzcGVjaWZpZWQgYXMgYW4gb2JqZWN0KS5cbiAgICogIElmIHNwZWNpZmllZCBhcyBzdHJpbmcsIGl0IGlzIGludGVycHJldGVkIGFzIGEgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSB7QGxpbmsgYXV0by4kaW5qZWN0b3IgJGluamVjdG9yfS5cbiAgICogIERlZmF1bHRzIHRvIHtAbGluayBuZy4kaHR0cFBhcmFtU2VyaWFsaXplciAkaHR0cFBhcmFtU2VyaWFsaXplcn0uXG4gICAqXG4gICAqIC0gKipgZGVmYXVsdHMuanNvbnBDYWxsYmFja1BhcmFtYCoqIC0gYHtzdHJpbmd9YCAtIHRoZSBuYW1lIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgdGhhdCBwYXNzZXMgdGhlIG5hbWUgb2YgdGhlXG4gICAqIGNhbGxiYWNrIGluIGEgSlNPTlAgcmVxdWVzdC4gVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZXhwcmVzc2lvbiBnZW5lcmF0ZWQgYnkgdGhlXG4gICAqIHtAbGluayAkanNvbnBDYWxsYmFja3N9IHNlcnZpY2UuIERlZmF1bHRzIHRvIGAnY2FsbGJhY2snYC5cbiAgICpcbiAgICoqL1xuICB2YXIgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRzID0ge1xuICAgIC8vIHRyYW5zZm9ybSBpbmNvbWluZyByZXNwb25zZSBkYXRhXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IFtkZWZhdWx0SHR0cFJlc3BvbnNlVHJhbnNmb3JtXSxcblxuICAgIC8vIHRyYW5zZm9ybSBvdXRnb2luZyByZXF1ZXN0IGRhdGFcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24oZCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGQpICYmICFpc0ZpbGUoZCkgJiYgIWlzQmxvYihkKSAmJiAhaXNGb3JtRGF0YShkKSA/IHRvSnNvbihkKSA6IGQ7XG4gICAgfV0sXG5cbiAgICAvLyBkZWZhdWx0IGhlYWRlcnNcbiAgICBoZWFkZXJzOiB7XG4gICAgICBjb21tb246IHtcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gICAgICB9LFxuICAgICAgcG9zdDogICBzaGFsbG93Q29weShDT05URU5UX1RZUEVfQVBQTElDQVRJT05fSlNPTiksXG4gICAgICBwdXQ6ICAgIHNoYWxsb3dDb3B5KENPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9KU09OKSxcbiAgICAgIHBhdGNoOiAgc2hhbGxvd0NvcHkoQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0pTT04pXG4gICAgfSxcblxuICAgIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gICAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gICAgcGFyYW1TZXJpYWxpemVyOiAnJGh0dHBQYXJhbVNlcmlhbGl6ZXInLFxuXG4gICAganNvbnBDYWxsYmFja1BhcmFtOiAnY2FsbGJhY2snXG4gIH07XG5cbiAgdmFyIHVzZUFwcGx5QXN5bmMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGh0dHBQcm92aWRlciN1c2VBcHBseUFzeW5jXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBDb25maWd1cmUgJGh0dHAgc2VydmljZSB0byBjb21iaW5lIHByb2Nlc3Npbmcgb2YgbXVsdGlwbGUgaHR0cCByZXNwb25zZXMgcmVjZWl2ZWQgYXQgYXJvdW5kXG4gICAqIHRoZSBzYW1lIHRpbWUgdmlhIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRhcHBseUFzeW5jICRyb290U2NvcGUuJGFwcGx5QXN5bmN9LiBUaGlzIGNhbiByZXN1bHQgaW5cbiAgICogc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIGJpZ2dlciBhcHBsaWNhdGlvbnMgdGhhdCBtYWtlIG1hbnkgSFRUUCByZXF1ZXN0c1xuICAgKiBjb25jdXJyZW50bHkgKGNvbW1vbiBkdXJpbmcgYXBwbGljYXRpb24gYm9vdHN0cmFwKS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgY3VycmVudCBjb25maWd1cmVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB2YWx1ZSBJZiB0cnVlLCB3aGVuIHJlcXVlc3RzIGFyZSBsb2FkZWQsIHRoZXkgd2lsbCBzY2hlZHVsZSBhIGRlZmVycmVkXG4gICAqICAgIFwiYXBwbHlcIiBvbiB0aGUgbmV4dCB0aWNrLCBnaXZpbmcgdGltZSBmb3Igc3Vic2VxdWVudCByZXF1ZXN0cyBpbiBhIHJvdWdobHkgfjEwbXMgd2luZG93XG4gICAqICAgIHRvIGxvYWQgYW5kIHNoYXJlIHRoZSBzYW1lIGRpZ2VzdCBjeWNsZS5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW58T2JqZWN0fSBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgJGh0dHBQcm92aWRlciBmb3IgY2hhaW5pbmcuXG4gICAqICAgIG90aGVyd2lzZSwgcmV0dXJucyB0aGUgY3VycmVudCBjb25maWd1cmVkIHZhbHVlLlxuICAgKiovXG4gIHRoaXMudXNlQXBwbHlBc3luYyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHVzZUFwcGx5QXN5bmMgPSAhIXZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB1c2VBcHBseUFzeW5jO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICogQG5hbWUgJGh0dHBQcm92aWRlciNpbnRlcmNlcHRvcnNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgc2VydmljZSBmYWN0b3JpZXMgZm9yIGFsbCBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMge0BsaW5rIG5nLiRodHRwICRodHRwfVxuICAgKiBwcmUtcHJvY2Vzc2luZyBvZiByZXF1ZXN0IG9yIHBvc3Rwcm9jZXNzaW5nIG9mIHJlc3BvbnNlcy5cbiAgICpcbiAgICogVGhlc2Ugc2VydmljZSBmYWN0b3JpZXMgYXJlIG9yZGVyZWQgYnkgcmVxdWVzdCwgaS5lLiB0aGV5IGFyZSBhcHBsaWVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuICAgKiBhcnJheSwgb24gcmVxdWVzdCwgYnV0IHJldmVyc2Ugb3JkZXIsIG9uIHJlc3BvbnNlLlxuICAgKlxuICAgKiB7QGxpbmsgbmcuJGh0dHAjaW50ZXJjZXB0b3JzIEludGVyY2VwdG9ycyBkZXRhaWxlZCBpbmZvfVxuICAgKiovXG4gIHZhciBpbnRlcmNlcHRvckZhY3RvcmllcyA9IHRoaXMuaW50ZXJjZXB0b3JzID0gW107XG5cbiAgdGhpcy4kZ2V0ID0gWyckYnJvd3NlcicsICckaHR0cEJhY2tlbmQnLCAnJCRjb29raWVSZWFkZXInLCAnJGNhY2hlRmFjdG9yeScsICckcm9vdFNjb3BlJywgJyRxJywgJyRpbmplY3RvcicsICckc2NlJyxcbiAgICAgIGZ1bmN0aW9uKCRicm93c2VyLCAkaHR0cEJhY2tlbmQsICQkY29va2llUmVhZGVyLCAkY2FjaGVGYWN0b3J5LCAkcm9vdFNjb3BlLCAkcSwgJGluamVjdG9yLCAkc2NlKSB7XG5cbiAgICB2YXIgZGVmYXVsdENhY2hlID0gJGNhY2hlRmFjdG9yeSgnJGh0dHAnKTtcblxuICAgIC8qKlxuICAgICAqIE1ha2Ugc3VyZSB0aGF0IGRlZmF1bHQgcGFyYW0gc2VyaWFsaXplciBpcyBleHBvc2VkIGFzIGEgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBkZWZhdWx0cy5wYXJhbVNlcmlhbGl6ZXIgPSBpc1N0cmluZyhkZWZhdWx0cy5wYXJhbVNlcmlhbGl6ZXIpID9cbiAgICAgICRpbmplY3Rvci5nZXQoZGVmYXVsdHMucGFyYW1TZXJpYWxpemVyKSA6IGRlZmF1bHRzLnBhcmFtU2VyaWFsaXplcjtcblxuICAgIC8qKlxuICAgICAqIEludGVyY2VwdG9ycyBzdG9yZWQgaW4gcmV2ZXJzZSBvcmRlci4gSW5uZXIgaW50ZXJjZXB0b3JzIGJlZm9yZSBvdXRlciBpbnRlcmNlcHRvcnMuXG4gICAgICogVGhlIHJldmVyc2FsIGlzIG5lZWRlZCBzbyB0aGF0IHdlIGNhbiBidWlsZCB1cCB0aGUgaW50ZXJjZXB0aW9uIGNoYWluIGFyb3VuZCB0aGVcbiAgICAgKiBzZXJ2ZXIgcmVxdWVzdC5cbiAgICAgKi9cbiAgICB2YXIgcmV2ZXJzZWRJbnRlcmNlcHRvcnMgPSBbXTtcblxuICAgIGZvckVhY2goaW50ZXJjZXB0b3JGYWN0b3JpZXMsIGZ1bmN0aW9uKGludGVyY2VwdG9yRmFjdG9yeSkge1xuICAgICAgcmV2ZXJzZWRJbnRlcmNlcHRvcnMudW5zaGlmdChpc1N0cmluZyhpbnRlcmNlcHRvckZhY3RvcnkpXG4gICAgICAgICAgPyAkaW5qZWN0b3IuZ2V0KGludGVyY2VwdG9yRmFjdG9yeSkgOiAkaW5qZWN0b3IuaW52b2tlKGludGVyY2VwdG9yRmFjdG9yeSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIHNlcnZpY2VcbiAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAqIEBuYW1lICRodHRwXG4gICAgICogQHJlcXVpcmVzIG5nLiRodHRwQmFja2VuZFxuICAgICAqIEByZXF1aXJlcyAkY2FjaGVGYWN0b3J5XG4gICAgICogQHJlcXVpcmVzICRyb290U2NvcGVcbiAgICAgKiBAcmVxdWlyZXMgJHFcbiAgICAgKiBAcmVxdWlyZXMgJGluamVjdG9yXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBUaGUgYCRodHRwYCBzZXJ2aWNlIGlzIGEgY29yZSBBbmd1bGFyIHNlcnZpY2UgdGhhdCBmYWNpbGl0YXRlcyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHJlbW90ZVxuICAgICAqIEhUVFAgc2VydmVycyB2aWEgdGhlIGJyb3dzZXIncyBbWE1MSHR0cFJlcXVlc3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL3htbGh0dHByZXF1ZXN0KVxuICAgICAqIG9iamVjdCBvciB2aWEgW0pTT05QXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT05QKS5cbiAgICAgKlxuICAgICAqIEZvciB1bml0IHRlc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgdXNlIGAkaHR0cGAgc2VydmljZSwgc2VlXG4gICAgICoge0BsaW5rIG5nTW9jay4kaHR0cEJhY2tlbmQgJGh0dHBCYWNrZW5kIG1vY2t9LlxuICAgICAqXG4gICAgICogRm9yIGEgaGlnaGVyIGxldmVsIG9mIGFic3RyYWN0aW9uLCBwbGVhc2UgY2hlY2sgb3V0IHRoZSB7QGxpbmsgbmdSZXNvdXJjZS4kcmVzb3VyY2VcbiAgICAgKiAkcmVzb3VyY2V9IHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBUaGUgJGh0dHAgQVBJIGlzIGJhc2VkIG9uIHRoZSB7QGxpbmsgbmcuJHEgZGVmZXJyZWQvcHJvbWlzZSBBUElzfSBleHBvc2VkIGJ5XG4gICAgICogdGhlICRxIHNlcnZpY2UuIFdoaWxlIGZvciBzaW1wbGUgdXNhZ2UgcGF0dGVybnMgdGhpcyBkb2Vzbid0IG1hdHRlciBtdWNoLCBmb3IgYWR2YW5jZWQgdXNhZ2VcbiAgICAgKiBpdCBpcyBpbXBvcnRhbnQgdG8gZmFtaWxpYXJpemUgeW91cnNlbGYgd2l0aCB0aGVzZSBBUElzIGFuZCB0aGUgZ3VhcmFudGVlcyB0aGV5IHByb3ZpZGUuXG4gICAgICpcbiAgICAgKlxuICAgICAqICMjIEdlbmVyYWwgdXNhZ2VcbiAgICAgKiBUaGUgYCRodHRwYCBzZXJ2aWNlIGlzIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQg4oCUIGEge0BsaW5rICRodHRwI3VzYWdlIGNvbmZpZ3VyYXRpb24gb2JqZWN0fSDigJRcbiAgICAgKiB0aGF0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYW4gSFRUUCByZXF1ZXN0IGFuZCByZXR1cm5zICBhIHtAbGluayBuZy4kcSBwcm9taXNlfS5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogICAvLyBTaW1wbGUgR0VUIHJlcXVlc3QgZXhhbXBsZTpcbiAgICAgKiAgICRodHRwKHtcbiAgICAgKiAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgKiAgICAgdXJsOiAnL3NvbWVVcmwnXG4gICAgICogICB9KS50aGVuKGZ1bmN0aW9uIHN1Y2Nlc3NDYWxsYmFjayhyZXNwb25zZSkge1xuICAgICAqICAgICAgIC8vIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHlcbiAgICAgKiAgICAgICAvLyB3aGVuIHRoZSByZXNwb25zZSBpcyBhdmFpbGFibGVcbiAgICAgKiAgICAgfSwgZnVuY3Rpb24gZXJyb3JDYWxsYmFjayhyZXNwb25zZSkge1xuICAgICAqICAgICAgIC8vIGNhbGxlZCBhc3luY2hyb25vdXNseSBpZiBhbiBlcnJvciBvY2N1cnNcbiAgICAgKiAgICAgICAvLyBvciBzZXJ2ZXIgcmV0dXJucyByZXNwb25zZSB3aXRoIGFuIGVycm9yIHN0YXR1cy5cbiAgICAgKiAgICAgfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgcmVzcG9uc2Ugb2JqZWN0IGhhcyB0aGVzZSBwcm9wZXJ0aWVzOlxuICAgICAqXG4gICAgICogICAtICoqZGF0YSoqIOKAkyBge3N0cmluZ3xPYmplY3R9YCDigJMgVGhlIHJlc3BvbnNlIGJvZHkgdHJhbnNmb3JtZWQgd2l0aCB0aGUgdHJhbnNmb3JtXG4gICAgICogICAgIGZ1bmN0aW9ucy5cbiAgICAgKiAgIC0gKipzdGF0dXMqKiDigJMgYHtudW1iZXJ9YCDigJMgSFRUUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogICAtICoqaGVhZGVycyoqIOKAkyBge2Z1bmN0aW9uKFtoZWFkZXJOYW1lXSl9YCDigJMgSGVhZGVyIGdldHRlciBmdW5jdGlvbi5cbiAgICAgKiAgIC0gKipjb25maWcqKiDigJMgYHtPYmplY3R9YCDigJMgVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVlc3QuXG4gICAgICogICAtICoqc3RhdHVzVGV4dCoqIOKAkyBge3N0cmluZ31gIOKAkyBIVFRQIHN0YXR1cyB0ZXh0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgYmV0d2VlbiAyMDAgYW5kIDI5OSBpcyBjb25zaWRlcmVkIGEgc3VjY2VzcyBzdGF0dXMgYW5kIHdpbGwgcmVzdWx0IGluXG4gICAgICogdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgYmVpbmcgY2FsbGVkLiBBbnkgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgb3V0c2lkZSBvZiB0aGF0IHJhbmdlIGlzXG4gICAgICogY29uc2lkZXJlZCBhbiBlcnJvciBzdGF0dXMgYW5kIHdpbGwgcmVzdWx0IGluIHRoZSBlcnJvciBjYWxsYmFjayBiZWluZyBjYWxsZWQuXG4gICAgICogQWxzbywgc3RhdHVzIGNvZGVzIGxlc3MgdGhhbiAtMSBhcmUgbm9ybWFsaXplZCB0byB6ZXJvLiAtMSB1c3VhbGx5IG1lYW5zIHRoZSByZXF1ZXN0IHdhc1xuICAgICAqIGFib3J0ZWQsIGUuZy4gdXNpbmcgYSBgY29uZmlnLnRpbWVvdXRgLlxuICAgICAqIE5vdGUgdGhhdCBpZiB0aGUgcmVzcG9uc2UgaXMgYSByZWRpcmVjdCwgWE1MSHR0cFJlcXVlc3Qgd2lsbCB0cmFuc3BhcmVudGx5IGZvbGxvdyBpdCwgbWVhbmluZ1xuICAgICAqIHRoYXQgdGhlIG91dGNvbWUgKHN1Y2Nlc3Mgb3IgZXJyb3IpIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgZmluYWwgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAgICpcbiAgICAgKlxuICAgICAqICMjIFNob3J0Y3V0IG1ldGhvZHNcbiAgICAgKlxuICAgICAqIFNob3J0Y3V0IG1ldGhvZHMgYXJlIGFsc28gYXZhaWxhYmxlLiBBbGwgc2hvcnRjdXQgbWV0aG9kcyByZXF1aXJlIHBhc3NpbmcgaW4gdGhlIFVSTCwgYW5kXG4gICAgICogcmVxdWVzdCBkYXRhIG11c3QgYmUgcGFzc2VkIGluIGZvciBQT1NUL1BVVCByZXF1ZXN0cy4gQW4gb3B0aW9uYWwgY29uZmlnIGNhbiBiZSBwYXNzZWQgYXMgdGhlXG4gICAgICogbGFzdCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogICAkaHR0cC5nZXQoJy9zb21lVXJsJywgY29uZmlnKS50aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gICAgICogICAkaHR0cC5wb3N0KCcvc29tZVVybCcsIGRhdGEsIGNvbmZpZykudGhlbihzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ29tcGxldGUgbGlzdCBvZiBzaG9ydGN1dCBtZXRob2RzOlxuICAgICAqXG4gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjZ2V0ICRodHRwLmdldH1cbiAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNoZWFkICRodHRwLmhlYWR9XG4gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjcG9zdCAkaHR0cC5wb3N0fVxuICAgICAqIC0ge0BsaW5rIG5nLiRodHRwI3B1dCAkaHR0cC5wdXR9XG4gICAgICogLSB7QGxpbmsgbmcuJGh0dHAjZGVsZXRlICRodHRwLmRlbGV0ZX1cbiAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNqc29ucCAkaHR0cC5qc29ucH1cbiAgICAgKiAtIHtAbGluayBuZy4kaHR0cCNwYXRjaCAkaHR0cC5wYXRjaH1cbiAgICAgKlxuICAgICAqXG4gICAgICogIyMgV3JpdGluZyBVbml0IFRlc3RzIHRoYXQgdXNlICRodHRwXG4gICAgICogV2hlbiB1bml0IHRlc3RpbmcgKHVzaW5nIHtAbGluayBuZ01vY2sgbmdNb2NrfSksIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsXG4gICAgICoge0BsaW5rIG5nTW9jay4kaHR0cEJhY2tlbmQjZmx1c2ggJGh0dHBCYWNrZW5kLmZsdXNoKCl9IHRvIGZsdXNoIGVhY2ggcGVuZGluZ1xuICAgICAqIHJlcXVlc3QgdXNpbmcgdHJhaW5lZCByZXNwb25zZXMuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiAkaHR0cEJhY2tlbmQuZXhwZWN0R0VUKC4uLik7XG4gICAgICogJGh0dHAuZ2V0KC4uLik7XG4gICAgICogJGh0dHBCYWNrZW5kLmZsdXNoKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAjIyBTZXR0aW5nIEhUVFAgSGVhZGVyc1xuICAgICAqXG4gICAgICogVGhlICRodHRwIHNlcnZpY2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBjZXJ0YWluIEhUVFAgaGVhZGVycyB0byBhbGwgcmVxdWVzdHMuIFRoZXNlIGRlZmF1bHRzXG4gICAgICogY2FuIGJlIGZ1bGx5IGNvbmZpZ3VyZWQgYnkgYWNjZXNzaW5nIHRoZSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzYCBjb25maWd1cmF0aW9uXG4gICAgICogb2JqZWN0LCB3aGljaCBjdXJyZW50bHkgY29udGFpbnMgdGhpcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb246XG4gICAgICpcbiAgICAgKiAtIGAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uYCAoaGVhZGVycyB0aGF0IGFyZSBjb21tb24gZm9yIGFsbCByZXF1ZXN0cyk6XG4gICAgICogICAtIDxjb2RlPkFjY2VwdDogYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgXFwqJiM2NTI3OTsvJiM2NTI3OTtcXCo8L2NvZGU+XG4gICAgICogLSBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLnBvc3RgOiAoaGVhZGVyIGRlZmF1bHRzIGZvciBQT1NUIHJlcXVlc3RzKVxuICAgICAqICAgLSBgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uYFxuICAgICAqIC0gYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5wdXRgIChoZWFkZXIgZGVmYXVsdHMgZm9yIFBVVCByZXF1ZXN0cylcbiAgICAgKiAgIC0gYENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbmBcbiAgICAgKlxuICAgICAqIFRvIGFkZCBvciBvdmVyd3JpdGUgdGhlc2UgZGVmYXVsdHMsIHNpbXBseSBhZGQgb3IgcmVtb3ZlIGEgcHJvcGVydHkgZnJvbSB0aGVzZSBjb25maWd1cmF0aW9uXG4gICAgICogb2JqZWN0cy4gVG8gYWRkIGhlYWRlcnMgZm9yIGFuIEhUVFAgbWV0aG9kIG90aGVyIHRoYW4gUE9TVCBvciBQVVQsIHNpbXBseSBhZGQgYSBuZXcgb2JqZWN0XG4gICAgICogd2l0aCB0aGUgbG93ZXJjYXNlZCBIVFRQIG1ldGhvZCBuYW1lIGFzIHRoZSBrZXksIGUuZy5cbiAgICAgKiBgJGh0dHBQcm92aWRlci5kZWZhdWx0cy5oZWFkZXJzLmdldCA9IHsgJ015LUhlYWRlcicgOiAndmFsdWUnIH1gLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHRzIGNhbiBhbHNvIGJlIHNldCBhdCBydW50aW1lIHZpYSB0aGUgYCRodHRwLmRlZmF1bHRzYCBvYmplY3QgaW4gdGhlIHNhbWVcbiAgICAgKiBmYXNoaW9uLiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIG1vZHVsZS5ydW4oZnVuY3Rpb24oJGh0dHApIHtcbiAgICAgKiAgICRodHRwLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgWW1WbGNEcGliMjl3JztcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uLCB5b3UgY2FuIHN1cHBseSBhIGBoZWFkZXJzYCBwcm9wZXJ0eSBpbiB0aGUgY29uZmlnIG9iamVjdCBwYXNzZWQgd2hlblxuICAgICAqIGNhbGxpbmcgYCRodHRwKGNvbmZpZylgLCB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHRzIHdpdGhvdXQgY2hhbmdpbmcgdGhlbSBnbG9iYWxseS5cbiAgICAgKlxuICAgICAqIFRvIGV4cGxpY2l0bHkgcmVtb3ZlIGEgaGVhZGVyIGF1dG9tYXRpY2FsbHkgYWRkZWQgdmlhICRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycyBvbiBhIHBlciByZXF1ZXN0IGJhc2lzLFxuICAgICAqIFVzZSB0aGUgYGhlYWRlcnNgIHByb3BlcnR5LCBzZXR0aW5nIHRoZSBkZXNpcmVkIGhlYWRlciB0byBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIHZhciByZXEgPSB7XG4gICAgICogIG1ldGhvZDogJ1BPU1QnLFxuICAgICAqICB1cmw6ICdodHRwOi8vZXhhbXBsZS5jb20nLFxuICAgICAqICBoZWFkZXJzOiB7XG4gICAgICogICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZFxuICAgICAqICB9LFxuICAgICAqICBkYXRhOiB7IHRlc3Q6ICd0ZXN0JyB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogJGh0dHAocmVxKS50aGVuKGZ1bmN0aW9uKCl7Li4ufSwgZnVuY3Rpb24oKXsuLi59KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqICMjIFRyYW5zZm9ybWluZyBSZXF1ZXN0cyBhbmQgUmVzcG9uc2VzXG4gICAgICpcbiAgICAgKiBCb3RoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgY2FuIGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uczogYHRyYW5zZm9ybVJlcXVlc3RgXG4gICAgICogYW5kIGB0cmFuc2Zvcm1SZXNwb25zZWAuIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGEgc2luZ2xlIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSAoYGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIsIHN0YXR1cylgKSBvciBhbiBhcnJheSBvZiBzdWNoIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyxcbiAgICAgKiB3aGljaCBhbGxvd3MgeW91IHRvIGBwdXNoYCBvciBgdW5zaGlmdGAgYSBuZXcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gaW50byB0aGUgdHJhbnNmb3JtYXRpb24gY2hhaW4uXG4gICAgICpcbiAgICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgICAqICoqTm90ZToqKiBBbmd1bGFyIGRvZXMgbm90IG1ha2UgYSBjb3B5IG9mIHRoZSBgZGF0YWAgcGFyYW1ldGVyIGJlZm9yZSBpdCBpcyBwYXNzZWQgaW50byB0aGUgYHRyYW5zZm9ybVJlcXVlc3RgIHBpcGVsaW5lLlxuICAgICAqIFRoYXQgbWVhbnMgY2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyBvZiBgZGF0YWAgYXJlIG5vdCBsb2NhbCB0byB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIChzaW5jZSBKYXZhc2NyaXB0IHBhc3NlcyBvYmplY3RzIGJ5IHJlZmVyZW5jZSkuXG4gICAgICogRm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyBgJGh0dHAuZ2V0KHVybCwgJHNjb3BlLm15T2JqZWN0KWAsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG9iamVjdCdzIHByb3BlcnRpZXMgaW4gYSB0cmFuc2Zvcm1SZXF1ZXN0XG4gICAgICogZnVuY3Rpb24gd2lsbCBiZSByZWZsZWN0ZWQgb24gdGhlIHNjb3BlIGFuZCBpbiBhbnkgdGVtcGxhdGVzIHdoZXJlIHRoZSBvYmplY3QgaXMgZGF0YS1ib3VuZC5cbiAgICAgKiBUbyBwcmV2ZW50IHRoaXMsIHRyYW5zZm9ybSBmdW5jdGlvbnMgc2hvdWxkIGhhdmUgbm8gc2lkZS1lZmZlY3RzLlxuICAgICAqIElmIHlvdSBuZWVkIHRvIG1vZGlmeSBwcm9wZXJ0aWVzLCBpdCBpcyByZWNvbW1lbmRlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgZGF0YSwgb3IgY3JlYXRlIG5ldyBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIDwvZGl2PlxuICAgICAqXG4gICAgICogIyMjIERlZmF1bHQgVHJhbnNmb3JtYXRpb25zXG4gICAgICpcbiAgICAgKiBUaGUgYCRodHRwUHJvdmlkZXJgIHByb3ZpZGVyIGFuZCBgJGh0dHBgIHNlcnZpY2UgZXhwb3NlIGBkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0YCBhbmRcbiAgICAgKiBgZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2VgIHByb3BlcnRpZXMuIElmIGEgcmVxdWVzdCBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gdHJhbnNmb3JtYXRpb25zXG4gICAgICogdGhlbiB0aGVzZSB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGF1Z21lbnQgb3IgcmVwbGFjZSB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbnMgYnkgbW9kaWZ5aW5nIHRoZXNlIHByb3BlcnRpZXMgYnkgYWRkaW5nIHRvIG9yXG4gICAgICogcmVwbGFjaW5nIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBkZWZhdWx0IHRyYW5zZm9ybWF0aW9uczpcbiAgICAgKlxuICAgICAqIFJlcXVlc3QgdHJhbnNmb3JtYXRpb25zIChgJGh0dHBQcm92aWRlci5kZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0YCBhbmQgYCRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3RgKTpcbiAgICAgKlxuICAgICAqIC0gSWYgdGhlIGBkYXRhYCBwcm9wZXJ0eSBvZiB0aGUgcmVxdWVzdCBjb25maWd1cmF0aW9uIG9iamVjdCBjb250YWlucyBhbiBvYmplY3QsIHNlcmlhbGl6ZSBpdFxuICAgICAqICAgaW50byBKU09OIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIFJlc3BvbnNlIHRyYW5zZm9ybWF0aW9ucyAoYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2VgIGFuZCBgJGh0dHAuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2VgKTpcbiAgICAgKlxuICAgICAqICAtIElmIFhTUkYgcHJlZml4IGlzIGRldGVjdGVkLCBzdHJpcCBpdCAoc2VlIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zIHNlY3Rpb24gYmVsb3cpLlxuICAgICAqICAtIElmIEpTT04gcmVzcG9uc2UgaXMgZGV0ZWN0ZWQsIGRlc2VyaWFsaXplIGl0IHVzaW5nIGEgSlNPTiBwYXJzZXIuXG4gICAgICpcbiAgICAgKlxuICAgICAqICMjIyBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9ucyBQZXIgUmVxdWVzdFxuICAgICAqXG4gICAgICogSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgdHJhbnNmb3JtYXRpb25zIG9ubHkgZm9yIGEgc2luZ2xlIHJlcXVlc3QgdGhlbiBwcm92aWRlXG4gICAgICogYHRyYW5zZm9ybVJlcXVlc3RgIGFuZC9vciBgdHJhbnNmb3JtUmVzcG9uc2VgIHByb3BlcnRpZXMgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHBhc3NlZFxuICAgICAqIGludG8gYCRodHRwYC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSB0aGVzZSBwcm9wZXJ0aWVzIG9uIHRoZSBjb25maWcgb2JqZWN0IHRoZSBkZWZhdWx0IHRyYW5zZm9ybWF0aW9ucyB3aWxsIGJlXG4gICAgICogb3ZlcndyaXR0ZW4uIElmIHlvdSB3aXNoIHRvIGF1Z21lbnQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtYXRpb25zIHRoZW4geW91IG11c3QgaW5jbHVkZSB0aGVtIGluIHlvdXJcbiAgICAgKiBsb2NhbCB0cmFuc2Zvcm1hdGlvbiBhcnJheS5cbiAgICAgKlxuICAgICAqIFRoZSBmb2xsb3dpbmcgY29kZSBkZW1vbnN0cmF0ZXMgYWRkaW5nIGEgbmV3IHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uIHRvIGJlIHJ1biBhZnRlciB0aGUgZGVmYXVsdCByZXNwb25zZVxuICAgICAqIHRyYW5zZm9ybWF0aW9ucyBoYXZlIGJlZW4gcnVuLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBmdW5jdGlvbiBhcHBlbmRUcmFuc2Zvcm0oZGVmYXVsdHMsIHRyYW5zZm9ybSkge1xuICAgICAqXG4gICAgICogICAvLyBXZSBjYW4ndCBndWFyYW50ZWUgdGhhdCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1hdGlvbiBpcyBhbiBhcnJheVxuICAgICAqICAgZGVmYXVsdHMgPSBhbmd1bGFyLmlzQXJyYXkoZGVmYXVsdHMpID8gZGVmYXVsdHMgOiBbZGVmYXVsdHNdO1xuICAgICAqXG4gICAgICogICAvLyBBcHBlbmQgdGhlIG5ldyB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgZGVmYXVsdHNcbiAgICAgKiAgIHJldHVybiBkZWZhdWx0cy5jb25jYXQodHJhbnNmb3JtKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAkaHR0cCh7XG4gICAgICogICB1cmw6ICcuLi4nLFxuICAgICAqICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgKiAgIHRyYW5zZm9ybVJlc3BvbnNlOiBhcHBlbmRUcmFuc2Zvcm0oJGh0dHAuZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2UsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgIHJldHVybiBkb1RyYW5zZm9ybSh2YWx1ZSk7XG4gICAgICogICB9KVxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIyBDYWNoaW5nXG4gICAgICpcbiAgICAgKiB7QGxpbmsgbmcuJGh0dHAgYCRodHRwYH0gcmVzcG9uc2VzIGFyZSBub3QgY2FjaGVkIGJ5IGRlZmF1bHQuIFRvIGVuYWJsZSBjYWNoaW5nLCB5b3UgbXVzdFxuICAgICAqIHNldCB0aGUgY29uZmlnLmNhY2hlIHZhbHVlIG9yIHRoZSBkZWZhdWx0IGNhY2hlIHZhbHVlIHRvIFRSVUUgb3IgdG8gYSBjYWNoZSBvYmplY3QgKGNyZWF0ZWRcbiAgICAgKiB3aXRoIHtAbGluayBuZy4kY2FjaGVGYWN0b3J5IGAkY2FjaGVGYWN0b3J5YH0pLiBJZiBkZWZpbmVkLCB0aGUgdmFsdWUgb2YgY29uZmlnLmNhY2hlIHRha2VzXG4gICAgICogcHJlY2VkZW5jZSBvdmVyIHRoZSBkZWZhdWx0IGNhY2hlIHZhbHVlLlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG86XG4gICAgICogICAqIGNhY2hlIGFsbCByZXNwb25zZXMgLSBzZXQgdGhlIGRlZmF1bHQgY2FjaGUgdmFsdWUgdG8gVFJVRSBvciB0byBhIGNhY2hlIG9iamVjdFxuICAgICAqICAgKiBjYWNoZSBhIHNwZWNpZmljIHJlc3BvbnNlIC0gc2V0IGNvbmZpZy5jYWNoZSB2YWx1ZSB0byBUUlVFIG9yIHRvIGEgY2FjaGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBJZiBjYWNoaW5nIGlzIGVuYWJsZWQsIGJ1dCBuZWl0aGVyIHRoZSBkZWZhdWx0IGNhY2hlIG5vciBjb25maWcuY2FjaGUgYXJlIHNldCB0byBhIGNhY2hlIG9iamVjdCxcbiAgICAgKiB0aGVuIHRoZSBkZWZhdWx0IGAkY2FjaGVGYWN0b3J5KFwiJGh0dHBcIilgIG9iamVjdCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogVGhlIGRlZmF1bHQgY2FjaGUgdmFsdWUgY2FuIGJlIHNldCBieSB1cGRhdGluZyB0aGVcbiAgICAgKiB7QGxpbmsgbmcuJGh0dHAjZGVmYXVsdHMgYCRodHRwLmRlZmF1bHRzLmNhY2hlYH0gcHJvcGVydHkgb3IgdGhlXG4gICAgICoge0BsaW5rICRodHRwUHJvdmlkZXIjZGVmYXVsdHMgYCRodHRwUHJvdmlkZXIuZGVmYXVsdHMuY2FjaGVgfSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIFdoZW4gY2FjaGluZyBpcyBlbmFibGVkLCB7QGxpbmsgbmcuJGh0dHAgYCRodHRwYH0gc3RvcmVzIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmdcbiAgICAgKiB0aGUgcmVsZXZhbnQgY2FjaGUgb2JqZWN0LiBUaGUgbmV4dCB0aW1lIHRoZSBzYW1lIHJlcXVlc3QgaXMgbWFkZSwgdGhlIHJlc3BvbnNlIGlzIHJldHVybmVkXG4gICAgICogZnJvbSB0aGUgY2FjaGUgd2l0aG91dCBzZW5kaW5nIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLlxuICAgICAqXG4gICAgICogVGFrZSBub3RlIHRoYXQ6XG4gICAgICpcbiAgICAgKiAgICogT25seSBHRVQgYW5kIEpTT05QIHJlcXVlc3RzIGFyZSBjYWNoZWQuXG4gICAgICogICAqIFRoZSBjYWNoZSBrZXkgaXMgdGhlIHJlcXVlc3QgVVJMIGluY2x1ZGluZyBzZWFyY2ggcGFyYW1ldGVyczsgaGVhZGVycyBhcmUgbm90IGNvbnNpZGVyZWQuXG4gICAgICogICAqIENhY2hlZCByZXNwb25zZXMgYXJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5LCBpbiB0aGUgc2FtZSB3YXkgYXMgcmVzcG9uc2VzIGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiAgICogSWYgbXVsdGlwbGUgaWRlbnRpY2FsIHJlcXVlc3RzIGFyZSBtYWRlIHVzaW5nIHRoZSBzYW1lIGNhY2hlLCB3aGljaCBpcyBub3QgeWV0IHBvcHVsYXRlZCxcbiAgICAgKiAgICAgb25lIHJlcXVlc3Qgd2lsbCBiZSBtYWRlIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlbWFpbmluZyByZXF1ZXN0cyB3aWxsIHJldHVybiB0aGUgc2FtZSByZXNwb25zZS5cbiAgICAgKiAgICogQSBjYWNoZS1jb250cm9sIGhlYWRlciBvbiB0aGUgcmVzcG9uc2UgZG9lcyBub3QgYWZmZWN0IGlmIG9yIGhvdyByZXNwb25zZXMgYXJlIGNhY2hlZC5cbiAgICAgKlxuICAgICAqXG4gICAgICogIyMgSW50ZXJjZXB0b3JzXG4gICAgICpcbiAgICAgKiBCZWZvcmUgeW91IHN0YXJ0IGNyZWF0aW5nIGludGVyY2VwdG9ycywgYmUgc3VyZSB0byB1bmRlcnN0YW5kIHRoZVxuICAgICAqIHtAbGluayBuZy4kcSAkcSBhbmQgZGVmZXJyZWQvcHJvbWlzZSBBUElzfS5cbiAgICAgKlxuICAgICAqIEZvciBwdXJwb3NlcyBvZiBnbG9iYWwgZXJyb3IgaGFuZGxpbmcsIGF1dGhlbnRpY2F0aW9uLCBvciBhbnkga2luZCBvZiBzeW5jaHJvbm91cyBvclxuICAgICAqIGFzeW5jaHJvbm91cyBwcmUtcHJvY2Vzc2luZyBvZiByZXF1ZXN0IG9yIHBvc3Rwcm9jZXNzaW5nIG9mIHJlc3BvbnNlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGJlXG4gICAgICogYWJsZSB0byBpbnRlcmNlcHQgcmVxdWVzdHMgYmVmb3JlIHRoZXkgYXJlIGhhbmRlZCB0byB0aGUgc2VydmVyIGFuZFxuICAgICAqIHJlc3BvbnNlcyBiZWZvcmUgdGhleSBhcmUgaGFuZGVkIG92ZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGNvZGUgdGhhdFxuICAgICAqIGluaXRpYXRlZCB0aGVzZSByZXF1ZXN0cy4gVGhlIGludGVyY2VwdG9ycyBsZXZlcmFnZSB0aGUge0BsaW5rIG5nLiRxXG4gICAgICogcHJvbWlzZSBBUElzfSB0byBmdWxmaWxsIHRoaXMgbmVlZCBmb3IgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHByZS1wcm9jZXNzaW5nLlxuICAgICAqXG4gICAgICogVGhlIGludGVyY2VwdG9ycyBhcmUgc2VydmljZSBmYWN0b3JpZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgJGh0dHBQcm92aWRlcmAgYnlcbiAgICAgKiBhZGRpbmcgdGhlbSB0byB0aGUgYCRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzYCBhcnJheS4gVGhlIGZhY3RvcnkgaXMgY2FsbGVkIGFuZFxuICAgICAqIGluamVjdGVkIHdpdGggZGVwZW5kZW5jaWVzIChpZiBzcGVjaWZpZWQpIGFuZCByZXR1cm5zIHRoZSBpbnRlcmNlcHRvci5cbiAgICAgKlxuICAgICAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgaW50ZXJjZXB0b3JzIChhbmQgdHdvIGtpbmRzIG9mIHJlamVjdGlvbiBpbnRlcmNlcHRvcnMpOlxuICAgICAqXG4gICAgICogICAqIGByZXF1ZXN0YDogaW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2l0aCBhIGh0dHAge0BsaW5rICRodHRwI3VzYWdlIGNvbmZpZ30gb2JqZWN0LiBUaGUgZnVuY3Rpb24gaXMgZnJlZSB0b1xuICAgICAqICAgICBtb2RpZnkgdGhlIGBjb25maWdgIG9iamVjdCBvciBjcmVhdGUgYSBuZXcgb25lLiBUaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIHRoZSBgY29uZmlnYFxuICAgICAqICAgICBvYmplY3QgZGlyZWN0bHksIG9yIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBgY29uZmlnYCBvciBhIG5ldyBgY29uZmlnYCBvYmplY3QuXG4gICAgICogICAqIGByZXF1ZXN0RXJyb3JgOiBpbnRlcmNlcHRvciBnZXRzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3JcbiAgICAgKiAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi5cbiAgICAgKiAgICogYHJlc3BvbnNlYDogaW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2l0aCBodHRwIGByZXNwb25zZWAgb2JqZWN0LiBUaGUgZnVuY3Rpb24gaXMgZnJlZSB0b1xuICAgICAqICAgICBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0IG9yIGNyZWF0ZSBhIG5ldyBvbmUuIFRoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gdGhlIGByZXNwb25zZWBcbiAgICAgKiAgICAgb2JqZWN0IGRpcmVjdGx5LCBvciBhcyBhIHByb21pc2UgY29udGFpbmluZyB0aGUgYHJlc3BvbnNlYCBvciBhIG5ldyBgcmVzcG9uc2VgIG9iamVjdC5cbiAgICAgKiAgICogYHJlc3BvbnNlRXJyb3JgOiBpbnRlcmNlcHRvciBnZXRzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3JcbiAgICAgKiAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi5cbiAgICAgKlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAgIC8vIHJlZ2lzdGVyIHRoZSBpbnRlcmNlcHRvciBhcyBhIHNlcnZpY2VcbiAgICAgKiAgICRwcm92aWRlLmZhY3RvcnkoJ215SHR0cEludGVyY2VwdG9yJywgZnVuY3Rpb24oJHEsIGRlcGVuZGVuY3kxLCBkZXBlbmRlbmN5Mikge1xuICAgICAqICAgICByZXR1cm4ge1xuICAgICAqICAgICAgIC8vIG9wdGlvbmFsIG1ldGhvZFxuICAgICAqICAgICAgICdyZXF1ZXN0JzogZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gc3VjY2Vzc1xuICAgICAqICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgKiAgICAgICB9LFxuICAgICAqXG4gICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kXG4gICAgICogICAgICAncmVxdWVzdEVycm9yJzogZnVuY3Rpb24ocmVqZWN0aW9uKSB7XG4gICAgICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgb24gZXJyb3JcbiAgICAgKiAgICAgICAgIGlmIChjYW5SZWNvdmVyKHJlamVjdGlvbikpIHtcbiAgICAgKiAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT3JOZXdQcm9taXNlXG4gICAgICogICAgICAgICB9XG4gICAgICogICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlamVjdGlvbik7XG4gICAgICogICAgICAgfSxcbiAgICAgKlxuICAgICAqXG4gICAgICpcbiAgICAgKiAgICAgICAvLyBvcHRpb25hbCBtZXRob2RcbiAgICAgKiAgICAgICAncmVzcG9uc2UnOiBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIG9uIHN1Y2Nlc3NcbiAgICAgKiAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgKiAgICAgICB9LFxuICAgICAqXG4gICAgICogICAgICAgLy8gb3B0aW9uYWwgbWV0aG9kXG4gICAgICogICAgICAncmVzcG9uc2VFcnJvcic6IGZ1bmN0aW9uKHJlamVjdGlvbikge1xuICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIG9uIGVycm9yXG4gICAgICogICAgICAgICBpZiAoY2FuUmVjb3ZlcihyZWplY3Rpb24pKSB7XG4gICAgICogICAgICAgICAgIHJldHVybiByZXNwb25zZU9yTmV3UHJvbWlzZVxuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZWplY3Rpb24pO1xuICAgICAqICAgICAgIH1cbiAgICAgKiAgICAgfTtcbiAgICAgKiAgIH0pO1xuICAgICAqXG4gICAgICogICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdteUh0dHBJbnRlcmNlcHRvcicpO1xuICAgICAqXG4gICAgICpcbiAgICAgKiAgIC8vIGFsdGVybmF0aXZlbHksIHJlZ2lzdGVyIHRoZSBpbnRlcmNlcHRvciB2aWEgYW4gYW5vbnltb3VzIGZhY3RvcnlcbiAgICAgKiAgICRodHRwUHJvdmlkZXIuaW50ZXJjZXB0b3JzLnB1c2goZnVuY3Rpb24oJHEsIGRlcGVuZGVuY3kxLCBkZXBlbmRlbmN5Mikge1xuICAgICAqICAgICByZXR1cm4ge1xuICAgICAqICAgICAgJ3JlcXVlc3QnOiBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgKiAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlXG4gICAgICogICAgICAgfSxcbiAgICAgKlxuICAgICAqICAgICAgICdyZXNwb25zZSc6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICogICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZVxuICAgICAqICAgICAgIH1cbiAgICAgKiAgICAgfTtcbiAgICAgKiAgIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogIyMgU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnNcbiAgICAgKlxuICAgICAqIFdoZW4gZGVzaWduaW5nIHdlYiBhcHBsaWNhdGlvbnMsIGNvbnNpZGVyIHNlY3VyaXR5IHRocmVhdHMgZnJvbTpcbiAgICAgKlxuICAgICAqIC0gW0pTT04gdnVsbmVyYWJpbGl0eV0oaHR0cDovL2hhYWNrZWQuY29tL2FyY2hpdmUvMjAwOC8xMS8yMC9hbmF0b215LW9mLWEtc3VidGxlLWpzb24tdnVsbmVyYWJpbGl0eS5hc3B4KVxuICAgICAqIC0gW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpXG4gICAgICpcbiAgICAgKiBCb3RoIHNlcnZlciBhbmQgdGhlIGNsaWVudCBtdXN0IGNvb3BlcmF0ZSBpbiBvcmRlciB0byBlbGltaW5hdGUgdGhlc2UgdGhyZWF0cy4gQW5ndWxhciBjb21lc1xuICAgICAqIHByZS1jb25maWd1cmVkIHdpdGggc3RyYXRlZ2llcyB0aGF0IGFkZHJlc3MgdGhlc2UgaXNzdWVzLCBidXQgZm9yIHRoaXMgdG8gd29yayBiYWNrZW5kIHNlcnZlclxuICAgICAqIGNvb3BlcmF0aW9uIGlzIHJlcXVpcmVkLlxuICAgICAqXG4gICAgICogIyMjIEpTT04gVnVsbmVyYWJpbGl0eSBQcm90ZWN0aW9uXG4gICAgICpcbiAgICAgKiBBIFtKU09OIHZ1bG5lcmFiaWxpdHldKGh0dHA6Ly9oYWFja2VkLmNvbS9hcmNoaXZlLzIwMDgvMTEvMjAvYW5hdG9teS1vZi1hLXN1YnRsZS1qc29uLXZ1bG5lcmFiaWxpdHkuYXNweClcbiAgICAgKiBhbGxvd3MgdGhpcmQgcGFydHkgd2Vic2l0ZSB0byB0dXJuIHlvdXIgSlNPTiByZXNvdXJjZSBVUkwgaW50b1xuICAgICAqIFtKU09OUF0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9KU09OUCkgcmVxdWVzdCB1bmRlciBzb21lIGNvbmRpdGlvbnMuIFRvXG4gICAgICogY291bnRlciB0aGlzIHlvdXIgc2VydmVyIGNhbiBwcmVmaXggYWxsIEpTT04gcmVxdWVzdHMgd2l0aCBmb2xsb3dpbmcgc3RyaW5nIGBcIildfScsXFxuXCJgLlxuICAgICAqIEFuZ3VsYXIgd2lsbCBhdXRvbWF0aWNhbGx5IHN0cmlwIHRoZSBwcmVmaXggYmVmb3JlIHByb2Nlc3NpbmcgaXQgYXMgSlNPTi5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlIGlmIHlvdXIgc2VydmVyIG5lZWRzIHRvIHJldHVybjpcbiAgICAgKiBgYGBqc1xuICAgICAqIFsnb25lJywndHdvJ11cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIHdoaWNoIGlzIHZ1bG5lcmFibGUgdG8gYXR0YWNrLCB5b3VyIHNlcnZlciBjYW4gcmV0dXJuOlxuICAgICAqIGBgYGpzXG4gICAgICogKV19JyxcbiAgICAgKiBbJ29uZScsJ3R3byddXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbmd1bGFyIHdpbGwgc3RyaXAgdGhlIHByZWZpeCwgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIEpTT04uXG4gICAgICpcbiAgICAgKlxuICAgICAqICMjIyBDcm9zcyBTaXRlIFJlcXVlc3QgRm9yZ2VyeSAoWFNSRikgUHJvdGVjdGlvblxuICAgICAqXG4gICAgICogW1hTUkZdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3Jvc3Mtc2l0ZV9yZXF1ZXN0X2ZvcmdlcnkpIGlzIGFuIGF0dGFjayB0ZWNobmlxdWUgYnlcbiAgICAgKiB3aGljaCB0aGUgYXR0YWNrZXIgY2FuIHRyaWNrIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBpbnRvIHVua25vd2luZ2x5IGV4ZWN1dGluZyBhY3Rpb25zIG9uIHlvdXJcbiAgICAgKiB3ZWJzaXRlLiBBbmd1bGFyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGNvdW50ZXIgWFNSRi4gV2hlbiBwZXJmb3JtaW5nIFhIUiByZXF1ZXN0cywgdGhlXG4gICAgICogJGh0dHAgc2VydmljZSByZWFkcyBhIHRva2VuIGZyb20gYSBjb29raWUgKGJ5IGRlZmF1bHQsIGBYU1JGLVRPS0VOYCkgYW5kIHNldHMgaXQgYXMgYW4gSFRUUFxuICAgICAqIGhlYWRlciAoYFgtWFNSRi1UT0tFTmApLiBTaW5jZSBvbmx5IEphdmFTY3JpcHQgdGhhdCBydW5zIG9uIHlvdXIgZG9tYWluIGNvdWxkIHJlYWQgdGhlXG4gICAgICogY29va2llLCB5b3VyIHNlcnZlciBjYW4gYmUgYXNzdXJlZCB0aGF0IHRoZSBYSFIgY2FtZSBmcm9tIEphdmFTY3JpcHQgcnVubmluZyBvbiB5b3VyIGRvbWFpbi5cbiAgICAgKiBUaGUgaGVhZGVyIHdpbGwgbm90IGJlIHNldCBmb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLlxuICAgICAqXG4gICAgICogVG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcywgeW91ciBzZXJ2ZXIgbmVlZHMgdG8gc2V0IGEgdG9rZW4gaW4gYSBKYXZhU2NyaXB0IHJlYWRhYmxlIHNlc3Npb25cbiAgICAgKiBjb29raWUgY2FsbGVkIGBYU1JGLVRPS0VOYCBvbiB0aGUgZmlyc3QgSFRUUCBHRVQgcmVxdWVzdC4gT24gc3Vic2VxdWVudCBYSFIgcmVxdWVzdHMgdGhlXG4gICAgICogc2VydmVyIGNhbiB2ZXJpZnkgdGhhdCB0aGUgY29va2llIG1hdGNoZXMgYFgtWFNSRi1UT0tFTmAgSFRUUCBoZWFkZXIsIGFuZCB0aGVyZWZvcmUgYmUgc3VyZVxuICAgICAqIHRoYXQgb25seSBKYXZhU2NyaXB0IHJ1bm5pbmcgb24geW91ciBkb21haW4gY291bGQgaGF2ZSBzZW50IHRoZSByZXF1ZXN0LiBUaGUgdG9rZW4gbXVzdCBiZVxuICAgICAqIHVuaXF1ZSBmb3IgZWFjaCB1c2VyIGFuZCBtdXN0IGJlIHZlcmlmaWFibGUgYnkgdGhlIHNlcnZlciAodG8gcHJldmVudCB0aGUgSmF2YVNjcmlwdCBmcm9tXG4gICAgICogbWFraW5nIHVwIGl0cyBvd24gdG9rZW5zKS4gV2UgcmVjb21tZW5kIHRoYXQgdGhlIHRva2VuIGlzIGEgZGlnZXN0IG9mIHlvdXIgc2l0ZSdzXG4gICAgICogYXV0aGVudGljYXRpb24gY29va2llIHdpdGggYSBbc2FsdF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2FsdF8oY3J5cHRvZ3JhcGh5JiM0MTspXG4gICAgICogZm9yIGFkZGVkIHNlY3VyaXR5LlxuICAgICAqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGhlYWRlcnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgeHNyZkhlYWRlck5hbWUgYW5kIHhzcmZDb29raWVOYW1lXG4gICAgICogcHJvcGVydGllcyBvZiBlaXRoZXIgJGh0dHBQcm92aWRlci5kZWZhdWx0cyBhdCBjb25maWctdGltZSwgJGh0dHAuZGVmYXVsdHMgYXQgcnVuLXRpbWUsXG4gICAgICogb3IgdGhlIHBlci1yZXF1ZXN0IGNvbmZpZyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBwcmV2ZW50IGNvbGxpc2lvbnMgaW4gZW52aXJvbm1lbnRzIHdoZXJlIG11bHRpcGxlIEFuZ3VsYXIgYXBwcyBzaGFyZSB0aGVcbiAgICAgKiBzYW1lIGRvbWFpbiBvciBzdWJkb21haW4sIHdlIHJlY29tbWVuZCB0aGF0IGVhY2ggYXBwbGljYXRpb24gdXNlcyB1bmlxdWUgY29va2llIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIE9iamVjdCBkZXNjcmliaW5nIHRoZSByZXF1ZXN0IHRvIGJlIG1hZGUgYW5kIGhvdyBpdCBzaG91bGQgYmVcbiAgICAgKiAgICBwcm9jZXNzZWQuIFRoZSBvYmplY3QgaGFzIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICAqXG4gICAgICogICAgLSAqKm1ldGhvZCoqIOKAkyBge3N0cmluZ31gIOKAkyBIVFRQIG1ldGhvZCAoZS5nLiAnR0VUJywgJ1BPU1QnLCBldGMpXG4gICAgICogICAgLSAqKnVybCoqIOKAkyBge3N0cmluZ3xUcnVzdGVkT2JqZWN0fWAg4oCTIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQ7XG4gICAgICogICAgICBvciBhbiBvYmplY3QgY3JlYXRlZCBieSBhIGNhbGwgdG8gYCRzY2UudHJ1c3RBc1Jlc291cmNlVXJsKHVybClgLlxuICAgICAqICAgIC0gKipwYXJhbXMqKiDigJMgYHtPYmplY3QuPHN0cmluZ3xPYmplY3Q+fWAg4oCTIE1hcCBvZiBzdHJpbmdzIG9yIG9iamVjdHMgd2hpY2ggd2lsbCBiZSBzZXJpYWxpemVkXG4gICAgICogICAgICB3aXRoIHRoZSBgcGFyYW1TZXJpYWxpemVyYCBhbmQgYXBwZW5kZWQgYXMgR0VUIHBhcmFtZXRlcnMuXG4gICAgICogICAgLSAqKmRhdGEqKiDigJMgYHtzdHJpbmd8T2JqZWN0fWAg4oCTIERhdGEgdG8gYmUgc2VudCBhcyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRhdGEuXG4gICAgICogICAgLSAqKmhlYWRlcnMqKiDigJMgYHtPYmplY3R9YCDigJMgTWFwIG9mIHN0cmluZ3Mgb3IgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBzdHJpbmdzIHJlcHJlc2VudGluZ1xuICAgICAqICAgICAgSFRUUCBoZWFkZXJzIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIG51bGwsIHRoZVxuICAgICAqICAgICAgaGVhZGVyIHdpbGwgbm90IGJlIHNlbnQuIEZ1bmN0aW9ucyBhY2NlcHQgYSBjb25maWcgb2JqZWN0IGFzIGFuIGFyZ3VtZW50LlxuICAgICAqICAgIC0gKipldmVudEhhbmRsZXJzKiogLSBge09iamVjdH1gIC0gRXZlbnQgbGlzdGVuZXJzIHRvIGJlIGJvdW5kIHRvIHRoZSBYTUxIdHRwUmVxdWVzdCBvYmplY3QuXG4gICAgICogICAgICBUbyBiaW5kIGV2ZW50cyB0byB0aGUgWE1MSHR0cFJlcXVlc3QgdXBsb2FkIG9iamVjdCwgdXNlIGB1cGxvYWRFdmVudEhhbmRsZXJzYC5cbiAgICAgKiAgICAgIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIGEgYCRhcHBseWAgYmxvY2suXG4gICAgICogICAgLSAqKnVwbG9hZEV2ZW50SGFuZGxlcnMqKiAtIGB7T2JqZWN0fWAgLSBFdmVudCBsaXN0ZW5lcnMgdG8gYmUgYm91bmQgdG8gdGhlIFhNTEh0dHBSZXF1ZXN0IHVwbG9hZFxuICAgICAqICAgICAgb2JqZWN0LiBUbyBiaW5kIGV2ZW50cyB0byB0aGUgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0LCB1c2UgYGV2ZW50SGFuZGxlcnNgLlxuICAgICAqICAgICAgVGhlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBgJGFwcGx5YCBibG9jay5cbiAgICAgKiAgICAtICoqeHNyZkhlYWRlck5hbWUqKiDigJMgYHtzdHJpbmd9YCDigJMgTmFtZSBvZiBIVFRQIGhlYWRlciB0byBwb3B1bGF0ZSB3aXRoIHRoZSBYU1JGIHRva2VuLlxuICAgICAqICAgIC0gKip4c3JmQ29va2llTmFtZSoqIOKAkyBge3N0cmluZ31gIOKAkyBOYW1lIG9mIGNvb2tpZSBjb250YWluaW5nIHRoZSBYU1JGIHRva2VuLlxuICAgICAqICAgIC0gKip0cmFuc2Zvcm1SZXF1ZXN0Kiog4oCTXG4gICAgICogICAgICBge2Z1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIpfEFycmF5LjxmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKT59YCDigJNcbiAgICAgKiAgICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cFxuICAgICAqICAgICAgcmVxdWVzdCBib2R5IGFuZCBoZWFkZXJzIGFuZCByZXR1cm5zIGl0cyB0cmFuc2Zvcm1lZCAodHlwaWNhbGx5IHNlcmlhbGl6ZWQpIHZlcnNpb24uXG4gICAgICogICAgICBTZWUge0BsaW5rIG5nLiRodHRwI292ZXJyaWRpbmctdGhlLWRlZmF1bHQtdHJhbnNmb3JtYXRpb25zLXBlci1yZXF1ZXN0XG4gICAgICogICAgICBPdmVycmlkaW5nIHRoZSBEZWZhdWx0IFRyYW5zZm9ybWF0aW9uc31cbiAgICAgKiAgICAtICoqdHJhbnNmb3JtUmVzcG9uc2UqKiDigJNcbiAgICAgKiAgICAgIGB7ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlciwgc3RhdHVzKXxBcnJheS48ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlciwgc3RhdHVzKT59YCDigJNcbiAgICAgKiAgICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cFxuICAgICAqICAgICAgcmVzcG9uc2UgYm9keSwgaGVhZGVycyBhbmQgc3RhdHVzIGFuZCByZXR1cm5zIGl0cyB0cmFuc2Zvcm1lZCAodHlwaWNhbGx5IGRlc2VyaWFsaXplZCkgdmVyc2lvbi5cbiAgICAgKiAgICAgIFNlZSB7QGxpbmsgbmcuJGh0dHAjb3ZlcnJpZGluZy10aGUtZGVmYXVsdC10cmFuc2Zvcm1hdGlvbnMtcGVyLXJlcXVlc3RcbiAgICAgKiAgICAgIE92ZXJyaWRpbmcgdGhlIERlZmF1bHQgVHJhbnNmb3JtYXRpb25zfVxuICAgICAqICAgIC0gKipwYXJhbVNlcmlhbGl6ZXIqKiAtIGB7c3RyaW5nfGZ1bmN0aW9uKE9iamVjdDxzdHJpbmcsc3RyaW5nPik6c3RyaW5nfWAgLSBBIGZ1bmN0aW9uIHVzZWQgdG9cbiAgICAgKiAgICAgIHByZXBhcmUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiByZXF1ZXN0IHBhcmFtZXRlcnMgKHNwZWNpZmllZCBhcyBhbiBvYmplY3QpLlxuICAgICAqICAgICAgSWYgc3BlY2lmaWVkIGFzIHN0cmluZywgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZVxuICAgICAqICAgICAge0BsaW5rICRpbmplY3RvciAkaW5qZWN0b3J9LCB3aGljaCBtZWFucyB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biBzZXJpYWxpemVyXG4gICAgICogICAgICBieSByZWdpc3RlcmluZyBpdCBhcyBhIHtAbGluayBhdXRvLiRwcm92aWRlI3NlcnZpY2Ugc2VydmljZX0uXG4gICAgICogICAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGlzIHRoZSB7QGxpbmsgJGh0dHBQYXJhbVNlcmlhbGl6ZXIgJGh0dHBQYXJhbVNlcmlhbGl6ZXJ9O1xuICAgICAqICAgICAgYWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlIHtAbGluayAkaHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZSAkaHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZX1cbiAgICAgKiAgICAtICoqY2FjaGUqKiDigJMgYHtib29sZWFufE9iamVjdH1gIOKAkyBBIGJvb2xlYW4gdmFsdWUgb3Igb2JqZWN0IGNyZWF0ZWQgd2l0aFxuICAgICAqICAgICAge0BsaW5rIG5nLiRjYWNoZUZhY3RvcnkgYCRjYWNoZUZhY3RvcnlgfSB0byBlbmFibGUgb3IgZGlzYWJsZSBjYWNoaW5nIG9mIHRoZSBIVFRQIHJlc3BvbnNlLlxuICAgICAqICAgICAgU2VlIHtAbGluayAkaHR0cCNjYWNoaW5nICRodHRwIENhY2hpbmd9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqICAgIC0gKip0aW1lb3V0Kiog4oCTIGB7bnVtYmVyfFByb21pc2V9YCDigJMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMsIG9yIHtAbGluayBuZy4kcSBwcm9taXNlfVxuICAgICAqICAgICAgdGhhdCBzaG91bGQgYWJvcnQgdGhlIHJlcXVlc3Qgd2hlbiByZXNvbHZlZC5cbiAgICAgKiAgICAtICoqd2l0aENyZWRlbnRpYWxzKiogLSBge2Jvb2xlYW59YCAtIHdoZXRoZXIgdG8gc2V0IHRoZSBgd2l0aENyZWRlbnRpYWxzYCBmbGFnIG9uIHRoZVxuICAgICAqICAgICAgWEhSIG9iamVjdC4gU2VlIFtyZXF1ZXN0cyB3aXRoIGNyZWRlbnRpYWxzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVFRQL0FjY2Vzc19jb250cm9sX0NPUlMjUmVxdWVzdHNfd2l0aF9jcmVkZW50aWFscylcbiAgICAgKiAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqICAgIC0gKipyZXNwb25zZVR5cGUqKiAtIGB7c3RyaW5nfWAgLSBzZWVcbiAgICAgKiAgICAgIFtYTUxIdHRwUmVxdWVzdC5yZXNwb25zZVR5cGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdCN4bWxodHRwcmVxdWVzdC1yZXNwb25zZXR5cGUpLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBSZXR1cm5zIGEge0BsaW5rIG5nLiRxIGBQcm9taXNlfWAgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHRvIGEgcmVzcG9uc2Ugb2JqZWN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzIG9yIGZhaWxzLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0FycmF5LjxPYmplY3Q+fSBwZW5kaW5nUmVxdWVzdHMgQXJyYXkgb2YgY29uZmlnIG9iamVjdHMgZm9yIGN1cnJlbnRseSBwZW5kaW5nXG4gICAgICogICByZXF1ZXN0cy4gVGhpcyBpcyBwcmltYXJpbHkgbWVhbnQgdG8gYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuPGV4YW1wbGUgbW9kdWxlPVwiaHR0cEV4YW1wbGVcIiBuYW1lPVwiaHR0cC1zZXJ2aWNlXCI+XG48ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJGZXRjaENvbnRyb2xsZXJcIj5cbiAgICA8c2VsZWN0IG5nLW1vZGVsPVwibWV0aG9kXCIgYXJpYS1sYWJlbD1cIlJlcXVlc3QgbWV0aG9kXCI+XG4gICAgICA8b3B0aW9uPkdFVDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbj5KU09OUDwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwidXJsXCIgc2l6ZT1cIjgwXCIgYXJpYS1sYWJlbD1cIlVSTFwiIC8+XG4gICAgPGJ1dHRvbiBpZD1cImZldGNoYnRuXCIgbmctY2xpY2s9XCJmZXRjaCgpXCI+ZmV0Y2g8L2J1dHRvbj48YnI+XG4gICAgPGJ1dHRvbiBpZD1cInNhbXBsZWdldGJ0blwiIG5nLWNsaWNrPVwidXBkYXRlTW9kZWwoJ0dFVCcsICdodHRwLWhlbGxvLmh0bWwnKVwiPlNhbXBsZSBHRVQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGlkPVwic2FtcGxlanNvbnBidG5cIlxuICAgICAgbmctY2xpY2s9XCJ1cGRhdGVNb2RlbCgnSlNPTlAnLFxuICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9hbmd1bGFyanMub3JnL2dyZWV0LnBocD9uYW1lPVN1cGVyJTIwSGVybycpXCI+XG4gICAgICBTYW1wbGUgSlNPTlBcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGlkPVwiaW52YWxpZGpzb25wYnRuXCJcbiAgICAgIG5nLWNsaWNrPVwidXBkYXRlTW9kZWwoJ0pTT05QJywgJ2h0dHBzOi8vYW5ndWxhcmpzLm9yZy9kb2VzbnRleGlzdCcpXCI+XG4gICAgICAgIEludmFsaWQgSlNPTlBcbiAgICAgIDwvYnV0dG9uPlxuICAgIDxwcmU+aHR0cCBzdGF0dXMgY29kZToge3tzdGF0dXN9fTwvcHJlPlxuICAgIDxwcmU+aHR0cCByZXNwb25zZSBkYXRhOiB7e2RhdGF9fTwvcHJlPlxuICA8L2Rpdj5cbjwvZmlsZT5cbjxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgYW5ndWxhci5tb2R1bGUoJ2h0dHBFeGFtcGxlJywgW10pXG4gICAgLmNvbmZpZyhbJyRzY2VEZWxlZ2F0ZVByb3ZpZGVyJywgZnVuY3Rpb24oJHNjZURlbGVnYXRlUHJvdmlkZXIpIHtcbiAgICAgIC8vIFdlIG11c3Qgd2hpdGVsaXN0IHRoZSBKU09OUCBlbmRwb2ludCB0aGF0IHdlIGFyZSB1c2luZyB0byBzaG93IHRoYXQgd2UgdHJ1c3QgaXRcbiAgICAgICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0KFtcbiAgICAgICAgJ3NlbGYnLFxuICAgICAgICAnaHR0cHM6Ly9hbmd1bGFyanMub3JnLyoqJ1xuICAgICAgXSk7XG4gICAgfV0pXG4gICAgLmNvbnRyb2xsZXIoJ0ZldGNoQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJyxcbiAgICAgIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICR0ZW1wbGF0ZUNhY2hlKSB7XG4gICAgICAgICRzY29wZS5tZXRob2QgPSAnR0VUJztcbiAgICAgICAgJHNjb3BlLnVybCA9ICdodHRwLWhlbGxvLmh0bWwnO1xuXG4gICAgICAgICRzY29wZS5mZXRjaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICRzY29wZS5jb2RlID0gbnVsbDtcbiAgICAgICAgICAkc2NvcGUucmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgICAgJGh0dHAoe21ldGhvZDogJHNjb3BlLm1ldGhvZCwgdXJsOiAkc2NvcGUudXJsLCBjYWNoZTogJHRlbXBsYXRlQ2FjaGV9KS5cbiAgICAgICAgICAgIHRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgICAgJHNjb3BlLmRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLmRhdGEgPSByZXNwb25zZS5kYXRhIHx8ICdSZXF1ZXN0IGZhaWxlZCc7XG4gICAgICAgICAgICAgICRzY29wZS5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgJHNjb3BlLnVwZGF0ZU1vZGVsID0gZnVuY3Rpb24obWV0aG9kLCB1cmwpIHtcbiAgICAgICAgICAkc2NvcGUubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICAgICRzY29wZS51cmwgPSB1cmw7XG4gICAgICAgIH07XG4gICAgICB9XSk7XG48L2ZpbGU+XG48ZmlsZSBuYW1lPVwiaHR0cC1oZWxsby5odG1sXCI+XG4gIEhlbGxvLCAkaHR0cCFcbjwvZmlsZT5cbjxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgdmFyIHN0YXR1cyA9IGVsZW1lbnQoYnkuYmluZGluZygnc3RhdHVzJykpO1xuICB2YXIgZGF0YSA9IGVsZW1lbnQoYnkuYmluZGluZygnZGF0YScpKTtcbiAgdmFyIGZldGNoQnRuID0gZWxlbWVudChieS5pZCgnZmV0Y2hidG4nKSk7XG4gIHZhciBzYW1wbGVHZXRCdG4gPSBlbGVtZW50KGJ5LmlkKCdzYW1wbGVnZXRidG4nKSk7XG4gIHZhciBpbnZhbGlkSnNvbnBCdG4gPSBlbGVtZW50KGJ5LmlkKCdpbnZhbGlkanNvbnBidG4nKSk7XG5cbiAgaXQoJ3Nob3VsZCBtYWtlIGFuIHhociBHRVQgcmVxdWVzdCcsIGZ1bmN0aW9uKCkge1xuICAgIHNhbXBsZUdldEJ0bi5jbGljaygpO1xuICAgIGZldGNoQnRuLmNsaWNrKCk7XG4gICAgZXhwZWN0KHN0YXR1cy5nZXRUZXh0KCkpLnRvTWF0Y2goJzIwMCcpO1xuICAgIGV4cGVjdChkYXRhLmdldFRleHQoKSkudG9NYXRjaCgvSGVsbG8sIFxcJGh0dHAhLyk7XG4gIH0pO1xuXG4vLyBDb21tZW50ZWQgb3V0IGR1ZSB0byBmbGFrZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL2lzc3Vlcy85MTg1XG4vLyBpdCgnc2hvdWxkIG1ha2UgYSBKU09OUCByZXF1ZXN0IHRvIGFuZ3VsYXJqcy5vcmcnLCBmdW5jdGlvbigpIHtcbi8vICAgdmFyIHNhbXBsZUpzb25wQnRuID0gZWxlbWVudChieS5pZCgnc2FtcGxlanNvbnBidG4nKSk7XG4vLyAgIHNhbXBsZUpzb25wQnRuLmNsaWNrKCk7XG4vLyAgIGZldGNoQnRuLmNsaWNrKCk7XG4vLyAgIGV4cGVjdChzdGF0dXMuZ2V0VGV4dCgpKS50b01hdGNoKCcyMDAnKTtcbi8vICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKC9TdXBlciBIZXJvIS8pO1xuLy8gfSk7XG5cbiAgaXQoJ3Nob3VsZCBtYWtlIEpTT05QIHJlcXVlc3QgdG8gaW52YWxpZCBVUkwgYW5kIGludm9rZSB0aGUgZXJyb3IgaGFuZGxlcicsXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICBpbnZhbGlkSnNvbnBCdG4uY2xpY2soKTtcbiAgICBmZXRjaEJ0bi5jbGljaygpO1xuICAgIGV4cGVjdChzdGF0dXMuZ2V0VGV4dCgpKS50b01hdGNoKCcwJyk7XG4gICAgZXhwZWN0KGRhdGEuZ2V0VGV4dCgpKS50b01hdGNoKCdSZXF1ZXN0IGZhaWxlZCcpO1xuICB9KTtcbjwvZmlsZT5cbjwvZXhhbXBsZT5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiAkaHR0cChyZXF1ZXN0Q29uZmlnKSB7XG5cbiAgICAgIGlmICghaXNPYmplY3QocmVxdWVzdENvbmZpZykpIHtcbiAgICAgICAgdGhyb3cgbWluRXJyKCckaHR0cCcpKCdiYWRyZXEnLCAnSHR0cCByZXF1ZXN0IGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhbiBvYmplY3QuICBSZWNlaXZlZDogezB9JywgcmVxdWVzdENvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTdHJpbmcoJHNjZS52YWx1ZU9mKHJlcXVlc3RDb25maWcudXJsKSkpIHtcbiAgICAgICAgdGhyb3cgbWluRXJyKCckaHR0cCcpKCdiYWRyZXEnLCAnSHR0cCByZXF1ZXN0IGNvbmZpZ3VyYXRpb24gdXJsIG11c3QgYmUgYSBzdHJpbmcgb3IgYSAkc2NlIHRydXN0ZWQgb2JqZWN0LiAgUmVjZWl2ZWQ6IHswfScsIHJlcXVlc3RDb25maWcudXJsKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbmZpZyA9IGV4dGVuZCh7XG4gICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3QsXG4gICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZSxcbiAgICAgICAgcGFyYW1TZXJpYWxpemVyOiBkZWZhdWx0cy5wYXJhbVNlcmlhbGl6ZXIsXG4gICAgICAgIGpzb25wQ2FsbGJhY2tQYXJhbTogZGVmYXVsdHMuanNvbnBDYWxsYmFja1BhcmFtXG4gICAgICB9LCByZXF1ZXN0Q29uZmlnKTtcblxuICAgICAgY29uZmlnLmhlYWRlcnMgPSBtZXJnZUhlYWRlcnMocmVxdWVzdENvbmZpZyk7XG4gICAgICBjb25maWcubWV0aG9kID0gdXBwZXJjYXNlKGNvbmZpZy5tZXRob2QpO1xuICAgICAgY29uZmlnLnBhcmFtU2VyaWFsaXplciA9IGlzU3RyaW5nKGNvbmZpZy5wYXJhbVNlcmlhbGl6ZXIpID9cbiAgICAgICAgICAkaW5qZWN0b3IuZ2V0KGNvbmZpZy5wYXJhbVNlcmlhbGl6ZXIpIDogY29uZmlnLnBhcmFtU2VyaWFsaXplcjtcblxuICAgICAgJGJyb3dzZXIuJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudCgpO1xuXG4gICAgICB2YXIgcmVxdWVzdEludGVyY2VwdG9ycyA9IFtdO1xuICAgICAgdmFyIHJlc3BvbnNlSW50ZXJjZXB0b3JzID0gW107XG4gICAgICB2YXIgcHJvbWlzZSA9ICRxLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgLy8gYXBwbHkgaW50ZXJjZXB0b3JzXG4gICAgICBmb3JFYWNoKHJldmVyc2VkSW50ZXJjZXB0b3JzLCBmdW5jdGlvbihpbnRlcmNlcHRvcikge1xuICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVxdWVzdCB8fCBpbnRlcmNlcHRvci5yZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgICByZXF1ZXN0SW50ZXJjZXB0b3JzLnVuc2hpZnQoaW50ZXJjZXB0b3IucmVxdWVzdCwgaW50ZXJjZXB0b3IucmVxdWVzdEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3IucmVzcG9uc2UgfHwgaW50ZXJjZXB0b3IucmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JzLnB1c2goaW50ZXJjZXB0b3IucmVzcG9uc2UsIGludGVyY2VwdG9yLnJlc3BvbnNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcHJvbWlzZSA9IGNoYWluSW50ZXJjZXB0b3JzKHByb21pc2UsIHJlcXVlc3RJbnRlcmNlcHRvcnMpO1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihzZXJ2ZXJSZXF1ZXN0KTtcbiAgICAgIHByb21pc2UgPSBjaGFpbkludGVyY2VwdG9ycyhwcm9taXNlLCByZXNwb25zZUludGVyY2VwdG9ycyk7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS5maW5hbGx5KGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG5cblxuICAgICAgZnVuY3Rpb24gY2hhaW5JbnRlcmNlcHRvcnMocHJvbWlzZSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGludGVyY2VwdG9ycy5sZW5ndGg7IGkgPCBpaTspIHtcbiAgICAgICAgICB2YXIgdGhlbkZuID0gaW50ZXJjZXB0b3JzW2krK107XG4gICAgICAgICAgdmFyIHJlamVjdEZuID0gaW50ZXJjZXB0b3JzW2krK107XG5cbiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHRoZW5GbiwgcmVqZWN0Rm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaW50ZXJjZXB0b3JzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KCkge1xuICAgICAgICAkYnJvd3Nlci4kJGNvbXBsZXRlT3V0c3RhbmRpbmdSZXF1ZXN0KG5vb3ApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlSGVhZGVyRm5zKGhlYWRlcnMsIGNvbmZpZykge1xuICAgICAgICB2YXIgaGVhZGVyQ29udGVudCwgcHJvY2Vzc2VkSGVhZGVycyA9IHt9O1xuXG4gICAgICAgIGZvckVhY2goaGVhZGVycywgZnVuY3Rpb24oaGVhZGVyRm4sIGhlYWRlcikge1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGhlYWRlckZuKSkge1xuICAgICAgICAgICAgaGVhZGVyQ29udGVudCA9IGhlYWRlckZuKGNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoaGVhZGVyQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZEhlYWRlcnNbaGVhZGVyXSA9IGhlYWRlckNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2Nlc3NlZEhlYWRlcnNbaGVhZGVyXSA9IGhlYWRlckZuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEhlYWRlcnM7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG1lcmdlSGVhZGVycyhjb25maWcpIHtcbiAgICAgICAgdmFyIGRlZkhlYWRlcnMgPSBkZWZhdWx0cy5oZWFkZXJzLFxuICAgICAgICAgICAgcmVxSGVhZGVycyA9IGV4dGVuZCh7fSwgY29uZmlnLmhlYWRlcnMpLFxuICAgICAgICAgICAgZGVmSGVhZGVyTmFtZSwgbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSwgcmVxSGVhZGVyTmFtZTtcblxuICAgICAgICBkZWZIZWFkZXJzID0gZXh0ZW5kKHt9LCBkZWZIZWFkZXJzLmNvbW1vbiwgZGVmSGVhZGVyc1tsb3dlcmNhc2UoY29uZmlnLm1ldGhvZCldKTtcblxuICAgICAgICAvLyB1c2luZyBmb3ItaW4gaW5zdGVhZCBvZiBmb3JFYWNoIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGl0ZXJhdGlvbiBhZnRlciBoZWFkZXIgaGFzIGJlZW4gZm91bmRcbiAgICAgICAgZGVmYXVsdEhlYWRlcnNJdGVyYXRpb246XG4gICAgICAgIGZvciAoZGVmSGVhZGVyTmFtZSBpbiBkZWZIZWFkZXJzKSB7XG4gICAgICAgICAgbG93ZXJjYXNlRGVmSGVhZGVyTmFtZSA9IGxvd2VyY2FzZShkZWZIZWFkZXJOYW1lKTtcblxuICAgICAgICAgIGZvciAocmVxSGVhZGVyTmFtZSBpbiByZXFIZWFkZXJzKSB7XG4gICAgICAgICAgICBpZiAobG93ZXJjYXNlKHJlcUhlYWRlck5hbWUpID09PSBsb3dlcmNhc2VEZWZIZWFkZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIGRlZmF1bHRIZWFkZXJzSXRlcmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcUhlYWRlcnNbZGVmSGVhZGVyTmFtZV0gPSBkZWZIZWFkZXJzW2RlZkhlYWRlck5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXhlY3V0ZSBpZiBoZWFkZXIgdmFsdWUgaXMgYSBmdW5jdGlvbiBmb3IgbWVyZ2VkIGhlYWRlcnNcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVIZWFkZXJGbnMocmVxSGVhZGVycywgc2hhbGxvd0NvcHkoY29uZmlnKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNlcnZlclJlcXVlc3QoY29uZmlnKSB7XG4gICAgICAgIHZhciBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnM7XG4gICAgICAgIHZhciByZXFEYXRhID0gdHJhbnNmb3JtRGF0YShjb25maWcuZGF0YSwgaGVhZGVyc0dldHRlcihoZWFkZXJzKSwgdW5kZWZpbmVkLCBjb25maWcudHJhbnNmb3JtUmVxdWVzdCk7XG5cbiAgICAgICAgLy8gc3RyaXAgY29udGVudC10eXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChyZXFEYXRhKSkge1xuICAgICAgICAgIGZvckVhY2goaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGhlYWRlcikge1xuICAgICAgICAgICAgaWYgKGxvd2VyY2FzZShoZWFkZXIpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpICYmICFpc1VuZGVmaW5lZChkZWZhdWx0cy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICAgICAgY29uZmlnLndpdGhDcmVkZW50aWFscyA9IGRlZmF1bHRzLndpdGhDcmVkZW50aWFscztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNlbmQgcmVxdWVzdFxuICAgICAgICByZXR1cm4gc2VuZFJlcShjb25maWcsIHJlcURhdGEpLnRoZW4odHJhbnNmb3JtUmVzcG9uc2UsIHRyYW5zZm9ybVJlc3BvbnNlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAgICAgLy8gbWFrZSBhIGNvcHkgc2luY2UgdGhlIHJlc3BvbnNlIG11c3QgYmUgY2FjaGVhYmxlXG4gICAgICAgIHZhciByZXNwID0gZXh0ZW5kKHt9LCByZXNwb25zZSk7XG4gICAgICAgIHJlc3AuZGF0YSA9IHRyYW5zZm9ybURhdGEocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSk7XG4gICAgICAgIHJldHVybiAoaXNTdWNjZXNzKHJlc3BvbnNlLnN0YXR1cykpXG4gICAgICAgICAgPyByZXNwXG4gICAgICAgICAgOiAkcS5yZWplY3QocmVzcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJGh0dHAucGVuZGluZ1JlcXVlc3RzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJGh0dHAjZ2V0XG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGN1dCBtZXRob2QgdG8gcGVyZm9ybSBgR0VUYCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VHJ1c3RlZE9iamVjdH0gdXJsIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQ7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIG9iamVjdCBjcmVhdGVkIGJ5IGEgY2FsbCB0byBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodXJsKWAuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3RcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkaHR0cCNkZWxldGVcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBERUxFVEVgIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xUcnVzdGVkT2JqZWN0fSB1cmwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIG9mIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZDtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGAkc2NlLnRydXN0QXNSZXNvdXJjZVVybCh1cmwpYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRodHRwI2hlYWRcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBIRUFEYCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8VHJ1c3RlZE9iamVjdH0gdXJsIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQ7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIG9iamVjdCBjcmVhdGVkIGJ5IGEgY2FsbCB0byBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodXJsKWAuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3RcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkaHR0cCNqc29ucFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYEpTT05QYCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0LCBzaW5jZSBKU09OUCByZXF1ZXN0cyBhcmUgc2Vuc2l0aXZlIGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzIGdpdmVuIGZ1bGwgYWNjZXNzIHRvIHRoZSBicm93c2VyLFxuICAgICAqIHRoZSB1cmwgbXVzdCBiZSBkZWNsYXJlZCwgdmlhIHtAbGluayAkc2NlfSBhcyBhIHRydXN0ZWQgcmVzb3VyY2UgVVJMLlxuICAgICAqIFlvdSBjYW4gdHJ1c3QgYSBVUkwgYnkgYWRkaW5nIGl0IHRvIHRoZSB3aGl0ZWxpc3QgdmlhXG4gICAgICoge0BsaW5rICRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0ICBgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxXaGl0ZWxpc3RgfSBvclxuICAgICAqIGJ5IGV4cGxpY2l0bHkgdHJ1c3RpbmcgdGhlIFVSTCB2aWEge0BsaW5rICRzY2UjdHJ1c3RBc1Jlc291cmNlVXJsIGAkc2NlLnRydXN0QXNSZXNvdXJjZVVybCh1cmwpYH0uXG4gICAgICpcbiAgICAgKiBKU09OUCByZXF1ZXN0cyBtdXN0IHNwZWNpZnkgYSBjYWxsYmFjayB0byBiZSB1c2VkIGluIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIFRoaXMgY2FsbGJhY2tcbiAgICAgKiBpcyBwYXNzZWQgYXMgYSBxdWVyeSBwYXJhbWV0ZXIgaW4gdGhlIHJlcXVlc3QuIFlvdSBtdXN0IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIgYnlcbiAgICAgKiBzZXR0aW5nIHRoZSBganNvbnBDYWxsYmFja1BhcmFtYCBwcm9wZXJ0eSBvbiB0aGUgcmVxdWVzdCBjb25maWcgb2JqZWN0LlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogJGh0dHAuanNvbnAoJ3NvbWUvdHJ1c3RlZC91cmwnLCB7anNvbnBDYWxsYmFja1BhcmFtOiAnY2FsbGJhY2snfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgZGVmYXVsdCBjYWxsYmFjayBwYXJhbWV0ZXIgbmFtZSBpbiBgJGh0dHAuZGVmYXVsdHMuanNvbnBDYWxsYmFja1BhcmFtYC5cbiAgICAgKiBJbml0aWFsbHkgdGhpcyBpcyBzZXQgdG8gYCdjYWxsYmFjaydgLlxuICAgICAqXG4gICAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPlxuICAgICAqIFlvdSBjYW4gbm8gbG9uZ2VyIHVzZSB0aGUgYEpTT05fQ0FMTEJBQ0tgIHN0cmluZyBhcyBhIHBsYWNlaG9sZGVyIGZvciBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBjYWxsYmFja1xuICAgICAqIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgZ28uXG4gICAgICogPC9kaXY+XG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd291bGQgbGlrZSB0byBjdXN0b21pc2Ugd2hlcmUgYW5kIGhvdyB0aGUgY2FsbGJhY2tzIGFyZSBzdG9yZWQgdGhlbiB0cnkgb3ZlcnJpZGluZ1xuICAgICAqIG9yIGRlY29yYXRpbmcgdGhlIHtAbGluayAkanNvbnBDYWxsYmFja3N9IHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xUcnVzdGVkT2JqZWN0fSB1cmwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIG9mIHRoZSByZXNvdXJjZSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZDtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgYSBjYWxsIHRvIGAkc2NlLnRydXN0QXNSZXNvdXJjZVVybCh1cmwpYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdFxuICAgICAqL1xuICAgIGNyZWF0ZVNob3J0TWV0aG9kcygnZ2V0JywgJ2RlbGV0ZScsICdoZWFkJywgJ2pzb25wJyk7XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJGh0dHAjcG9zdFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYFBPU1RgIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFJlbGF0aXZlIG9yIGFic29sdXRlIFVSTCBzcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcmVxdWVzdFxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBSZXF1ZXN0IGNvbnRlbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtIdHRwUHJvbWlzZX0gRnV0dXJlIG9iamVjdFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRodHRwI3B1dFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRjdXQgbWV0aG9kIHRvIHBlcmZvcm0gYFBVVGAgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgUmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMIHNwZWNpZnlpbmcgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSByZXF1ZXN0XG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFJlcXVlc3QgY29udGVudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge0h0dHBQcm9taXNlfSBGdXR1cmUgb2JqZWN0XG4gICAgICovXG5cbiAgICAgLyoqXG4gICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICogQG5hbWUgJGh0dHAjcGF0Y2hcbiAgICAgICpcbiAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAqIFNob3J0Y3V0IG1ldGhvZCB0byBwZXJmb3JtIGBQQVRDSGAgcmVxdWVzdC5cbiAgICAgICpcbiAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBSZWxhdGl2ZSBvciBhYnNvbHV0ZSBVUkwgc3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHJlcXVlc3RcbiAgICAgICogQHBhcmFtIHsqfSBkYXRhIFJlcXVlc3QgY29udGVudFxuICAgICAgKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAgKiBAcmV0dXJucyB7SHR0cFByb21pc2V9IEZ1dHVyZSBvYmplY3RcbiAgICAgICovXG4gICAgY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEoJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuZ2RvYyBwcm9wZXJ0eVxuICAgICAgICAgKiBAbmFtZSAkaHR0cCNkZWZhdWx0c1xuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUnVudGltZSBlcXVpdmFsZW50IG9mIHRoZSBgJGh0dHBQcm92aWRlci5kZWZhdWx0c2AgcHJvcGVydHkuIEFsbG93cyBjb25maWd1cmF0aW9uIG9mXG4gICAgICAgICAqIGRlZmF1bHQgaGVhZGVycywgd2l0aENyZWRlbnRpYWxzIGFzIHdlbGwgYXMgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTZWUgXCJTZXR0aW5nIEhUVFAgSGVhZGVyc1wiIGFuZCBcIlRyYW5zZm9ybWluZyBSZXF1ZXN0cyBhbmQgUmVzcG9uc2VzXCIgc2VjdGlvbnMgYWJvdmUuXG4gICAgICAgICAqL1xuICAgICRodHRwLmRlZmF1bHRzID0gZGVmYXVsdHM7XG5cblxuICAgIHJldHVybiAkaHR0cDtcblxuXG4gICAgZnVuY3Rpb24gY3JlYXRlU2hvcnRNZXRob2RzKG5hbWVzKSB7XG4gICAgICBmb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAkaHR0cFtuYW1lXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgICAgICAgcmV0dXJuICRodHRwKGV4dGVuZCh7fSwgY29uZmlnIHx8IHt9LCB7XG4gICAgICAgICAgICBtZXRob2Q6IG5hbWUsXG4gICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEobmFtZSkge1xuICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgJGh0dHBbbmFtZV0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgICAgIHJldHVybiAkaHR0cChleHRlbmQoe30sIGNvbmZpZyB8fCB7fSwge1xuICAgICAgICAgICAgbWV0aG9kOiBuYW1lLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqICEhISBBQ0NFU1NFUyBDTE9TVVJFIFZBUlM6XG4gICAgICogJGh0dHBCYWNrZW5kLCBkZWZhdWx0cywgJGxvZywgJHJvb3RTY29wZSwgZGVmYXVsdENhY2hlLCAkaHR0cC5wZW5kaW5nUmVxdWVzdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZW5kUmVxKGNvbmZpZywgcmVxRGF0YSkge1xuICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKSxcbiAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSxcbiAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICBjYWNoZWRSZXNwLFxuICAgICAgICAgIHJlcUhlYWRlcnMgPSBjb25maWcuaGVhZGVycyxcbiAgICAgICAgICBpc0pzb25wID0gbG93ZXJjYXNlKGNvbmZpZy5tZXRob2QpID09PSAnanNvbnAnLFxuICAgICAgICAgIHVybCA9IGNvbmZpZy51cmw7XG5cbiAgICAgIGlmIChpc0pzb25wKSB7XG4gICAgICAgIC8vIEpTT05QIGlzIGEgcHJldHR5IHNlbnNpdGl2ZSBvcGVyYXRpb24gd2hlcmUgd2UncmUgYWxsb3dpbmcgYSBzY3JpcHQgdG8gaGF2ZSBmdWxsIGFjY2VzcyB0b1xuICAgICAgICAvLyBvdXIgRE9NIGFuZCBKUyBzcGFjZS4gIFNvIHdlIHJlcXVpcmUgdGhhdCB0aGUgVVJMIHNhdGlzZmllcyBTQ0UuUkVTT1VSQ0VfVVJMLlxuICAgICAgICB1cmwgPSAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh1cmwpO1xuICAgICAgfSBlbHNlIGlmICghaXNTdHJpbmcodXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBpcyBub3QgYSBzdHJpbmcgdGhlbiB0aGUgVVJMIG11c3QgYmUgYSAkc2NlIHRydXN0ZWQgb2JqZWN0XG4gICAgICAgIHVybCA9ICRzY2UudmFsdWVPZih1cmwpO1xuICAgICAgfVxuXG4gICAgICB1cmwgPSBidWlsZFVybCh1cmwsIGNvbmZpZy5wYXJhbVNlcmlhbGl6ZXIoY29uZmlnLnBhcmFtcykpO1xuXG4gICAgICBpZiAoaXNKc29ucCkge1xuICAgICAgICAvLyBDaGVjayB0aGUgdXJsIGFuZCBhZGQgdGhlIEpTT05QIGNhbGxiYWNrIHBsYWNlaG9sZGVyXG4gICAgICAgIHVybCA9IHNhbml0aXplSnNvbnBDYWxsYmFja1BhcmFtKHVybCwgY29uZmlnLmpzb25wQ2FsbGJhY2tQYXJhbSk7XG4gICAgICB9XG5cbiAgICAgICRodHRwLnBlbmRpbmdSZXF1ZXN0cy5wdXNoKGNvbmZpZyk7XG4gICAgICBwcm9taXNlLnRoZW4ocmVtb3ZlUGVuZGluZ1JlcSwgcmVtb3ZlUGVuZGluZ1JlcSk7XG5cbiAgICAgIGlmICgoY29uZmlnLmNhY2hlIHx8IGRlZmF1bHRzLmNhY2hlKSAmJiBjb25maWcuY2FjaGUgIT09IGZhbHNlICYmXG4gICAgICAgICAgKGNvbmZpZy5tZXRob2QgPT09ICdHRVQnIHx8IGNvbmZpZy5tZXRob2QgPT09ICdKU09OUCcpKSB7XG4gICAgICAgIGNhY2hlID0gaXNPYmplY3QoY29uZmlnLmNhY2hlKSA/IGNvbmZpZy5jYWNoZVxuICAgICAgICAgICAgICA6IGlzT2JqZWN0KGRlZmF1bHRzLmNhY2hlKSA/IGRlZmF1bHRzLmNhY2hlXG4gICAgICAgICAgICAgIDogZGVmYXVsdENhY2hlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY2FjaGVkUmVzcCA9IGNhY2hlLmdldCh1cmwpO1xuICAgICAgICBpZiAoaXNEZWZpbmVkKGNhY2hlZFJlc3ApKSB7XG4gICAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoY2FjaGVkUmVzcCkpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlZCByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gc2VudCwgYnV0IHRoZXJlIGlzIG5vIHJlc3BvbnNlIHlldFxuICAgICAgICAgICAgY2FjaGVkUmVzcC50aGVuKHJlc29sdmVQcm9taXNlV2l0aFJlc3VsdCwgcmVzb2x2ZVByb21pc2VXaXRoUmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2VydmluZyBmcm9tIGNhY2hlXG4gICAgICAgICAgICBpZiAoaXNBcnJheShjYWNoZWRSZXNwKSkge1xuICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjYWNoZWRSZXNwWzFdLCBjYWNoZWRSZXNwWzBdLCBzaGFsbG93Q29weShjYWNoZWRSZXNwWzJdKSwgY2FjaGVkUmVzcFszXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjYWNoZWRSZXNwLCAyMDAsIHt9LCAnT0snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcHV0IHRoZSBwcm9taXNlIGZvciB0aGUgbm9uLXRyYW5zZm9ybWVkIHJlc3BvbnNlIGludG8gY2FjaGUgYXMgYSBwbGFjZWhvbGRlclxuICAgICAgICAgIGNhY2hlLnB1dCh1cmwsIHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLy8gaWYgd2Ugd29uJ3QgaGF2ZSB0aGUgcmVzcG9uc2UgaW4gY2FjaGUsIHNldCB0aGUgeHNyZiBoZWFkZXJzIGFuZFxuICAgICAgLy8gc2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgYmFja2VuZFxuICAgICAgaWYgKGlzVW5kZWZpbmVkKGNhY2hlZFJlc3ApKSB7XG4gICAgICAgIHZhciB4c3JmVmFsdWUgPSB1cmxJc1NhbWVPcmlnaW4oY29uZmlnLnVybClcbiAgICAgICAgICAgID8gJCRjb29raWVSZWFkZXIoKVtjb25maWcueHNyZkNvb2tpZU5hbWUgfHwgZGVmYXVsdHMueHNyZkNvb2tpZU5hbWVdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICAgIHJlcUhlYWRlcnNbKGNvbmZpZy54c3JmSGVhZGVyTmFtZSB8fCBkZWZhdWx0cy54c3JmSGVhZGVyTmFtZSldID0geHNyZlZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgJGh0dHBCYWNrZW5kKGNvbmZpZy5tZXRob2QsIHVybCwgcmVxRGF0YSwgZG9uZSwgcmVxSGVhZGVycywgY29uZmlnLnRpbWVvdXQsXG4gICAgICAgICAgICBjb25maWcud2l0aENyZWRlbnRpYWxzLCBjb25maWcucmVzcG9uc2VUeXBlLFxuICAgICAgICAgICAgY3JlYXRlQXBwbHlIYW5kbGVycyhjb25maWcuZXZlbnRIYW5kbGVycyksXG4gICAgICAgICAgICBjcmVhdGVBcHBseUhhbmRsZXJzKGNvbmZpZy51cGxvYWRFdmVudEhhbmRsZXJzKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuXG4gICAgICBmdW5jdGlvbiBjcmVhdGVBcHBseUhhbmRsZXJzKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICB2YXIgYXBwbHlIYW5kbGVycyA9IHt9O1xuICAgICAgICAgIGZvckVhY2goZXZlbnRIYW5kbGVycywgZnVuY3Rpb24oZXZlbnRIYW5kbGVyLCBrZXkpIHtcbiAgICAgICAgICAgIGFwcGx5SGFuZGxlcnNba2V5XSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgIGlmICh1c2VBcHBseUFzeW5jKSB7XG4gICAgICAgICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHlBc3luYyhjYWxsRXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICgkcm9vdFNjb3BlLiQkcGhhc2UpIHtcbiAgICAgICAgICAgICAgICBjYWxsRXZlbnRIYW5kbGVyKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHkoY2FsbEV2ZW50SGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsRXZlbnRIYW5kbGVyKCkge1xuICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5SGFuZGxlcnM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICAvKipcbiAgICAgICAqIENhbGxiYWNrIHJlZ2lzdGVyZWQgdG8gJGh0dHBCYWNrZW5kKCk6XG4gICAgICAgKiAgLSBjYWNoZXMgdGhlIHJlc3BvbnNlIGlmIGRlc2lyZWRcbiAgICAgICAqICAtIHJlc29sdmVzIHRoZSByYXcgJGh0dHAgcHJvbWlzZVxuICAgICAgICogIC0gY2FsbHMgJGFwcGx5XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGRvbmUoc3RhdHVzLCByZXNwb25zZSwgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCkge1xuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICBpZiAoaXNTdWNjZXNzKHN0YXR1cykpIHtcbiAgICAgICAgICAgIGNhY2hlLnB1dCh1cmwsIFtzdGF0dXMsIHJlc3BvbnNlLCBwYXJzZUhlYWRlcnMoaGVhZGVyc1N0cmluZyksIHN0YXR1c1RleHRdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHByb21pc2UgZnJvbSB0aGUgY2FjaGVcbiAgICAgICAgICAgIGNhY2hlLnJlbW92ZSh1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlc29sdmVIdHRwUHJvbWlzZSgpIHtcbiAgICAgICAgICByZXNvbHZlUHJvbWlzZShyZXNwb25zZSwgc3RhdHVzLCBoZWFkZXJzU3RyaW5nLCBzdGF0dXNUZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VBcHBseUFzeW5jKSB7XG4gICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHlBc3luYyhyZXNvbHZlSHR0cFByb21pc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVIdHRwUHJvbWlzZSgpO1xuICAgICAgICAgIGlmICghJHJvb3RTY29wZS4kJHBoYXNlKSAkcm9vdFNjb3BlLiRhcHBseSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvbHZlcyB0aGUgcmF3ICRodHRwIHByb21pc2UuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHJlc3BvbnNlLCBzdGF0dXMsIGhlYWRlcnMsIHN0YXR1c1RleHQpIHtcbiAgICAgICAgLy9zdGF0dXM6IEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUsIDAsIC0xIChhYm9ydGVkIGJ5IHRpbWVvdXQgLyBwcm9taXNlKVxuICAgICAgICBzdGF0dXMgPSBzdGF0dXMgPj0gLTEgPyBzdGF0dXMgOiAwO1xuXG4gICAgICAgIChpc1N1Y2Nlc3Moc3RhdHVzKSA/IGRlZmVycmVkLnJlc29sdmUgOiBkZWZlcnJlZC5yZWplY3QpKHtcbiAgICAgICAgICBkYXRhOiByZXNwb25zZSxcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzR2V0dGVyKGhlYWRlcnMpLFxuICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlV2l0aFJlc3VsdChyZXN1bHQpIHtcbiAgICAgICAgcmVzb2x2ZVByb21pc2UocmVzdWx0LmRhdGEsIHJlc3VsdC5zdGF0dXMsIHNoYWxsb3dDb3B5KHJlc3VsdC5oZWFkZXJzKCkpLCByZXN1bHQuc3RhdHVzVGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlbW92ZVBlbmRpbmdSZXEoKSB7XG4gICAgICAgIHZhciBpZHggPSAkaHR0cC5wZW5kaW5nUmVxdWVzdHMuaW5kZXhPZihjb25maWcpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkgJGh0dHAucGVuZGluZ1JlcXVlc3RzLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gYnVpbGRVcmwodXJsLCBzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgICBpZiAoc2VyaWFsaXplZFBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSAoKHVybC5pbmRleE9mKCc/JykgPT09IC0xKSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzYW5pdGl6ZUpzb25wQ2FsbGJhY2tQYXJhbSh1cmwsIGtleSkge1xuICAgICAgaWYgKC9bJj9dW149XSs9SlNPTl9DQUxMQkFDSy8udGVzdCh1cmwpKSB7XG4gICAgICAgIC8vIFRocm93IGlmIHRoZSB1cmwgYWxyZWFkeSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBKU09OX0NBTExCQUNLXG4gICAgICAgIHRocm93ICRodHRwTWluRXJyKCdiYWRqc29ucCcsICdJbGxlZ2FsIHVzZSBvZiBKU09OX0NBTExCQUNLIGluIHVybCwgXCJ7MH1cIicsIHVybCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjYWxsYmFja1BhcmFtUmVnZXggPSBuZXcgUmVnRXhwKCdbJj9dJyArIGtleSArICc9Jyk7XG4gICAgICBpZiAoY2FsbGJhY2tQYXJhbVJlZ2V4LnRlc3QodXJsKSkge1xuICAgICAgICAvLyBUaHJvdyBpZiB0aGUgY2FsbGJhY2sgcGFyYW0gd2FzIGFscmVhZHkgcHJvdmlkZWRcbiAgICAgICAgdGhyb3cgJGh0dHBNaW5FcnIoJ2JhZGpzb25wJywgJ0lsbGVnYWwgdXNlIG9mIGNhbGxiYWNrIHBhcmFtLCBcInswfVwiLCBpbiB1cmwsIFwiezF9XCInLCBrZXksIHVybCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBpbiB0aGUgSlNPTl9DQUxMQkFDSyBjYWxsYmFjayBwYXJhbSB2YWx1ZVxuICAgICAgdXJsICs9ICgodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEpID8gJz8nIDogJyYnKSArIGtleSArICc9SlNPTl9DQUxMQkFDSyc7XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICB9XTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJHhockZhY3RvcnlcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIFhNTEh0dHBSZXF1ZXN0IG9iamVjdHMuXG4gKlxuICogUmVwbGFjZSBvciBkZWNvcmF0ZSB0aGlzIHNlcnZpY2UgdG8gY3JlYXRlIHlvdXIgb3duIGN1c3RvbSBYTUxIdHRwUmVxdWVzdCBvYmplY3RzLlxuICpcbiAqIGBgYFxuICogYW5ndWxhci5tb2R1bGUoJ215QXBwJywgW10pXG4gKiAuZmFjdG9yeSgnJHhockZhY3RvcnknLCBmdW5jdGlvbigpIHtcbiAqICAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVhocihtZXRob2QsIHVybCkge1xuICogICAgIHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KHttb3pTeXN0ZW06IHRydWV9KTtcbiAqICAgfTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBIVFRQIG1ldGhvZCBvZiB0aGUgcmVxdWVzdCAoR0VULCBQT1NULCBQVVQsIC4uKVxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgb2YgdGhlIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uICR4aHJGYWN0b3J5UHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVYaHIoKSB7XG4gICAgICByZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRodHRwQmFja2VuZFxuICogQHJlcXVpcmVzICRqc29ucENhbGxiYWNrc1xuICogQHJlcXVpcmVzICRkb2N1bWVudFxuICogQHJlcXVpcmVzICR4aHJGYWN0b3J5XG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSFRUUCBiYWNrZW5kIHVzZWQgYnkgdGhlIHtAbGluayBuZy4kaHR0cCBzZXJ2aWNlfSB0aGF0IGRlbGVnYXRlcyB0b1xuICogWE1MSHR0cFJlcXVlc3Qgb2JqZWN0IG9yIEpTT05QIGFuZCBkZWFscyB3aXRoIGJyb3dzZXIgaW5jb21wYXRpYmlsaXRpZXMuXG4gKlxuICogWW91IHNob3VsZCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIHNlcnZpY2UgZGlyZWN0bHksIGluc3RlYWQgdXNlIHRoZSBoaWdoZXItbGV2ZWwgYWJzdHJhY3Rpb25zOlxuICoge0BsaW5rIG5nLiRodHRwICRodHRwfSBvciB7QGxpbmsgbmdSZXNvdXJjZS4kcmVzb3VyY2UgJHJlc291cmNlfS5cbiAqXG4gKiBEdXJpbmcgdGVzdGluZyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHN3YXBwZWQgd2l0aCB7QGxpbmsgbmdNb2NrLiRodHRwQmFja2VuZCBtb2NrXG4gKiAkaHR0cEJhY2tlbmR9IHdoaWNoIGNhbiBiZSB0cmFpbmVkIHdpdGggcmVzcG9uc2VzLlxuICovXG5mdW5jdGlvbiAkSHR0cEJhY2tlbmRQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckYnJvd3NlcicsICckanNvbnBDYWxsYmFja3MnLCAnJGRvY3VtZW50JywgJyR4aHJGYWN0b3J5JywgZnVuY3Rpb24oJGJyb3dzZXIsICRqc29ucENhbGxiYWNrcywgJGRvY3VtZW50LCAkeGhyRmFjdG9yeSkge1xuICAgIHJldHVybiBjcmVhdGVIdHRwQmFja2VuZCgkYnJvd3NlciwgJHhockZhY3RvcnksICRicm93c2VyLmRlZmVyLCAkanNvbnBDYWxsYmFja3MsICRkb2N1bWVudFswXSk7XG4gIH1dO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIdHRwQmFja2VuZCgkYnJvd3NlciwgY3JlYXRlWGhyLCAkYnJvd3NlckRlZmVyLCBjYWxsYmFja3MsIHJhd0RvY3VtZW50KSB7XG4gIC8vIFRPRE8odm9qdGEpOiBmaXggdGhlIHNpZ25hdHVyZVxuICByZXR1cm4gZnVuY3Rpb24obWV0aG9kLCB1cmwsIHBvc3QsIGNhbGxiYWNrLCBoZWFkZXJzLCB0aW1lb3V0LCB3aXRoQ3JlZGVudGlhbHMsIHJlc3BvbnNlVHlwZSwgZXZlbnRIYW5kbGVycywgdXBsb2FkRXZlbnRIYW5kbGVycykge1xuICAgIHVybCA9IHVybCB8fCAkYnJvd3Nlci51cmwoKTtcblxuICAgIGlmIChsb3dlcmNhc2UobWV0aG9kKSA9PT0gJ2pzb25wJykge1xuICAgICAgdmFyIGNhbGxiYWNrUGF0aCA9IGNhbGxiYWNrcy5jcmVhdGVDYWxsYmFjayh1cmwpO1xuICAgICAgdmFyIGpzb25wRG9uZSA9IGpzb25wUmVxKHVybCwgY2FsbGJhY2tQYXRoLCBmdW5jdGlvbihzdGF0dXMsIHRleHQpIHtcbiAgICAgICAgLy8ganNvbnBSZXEgb25seSBldmVyIHNldHMgc3RhdHVzIHRvIDIwMCAoT0spLCA0MDQgKEVSUk9SKSBvciAtMSAoV0FJVElORylcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gKHN0YXR1cyA9PT0gMjAwKSAmJiBjYWxsYmFja3MuZ2V0UmVzcG9uc2UoY2FsbGJhY2tQYXRoKTtcbiAgICAgICAgY29tcGxldGVSZXF1ZXN0KGNhbGxiYWNrLCBzdGF0dXMsIHJlc3BvbnNlLCAnJywgdGV4dCk7XG4gICAgICAgIGNhbGxiYWNrcy5yZW1vdmVDYWxsYmFjayhjYWxsYmFja1BhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIHhociA9IGNyZWF0ZVhocihtZXRob2QsIHVybCk7XG5cbiAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgIGZvckVhY2goaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gcmVxdWVzdExvYWRlZCgpIHtcbiAgICAgICAgdmFyIHN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dCB8fCAnJztcblxuICAgICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTkpXG4gICAgICAgIC8vIHJlc3BvbnNlL3Jlc3BvbnNlVHlwZSBwcm9wZXJ0aWVzIHdlcmUgaW50cm9kdWNlZCBpbiBYSFIgTGV2ZWwyIHNwZWMgKHN1cHBvcnRlZCBieSBJRTEwKVxuICAgICAgICB2YXIgcmVzcG9uc2UgPSAoJ3Jlc3BvbnNlJyBpbiB4aHIpID8geGhyLnJlc3BvbnNlIDogeGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICAvLyBub3JtYWxpemUgSUU5IGJ1ZyAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTQ1MClcbiAgICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzO1xuXG4gICAgICAgIC8vIGZpeCBzdGF0dXMgY29kZSB3aGVuIGl0IGlzIDAgKDAgc3RhdHVzIGlzIHVuZG9jdW1lbnRlZCkuXG4gICAgICAgIC8vIE9jY3VycyB3aGVuIGFjY2Vzc2luZyBmaWxlIHJlc291cmNlcyBvciBvbiBBbmRyb2lkIDQuMSBzdG9jayBicm93c2VyXG4gICAgICAgIC8vIHdoaWxlIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBhcHBsaWNhdGlvbiBjYWNoZS5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlID8gMjAwIDogdXJsUmVzb2x2ZSh1cmwpLnByb3RvY29sID09PSAnZmlsZScgPyA0MDQgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVSZXF1ZXN0KGNhbGxiYWNrLFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksXG4gICAgICAgICAgICBzdGF0dXNUZXh0KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZXF1ZXN0RXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVGhlIHJlc3BvbnNlIGlzIGFsd2F5cyBlbXB0eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly94aHIuc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWVycm9yLXN0ZXBzIGFuZCBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1uZXR3b3JrLWVycm9yXG4gICAgICAgIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgLTEsIG51bGwsIG51bGwsICcnKTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbmVycm9yID0gcmVxdWVzdEVycm9yO1xuICAgICAgeGhyLm9uYWJvcnQgPSByZXF1ZXN0RXJyb3I7XG4gICAgICB4aHIub250aW1lb3V0ID0gcmVxdWVzdEVycm9yO1xuXG4gICAgICBmb3JFYWNoKGV2ZW50SGFuZGxlcnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICBmb3JFYWNoKHVwbG9hZEV2ZW50SGFuZGxlcnMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgeGhyLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh3aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZVR5cGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gV2ViS2l0IGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBqc29uIHJlc3BvbnNlVHlwZSB2YWx1ZSBvbiAwOS8wMy8yMDEzXG4gICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjQ4LiBWZXJzaW9ucyBvZiBTYWZhcmkgcHJpb3IgdG8gNyBhcmVcbiAgICAgICAgICAvLyBrbm93biB0byB0aHJvdyB3aGVuIHNldHRpbmcgdGhlIHZhbHVlIFwianNvblwiIGFzIHRoZSByZXNwb25zZSB0eXBlLiBPdGhlciBvbGRlclxuICAgICAgICAgIC8vIGJyb3dzZXJzIGltcGxlbWVudGluZyB0aGUgcmVzcG9uc2VUeXBlXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUganNvbiByZXNwb25zZSB0eXBlIGNhbiBiZSBpZ25vcmVkIGlmIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2UgSlNPTiBwYXlsb2FkcyBhcmVcbiAgICAgICAgICAvLyBwYXJzZWQgb24gdGhlIGNsaWVudC1zaWRlIHJlZ2FyZGxlc3MuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB4aHIuc2VuZChpc1VuZGVmaW5lZChwb3N0KSA/IG51bGwgOiBwb3N0KTtcbiAgICB9XG5cbiAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgIHZhciB0aW1lb3V0SWQgPSAkYnJvd3NlckRlZmVyKHRpbWVvdXRSZXF1ZXN0LCB0aW1lb3V0KTtcbiAgICB9IGVsc2UgaWYgKGlzUHJvbWlzZUxpa2UodGltZW91dCkpIHtcbiAgICAgIHRpbWVvdXQudGhlbih0aW1lb3V0UmVxdWVzdCk7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiB0aW1lb3V0UmVxdWVzdCgpIHtcbiAgICAgIGlmIChqc29ucERvbmUpIHtcbiAgICAgICAganNvbnBEb25lKCk7XG4gICAgICB9XG4gICAgICBpZiAoeGhyKSB7XG4gICAgICAgIHhoci5hYm9ydCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlUmVxdWVzdChjYWxsYmFjaywgc3RhdHVzLCByZXNwb25zZSwgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCkge1xuICAgICAgLy8gY2FuY2VsIHRpbWVvdXQgYW5kIHN1YnNlcXVlbnQgdGltZW91dCBwcm9taXNlIHJlc29sdXRpb25cbiAgICAgIGlmIChpc0RlZmluZWQodGltZW91dElkKSkge1xuICAgICAgICAkYnJvd3NlckRlZmVyLmNhbmNlbCh0aW1lb3V0SWQpO1xuICAgICAgfVxuICAgICAganNvbnBEb25lID0geGhyID0gbnVsbDtcblxuICAgICAgY2FsbGJhY2soc3RhdHVzLCByZXNwb25zZSwgaGVhZGVyc1N0cmluZywgc3RhdHVzVGV4dCk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGpzb25wUmVxKHVybCwgY2FsbGJhY2tQYXRoLCBkb25lKSB7XG4gICAgdXJsID0gdXJsLnJlcGxhY2UoJ0pTT05fQ0FMTEJBQ0snLCBjYWxsYmFja1BhdGgpO1xuICAgIC8vIHdlIGNhbid0IHVzZSBqUXVlcnkvanFMaXRlIGhlcmUgYmVjYXVzZSBqUXVlcnkgZG9lcyBjcmF6eSBzdHVmZiB3aXRoIHNjcmlwdCBlbGVtZW50cywgZS5nLjpcbiAgICAvLyAtIGZldGNoZXMgbG9jYWwgc2NyaXB0cyB2aWEgWEhSIGFuZCBldmFscyB0aGVtXG4gICAgLy8gLSBhZGRzIGFuZCBpbW1lZGlhdGVseSByZW1vdmVzIHNjcmlwdCBlbGVtZW50cyBmcm9tIHRoZSBkb2N1bWVudFxuICAgIHZhciBzY3JpcHQgPSByYXdEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSwgY2FsbGJhY2sgPSBudWxsO1xuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuXG4gICAgY2FsbGJhY2sgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjYWxsYmFjayk7XG4gICAgICBzY3JpcHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBjYWxsYmFjayk7XG4gICAgICByYXdEb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgdmFyIHN0YXR1cyA9IC0xO1xuICAgICAgdmFyIHRleHQgPSAndW5rbm93bic7XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnICYmICFjYWxsYmFja3Mud2FzQ2FsbGVkKGNhbGxiYWNrUGF0aCkpIHtcbiAgICAgICAgICBldmVudCA9IHsgdHlwZTogJ2Vycm9yJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSBldmVudC50eXBlO1xuICAgICAgICBzdGF0dXMgPSBldmVudC50eXBlID09PSAnZXJyb3InID8gNDA0IDogMjAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBkb25lKHN0YXR1cywgdGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgY2FsbGJhY2spO1xuICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgICByYXdEb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xuICB9XG59XG5cbnZhciAkaW50ZXJwb2xhdGVNaW5FcnIgPSBhbmd1bGFyLiRpbnRlcnBvbGF0ZU1pbkVyciA9IG1pbkVycignJGludGVycG9sYXRlJyk7XG4kaW50ZXJwb2xhdGVNaW5FcnIudGhyb3dOb2NvbmNhdCA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgdGhyb3cgJGludGVycG9sYXRlTWluRXJyKCdub2NvbmNhdCcsXG4gICAgICAnRXJyb3Igd2hpbGUgaW50ZXJwb2xhdGluZzogezB9XFxuU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgZGlzYWxsb3dzICcgK1xuICAgICAgJ2ludGVycG9sYXRpb25zIHRoYXQgY29uY2F0ZW5hdGUgbXVsdGlwbGUgZXhwcmVzc2lvbnMgd2hlbiBhIHRydXN0ZWQgdmFsdWUgaXMgJyArXG4gICAgICAncmVxdWlyZWQuICBTZWUgaHR0cDovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcuJHNjZScsIHRleHQpO1xufTtcblxuJGludGVycG9sYXRlTWluRXJyLmludGVyciA9IGZ1bmN0aW9uKHRleHQsIGVycikge1xuICByZXR1cm4gJGludGVycG9sYXRlTWluRXJyKCdpbnRlcnInLCAnQ2FuXFwndCBpbnRlcnBvbGF0ZTogezB9XFxuezF9JywgdGV4dCwgZXJyLnRvU3RyaW5nKCkpO1xufTtcblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRpbnRlcnBvbGF0ZVByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcnBvbGF0aW9uIG1hcmt1cC4gRGVmYXVsdHMgdG8gYHt7YCBhbmQgYH19YC5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+XG4gKiBUaGlzIGZlYXR1cmUgaXMgc29tZXRpbWVzIHVzZWQgdG8gbWl4IGRpZmZlcmVudCBtYXJrdXAgbGFuZ3VhZ2VzLCBlLmcuIHRvIHdyYXAgYW4gQW5ndWxhclxuICogdGVtcGxhdGUgd2l0aGluIGEgUHl0aG9uIEppbmphIHRlbXBsYXRlIChvciBhbnkgb3RoZXIgdGVtcGxhdGUgbGFuZ3VhZ2UpLiBNaXhpbmcgdGVtcGxhdGluZ1xuICogbGFuZ3VhZ2VzIGlzICoqdmVyeSBkYW5nZXJvdXMqKi4gVGhlIGVtYmVkZGluZyB0ZW1wbGF0ZSBsYW5ndWFnZSB3aWxsIG5vdCBzYWZlbHkgZXNjYXBlIEFuZ3VsYXJcbiAqIGV4cHJlc3Npb25zLCBzbyBhbnkgdXNlci1jb250cm9sbGVkIHZhbHVlcyBpbiB0aGUgdGVtcGxhdGUgd2lsbCBjYXVzZSBDcm9zcyBTaXRlIFNjcmlwdGluZyAoWFNTKVxuICogc2VjdXJpdHkgYnVncyFcbiAqIDwvZGl2PlxuICpcbiAqIEBleGFtcGxlXG48ZXhhbXBsZSBuYW1lPVwiY3VzdG9tLWludGVycG9sYXRpb24tbWFya3VwXCIgbW9kdWxlPVwiY3VzdG9tSW50ZXJwb2xhdGlvbkFwcFwiPlxuPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbjxzY3JpcHQ+XG4gIHZhciBjdXN0b21JbnRlcnBvbGF0aW9uQXBwID0gYW5ndWxhci5tb2R1bGUoJ2N1c3RvbUludGVycG9sYXRpb25BcHAnLCBbXSk7XG5cbiAgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcC5jb25maWcoZnVuY3Rpb24oJGludGVycG9sYXRlUHJvdmlkZXIpIHtcbiAgICAkaW50ZXJwb2xhdGVQcm92aWRlci5zdGFydFN5bWJvbCgnLy8nKTtcbiAgICAkaW50ZXJwb2xhdGVQcm92aWRlci5lbmRTeW1ib2woJy8vJyk7XG4gIH0pO1xuXG5cbiAgY3VzdG9tSW50ZXJwb2xhdGlvbkFwcC5jb250cm9sbGVyKCdEZW1vQ29udHJvbGxlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5sYWJlbCA9IFwiVGhpcyBiaW5kaW5nIGlzIGJyb3VnaHQgeW91IGJ5IC8vIGludGVycG9sYXRpb24gc3ltYm9scy5cIjtcbiAgfSk7XG48L3NjcmlwdD5cbjxkaXYgbmctY29udHJvbGxlcj1cIkRlbW9Db250cm9sbGVyIGFzIGRlbW9cIj5cbiAgICAvL2RlbW8ubGFiZWwvL1xuPC9kaXY+XG48L2ZpbGU+XG48ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gIGl0KCdzaG91bGQgaW50ZXJwb2xhdGUgYmluZGluZyB3aXRoIGN1c3RvbSBzeW1ib2xzJywgZnVuY3Rpb24oKSB7XG4gICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnZGVtby5sYWJlbCcpKS5nZXRUZXh0KCkpLnRvQmUoJ1RoaXMgYmluZGluZyBpcyBicm91Z2h0IHlvdSBieSAvLyBpbnRlcnBvbGF0aW9uIHN5bWJvbHMuJyk7XG4gIH0pO1xuPC9maWxlPlxuPC9leGFtcGxlPlxuICovXG5mdW5jdGlvbiAkSW50ZXJwb2xhdGVQcm92aWRlcigpIHtcbiAgdmFyIHN0YXJ0U3ltYm9sID0gJ3t7JztcbiAgdmFyIGVuZFN5bWJvbCA9ICd9fSc7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGludGVycG9sYXRlUHJvdmlkZXIjc3RhcnRTeW1ib2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN5bWJvbCB0byBkZW5vdGUgc3RhcnQgb2YgZXhwcmVzc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGVkIHN0cmluZy4gRGVmYXVsdHMgdG8gYHt7YC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSB2YWx1ZSBuZXcgdmFsdWUgdG8gc2V0IHRoZSBzdGFydGluZyBzeW1ib2wgdG8uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8c2VsZn0gUmV0dXJucyB0aGUgc3ltYm9sIHdoZW4gdXNlZCBhcyBnZXR0ZXIgYW5kIHNlbGYgaWYgdXNlZCBhcyBzZXR0ZXIuXG4gICAqL1xuICB0aGlzLnN0YXJ0U3ltYm9sID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHN0YXJ0U3ltYm9sID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0YXJ0U3ltYm9sO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkaW50ZXJwb2xhdGVQcm92aWRlciNlbmRTeW1ib2xcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN5bWJvbCB0byBkZW5vdGUgdGhlIGVuZCBvZiBleHByZXNzaW9uIGluIHRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nLiBEZWZhdWx0cyB0byBgfX1gLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHZhbHVlIG5ldyB2YWx1ZSB0byBzZXQgdGhlIGVuZGluZyBzeW1ib2wgdG8uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8c2VsZn0gUmV0dXJucyB0aGUgc3ltYm9sIHdoZW4gdXNlZCBhcyBnZXR0ZXIgYW5kIHNlbGYgaWYgdXNlZCBhcyBzZXR0ZXIuXG4gICAqL1xuICB0aGlzLmVuZFN5bWJvbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBlbmRTeW1ib2wgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZW5kU3ltYm9sO1xuICAgIH1cbiAgfTtcblxuXG4gIHRoaXMuJGdldCA9IFsnJHBhcnNlJywgJyRleGNlcHRpb25IYW5kbGVyJywgJyRzY2UnLCBmdW5jdGlvbigkcGFyc2UsICRleGNlcHRpb25IYW5kbGVyLCAkc2NlKSB7XG4gICAgdmFyIHN0YXJ0U3ltYm9sTGVuZ3RoID0gc3RhcnRTeW1ib2wubGVuZ3RoLFxuICAgICAgICBlbmRTeW1ib2xMZW5ndGggPSBlbmRTeW1ib2wubGVuZ3RoLFxuICAgICAgICBlc2NhcGVkU3RhcnRSZWdleHAgPSBuZXcgUmVnRXhwKHN0YXJ0U3ltYm9sLnJlcGxhY2UoLy4vZywgZXNjYXBlKSwgJ2cnKSxcbiAgICAgICAgZXNjYXBlZEVuZFJlZ2V4cCA9IG5ldyBSZWdFeHAoZW5kU3ltYm9sLnJlcGxhY2UoLy4vZywgZXNjYXBlKSwgJ2cnKTtcblxuICAgIGZ1bmN0aW9uIGVzY2FwZShjaCkge1xuICAgICAgcmV0dXJuICdcXFxcXFxcXFxcXFwnICsgY2g7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5lc2NhcGVUZXh0KHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZXNjYXBlZFN0YXJ0UmVnZXhwLCBzdGFydFN5bWJvbCkuXG4gICAgICAgIHJlcGxhY2UoZXNjYXBlZEVuZFJlZ2V4cCwgZW5kU3ltYm9sKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25zdGFudFdhdGNoRGVsZWdhdGUgaW4gcGFyc2UuanNcbiAgICBmdW5jdGlvbiBjb25zdGFudFdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgY29uc3RhbnRJbnRlcnApIHtcbiAgICAgIHZhciB1bndhdGNoID0gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIGNvbnN0YW50SW50ZXJwb2xhdGVXYXRjaChzY29wZSkge1xuICAgICAgICB1bndhdGNoKCk7XG4gICAgICAgIHJldHVybiBjb25zdGFudEludGVycChzY29wZSk7XG4gICAgICB9LCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHkpO1xuICAgICAgcmV0dXJuIHVud2F0Y2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIHNlcnZpY2VcbiAgICAgKiBAbmFtZSAkaW50ZXJwb2xhdGVcbiAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHJlcXVpcmVzICRwYXJzZVxuICAgICAqIEByZXF1aXJlcyAkc2NlXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKlxuICAgICAqIENvbXBpbGVzIGEgc3RyaW5nIHdpdGggbWFya3VwIGludG8gYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi4gVGhpcyBzZXJ2aWNlIGlzIHVzZWQgYnkgdGhlXG4gICAgICogSFRNTCB7QGxpbmsgbmcuJGNvbXBpbGUgJGNvbXBpbGV9IHNlcnZpY2UgZm9yIGRhdGEgYmluZGluZy4gU2VlXG4gICAgICoge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyICRpbnRlcnBvbGF0ZVByb3ZpZGVyfSBmb3IgY29uZmlndXJpbmcgdGhlXG4gICAgICogaW50ZXJwb2xhdGlvbiBtYXJrdXAuXG4gICAgICpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogICB2YXIgJGludGVycG9sYXRlID0gLi4uOyAvLyBpbmplY3RlZFxuICAgICAqICAgdmFyIGV4cCA9ICRpbnRlcnBvbGF0ZSgnSGVsbG8ge3tuYW1lIHwgdXBwZXJjYXNlfX0hJyk7XG4gICAgICogICBleHBlY3QoZXhwKHtuYW1lOidBbmd1bGFyJ30pKS50b0VxdWFsKCdIZWxsbyBBTkdVTEFSIScpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYCRpbnRlcnBvbGF0ZWAgdGFrZXMgYW4gb3B0aW9uYWwgZm91cnRoIGFyZ3VtZW50LCBgYWxsT3JOb3RoaW5nYC4gSWYgYGFsbE9yTm90aGluZ2AgaXNcbiAgICAgKiBgdHJ1ZWAsIHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIHVubGVzcyBhbGwgZW1iZWRkZWQgZXhwcmVzc2lvbnNcbiAgICAgKiBldmFsdWF0ZSB0byBhIHZhbHVlIG90aGVyIHRoYW4gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqICAgdmFyICRpbnRlcnBvbGF0ZSA9IC4uLjsgLy8gaW5qZWN0ZWRcbiAgICAgKiAgIHZhciBjb250ZXh0ID0ge2dyZWV0aW5nOiAnSGVsbG8nLCBuYW1lOiB1bmRlZmluZWQgfTtcbiAgICAgKlxuICAgICAqICAgLy8gZGVmYXVsdCBcImZvcmdpdmluZ1wiIG1vZGVcbiAgICAgKiAgIHZhciBleHAgPSAkaW50ZXJwb2xhdGUoJ3t7Z3JlZXRpbmd9fSB7e25hbWV9fSEnKTtcbiAgICAgKiAgIGV4cGVjdChleHAoY29udGV4dCkpLnRvRXF1YWwoJ0hlbGxvICEnKTtcbiAgICAgKlxuICAgICAqICAgLy8gXCJhbGxPck5vdGhpbmdcIiBtb2RlXG4gICAgICogICBleHAgPSAkaW50ZXJwb2xhdGUoJ3t7Z3JlZXRpbmd9fSB7e25hbWV9fSEnLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7XG4gICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICogICBjb250ZXh0Lm5hbWUgPSAnQW5ndWxhcic7XG4gICAgICogICBleHBlY3QoZXhwKGNvbnRleHQpKS50b0VxdWFsKCdIZWxsbyBBbmd1bGFyIScpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGFsbE9yTm90aGluZ2AgaXMgdXNlZnVsIGZvciBpbnRlcnBvbGF0aW5nIFVSTHMuIGBuZ1NyY2AgYW5kIGBuZ1NyY3NldGAgdXNlIHRoaXMgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiAjIyMjIEVzY2FwZWQgSW50ZXJwb2xhdGlvblxuICAgICAqICRpbnRlcnBvbGF0ZSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZXNjYXBpbmcgaW50ZXJwb2xhdGlvbiBtYXJrZXJzLiBTdGFydCBhbmQgZW5kIG1hcmtlcnNcbiAgICAgKiBjYW4gYmUgZXNjYXBlZCBieSBwcmVjZWRpbmcgZWFjaCBvZiB0aGVpciBjaGFyYWN0ZXJzIHdpdGggYSBSRVZFUlNFIFNPTElEVVMgVSswMDVDIChiYWNrc2xhc2gpLlxuICAgICAqIEl0IHdpbGwgYmUgcmVuZGVyZWQgYXMgYSByZWd1bGFyIHN0YXJ0L2VuZCBtYXJrZXIsIGFuZCB3aWxsIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBleHByZXNzaW9uXG4gICAgICogb3IgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgZW5hYmxlcyB3ZWItc2VydmVycyB0byBwcmV2ZW50IHNjcmlwdCBpbmplY3Rpb24gYXR0YWNrcyBhbmQgZGVmYWNpbmcgYXR0YWNrcywgdG8gc29tZVxuICAgICAqIGRlZ3JlZSwgd2hpbGUgYWxzbyBlbmFibGluZyBjb2RlIGV4YW1wbGVzIHRvIHdvcmsgd2l0aG91dCByZWx5aW5nIG9uIHRoZVxuICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdOb25CaW5kYWJsZSBuZ05vbkJpbmRhYmxlfSBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiAqKkZvciBzZWN1cml0eSBwdXJwb3NlcywgaXQgaXMgc3Ryb25nbHkgZW5jb3VyYWdlZCB0aGF0IHdlYiBzZXJ2ZXJzIGVzY2FwZSB1c2VyLXN1cHBsaWVkIGRhdGEsXG4gICAgICogcmVwbGFjaW5nIGFuZ2xlIGJyYWNrZXRzICgmbHQ7LCAmZ3Q7KSB3aXRoICZhbXA7bHQ7IGFuZCAmYW1wO2d0OyByZXNwZWN0aXZlbHksIGFuZCByZXBsYWNpbmcgYWxsXG4gICAgICogaW50ZXJwb2xhdGlvbiBzdGFydC9lbmQgbWFya2VycyB3aXRoIHRoZWlyIGVzY2FwZWQgY291bnRlcnBhcnRzLioqXG4gICAgICpcbiAgICAgKiBFc2NhcGVkIGludGVycG9sYXRpb24gbWFya2VycyBhcmUgb25seSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiBtYXJrZXJzIGluIHJlbmRlcmVkXG4gICAgICogb3V0cHV0IHdoZW4gdGhlICRpbnRlcnBvbGF0ZSBzZXJ2aWNlIHByb2Nlc3NlcyB0aGUgdGV4dC4gU28sIGZvciBIVE1MIGVsZW1lbnRzIGludGVycG9sYXRlZFxuICAgICAqIGJ5IHtAbGluayBuZy4kY29tcGlsZSAkY29tcGlsZX0sIG9yIG90aGVyd2lzZSBpbnRlcnBvbGF0ZWQgd2l0aCB0aGUgYG11c3RIYXZlRXhwcmVzc2lvbmAgcGFyYW1ldGVyXG4gICAgICogc2V0IHRvIGB0cnVlYCwgdGhlIGludGVycG9sYXRlZCB0ZXh0IG11c3QgY29udGFpbiBhbiB1bmVzY2FwZWQgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9uLiBBcyBzdWNoLFxuICAgICAqIHRoaXMgaXMgdHlwaWNhbGx5IHVzZWZ1bCBvbmx5IHdoZW4gdXNlci1kYXRhIGlzIHVzZWQgaW4gcmVuZGVyaW5nIGEgdGVtcGxhdGUgZnJvbSB0aGUgc2VydmVyLCBvclxuICAgICAqIHdoZW4gb3RoZXJ3aXNlIHVudHJ1c3RlZCBkYXRhIGlzIHVzZWQgYnkgYSBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiA8ZXhhbXBsZSBuYW1lPVwiaW50ZXJwb2xhdGlvblwiPlxuICAgICAqICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAqICAgIDxkaXYgbmctaW5pdD1cInVzZXJuYW1lPSdBIHVzZXInXCI+XG4gICAgICogICAgICA8cCBuZy1pbml0PVwiYXBwdGl0bGU9J0VzY2FwaW5nIGRlbW8nXCI+e3thcHB0aXRsZX19OiBcXHtcXHsgdXNlcm5hbWUgPSBcImRlZmFjZWQgdmFsdWVcIjsgXFx9XFx9XG4gICAgICogICAgICAgIDwvcD5cbiAgICAgKiAgICAgIDxwPjxzdHJvbmc+e3t1c2VybmFtZX19PC9zdHJvbmc+IGF0dGVtcHRzIHRvIGluamVjdCBjb2RlIHdoaWNoIHdpbGwgZGVmYWNlIHRoZVxuICAgICAqICAgICAgICBhcHBsaWNhdGlvbiwgYnV0IGZhaWxzIHRvIGFjY29tcGxpc2ggdGhlaXIgdGFzaywgYmVjYXVzZSB0aGUgc2VydmVyIGhhcyBjb3JyZWN0bHlcbiAgICAgKiAgICAgICAgZXNjYXBlZCB0aGUgaW50ZXJwb2xhdGlvbiBzdGFydC9lbmQgbWFya2VycyB3aXRoIFJFVkVSU0UgU09MSURVUyBVKzAwNUMgKGJhY2tzbGFzaClcbiAgICAgKiAgICAgICAgY2hhcmFjdGVycy48L3A+XG4gICAgICogICAgICA8cD5JbnN0ZWFkLCB0aGUgcmVzdWx0IG9mIHRoZSBhdHRlbXB0ZWQgc2NyaXB0IGluamVjdGlvbiBpcyB2aXNpYmxlLCBhbmQgY2FuIGJlIHJlbW92ZWRcbiAgICAgKiAgICAgICAgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYW4gYWRtaW5pc3RyYXRvci48L3A+XG4gICAgICogICAgPC9kaXY+XG4gICAgICogIDwvZmlsZT5cbiAgICAgKiA8L2V4YW1wbGU+XG4gICAgICpcbiAgICAgKiBAa25vd25Jc3N1ZVxuICAgICAqIEl0IGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUgZm9yIGFuIGludGVycG9sYXRlZCBleHByZXNzaW9uIHRvIGNvbnRhaW4gdGhlIGludGVycG9sYXRpb24gZW5kXG4gICAgICogc3ltYm9sLiBGb3IgZXhhbXBsZSwgYHt7ICd9fScgfX1gIHdpbGwgYmUgaW5jb3JyZWN0bHkgaW50ZXJwcmV0ZWQgYXMgYHt7ICcgfX1gICsgYCcgfX1gLCBpLmUuXG4gICAgICogYW4gaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24gY29uc2lzdGluZyBvZiBhIHNpbmdsZS1xdW90ZSAoYCdgKSBhbmQgdGhlIGAnIH19YCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAa25vd25Jc3N1ZVxuICAgICAqIEFsbCBkaXJlY3RpdmVzIGFuZCBjb21wb25lbnRzIG11c3QgdXNlIHRoZSBzdGFuZGFyZCBge3tgIGB9fWAgaW50ZXJwb2xhdGlvbiBzeW1ib2xzXG4gICAgICogaW4gdGhlaXIgdGVtcGxhdGVzLiBJZiB5b3UgY2hhbmdlIHRoZSBhcHBsaWNhdGlvbiBpbnRlcnBvbGF0aW9uIHN5bWJvbHMgdGhlIHtAbGluayAkY29tcGlsZX1cbiAgICAgKiBzZXJ2aWNlIHdpbGwgYXR0ZW1wdCB0byBkZW5vcm1hbGl6ZSB0aGUgc3RhbmRhcmQgc3ltYm9scyB0byB0aGUgY3VzdG9tIHN5bWJvbHMuXG4gICAgICogVGhlIGRlbm9ybWFsaXphdGlvbiBwcm9jZXNzIGlzIG5vdCBjbGV2ZXIgZW5vdWdoIHRvIGtub3cgbm90IHRvIHJlcGxhY2UgaW5zdGFuY2VzIG9mIHRoZSBzdGFuZGFyZFxuICAgICAqIHN5bWJvbHMgd2hlcmUgdGhleSB3b3VsZCBub3Qgbm9ybWFsbHkgYmUgdHJlYXRlZCBhcyBpbnRlcnBvbGF0aW9uIHN5bWJvbHMuIEZvciBleGFtcGxlIGluIHRoZSBmb2xsb3dpbmdcbiAgICAgKiBjb2RlIHNuaXBwZXQgdGhlIGNsb3NpbmcgYnJhY2VzIG9mIHRoZSBsaXRlcmFsIG9iamVjdCB3aWxsIGdldCBpbmNvcnJlY3RseSBkZW5vcm1hbGl6ZWQ6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiA8ZGl2IGRhdGEtY29udGV4dD0ne1wiY29udGV4dFwiOntcImlkXCI6MyxcInR5cGVcIjpcInBhZ2VcIn19XCI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBlbnN1cmUgdGhhdCBzdWNoIGluc3RhbmNlcyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2U6XG4gICAgICogYGBgXG4gICAgICogPGRpdiBkYXRhLWNvbnRleHQ9J3tcImNvbnRleHRcIjp7XCJpZFwiOjMsXCJ0eXBlXCI6XCJwYWdlXCJ9IH1cIj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMTQ2MTAjaXNzdWVjb21tZW50LTIxOTQwMTA5OSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHdpdGggbWFya3VwIHRvIGludGVycG9sYXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG11c3RIYXZlRXhwcmVzc2lvbiBpZiBzZXQgdG8gdHJ1ZSB0aGVuIHRoZSBpbnRlcnBvbGF0aW9uIHN0cmluZyBtdXN0IGhhdmVcbiAgICAgKiAgICBlbWJlZGRlZCBleHByZXNzaW9uIGluIG9yZGVyIHRvIHJldHVybiBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLiBTdHJpbmdzIHdpdGggbm9cbiAgICAgKiAgICBlbWJlZGRlZCBleHByZXNzaW9uIHdpbGwgcmV0dXJuIG51bGwgZm9yIHRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gdHJ1c3RlZENvbnRleHQgd2hlbiBwcm92aWRlZCwgdGhlIHJldHVybmVkIGZ1bmN0aW9uIHBhc3NlcyB0aGUgaW50ZXJwb2xhdGVkXG4gICAgICogICAgcmVzdWx0IHRocm91Z2gge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZCAkc2NlLmdldFRydXN0ZWQoaW50ZXJwb2xhdGVkUmVzdWx0LFxuICAgICAqICAgIHRydXN0ZWRDb250ZXh0KX0gYmVmb3JlIHJldHVybmluZyBpdC4gIFJlZmVyIHRvIHRoZSB7QGxpbmsgbmcuJHNjZSAkc2NlfSBzZXJ2aWNlIHRoYXRcbiAgICAgKiAgICBwcm92aWRlcyBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyBmb3IgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBhbGxPck5vdGhpbmcgaWYgYHRydWVgLCB0aGVuIHRoZSByZXR1cm5lZCBmdW5jdGlvbiByZXR1cm5zIHVuZGVmaW5lZFxuICAgICAqICAgIHVubGVzcyBhbGwgZW1iZWRkZWQgZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8gYSB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLlxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0KX0gYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gICAgICogICAgaW50ZXJwb2xhdGVkIHN0cmluZy4gVGhlIGZ1bmN0aW9uIGhhcyB0aGVzZSBwYXJhbWV0ZXJzOlxuICAgICAqXG4gICAgICogLSBgY29udGV4dGA6IGV2YWx1YXRpb24gY29udGV4dCBmb3IgYWxsIGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBpbnRlcnBvbGF0ZWQgdGV4dFxuICAgICAqL1xuICAgIGZ1bmN0aW9uICRpbnRlcnBvbGF0ZSh0ZXh0LCBtdXN0SGF2ZUV4cHJlc3Npb24sIHRydXN0ZWRDb250ZXh0LCBhbGxPck5vdGhpbmcpIHtcbiAgICAgIC8vIFByb3ZpZGUgYSBxdWljayBleGl0IGFuZCBzaW1wbGlmaWVkIHJlc3VsdCBmdW5jdGlvbiBmb3IgdGV4dCB3aXRoIG5vIGludGVycG9sYXRpb25cbiAgICAgIGlmICghdGV4dC5sZW5ndGggfHwgdGV4dC5pbmRleE9mKHN0YXJ0U3ltYm9sKSA9PT0gLTEpIHtcbiAgICAgICAgdmFyIGNvbnN0YW50SW50ZXJwO1xuICAgICAgICBpZiAoIW11c3RIYXZlRXhwcmVzc2lvbikge1xuICAgICAgICAgIHZhciB1bmVzY2FwZWRUZXh0ID0gdW5lc2NhcGVUZXh0KHRleHQpO1xuICAgICAgICAgIGNvbnN0YW50SW50ZXJwID0gdmFsdWVGbih1bmVzY2FwZWRUZXh0KTtcbiAgICAgICAgICBjb25zdGFudEludGVycC5leHAgPSB0ZXh0O1xuICAgICAgICAgIGNvbnN0YW50SW50ZXJwLmV4cHJlc3Npb25zID0gW107XG4gICAgICAgICAgY29uc3RhbnRJbnRlcnAuJCR3YXRjaERlbGVnYXRlID0gY29uc3RhbnRXYXRjaERlbGVnYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25zdGFudEludGVycDtcbiAgICAgIH1cblxuICAgICAgYWxsT3JOb3RoaW5nID0gISFhbGxPck5vdGhpbmc7XG4gICAgICB2YXIgc3RhcnRJbmRleCxcbiAgICAgICAgICBlbmRJbmRleCxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgZXhwcmVzc2lvbnMgPSBbXSxcbiAgICAgICAgICBwYXJzZUZucyA9IFtdLFxuICAgICAgICAgIHRleHRMZW5ndGggPSB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICBleHAsXG4gICAgICAgICAgY29uY2F0ID0gW10sXG4gICAgICAgICAgZXhwcmVzc2lvblBvc2l0aW9ucyA9IFtdO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCB0ZXh0TGVuZ3RoKSB7XG4gICAgICAgIGlmICgoKHN0YXJ0SW5kZXggPSB0ZXh0LmluZGV4T2Yoc3RhcnRTeW1ib2wsIGluZGV4KSkgIT09IC0xKSAmJlxuICAgICAgICAgICAgICgoZW5kSW5kZXggPSB0ZXh0LmluZGV4T2YoZW5kU3ltYm9sLCBzdGFydEluZGV4ICsgc3RhcnRTeW1ib2xMZW5ndGgpKSAhPT0gLTEpKSB7XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSBzdGFydEluZGV4KSB7XG4gICAgICAgICAgICBjb25jYXQucHVzaCh1bmVzY2FwZVRleHQodGV4dC5zdWJzdHJpbmcoaW5kZXgsIHN0YXJ0SW5kZXgpKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyBzdGFydFN5bWJvbExlbmd0aCwgZW5kSW5kZXgpO1xuICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwKTtcbiAgICAgICAgICBwYXJzZUZucy5wdXNoKCRwYXJzZShleHAsIHBhcnNlU3RyaW5naWZ5SW50ZXJjZXB0b3IpKTtcbiAgICAgICAgICBpbmRleCA9IGVuZEluZGV4ICsgZW5kU3ltYm9sTGVuZ3RoO1xuICAgICAgICAgIGV4cHJlc3Npb25Qb3NpdGlvbnMucHVzaChjb25jYXQubGVuZ3RoKTtcbiAgICAgICAgICBjb25jYXQucHVzaCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gd2UgZGlkIG5vdCBmaW5kIGFuIGludGVycG9sYXRpb24sIHNvIHdlIGhhdmUgdG8gYWRkIHRoZSByZW1haW5kZXIgdG8gdGhlIHNlcGFyYXRvcnMgYXJyYXlcbiAgICAgICAgICBpZiAoaW5kZXggIT09IHRleHRMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbmNhdC5wdXNoKHVuZXNjYXBlVGV4dCh0ZXh0LnN1YnN0cmluZyhpbmRleCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29uY2F0ZW5hdGluZyBleHByZXNzaW9ucyBtYWtlcyBpdCBoYXJkIHRvIHJlYXNvbiBhYm91dCB3aGV0aGVyIHNvbWUgY29tYmluYXRpb24gb2ZcbiAgICAgIC8vIGNvbmNhdGVuYXRlZCB2YWx1ZXMgYXJlIHVuc2FmZSB0byB1c2UgYW5kIGNvdWxkIGVhc2lseSBsZWFkIHRvIFhTUy4gIEJ5IHJlcXVpcmluZyB0aGF0IGFcbiAgICAgIC8vIHNpbmdsZSBleHByZXNzaW9uIGJlIHVzZWQgZm9yIGlmcmFtZVtzcmNdLCBvYmplY3Rbc3JjXSwgZXRjLiwgd2UgZW5zdXJlIHRoYXQgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0J3MgdXNlZCBpcyBhc3NpZ25lZCBvciBjb25zdHJ1Y3RlZCBieSBzb21lIEpTIGNvZGUgc29tZXdoZXJlIHRoYXQgaXMgbW9yZSB0ZXN0YWJsZSBvclxuICAgICAgLy8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgeW91IGJvdW5kIHRoZSB2YWx1ZSB0byBzb21lIHVzZXIgY29udHJvbGxlZCB2YWx1ZS4gIFRoaXMgaGVscHMgcmVkdWNlXG4gICAgICAvLyB0aGUgbG9hZCB3aGVuIGF1ZGl0aW5nIGZvciBYU1MgaXNzdWVzLlxuICAgICAgaWYgKHRydXN0ZWRDb250ZXh0ICYmIGNvbmNhdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgJGludGVycG9sYXRlTWluRXJyLnRocm93Tm9jb25jYXQodGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghbXVzdEhhdmVFeHByZXNzaW9uIHx8IGV4cHJlc3Npb25zLmxlbmd0aCkge1xuICAgICAgICB2YXIgY29tcHV0ZSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhbGxPck5vdGhpbmcgJiYgaXNVbmRlZmluZWQodmFsdWVzW2ldKSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uY2F0W2V4cHJlc3Npb25Qb3NpdGlvbnNbaV1dID0gdmFsdWVzW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29uY2F0LmpvaW4oJycpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBnZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydXN0ZWRDb250ZXh0ID9cbiAgICAgICAgICAgICRzY2UuZ2V0VHJ1c3RlZCh0cnVzdGVkQ29udGV4dCwgdmFsdWUpIDpcbiAgICAgICAgICAgICRzY2UudmFsdWVPZih2YWx1ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiBpbnRlcnBvbGF0aW9uRm4oY29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGlpID0gZXhwcmVzc2lvbnMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShpaSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHBhcnNlRm5zW2ldKGNvbnRleHQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGUodmFsdWVzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcigkaW50ZXJwb2xhdGVNaW5FcnIuaW50ZXJyKHRleHQsIGVycikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSwge1xuICAgICAgICAgIC8vIGFsbCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB1bmRvY3VtZW50ZWQgZm9yIG5vd1xuICAgICAgICAgIGV4cDogdGV4dCwgLy9qdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggcmVndWxhciB3YXRjaGVycyBjcmVhdGVkIHZpYSAkd2F0Y2hcbiAgICAgICAgICBleHByZXNzaW9uczogZXhwcmVzc2lvbnMsXG4gICAgICAgICAgJCR3YXRjaERlbGVnYXRlOiBmdW5jdGlvbihzY29wZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHZhciBsYXN0VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGUuJHdhdGNoR3JvdXAocGFyc2VGbnMsIC8qKiBAdGhpcyAqLyBmdW5jdGlvbiBpbnRlcnBvbGF0ZUZuV2F0Y2hlcih2YWx1ZXMsIG9sZFZhbHVlcykge1xuICAgICAgICAgICAgICB2YXIgY3VyclZhbHVlID0gY29tcHV0ZSh2YWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGN1cnJWYWx1ZSwgdmFsdWVzICE9PSBvbGRWYWx1ZXMgPyBsYXN0VmFsdWUgOiBjdXJyVmFsdWUsIHNjb3BlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBjdXJyVmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwYXJzZVN0cmluZ2lmeUludGVyY2VwdG9yKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGFsbE9yTm90aGluZyAmJiAhaXNEZWZpbmVkKHZhbHVlKSA/IHZhbHVlIDogc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoJGludGVycG9sYXRlTWluRXJyLmludGVycih0ZXh0LCBlcnIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZSNzdGFydFN5bWJvbFxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFN5bWJvbCB0byBkZW5vdGUgdGhlIHN0YXJ0IG9mIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRlZCBzdHJpbmcuIERlZmF1bHRzIHRvIGB7e2AuXG4gICAgICpcbiAgICAgKiBVc2Uge0BsaW5rIG5nLiRpbnRlcnBvbGF0ZVByb3ZpZGVyI3N0YXJ0U3ltYm9sIGAkaW50ZXJwb2xhdGVQcm92aWRlci5zdGFydFN5bWJvbGB9IHRvIGNoYW5nZVxuICAgICAqIHRoZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBzdGFydCBzeW1ib2wuXG4gICAgICovXG4gICAgJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RhcnRTeW1ib2w7XG4gICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRpbnRlcnBvbGF0ZSNlbmRTeW1ib2xcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTeW1ib2wgdG8gZGVub3RlIHRoZSBlbmQgb2YgZXhwcmVzc2lvbiBpbiB0aGUgaW50ZXJwb2xhdGVkIHN0cmluZy4gRGVmYXVsdHMgdG8gYH19YC5cbiAgICAgKlxuICAgICAqIFVzZSB7QGxpbmsgbmcuJGludGVycG9sYXRlUHJvdmlkZXIjZW5kU3ltYm9sIGAkaW50ZXJwb2xhdGVQcm92aWRlci5lbmRTeW1ib2xgfSB0byBjaGFuZ2VcbiAgICAgKiB0aGUgc3ltYm9sLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gZW5kIHN5bWJvbC5cbiAgICAgKi9cbiAgICAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZW5kU3ltYm9sO1xuICAgIH07XG5cbiAgICByZXR1cm4gJGludGVycG9sYXRlO1xuICB9XTtcbn1cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkSW50ZXJ2YWxQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyR3aW5kb3cnLCAnJHEnLCAnJCRxJywgJyRicm93c2VyJyxcbiAgICAgICBmdW5jdGlvbigkcm9vdFNjb3BlLCAgICR3aW5kb3csICAgJHEsICAgJCRxLCAgICRicm93c2VyKSB7XG4gICAgdmFyIGludGVydmFscyA9IHt9O1xuXG5cbiAgICAgLyoqXG4gICAgICAqIEBuZ2RvYyBzZXJ2aWNlXG4gICAgICAqIEBuYW1lICRpbnRlcnZhbFxuICAgICAgKlxuICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICogQW5ndWxhcidzIHdyYXBwZXIgZm9yIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLiBUaGUgYGZuYCBmdW5jdGlvbiBpcyBleGVjdXRlZCBldmVyeSBgZGVsYXlgXG4gICAgICAqIG1pbGxpc2Vjb25kcy5cbiAgICAgICpcbiAgICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiByZWdpc3RlcmluZyBhbiBpbnRlcnZhbCBmdW5jdGlvbiBpcyBhIHByb21pc2UuIFRoaXMgcHJvbWlzZSB3aWxsIGJlXG4gICAgICAqIG5vdGlmaWVkIHVwb24gZWFjaCB0aWNrIG9mIHRoZSBpbnRlcnZhbCwgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgYWZ0ZXIgYGNvdW50YCBpdGVyYXRpb25zLCBvclxuICAgICAgKiBydW4gaW5kZWZpbml0ZWx5IGlmIGBjb3VudGAgaXMgbm90IGRlZmluZWQuIFRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpY2F0aW9uIHdpbGwgYmUgdGhlXG4gICAgICAqIG51bWJlciBvZiBpdGVyYXRpb25zIHRoYXQgaGF2ZSBydW4uXG4gICAgICAqIFRvIGNhbmNlbCBhbiBpbnRlcnZhbCwgY2FsbCBgJGludGVydmFsLmNhbmNlbChwcm9taXNlKWAuXG4gICAgICAqXG4gICAgICAqIEluIHRlc3RzIHlvdSBjYW4gdXNlIHtAbGluayBuZ01vY2suJGludGVydmFsI2ZsdXNoIGAkaW50ZXJ2YWwuZmx1c2gobWlsbGlzKWB9IHRvXG4gICAgICAqIG1vdmUgZm9yd2FyZCBieSBgbWlsbGlzYCBtaWxsaXNlY29uZHMgYW5kIHRyaWdnZXIgYW55IGZ1bmN0aW9ucyBzY2hlZHVsZWQgdG8gcnVuIGluIHRoYXRcbiAgICAgICogdGltZS5cbiAgICAgICpcbiAgICAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAgICAgICogKipOb3RlKio6IEludGVydmFscyBjcmVhdGVkIGJ5IHRoaXMgc2VydmljZSBtdXN0IGJlIGV4cGxpY2l0bHkgZGVzdHJveWVkIHdoZW4geW91IGFyZSBmaW5pc2hlZFxuICAgICAgKiB3aXRoIHRoZW0uICBJbiBwYXJ0aWN1bGFyIHRoZXkgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCB3aGVuIGEgY29udHJvbGxlcidzIHNjb3BlIG9yIGFcbiAgICAgICogZGlyZWN0aXZlJ3MgZWxlbWVudCBhcmUgZGVzdHJveWVkLlxuICAgICAgKiBZb3Ugc2hvdWxkIHRha2UgdGhpcyBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIG1ha2Ugc3VyZSB0byBhbHdheXMgY2FuY2VsIHRoZSBpbnRlcnZhbCBhdCB0aGVcbiAgICAgICogYXBwcm9wcmlhdGUgbW9tZW50LiAgU2VlIHRoZSBleGFtcGxlIGJlbG93IGZvciBtb3JlIGRldGFpbHMgb24gaG93IGFuZCB3aGVuIHRvIGRvIHRoaXMuXG4gICAgICAqIDwvZGl2PlxuICAgICAgKlxuICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZuIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHJlcGVhdGVkbHkuXG4gICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gZWFjaCBmdW5jdGlvbiBjYWxsLlxuICAgICAgKiBAcGFyYW0ge251bWJlcj19IFtjb3VudD0wXSBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0LiBJZiBub3Qgc2V0LCBvciAwLCB3aWxsIHJlcGVhdFxuICAgICAgKiAgIGluZGVmaW5pdGVseS5cbiAgICAgICogQHBhcmFtIHtib29sZWFuPX0gW2ludm9rZUFwcGx5PXRydWVdIElmIHNldCB0byBgZmFsc2VgIHNraXBzIG1vZGVsIGRpcnR5IGNoZWNraW5nLCBvdGhlcndpc2VcbiAgICAgICogICB3aWxsIGludm9rZSBgZm5gIHdpdGhpbiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGFwcGx5ICRhcHBseX0gYmxvY2suXG4gICAgICAqIEBwYXJhbSB7Li4uKj19IFBhc3MgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBleGVjdXRlZCBmdW5jdGlvbi5cbiAgICAgICogQHJldHVybnMge3Byb21pc2V9IEEgcHJvbWlzZSB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9uIGVhY2ggaXRlcmF0aW9uLlxuICAgICAgKlxuICAgICAgKiBAZXhhbXBsZVxuICAgICAgKiA8ZXhhbXBsZSBtb2R1bGU9XCJpbnRlcnZhbEV4YW1wbGVcIiBuYW1lPVwiaW50ZXJ2YWwtc2VydmljZVwiPlxuICAgICAgKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgKiAgIDxzY3JpcHQ+XG4gICAgICAqICAgICBhbmd1bGFyLm1vZHVsZSgnaW50ZXJ2YWxFeGFtcGxlJywgW10pXG4gICAgICAqICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgJyRpbnRlcnZhbCcsXG4gICAgICAqICAgICAgICAgZnVuY3Rpb24oJHNjb3BlLCAkaW50ZXJ2YWwpIHtcbiAgICAgICogICAgICAgICAgICRzY29wZS5mb3JtYXQgPSAnTS9kL3l5IGg6bW06c3MgYSc7XG4gICAgICAqICAgICAgICAgICAkc2NvcGUuYmxvb2RfMSA9IDEwMDtcbiAgICAgICogICAgICAgICAgICRzY29wZS5ibG9vZF8yID0gMTIwO1xuICAgICAgKlxuICAgICAgKiAgICAgICAgICAgdmFyIHN0b3A7XG4gICAgICAqICAgICAgICAgICAkc2NvcGUuZmlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICAgICogICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgYSBuZXcgZmlnaHQgaWYgd2UgYXJlIGFscmVhZHkgZmlnaHRpbmdcbiAgICAgICogICAgICAgICAgICAgaWYgKCBhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSApIHJldHVybjtcbiAgICAgICpcbiAgICAgICogICAgICAgICAgICAgc3RvcCA9ICRpbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmJsb29kXzEgPiAwICYmICRzY29wZS5ibG9vZF8yID4gMCkge1xuICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLmJsb29kXzEgPSAkc2NvcGUuYmxvb2RfMSAtIDM7XG4gICAgICAqICAgICAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9ICRzY29wZS5ibG9vZF8yIC0gNDtcbiAgICAgICogICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgKiAgICAgICAgICAgICAgICAgJHNjb3BlLnN0b3BGaWdodCgpO1xuICAgICAgKiAgICAgICAgICAgICAgIH1cbiAgICAgICogICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICogICAgICAgICAgIH07XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAqICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRGVmaW5lZChzdG9wKSkge1xuICAgICAgKiAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcCk7XG4gICAgICAqICAgICAgICAgICAgICAgc3RvcCA9IHVuZGVmaW5lZDtcbiAgICAgICogICAgICAgICAgICAgfVxuICAgICAgKiAgICAgICAgICAgfTtcbiAgICAgICpcbiAgICAgICogICAgICAgICAgICRzY29wZS5yZXNldEZpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAqICAgICAgICAgICAgICRzY29wZS5ibG9vZF8xID0gMTAwO1xuICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuYmxvb2RfMiA9IDEyMDtcbiAgICAgICogICAgICAgICAgIH07XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAkc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgKiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJ2YWwgaXMgZGVzdHJveWVkIHRvb1xuICAgICAgKiAgICAgICAgICAgICAkc2NvcGUuc3RvcEZpZ2h0KCk7XG4gICAgICAqICAgICAgICAgICB9KTtcbiAgICAgICogICAgICAgICB9XSlcbiAgICAgICogICAgICAgLy8gUmVnaXN0ZXIgdGhlICdteUN1cnJlbnRUaW1lJyBkaXJlY3RpdmUgZmFjdG9yeSBtZXRob2QuXG4gICAgICAqICAgICAgIC8vIFdlIGluamVjdCAkaW50ZXJ2YWwgYW5kIGRhdGVGaWx0ZXIgc2VydmljZSBzaW5jZSB0aGUgZmFjdG9yeSBtZXRob2QgaXMgREkuXG4gICAgICAqICAgICAgIC5kaXJlY3RpdmUoJ215Q3VycmVudFRpbWUnLCBbJyRpbnRlcnZhbCcsICdkYXRlRmlsdGVyJyxcbiAgICAgICogICAgICAgICBmdW5jdGlvbigkaW50ZXJ2YWwsIGRhdGVGaWx0ZXIpIHtcbiAgICAgICogICAgICAgICAgIC8vIHJldHVybiB0aGUgZGlyZWN0aXZlIGxpbmsgZnVuY3Rpb24uIChjb21waWxlIGZ1bmN0aW9uIG5vdCBuZWVkZWQpXG4gICAgICAqICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAqICAgICAgICAgICAgIHZhciBmb3JtYXQsICAvLyBkYXRlIGZvcm1hdFxuICAgICAgKiAgICAgICAgICAgICAgICAgc3RvcFRpbWU7IC8vIHNvIHRoYXQgd2UgY2FuIGNhbmNlbCB0aGUgdGltZSB1cGRhdGVzXG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAgIC8vIHVzZWQgdG8gdXBkYXRlIHRoZSBVSVxuICAgICAgKiAgICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVUaW1lKCkge1xuICAgICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQudGV4dChkYXRlRmlsdGVyKG5ldyBEYXRlKCksIGZvcm1hdCkpO1xuICAgICAgKiAgICAgICAgICAgICB9XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAgIC8vIHdhdGNoIHRoZSBleHByZXNzaW9uLCBhbmQgdXBkYXRlIHRoZSBVSSBvbiBjaGFuZ2UuXG4gICAgICAqICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5teUN1cnJlbnRUaW1lLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgKiAgICAgICAgICAgICAgIGZvcm1hdCA9IHZhbHVlO1xuICAgICAgKiAgICAgICAgICAgICAgIHVwZGF0ZVRpbWUoKTtcbiAgICAgICogICAgICAgICAgICAgfSk7XG4gICAgICAqXG4gICAgICAqICAgICAgICAgICAgIHN0b3BUaW1lID0gJGludGVydmFsKHVwZGF0ZVRpbWUsIDEwMDApO1xuICAgICAgKlxuICAgICAgKiAgICAgICAgICAgICAvLyBsaXN0ZW4gb24gRE9NIGRlc3Ryb3kgKHJlbW92YWwpIGV2ZW50LCBhbmQgY2FuY2VsIHRoZSBuZXh0IFVJIHVwZGF0ZVxuICAgICAgKiAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IHVwZGF0aW5nIHRpbWUgYWZ0ZXIgdGhlIERPTSBlbGVtZW50IHdhcyByZW1vdmVkLlxuICAgICAgKiAgICAgICAgICAgICBlbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgKiAgICAgICAgICAgICAgICRpbnRlcnZhbC5jYW5jZWwoc3RvcFRpbWUpO1xuICAgICAgKiAgICAgICAgICAgICB9KTtcbiAgICAgICogICAgICAgICAgIH1cbiAgICAgICogICAgICAgICB9XSk7XG4gICAgICAqICAgPC9zY3JpcHQ+XG4gICAgICAqXG4gICAgICAqICAgPGRpdj5cbiAgICAgICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAqICAgICAgIDxsYWJlbD5EYXRlIGZvcm1hdDogPGlucHV0IG5nLW1vZGVsPVwiZm9ybWF0XCI+PC9sYWJlbD4gPGhyLz5cbiAgICAgICogICAgICAgQ3VycmVudCB0aW1lIGlzOiA8c3BhbiBteS1jdXJyZW50LXRpbWU9XCJmb3JtYXRcIj48L3NwYW4+XG4gICAgICAqICAgICAgIDxoci8+XG4gICAgICAqICAgICAgIEJsb29kIDEgOiA8Zm9udCBjb2xvcj0ncmVkJz57e2Jsb29kXzF9fTwvZm9udD5cbiAgICAgICogICAgICAgQmxvb2QgMiA6IDxmb250IGNvbG9yPSdyZWQnPnt7Ymxvb2RfMn19PC9mb250PlxuICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLW5nLWNsaWNrPVwiZmlnaHQoKVwiPkZpZ2h0PC9idXR0b24+XG4gICAgICAqICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtbmctY2xpY2s9XCJzdG9wRmlnaHQoKVwiPlN0b3BGaWdodDwvYnV0dG9uPlxuICAgICAgKiAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLW5nLWNsaWNrPVwicmVzZXRGaWdodCgpXCI+cmVzZXRGaWdodDwvYnV0dG9uPlxuICAgICAgKiAgICAgPC9kaXY+XG4gICAgICAqICAgPC9kaXY+XG4gICAgICAqXG4gICAgICAqIDwvZmlsZT5cbiAgICAgICogPC9leGFtcGxlPlxuICAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnRlcnZhbChmbiwgZGVsYXksIGNvdW50LCBpbnZva2VBcHBseSkge1xuICAgICAgdmFyIGhhc1BhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0LFxuICAgICAgICAgIGFyZ3MgPSBoYXNQYXJhbXMgPyBzbGljZUFyZ3MoYXJndW1lbnRzLCA0KSA6IFtdLFxuICAgICAgICAgIHNldEludGVydmFsID0gJHdpbmRvdy5zZXRJbnRlcnZhbCxcbiAgICAgICAgICBjbGVhckludGVydmFsID0gJHdpbmRvdy5jbGVhckludGVydmFsLFxuICAgICAgICAgIGl0ZXJhdGlvbiA9IDAsXG4gICAgICAgICAgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSxcbiAgICAgICAgICBkZWZlcnJlZCA9IChza2lwQXBwbHkgPyAkJHEgOiAkcSkuZGVmZXIoKSxcbiAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZTtcblxuICAgICAgY291bnQgPSBpc0RlZmluZWQoY291bnQpID8gY291bnQgOiAwO1xuXG4gICAgICBwcm9taXNlLiQkaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgICAgIGlmIChza2lwQXBwbHkpIHtcbiAgICAgICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZlcnJlZC5ub3RpZnkoaXRlcmF0aW9uKyspO1xuXG4gICAgICAgIGlmIChjb3VudCA+IDAgJiYgaXRlcmF0aW9uID49IGNvdW50KSB7XG4gICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpdGVyYXRpb24pO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocHJvbWlzZS4kJGludGVydmFsSWQpO1xuICAgICAgICAgIGRlbGV0ZSBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFza2lwQXBwbHkpICRyb290U2NvcGUuJGFwcGx5KCk7XG5cbiAgICAgIH0sIGRlbGF5KTtcblxuICAgICAgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXSA9IGRlZmVycmVkO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcblxuICAgICAgZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICAgIGlmICghaGFzUGFyYW1zKSB7XG4gICAgICAgICAgZm4oaXRlcmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAqIEBuYW1lICRpbnRlcnZhbCNjYW5jZWxcbiAgICAgICpcbiAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAqIENhbmNlbHMgYSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHByb21pc2VgLlxuICAgICAgKlxuICAgICAgKiBAcGFyYW0ge1Byb21pc2U9fSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgJGludGVydmFsYCBmdW5jdGlvbi5cbiAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIHdhcyBzdWNjZXNzZnVsbHkgY2FuY2VsZWQuXG4gICAgICAqL1xuICAgIGludGVydmFsLmNhbmNlbCA9IGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlICYmIHByb21pc2UuJCRpbnRlcnZhbElkIGluIGludGVydmFscykge1xuICAgICAgICAvLyBJbnRlcnZhbCBjYW5jZWxzIHNob3VsZCBub3QgcmVwb3J0IGFzIHVuaGFuZGxlZCBwcm9taXNlLlxuICAgICAgICBpbnRlcnZhbHNbcHJvbWlzZS4kJGludGVydmFsSWRdLnByb21pc2UuY2F0Y2gobm9vcCk7XG4gICAgICAgIGludGVydmFsc1twcm9taXNlLiQkaW50ZXJ2YWxJZF0ucmVqZWN0KCdjYW5jZWxlZCcpO1xuICAgICAgICAkd2luZG93LmNsZWFySW50ZXJ2YWwocHJvbWlzZS4kJGludGVydmFsSWQpO1xuICAgICAgICBkZWxldGUgaW50ZXJ2YWxzW3Byb21pc2UuJCRpbnRlcnZhbElkXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHJldHVybiBpbnRlcnZhbDtcbiAgfV07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRqc29ucENhbGxiYWNrc1xuICogQHJlcXVpcmVzICR3aW5kb3dcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBzZXJ2aWNlIGhhbmRsZXMgdGhlIGxpZmVjeWNsZSBvZiBjYWxsYmFja3MgdG8gaGFuZGxlIEpTT05QIHJlcXVlc3RzLlxuICogT3ZlcnJpZGUgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoIHRvIGN1c3RvbWlzZSB3aGVyZSB0aGUgY2FsbGJhY2tzIGFyZSBzdG9yZWQgYW5kXG4gKiBob3cgdGhleSB2YXJ5IGNvbXBhcmVkIHRvIHRoZSByZXF1ZXN0ZWQgdXJsLlxuICovXG52YXIgJGpzb25wQ2FsbGJhY2tzUHJvdmlkZXIgPSAvKiogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsIGZ1bmN0aW9uKCR3aW5kb3cpIHtcbiAgICB2YXIgY2FsbGJhY2tzID0gJHdpbmRvdy5hbmd1bGFyLmNhbGxiYWNrcztcbiAgICB2YXIgY2FsbGJhY2tNYXAgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhbGxiYWNrKGNhbGxiYWNrSWQpIHtcbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgY2FsbGJhY2suZGF0YSA9IGRhdGE7XG4gICAgICAgIGNhbGxiYWNrLmNhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgY2FsbGJhY2suaWQgPSBjYWxsYmFja0lkO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRqc29ucENhbGxiYWNrcyNjcmVhdGVDYWxsYmFja1xuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCB0aGUgdXJsIG9mIHRoZSBKU09OUCByZXF1ZXN0XG4gICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgY2FsbGJhY2sgcGF0aCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIgYXMgcGFydCBvZiB0aGUgSlNPTlAgcmVxdWVzdFxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiB7QGxpbmsgJGh0dHBCYWNrZW5kfSBjYWxscyB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjYWxsYmFjayBhbmQgZ2V0IGhvbGQgb2YgdGhlIHBhdGggdG8gdGhlIGNhbGxiYWNrXG4gICAgICAgKiB0byBwYXNzIHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGl0cyBwYXlsb2FkIGluIHRoZSBKU09OUCByZXNwb25zZS5cbiAgICAgICAqL1xuICAgICAgY3JlYXRlQ2FsbGJhY2s6IGZ1bmN0aW9uKHVybCkge1xuICAgICAgICB2YXIgY2FsbGJhY2tJZCA9ICdfJyArIChjYWxsYmFja3MuJCRjb3VudGVyKyspLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgdmFyIGNhbGxiYWNrUGF0aCA9ICdhbmd1bGFyLmNhbGxiYWNrcy4nICsgY2FsbGJhY2tJZDtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gY3JlYXRlQ2FsbGJhY2soY2FsbGJhY2tJZCk7XG4gICAgICAgIGNhbGxiYWNrTWFwW2NhbGxiYWNrUGF0aF0gPSBjYWxsYmFja3NbY2FsbGJhY2tJZF0gPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrUGF0aDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRqc29ucENhbGxiYWNrcyN3YXNDYWxsZWRcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja1BhdGggdGhlIHBhdGggdG8gdGhlIGNhbGxiYWNrIHRoYXQgd2FzIHNlbnQgaW4gdGhlIEpTT05QIHJlcXVlc3RcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBjYWxsYmFjayBoYXMgYmVlbiBjYWxsZWQsIGFzIGEgcmVzdWx0IG9mIHRoZSBKU09OUCByZXNwb25zZVxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiB7QGxpbmsgJGh0dHBCYWNrZW5kfSBjYWxscyB0aGlzIG1ldGhvZCB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBKU09OUCByZXNwb25zZSBhY3R1YWxseSBjYWxsZWQgdGhlXG4gICAgICAgKiBjYWxsYmFjayB0aGF0IHdhcyBwYXNzZWQgaW4gdGhlIHJlcXVlc3QuXG4gICAgICAgKi9cbiAgICAgIHdhc0NhbGxlZDogZnVuY3Rpb24oY2FsbGJhY2tQYXRoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFja01hcFtjYWxsYmFja1BhdGhdLmNhbGxlZDtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRqc29ucENhbGxiYWNrcyNnZXRSZXNwb25zZVxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrUGF0aCB0aGUgcGF0aCB0byB0aGUgY2FsbGJhY2sgdGhhdCB3YXMgc2VudCBpbiB0aGUgSlNPTlAgcmVxdWVzdFxuICAgICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHJlc3BvbnNlIHZpYSB0aGUgcmVnaXN0ZXJlZCBjYWxsYmFja1xuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiB7QGxpbmsgJGh0dHBCYWNrZW5kfSBjYWxscyB0aGlzIG1ldGhvZCB0byBnZXQgaG9sZCBvZiB0aGUgZGF0YSB0aGF0IHdhcyBwcm92aWRlZCB0byB0aGUgY2FsbGJhY2tcbiAgICAgICAqIGluIHRoZSBKU09OUCByZXNwb25zZS5cbiAgICAgICAqL1xuICAgICAgZ2V0UmVzcG9uc2U6IGZ1bmN0aW9uKGNhbGxiYWNrUGF0aCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2tNYXBbY2FsbGJhY2tQYXRoXS5kYXRhO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGpzb25wQ2FsbGJhY2tzI3JlbW92ZUNhbGxiYWNrXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tQYXRoIHRoZSBwYXRoIHRvIHRoZSBjYWxsYmFjayB0aGF0IHdhcyBzZW50IGluIHRoZSBKU09OUCByZXF1ZXN0XG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIHtAbGluayAkaHR0cEJhY2tlbmR9IGNhbGxzIHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIEpTT05QIHJlcXVlc3QgaGFzXG4gICAgICAgKiBjb21wbGV0ZWQgb3IgdGltZWQtb3V0LlxuICAgICAgICovXG4gICAgICByZW1vdmVDYWxsYmFjazogZnVuY3Rpb24oY2FsbGJhY2tQYXRoKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrTWFwW2NhbGxiYWNrUGF0aF07XG4gICAgICAgIGRlbGV0ZSBjYWxsYmFja3NbY2FsbGJhY2suaWRdO1xuICAgICAgICBkZWxldGUgY2FsbGJhY2tNYXBbY2FsbGJhY2tQYXRoXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XTtcbn07XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRsb2NhbGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICRsb2NhbGUgc2VydmljZSBwcm92aWRlcyBsb2NhbGl6YXRpb24gcnVsZXMgZm9yIHZhcmlvdXMgQW5ndWxhciBjb21wb25lbnRzLiBBcyBvZiByaWdodCBub3cgdGhlXG4gKiBvbmx5IHB1YmxpYyBhcGkgaXM6XG4gKlxuICogKiBgaWRgIOKAkyBge3N0cmluZ31gIOKAkyBsb2NhbGUgaWQgZm9ybWF0dGVkIGFzIGBsYW5ndWFnZUlkLWNvdW50cnlJZGAgKGUuZy4gYGVuLXVzYClcbiAqL1xuXG52YXIgUEFUSF9NQVRDSCA9IC9eKFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kLyxcbiAgICBERUZBVUxUX1BPUlRTID0geydodHRwJzogODAsICdodHRwcyc6IDQ0MywgJ2Z0cCc6IDIxfTtcbnZhciAkbG9jYXRpb25NaW5FcnIgPSBtaW5FcnIoJyRsb2NhdGlvbicpO1xuXG5cbi8qKlxuICogRW5jb2RlIHBhdGggdXNpbmcgZW5jb2RlVXJpU2VnbWVudCwgaWdub3JpbmcgZm9yd2FyZCBzbGFzaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZVBhdGgocGF0aCkge1xuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyksXG4gICAgICBpID0gc2VnbWVudHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBzZWdtZW50c1tpXSA9IGVuY29kZVVyaVNlZ21lbnQoc2VnbWVudHNbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBYnNvbHV0ZVVybChhYnNvbHV0ZVVybCwgbG9jYXRpb25PYmopIHtcbiAgdmFyIHBhcnNlZFVybCA9IHVybFJlc29sdmUoYWJzb2x1dGVVcmwpO1xuXG4gIGxvY2F0aW9uT2JqLiQkcHJvdG9jb2wgPSBwYXJzZWRVcmwucHJvdG9jb2w7XG4gIGxvY2F0aW9uT2JqLiQkaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgbG9jYXRpb25PYmouJCRwb3J0ID0gdG9JbnQocGFyc2VkVXJsLnBvcnQpIHx8IERFRkFVTFRfUE9SVFNbcGFyc2VkVXJsLnByb3RvY29sXSB8fCBudWxsO1xufVxuXG52YXIgRE9VQkxFX1NMQVNIX1JFR0VYID0gL15cXHMqW1xcXFwvXXsyLH0vO1xuZnVuY3Rpb24gcGFyc2VBcHBVcmwodXJsLCBsb2NhdGlvbk9iaikge1xuXG4gIGlmIChET1VCTEVfU0xBU0hfUkVHRVgudGVzdCh1cmwpKSB7XG4gICAgdGhyb3cgJGxvY2F0aW9uTWluRXJyKCdiYWRwYXRoJywgJ0ludmFsaWQgdXJsIFwiezB9XCIuJywgdXJsKTtcbiAgfVxuXG4gIHZhciBwcmVmaXhlZCA9ICh1cmwuY2hhckF0KDApICE9PSAnLycpO1xuICBpZiAocHJlZml4ZWQpIHtcbiAgICB1cmwgPSAnLycgKyB1cmw7XG4gIH1cbiAgdmFyIG1hdGNoID0gdXJsUmVzb2x2ZSh1cmwpO1xuICBsb2NhdGlvbk9iai4kJHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocHJlZml4ZWQgJiYgbWF0Y2gucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgP1xuICAgICAgbWF0Y2gucGF0aG5hbWUuc3Vic3RyaW5nKDEpIDogbWF0Y2gucGF0aG5hbWUpO1xuICBsb2NhdGlvbk9iai4kJHNlYXJjaCA9IHBhcnNlS2V5VmFsdWUobWF0Y2guc2VhcmNoKTtcbiAgbG9jYXRpb25PYmouJCRoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoLmhhc2gpO1xuXG4gIC8vIG1ha2Ugc3VyZSBwYXRoIHN0YXJ0cyB3aXRoICcvJztcbiAgaWYgKGxvY2F0aW9uT2JqLiQkcGF0aCAmJiBsb2NhdGlvbk9iai4kJHBhdGguY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBsb2NhdGlvbk9iai4kJHBhdGggPSAnLycgKyBsb2NhdGlvbk9iai4kJHBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHNlYXJjaCkge1xuICByZXR1cm4gc3RyLnNsaWNlKDAsIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKiBAcmV0dXJucyB7c3RyaW5nfSByZXR1cm5zIHRleHQgZnJvbSBgdXJsYCBhZnRlciBgYmFzZWAgb3IgYHVuZGVmaW5lZGAgaWYgaXQgZG9lcyBub3QgYmVnaW4gd2l0aFxuICogICAgICAgICAgICAgICAgICAgdGhlIGV4cGVjdGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gc3RyaXBCYXNlVXJsKGJhc2UsIHVybCkge1xuICBpZiAoc3RhcnRzV2l0aCh1cmwsIGJhc2UpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHIoYmFzZS5sZW5ndGgpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3RyaXBIYXNoKHVybCkge1xuICB2YXIgaW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuICByZXR1cm4gaW5kZXggPT09IC0xID8gdXJsIDogdXJsLnN1YnN0cigwLCBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIHRyaW1FbXB0eUhhc2godXJsKSB7XG4gIHJldHVybiB1cmwucmVwbGFjZSgvKCMuKyl8IyQvLCAnJDEnKTtcbn1cblxuXG5mdW5jdGlvbiBzdHJpcEZpbGUodXJsKSB7XG4gIHJldHVybiB1cmwuc3Vic3RyKDAsIHN0cmlwSGFzaCh1cmwpLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbn1cblxuLyogcmV0dXJuIHRoZSBzZXJ2ZXIgb25seSAoc2NoZW1lOi8vaG9zdDpwb3J0KSAqL1xuZnVuY3Rpb24gc2VydmVyQmFzZSh1cmwpIHtcbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoJy8nLCB1cmwuaW5kZXhPZignLy8nKSArIDIpKTtcbn1cblxuXG4vKipcbiAqIExvY2F0aW9uSHRtbDVVcmwgcmVwcmVzZW50cyBhIFVSTFxuICogVGhpcyBvYmplY3QgaXMgZXhwb3NlZCBhcyAkbG9jYXRpb24gc2VydmljZSB3aGVuIEhUTUw1IG1vZGUgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2VOb0ZpbGUgYXBwbGljYXRpb24gYmFzZSBVUkwgc3RyaXBwZWQgb2YgYW55IGZpbGVuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVByZWZpeCBVUkwgcGF0aCBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gTG9jYXRpb25IdG1sNVVybChhcHBCYXNlLCBhcHBCYXNlTm9GaWxlLCBiYXNlUHJlZml4KSB7XG4gIHRoaXMuJCRodG1sNSA9IHRydWU7XG4gIGJhc2VQcmVmaXggPSBiYXNlUHJlZml4IHx8ICcnO1xuICBwYXJzZUFic29sdXRlVXJsKGFwcEJhc2UsIHRoaXMpO1xuXG5cbiAgLyoqXG4gICAqIFBhcnNlIGdpdmVuIEhUTUw1IChyZWd1bGFyKSBVUkwgc3RyaW5nIGludG8gcHJvcGVydGllc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEhUTUw1IFVSTFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGhpcy4kJHBhcnNlID0gZnVuY3Rpb24odXJsKSB7XG4gICAgdmFyIHBhdGhVcmwgPSBzdHJpcEJhc2VVcmwoYXBwQmFzZU5vRmlsZSwgdXJsKTtcbiAgICBpZiAoIWlzU3RyaW5nKHBhdGhVcmwpKSB7XG4gICAgICB0aHJvdyAkbG9jYXRpb25NaW5FcnIoJ2lwdGhwcmZ4JywgJ0ludmFsaWQgdXJsIFwiezB9XCIsIG1pc3NpbmcgcGF0aCBwcmVmaXggXCJ7MX1cIi4nLCB1cmwsXG4gICAgICAgICAgYXBwQmFzZU5vRmlsZSk7XG4gICAgfVxuXG4gICAgcGFyc2VBcHBVcmwocGF0aFVybCwgdGhpcyk7XG5cbiAgICBpZiAoIXRoaXMuJCRwYXRoKSB7XG4gICAgICB0aGlzLiQkcGF0aCA9ICcvJztcbiAgICB9XG5cbiAgICB0aGlzLiQkY29tcG9zZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb21wb3NlIHVybCBhbmQgdXBkYXRlIGBhYnNVcmxgIHByb3BlcnR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGlzLiQkY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLFxuICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnO1xuXG4gICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7XG4gICAgdGhpcy4kJGFic1VybCA9IGFwcEJhc2VOb0ZpbGUgKyB0aGlzLiQkdXJsLnN1YnN0cigxKTsgLy8gZmlyc3QgY2hhciBpcyBhbHdheXMgJy8nXG4gIH07XG5cbiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikge1xuICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czpcbiAgICAgIC8vIGtlZXAgdGhlIG9sZCB1cmwgYW5kIG9ubHkgcmVwbGFjZSB0aGUgaGFzaCBmcmFnbWVudFxuICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBhcHBVcmwsIHByZXZBcHBVcmw7XG4gICAgdmFyIHJld3JpdHRlblVybDtcblxuXG4gICAgaWYgKGlzRGVmaW5lZChhcHBVcmwgPSBzdHJpcEJhc2VVcmwoYXBwQmFzZSwgdXJsKSkpIHtcbiAgICAgIHByZXZBcHBVcmwgPSBhcHBVcmw7XG4gICAgICBpZiAoYmFzZVByZWZpeCAmJiBpc0RlZmluZWQoYXBwVXJsID0gc3RyaXBCYXNlVXJsKGJhc2VQcmVmaXgsIGFwcFVybCkpKSB7XG4gICAgICAgIHJld3JpdHRlblVybCA9IGFwcEJhc2VOb0ZpbGUgKyAoc3RyaXBCYXNlVXJsKCcvJywgYXBwVXJsKSB8fCBhcHBVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZSArIHByZXZBcHBVcmw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0RlZmluZWQoYXBwVXJsID0gc3RyaXBCYXNlVXJsKGFwcEJhc2VOb0ZpbGUsIHVybCkpKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlTm9GaWxlICsgYXBwVXJsO1xuICAgIH0gZWxzZSBpZiAoYXBwQmFzZU5vRmlsZSA9PT0gdXJsICsgJy8nKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlTm9GaWxlO1xuICAgIH1cbiAgICBpZiAocmV3cml0dGVuVXJsKSB7XG4gICAgICB0aGlzLiQkcGFyc2UocmV3cml0dGVuVXJsKTtcbiAgICB9XG4gICAgcmV0dXJuICEhcmV3cml0dGVuVXJsO1xuICB9O1xufVxuXG5cbi8qKlxuICogTG9jYXRpb25IYXNoYmFuZ1VybCByZXByZXNlbnRzIFVSTFxuICogVGhpcyBvYmplY3QgaXMgZXhwb3NlZCBhcyAkbG9jYXRpb24gc2VydmljZSB3aGVuIGRldmVsb3BlciBkb2Vzbid0IG9wdCBpbnRvIGh0bWw1IG1vZGUuXG4gKiBJdCBhbHNvIHNlcnZlcyBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgaHRtbDUgbW9kZSBmYWxsYmFjayBvbiBsZWdhY3kgYnJvd3NlcnMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2VOb0ZpbGUgYXBwbGljYXRpb24gYmFzZSBVUkwgc3RyaXBwZWQgb2YgYW55IGZpbGVuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gTG9jYXRpb25IYXNoYmFuZ1VybChhcHBCYXNlLCBhcHBCYXNlTm9GaWxlLCBoYXNoUHJlZml4KSB7XG5cbiAgcGFyc2VBYnNvbHV0ZVVybChhcHBCYXNlLCB0aGlzKTtcblxuXG4gIC8qKlxuICAgKiBQYXJzZSBnaXZlbiBoYXNoYmFuZyBVUkwgaW50byBwcm9wZXJ0aWVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSGFzaGJhbmcgVVJMXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0aGlzLiQkcGFyc2UgPSBmdW5jdGlvbih1cmwpIHtcbiAgICB2YXIgd2l0aG91dEJhc2VVcmwgPSBzdHJpcEJhc2VVcmwoYXBwQmFzZSwgdXJsKSB8fCBzdHJpcEJhc2VVcmwoYXBwQmFzZU5vRmlsZSwgdXJsKTtcbiAgICB2YXIgd2l0aG91dEhhc2hVcmw7XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHdpdGhvdXRCYXNlVXJsKSAmJiB3aXRob3V0QmFzZVVybC5jaGFyQXQoMCkgPT09ICcjJykge1xuXG4gICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgVVJMIHN0YXJ0cyB3aXRoIGEgaGFzaCBzbyB3ZSBoYXZlXG4gICAgICAvLyBnb3QgZWl0aGVyIGEgaGFzaGJhbmcgcGF0aCBvciBhIHBsYWluIGhhc2ggZnJhZ21lbnRcbiAgICAgIHdpdGhvdXRIYXNoVXJsID0gc3RyaXBCYXNlVXJsKGhhc2hQcmVmaXgsIHdpdGhvdXRCYXNlVXJsKTtcbiAgICAgIGlmIChpc1VuZGVmaW5lZCh3aXRob3V0SGFzaFVybCkpIHtcbiAgICAgICAgLy8gVGhlcmUgd2FzIG5vIGhhc2hiYW5nIHByZWZpeCBzbyB3ZSBqdXN0IGhhdmUgYSBoYXNoIGZyYWdtZW50XG4gICAgICAgIHdpdGhvdXRIYXNoVXJsID0gd2l0aG91dEJhc2VVcmw7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlcmUgd2FzIG5vIGhhc2hiYW5nIHBhdGggbm9yIGhhc2ggZnJhZ21lbnQ6XG4gICAgICAvLyBJZiB3ZSBhcmUgaW4gSFRNTDUgbW9kZSB3ZSB1c2Ugd2hhdCBpcyBsZWZ0IGFzIHRoZSBwYXRoO1xuICAgICAgLy8gT3RoZXJ3aXNlIHdlIGlnbm9yZSB3aGF0IGlzIGxlZnRcbiAgICAgIGlmICh0aGlzLiQkaHRtbDUpIHtcbiAgICAgICAgd2l0aG91dEhhc2hVcmwgPSB3aXRob3V0QmFzZVVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpdGhvdXRIYXNoVXJsID0gJyc7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh3aXRob3V0QmFzZVVybCkpIHtcbiAgICAgICAgICBhcHBCYXNlID0gdXJsO1xuICAgICAgICAgIHRoaXMucmVwbGFjZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VBcHBVcmwod2l0aG91dEhhc2hVcmwsIHRoaXMpO1xuXG4gICAgdGhpcy4kJHBhdGggPSByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHRoaXMuJCRwYXRoLCB3aXRob3V0SGFzaFVybCwgYXBwQmFzZSk7XG5cbiAgICB0aGlzLiQkY29tcG9zZSgpO1xuXG4gICAgLypcbiAgICAgKiBJbiBXaW5kb3dzLCBvbiBhbiBhbmNob3Igbm9kZSBvbiBkb2N1bWVudHMgbG9hZGVkIGZyb21cbiAgICAgKiB0aGUgZmlsZXN5c3RlbSwgdGhlIGJyb3dzZXIgd2lsbCByZXR1cm4gYSBwYXRobmFtZVxuICAgICAqIHByZWZpeGVkIHdpdGggdGhlIGRyaXZlIG5hbWUgKCcvQzovcGF0aCcpIHdoZW4gYVxuICAgICAqIHBhdGhuYW1lIHdpdGhvdXQgYSBkcml2ZSBpcyBzZXQ6XG4gICAgICogICogYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL2ZvbycpXG4gICAgICogICAqIGEucGF0aG5hbWUgPT09ICcvQzovZm9vJyAvL3RydWVcbiAgICAgKlxuICAgICAqIEluc2lkZSBvZiBBbmd1bGFyLCB3ZSdyZSBhbHdheXMgdXNpbmcgcGF0aG5hbWVzIHRoYXRcbiAgICAgKiBkbyBub3QgaW5jbHVkZSBkcml2ZSBuYW1lcyBmb3Igcm91dGluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmVXaW5kb3dzRHJpdmVOYW1lKHBhdGgsIHVybCwgYmFzZSkge1xuICAgICAgLypcbiAgICAgIE1hdGNoZXMgcGF0aHMgZm9yIGZpbGUgcHJvdG9jb2wgb24gd2luZG93cyxcbiAgICAgIHN1Y2ggYXMgL0M6L2Zvby9iYXIsIGFuZCBjYXB0dXJlcyBvbmx5IC9mb28vYmFyLlxuICAgICAgKi9cbiAgICAgIHZhciB3aW5kb3dzRmlsZVBhdGhFeHAgPSAvXlxcL1tBLVpdOihcXC8uKikvO1xuXG4gICAgICB2YXIgZmlyc3RQYXRoU2VnbWVudE1hdGNoO1xuXG4gICAgICAvL0dldCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBpbnB1dCBVUkwuXG4gICAgICBpZiAoc3RhcnRzV2l0aCh1cmwsIGJhc2UpKSB7XG4gICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGJhc2UsICcnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGlucHV0IFVSTCBpbnRlbnRpb25hbGx5IGNvbnRhaW5zIGEgZmlyc3QgcGF0aCBzZWdtZW50IHRoYXQgZW5kcyB3aXRoIGEgY29sb24uXG4gICAgICBpZiAod2luZG93c0ZpbGVQYXRoRXhwLmV4ZWModXJsKSkge1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cblxuICAgICAgZmlyc3RQYXRoU2VnbWVudE1hdGNoID0gd2luZG93c0ZpbGVQYXRoRXhwLmV4ZWMocGF0aCk7XG4gICAgICByZXR1cm4gZmlyc3RQYXRoU2VnbWVudE1hdGNoID8gZmlyc3RQYXRoU2VnbWVudE1hdGNoWzFdIDogcGF0aDtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbXBvc2UgaGFzaGJhbmcgVVJMIGFuZCB1cGRhdGUgYGFic1VybGAgcHJvcGVydHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuJCRjb21wb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNlYXJjaCA9IHRvS2V5VmFsdWUodGhpcy4kJHNlYXJjaCksXG4gICAgICAgIGhhc2ggPSB0aGlzLiQkaGFzaCA/ICcjJyArIGVuY29kZVVyaVNlZ21lbnQodGhpcy4kJGhhc2gpIDogJyc7XG5cbiAgICB0aGlzLiQkdXJsID0gZW5jb2RlUGF0aCh0aGlzLiQkcGF0aCkgKyAoc2VhcmNoID8gJz8nICsgc2VhcmNoIDogJycpICsgaGFzaDtcbiAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZSArICh0aGlzLiQkdXJsID8gaGFzaFByZWZpeCArIHRoaXMuJCR1cmwgOiAnJyk7XG4gIH07XG5cbiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikge1xuICAgIGlmIChzdHJpcEhhc2goYXBwQmFzZSkgPT09IHN0cmlwSGFzaCh1cmwpKSB7XG4gICAgICB0aGlzLiQkcGFyc2UodXJsKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cblxuLyoqXG4gKiBMb2NhdGlvbkhhc2hiYW5nVXJsIHJlcHJlc2VudHMgVVJMXG4gKiBUaGlzIG9iamVjdCBpcyBleHBvc2VkIGFzICRsb2NhdGlvbiBzZXJ2aWNlIHdoZW4gaHRtbDUgaGlzdG9yeSBhcGkgaXMgZW5hYmxlZCBidXQgdGhlIGJyb3dzZXJcbiAqIGRvZXMgbm90IHN1cHBvcnQgaXQuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwQmFzZSBhcHBsaWNhdGlvbiBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcEJhc2VOb0ZpbGUgYXBwbGljYXRpb24gYmFzZSBVUkwgc3RyaXBwZWQgb2YgYW55IGZpbGVuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFzaFByZWZpeCBoYXNoYmFuZyBwcmVmaXhcbiAqL1xuZnVuY3Rpb24gTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwoYXBwQmFzZSwgYXBwQmFzZU5vRmlsZSwgaGFzaFByZWZpeCkge1xuICB0aGlzLiQkaHRtbDUgPSB0cnVlO1xuICBMb2NhdGlvbkhhc2hiYW5nVXJsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgdGhpcy4kJHBhcnNlTGlua1VybCA9IGZ1bmN0aW9uKHVybCwgcmVsSHJlZikge1xuICAgIGlmIChyZWxIcmVmICYmIHJlbEhyZWZbMF0gPT09ICcjJykge1xuICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBsaW5rcyB0byBoYXNoIGZyYWdtZW50czpcbiAgICAgIC8vIGtlZXAgdGhlIG9sZCB1cmwgYW5kIG9ubHkgcmVwbGFjZSB0aGUgaGFzaCBmcmFnbWVudFxuICAgICAgdGhpcy5oYXNoKHJlbEhyZWYuc2xpY2UoMSkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHJld3JpdHRlblVybDtcbiAgICB2YXIgYXBwVXJsO1xuXG4gICAgaWYgKGFwcEJhc2UgPT09IHN0cmlwSGFzaCh1cmwpKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSB1cmw7XG4gICAgfSBlbHNlIGlmICgoYXBwVXJsID0gc3RyaXBCYXNlVXJsKGFwcEJhc2VOb0ZpbGUsIHVybCkpKSB7XG4gICAgICByZXdyaXR0ZW5VcmwgPSBhcHBCYXNlICsgaGFzaFByZWZpeCArIGFwcFVybDtcbiAgICB9IGVsc2UgaWYgKGFwcEJhc2VOb0ZpbGUgPT09IHVybCArICcvJykge1xuICAgICAgcmV3cml0dGVuVXJsID0gYXBwQmFzZU5vRmlsZTtcbiAgICB9XG4gICAgaWYgKHJld3JpdHRlblVybCkge1xuICAgICAgdGhpcy4kJHBhcnNlKHJld3JpdHRlblVybCk7XG4gICAgfVxuICAgIHJldHVybiAhIXJld3JpdHRlblVybDtcbiAgfTtcblxuICB0aGlzLiQkY29tcG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZWFyY2ggPSB0b0tleVZhbHVlKHRoaXMuJCRzZWFyY2gpLFxuICAgICAgICBoYXNoID0gdGhpcy4kJGhhc2ggPyAnIycgKyBlbmNvZGVVcmlTZWdtZW50KHRoaXMuJCRoYXNoKSA6ICcnO1xuXG4gICAgdGhpcy4kJHVybCA9IGVuY29kZVBhdGgodGhpcy4kJHBhdGgpICsgKHNlYXJjaCA/ICc/JyArIHNlYXJjaCA6ICcnKSArIGhhc2g7XG4gICAgLy8gaW5jbHVkZSBoYXNoUHJlZml4IGluICQkYWJzVXJsIHdoZW4gJCR1cmwgaXMgZW1wdHkgc28gSUU5IGRvZXMgbm90IHJlbG9hZCBwYWdlIGJlY2F1c2Ugb2YgcmVtb3ZhbCBvZiAnIydcbiAgICB0aGlzLiQkYWJzVXJsID0gYXBwQmFzZSArIGhhc2hQcmVmaXggKyB0aGlzLiQkdXJsO1xuICB9O1xuXG59XG5cblxudmFyIGxvY2F0aW9uUHJvdG90eXBlID0ge1xuXG4gIC8qKlxuICAgKiBFbnN1cmUgYWJzb2x1dGUgVVJMIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgJCRhYnNVcmw6JycsXG5cbiAgLyoqXG4gICAqIEFyZSB3ZSBpbiBodG1sNSBtb2RlP1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgJCRodG1sNTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEhhcyBhbnkgY2hhbmdlIGJlZW4gcmVwbGFjaW5nP1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgJCRyZXBsYWNlOiBmYWxzZSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jYWJzVXJsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS5cbiAgICpcbiAgICogUmV0dXJuIGZ1bGwgVVJMIHJlcHJlc2VudGF0aW9uIHdpdGggYWxsIHNlZ21lbnRzIGVuY29kZWQgYWNjb3JkaW5nIHRvIHJ1bGVzIHNwZWNpZmllZCBpblxuICAgKiBbUkZDIDM5ODZdKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM5ODYudHh0KS5cbiAgICpcbiAgICpcbiAgICogYGBganNcbiAgICogLy8gZ2l2ZW4gVVJMIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvXG4gICAqIHZhciBhYnNVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7XG4gICAqIC8vID0+IFwiaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBmdWxsIFVSTFxuICAgKi9cbiAgYWJzVXJsOiBsb2NhdGlvbkdldHRlcignJCRhYnNVcmwnKSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jdXJsXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgLyBzZXR0ZXIuXG4gICAqXG4gICAqIFJldHVybiBVUkwgKGUuZy4gYC9wYXRoP2E9YiNoYXNoYCkgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBDaGFuZ2UgcGF0aCwgc2VhcmNoIGFuZCBoYXNoLCB3aGVuIGNhbGxlZCB3aXRoIHBhcmFtZXRlciBhbmQgcmV0dXJuIGAkbG9jYXRpb25gLlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cbiAgICogdmFyIHVybCA9ICRsb2NhdGlvbi51cmwoKTtcbiAgICogLy8gPT4gXCIvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmc9fSB1cmwgTmV3IFVSTCB3aXRob3V0IGJhc2UgcHJlZml4IChlLmcuIGAvcGF0aD9hPWIjaGFzaGApXG4gICAqIEByZXR1cm4ge3N0cmluZ30gdXJsXG4gICAqL1xuICB1cmw6IGZ1bmN0aW9uKHVybCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh1cmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy4kJHVybDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2ggPSBQQVRIX01BVENILmV4ZWModXJsKTtcbiAgICBpZiAobWF0Y2hbMV0gfHwgdXJsID09PSAnJykgdGhpcy5wYXRoKGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFsxXSkpO1xuICAgIGlmIChtYXRjaFsyXSB8fCBtYXRjaFsxXSB8fCB1cmwgPT09ICcnKSB0aGlzLnNlYXJjaChtYXRjaFszXSB8fCAnJyk7XG4gICAgdGhpcy5oYXNoKG1hdGNoWzVdIHx8ICcnKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNwcm90b2NvbFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIG9ubHkuXG4gICAqXG4gICAqIFJldHVybiBwcm90b2NvbCBvZiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICpcbiAgICogYGBganNcbiAgICogLy8gZ2l2ZW4gVVJMIGh0dHA6Ly9leGFtcGxlLmNvbS8jL3NvbWUvcGF0aD9mb289YmFyJmJhej14b3hvXG4gICAqIHZhciBwcm90b2NvbCA9ICRsb2NhdGlvbi5wcm90b2NvbCgpO1xuICAgKiAvLyA9PiBcImh0dHBcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBwcm90b2NvbCBvZiBjdXJyZW50IFVSTFxuICAgKi9cbiAgcHJvdG9jb2w6IGxvY2F0aW9uR2V0dGVyKCckJHByb3RvY29sJyksXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGxvY2F0aW9uI2hvc3RcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciBvbmx5LlxuICAgKlxuICAgKiBSZXR1cm4gaG9zdCBvZiBjdXJyZW50IFVSTC5cbiAgICpcbiAgICogTm90ZTogY29tcGFyZWQgdG8gdGhlIG5vbi1hbmd1bGFyIHZlcnNpb24gYGxvY2F0aW9uLmhvc3RgIHdoaWNoIHJldHVybnMgYGhvc3RuYW1lOnBvcnRgLCB0aGlzIHJldHVybnMgdGhlIGBob3N0bmFtZWAgcG9ydGlvbiBvbmx5LlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cbiAgICogdmFyIGhvc3QgPSAkbG9jYXRpb24uaG9zdCgpO1xuICAgKiAvLyA9PiBcImV4YW1wbGUuY29tXCJcbiAgICpcbiAgICogLy8gZ2l2ZW4gVVJMIGh0dHA6Ly91c2VyOnBhc3N3b3JkQGV4YW1wbGUuY29tOjgwODAvIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94b1xuICAgKiBob3N0ID0gJGxvY2F0aW9uLmhvc3QoKTtcbiAgICogLy8gPT4gXCJleGFtcGxlLmNvbVwiXG4gICAqIGhvc3QgPSBsb2NhdGlvbi5ob3N0O1xuICAgKiAvLyA9PiBcImV4YW1wbGUuY29tOjgwODBcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBob3N0IG9mIGN1cnJlbnQgVVJMLlxuICAgKi9cbiAgaG9zdDogbG9jYXRpb25HZXR0ZXIoJyQkaG9zdCcpLFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNwb3J0XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgb25seS5cbiAgICpcbiAgICogUmV0dXJuIHBvcnQgb2YgY3VycmVudCBVUkwuXG4gICAqXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIC8vIGdpdmVuIFVSTCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94b1xuICAgKiB2YXIgcG9ydCA9ICRsb2NhdGlvbi5wb3J0KCk7XG4gICAqIC8vID0+IDgwXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHBvcnRcbiAgICovXG4gIHBvcnQ6IGxvY2F0aW9uR2V0dGVyKCckJHBvcnQnKSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jcGF0aFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBtZXRob2QgaXMgZ2V0dGVyIC8gc2V0dGVyLlxuICAgKlxuICAgKiBSZXR1cm4gcGF0aCBvZiBjdXJyZW50IFVSTCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIENoYW5nZSBwYXRoIHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuXG4gICAqXG4gICAqIE5vdGU6IFBhdGggc2hvdWxkIGFsd2F5cyBiZWdpbiB3aXRoIGZvcndhcmQgc2xhc2ggKC8pLCB0aGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgZm9yd2FyZCBzbGFzaFxuICAgKiBpZiBpdCBpcyBtaXNzaW5nLlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG9cbiAgICogdmFyIHBhdGggPSAkbG9jYXRpb24ucGF0aCgpO1xuICAgKiAvLyA9PiBcIi9zb21lL3BhdGhcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBwYXRoIE5ldyBwYXRoXG4gICAqIEByZXR1cm4geyhzdHJpbmd8b2JqZWN0KX0gcGF0aCBpZiBjYWxsZWQgd2l0aCBubyBwYXJhbWV0ZXJzLCBvciBgJGxvY2F0aW9uYCBpZiBjYWxsZWQgd2l0aCBhIHBhcmFtZXRlclxuICAgKi9cbiAgcGF0aDogbG9jYXRpb25HZXR0ZXJTZXR0ZXIoJyQkcGF0aCcsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aCAhPT0gbnVsbCA/IHBhdGgudG9TdHJpbmcoKSA6ICcnO1xuICAgIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nID8gcGF0aCA6ICcvJyArIHBhdGg7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNzZWFyY2hcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci5cbiAgICpcbiAgICogUmV0dXJuIHNlYXJjaCBwYXJ0IChhcyBvYmplY3QpIG9mIGN1cnJlbnQgVVJMIHdoZW4gY2FsbGVkIHdpdGhvdXQgYW55IHBhcmFtZXRlci5cbiAgICpcbiAgICogQ2hhbmdlIHNlYXJjaCBwYXJ0IHdoZW4gY2FsbGVkIHdpdGggcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuXG4gICAqXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIC8vIGdpdmVuIFVSTCBodHRwOi8vZXhhbXBsZS5jb20vIy9zb21lL3BhdGg/Zm9vPWJhciZiYXo9eG94b1xuICAgKiB2YXIgc2VhcmNoT2JqZWN0ID0gJGxvY2F0aW9uLnNlYXJjaCgpO1xuICAgKiAvLyA9PiB7Zm9vOiAnYmFyJywgYmF6OiAneG94byd9XG4gICAqXG4gICAqIC8vIHNldCBmb28gdG8gJ3lpcGVlJ1xuICAgKiAkbG9jYXRpb24uc2VhcmNoKCdmb28nLCAneWlwZWUnKTtcbiAgICogLy8gJGxvY2F0aW9uLnNlYXJjaCgpID0+IHtmb286ICd5aXBlZScsIGJhejogJ3hveG8nfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0LjxzdHJpbmc+fE9iamVjdC48QXJyYXkuPHN0cmluZz4+fSBzZWFyY2ggTmV3IHNlYXJjaCBwYXJhbXMgLSBzdHJpbmcgb3JcbiAgICogaGFzaCBvYmplY3QuXG4gICAqXG4gICAqIFdoZW4gY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgdGhlIG1ldGhvZCBhY3RzIGFzIGEgc2V0dGVyLCBzZXR0aW5nIHRoZSBgc2VhcmNoYCBjb21wb25lbnRcbiAgICogb2YgYCRsb2NhdGlvbmAgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICpcbiAgICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgaGFzaCBvYmplY3QgY29udGFpbmluZyBhbiBhcnJheSBvZiB2YWx1ZXMsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGVuY29kZWRcbiAgICogYXMgZHVwbGljYXRlIHNlYXJjaCBwYXJhbWV0ZXJzIGluIHRoZSBVUkwuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xOdW1iZXJ8QXJyYXk8c3RyaW5nPnxib29sZWFuKT19IHBhcmFtVmFsdWUgSWYgYHNlYXJjaGAgaXMgYSBzdHJpbmcgb3IgbnVtYmVyLCB0aGVuIGBwYXJhbVZhbHVlYFxuICAgKiB3aWxsIG92ZXJyaWRlIG9ubHkgYSBzaW5nbGUgc2VhcmNoIHByb3BlcnR5LlxuICAgKlxuICAgKiBJZiBgcGFyYW1WYWx1ZWAgaXMgYW4gYXJyYXksIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnR5IG9mIHRoZSBgc2VhcmNoYCBjb21wb25lbnQgb2ZcbiAgICogYCRsb2NhdGlvbmAgc3BlY2lmaWVkIHZpYSB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAqXG4gICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgbnVsbGAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIElmIGBwYXJhbVZhbHVlYCBpcyBgdHJ1ZWAsIHRoZSBwcm9wZXJ0eSBzcGVjaWZpZWQgdmlhIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsIGJlIGFkZGVkIHdpdGggbm9cbiAgICogdmFsdWUgbm9yIHRyYWlsaW5nIGVxdWFsIHNpZ24uXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gSWYgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHJldHVybnMgdGhlIHBhcnNlZCBgc2VhcmNoYCBvYmplY3QuIElmIGNhbGxlZCB3aXRoXG4gICAqIG9uZSBvciBtb3JlIGFyZ3VtZW50cyByZXR1cm5zIGAkbG9jYXRpb25gIG9iamVjdCBpdHNlbGYuXG4gICAqL1xuICBzZWFyY2g6IGZ1bmN0aW9uKHNlYXJjaCwgcGFyYW1WYWx1ZSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gdGhpcy4kJHNlYXJjaDtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKGlzU3RyaW5nKHNlYXJjaCkgfHwgaXNOdW1iZXIoc2VhcmNoKSkge1xuICAgICAgICAgIHNlYXJjaCA9IHNlYXJjaC50b1N0cmluZygpO1xuICAgICAgICAgIHRoaXMuJCRzZWFyY2ggPSBwYXJzZUtleVZhbHVlKHNlYXJjaCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2VhcmNoKSkge1xuICAgICAgICAgIHNlYXJjaCA9IGNvcHkoc2VhcmNoLCB7fSk7XG4gICAgICAgICAgLy8gcmVtb3ZlIG9iamVjdCB1bmRlZmluZWQgb3IgbnVsbCBwcm9wZXJ0aWVzXG4gICAgICAgICAgZm9yRWFjaChzZWFyY2gsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBkZWxldGUgc2VhcmNoW2tleV07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLiQkc2VhcmNoID0gc2VhcmNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignaXNyY2hhcmcnLFxuICAgICAgICAgICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBgJGxvY2F0aW9uI3NlYXJjaCgpYCBjYWxsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpIHx8IHBhcmFtVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy4kJHNlYXJjaFtzZWFyY2hdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuJCRzZWFyY2hbc2VhcmNoXSA9IHBhcmFtVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiQkY29tcG9zZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRsb2NhdGlvbiNoYXNoXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIG1ldGhvZCBpcyBnZXR0ZXIgLyBzZXR0ZXIuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGhhc2ggZnJhZ21lbnQgd2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQ2hhbmdlcyB0aGUgaGFzaCBmcmFnbWVudCB3aGVuIGNhbGxlZCB3aXRoIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGAkbG9jYXRpb25gLlxuICAgKlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBnaXZlbiBVUkwgaHR0cDovL2V4YW1wbGUuY29tLyMvc29tZS9wYXRoP2Zvbz1iYXImYmF6PXhveG8jaGFzaFZhbHVlXG4gICAqIHZhciBoYXNoID0gJGxvY2F0aW9uLmhhc2goKTtcbiAgICogLy8gPT4gXCJoYXNoVmFsdWVcIlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBoYXNoIE5ldyBoYXNoIGZyYWdtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ30gaGFzaFxuICAgKi9cbiAgaGFzaDogbG9jYXRpb25HZXR0ZXJTZXR0ZXIoJyQkaGFzaCcsIGZ1bmN0aW9uKGhhc2gpIHtcbiAgICByZXR1cm4gaGFzaCAhPT0gbnVsbCA/IGhhc2gudG9TdHJpbmcoKSA6ICcnO1xuICB9KSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jcmVwbGFjZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSWYgY2FsbGVkLCBhbGwgY2hhbmdlcyB0byAkbG9jYXRpb24gZHVyaW5nIHRoZSBjdXJyZW50IGAkZGlnZXN0YCB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeVxuICAgKiByZWNvcmQsIGluc3RlYWQgb2YgYWRkaW5nIGEgbmV3IG9uZS5cbiAgICovXG4gIHJlcGxhY2U6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJCRyZXBsYWNlID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxuZm9yRWFjaChbTG9jYXRpb25IYXNoYmFuZ0luSHRtbDVVcmwsIExvY2F0aW9uSGFzaGJhbmdVcmwsIExvY2F0aW9uSHRtbDVVcmxdLCBmdW5jdGlvbihMb2NhdGlvbikge1xuICBMb2NhdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGxvY2F0aW9uUHJvdG90eXBlKTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb24jc3RhdGVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGdldHRlciAvIHNldHRlci5cbiAgICpcbiAgICogUmV0dXJuIHRoZSBoaXN0b3J5IHN0YXRlIG9iamVjdCB3aGVuIGNhbGxlZCB3aXRob3V0IGFueSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIENoYW5nZSB0aGUgaGlzdG9yeSBzdGF0ZSBvYmplY3Qgd2hlbiBjYWxsZWQgd2l0aCBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gYCRsb2NhdGlvbmAuXG4gICAqIFRoZSBzdGF0ZSBvYmplY3QgaXMgbGF0ZXIgcGFzc2VkIHRvIGBwdXNoU3RhdGVgIG9yIGByZXBsYWNlU3RhdGVgLlxuICAgKlxuICAgKiBOT1RFOiBUaGlzIG1ldGhvZCBpcyBzdXBwb3J0ZWQgb25seSBpbiBIVE1MNSBtb2RlIGFuZCBvbmx5IGluIGJyb3dzZXJzIHN1cHBvcnRpbmdcbiAgICogdGhlIEhUTUw1IEhpc3RvcnkgQVBJIChpLmUuIG1ldGhvZHMgYHB1c2hTdGF0ZWAgYW5kIGByZXBsYWNlU3RhdGVgKS4gSWYgeW91IG5lZWQgdG8gc3VwcG9ydFxuICAgKiBvbGRlciBicm93c2VycyAobGlrZSBJRTkgb3IgQW5kcm9pZCA8IDQuMCksIGRvbid0IHVzZSB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3Q9fSBzdGF0ZSBTdGF0ZSBvYmplY3QgZm9yIHB1c2hTdGF0ZSBvciByZXBsYWNlU3RhdGVcbiAgICogQHJldHVybiB7b2JqZWN0fSBzdGF0ZVxuICAgKi9cbiAgTG9jYXRpb24ucHJvdG90eXBlLnN0YXRlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLiQkc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKExvY2F0aW9uICE9PSBMb2NhdGlvbkh0bWw1VXJsIHx8ICF0aGlzLiQkaHRtbDUpIHtcbiAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9zdGF0ZScsICdIaXN0b3J5IEFQSSBzdGF0ZSBzdXBwb3J0IGlzIGF2YWlsYWJsZSBvbmx5ICcgK1xuICAgICAgICAnaW4gSFRNTDUgbW9kZSBhbmQgb25seSBpbiBicm93c2VycyBzdXBwb3J0aW5nIEhUTUw1IEhpc3RvcnkgQVBJJyk7XG4gICAgfVxuICAgIC8vIFRoZSB1c2VyIG1pZ2h0IG1vZGlmeSBgc3RhdGVPYmplY3RgIGFmdGVyIGludm9raW5nIGAkbG9jYXRpb24uc3RhdGUoc3RhdGVPYmplY3QpYFxuICAgIC8vIGJ1dCB3ZSdyZSBjaGFuZ2luZyB0aGUgJCRzdGF0ZSByZWZlcmVuY2UgdG8gJGJyb3dzZXIuc3RhdGUoKSBkdXJpbmcgdGhlICRkaWdlc3RcbiAgICAvLyBzbyB0aGUgbW9kaWZpY2F0aW9uIHdpbmRvdyBpcyBuYXJyb3cuXG4gICAgdGhpcy4kJHN0YXRlID0gaXNVbmRlZmluZWQoc3RhdGUpID8gbnVsbCA6IHN0YXRlO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuXG5mdW5jdGlvbiBsb2NhdGlvbkdldHRlcihwcm9wZXJ0eSkge1xuICByZXR1cm4gLyoqIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW3Byb3BlcnR5XTtcbiAgfTtcbn1cblxuXG5mdW5jdGlvbiBsb2NhdGlvbkdldHRlclNldHRlcihwcm9wZXJ0eSwgcHJlcHJvY2Vzcykge1xuICByZXR1cm4gLyoqIEB0aGlzICovIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHldO1xuICAgIH1cblxuICAgIHRoaXNbcHJvcGVydHldID0gcHJlcHJvY2Vzcyh2YWx1ZSk7XG4gICAgdGhpcy4kJGNvbXBvc2UoKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRsb2NhdGlvblxuICpcbiAqIEByZXF1aXJlcyAkcm9vdEVsZW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSAkbG9jYXRpb24gc2VydmljZSBwYXJzZXMgdGhlIFVSTCBpbiB0aGUgYnJvd3NlciBhZGRyZXNzIGJhciAoYmFzZWQgb24gdGhlXG4gKiBbd2luZG93LmxvY2F0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi93aW5kb3cubG9jYXRpb24pKSBhbmQgbWFrZXMgdGhlIFVSTFxuICogYXZhaWxhYmxlIHRvIHlvdXIgYXBwbGljYXRpb24uIENoYW5nZXMgdG8gdGhlIFVSTCBpbiB0aGUgYWRkcmVzcyBiYXIgYXJlIHJlZmxlY3RlZCBpbnRvXG4gKiAkbG9jYXRpb24gc2VydmljZSBhbmQgY2hhbmdlcyB0byAkbG9jYXRpb24gYXJlIHJlZmxlY3RlZCBpbnRvIHRoZSBicm93c2VyIGFkZHJlc3MgYmFyLlxuICpcbiAqICoqVGhlICRsb2NhdGlvbiBzZXJ2aWNlOioqXG4gKlxuICogLSBFeHBvc2VzIHRoZSBjdXJyZW50IFVSTCBpbiB0aGUgYnJvd3NlciBhZGRyZXNzIGJhciwgc28geW91IGNhblxuICogICAtIFdhdGNoIGFuZCBvYnNlcnZlIHRoZSBVUkwuXG4gKiAgIC0gQ2hhbmdlIHRoZSBVUkwuXG4gKiAtIFN5bmNocm9uaXplcyB0aGUgVVJMIHdpdGggdGhlIGJyb3dzZXIgd2hlbiB0aGUgdXNlclxuICogICAtIENoYW5nZXMgdGhlIGFkZHJlc3MgYmFyLlxuICogICAtIENsaWNrcyB0aGUgYmFjayBvciBmb3J3YXJkIGJ1dHRvbiAob3IgY2xpY2tzIGEgSGlzdG9yeSBsaW5rKS5cbiAqICAgLSBDbGlja3Mgb24gYSBsaW5rLlxuICogLSBSZXByZXNlbnRzIHRoZSBVUkwgb2JqZWN0IGFzIGEgc2V0IG9mIG1ldGhvZHMgKHByb3RvY29sLCBob3N0LCBwb3J0LCBwYXRoLCBzZWFyY2gsIGhhc2gpLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uIERldmVsb3BlciBHdWlkZTogVXNpbmcgJGxvY2F0aW9ufVxuICovXG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZSB0aGUgYCRsb2NhdGlvblByb3ZpZGVyYCB0byBjb25maWd1cmUgaG93IHRoZSBhcHBsaWNhdGlvbiBkZWVwIGxpbmtpbmcgcGF0aHMgYXJlIHN0b3JlZC5cbiAqL1xuZnVuY3Rpb24gJExvY2F0aW9uUHJvdmlkZXIoKSB7XG4gIHZhciBoYXNoUHJlZml4ID0gJyEnLFxuICAgICAgaHRtbDVNb2RlID0ge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZUJhc2U6IHRydWUsXG4gICAgICAgIHJld3JpdGVMaW5rczogdHJ1ZVxuICAgICAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlciNoYXNoUHJlZml4XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZpeCBpcyBgJyEnYC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBwcmVmaXggUHJlZml4IGZvciBoYXNoIHBhcnQgKGNvbnRhaW5pbmcgcGF0aCBhbmQgc2VhcmNoKVxuICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlclxuICAgKi9cbiAgdGhpcy5oYXNoUHJlZml4ID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgaWYgKGlzRGVmaW5lZChwcmVmaXgpKSB7XG4gICAgICBoYXNoUHJlZml4ID0gcHJlZml4O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBoYXNoUHJlZml4O1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkbG9jYXRpb25Qcm92aWRlciNodG1sNU1vZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58T2JqZWN0KT19IG1vZGUgSWYgYm9vbGVhbiwgc2V0cyBgaHRtbDVNb2RlLmVuYWJsZWRgIHRvIHZhbHVlLlxuICAgKiAgIElmIG9iamVjdCwgc2V0cyBgZW5hYmxlZGAsIGByZXF1aXJlQmFzZWAgYW5kIGByZXdyaXRlTGlua3NgIHRvIHJlc3BlY3RpdmUgdmFsdWVzLiBTdXBwb3J0ZWRcbiAgICogICBwcm9wZXJ0aWVzOlxuICAgKiAgIC0gKiplbmFibGVkKiog4oCTIGB7Ym9vbGVhbn1gIOKAkyAoZGVmYXVsdDogZmFsc2UpIElmIHRydWUsIHdpbGwgcmVseSBvbiBgaGlzdG9yeS5wdXNoU3RhdGVgIHRvXG4gICAqICAgICBjaGFuZ2UgdXJscyB3aGVyZSBzdXBwb3J0ZWQuIFdpbGwgZmFsbCBiYWNrIHRvIGhhc2gtcHJlZml4ZWQgcGF0aHMgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3RcbiAgICogICAgIHN1cHBvcnQgYHB1c2hTdGF0ZWAuXG4gICAqICAgLSAqKnJlcXVpcmVCYXNlKiogLSBge2Jvb2xlYW59YCAtIChkZWZhdWx0OiBgdHJ1ZWApIFdoZW4gaHRtbDVNb2RlIGlzIGVuYWJsZWQsIHNwZWNpZmllc1xuICAgKiAgICAgd2hldGhlciBvciBub3QgYSA8YmFzZT4gdGFnIGlzIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQuIElmIGBlbmFibGVkYCBhbmQgYHJlcXVpcmVCYXNlYCBhcmVcbiAgICogICAgIHRydWUsIGFuZCBhIGJhc2UgdGFnIGlzIG5vdCBwcmVzZW50LCBhbiBlcnJvciB3aWxsIGJlIHRocm93biB3aGVuIGAkbG9jYXRpb25gIGlzIGluamVjdGVkLlxuICAgKiAgICAgU2VlIHRoZSB7QGxpbmsgZ3VpZGUvJGxvY2F0aW9uICRsb2NhdGlvbiBndWlkZSBmb3IgbW9yZSBpbmZvcm1hdGlvbn1cbiAgICogICAtICoqcmV3cml0ZUxpbmtzKiogLSBge2Jvb2xlYW58c3RyaW5nfWAgLSAoZGVmYXVsdDogYHRydWVgKSBXaGVuIGh0bWw1TW9kZSBpcyBlbmFibGVkLFxuICAgKiAgICAgZW5hYmxlcy9kaXNhYmxlcyBVUkwgcmV3cml0aW5nIGZvciByZWxhdGl2ZSBsaW5rcy4gSWYgc2V0IHRvIGEgc3RyaW5nLCBVUkwgcmV3cml0aW5nIHdpbGxcbiAgICogICAgIG9ubHkgaGFwcGVuIG9uIGxpbmtzIHdpdGggYW4gYXR0cmlidXRlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgc2V0XG4gICAqICAgICB0byBgJ2ludGVybmFsLWxpbmsnYCwgdGhlbiB0aGUgVVJMIHdpbGwgb25seSBiZSByZXdyaXR0ZW4gZm9yIGA8YSBpbnRlcm5hbC1saW5rPmAgbGlua3MuXG4gICAqICAgICBOb3RlIHRoYXQgW2F0dHJpYnV0ZSBuYW1lIG5vcm1hbGl6YXRpb25dKGd1aWRlL2RpcmVjdGl2ZSNub3JtYWxpemF0aW9uKSBkb2VzIG5vdCBhcHBseVxuICAgKiAgICAgaGVyZSwgc28gYCdpbnRlcm5hbExpbmsnYCB3aWxsICoqbm90KiogbWF0Y2ggYCdpbnRlcm5hbC1saW5rJ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IGh0bWw1TW9kZSBvYmplY3QgaWYgdXNlZCBhcyBnZXR0ZXIgb3IgaXRzZWxmIChjaGFpbmluZykgaWYgdXNlZCBhcyBzZXR0ZXJcbiAgICovXG4gIHRoaXMuaHRtbDVNb2RlID0gZnVuY3Rpb24obW9kZSkge1xuICAgIGlmIChpc0Jvb2xlYW4obW9kZSkpIHtcbiAgICAgIGh0bWw1TW9kZS5lbmFibGVkID0gbW9kZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QobW9kZSkpIHtcblxuICAgICAgaWYgKGlzQm9vbGVhbihtb2RlLmVuYWJsZWQpKSB7XG4gICAgICAgIGh0bWw1TW9kZS5lbmFibGVkID0gbW9kZS5lbmFibGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCb29sZWFuKG1vZGUucmVxdWlyZUJhc2UpKSB7XG4gICAgICAgIGh0bWw1TW9kZS5yZXF1aXJlQmFzZSA9IG1vZGUucmVxdWlyZUJhc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Jvb2xlYW4obW9kZS5yZXdyaXRlTGlua3MpIHx8IGlzU3RyaW5nKG1vZGUucmV3cml0ZUxpbmtzKSkge1xuICAgICAgICBodG1sNU1vZGUucmV3cml0ZUxpbmtzID0gbW9kZS5yZXdyaXRlTGlua3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbDVNb2RlO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIGV2ZW50XG4gICAqIEBuYW1lICRsb2NhdGlvbiMkbG9jYXRpb25DaGFuZ2VTdGFydFxuICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCcm9hZGNhc3RlZCBiZWZvcmUgYSBVUkwgd2lsbCBjaGFuZ2UuXG4gICAqXG4gICAqIFRoaXMgY2hhbmdlIGNhbiBiZSBwcmV2ZW50ZWQgYnkgY2FsbGluZ1xuICAgKiBgcHJldmVudERlZmF1bHRgIG1ldGhvZCBvZiB0aGUgZXZlbnQuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259IGZvciBtb3JlXG4gICAqIGRldGFpbHMgYWJvdXQgZXZlbnQgb2JqZWN0LiBVcG9uIHN1Y2Nlc3NmdWwgY2hhbmdlXG4gICAqIHtAbGluayBuZy4kbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyAkbG9jYXRpb25DaGFuZ2VTdWNjZXNzfSBpcyBmaXJlZC5cbiAgICpcbiAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW5cbiAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBldmVudFxuICAgKiBAbmFtZSAkbG9jYXRpb24jJGxvY2F0aW9uQ2hhbmdlU3VjY2Vzc1xuICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiByb290IHNjb3BlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCcm9hZGNhc3RlZCBhZnRlciBhIFVSTCB3YXMgY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIGBuZXdTdGF0ZWAgYW5kIGBvbGRTdGF0ZWAgcGFyYW1ldGVycyBtYXkgYmUgZGVmaW5lZCBvbmx5IGluIEhUTUw1IG1vZGUgYW5kIHdoZW5cbiAgICogdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdVcmwgTmV3IFVSTFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFVybCBVUkwgdGhhdCB3YXMgYmVmb3JlIGl0IHdhcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5ld1N0YXRlIE5ldyBoaXN0b3J5IHN0YXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9sZFN0YXRlIEhpc3Rvcnkgc3RhdGUgb2JqZWN0IHRoYXQgd2FzIGJlZm9yZSBpdCB3YXMgY2hhbmdlZC5cbiAgICovXG5cbiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRyb290RWxlbWVudCcsICckd2luZG93JyxcbiAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICRicm93c2VyLCAkc25pZmZlciwgJHJvb3RFbGVtZW50LCAkd2luZG93KSB7XG4gICAgdmFyICRsb2NhdGlvbixcbiAgICAgICAgTG9jYXRpb25Nb2RlLFxuICAgICAgICBiYXNlSHJlZiA9ICRicm93c2VyLmJhc2VIcmVmKCksIC8vIGlmIGJhc2VbaHJlZl0gaXMgdW5kZWZpbmVkLCBpdCBkZWZhdWx0cyB0byAnJ1xuICAgICAgICBpbml0aWFsVXJsID0gJGJyb3dzZXIudXJsKCksXG4gICAgICAgIGFwcEJhc2U7XG5cbiAgICBpZiAoaHRtbDVNb2RlLmVuYWJsZWQpIHtcbiAgICAgIGlmICghYmFzZUhyZWYgJiYgaHRtbDVNb2RlLnJlcXVpcmVCYXNlKSB7XG4gICAgICAgIHRocm93ICRsb2NhdGlvbk1pbkVycignbm9iYXNlJyxcbiAgICAgICAgICAnJGxvY2F0aW9uIGluIEhUTUw1IG1vZGUgcmVxdWlyZXMgYSA8YmFzZT4gdGFnIHRvIGJlIHByZXNlbnQhJyk7XG4gICAgICB9XG4gICAgICBhcHBCYXNlID0gc2VydmVyQmFzZShpbml0aWFsVXJsKSArIChiYXNlSHJlZiB8fCAnLycpO1xuICAgICAgTG9jYXRpb25Nb2RlID0gJHNuaWZmZXIuaGlzdG9yeSA/IExvY2F0aW9uSHRtbDVVcmwgOiBMb2NhdGlvbkhhc2hiYW5nSW5IdG1sNVVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwQmFzZSA9IHN0cmlwSGFzaChpbml0aWFsVXJsKTtcbiAgICAgIExvY2F0aW9uTW9kZSA9IExvY2F0aW9uSGFzaGJhbmdVcmw7XG4gICAgfVxuICAgIHZhciBhcHBCYXNlTm9GaWxlID0gc3RyaXBGaWxlKGFwcEJhc2UpO1xuXG4gICAgJGxvY2F0aW9uID0gbmV3IExvY2F0aW9uTW9kZShhcHBCYXNlLCBhcHBCYXNlTm9GaWxlLCAnIycgKyBoYXNoUHJlZml4KTtcbiAgICAkbG9jYXRpb24uJCRwYXJzZUxpbmtVcmwoaW5pdGlhbFVybCwgaW5pdGlhbFVybCk7XG5cbiAgICAkbG9jYXRpb24uJCRzdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7XG5cbiAgICB2YXIgSUdOT1JFX1VSSV9SRUdFWFAgPSAvXlxccyooamF2YXNjcmlwdHxtYWlsdG8pOi9pO1xuXG4gICAgZnVuY3Rpb24gc2V0QnJvd3NlclVybFdpdGhGYWxsYmFjayh1cmwsIHJlcGxhY2UsIHN0YXRlKSB7XG4gICAgICB2YXIgb2xkVXJsID0gJGxvY2F0aW9uLnVybCgpO1xuICAgICAgdmFyIG9sZFN0YXRlID0gJGxvY2F0aW9uLiQkc3RhdGU7XG4gICAgICB0cnkge1xuICAgICAgICAkYnJvd3Nlci51cmwodXJsLCByZXBsYWNlLCBzdGF0ZSk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlICRsb2NhdGlvbi5zdGF0ZSgpIHJldHVybnMgcmVmZXJlbnRpYWxseSBpZGVudGljYWwgKG5vdCBqdXN0IGRlZXBseSBlcXVhbClcbiAgICAgICAgLy8gc3RhdGUgb2JqZWN0OyB0aGlzIG1ha2VzIHBvc3NpYmxlIHF1aWNrIGNoZWNraW5nIGlmIHRoZSBzdGF0ZSBjaGFuZ2VkIGluIHRoZSBkaWdlc3RcbiAgICAgICAgLy8gbG9vcC4gQ2hlY2tpbmcgZGVlcCBlcXVhbGl0eSB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLlxuICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9ICRicm93c2VyLnN0YXRlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgb2xkIHZhbHVlcyBpZiBwdXNoU3RhdGUgZmFpbHNcbiAgICAgICAgJGxvY2F0aW9uLnVybChvbGRVcmwpO1xuICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlO1xuXG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJHJvb3RFbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgcmV3cml0ZUxpbmtzID0gaHRtbDVNb2RlLnJld3JpdGVMaW5rcztcbiAgICAgIC8vIFRPRE8odm9qdGEpOiByZXdyaXRlIGxpbmsgd2hlbiBvcGVuaW5nIGluIG5ldyB0YWIvd2luZG93IChpbiBsZWdhY3kgYnJvd3NlcilcbiAgICAgIC8vIGN1cnJlbnRseSB3ZSBvcGVuIG5pY2UgdXJsIGxpbmsgYW5kIHJlZGlyZWN0IHRoZW5cblxuICAgICAgaWYgKCFyZXdyaXRlTGlua3MgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LndoaWNoID09PSAyIHx8IGV2ZW50LmJ1dHRvbiA9PT0gMikgcmV0dXJuO1xuXG4gICAgICB2YXIgZWxtID0ganFMaXRlKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIC8vIHRyYXZlcnNlIHRoZSBET00gdXAgdG8gZmluZCBmaXJzdCBBIHRhZ1xuICAgICAgd2hpbGUgKG5vZGVOYW1lXyhlbG1bMF0pICE9PSAnYScpIHtcbiAgICAgICAgLy8gaWdub3JlIHJld3JpdGluZyBpZiBubyBBIHRhZyAocmVhY2hlZCByb290IGVsZW1lbnQsIG9yIG5vIHBhcmVudCAtIHJlbW92ZWQgZnJvbSBkb2N1bWVudClcbiAgICAgICAgaWYgKGVsbVswXSA9PT0gJHJvb3RFbGVtZW50WzBdIHx8ICEoZWxtID0gZWxtLnBhcmVudCgpKVswXSkgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdHJpbmcocmV3cml0ZUxpbmtzKSAmJiBpc1VuZGVmaW5lZChlbG0uYXR0cihyZXdyaXRlTGlua3MpKSkgcmV0dXJuO1xuXG4gICAgICB2YXIgYWJzSHJlZiA9IGVsbS5wcm9wKCdocmVmJyk7XG4gICAgICAvLyBnZXQgdGhlIGFjdHVhbCBocmVmIGF0dHJpYnV0ZSAtIHNlZVxuICAgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2RkMzQ3MTQ4KHY9dnMuODUpLmFzcHhcbiAgICAgIHZhciByZWxIcmVmID0gZWxtLmF0dHIoJ2hyZWYnKSB8fCBlbG0uYXR0cigneGxpbms6aHJlZicpO1xuXG4gICAgICBpZiAoaXNPYmplY3QoYWJzSHJlZikgJiYgYWJzSHJlZi50b1N0cmluZygpID09PSAnW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10nKSB7XG4gICAgICAgIC8vIFNWR0FuaW1hdGVkU3RyaW5nLmFuaW1WYWwgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBTVkdBbmltYXRlZFN0cmluZy5iYXNlVmFsLCB1bmxlc3MgZHVyaW5nXG4gICAgICAgIC8vIGFuIGFuaW1hdGlvbi5cbiAgICAgICAgYWJzSHJlZiA9IHVybFJlc29sdmUoYWJzSHJlZi5hbmltVmFsKS5ocmVmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgd2hlbiB1cmwgaXMgc3RhcnRlZCB3aXRoIGphdmFzY3JpcHQ6IG9yIG1haWx0bzpcbiAgICAgIGlmIChJR05PUkVfVVJJX1JFR0VYUC50ZXN0KGFic0hyZWYpKSByZXR1cm47XG5cbiAgICAgIGlmIChhYnNIcmVmICYmICFlbG0uYXR0cigndGFyZ2V0JykgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIGlmICgkbG9jYXRpb24uJCRwYXJzZUxpbmtVcmwoYWJzSHJlZiwgcmVsSHJlZikpIHtcbiAgICAgICAgICAvLyBXZSBkbyBhIHByZXZlbnREZWZhdWx0IGZvciBhbGwgdXJscyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uLFxuICAgICAgICAgIC8vIGluIGh0bWw1bW9kZSBhbmQgYWxzbyB3aXRob3V0LCBzbyB0aGF0IHdlIGFyZSBhYmxlIHRvIGFib3J0IG5hdmlnYXRpb24gd2l0aG91dFxuICAgICAgICAgIC8vIGdldHRpbmcgZG91YmxlIGVudHJpZXMgaW4gdGhlIGxvY2F0aW9uIGhpc3RvcnkuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvLyB1cGRhdGUgbG9jYXRpb24gbWFudWFsbHlcbiAgICAgICAgICBpZiAoJGxvY2F0aW9uLmFic1VybCgpICE9PSAkYnJvd3Nlci51cmwoKSkge1xuICAgICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHkoKTtcbiAgICAgICAgICAgIC8vIGhhY2sgdG8gd29yayBhcm91bmQgRkY2IGJ1ZyA2ODQyMDggd2hlbiBzY2VuYXJpbyBydW5uZXIgY2xpY2tzIG9uIGxpbmtzXG4gICAgICAgICAgICAkd2luZG93LmFuZ3VsYXJbJ2ZmLTY4NDIwOC1wcmV2ZW50RGVmYXVsdCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLy8gcmV3cml0ZSBoYXNoYmFuZyB1cmwgPD4gaHRtbDUgdXJsXG4gICAgaWYgKHRyaW1FbXB0eUhhc2goJGxvY2F0aW9uLmFic1VybCgpKSAhPT0gdHJpbUVtcHR5SGFzaChpbml0aWFsVXJsKSkge1xuICAgICAgJGJyb3dzZXIudXJsKCRsb2NhdGlvbi5hYnNVcmwoKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxpemluZyA9IHRydWU7XG5cbiAgICAvLyB1cGRhdGUgJGxvY2F0aW9uIHdoZW4gJGJyb3dzZXIgdXJsIGNoYW5nZXNcbiAgICAkYnJvd3Nlci5vblVybENoYW5nZShmdW5jdGlvbihuZXdVcmwsIG5ld1N0YXRlKSB7XG5cbiAgICAgIGlmICghc3RhcnRzV2l0aChuZXdVcmwsIGFwcEJhc2VOb0ZpbGUpKSB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBuYXZpZ2F0aW5nIG91dHNpZGUgb2YgdGhlIGFwcCB0aGVuIGZvcmNlIGEgcmVsb2FkXG4gICAgICAgICR3aW5kb3cubG9jYXRpb24uaHJlZiA9IG5ld1VybDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkcm9vdFNjb3BlLiRldmFsQXN5bmMoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvbGRVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7XG4gICAgICAgIHZhciBvbGRTdGF0ZSA9ICRsb2NhdGlvbi4kJHN0YXRlO1xuICAgICAgICB2YXIgZGVmYXVsdFByZXZlbnRlZDtcbiAgICAgICAgbmV3VXJsID0gdHJpbUVtcHR5SGFzaChuZXdVcmwpO1xuICAgICAgICAkbG9jYXRpb24uJCRwYXJzZShuZXdVcmwpO1xuICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG5ld1N0YXRlO1xuXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgbmV3VXJsLCBvbGRVcmwsXG4gICAgICAgICAgICBuZXdTdGF0ZSwgb2xkU3RhdGUpLmRlZmF1bHRQcmV2ZW50ZWQ7XG5cbiAgICAgICAgLy8gaWYgdGhlIGxvY2F0aW9uIHdhcyBjaGFuZ2VkIGJ5IGEgYCRsb2NhdGlvbkNoYW5nZVN0YXJ0YCBoYW5kbGVyIHRoZW4gc3RvcFxuICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgbG9jYXRpb24gY2hhbmdlXG4gICAgICAgIGlmICgkbG9jYXRpb24uYWJzVXJsKCkgIT09IG5ld1VybCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgJGxvY2F0aW9uLiQkcGFyc2Uob2xkVXJsKTtcbiAgICAgICAgICAkbG9jYXRpb24uJCRzdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgICAgIHNldEJyb3dzZXJVcmxXaXRoRmFsbGJhY2sob2xkVXJsLCBmYWxzZSwgb2xkU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluaXRpYWxpemluZyA9IGZhbHNlO1xuICAgICAgICAgIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCEkcm9vdFNjb3BlLiQkcGhhc2UpICRyb290U2NvcGUuJGRpZ2VzdCgpO1xuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlIGJyb3dzZXJcbiAgICAkcm9vdFNjb3BlLiR3YXRjaChmdW5jdGlvbiAkbG9jYXRpb25XYXRjaCgpIHtcbiAgICAgIHZhciBvbGRVcmwgPSB0cmltRW1wdHlIYXNoKCRicm93c2VyLnVybCgpKTtcbiAgICAgIHZhciBuZXdVcmwgPSB0cmltRW1wdHlIYXNoKCRsb2NhdGlvbi5hYnNVcmwoKSk7XG4gICAgICB2YXIgb2xkU3RhdGUgPSAkYnJvd3Nlci5zdGF0ZSgpO1xuICAgICAgdmFyIGN1cnJlbnRSZXBsYWNlID0gJGxvY2F0aW9uLiQkcmVwbGFjZTtcbiAgICAgIHZhciB1cmxPclN0YXRlQ2hhbmdlZCA9IG9sZFVybCAhPT0gbmV3VXJsIHx8XG4gICAgICAgICgkbG9jYXRpb24uJCRodG1sNSAmJiAkc25pZmZlci5oaXN0b3J5ICYmIG9sZFN0YXRlICE9PSAkbG9jYXRpb24uJCRzdGF0ZSk7XG5cbiAgICAgIGlmIChpbml0aWFsaXppbmcgfHwgdXJsT3JTdGF0ZUNoYW5nZWQpIHtcbiAgICAgICAgaW5pdGlhbGl6aW5nID0gZmFsc2U7XG5cbiAgICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBuZXdVcmwgPSAkbG9jYXRpb24uYWJzVXJsKCk7XG4gICAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgbmV3VXJsLCBvbGRVcmwsXG4gICAgICAgICAgICAgICRsb2NhdGlvbi4kJHN0YXRlLCBvbGRTdGF0ZSkuZGVmYXVsdFByZXZlbnRlZDtcblxuICAgICAgICAgIC8vIGlmIHRoZSBsb2NhdGlvbiB3YXMgY2hhbmdlZCBieSBhIGAkbG9jYXRpb25DaGFuZ2VTdGFydGAgaGFuZGxlciB0aGVuIHN0b3BcbiAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgbG9jYXRpb24gY2hhbmdlXG4gICAgICAgICAgaWYgKCRsb2NhdGlvbi5hYnNVcmwoKSAhPT0gbmV3VXJsKSByZXR1cm47XG5cbiAgICAgICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgJGxvY2F0aW9uLiQkcGFyc2Uob2xkVXJsKTtcbiAgICAgICAgICAgICRsb2NhdGlvbi4kJHN0YXRlID0gb2xkU3RhdGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1cmxPclN0YXRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgICBzZXRCcm93c2VyVXJsV2l0aEZhbGxiYWNrKG5ld1VybCwgY3VycmVudFJlcGxhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkU3RhdGUgPT09ICRsb2NhdGlvbi4kJHN0YXRlID8gbnVsbCA6ICRsb2NhdGlvbi4kJHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgJGxvY2F0aW9uLiQkcmVwbGFjZSA9IGZhbHNlO1xuXG4gICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHJldHVybiBhbnl0aGluZyBiZWNhdXNlICRldmFsQXN5bmMgd2lsbCBtYWtlIHRoZSBkaWdlc3QgbG9vcCBkaXJ0eSB3aGVuXG4gICAgICAvLyB0aGVyZSBpcyBhIGNoYW5nZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRsb2NhdGlvbjtcblxuICAgIGZ1bmN0aW9uIGFmdGVyTG9jYXRpb25DaGFuZ2Uob2xkVXJsLCBvbGRTdGF0ZSkge1xuICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckbG9jYXRpb25DaGFuZ2VTdWNjZXNzJywgJGxvY2F0aW9uLmFic1VybCgpLCBvbGRVcmwsXG4gICAgICAgICRsb2NhdGlvbi4kJHN0YXRlLCBvbGRTdGF0ZSk7XG4gICAgfVxufV07XG59XG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRsb2dcbiAqIEByZXF1aXJlcyAkd2luZG93XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTaW1wbGUgc2VydmljZSBmb3IgbG9nZ2luZy4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzYWZlbHkgd3JpdGVzIHRoZSBtZXNzYWdlXG4gKiBpbnRvIHRoZSBicm93c2VyJ3MgY29uc29sZSAoaWYgcHJlc2VudCkuXG4gKlxuICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHNlcnZpY2UgaXMgdG8gc2ltcGxpZnkgZGVidWdnaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcuXG4gKlxuICogVGhlIGRlZmF1bHQgaXMgdG8gbG9nIGBkZWJ1Z2AgbWVzc2FnZXMuIFlvdSBjYW4gdXNlXG4gKiB7QGxpbmsgbmcuJGxvZ1Byb3ZpZGVyIG5nLiRsb2dQcm92aWRlciNkZWJ1Z0VuYWJsZWR9IHRvIGNoYW5nZSB0aGlzLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJsb2dFeGFtcGxlXCIgbmFtZT1cImxvZy1zZXJ2aWNlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnbG9nRXhhbXBsZScsIFtdKVxuICAgICAgICAgLmNvbnRyb2xsZXIoJ0xvZ0NvbnRyb2xsZXInLCBbJyRzY29wZScsICckbG9nJywgZnVuY3Rpb24oJHNjb3BlLCAkbG9nKSB7XG4gICAgICAgICAgICRzY29wZS4kbG9nID0gJGxvZztcbiAgICAgICAgICAgJHNjb3BlLm1lc3NhZ2UgPSAnSGVsbG8gV29ybGQhJztcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkxvZ0NvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxwPlJlbG9hZCB0aGlzIHBhZ2Ugd2l0aCBvcGVuIGNvbnNvbGUsIGVudGVyIHRleHQgYW5kIGhpdCB0aGUgbG9nIGJ1dHRvbi4uLjwvcD5cbiAgICAgICAgIDxsYWJlbD5NZXNzYWdlOlxuICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJtZXNzYWdlXCIgLz48L2xhYmVsPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cIiRsb2cubG9nKG1lc3NhZ2UpXCI+bG9nPC9idXR0b24+XG4gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwiJGxvZy53YXJuKG1lc3NhZ2UpXCI+d2FybjwvYnV0dG9uPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cIiRsb2cuaW5mbyhtZXNzYWdlKVwiPmluZm88L2J1dHRvbj5cbiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCIkbG9nLmVycm9yKG1lc3NhZ2UpXCI+ZXJyb3I8L2J1dHRvbj5cbiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCIkbG9nLmRlYnVnKG1lc3NhZ2UpXCI+ZGVidWc8L2J1dHRvbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkbG9nUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2UgdGhlIGAkbG9nUHJvdmlkZXJgIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGFwcGxpY2F0aW9uIGxvZ3MgbWVzc2FnZXNcbiAqL1xuZnVuY3Rpb24gJExvZ1Byb3ZpZGVyKCkge1xuICB2YXIgZGVidWcgPSB0cnVlLFxuICAgICAgc2VsZiA9IHRoaXM7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGxvZ1Byb3ZpZGVyI2RlYnVnRW5hYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIHtib29sZWFuPX0gZmxhZyBlbmFibGUgb3IgZGlzYWJsZSBkZWJ1ZyBsZXZlbCBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyB7Kn0gY3VycmVudCB2YWx1ZSBpZiB1c2VkIGFzIGdldHRlciBvciBpdHNlbGYgKGNoYWluaW5nKSBpZiB1c2VkIGFzIHNldHRlclxuICAgKi9cbiAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgaWYgKGlzRGVmaW5lZChmbGFnKSkge1xuICAgICAgZGVidWcgPSBmbGFnO1xuICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVidWc7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuJGdldCA9IFsnJHdpbmRvdycsIGZ1bmN0aW9uKCR3aW5kb3cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkbG9nI2xvZ1xuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogV3JpdGUgYSBsb2cgbWVzc2FnZVxuICAgICAgICovXG4gICAgICBsb2c6IGNvbnNvbGVMb2coJ2xvZycpLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRsb2cjaW5mb1xuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogV3JpdGUgYW4gaW5mb3JtYXRpb24gbWVzc2FnZVxuICAgICAgICovXG4gICAgICBpbmZvOiBjb25zb2xlTG9nKCdpbmZvJyksXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGxvZyN3YXJuXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBXcml0ZSBhIHdhcm5pbmcgbWVzc2FnZVxuICAgICAgICovXG4gICAgICB3YXJuOiBjb25zb2xlTG9nKCd3YXJuJyksXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJGxvZyNlcnJvclxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogV3JpdGUgYW4gZXJyb3IgbWVzc2FnZVxuICAgICAgICovXG4gICAgICBlcnJvcjogY29uc29sZUxvZygnZXJyb3InKSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkbG9nI2RlYnVnXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBXcml0ZSBhIGRlYnVnIG1lc3NhZ2VcbiAgICAgICAqL1xuICAgICAgZGVidWc6IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZuID0gY29uc29sZUxvZygnZGVidWcnKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICBmbi5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pKClcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0RXJyb3IoYXJnKSB7XG4gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgaWYgKGFyZy5zdGFjaykge1xuICAgICAgICAgIGFyZyA9IChhcmcubWVzc2FnZSAmJiBhcmcuc3RhY2suaW5kZXhPZihhcmcubWVzc2FnZSkgPT09IC0xKVxuICAgICAgICAgICAgICA/ICdFcnJvcjogJyArIGFyZy5tZXNzYWdlICsgJ1xcbicgKyBhcmcuc3RhY2tcbiAgICAgICAgICAgICAgOiBhcmcuc3RhY2s7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJnLnNvdXJjZVVSTCkge1xuICAgICAgICAgIGFyZyA9IGFyZy5tZXNzYWdlICsgJ1xcbicgKyBhcmcuc291cmNlVVJMICsgJzonICsgYXJnLmxpbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uc29sZUxvZyh0eXBlKSB7XG4gICAgICB2YXIgY29uc29sZSA9ICR3aW5kb3cuY29uc29sZSB8fCB7fSxcbiAgICAgICAgICBsb2dGbiA9IGNvbnNvbGVbdHlwZV0gfHwgY29uc29sZS5sb2cgfHwgbm9vcCxcbiAgICAgICAgICBoYXNBcHBseSA9IGZhbHNlO1xuXG4gICAgICAvLyBOb3RlOiByZWFkaW5nIGxvZ0ZuLmFwcGx5IHRocm93cyBhbiBlcnJvciBpbiBJRTExIGluIElFOCBkb2N1bWVudCBtb2RlLlxuICAgICAgLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IGNvbnNvbGUubG9nIGhhcyB0eXBlIFwib2JqZWN0XCIgaW4gSUU4Li4uXG4gICAgICB0cnkge1xuICAgICAgICBoYXNBcHBseSA9ICEhbG9nRm4uYXBwbHk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxuICAgICAgaWYgKGhhc0FwcGx5KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgIGZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChmb3JtYXRFcnJvcihhcmcpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbG9nRm4uYXBwbHkoY29uc29sZSwgYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIHdlIGFyZSBJRSB3aGljaCBlaXRoZXIgZG9lc24ndCBoYXZlIHdpbmRvdy5jb25zb2xlID0+IHRoaXMgaXMgbm9vcCBhbmQgd2UgZG8gbm90aGluZyxcbiAgICAgIC8vIG9yIHdlIGFyZSBJRSB3aGVyZSBjb25zb2xlLmxvZyBkb2Vzbid0IGhhdmUgYXBwbHkgc28gd2UgbG9nIGF0IGxlYXN0IGZpcnN0IDIgYXJnc1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZzEsIGFyZzIpIHtcbiAgICAgICAgbG9nRm4oYXJnMSwgYXJnMiA9PSBudWxsID8gJycgOiBhcmcyKTtcbiAgICAgIH07XG4gICAgfVxuICB9XTtcbn1cblxuLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKlxuICogICAgIEFueSBjb21taXRzIHRvIHRoaXMgZmlsZSBzaG91bGQgYmUgcmV2aWV3ZWQgd2l0aCBzZWN1cml0eSBpbiBtaW5kLiAgKlxuICogICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBjYW4gcG90ZW50aWFsbHkgY3JlYXRlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gKlxuICogICAgICAgICAgQW4gYXBwcm92YWwgZnJvbSAyIENvcmUgbWVtYmVycyB3aXRoIGhpc3Rvcnkgb2YgbW9kaWZ5aW5nICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlIGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogIERvZXMgdGhlIGNoYW5nZSBzb21laG93IGFsbG93IGZvciBhcmJpdHJhcnkgamF2YXNjcmlwdCB0byBiZSBleGVjdXRlZD8gKlxuICogICAgT3IgYWxsb3dzIGZvciBzb21lb25lIHRvIGNoYW5nZSB0aGUgcHJvdG90eXBlIG9mIGJ1aWx0LWluIG9iamVjdHM/ICAgKlxuICogICAgIE9yIGdpdmVzIHVuZGVzaXJlZCBhY2Nlc3MgdG8gdmFyaWFibGVzIGxpa2VzIGRvY3VtZW50IG9yIHdpbmRvdz8gICAgKlxuICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi9cblxudmFyICRwYXJzZU1pbkVyciA9IG1pbkVycignJHBhcnNlJyk7XG5cbnZhciBvYmplY3RWYWx1ZU9mID0ge30uY29uc3RydWN0b3IucHJvdG90eXBlLnZhbHVlT2Y7XG5cbi8vIFNhbmRib3hpbmcgQW5ndWxhciBFeHByZXNzaW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBbmd1bGFyIGV4cHJlc3Npb25zIGFyZSBubyBsb25nZXIgc2FuZGJveGVkLiBTbyBpdCBpcyBub3cgZXZlbiBlYXNpZXIgdG8gYWNjZXNzIGFyYml0cmFyeSBKUyBjb2RlIGJ5XG4vLyB2YXJpb3VzIG1lYW5zIHN1Y2ggYXMgb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIG5hdGl2ZSBKUyBmdW5jdGlvbnMgbGlrZSB0aGUgRnVuY3Rpb24gY29uc3RydWN0b3IuXG4vL1xuLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBBbmd1bGFyIGV4cHJlc3Npb246XG4vL1xuLy8gICB7fS50b1N0cmluZy5jb25zdHJ1Y3RvcignYWxlcnQoXCJldmlsIEpTIGNvZGVcIiknKVxuLy9cbi8vIEl0IGlzIGltcG9ydGFudCB0byByZWFsaXplIHRoYXQgaWYgeW91IGNyZWF0ZSBhbiBleHByZXNzaW9uIGZyb20gYSBzdHJpbmcgdGhhdCBjb250YWlucyB1c2VyIHByb3ZpZGVkXG4vLyBjb250ZW50IHRoZW4gaXQgaXMgcG9zc2libGUgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNvbnRhaW5zIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSB0byBhbiBYU1Mgc3R5bGUgYXR0YWNrLlxuLy9cbi8vIFNlZSBodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9ndWlkZS9zZWN1cml0eVxuXG5cbmZ1bmN0aW9uIGdldFN0cmluZ1ZhbHVlKG5hbWUpIHtcbiAgLy8gUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzdHJpbmdzLiBUaGlzIG1lYW5zIHRoYXQgbm9uLXN0cmluZyBvYmplY3RzIGNhbm5vdCBiZSB1c2VkXG4gIC8vIGFzIGtleXMgaW4gYW4gb2JqZWN0LiBBbnkgbm9uLXN0cmluZyBvYmplY3QsIGluY2x1ZGluZyBhIG51bWJlciwgaXMgdHlwZWNhc3RlZFxuICAvLyBpbnRvIGEgc3RyaW5nIHZpYSB0aGUgdG9TdHJpbmcgbWV0aG9kLlxuICAvLyAtLSBNRE4sIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9Qcm9wZXJ0eV9hY2Nlc3NvcnMjUHJvcGVydHlfbmFtZXNcbiAgLy9cbiAgLy8gU28sIHRvIGVuc3VyZSB0aGF0IHdlIGFyZSBjaGVja2luZyB0aGUgc2FtZSBgbmFtZWAgdGhhdCBKYXZhU2NyaXB0IHdvdWxkIHVzZSwgd2UgY2FzdCBpdFxuICAvLyB0byBhIHN0cmluZy4gSXQncyBub3QgYWx3YXlzIHBvc3NpYmxlLiBJZiBgbmFtZWAgaXMgYW4gb2JqZWN0IGFuZCBpdHMgYHRvU3RyaW5nYCBtZXRob2QgaXNcbiAgLy8gJ2Jyb2tlbicgKGRvZXNuJ3QgcmV0dXJuIGEgc3RyaW5nLCBpc24ndCBhIGZ1bmN0aW9uLCBldGMuKSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd246XG4gIC8vXG4gIC8vIFR5cGVFcnJvcjogQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVxuICAvL1xuICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2UgZG9uJ3QgY2F0Y2ggdGhpcyBlcnJvciBoZXJlIGFuZCBhbGxvdyBpdCB0byBwcm9wYWdhdGUgdXAgdGhlIGNhbGxcbiAgLy8gc3RhY2suIE5vdGUgdGhhdCB5b3UnbGwgZ2V0IHRoZSBzYW1lIGVycm9yIGluIEphdmFTY3JpcHQgaWYgeW91IHRyeSB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB1c2luZ1xuICAvLyBzdWNoIGEgJ2Jyb2tlbicgb2JqZWN0IGFzIGEga2V5LlxuICByZXR1cm4gbmFtZSArICcnO1xufVxuXG5cbnZhciBPUEVSQVRPUlMgPSBjcmVhdGVNYXAoKTtcbmZvckVhY2goJysgLSAqIC8gJSA9PT0gIT09ID09ICE9IDwgPiA8PSA+PSAmJiB8fCAhID0gfCcuc3BsaXQoJyAnKSwgZnVuY3Rpb24ob3BlcmF0b3IpIHsgT1BFUkFUT1JTW29wZXJhdG9yXSA9IHRydWU7IH0pO1xudmFyIEVTQ0FQRSA9IHsnbic6J1xcbicsICdmJzonXFxmJywgJ3InOidcXHInLCAndCc6J1xcdCcsICd2JzonXFx2JywgJ1xcJyc6J1xcJycsICdcIic6J1wiJ307XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgTGV4ZXIgPSBmdW5jdGlvbiBMZXhlcihvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG59O1xuXG5MZXhlci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBMZXhlcixcblxuICBsZXg6IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMudG9rZW5zID0gW107XG5cbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7XG4gICAgICBpZiAoY2ggPT09ICdcIicgfHwgY2ggPT09ICdcXCcnKSB7XG4gICAgICAgIHRoaXMucmVhZFN0cmluZyhjaCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNOdW1iZXIoY2gpIHx8IGNoID09PSAnLicgJiYgdGhpcy5pc051bWJlcih0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgdGhpcy5yZWFkTnVtYmVyKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5wZWVrTXVsdGljaGFyKCkpKSB7XG4gICAgICAgIHRoaXMucmVhZElkZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXMoY2gsICcoKXt9W10uLDs6PycpKSB7XG4gICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiBjaH0pO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNXaGl0ZXNwYWNlKGNoKSkge1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2gyID0gY2ggKyB0aGlzLnBlZWsoKTtcbiAgICAgICAgdmFyIGNoMyA9IGNoMiArIHRoaXMucGVlaygyKTtcbiAgICAgICAgdmFyIG9wMSA9IE9QRVJBVE9SU1tjaF07XG4gICAgICAgIHZhciBvcDIgPSBPUEVSQVRPUlNbY2gyXTtcbiAgICAgICAgdmFyIG9wMyA9IE9QRVJBVE9SU1tjaDNdO1xuICAgICAgICBpZiAob3AxIHx8IG9wMiB8fCBvcDMpIHtcbiAgICAgICAgICB2YXIgdG9rZW4gPSBvcDMgPyBjaDMgOiAob3AyID8gY2gyIDogY2gpO1xuICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2goe2luZGV4OiB0aGlzLmluZGV4LCB0ZXh0OiB0b2tlbiwgb3BlcmF0b3I6IHRydWV9KTtcbiAgICAgICAgICB0aGlzLmluZGV4ICs9IHRva2VuLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRocm93RXJyb3IoJ1VuZXhwZWN0ZWQgbmV4dCBjaGFyYWN0ZXIgJywgdGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgfSxcblxuICBpczogZnVuY3Rpb24oY2gsIGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmluZGV4T2YoY2gpICE9PSAtMTtcbiAgfSxcblxuICBwZWVrOiBmdW5jdGlvbihpKSB7XG4gICAgdmFyIG51bSA9IGkgfHwgMTtcbiAgICByZXR1cm4gKHRoaXMuaW5kZXggKyBudW0gPCB0aGlzLnRleHQubGVuZ3RoKSA/IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCArIG51bSkgOiBmYWxzZTtcbiAgfSxcblxuICBpc051bWJlcjogZnVuY3Rpb24oY2gpIHtcbiAgICByZXR1cm4gKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpICYmIHR5cGVvZiBjaCA9PT0gJ3N0cmluZyc7XG4gIH0sXG5cbiAgaXNXaGl0ZXNwYWNlOiBmdW5jdGlvbihjaCkge1xuICAgIC8vIElFIHRyZWF0cyBub24tYnJlYWtpbmcgc3BhY2UgYXMgXFx1MDBBMFxuICAgIHJldHVybiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXHQnIHx8XG4gICAgICAgICAgICBjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHYnIHx8IGNoID09PSAnXFx1MDBBMCcpO1xuICB9LFxuXG4gIGlzSWRlbnRpZmllclN0YXJ0OiBmdW5jdGlvbihjaCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaXNJZGVudGlmaWVyU3RhcnQgP1xuICAgICAgICB0aGlzLm9wdGlvbnMuaXNJZGVudGlmaWVyU3RhcnQoY2gsIHRoaXMuY29kZVBvaW50QXQoY2gpKSA6XG4gICAgICAgIHRoaXMuaXNWYWxpZElkZW50aWZpZXJTdGFydChjaCk7XG4gIH0sXG5cbiAgaXNWYWxpZElkZW50aWZpZXJTdGFydDogZnVuY3Rpb24oY2gpIHtcbiAgICByZXR1cm4gKCdhJyA8PSBjaCAmJiBjaCA8PSAneicgfHxcbiAgICAgICAgICAgICdBJyA8PSBjaCAmJiBjaCA8PSAnWicgfHxcbiAgICAgICAgICAgICdfJyA9PT0gY2ggfHwgY2ggPT09ICckJyk7XG4gIH0sXG5cbiAgaXNJZGVudGlmaWVyQ29udGludWU6IGZ1bmN0aW9uKGNoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5pc0lkZW50aWZpZXJDb250aW51ZSA/XG4gICAgICAgIHRoaXMub3B0aW9ucy5pc0lkZW50aWZpZXJDb250aW51ZShjaCwgdGhpcy5jb2RlUG9pbnRBdChjaCkpIDpcbiAgICAgICAgdGhpcy5pc1ZhbGlkSWRlbnRpZmllckNvbnRpbnVlKGNoKTtcbiAgfSxcblxuICBpc1ZhbGlkSWRlbnRpZmllckNvbnRpbnVlOiBmdW5jdGlvbihjaCwgY3ApIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkSWRlbnRpZmllclN0YXJ0KGNoLCBjcCkgfHwgdGhpcy5pc051bWJlcihjaCk7XG4gIH0sXG5cbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uKGNoKSB7XG4gICAgaWYgKGNoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICByZXR1cm4gKGNoLmNoYXJDb2RlQXQoMCkgPDwgMTApICsgY2guY2hhckNvZGVBdCgxKSAtIDB4MzVGREMwMDtcbiAgfSxcblxuICBwZWVrTXVsdGljaGFyOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2ggPSB0aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpO1xuICAgIHZhciBwZWVrID0gdGhpcy5wZWVrKCk7XG4gICAgaWYgKCFwZWVrKSB7XG4gICAgICByZXR1cm4gY2g7XG4gICAgfVxuICAgIHZhciBjcDEgPSBjaC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBjcDIgPSBwZWVrLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGNwMSA+PSAweEQ4MDAgJiYgY3AxIDw9IDB4REJGRiAmJiBjcDIgPj0gMHhEQzAwICYmIGNwMiA8PSAweERGRkYpIHtcbiAgICAgIHJldHVybiBjaCArIHBlZWs7XG4gICAgfVxuICAgIHJldHVybiBjaDtcbiAgfSxcblxuICBpc0V4cE9wZXJhdG9yOiBmdW5jdGlvbihjaCkge1xuICAgIHJldHVybiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnIHx8IHRoaXMuaXNOdW1iZXIoY2gpKTtcbiAgfSxcblxuICB0aHJvd0Vycm9yOiBmdW5jdGlvbihlcnJvciwgc3RhcnQsIGVuZCkge1xuICAgIGVuZCA9IGVuZCB8fCB0aGlzLmluZGV4O1xuICAgIHZhciBjb2xTdHIgPSAoaXNEZWZpbmVkKHN0YXJ0KVxuICAgICAgICAgICAgPyAncyAnICsgc3RhcnQgKyAgJy0nICsgdGhpcy5pbmRleCArICcgWycgKyB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpICsgJ10nXG4gICAgICAgICAgICA6ICcgJyArIGVuZCk7XG4gICAgdGhyb3cgJHBhcnNlTWluRXJyKCdsZXhlcnInLCAnTGV4ZXIgRXJyb3I6IHswfSBhdCBjb2x1bW57MX0gaW4gZXhwcmVzc2lvbiBbezJ9XS4nLFxuICAgICAgICBlcnJvciwgY29sU3RyLCB0aGlzLnRleHQpO1xuICB9LFxuXG4gIHJlYWROdW1iZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBudW1iZXIgPSAnJztcbiAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgdmFyIGNoID0gbG93ZXJjYXNlKHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCkpO1xuICAgICAgaWYgKGNoID09PSAnLicgfHwgdGhpcy5pc051bWJlcihjaCkpIHtcbiAgICAgICAgbnVtYmVyICs9IGNoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHBlZWtDaCA9IHRoaXMucGVlaygpO1xuICAgICAgICBpZiAoY2ggPT09ICdlJyAmJiB0aGlzLmlzRXhwT3BlcmF0b3IocGVla0NoKSkge1xuICAgICAgICAgIG51bWJlciArPSBjaDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRXhwT3BlcmF0b3IoY2gpICYmXG4gICAgICAgICAgICBwZWVrQ2ggJiYgdGhpcy5pc051bWJlcihwZWVrQ2gpICYmXG4gICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PT0gJ2UnKSB7XG4gICAgICAgICAgbnVtYmVyICs9IGNoO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNFeHBPcGVyYXRvcihjaCkgJiZcbiAgICAgICAgICAgICghcGVla0NoIHx8ICF0aGlzLmlzTnVtYmVyKHBlZWtDaCkpICYmXG4gICAgICAgICAgICBudW1iZXIuY2hhckF0KG51bWJlci5sZW5ndGggLSAxKSA9PT0gJ2UnKSB7XG4gICAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJbnZhbGlkIGV4cG9uZW50Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICB9XG4gICAgdGhpcy50b2tlbnMucHVzaCh7XG4gICAgICBpbmRleDogc3RhcnQsXG4gICAgICB0ZXh0OiBudW1iZXIsXG4gICAgICBjb25zdGFudDogdHJ1ZSxcbiAgICAgIHZhbHVlOiBOdW1iZXIobnVtYmVyKVxuICAgIH0pO1xuICB9LFxuXG4gIHJlYWRJZGVudDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmluZGV4ICs9IHRoaXMucGVla011bHRpY2hhcigpLmxlbmd0aDtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgIHZhciBjaCA9IHRoaXMucGVla011bHRpY2hhcigpO1xuICAgICAgaWYgKCF0aGlzLmlzSWRlbnRpZmllckNvbnRpbnVlKGNoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXggKz0gY2gubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLnRva2Vucy5wdXNoKHtcbiAgICAgIGluZGV4OiBzdGFydCxcbiAgICAgIHRleHQ6IHRoaXMudGV4dC5zbGljZShzdGFydCwgdGhpcy5pbmRleCksXG4gICAgICBpZGVudGlmaWVyOiB0cnVlXG4gICAgfSk7XG4gIH0sXG5cbiAgcmVhZFN0cmluZzogZnVuY3Rpb24ocXVvdGUpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuaW5kZXgrKztcbiAgICB2YXIgc3RyaW5nID0gJyc7XG4gICAgdmFyIHJhd1N0cmluZyA9IHF1b3RlO1xuICAgIHZhciBlc2NhcGUgPSBmYWxzZTtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgIHZhciBjaCA9IHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCk7XG4gICAgICByYXdTdHJpbmcgKz0gY2g7XG4gICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7XG4gICAgICAgICAgdmFyIGhleCA9IHRoaXMudGV4dC5zdWJzdHJpbmcodGhpcy5pbmRleCArIDEsIHRoaXMuaW5kZXggKyA1KTtcbiAgICAgICAgICBpZiAoIWhleC5tYXRjaCgvW1xcZGEtZl17NH0vaSkpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcignSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFxcXHUnICsgaGV4ICsgJ10nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbmRleCArPSA0O1xuICAgICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVwID0gRVNDQVBFW2NoXTtcbiAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcgKyAocmVwIHx8IGNoKTtcbiAgICAgICAgfVxuICAgICAgICBlc2NhcGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgICAgICBlc2NhcGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gcXVvdGUpIHtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogc3RhcnQsXG4gICAgICAgICAgdGV4dDogcmF3U3RyaW5nLFxuICAgICAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiBzdHJpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZyArPSBjaDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICB9XG4gICAgdGhpcy50aHJvd0Vycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCBzdGFydCk7XG4gIH1cbn07XG5cbnZhciBBU1QgPSBmdW5jdGlvbiBBU1QobGV4ZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5sZXhlciA9IGxleGVyO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xufTtcblxuQVNULlByb2dyYW0gPSAnUHJvZ3JhbSc7XG5BU1QuRXhwcmVzc2lvblN0YXRlbWVudCA9ICdFeHByZXNzaW9uU3RhdGVtZW50JztcbkFTVC5Bc3NpZ25tZW50RXhwcmVzc2lvbiA9ICdBc3NpZ25tZW50RXhwcmVzc2lvbic7XG5BU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic7XG5BU1QuTG9naWNhbEV4cHJlc3Npb24gPSAnTG9naWNhbEV4cHJlc3Npb24nO1xuQVNULkJpbmFyeUV4cHJlc3Npb24gPSAnQmluYXJ5RXhwcmVzc2lvbic7XG5BU1QuVW5hcnlFeHByZXNzaW9uID0gJ1VuYXJ5RXhwcmVzc2lvbic7XG5BU1QuQ2FsbEV4cHJlc3Npb24gPSAnQ2FsbEV4cHJlc3Npb24nO1xuQVNULk1lbWJlckV4cHJlc3Npb24gPSAnTWVtYmVyRXhwcmVzc2lvbic7XG5BU1QuSWRlbnRpZmllciA9ICdJZGVudGlmaWVyJztcbkFTVC5MaXRlcmFsID0gJ0xpdGVyYWwnO1xuQVNULkFycmF5RXhwcmVzc2lvbiA9ICdBcnJheUV4cHJlc3Npb24nO1xuQVNULlByb3BlcnR5ID0gJ1Byb3BlcnR5JztcbkFTVC5PYmplY3RFeHByZXNzaW9uID0gJ09iamVjdEV4cHJlc3Npb24nO1xuQVNULlRoaXNFeHByZXNzaW9uID0gJ1RoaXNFeHByZXNzaW9uJztcbkFTVC5Mb2NhbHNFeHByZXNzaW9uID0gJ0xvY2Fsc0V4cHJlc3Npb24nO1xuXG4vLyBJbnRlcm5hbCB1c2Ugb25seVxuQVNULk5HVmFsdWVQYXJhbWV0ZXIgPSAnTkdWYWx1ZVBhcmFtZXRlcic7XG5cbkFTVC5wcm90b3R5cGUgPSB7XG4gIGFzdDogZnVuY3Rpb24odGV4dCkge1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy50b2tlbnMgPSB0aGlzLmxleGVyLmxleCh0ZXh0KTtcblxuICAgIHZhciB2YWx1ZSA9IHRoaXMucHJvZ3JhbSgpO1xuXG4gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKCdpcyBhbiB1bmV4cGVjdGVkIHRva2VuJywgdGhpcy50b2tlbnNbMF0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBwcm9ncmFtOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYm9keSA9IFtdO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID4gMCAmJiAhdGhpcy5wZWVrKCd9JywgJyknLCAnOycsICddJykpXG4gICAgICAgIGJvZHkucHVzaCh0aGlzLmV4cHJlc3Npb25TdGF0ZW1lbnQoKSk7XG4gICAgICBpZiAoIXRoaXMuZXhwZWN0KCc7JykpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogQVNULlByb2dyYW0sIGJvZHk6IGJvZHl9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBleHByZXNzaW9uU3RhdGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geyB0eXBlOiBBU1QuRXhwcmVzc2lvblN0YXRlbWVudCwgZXhwcmVzc2lvbjogdGhpcy5maWx0ZXJDaGFpbigpIH07XG4gIH0sXG5cbiAgZmlsdGVyQ2hhaW46IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZWZ0ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgd2hpbGUgKHRoaXMuZXhwZWN0KCd8JykpIHtcbiAgICAgIGxlZnQgPSB0aGlzLmZpbHRlcihsZWZ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQ7XG4gIH0sXG5cbiAgZXhwcmVzc2lvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWdubWVudCgpO1xuICB9LFxuXG4gIGFzc2lnbm1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnRlcm5hcnkoKTtcbiAgICBpZiAodGhpcy5leHBlY3QoJz0nKSkge1xuICAgICAgaWYgKCFpc0Fzc2lnbmFibGUocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2x2YWwnLCAnVHJ5aW5nIHRvIGFzc2lnbiBhIHZhbHVlIHRvIGEgbm9uIGwtdmFsdWUnKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0geyB0eXBlOiBBU1QuQXNzaWdubWVudEV4cHJlc3Npb24sIGxlZnQ6IHJlc3VsdCwgcmlnaHQ6IHRoaXMuYXNzaWdubWVudCgpLCBvcGVyYXRvcjogJz0nfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSxcblxuICB0ZXJuYXJ5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGVzdCA9IHRoaXMubG9naWNhbE9SKCk7XG4gICAgdmFyIGFsdGVybmF0ZTtcbiAgICB2YXIgY29uc2VxdWVudDtcbiAgICBpZiAodGhpcy5leHBlY3QoJz8nKSkge1xuICAgICAgYWx0ZXJuYXRlID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICBpZiAodGhpcy5jb25zdW1lKCc6JykpIHtcbiAgICAgICAgY29uc2VxdWVudCA9IHRoaXMuZXhwcmVzc2lvbigpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBBU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uLCB0ZXN0OiB0ZXN0LCBhbHRlcm5hdGU6IGFsdGVybmF0ZSwgY29uc2VxdWVudDogY29uc2VxdWVudH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXN0O1xuICB9LFxuXG4gIGxvZ2ljYWxPUjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLmxvZ2ljYWxBTkQoKTtcbiAgICB3aGlsZSAodGhpcy5leHBlY3QoJ3x8JykpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5Mb2dpY2FsRXhwcmVzc2lvbiwgb3BlcmF0b3I6ICd8fCcsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLmxvZ2ljYWxBTkQoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBsb2dpY2FsQU5EOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVmdCA9IHRoaXMuZXF1YWxpdHkoKTtcbiAgICB3aGlsZSAodGhpcy5leHBlY3QoJyYmJykpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5Mb2dpY2FsRXhwcmVzc2lvbiwgb3BlcmF0b3I6ICcmJicsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLmVxdWFsaXR5KCl9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBlcXVhbGl0eTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLnJlbGF0aW9uYWwoKTtcbiAgICB2YXIgdG9rZW47XG4gICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc9PScsJyE9JywnPT09JywnIT09JykpKSB7XG4gICAgICBsZWZ0ID0geyB0eXBlOiBBU1QuQmluYXJ5RXhwcmVzc2lvbiwgb3BlcmF0b3I6IHRva2VuLnRleHQsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLnJlbGF0aW9uYWwoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICByZWxhdGlvbmFsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVmdCA9IHRoaXMuYWRkaXRpdmUoKTtcbiAgICB2YXIgdG9rZW47XG4gICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZXhwZWN0KCc8JywgJz4nLCAnPD0nLCAnPj0nKSkpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5CaW5hcnlFeHByZXNzaW9uLCBvcGVyYXRvcjogdG9rZW4udGV4dCwgbGVmdDogbGVmdCwgcmlnaHQ6IHRoaXMuYWRkaXRpdmUoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBhZGRpdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLm11bHRpcGxpY2F0aXZlKCk7XG4gICAgdmFyIHRva2VuO1xuICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnKycsJy0nKSkpIHtcbiAgICAgIGxlZnQgPSB7IHR5cGU6IEFTVC5CaW5hcnlFeHByZXNzaW9uLCBvcGVyYXRvcjogdG9rZW4udGV4dCwgbGVmdDogbGVmdCwgcmlnaHQ6IHRoaXMubXVsdGlwbGljYXRpdmUoKSB9O1xuICAgIH1cbiAgICByZXR1cm4gbGVmdDtcbiAgfSxcblxuICBtdWx0aXBsaWNhdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlZnQgPSB0aGlzLnVuYXJ5KCk7XG4gICAgdmFyIHRva2VuO1xuICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmV4cGVjdCgnKicsJy8nLCclJykpKSB7XG4gICAgICBsZWZ0ID0geyB0eXBlOiBBU1QuQmluYXJ5RXhwcmVzc2lvbiwgb3BlcmF0b3I6IHRva2VuLnRleHQsIGxlZnQ6IGxlZnQsIHJpZ2h0OiB0aGlzLnVuYXJ5KCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnQ7XG4gIH0sXG5cbiAgdW5hcnk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2tlbjtcbiAgICBpZiAoKHRva2VuID0gdGhpcy5leHBlY3QoJysnLCAnLScsICchJykpKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBBU1QuVW5hcnlFeHByZXNzaW9uLCBvcGVyYXRvcjogdG9rZW4udGV4dCwgcHJlZml4OiB0cnVlLCBhcmd1bWVudDogdGhpcy51bmFyeSgpIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByaW1hcnkoKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJpbWFyeTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByaW1hcnk7XG4gICAgaWYgKHRoaXMuZXhwZWN0KCcoJykpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLmZpbHRlckNoYWluKCk7XG4gICAgICB0aGlzLmNvbnN1bWUoJyknKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZXhwZWN0KCdbJykpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLmFycmF5RGVjbGFyYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZXhwZWN0KCd7JykpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLm9iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxmUmVmZXJlbnRpYWwuaGFzT3duUHJvcGVydHkodGhpcy5wZWVrKCkudGV4dCkpIHtcbiAgICAgIHByaW1hcnkgPSBjb3B5KHRoaXMuc2VsZlJlZmVyZW50aWFsW3RoaXMuY29uc3VtZSgpLnRleHRdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5saXRlcmFscy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnBlZWsoKS50ZXh0KSkge1xuICAgICAgcHJpbWFyeSA9IHsgdHlwZTogQVNULkxpdGVyYWwsIHZhbHVlOiB0aGlzLm9wdGlvbnMubGl0ZXJhbHNbdGhpcy5jb25zdW1lKCkudGV4dF19O1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkuaWRlbnRpZmllcikge1xuICAgICAgcHJpbWFyeSA9IHRoaXMuaWRlbnRpZmllcigpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrKCkuY29uc3RhbnQpIHtcbiAgICAgIHByaW1hcnkgPSB0aGlzLmNvbnN0YW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhyb3dFcnJvcignbm90IGEgcHJpbWFyeSBleHByZXNzaW9uJywgdGhpcy5wZWVrKCkpO1xuICAgIH1cblxuICAgIHZhciBuZXh0O1xuICAgIHdoaWxlICgobmV4dCA9IHRoaXMuZXhwZWN0KCcoJywgJ1snLCAnLicpKSkge1xuICAgICAgaWYgKG5leHQudGV4dCA9PT0gJygnKSB7XG4gICAgICAgIHByaW1hcnkgPSB7dHlwZTogQVNULkNhbGxFeHByZXNzaW9uLCBjYWxsZWU6IHByaW1hcnksIGFyZ3VtZW50czogdGhpcy5wYXJzZUFyZ3VtZW50cygpIH07XG4gICAgICAgIHRoaXMuY29uc3VtZSgnKScpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0LnRleHQgPT09ICdbJykge1xuICAgICAgICBwcmltYXJ5ID0geyB0eXBlOiBBU1QuTWVtYmVyRXhwcmVzc2lvbiwgb2JqZWN0OiBwcmltYXJ5LCBwcm9wZXJ0eTogdGhpcy5leHByZXNzaW9uKCksIGNvbXB1dGVkOiB0cnVlIH07XG4gICAgICAgIHRoaXMuY29uc3VtZSgnXScpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0LnRleHQgPT09ICcuJykge1xuICAgICAgICBwcmltYXJ5ID0geyB0eXBlOiBBU1QuTWVtYmVyRXhwcmVzc2lvbiwgb2JqZWN0OiBwcmltYXJ5LCBwcm9wZXJ0eTogdGhpcy5pZGVudGlmaWVyKCksIGNvbXB1dGVkOiBmYWxzZSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdJTVBPU1NJQkxFJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcmltYXJ5O1xuICB9LFxuXG4gIGZpbHRlcjogZnVuY3Rpb24oYmFzZUV4cHJlc3Npb24pIHtcbiAgICB2YXIgYXJncyA9IFtiYXNlRXhwcmVzc2lvbl07XG4gICAgdmFyIHJlc3VsdCA9IHt0eXBlOiBBU1QuQ2FsbEV4cHJlc3Npb24sIGNhbGxlZTogdGhpcy5pZGVudGlmaWVyKCksIGFyZ3VtZW50czogYXJncywgZmlsdGVyOiB0cnVlfTtcblxuICAgIHdoaWxlICh0aGlzLmV4cGVjdCgnOicpKSB7XG4gICAgICBhcmdzLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgcGFyc2VBcmd1bWVudHM6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgaWYgKHRoaXMucGVla1Rva2VuKCkudGV4dCAhPT0gJyknKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGFyZ3MucHVzaCh0aGlzLmZpbHRlckNoYWluKCkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9LFxuXG4gIGlkZW50aWZpZXI6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b2tlbiA9IHRoaXMuY29uc3VtZSgpO1xuICAgIGlmICghdG9rZW4uaWRlbnRpZmllcikge1xuICAgICAgdGhpcy50aHJvd0Vycm9yKCdpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyJywgdG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBBU1QuSWRlbnRpZmllciwgbmFtZTogdG9rZW4udGV4dCB9O1xuICB9LFxuXG4gIGNvbnN0YW50OiBmdW5jdGlvbigpIHtcbiAgICAvLyBUT0RPIGNoZWNrIHRoYXQgaXQgaXMgYSBjb25zdGFudFxuICAgIHJldHVybiB7IHR5cGU6IEFTVC5MaXRlcmFsLCB2YWx1ZTogdGhpcy5jb25zdW1lKCkudmFsdWUgfTtcbiAgfSxcblxuICBhcnJheURlY2xhcmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICBpZiAodGhpcy5wZWVrVG9rZW4oKS50ZXh0ICE9PSAnXScpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRoaXMucGVlaygnXScpKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCB0cmFpbGluZyBjb21tYXMgcGVyIEVTNS4xLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5leHByZXNzaW9uKCkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZSgnXScpO1xuXG4gICAgcmV0dXJuIHsgdHlwZTogQVNULkFycmF5RXhwcmVzc2lvbiwgZWxlbWVudHM6IGVsZW1lbnRzIH07XG4gIH0sXG5cbiAgb2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFtdLCBwcm9wZXJ0eTtcbiAgICBpZiAodGhpcy5wZWVrVG9rZW4oKS50ZXh0ICE9PSAnfScpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHRoaXMucGVlaygnfScpKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCB0cmFpbGluZyBjb21tYXMgcGVyIEVTNS4xLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHByb3BlcnR5ID0ge3R5cGU6IEFTVC5Qcm9wZXJ0eSwga2luZDogJ2luaXQnfTtcbiAgICAgICAgaWYgKHRoaXMucGVlaygpLmNvbnN0YW50KSB7XG4gICAgICAgICAgcHJvcGVydHkua2V5ID0gdGhpcy5jb25zdGFudCgpO1xuICAgICAgICAgIHByb3BlcnR5LmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKCc6Jyk7XG4gICAgICAgICAgcHJvcGVydHkudmFsdWUgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsoKS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgcHJvcGVydHkua2V5ID0gdGhpcy5pZGVudGlmaWVyKCk7XG4gICAgICAgICAgcHJvcGVydHkuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAodGhpcy5wZWVrKCc6JykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uc3VtZSgnOicpO1xuICAgICAgICAgICAgcHJvcGVydHkudmFsdWUgPSB0aGlzLmV4cHJlc3Npb24oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvcGVydHkudmFsdWUgPSBwcm9wZXJ0eS5rZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGVlaygnWycpKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKCdbJyk7XG4gICAgICAgICAgcHJvcGVydHkua2V5ID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICAgICAgdGhpcy5jb25zdW1lKCddJyk7XG4gICAgICAgICAgcHJvcGVydHkuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuY29uc3VtZSgnOicpO1xuICAgICAgICAgIHByb3BlcnR5LnZhbHVlID0gdGhpcy5leHByZXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50aHJvd0Vycm9yKCdpbnZhbGlkIGtleScsIHRoaXMucGVlaygpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5leHBlY3QoJywnKSk7XG4gICAgfVxuICAgIHRoaXMuY29uc3VtZSgnfScpO1xuXG4gICAgcmV0dXJuIHt0eXBlOiBBU1QuT2JqZWN0RXhwcmVzc2lvbiwgcHJvcGVydGllczogcHJvcGVydGllcyB9O1xuICB9LFxuXG4gIHRocm93RXJyb3I6IGZ1bmN0aW9uKG1zZywgdG9rZW4pIHtcbiAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ3N5bnRheCcsXG4gICAgICAgICdTeW50YXggRXJyb3I6IFRva2VuIFxcJ3swfVxcJyB7MX0gYXQgY29sdW1uIHsyfSBvZiB0aGUgZXhwcmVzc2lvbiBbezN9XSBzdGFydGluZyBhdCBbezR9XS4nLFxuICAgICAgICAgIHRva2VuLnRleHQsIG1zZywgKHRva2VuLmluZGV4ICsgMSksIHRoaXMudGV4dCwgdGhpcy50ZXh0LnN1YnN0cmluZyh0b2tlbi5pbmRleCkpO1xuICB9LFxuXG4gIGNvbnN1bWU6IGZ1bmN0aW9uKGUxKSB7XG4gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCd1ZW9lJywgJ1VuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IHswfScsIHRoaXMudGV4dCk7XG4gICAgfVxuXG4gICAgdmFyIHRva2VuID0gdGhpcy5leHBlY3QoZTEpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHRoaXMudGhyb3dFcnJvcignaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFsnICsgZTEgKyAnXScsIHRoaXMucGVlaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9LFxuXG4gIHBlZWtUb2tlbjogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgJHBhcnNlTWluRXJyKCd1ZW9lJywgJ1VuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IHswfScsIHRoaXMudGV4dCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRva2Vuc1swXTtcbiAgfSxcblxuICBwZWVrOiBmdW5jdGlvbihlMSwgZTIsIGUzLCBlNCkge1xuICAgIHJldHVybiB0aGlzLnBlZWtBaGVhZCgwLCBlMSwgZTIsIGUzLCBlNCk7XG4gIH0sXG5cbiAgcGVla0FoZWFkOiBmdW5jdGlvbihpLCBlMSwgZTIsIGUzLCBlNCkge1xuICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPiBpKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgIHZhciB0ID0gdG9rZW4udGV4dDtcbiAgICAgIGlmICh0ID09PSBlMSB8fCB0ID09PSBlMiB8fCB0ID09PSBlMyB8fCB0ID09PSBlNCB8fFxuICAgICAgICAgICghZTEgJiYgIWUyICYmICFlMyAmJiAhZTQpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIGV4cGVjdDogZnVuY3Rpb24oZTEsIGUyLCBlMywgZTQpIHtcbiAgICB2YXIgdG9rZW4gPSB0aGlzLnBlZWsoZTEsIGUyLCBlMywgZTQpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgdGhpcy50b2tlbnMuc2hpZnQoKTtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIHNlbGZSZWZlcmVudGlhbDoge1xuICAgICd0aGlzJzoge3R5cGU6IEFTVC5UaGlzRXhwcmVzc2lvbiB9LFxuICAgICckbG9jYWxzJzoge3R5cGU6IEFTVC5Mb2NhbHNFeHByZXNzaW9uIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaWZEZWZpbmVkKHYsIGQpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ICE9PSAndW5kZWZpbmVkJyA/IHYgOiBkO1xufVxuXG5mdW5jdGlvbiBwbHVzRm4obCwgcikge1xuICBpZiAodHlwZW9mIGwgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gcjtcbiAgaWYgKHR5cGVvZiByID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGw7XG4gIHJldHVybiBsICsgcjtcbn1cblxuZnVuY3Rpb24gaXNTdGF0ZWxlc3MoJGZpbHRlciwgZmlsdGVyTmFtZSkge1xuICB2YXIgZm4gPSAkZmlsdGVyKGZpbHRlck5hbWUpO1xuICByZXR1cm4gIWZuLiRzdGF0ZWZ1bDtcbn1cblxuZnVuY3Rpb24gZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhhc3QsICRmaWx0ZXIpIHtcbiAgdmFyIGFsbENvbnN0YW50cztcbiAgdmFyIGFyZ3NUb1dhdGNoO1xuICB2YXIgaXNTdGF0ZWxlc3NGaWx0ZXI7XG4gIHN3aXRjaCAoYXN0LnR5cGUpIHtcbiAgY2FzZSBBU1QuUHJvZ3JhbTpcbiAgICBhbGxDb25zdGFudHMgPSB0cnVlO1xuICAgIGZvckVhY2goYXN0LmJvZHksIGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoZXhwci5leHByZXNzaW9uLCAkZmlsdGVyKTtcbiAgICAgIGFsbENvbnN0YW50cyA9IGFsbENvbnN0YW50cyAmJiBleHByLmV4cHJlc3Npb24uY29uc3RhbnQ7XG4gICAgfSk7XG4gICAgYXN0LmNvbnN0YW50ID0gYWxsQ29uc3RhbnRzO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5MaXRlcmFsOlxuICAgIGFzdC5jb25zdGFudCA9IHRydWU7XG4gICAgYXN0LnRvV2F0Y2ggPSBbXTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuVW5hcnlFeHByZXNzaW9uOlxuICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LmFyZ3VtZW50LCAkZmlsdGVyKTtcbiAgICBhc3QuY29uc3RhbnQgPSBhc3QuYXJndW1lbnQuY29uc3RhbnQ7XG4gICAgYXN0LnRvV2F0Y2ggPSBhc3QuYXJndW1lbnQudG9XYXRjaDtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuQmluYXJ5RXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5sZWZ0LCAkZmlsdGVyKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5yaWdodCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LmxlZnQuY29uc3RhbnQgJiYgYXN0LnJpZ2h0LmNvbnN0YW50O1xuICAgIGFzdC50b1dhdGNoID0gYXN0LmxlZnQudG9XYXRjaC5jb25jYXQoYXN0LnJpZ2h0LnRvV2F0Y2gpO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5Mb2dpY2FsRXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5sZWZ0LCAkZmlsdGVyKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5yaWdodCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LmxlZnQuY29uc3RhbnQgJiYgYXN0LnJpZ2h0LmNvbnN0YW50O1xuICAgIGFzdC50b1dhdGNoID0gYXN0LmNvbnN0YW50ID8gW10gOiBbYXN0XTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uOlxuICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LnRlc3QsICRmaWx0ZXIpO1xuICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LmFsdGVybmF0ZSwgJGZpbHRlcik7XG4gICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhhc3QuY29uc2VxdWVudCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LnRlc3QuY29uc3RhbnQgJiYgYXN0LmFsdGVybmF0ZS5jb25zdGFudCAmJiBhc3QuY29uc2VxdWVudC5jb25zdGFudDtcbiAgICBhc3QudG9XYXRjaCA9IGFzdC5jb25zdGFudCA/IFtdIDogW2FzdF07XG4gICAgYnJlYWs7XG4gIGNhc2UgQVNULklkZW50aWZpZXI6XG4gICAgYXN0LmNvbnN0YW50ID0gZmFsc2U7XG4gICAgYXN0LnRvV2F0Y2ggPSBbYXN0XTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuTWVtYmVyRXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5vYmplY3QsICRmaWx0ZXIpO1xuICAgIGlmIChhc3QuY29tcHV0ZWQpIHtcbiAgICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoYXN0LnByb3BlcnR5LCAkZmlsdGVyKTtcbiAgICB9XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0Lm9iamVjdC5jb25zdGFudCAmJiAoIWFzdC5jb21wdXRlZCB8fCBhc3QucHJvcGVydHkuY29uc3RhbnQpO1xuICAgIGFzdC50b1dhdGNoID0gW2FzdF07XG4gICAgYnJlYWs7XG4gIGNhc2UgQVNULkNhbGxFeHByZXNzaW9uOlxuICAgIGlzU3RhdGVsZXNzRmlsdGVyID0gYXN0LmZpbHRlciA/IGlzU3RhdGVsZXNzKCRmaWx0ZXIsIGFzdC5jYWxsZWUubmFtZSkgOiBmYWxzZTtcbiAgICBhbGxDb25zdGFudHMgPSBpc1N0YXRlbGVzc0ZpbHRlcjtcbiAgICBhcmdzVG9XYXRjaCA9IFtdO1xuICAgIGZvckVhY2goYXN0LmFyZ3VtZW50cywgZnVuY3Rpb24oZXhwcikge1xuICAgICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhleHByLCAkZmlsdGVyKTtcbiAgICAgIGFsbENvbnN0YW50cyA9IGFsbENvbnN0YW50cyAmJiBleHByLmNvbnN0YW50O1xuICAgICAgaWYgKCFleHByLmNvbnN0YW50KSB7XG4gICAgICAgIGFyZ3NUb1dhdGNoLnB1c2guYXBwbHkoYXJnc1RvV2F0Y2gsIGV4cHIudG9XYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXN0LmNvbnN0YW50ID0gYWxsQ29uc3RhbnRzO1xuICAgIGFzdC50b1dhdGNoID0gaXNTdGF0ZWxlc3NGaWx0ZXIgPyBhcmdzVG9XYXRjaCA6IFthc3RdO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5Bc3NpZ25tZW50RXhwcmVzc2lvbjpcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5sZWZ0LCAkZmlsdGVyKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdC5yaWdodCwgJGZpbHRlcik7XG4gICAgYXN0LmNvbnN0YW50ID0gYXN0LmxlZnQuY29uc3RhbnQgJiYgYXN0LnJpZ2h0LmNvbnN0YW50O1xuICAgIGFzdC50b1dhdGNoID0gW2FzdF07XG4gICAgYnJlYWs7XG4gIGNhc2UgQVNULkFycmF5RXhwcmVzc2lvbjpcbiAgICBhbGxDb25zdGFudHMgPSB0cnVlO1xuICAgIGFyZ3NUb1dhdGNoID0gW107XG4gICAgZm9yRWFjaChhc3QuZWxlbWVudHMsIGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgIGZpbmRDb25zdGFudEFuZFdhdGNoRXhwcmVzc2lvbnMoZXhwciwgJGZpbHRlcik7XG4gICAgICBhbGxDb25zdGFudHMgPSBhbGxDb25zdGFudHMgJiYgZXhwci5jb25zdGFudDtcbiAgICAgIGlmICghZXhwci5jb25zdGFudCkge1xuICAgICAgICBhcmdzVG9XYXRjaC5wdXNoLmFwcGx5KGFyZ3NUb1dhdGNoLCBleHByLnRvV2F0Y2gpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGFzdC5jb25zdGFudCA9IGFsbENvbnN0YW50cztcbiAgICBhc3QudG9XYXRjaCA9IGFyZ3NUb1dhdGNoO1xuICAgIGJyZWFrO1xuICBjYXNlIEFTVC5PYmplY3RFeHByZXNzaW9uOlxuICAgIGFsbENvbnN0YW50cyA9IHRydWU7XG4gICAgYXJnc1RvV2F0Y2ggPSBbXTtcbiAgICBmb3JFYWNoKGFzdC5wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhwcm9wZXJ0eS52YWx1ZSwgJGZpbHRlcik7XG4gICAgICBhbGxDb25zdGFudHMgPSBhbGxDb25zdGFudHMgJiYgcHJvcGVydHkudmFsdWUuY29uc3RhbnQgJiYgIXByb3BlcnR5LmNvbXB1dGVkO1xuICAgICAgaWYgKCFwcm9wZXJ0eS52YWx1ZS5jb25zdGFudCkge1xuICAgICAgICBhcmdzVG9XYXRjaC5wdXNoLmFwcGx5KGFyZ3NUb1dhdGNoLCBwcm9wZXJ0eS52YWx1ZS50b1dhdGNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBhc3QuY29uc3RhbnQgPSBhbGxDb25zdGFudHM7XG4gICAgYXN0LnRvV2F0Y2ggPSBhcmdzVG9XYXRjaDtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuVGhpc0V4cHJlc3Npb246XG4gICAgYXN0LmNvbnN0YW50ID0gZmFsc2U7XG4gICAgYXN0LnRvV2F0Y2ggPSBbXTtcbiAgICBicmVhaztcbiAgY2FzZSBBU1QuTG9jYWxzRXhwcmVzc2lvbjpcbiAgICBhc3QuY29uc3RhbnQgPSBmYWxzZTtcbiAgICBhc3QudG9XYXRjaCA9IFtdO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0cyhib2R5KSB7XG4gIGlmIChib2R5Lmxlbmd0aCAhPT0gMSkgcmV0dXJuO1xuICB2YXIgbGFzdEV4cHJlc3Npb24gPSBib2R5WzBdLmV4cHJlc3Npb247XG4gIHZhciBjYW5kaWRhdGUgPSBsYXN0RXhwcmVzc2lvbi50b1dhdGNoO1xuICBpZiAoY2FuZGlkYXRlLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgcmV0dXJuIGNhbmRpZGF0ZVswXSAhPT0gbGFzdEV4cHJlc3Npb24gPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQXNzaWduYWJsZShhc3QpIHtcbiAgcmV0dXJuIGFzdC50eXBlID09PSBBU1QuSWRlbnRpZmllciB8fCBhc3QudHlwZSA9PT0gQVNULk1lbWJlckV4cHJlc3Npb247XG59XG5cbmZ1bmN0aW9uIGFzc2lnbmFibGVBU1QoYXN0KSB7XG4gIGlmIChhc3QuYm9keS5sZW5ndGggPT09IDEgJiYgaXNBc3NpZ25hYmxlKGFzdC5ib2R5WzBdLmV4cHJlc3Npb24pKSB7XG4gICAgcmV0dXJuIHt0eXBlOiBBU1QuQXNzaWdubWVudEV4cHJlc3Npb24sIGxlZnQ6IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24sIHJpZ2h0OiB7dHlwZTogQVNULk5HVmFsdWVQYXJhbWV0ZXJ9LCBvcGVyYXRvcjogJz0nfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xpdGVyYWwoYXN0KSB7XG4gIHJldHVybiBhc3QuYm9keS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCA9PT0gMSAmJiAoXG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgPT09IEFTVC5MaXRlcmFsIHx8XG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgPT09IEFTVC5BcnJheUV4cHJlc3Npb24gfHxcbiAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSA9PT0gQVNULk9iamVjdEV4cHJlc3Npb24pO1xufVxuXG5mdW5jdGlvbiBpc0NvbnN0YW50KGFzdCkge1xuICByZXR1cm4gYXN0LmNvbnN0YW50O1xufVxuXG5mdW5jdGlvbiBBU1RDb21waWxlcihhc3RCdWlsZGVyLCAkZmlsdGVyKSB7XG4gIHRoaXMuYXN0QnVpbGRlciA9IGFzdEJ1aWxkZXI7XG4gIHRoaXMuJGZpbHRlciA9ICRmaWx0ZXI7XG59XG5cbkFTVENvbXBpbGVyLnByb3RvdHlwZSA9IHtcbiAgY29tcGlsZTogZnVuY3Rpb24oZXhwcmVzc2lvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXN0ID0gdGhpcy5hc3RCdWlsZGVyLmFzdChleHByZXNzaW9uKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbmV4dElkOiAwLFxuICAgICAgZmlsdGVyczoge30sXG4gICAgICBmbjoge3ZhcnM6IFtdLCBib2R5OiBbXSwgb3duOiB7fX0sXG4gICAgICBhc3NpZ246IHt2YXJzOiBbXSwgYm9keTogW10sIG93bjoge319LFxuICAgICAgaW5wdXRzOiBbXVxuICAgIH07XG4gICAgZmluZENvbnN0YW50QW5kV2F0Y2hFeHByZXNzaW9ucyhhc3QsIHNlbGYuJGZpbHRlcik7XG4gICAgdmFyIGV4dHJhID0gJyc7XG4gICAgdmFyIGFzc2lnbmFibGU7XG4gICAgdGhpcy5zdGFnZSA9ICdhc3NpZ24nO1xuICAgIGlmICgoYXNzaWduYWJsZSA9IGFzc2lnbmFibGVBU1QoYXN0KSkpIHtcbiAgICAgIHRoaXMuc3RhdGUuY29tcHV0aW5nID0gJ2Fzc2lnbic7XG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgIHRoaXMucmVjdXJzZShhc3NpZ25hYmxlLCByZXN1bHQpO1xuICAgICAgdGhpcy5yZXR1cm5fKHJlc3VsdCk7XG4gICAgICBleHRyYSA9ICdmbi5hc3NpZ249JyArIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbignYXNzaWduJywgJ3MsdixsJyk7XG4gICAgfVxuICAgIHZhciB0b1dhdGNoID0gZ2V0SW5wdXRzKGFzdC5ib2R5KTtcbiAgICBzZWxmLnN0YWdlID0gJ2lucHV0cyc7XG4gICAgZm9yRWFjaCh0b1dhdGNoLCBmdW5jdGlvbih3YXRjaCwga2V5KSB7XG4gICAgICB2YXIgZm5LZXkgPSAnZm4nICsga2V5O1xuICAgICAgc2VsZi5zdGF0ZVtmbktleV0gPSB7dmFyczogW10sIGJvZHk6IFtdLCBvd246IHt9fTtcbiAgICAgIHNlbGYuc3RhdGUuY29tcHV0aW5nID0gZm5LZXk7XG4gICAgICB2YXIgaW50b0lkID0gc2VsZi5uZXh0SWQoKTtcbiAgICAgIHNlbGYucmVjdXJzZSh3YXRjaCwgaW50b0lkKTtcbiAgICAgIHNlbGYucmV0dXJuXyhpbnRvSWQpO1xuICAgICAgc2VsZi5zdGF0ZS5pbnB1dHMucHVzaChmbktleSk7XG4gICAgICB3YXRjaC53YXRjaElkID0ga2V5O1xuICAgIH0pO1xuICAgIHRoaXMuc3RhdGUuY29tcHV0aW5nID0gJ2ZuJztcbiAgICB0aGlzLnN0YWdlID0gJ21haW4nO1xuICAgIHRoaXMucmVjdXJzZShhc3QpO1xuICAgIHZhciBmblN0cmluZyA9XG4gICAgICAvLyBUaGUgYnVpbGQgYW5kIG1pbmlmaWNhdGlvbiBzdGVwcyByZW1vdmUgdGhlIHN0cmluZyBcInVzZSBzdHJpY3RcIiBmcm9tIHRoZSBjb2RlLCBidXQgdGhpcyBpcyBkb25lIHVzaW5nIGEgcmVnZXguXG4gICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhpcyB1bnRpbCB3ZSBkbyBhIGJldHRlciBqb2IgYXQgb25seSByZW1vdmluZyB0aGUgcHJlZml4IG9ubHkgd2hlbiB3ZSBzaG91bGQuXG4gICAgICAnXCInICsgdGhpcy5VU0UgKyAnICcgKyB0aGlzLlNUUklDVCArICdcIjtcXG4nICtcbiAgICAgIHRoaXMuZmlsdGVyUHJlZml4KCkgK1xuICAgICAgJ3ZhciBmbj0nICsgdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uKCdmbicsICdzLGwsYSxpJykgK1xuICAgICAgZXh0cmEgK1xuICAgICAgdGhpcy53YXRjaEZucygpICtcbiAgICAgICdyZXR1cm4gZm47JztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIHZhciBmbiA9IChuZXcgRnVuY3Rpb24oJyRmaWx0ZXInLFxuICAgICAgICAnZ2V0U3RyaW5nVmFsdWUnLFxuICAgICAgICAnaWZEZWZpbmVkJyxcbiAgICAgICAgJ3BsdXMnLFxuICAgICAgICBmblN0cmluZykpKFxuICAgICAgICAgIHRoaXMuJGZpbHRlcixcbiAgICAgICAgICBnZXRTdHJpbmdWYWx1ZSxcbiAgICAgICAgICBpZkRlZmluZWQsXG4gICAgICAgICAgcGx1c0ZuKTtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGFnZSA9IHVuZGVmaW5lZDtcbiAgICBmbi5saXRlcmFsID0gaXNMaXRlcmFsKGFzdCk7XG4gICAgZm4uY29uc3RhbnQgPSBpc0NvbnN0YW50KGFzdCk7XG4gICAgcmV0dXJuIGZuO1xuICB9LFxuXG4gIFVTRTogJ3VzZScsXG5cbiAgU1RSSUNUOiAnc3RyaWN0JyxcblxuICB3YXRjaEZuczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBmbnMgPSB0aGlzLnN0YXRlLmlucHV0cztcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yRWFjaChmbnMsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCd2YXIgJyArIG5hbWUgKyAnPScgKyBzZWxmLmdlbmVyYXRlRnVuY3Rpb24obmFtZSwgJ3MnKSk7XG4gICAgfSk7XG4gICAgaWYgKGZucy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCdmbi5pbnB1dHM9WycgKyBmbnMuam9pbignLCcpICsgJ107Jyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbignJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVGdW5jdGlvbjogZnVuY3Rpb24obmFtZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuICdmdW5jdGlvbignICsgcGFyYW1zICsgJyl7JyArXG4gICAgICAgIHRoaXMudmFyc1ByZWZpeChuYW1lKSArXG4gICAgICAgIHRoaXMuYm9keShuYW1lKSArXG4gICAgICAgICd9Oyc7XG4gIH0sXG5cbiAgZmlsdGVyUHJlZml4OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yRWFjaCh0aGlzLnN0YXRlLmZpbHRlcnMsIGZ1bmN0aW9uKGlkLCBmaWx0ZXIpIHtcbiAgICAgIHBhcnRzLnB1c2goaWQgKyAnPSRmaWx0ZXIoJyArIHNlbGYuZXNjYXBlKGZpbHRlcikgKyAnKScpO1xuICAgIH0pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGgpIHJldHVybiAndmFyICcgKyBwYXJ0cy5qb2luKCcsJykgKyAnOyc7XG4gICAgcmV0dXJuICcnO1xuICB9LFxuXG4gIHZhcnNQcmVmaXg6IGZ1bmN0aW9uKHNlY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVtzZWN0aW9uXS52YXJzLmxlbmd0aCA/ICd2YXIgJyArIHRoaXMuc3RhdGVbc2VjdGlvbl0udmFycy5qb2luKCcsJykgKyAnOycgOiAnJztcbiAgfSxcblxuICBib2R5OiBmdW5jdGlvbihzZWN0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVbc2VjdGlvbl0uYm9keS5qb2luKCcnKTtcbiAgfSxcblxuICByZWN1cnNlOiBmdW5jdGlvbihhc3QsIGludG9JZCwgbmFtZUlkLCByZWN1cnNpb25GbiwgY3JlYXRlLCBza2lwV2F0Y2hJZENoZWNrKSB7XG4gICAgdmFyIGxlZnQsIHJpZ2h0LCBzZWxmID0gdGhpcywgYXJncywgZXhwcmVzc2lvbiwgY29tcHV0ZWQ7XG4gICAgcmVjdXJzaW9uRm4gPSByZWN1cnNpb25GbiB8fCBub29wO1xuICAgIGlmICghc2tpcFdhdGNoSWRDaGVjayAmJiBpc0RlZmluZWQoYXN0LndhdGNoSWQpKSB7XG4gICAgICBpbnRvSWQgPSBpbnRvSWQgfHwgdGhpcy5uZXh0SWQoKTtcbiAgICAgIHRoaXMuaWZfKCdpJyxcbiAgICAgICAgdGhpcy5sYXp5QXNzaWduKGludG9JZCwgdGhpcy5jb21wdXRlZE1lbWJlcignaScsIGFzdC53YXRjaElkKSksXG4gICAgICAgIHRoaXMubGF6eVJlY3Vyc2UoYXN0LCBpbnRvSWQsIG5hbWVJZCwgcmVjdXJzaW9uRm4sIGNyZWF0ZSwgdHJ1ZSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoYXN0LnR5cGUpIHtcbiAgICBjYXNlIEFTVC5Qcm9ncmFtOlxuICAgICAgZm9yRWFjaChhc3QuYm9keSwgZnVuY3Rpb24oZXhwcmVzc2lvbiwgcG9zKSB7XG4gICAgICAgIHNlbGYucmVjdXJzZShleHByZXNzaW9uLmV4cHJlc3Npb24sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBmdW5jdGlvbihleHByKSB7IHJpZ2h0ID0gZXhwcjsgfSk7XG4gICAgICAgIGlmIChwb3MgIT09IGFzdC5ib2R5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBzZWxmLmN1cnJlbnQoKS5ib2R5LnB1c2gocmlnaHQsICc7Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5yZXR1cm5fKHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5MaXRlcmFsOlxuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuZXNjYXBlKGFzdC52YWx1ZSk7XG4gICAgICB0aGlzLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8IGV4cHJlc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBU1QuVW5hcnlFeHByZXNzaW9uOlxuICAgICAgdGhpcy5yZWN1cnNlKGFzdC5hcmd1bWVudCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZ1bmN0aW9uKGV4cHIpIHsgcmlnaHQgPSBleHByOyB9KTtcbiAgICAgIGV4cHJlc3Npb24gPSBhc3Qub3BlcmF0b3IgKyAnKCcgKyB0aGlzLmlmRGVmaW5lZChyaWdodCwgMCkgKyAnKSc7XG4gICAgICB0aGlzLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgcmVjdXJzaW9uRm4oZXhwcmVzc2lvbik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5CaW5hcnlFeHByZXNzaW9uOlxuICAgICAgdGhpcy5yZWN1cnNlKGFzdC5sZWZ0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24oZXhwcikgeyBsZWZ0ID0gZXhwcjsgfSk7XG4gICAgICB0aGlzLnJlY3Vyc2UoYXN0LnJpZ2h0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZnVuY3Rpb24oZXhwcikgeyByaWdodCA9IGV4cHI7IH0pO1xuICAgICAgaWYgKGFzdC5vcGVyYXRvciA9PT0gJysnKSB7XG4gICAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnBsdXMobGVmdCwgcmlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChhc3Qub3BlcmF0b3IgPT09ICctJykge1xuICAgICAgICBleHByZXNzaW9uID0gdGhpcy5pZkRlZmluZWQobGVmdCwgMCkgKyBhc3Qub3BlcmF0b3IgKyB0aGlzLmlmRGVmaW5lZChyaWdodCwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHByZXNzaW9uID0gJygnICsgbGVmdCArICcpJyArIGFzdC5vcGVyYXRvciArICcoJyArIHJpZ2h0ICsgJyknO1xuICAgICAgfVxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGV4cHJlc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBU1QuTG9naWNhbEV4cHJlc3Npb246XG4gICAgICBpbnRvSWQgPSBpbnRvSWQgfHwgdGhpcy5uZXh0SWQoKTtcbiAgICAgIHNlbGYucmVjdXJzZShhc3QubGVmdCwgaW50b0lkKTtcbiAgICAgIHNlbGYuaWZfKGFzdC5vcGVyYXRvciA9PT0gJyYmJyA/IGludG9JZCA6IHNlbGYubm90KGludG9JZCksIHNlbGYubGF6eVJlY3Vyc2UoYXN0LnJpZ2h0LCBpbnRvSWQpKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5Db25kaXRpb25hbEV4cHJlc3Npb246XG4gICAgICBpbnRvSWQgPSBpbnRvSWQgfHwgdGhpcy5uZXh0SWQoKTtcbiAgICAgIHNlbGYucmVjdXJzZShhc3QudGVzdCwgaW50b0lkKTtcbiAgICAgIHNlbGYuaWZfKGludG9JZCwgc2VsZi5sYXp5UmVjdXJzZShhc3QuYWx0ZXJuYXRlLCBpbnRvSWQpLCBzZWxmLmxhenlSZWN1cnNlKGFzdC5jb25zZXF1ZW50LCBpbnRvSWQpKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5JZGVudGlmaWVyOlxuICAgICAgaW50b0lkID0gaW50b0lkIHx8IHRoaXMubmV4dElkKCk7XG4gICAgICBpZiAobmFtZUlkKSB7XG4gICAgICAgIG5hbWVJZC5jb250ZXh0ID0gc2VsZi5zdGFnZSA9PT0gJ2lucHV0cycgPyAncycgOiB0aGlzLmFzc2lnbih0aGlzLm5leHRJZCgpLCB0aGlzLmdldEhhc093blByb3BlcnR5KCdsJywgYXN0Lm5hbWUpICsgJz9sOnMnKTtcbiAgICAgICAgbmFtZUlkLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgIG5hbWVJZC5uYW1lID0gYXN0Lm5hbWU7XG4gICAgICB9XG4gICAgICBzZWxmLmlmXyhzZWxmLnN0YWdlID09PSAnaW5wdXRzJyB8fCBzZWxmLm5vdChzZWxmLmdldEhhc093blByb3BlcnR5KCdsJywgYXN0Lm5hbWUpKSxcbiAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5pZl8oc2VsZi5zdGFnZSA9PT0gJ2lucHV0cycgfHwgJ3MnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWZfKFxuICAgICAgICAgICAgICAgIHNlbGYuaXNOdWxsKHNlbGYubm9uQ29tcHV0ZWRNZW1iZXIoJ3MnLCBhc3QubmFtZSkpLFxuICAgICAgICAgICAgICAgIHNlbGYubGF6eUFzc2lnbihzZWxmLm5vbkNvbXB1dGVkTWVtYmVyKCdzJywgYXN0Lm5hbWUpLCAne30nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsIHNlbGYubm9uQ29tcHV0ZWRNZW1iZXIoJ3MnLCBhc3QubmFtZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBpbnRvSWQgJiYgc2VsZi5sYXp5QXNzaWduKGludG9JZCwgc2VsZi5ub25Db21wdXRlZE1lbWJlcignbCcsIGFzdC5uYW1lKSlcbiAgICAgICAgKTtcbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5NZW1iZXJFeHByZXNzaW9uOlxuICAgICAgbGVmdCA9IG5hbWVJZCAmJiAobmFtZUlkLmNvbnRleHQgPSB0aGlzLm5leHRJZCgpKSB8fCB0aGlzLm5leHRJZCgpO1xuICAgICAgaW50b0lkID0gaW50b0lkIHx8IHRoaXMubmV4dElkKCk7XG4gICAgICBzZWxmLnJlY3Vyc2UoYXN0Lm9iamVjdCwgbGVmdCwgdW5kZWZpbmVkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5pZl8oc2VsZi5ub3ROdWxsKGxlZnQpLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoYXN0LmNvbXB1dGVkKSB7XG4gICAgICAgICAgICByaWdodCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgICAgICBzZWxmLnJlY3Vyc2UoYXN0LnByb3BlcnR5LCByaWdodCk7XG4gICAgICAgICAgICBzZWxmLmdldFN0cmluZ1ZhbHVlKHJpZ2h0KTtcbiAgICAgICAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWZfKHNlbGYubm90KHNlbGYuY29tcHV0ZWRNZW1iZXIobGVmdCwgcmlnaHQpKSwgc2VsZi5sYXp5QXNzaWduKHNlbGYuY29tcHV0ZWRNZW1iZXIobGVmdCwgcmlnaHQpLCAne30nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHByZXNzaW9uID0gc2VsZi5jb21wdXRlZE1lbWJlcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgICAgICAgaWYgKG5hbWVJZCkge1xuICAgICAgICAgICAgICBuYW1lSWQuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBuYW1lSWQubmFtZSA9IHJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3JlYXRlICYmIGNyZWF0ZSAhPT0gMSkge1xuICAgICAgICAgICAgICBzZWxmLmlmXyhzZWxmLmlzTnVsbChzZWxmLm5vbkNvbXB1dGVkTWVtYmVyKGxlZnQsIGFzdC5wcm9wZXJ0eS5uYW1lKSksIHNlbGYubGF6eUFzc2lnbihzZWxmLm5vbkNvbXB1dGVkTWVtYmVyKGxlZnQsIGFzdC5wcm9wZXJ0eS5uYW1lKSwgJ3t9JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHNlbGYubm9uQ29tcHV0ZWRNZW1iZXIobGVmdCwgYXN0LnByb3BlcnR5Lm5hbWUpO1xuICAgICAgICAgICAgc2VsZi5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmIChuYW1lSWQpIHtcbiAgICAgICAgICAgICAgbmFtZUlkLmNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIG5hbWVJZC5uYW1lID0gYXN0LnByb3BlcnR5Lm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsICd1bmRlZmluZWQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICB9LCAhIWNyZWF0ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5DYWxsRXhwcmVzc2lvbjpcbiAgICAgIGludG9JZCA9IGludG9JZCB8fCB0aGlzLm5leHRJZCgpO1xuICAgICAgaWYgKGFzdC5maWx0ZXIpIHtcbiAgICAgICAgcmlnaHQgPSBzZWxmLmZpbHRlcihhc3QuY2FsbGVlLm5hbWUpO1xuICAgICAgICBhcmdzID0gW107XG4gICAgICAgIGZvckVhY2goYXN0LmFyZ3VtZW50cywgZnVuY3Rpb24oZXhwcikge1xuICAgICAgICAgIHZhciBhcmd1bWVudCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgICAgc2VsZi5yZWN1cnNlKGV4cHIsIGFyZ3VtZW50KTtcbiAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IHJpZ2h0ICsgJygnICsgYXJncy5qb2luKCcsJykgKyAnKSc7XG4gICAgICAgIHNlbGYuYXNzaWduKGludG9JZCwgZXhwcmVzc2lvbik7XG4gICAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByaWdodCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgIGxlZnQgPSB7fTtcbiAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICBzZWxmLnJlY3Vyc2UoYXN0LmNhbGxlZSwgcmlnaHQsIGxlZnQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYuaWZfKHNlbGYubm90TnVsbChyaWdodCksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZm9yRWFjaChhc3QuYXJndW1lbnRzLCBmdW5jdGlvbihleHByKSB7XG4gICAgICAgICAgICAgIHNlbGYucmVjdXJzZShleHByLCBhc3QuY29uc3RhbnQgPyB1bmRlZmluZWQgOiBzZWxmLm5leHRJZCgpLCB1bmRlZmluZWQsIGZ1bmN0aW9uKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChsZWZ0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHNlbGYubWVtYmVyKGxlZnQuY29udGV4dCwgbGVmdC5uYW1lLCBsZWZ0LmNvbXB1dGVkKSArICcoJyArIGFyZ3Muam9pbignLCcpICsgJyknO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHJpZ2h0ICsgJygnICsgYXJncy5qb2luKCcsJykgKyAnKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5hc3NpZ24oaW50b0lkLCAndW5kZWZpbmVkJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVjdXJzaW9uRm4oaW50b0lkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5Bc3NpZ25tZW50RXhwcmVzc2lvbjpcbiAgICAgIHJpZ2h0ID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgIGxlZnQgPSB7fTtcbiAgICAgIHRoaXMucmVjdXJzZShhc3QubGVmdCwgdW5kZWZpbmVkLCBsZWZ0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5pZl8oc2VsZi5ub3ROdWxsKGxlZnQuY29udGV4dCksIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYucmVjdXJzZShhc3QucmlnaHQsIHJpZ2h0KTtcbiAgICAgICAgICBleHByZXNzaW9uID0gc2VsZi5tZW1iZXIobGVmdC5jb250ZXh0LCBsZWZ0Lm5hbWUsIGxlZnQuY29tcHV0ZWQpICsgYXN0Lm9wZXJhdG9yICsgcmlnaHQ7XG4gICAgICAgICAgc2VsZi5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgICAgICByZWN1cnNpb25GbihpbnRvSWQgfHwgZXhwcmVzc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSwgMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5BcnJheUV4cHJlc3Npb246XG4gICAgICBhcmdzID0gW107XG4gICAgICBmb3JFYWNoKGFzdC5lbGVtZW50cywgZnVuY3Rpb24oZXhwcikge1xuICAgICAgICBzZWxmLnJlY3Vyc2UoZXhwciwgYXN0LmNvbnN0YW50ID8gdW5kZWZpbmVkIDogc2VsZi5uZXh0SWQoKSwgdW5kZWZpbmVkLCBmdW5jdGlvbihhcmd1bWVudCkge1xuICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBleHByZXNzaW9uID0gJ1snICsgYXJncy5qb2luKCcsJykgKyAnXSc7XG4gICAgICB0aGlzLmFzc2lnbihpbnRvSWQsIGV4cHJlc3Npb24pO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8IGV4cHJlc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBU1QuT2JqZWN0RXhwcmVzc2lvbjpcbiAgICAgIGFyZ3MgPSBbXTtcbiAgICAgIGNvbXB1dGVkID0gZmFsc2U7XG4gICAgICBmb3JFYWNoKGFzdC5wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAocHJvcGVydHkuY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb21wdXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICAgIGludG9JZCA9IGludG9JZCB8fCB0aGlzLm5leHRJZCgpO1xuICAgICAgICB0aGlzLmFzc2lnbihpbnRvSWQsICd7fScpO1xuICAgICAgICBmb3JFYWNoKGFzdC5wcm9wZXJ0aWVzLCBmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgICAgIGlmIChwcm9wZXJ0eS5jb21wdXRlZCkge1xuICAgICAgICAgICAgbGVmdCA9IHNlbGYubmV4dElkKCk7XG4gICAgICAgICAgICBzZWxmLnJlY3Vyc2UocHJvcGVydHkua2V5LCBsZWZ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVmdCA9IHByb3BlcnR5LmtleS50eXBlID09PSBBU1QuSWRlbnRpZmllciA/XG4gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmtleS5uYW1lIDpcbiAgICAgICAgICAgICAgICAgICAgICAgKCcnICsgcHJvcGVydHkua2V5LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmlnaHQgPSBzZWxmLm5leHRJZCgpO1xuICAgICAgICAgIHNlbGYucmVjdXJzZShwcm9wZXJ0eS52YWx1ZSwgcmlnaHQpO1xuICAgICAgICAgIHNlbGYuYXNzaWduKHNlbGYubWVtYmVyKGludG9JZCwgbGVmdCwgcHJvcGVydHkuY29tcHV0ZWQpLCByaWdodCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yRWFjaChhc3QucHJvcGVydGllcywgZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgICBzZWxmLnJlY3Vyc2UocHJvcGVydHkudmFsdWUsIGFzdC5jb25zdGFudCA/IHVuZGVmaW5lZCA6IHNlbGYubmV4dElkKCksIHVuZGVmaW5lZCwgZnVuY3Rpb24oZXhwcikge1xuICAgICAgICAgICAgYXJncy5wdXNoKHNlbGYuZXNjYXBlKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LmtleS50eXBlID09PSBBU1QuSWRlbnRpZmllciA/IHByb3BlcnR5LmtleS5uYW1lIDpcbiAgICAgICAgICAgICAgICAgICgnJyArIHByb3BlcnR5LmtleS52YWx1ZSkpICtcbiAgICAgICAgICAgICAgICAnOicgKyBleHByKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cHJlc3Npb24gPSAneycgKyBhcmdzLmpvaW4oJywnKSArICd9JztcbiAgICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCBleHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICAgIHJlY3Vyc2lvbkZuKGludG9JZCB8fCBleHByZXNzaW9uKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQVNULlRoaXNFeHByZXNzaW9uOlxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCAncycpO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8ICdzJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5Mb2NhbHNFeHByZXNzaW9uOlxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCAnbCcpO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8ICdsJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFTVC5OR1ZhbHVlUGFyYW1ldGVyOlxuICAgICAgdGhpcy5hc3NpZ24oaW50b0lkLCAndicpO1xuICAgICAgcmVjdXJzaW9uRm4oaW50b0lkIHx8ICd2Jyk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0sXG5cbiAgZ2V0SGFzT3duUHJvcGVydHk6IGZ1bmN0aW9uKGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQgKyAnLicgKyBwcm9wZXJ0eTtcbiAgICB2YXIgb3duID0gdGhpcy5jdXJyZW50KCkub3duO1xuICAgIGlmICghb3duLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIG93bltrZXldID0gdGhpcy5uZXh0SWQoZmFsc2UsIGVsZW1lbnQgKyAnJiYoJyArIHRoaXMuZXNjYXBlKHByb3BlcnR5KSArICcgaW4gJyArIGVsZW1lbnQgKyAnKScpO1xuICAgIH1cbiAgICByZXR1cm4gb3duW2tleV07XG4gIH0sXG5cbiAgYXNzaWduOiBmdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKGlkLCAnPScsIHZhbHVlLCAnOycpO1xuICAgIHJldHVybiBpZDtcbiAgfSxcblxuICBmaWx0ZXI6IGZ1bmN0aW9uKGZpbHRlck5hbWUpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZmlsdGVycy5oYXNPd25Qcm9wZXJ0eShmaWx0ZXJOYW1lKSkge1xuICAgICAgdGhpcy5zdGF0ZS5maWx0ZXJzW2ZpbHRlck5hbWVdID0gdGhpcy5uZXh0SWQodHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlLmZpbHRlcnNbZmlsdGVyTmFtZV07XG4gIH0sXG5cbiAgaWZEZWZpbmVkOiBmdW5jdGlvbihpZCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuICdpZkRlZmluZWQoJyArIGlkICsgJywnICsgdGhpcy5lc2NhcGUoZGVmYXVsdFZhbHVlKSArICcpJztcbiAgfSxcblxuICBwbHVzOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiAncGx1cygnICsgbGVmdCArICcsJyArIHJpZ2h0ICsgJyknO1xuICB9LFxuXG4gIHJldHVybl86IGZ1bmN0aW9uKGlkKSB7XG4gICAgdGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKCdyZXR1cm4gJywgaWQsICc7Jyk7XG4gIH0sXG5cbiAgaWZfOiBmdW5jdGlvbih0ZXN0LCBhbHRlcm5hdGUsIGNvbnNlcXVlbnQpIHtcbiAgICBpZiAodGVzdCA9PT0gdHJ1ZSkge1xuICAgICAgYWx0ZXJuYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBib2R5ID0gdGhpcy5jdXJyZW50KCkuYm9keTtcbiAgICAgIGJvZHkucHVzaCgnaWYoJywgdGVzdCwgJyl7Jyk7XG4gICAgICBhbHRlcm5hdGUoKTtcbiAgICAgIGJvZHkucHVzaCgnfScpO1xuICAgICAgaWYgKGNvbnNlcXVlbnQpIHtcbiAgICAgICAgYm9keS5wdXNoKCdlbHNleycpO1xuICAgICAgICBjb25zZXF1ZW50KCk7XG4gICAgICAgIGJvZHkucHVzaCgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBub3Q6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gJyEoJyArIGV4cHJlc3Npb24gKyAnKSc7XG4gIH0sXG5cbiAgaXNOdWxsOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24gKyAnPT1udWxsJztcbiAgfSxcblxuICBub3ROdWxsOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24gKyAnIT1udWxsJztcbiAgfSxcblxuICBub25Db21wdXRlZE1lbWJlcjogZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICB2YXIgU0FGRV9JREVOVElGSUVSID0gL15bJF9hLXpBLVpdWyRfYS16QS1aMC05XSokLztcbiAgICB2YXIgVU5TQUZFX0NIQVJBQ1RFUlMgPSAvW14kX2EtekEtWjAtOV0vZztcbiAgICBpZiAoU0FGRV9JREVOVElGSUVSLnRlc3QocmlnaHQpKSB7XG4gICAgICByZXR1cm4gbGVmdCArICcuJyArIHJpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCAgKyAnW1wiJyArIHJpZ2h0LnJlcGxhY2UoVU5TQUZFX0NIQVJBQ1RFUlMsIHRoaXMuc3RyaW5nRXNjYXBlRm4pICsgJ1wiXSc7XG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkTWVtYmVyOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBsZWZ0ICsgJ1snICsgcmlnaHQgKyAnXSc7XG4gIH0sXG5cbiAgbWVtYmVyOiBmdW5jdGlvbihsZWZ0LCByaWdodCwgY29tcHV0ZWQpIHtcbiAgICBpZiAoY29tcHV0ZWQpIHJldHVybiB0aGlzLmNvbXB1dGVkTWVtYmVyKGxlZnQsIHJpZ2h0KTtcbiAgICByZXR1cm4gdGhpcy5ub25Db21wdXRlZE1lbWJlcihsZWZ0LCByaWdodCk7XG4gIH0sXG5cbiAgZ2V0U3RyaW5nVmFsdWU6IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB0aGlzLmFzc2lnbihpdGVtLCAnZ2V0U3RyaW5nVmFsdWUoJyArIGl0ZW0gKyAnKScpO1xuICB9LFxuXG4gIGxhenlSZWN1cnNlOiBmdW5jdGlvbihhc3QsIGludG9JZCwgbmFtZUlkLCByZWN1cnNpb25GbiwgY3JlYXRlLCBza2lwV2F0Y2hJZENoZWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYucmVjdXJzZShhc3QsIGludG9JZCwgbmFtZUlkLCByZWN1cnNpb25GbiwgY3JlYXRlLCBza2lwV2F0Y2hJZENoZWNrKTtcbiAgICB9O1xuICB9LFxuXG4gIGxhenlBc3NpZ246IGZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmFzc2lnbihpZCwgdmFsdWUpO1xuICAgIH07XG4gIH0sXG5cbiAgc3RyaW5nRXNjYXBlUmVnZXg6IC9bXiBhLXpBLVowLTldL2csXG5cbiAgc3RyaW5nRXNjYXBlRm46IGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArICgnMDAwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7XG4gIH0sXG5cbiAgZXNjYXBlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHJldHVybiAnXFwnJyArIHZhbHVlLnJlcGxhY2UodGhpcy5zdHJpbmdFc2NhcGVSZWdleCwgdGhpcy5zdHJpbmdFc2NhcGVGbikgKyAnXFwnJztcbiAgICBpZiAoaXNOdW1iZXIodmFsdWUpKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiAndHJ1ZSc7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkgcmV0dXJuICdmYWxzZSc7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ3VuZGVmaW5lZCc7XG5cbiAgICB0aHJvdyAkcGFyc2VNaW5FcnIoJ2VzYycsICdJTVBPU1NJQkxFJyk7XG4gIH0sXG5cbiAgbmV4dElkOiBmdW5jdGlvbihza2lwLCBpbml0KSB7XG4gICAgdmFyIGlkID0gJ3YnICsgKHRoaXMuc3RhdGUubmV4dElkKyspO1xuICAgIGlmICghc2tpcCkge1xuICAgICAgdGhpcy5jdXJyZW50KCkudmFycy5wdXNoKGlkICsgKGluaXQgPyAnPScgKyBpbml0IDogJycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkO1xuICB9LFxuXG4gIGN1cnJlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMuc3RhdGUuY29tcHV0aW5nXTtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBBU1RJbnRlcnByZXRlcihhc3RCdWlsZGVyLCAkZmlsdGVyKSB7XG4gIHRoaXMuYXN0QnVpbGRlciA9IGFzdEJ1aWxkZXI7XG4gIHRoaXMuJGZpbHRlciA9ICRmaWx0ZXI7XG59XG5cbkFTVEludGVycHJldGVyLnByb3RvdHlwZSA9IHtcbiAgY29tcGlsZTogZnVuY3Rpb24oZXhwcmVzc2lvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYXN0ID0gdGhpcy5hc3RCdWlsZGVyLmFzdChleHByZXNzaW9uKTtcbiAgICBmaW5kQ29uc3RhbnRBbmRXYXRjaEV4cHJlc3Npb25zKGFzdCwgc2VsZi4kZmlsdGVyKTtcbiAgICB2YXIgYXNzaWduYWJsZTtcbiAgICB2YXIgYXNzaWduO1xuICAgIGlmICgoYXNzaWduYWJsZSA9IGFzc2lnbmFibGVBU1QoYXN0KSkpIHtcbiAgICAgIGFzc2lnbiA9IHRoaXMucmVjdXJzZShhc3NpZ25hYmxlKTtcbiAgICB9XG4gICAgdmFyIHRvV2F0Y2ggPSBnZXRJbnB1dHMoYXN0LmJvZHkpO1xuICAgIHZhciBpbnB1dHM7XG4gICAgaWYgKHRvV2F0Y2gpIHtcbiAgICAgIGlucHV0cyA9IFtdO1xuICAgICAgZm9yRWFjaCh0b1dhdGNoLCBmdW5jdGlvbih3YXRjaCwga2V5KSB7XG4gICAgICAgIHZhciBpbnB1dCA9IHNlbGYucmVjdXJzZSh3YXRjaCk7XG4gICAgICAgIHdhdGNoLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIGlucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgICAgd2F0Y2gud2F0Y2hJZCA9IGtleTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICBmb3JFYWNoKGFzdC5ib2R5LCBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgICBleHByZXNzaW9ucy5wdXNoKHNlbGYucmVjdXJzZShleHByZXNzaW9uLmV4cHJlc3Npb24pKTtcbiAgICB9KTtcbiAgICB2YXIgZm4gPSBhc3QuYm9keS5sZW5ndGggPT09IDAgPyBub29wIDpcbiAgICAgICAgICAgICBhc3QuYm9keS5sZW5ndGggPT09IDEgPyBleHByZXNzaW9uc1swXSA6XG4gICAgICAgICAgICAgZnVuY3Rpb24oc2NvcGUsIGxvY2Fscykge1xuICAgICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZTtcbiAgICAgICAgICAgICAgIGZvckVhY2goZXhwcmVzc2lvbnMsIGZ1bmN0aW9uKGV4cCkge1xuICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBleHAoc2NvcGUsIGxvY2Fscyk7XG4gICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIHJldHVybiBsYXN0VmFsdWU7XG4gICAgICAgICAgICAgfTtcbiAgICBpZiAoYXNzaWduKSB7XG4gICAgICBmbi5hc3NpZ24gPSBmdW5jdGlvbihzY29wZSwgdmFsdWUsIGxvY2Fscykge1xuICAgICAgICByZXR1cm4gYXNzaWduKHNjb3BlLCBsb2NhbHMsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpbnB1dHMpIHtcbiAgICAgIGZuLmlucHV0cyA9IGlucHV0cztcbiAgICB9XG4gICAgZm4ubGl0ZXJhbCA9IGlzTGl0ZXJhbChhc3QpO1xuICAgIGZuLmNvbnN0YW50ID0gaXNDb25zdGFudChhc3QpO1xuICAgIHJldHVybiBmbjtcbiAgfSxcblxuICByZWN1cnNlOiBmdW5jdGlvbihhc3QsIGNvbnRleHQsIGNyZWF0ZSkge1xuICAgIHZhciBsZWZ0LCByaWdodCwgc2VsZiA9IHRoaXMsIGFyZ3M7XG4gICAgaWYgKGFzdC5pbnB1dCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzKGFzdC5pbnB1dCwgYXN0LndhdGNoSWQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGFzdC50eXBlKSB7XG4gICAgY2FzZSBBU1QuTGl0ZXJhbDpcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlKGFzdC52YWx1ZSwgY29udGV4dCk7XG4gICAgY2FzZSBBU1QuVW5hcnlFeHByZXNzaW9uOlxuICAgICAgcmlnaHQgPSB0aGlzLnJlY3Vyc2UoYXN0LmFyZ3VtZW50KTtcbiAgICAgIHJldHVybiB0aGlzWyd1bmFyeScgKyBhc3Qub3BlcmF0b3JdKHJpZ2h0LCBjb250ZXh0KTtcbiAgICBjYXNlIEFTVC5CaW5hcnlFeHByZXNzaW9uOlxuICAgICAgbGVmdCA9IHRoaXMucmVjdXJzZShhc3QubGVmdCk7XG4gICAgICByaWdodCA9IHRoaXMucmVjdXJzZShhc3QucmlnaHQpO1xuICAgICAgcmV0dXJuIHRoaXNbJ2JpbmFyeScgKyBhc3Qub3BlcmF0b3JdKGxlZnQsIHJpZ2h0LCBjb250ZXh0KTtcbiAgICBjYXNlIEFTVC5Mb2dpY2FsRXhwcmVzc2lvbjpcbiAgICAgIGxlZnQgPSB0aGlzLnJlY3Vyc2UoYXN0LmxlZnQpO1xuICAgICAgcmlnaHQgPSB0aGlzLnJlY3Vyc2UoYXN0LnJpZ2h0KTtcbiAgICAgIHJldHVybiB0aGlzWydiaW5hcnknICsgYXN0Lm9wZXJhdG9yXShsZWZ0LCByaWdodCwgY29udGV4dCk7XG4gICAgY2FzZSBBU1QuQ29uZGl0aW9uYWxFeHByZXNzaW9uOlxuICAgICAgcmV0dXJuIHRoaXNbJ3Rlcm5hcnk/OiddKFxuICAgICAgICB0aGlzLnJlY3Vyc2UoYXN0LnRlc3QpLFxuICAgICAgICB0aGlzLnJlY3Vyc2UoYXN0LmFsdGVybmF0ZSksXG4gICAgICAgIHRoaXMucmVjdXJzZShhc3QuY29uc2VxdWVudCksXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG4gICAgY2FzZSBBU1QuSWRlbnRpZmllcjpcbiAgICAgIHJldHVybiBzZWxmLmlkZW50aWZpZXIoYXN0Lm5hbWUsIGNvbnRleHQsIGNyZWF0ZSk7XG4gICAgY2FzZSBBU1QuTWVtYmVyRXhwcmVzc2lvbjpcbiAgICAgIGxlZnQgPSB0aGlzLnJlY3Vyc2UoYXN0Lm9iamVjdCwgZmFsc2UsICEhY3JlYXRlKTtcbiAgICAgIGlmICghYXN0LmNvbXB1dGVkKSB7XG4gICAgICAgIHJpZ2h0ID0gYXN0LnByb3BlcnR5Lm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAoYXN0LmNvbXB1dGVkKSByaWdodCA9IHRoaXMucmVjdXJzZShhc3QucHJvcGVydHkpO1xuICAgICAgcmV0dXJuIGFzdC5jb21wdXRlZCA/XG4gICAgICAgIHRoaXMuY29tcHV0ZWRNZW1iZXIobGVmdCwgcmlnaHQsIGNvbnRleHQsIGNyZWF0ZSkgOlxuICAgICAgICB0aGlzLm5vbkNvbXB1dGVkTWVtYmVyKGxlZnQsIHJpZ2h0LCBjb250ZXh0LCBjcmVhdGUpO1xuICAgIGNhc2UgQVNULkNhbGxFeHByZXNzaW9uOlxuICAgICAgYXJncyA9IFtdO1xuICAgICAgZm9yRWFjaChhc3QuYXJndW1lbnRzLCBmdW5jdGlvbihleHByKSB7XG4gICAgICAgIGFyZ3MucHVzaChzZWxmLnJlY3Vyc2UoZXhwcikpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYXN0LmZpbHRlcikgcmlnaHQgPSB0aGlzLiRmaWx0ZXIoYXN0LmNhbGxlZS5uYW1lKTtcbiAgICAgIGlmICghYXN0LmZpbHRlcikgcmlnaHQgPSB0aGlzLnJlY3Vyc2UoYXN0LmNhbGxlZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gYXN0LmZpbHRlciA/XG4gICAgICAgIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goYXJnc1tpXShzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdmFsdWUgPSByaWdodC5hcHBseSh1bmRlZmluZWQsIHZhbHVlcywgaW5wdXRzKTtcbiAgICAgICAgICByZXR1cm4gY29udGV4dCA/IHtjb250ZXh0OiB1bmRlZmluZWQsIG5hbWU6IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfSA6IHZhbHVlO1xuICAgICAgICB9IDpcbiAgICAgICAgZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgICAgICB2YXIgcmhzID0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICBpZiAocmhzLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChhcmdzW2ldKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHJocy52YWx1ZS5hcHBseShyaHMuY29udGV4dCwgdmFsdWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IHZhbHVlfSA6IHZhbHVlO1xuICAgICAgICB9O1xuICAgIGNhc2UgQVNULkFzc2lnbm1lbnRFeHByZXNzaW9uOlxuICAgICAgbGVmdCA9IHRoaXMucmVjdXJzZShhc3QubGVmdCwgdHJ1ZSwgMSk7XG4gICAgICByaWdodCA9IHRoaXMucmVjdXJzZShhc3QucmlnaHQpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICAgIHZhciBsaHMgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgdmFyIHJocyA9IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgbGhzLmNvbnRleHRbbGhzLm5hbWVdID0gcmhzO1xuICAgICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogcmhzfSA6IHJocztcbiAgICAgIH07XG4gICAgY2FzZSBBU1QuQXJyYXlFeHByZXNzaW9uOlxuICAgICAgYXJncyA9IFtdO1xuICAgICAgZm9yRWFjaChhc3QuZWxlbWVudHMsIGZ1bmN0aW9uKGV4cHIpIHtcbiAgICAgICAgYXJncy5wdXNoKHNlbGYucmVjdXJzZShleHByKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgICB2YXIgdmFsdWUgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFsdWUucHVzaChhcmdzW2ldKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IHZhbHVlfSA6IHZhbHVlO1xuICAgICAgfTtcbiAgICBjYXNlIEFTVC5PYmplY3RFeHByZXNzaW9uOlxuICAgICAgYXJncyA9IFtdO1xuICAgICAgZm9yRWFjaChhc3QucHJvcGVydGllcywgZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5LmNvbXB1dGVkKSB7XG4gICAgICAgICAgYXJncy5wdXNoKHtrZXk6IHNlbGYucmVjdXJzZShwcm9wZXJ0eS5rZXkpLFxuICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5yZWN1cnNlKHByb3BlcnR5LnZhbHVlKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3MucHVzaCh7a2V5OiBwcm9wZXJ0eS5rZXkudHlwZSA9PT0gQVNULklkZW50aWZpZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5rZXkubmFtZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnJyArIHByb3BlcnR5LmtleS52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5yZWN1cnNlKHByb3BlcnR5LnZhbHVlKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgICB2YXIgdmFsdWUgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGFyZ3NbaV0uY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHZhbHVlW2FyZ3NbaV0ua2V5KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKV0gPSBhcmdzW2ldLnZhbHVlKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVbYXJnc1tpXS5rZXldID0gYXJnc1tpXS52YWx1ZShzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiB2YWx1ZX0gOiB2YWx1ZTtcbiAgICAgIH07XG4gICAgY2FzZSBBU1QuVGhpc0V4cHJlc3Npb246XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IHNjb3BlfSA6IHNjb3BlO1xuICAgICAgfTtcbiAgICBjYXNlIEFTVC5Mb2NhbHNFeHByZXNzaW9uOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGxvY2Fsc30gOiBsb2NhbHM7XG4gICAgICB9O1xuICAgIGNhc2UgQVNULk5HVmFsdWVQYXJhbWV0ZXI6XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhc3NpZ259IDogYXNzaWduO1xuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgJ3VuYXJ5Kyc6IGZ1bmN0aW9uKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gYXJndW1lbnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgaWYgKGlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgIGFyZyA9ICthcmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcgPSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ3VuYXJ5LSc6IGZ1bmN0aW9uKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gYXJndW1lbnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgaWYgKGlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgIGFyZyA9IC1hcmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcmcgPSAtMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICd1bmFyeSEnOiBmdW5jdGlvbihhcmd1bWVudCwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGFyZyA9ICFhcmd1bWVudChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Kyc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgbGhzID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICB2YXIgcmhzID0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgdmFyIGFyZyA9IHBsdXNGbihsaHMsIHJocyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5LSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgbGhzID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICB2YXIgcmhzID0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgdmFyIGFyZyA9IChpc0RlZmluZWQobGhzKSA/IGxocyA6IDApIC0gKGlzRGVmaW5lZChyaHMpID8gcmhzIDogMCk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Kic6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgKiByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Lyc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgLyByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5JSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgJSByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5PT09JzogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBhcmcgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSA9PT0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ2JpbmFyeSE9PSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgIT09IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICdiaW5hcnk9PSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPT0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ2JpbmFyeSE9JzogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgIHZhciBhcmcgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSAhPSByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5PCc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPCByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5Pic6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPiByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5PD0nOiBmdW5jdGlvbihsZWZ0LCByaWdodCwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGFyZyA9IGxlZnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIDw9IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICdiaW5hcnk+PSc6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYXJnID0gbGVmdChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgPj0gcmlnaHQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgcmV0dXJuIGNvbnRleHQgPyB7dmFsdWU6IGFyZ30gOiBhcmc7XG4gICAgfTtcbiAgfSxcbiAgJ2JpbmFyeSYmJzogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBhcmcgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSAmJiByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICByZXR1cm4gY29udGV4dCA/IHt2YWx1ZTogYXJnfSA6IGFyZztcbiAgICB9O1xuICB9LFxuICAnYmluYXJ5fHwnOiBmdW5jdGlvbihsZWZ0LCByaWdodCwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGFyZyA9IGxlZnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHx8IHJpZ2h0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gICd0ZXJuYXJ5PzonOiBmdW5jdGlvbih0ZXN0LCBhbHRlcm5hdGUsIGNvbnNlcXVlbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBhcmcgPSB0ZXN0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSA/IGFsdGVybmF0ZShzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykgOiBjb25zZXF1ZW50KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIHJldHVybiBjb250ZXh0ID8ge3ZhbHVlOiBhcmd9IDogYXJnO1xuICAgIH07XG4gIH0sXG4gIHZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGNvbnRleHQgPyB7Y29udGV4dDogdW5kZWZpbmVkLCBuYW1lOiB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX0gOiB2YWx1ZTsgfTtcbiAgfSxcbiAgaWRlbnRpZmllcjogZnVuY3Rpb24obmFtZSwgY29udGV4dCwgY3JlYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKSB7XG4gICAgICB2YXIgYmFzZSA9IGxvY2FscyAmJiAobmFtZSBpbiBsb2NhbHMpID8gbG9jYWxzIDogc2NvcGU7XG4gICAgICBpZiAoY3JlYXRlICYmIGNyZWF0ZSAhPT0gMSAmJiBiYXNlICYmIGJhc2VbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBiYXNlW25hbWVdID0ge307XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBiYXNlID8gYmFzZVtuYW1lXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB7Y29udGV4dDogYmFzZSwgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBjb21wdXRlZE1lbWJlcjogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGNvbnRleHQsIGNyZWF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgdmFyIGxocyA9IGxlZnQoc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgdmFyIHJocztcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmIChsaHMgIT0gbnVsbCkge1xuICAgICAgICByaHMgPSByaWdodChzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cyk7XG4gICAgICAgIHJocyA9IGdldFN0cmluZ1ZhbHVlKHJocyk7XG4gICAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgICAgaWYgKGxocyAmJiAhKGxoc1tyaHNdKSkge1xuICAgICAgICAgICAgbGhzW3Joc10gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBsaHNbcmhzXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB7Y29udGV4dDogbGhzLCBuYW1lOiByaHMsIHZhbHVlOiB2YWx1ZX07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgbm9uQ29tcHV0ZWRNZW1iZXI6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0LCBjb250ZXh0LCBjcmVhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgIHZhciBsaHMgPSBsZWZ0KHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgIGlmIChjcmVhdGUgJiYgY3JlYXRlICE9PSAxKSB7XG4gICAgICAgIGlmIChsaHMgJiYgbGhzW3JpZ2h0XSA9PSBudWxsKSB7XG4gICAgICAgICAgbGhzW3JpZ2h0XSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBsaHMgIT0gbnVsbCA/IGxoc1tyaWdodF0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4ge2NvbnRleHQ6IGxocywgbmFtZTogcmlnaHQsIHZhbHVlOiB2YWx1ZX07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgaW5wdXRzOiBmdW5jdGlvbihpbnB1dCwgd2F0Y2hJZCkge1xuICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgdmFsdWUsIGxvY2FscywgaW5wdXRzKSB7XG4gICAgICBpZiAoaW5wdXRzKSByZXR1cm4gaW5wdXRzW3dhdGNoSWRdO1xuICAgICAgcmV0dXJuIGlucHV0KHNjb3BlLCB2YWx1ZSwgbG9jYWxzKTtcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGxleGVyLCAkZmlsdGVyLCBvcHRpb25zKSB7XG4gIHRoaXMubGV4ZXIgPSBsZXhlcjtcbiAgdGhpcy4kZmlsdGVyID0gJGZpbHRlcjtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5hc3QgPSBuZXcgQVNUKGxleGVyLCBvcHRpb25zKTtcbiAgdGhpcy5hc3RDb21waWxlciA9IG9wdGlvbnMuY3NwID8gbmV3IEFTVEludGVycHJldGVyKHRoaXMuYXN0LCAkZmlsdGVyKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBU1RDb21waWxlcih0aGlzLmFzdCwgJGZpbHRlcik7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogUGFyc2VyLFxuXG4gIHBhcnNlOiBmdW5jdGlvbih0ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuYXN0Q29tcGlsZXIuY29tcGlsZSh0ZXh0KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0VmFsdWVPZih2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZS52YWx1ZU9mKSA/IHZhbHVlLnZhbHVlT2YoKSA6IG9iamVjdFZhbHVlT2YuY2FsbCh2YWx1ZSk7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRwYXJzZVxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBDb252ZXJ0cyBBbmd1bGFyIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGludG8gYSBmdW5jdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogICB2YXIgZ2V0dGVyID0gJHBhcnNlKCd1c2VyLm5hbWUnKTtcbiAqICAgdmFyIHNldHRlciA9IGdldHRlci5hc3NpZ247XG4gKiAgIHZhciBjb250ZXh0ID0ge3VzZXI6e25hbWU6J2FuZ3VsYXInfX07XG4gKiAgIHZhciBsb2NhbHMgPSB7dXNlcjp7bmFtZTonbG9jYWwnfX07XG4gKlxuICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQpKS50b0VxdWFsKCdhbmd1bGFyJyk7XG4gKiAgIHNldHRlcihjb250ZXh0LCAnbmV3VmFsdWUnKTtcbiAqICAgZXhwZWN0KGNvbnRleHQudXNlci5uYW1lKS50b0VxdWFsKCduZXdWYWx1ZScpO1xuICogICBleHBlY3QoZ2V0dGVyKGNvbnRleHQsIGxvY2FscykpLnRvRXF1YWwoJ2xvY2FsJyk7XG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246XG4gKlxuICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nc1xuICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuXG4gKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gKiAgICAgIGBjb250ZXh0YC5cbiAqXG4gKiAgICBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gYWxzbyBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgICAqIGBsaXRlcmFsYCDigJMgYHtib29sZWFufWAg4oCTIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24ncyB0b3AtbGV2ZWwgbm9kZSBpcyBhIEphdmFTY3JpcHRcbiAqICAgICAgICBsaXRlcmFsLlxuICogICAgICAqIGBjb25zdGFudGAg4oCTIGB7Ym9vbGVhbn1gIOKAkyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIGlzIG1hZGUgZW50aXJlbHkgb2YgSmF2YVNjcmlwdFxuICogICAgICAgIGNvbnN0YW50IGxpdGVyYWxzLlxuICogICAgICAqIGBhc3NpZ25gIOKAkyBgez9mdW5jdGlvbihjb250ZXh0LCB2YWx1ZSl9YCDigJMgaWYgdGhlIGV4cHJlc3Npb24gaXMgYXNzaWduYWJsZSwgdGhpcyB3aWxsIGJlXG4gKiAgICAgICAgc2V0IHRvIGEgZnVuY3Rpb24gdG8gY2hhbmdlIGl0cyB2YWx1ZSBvbiB0aGUgZ2l2ZW4gY29udGV4dC5cbiAqXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJHBhcnNlUHJvdmlkZXJcbiAqIEB0aGlzXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBgJHBhcnNlUHJvdmlkZXJgIGNhbiBiZSB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUge0BsaW5rIG5nLiRwYXJzZSAkcGFyc2V9XG4gKiAgc2VydmljZS5cbiAqL1xuZnVuY3Rpb24gJFBhcnNlUHJvdmlkZXIoKSB7XG4gIHZhciBjYWNoZSA9IGNyZWF0ZU1hcCgpO1xuICB2YXIgbGl0ZXJhbHMgPSB7XG4gICAgJ3RydWUnOiB0cnVlLFxuICAgICdmYWxzZSc6IGZhbHNlLFxuICAgICdudWxsJzogbnVsbCxcbiAgICAndW5kZWZpbmVkJzogdW5kZWZpbmVkXG4gIH07XG4gIHZhciBpZGVudFN0YXJ0LCBpZGVudENvbnRpbnVlO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRwYXJzZVByb3ZpZGVyI2FkZExpdGVyYWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIENvbmZpZ3VyZSAkcGFyc2Ugc2VydmljZSB0byBhZGQgbGl0ZXJhbCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHByZXNlbnQgYXMgbGl0ZXJhbCBhdCBleHByZXNzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpdGVyYWxOYW1lIFRva2VuIGZvciB0aGUgbGl0ZXJhbCB2YWx1ZS4gVGhlIGxpdGVyYWwgbmFtZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbGl0ZXJhbCBuYW1lLlxuICAgKiBAcGFyYW0geyp9IGxpdGVyYWxWYWx1ZSBWYWx1ZSBmb3IgdGhpcyBsaXRlcmFsLiBBbGwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcmltaXRpdmVzIG9yIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiovXG4gIHRoaXMuYWRkTGl0ZXJhbCA9IGZ1bmN0aW9uKGxpdGVyYWxOYW1lLCBsaXRlcmFsVmFsdWUpIHtcbiAgICBsaXRlcmFsc1tsaXRlcmFsTmFtZV0gPSBsaXRlcmFsVmFsdWU7XG4gIH07XG5cbiAvKipcbiAgKiBAbmdkb2MgbWV0aG9kXG4gICogQG5hbWUgJHBhcnNlUHJvdmlkZXIjc2V0SWRlbnRpZmllckZuc1xuICAqXG4gICogQGRlc2NyaXB0aW9uXG4gICpcbiAgKiBBbGxvd3MgZGVmaW5pbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbG93ZWQgaW4gQW5ndWxhciBleHByZXNzaW9ucy4gVGhlIGZ1bmN0aW9uXG4gICogYGlkZW50aWZpZXJTdGFydGAgd2lsbCBnZXQgY2FsbGVkIHRvIGtub3cgaWYgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgdG8gYmUgdGhlXG4gICogZmlyc3QgY2hhcmFjdGVyIGZvciBhbiBpZGVudGlmaWVyLiBUaGUgZnVuY3Rpb24gYGlkZW50aWZpZXJDb250aW51ZWAgd2lsbCBnZXQgY2FsbGVkIHRvIGtub3cgaWZcbiAgKiBhIGdpdmVuIGNoYXJhY3RlciBpcyBhIHZhbGlkIGNoYXJhY3RlciB0byBiZSBhIGZvbGxvdy11cCBpZGVudGlmaWVyIGNoYXJhY3Rlci4gVGhlIGZ1bmN0aW9uc1xuICAqIGBpZGVudGlmaWVyU3RhcnRgIGFuZCBgaWRlbnRpZmllckNvbnRpbnVlYCB3aWxsIHJlY2VpdmUgYXMgYXJndW1lbnRzIHRoZSBzaW5nbGUgY2hhcmFjdGVyIHRvIGJlXG4gICogaWRlbnRpZmllciBhbmQgdGhlIGNoYXJhY3RlciBjb2RlIHBvaW50LiBUaGVzZSBhcmd1bWVudHMgd2lsbCBiZSBgc3RyaW5nYCBhbmQgYG51bWVyaWNgLiBLZWVwIGluXG4gICogbWluZCB0aGF0IHRoZSBgc3RyaW5nYCBwYXJhbWV0ZXIgY2FuIGJlIHR3byBjaGFyYWN0ZXJzIGxvbmcgZGVwZW5kaW5nIG9uIHRoZSBjaGFyYWN0ZXJcbiAgKiByZXByZXNlbnRhdGlvbi4gSXQgaXMgZXhwZWN0ZWQgZm9yIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYHRydWVgIG9yIGBmYWxzZWAsIHdoZXRoZXIgdGhhdFxuICAqIGNoYXJhY3RlciBpcyBhbGxvd2VkIG9yIG5vdC5cbiAgKlxuICAqIFNpbmNlIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZXh0ZW5zaXZlbHksIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBmYXN0LFxuICAqIGFzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBhIGRpcmVjdCBpbXBhY3Qgb24gdGhlIGV4cHJlc3Npb25zIHBhcnNpbmcgc3BlZWQuXG4gICpcbiAgKiBAcGFyYW0ge2Z1bmN0aW9uPX0gaWRlbnRpZmllclN0YXJ0IFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgZGVjaWRlIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpc1xuICAqICAgYSB2YWxpZCBpZGVudGlmaWVyIHN0YXJ0IGNoYXJhY3Rlci5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9uPX0gaWRlbnRpZmllckNvbnRpbnVlIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgZGVjaWRlIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpc1xuICAqICAgYSB2YWxpZCBpZGVudGlmaWVyIGNvbnRpbnVlIGNoYXJhY3Rlci5cbiAgKi9cbiAgdGhpcy5zZXRJZGVudGlmaWVyRm5zID0gZnVuY3Rpb24oaWRlbnRpZmllclN0YXJ0LCBpZGVudGlmaWVyQ29udGludWUpIHtcbiAgICBpZGVudFN0YXJ0ID0gaWRlbnRpZmllclN0YXJ0O1xuICAgIGlkZW50Q29udGludWUgPSBpZGVudGlmaWVyQ29udGludWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdGhpcy4kZ2V0ID0gWyckZmlsdGVyJywgZnVuY3Rpb24oJGZpbHRlcikge1xuICAgIHZhciBub1Vuc2FmZUV2YWwgPSBjc3AoKS5ub1Vuc2FmZUV2YWw7XG4gICAgdmFyICRwYXJzZU9wdGlvbnMgPSB7XG4gICAgICAgICAgY3NwOiBub1Vuc2FmZUV2YWwsXG4gICAgICAgICAgbGl0ZXJhbHM6IGNvcHkobGl0ZXJhbHMpLFxuICAgICAgICAgIGlzSWRlbnRpZmllclN0YXJ0OiBpc0Z1bmN0aW9uKGlkZW50U3RhcnQpICYmIGlkZW50U3RhcnQsXG4gICAgICAgICAgaXNJZGVudGlmaWVyQ29udGludWU6IGlzRnVuY3Rpb24oaWRlbnRDb250aW51ZSkgJiYgaWRlbnRDb250aW51ZVxuICAgICAgICB9O1xuICAgIHJldHVybiAkcGFyc2U7XG5cbiAgICBmdW5jdGlvbiAkcGFyc2UoZXhwLCBpbnRlcmNlcHRvckZuKSB7XG4gICAgICB2YXIgcGFyc2VkRXhwcmVzc2lvbiwgb25lVGltZSwgY2FjaGVLZXk7XG5cbiAgICAgIHN3aXRjaCAodHlwZW9mIGV4cCkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIGV4cCA9IGV4cC50cmltKCk7XG4gICAgICAgICAgY2FjaGVLZXkgPSBleHA7XG5cbiAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uID0gY2FjaGVbY2FjaGVLZXldO1xuXG4gICAgICAgICAgaWYgKCFwYXJzZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhwLmNoYXJBdCgwKSA9PT0gJzonICYmIGV4cC5jaGFyQXQoMSkgPT09ICc6Jykge1xuICAgICAgICAgICAgICBvbmVUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZXhwID0gZXhwLnN1YnN0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZXhlciA9IG5ldyBMZXhlcigkcGFyc2VPcHRpb25zKTtcbiAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgUGFyc2VyKGxleGVyLCAkZmlsdGVyLCAkcGFyc2VPcHRpb25zKTtcbiAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24gPSBwYXJzZXIucGFyc2UoZXhwKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRFeHByZXNzaW9uLmNvbnN0YW50KSB7XG4gICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlID0gY29uc3RhbnRXYXRjaERlbGVnYXRlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvbmVUaW1lKSB7XG4gICAgICAgICAgICAgIHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlID0gcGFyc2VkRXhwcmVzc2lvbi5saXRlcmFsID9cbiAgICAgICAgICAgICAgICAgIG9uZVRpbWVMaXRlcmFsV2F0Y2hEZWxlZ2F0ZSA6IG9uZVRpbWVXYXRjaERlbGVnYXRlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZWRFeHByZXNzaW9uLmlucHV0cykge1xuICAgICAgICAgICAgICBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZSA9IGlucHV0c1dhdGNoRGVsZWdhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWNoZVtjYWNoZUtleV0gPSBwYXJzZWRFeHByZXNzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWRkSW50ZXJjZXB0b3IocGFyc2VkRXhwcmVzc2lvbiwgaW50ZXJjZXB0b3JGbik7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBhZGRJbnRlcmNlcHRvcihleHAsIGludGVyY2VwdG9yRm4pO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGFkZEludGVyY2VwdG9yKG5vb3AsIGludGVyY2VwdG9yRm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2sobmV3VmFsdWUsIG9sZFZhbHVlT2ZWYWx1ZSkge1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCB8fCBvbGRWYWx1ZU9mVmFsdWUgPT0gbnVsbCkgeyAvLyBudWxsL3VuZGVmaW5lZFxuICAgICAgICByZXR1cm4gbmV3VmFsdWUgPT09IG9sZFZhbHVlT2ZWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcpIHtcblxuICAgICAgICAvLyBhdHRlbXB0IHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgcHJpbWl0aXZlIHR5cGVcbiAgICAgICAgLy8gVE9ETyhkb2NzKTogYWRkIGEgbm90ZSB0byBkb2NzIHRoYXQgYnkgaW1wbGVtZW50aW5nIHZhbHVlT2YgZXZlbiBvYmplY3RzIGFuZCBhcnJheXMgY2FuXG4gICAgICAgIC8vICAgICAgICAgICAgIGJlIGNoZWFwbHkgZGlydHktY2hlY2tlZFxuICAgICAgICBuZXdWYWx1ZSA9IGdldFZhbHVlT2YobmV3VmFsdWUpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gb2JqZWN0cy9hcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgLSBkZWVwLXdhdGNoaW5nIHRoZW0gd291bGQgYmUgdG9vIGV4cGVuc2l2ZVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhbGwtdGhyb3VnaCB0byB0aGUgcHJpbWl0aXZlIGVxdWFsaXR5IGNoZWNrXG4gICAgICB9XG5cbiAgICAgIC8vUHJpbWl0aXZlIG9yIE5hTlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgcmV0dXJuIG5ld1ZhbHVlID09PSBvbGRWYWx1ZU9mVmFsdWUgfHwgKG5ld1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiBvbGRWYWx1ZU9mVmFsdWUgIT09IG9sZFZhbHVlT2ZWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5wdXRzV2F0Y2hEZWxlZ2F0ZShzY29wZSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwYXJzZWRFeHByZXNzaW9uLCBwcmV0dHlQcmludEV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBpbnB1dEV4cHJlc3Npb25zID0gcGFyc2VkRXhwcmVzc2lvbi5pbnB1dHM7XG4gICAgICB2YXIgbGFzdFJlc3VsdDtcblxuICAgICAgaWYgKGlucHV0RXhwcmVzc2lvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciBvbGRJbnB1dFZhbHVlT2YgPSBleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrOyAvLyBpbml0IHRvIHNvbWV0aGluZyB1bmlxdWUgc28gdGhhdCBlcXVhbHMgY2hlY2sgZmFpbHNcbiAgICAgICAgaW5wdXRFeHByZXNzaW9ucyA9IGlucHV0RXhwcmVzc2lvbnNbMF07XG4gICAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0V2F0Y2goc2NvcGUpIHtcbiAgICAgICAgICB2YXIgbmV3SW5wdXRWYWx1ZSA9IGlucHV0RXhwcmVzc2lvbnMoc2NvcGUpO1xuICAgICAgICAgIGlmICghZXhwcmVzc2lvbklucHV0RGlydHlDaGVjayhuZXdJbnB1dFZhbHVlLCBvbGRJbnB1dFZhbHVlT2YpKSB7XG4gICAgICAgICAgICBsYXN0UmVzdWx0ID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtuZXdJbnB1dFZhbHVlXSk7XG4gICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2YgPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgICB9LCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHByZXR0eVByaW50RXhwcmVzc2lvbik7XG4gICAgICB9XG5cbiAgICAgIHZhciBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXMgPSBbXTtcbiAgICAgIHZhciBvbGRJbnB1dFZhbHVlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIG9sZElucHV0VmFsdWVPZlZhbHVlc1tpXSA9IGV4cHJlc3Npb25JbnB1dERpcnR5Q2hlY2s7IC8vIGluaXQgdG8gc29tZXRoaW5nIHVuaXF1ZSBzbyB0aGF0IGVxdWFscyBjaGVjayBmYWlsc1xuICAgICAgICBvbGRJbnB1dFZhbHVlc1tpXSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY29wZS4kd2F0Y2goZnVuY3Rpb24gZXhwcmVzc2lvbklucHV0c1dhdGNoKHNjb3BlKSB7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gaW5wdXRFeHByZXNzaW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgICAgdmFyIG5ld0lucHV0VmFsdWUgPSBpbnB1dEV4cHJlc3Npb25zW2ldKHNjb3BlKTtcbiAgICAgICAgICBpZiAoY2hhbmdlZCB8fCAoY2hhbmdlZCA9ICFleHByZXNzaW9uSW5wdXREaXJ0eUNoZWNrKG5ld0lucHV0VmFsdWUsIG9sZElucHV0VmFsdWVPZlZhbHVlc1tpXSkpKSB7XG4gICAgICAgICAgICBvbGRJbnB1dFZhbHVlc1tpXSA9IG5ld0lucHV0VmFsdWU7XG4gICAgICAgICAgICBvbGRJbnB1dFZhbHVlT2ZWYWx1ZXNbaV0gPSBuZXdJbnB1dFZhbHVlICYmIGdldFZhbHVlT2YobmV3SW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICBsYXN0UmVzdWx0ID0gcGFyc2VkRXhwcmVzc2lvbihzY29wZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9sZElucHV0VmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgICAgfSwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwcmV0dHlQcmludEV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZVRpbWVXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24sIHByZXR0eVByaW50RXhwcmVzc2lvbikge1xuICAgICAgdmFyIHVud2F0Y2gsIGxhc3RWYWx1ZTtcbiAgICAgIGlmIChwYXJzZWRFeHByZXNzaW9uLmlucHV0cykge1xuICAgICAgICB1bndhdGNoID0gaW5wdXRzV2F0Y2hEZWxlZ2F0ZShzY29wZSwgb25lVGltZUxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbiwgcHJldHR5UHJpbnRFeHByZXNzaW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2gob25lVGltZVdhdGNoLCBvbmVUaW1lTGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndhdGNoO1xuXG4gICAgICBmdW5jdGlvbiBvbmVUaW1lV2F0Y2goc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZEV4cHJlc3Npb24oc2NvcGUpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gb25lVGltZUxpc3RlbmVyKHZhbHVlLCBvbGQsIHNjb3BlKSB7XG4gICAgICAgIGxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcikpIHtcbiAgICAgICAgICBsaXN0ZW5lcih2YWx1ZSwgb2xkLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICBzY29wZS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGxhc3RWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgdW53YXRjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlKHNjb3BlLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIHBhcnNlZEV4cHJlc3Npb24pIHtcbiAgICAgIHZhciB1bndhdGNoLCBsYXN0VmFsdWU7XG4gICAgICB1bndhdGNoID0gc2NvcGUuJHdhdGNoKGZ1bmN0aW9uIG9uZVRpbWVXYXRjaChzY29wZSkge1xuICAgICAgICByZXR1cm4gcGFyc2VkRXhwcmVzc2lvbihzY29wZSk7XG4gICAgICB9LCBmdW5jdGlvbiBvbmVUaW1lTGlzdGVuZXIodmFsdWUsIG9sZCwgc2NvcGUpIHtcbiAgICAgICAgbGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVyKSkge1xuICAgICAgICAgIGxpc3RlbmVyKHZhbHVlLCBvbGQsIHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBbGxEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgIHNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChpc0FsbERlZmluZWQobGFzdFZhbHVlKSkgdW53YXRjaCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBvYmplY3RFcXVhbGl0eSk7XG5cbiAgICAgIHJldHVybiB1bndhdGNoO1xuXG4gICAgICBmdW5jdGlvbiBpc0FsbERlZmluZWQodmFsdWUpIHtcbiAgICAgICAgdmFyIGFsbERlZmluZWQgPSB0cnVlO1xuICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICBpZiAoIWlzRGVmaW5lZCh2YWwpKSBhbGxEZWZpbmVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYWxsRGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFdhdGNoRGVsZWdhdGUoc2NvcGUsIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSwgcGFyc2VkRXhwcmVzc2lvbikge1xuICAgICAgdmFyIHVud2F0Y2ggPSBzY29wZS4kd2F0Y2goZnVuY3Rpb24gY29uc3RhbnRXYXRjaChzY29wZSkge1xuICAgICAgICB1bndhdGNoKCk7XG4gICAgICAgIHJldHVybiBwYXJzZWRFeHByZXNzaW9uKHNjb3BlKTtcbiAgICAgIH0sIGxpc3RlbmVyLCBvYmplY3RFcXVhbGl0eSk7XG4gICAgICByZXR1cm4gdW53YXRjaDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRJbnRlcmNlcHRvcihwYXJzZWRFeHByZXNzaW9uLCBpbnRlcmNlcHRvckZuKSB7XG4gICAgICBpZiAoIWludGVyY2VwdG9yRm4pIHJldHVybiBwYXJzZWRFeHByZXNzaW9uO1xuICAgICAgdmFyIHdhdGNoRGVsZWdhdGUgPSBwYXJzZWRFeHByZXNzaW9uLiQkd2F0Y2hEZWxlZ2F0ZTtcbiAgICAgIHZhciB1c2VJbnB1dHMgPSBmYWxzZTtcblxuICAgICAgdmFyIHJlZ3VsYXJXYXRjaCA9XG4gICAgICAgICAgd2F0Y2hEZWxlZ2F0ZSAhPT0gb25lVGltZUxpdGVyYWxXYXRjaERlbGVnYXRlICYmXG4gICAgICAgICAgd2F0Y2hEZWxlZ2F0ZSAhPT0gb25lVGltZVdhdGNoRGVsZWdhdGU7XG5cbiAgICAgIHZhciBmbiA9IHJlZ3VsYXJXYXRjaCA/IGZ1bmN0aW9uIHJlZ3VsYXJJbnRlcmNlcHRlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdXNlSW5wdXRzICYmIGlucHV0cyA/IGlucHV0c1swXSA6IHBhcnNlZEV4cHJlc3Npb24oc2NvcGUsIGxvY2FscywgYXNzaWduLCBpbnB1dHMpO1xuICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JGbih2YWx1ZSwgc2NvcGUsIGxvY2Fscyk7XG4gICAgICB9IDogZnVuY3Rpb24gb25lVGltZUludGVyY2VwdGVkRXhwcmVzc2lvbihzY29wZSwgbG9jYWxzLCBhc3NpZ24sIGlucHV0cykge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJzZWRFeHByZXNzaW9uKHNjb3BlLCBsb2NhbHMsIGFzc2lnbiwgaW5wdXRzKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGludGVyY2VwdG9yRm4odmFsdWUsIHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAvLyB3ZSBvbmx5IHJldHVybiB0aGUgaW50ZXJjZXB0b3IncyByZXN1bHQgaWYgdGhlXG4gICAgICAgIC8vIGluaXRpYWwgdmFsdWUgaXMgZGVmaW5lZCAoZm9yIGJpbmQtb25jZSlcbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZCh2YWx1ZSkgPyByZXN1bHQgOiB2YWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFByb3BhZ2F0ZSAkJHdhdGNoRGVsZWdhdGVzIG90aGVyIHRoZW4gaW5wdXRzV2F0Y2hEZWxlZ2F0ZVxuICAgICAgdXNlSW5wdXRzID0gIXBhcnNlZEV4cHJlc3Npb24uaW5wdXRzO1xuICAgICAgaWYgKHBhcnNlZEV4cHJlc3Npb24uJCR3YXRjaERlbGVnYXRlICYmXG4gICAgICAgICAgcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGUgIT09IGlucHV0c1dhdGNoRGVsZWdhdGUpIHtcbiAgICAgICAgZm4uJCR3YXRjaERlbGVnYXRlID0gcGFyc2VkRXhwcmVzc2lvbi4kJHdhdGNoRGVsZWdhdGU7XG4gICAgICAgIGZuLmlucHV0cyA9IHBhcnNlZEV4cHJlc3Npb24uaW5wdXRzO1xuICAgICAgfSBlbHNlIGlmICghaW50ZXJjZXB0b3JGbi4kc3RhdGVmdWwpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gaW50ZXJjZXB0b3IsIGJ1dCBubyB3YXRjaERlbGVnYXRlIHRoZW4gdHJlYXQgdGhlIGludGVyY2VwdG9yIGxpa2VcbiAgICAgICAgLy8gd2UgdHJlYXQgZmlsdGVycyAtIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBwdXJlIGZ1bmN0aW9uIHVubGVzcyBmbGFnZ2VkIHdpdGggJHN0YXRlZnVsXG4gICAgICAgIGZuLiQkd2F0Y2hEZWxlZ2F0ZSA9IGlucHV0c1dhdGNoRGVsZWdhdGU7XG4gICAgICAgIGZuLmlucHV0cyA9IHBhcnNlZEV4cHJlc3Npb24uaW5wdXRzID8gcGFyc2VkRXhwcmVzc2lvbi5pbnB1dHMgOiBbcGFyc2VkRXhwcmVzc2lvbl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gIH1dO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkcVxuICogQHJlcXVpcmVzICRyb290U2NvcGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgc2VydmljZSB0aGF0IGhlbHBzIHlvdSBydW4gZnVuY3Rpb25zIGFzeW5jaHJvbm91c2x5LCBhbmQgdXNlIHRoZWlyIHJldHVybiB2YWx1ZXMgKG9yIGV4Y2VwdGlvbnMpXG4gKiB3aGVuIHRoZXkgYXJlIGRvbmUgcHJvY2Vzc2luZy5cbiAqXG4gKiBUaGlzIGlzIGEgW1Byb21pc2VzL0ErXShodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyktY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG9mIHByb21pc2VzL2RlZmVycmVkXG4gKiBvYmplY3RzIGluc3BpcmVkIGJ5IFtLcmlzIEtvd2FsJ3MgUV0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKS5cbiAqXG4gKiAkcSBjYW4gYmUgdXNlZCBpbiB0d28gZmFzaGlvbnMgLS0tIG9uZSB3aGljaCBpcyBtb3JlIHNpbWlsYXIgdG8gS3JpcyBLb3dhbCdzIFEgb3IgalF1ZXJ5J3MgRGVmZXJyZWRcbiAqIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZSBvdGhlciB3aGljaCByZXNlbWJsZXMgRVM2IChFUzIwMTUpIHByb21pc2VzIHRvIHNvbWUgZGVncmVlLlxuICpcbiAqICMgJHEgY29uc3RydWN0b3JcbiAqXG4gKiBUaGUgc3RyZWFtbGluZWQgRVM2IHN0eWxlIHByb21pc2UgaXMgZXNzZW50aWFsbHkganVzdCB1c2luZyAkcSBhcyBhIGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGEgYHJlc29sdmVyYFxuICogZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5hdGl2ZSBQcm9taXNlIGltcGxlbWVudGF0aW9uIGZyb20gRVM2LFxuICogc2VlIFtNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2UpLlxuICpcbiAqIFdoaWxlIHRoZSBjb25zdHJ1Y3Rvci1zdHlsZSB1c2UgaXMgc3VwcG9ydGVkLCBub3QgYWxsIG9mIHRoZSBzdXBwb3J0aW5nIG1ldGhvZHMgZnJvbSBFUzYgcHJvbWlzZXMgYXJlXG4gKiBhdmFpbGFibGUgeWV0LlxuICpcbiAqIEl0IGNhbiBiZSB1c2VkIGxpa2Ugc286XG4gKlxuICogYGBganNcbiAqICAgLy8gZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhhbXBsZSBsZXQncyBhc3N1bWUgdGhhdCB2YXJpYWJsZXMgYCRxYCBhbmQgYG9rVG9HcmVldGBcbiAqICAgLy8gYXJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlICh0aGV5IGNvdWxkIGhhdmUgYmVlbiBpbmplY3RlZCBvciBwYXNzZWQgaW4pLlxuICpcbiAqICAgZnVuY3Rpb24gYXN5bmNHcmVldChuYW1lKSB7XG4gKiAgICAgLy8gcGVyZm9ybSBzb21lIGFzeW5jaHJvbm91cyBvcGVyYXRpb24sIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBwcm9taXNlIHdoZW4gYXBwcm9wcmlhdGUuXG4gKiAgICAgcmV0dXJuICRxKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICogICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAqICAgICAgICAgaWYgKG9rVG9HcmVldChuYW1lKSkge1xuICogICAgICAgICAgIHJlc29sdmUoJ0hlbGxvLCAnICsgbmFtZSArICchJyk7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgcmVqZWN0KCdHcmVldGluZyAnICsgbmFtZSArICcgaXMgbm90IGFsbG93ZWQuJyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0sIDEwMDApO1xuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICB2YXIgcHJvbWlzZSA9IGFzeW5jR3JlZXQoJ1JvYmluIEhvb2QnKTtcbiAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7XG4gKiAgICAgYWxlcnQoJ1N1Y2Nlc3M6ICcgKyBncmVldGluZyk7XG4gKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pO1xuICogICB9KTtcbiAqIGBgYFxuICpcbiAqIE5vdGU6IHByb2dyZXNzL25vdGlmeSBjYWxsYmFja3MgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIHZpYSB0aGUgRVM2LXN0eWxlIGludGVyZmFjZS5cbiAqXG4gKiBOb3RlOiB1bmxpa2UgRVM2IGJlaGF2aW9yLCBhbiBleGNlcHRpb24gdGhyb3duIGluIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIE5PVCBpbXBsaWNpdGx5IHJlamVjdCB0aGUgcHJvbWlzZS5cbiAqXG4gKiBIb3dldmVyLCB0aGUgbW9yZSB0cmFkaXRpb25hbCBDb21tb25KUy1zdHlsZSB1c2FnZSBpcyBzdGlsbCBhdmFpbGFibGUsIGFuZCBkb2N1bWVudGVkIGJlbG93LlxuICpcbiAqIFtUaGUgQ29tbW9uSlMgUHJvbWlzZSBwcm9wb3NhbF0oaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvUHJvbWlzZXMpIGRlc2NyaWJlcyBhIHByb21pc2UgYXMgYW5cbiAqIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4gYWN0aW9uIHRoYXQgaXNcbiAqIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseSwgYW5kIG1heSBvciBtYXkgbm90IGJlIGZpbmlzaGVkIGF0IGFueSBnaXZlbiBwb2ludCBpbiB0aW1lLlxuICpcbiAqIEZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGRlYWxpbmcgd2l0aCBlcnJvciBoYW5kbGluZywgZGVmZXJyZWQgYW5kIHByb21pc2UgQVBJcyBhcmUgdG9cbiAqIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZyB3aGF0IGB0cnlgLCBgY2F0Y2hgIGFuZCBgdGhyb3dgIGtleXdvcmRzIGFyZSB0byBzeW5jaHJvbm91cyBwcm9ncmFtbWluZy5cbiAqXG4gKiBgYGBqc1xuICogICAvLyBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGFtcGxlIGxldCdzIGFzc3VtZSB0aGF0IHZhcmlhYmxlcyBgJHFgIGFuZCBgb2tUb0dyZWV0YFxuICogICAvLyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUgKHRoZXkgY291bGQgaGF2ZSBiZWVuIGluamVjdGVkIG9yIHBhc3NlZCBpbikuXG4gKlxuICogICBmdW5jdGlvbiBhc3luY0dyZWV0KG5hbWUpIHtcbiAqICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICpcbiAqICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICogICAgICAgZGVmZXJyZWQubm90aWZ5KCdBYm91dCB0byBncmVldCAnICsgbmFtZSArICcuJyk7XG4gKlxuICogICAgICAgaWYgKG9rVG9HcmVldChuYW1lKSkge1xuICogICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCdIZWxsbywgJyArIG5hbWUgKyAnIScpO1xuICogICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCdHcmVldGluZyAnICsgbmFtZSArICcgaXMgbm90IGFsbG93ZWQuJyk7XG4gKiAgICAgICB9XG4gKiAgICAgfSwgMTAwMCk7XG4gKlxuICogICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICogICB9XG4gKlxuICogICB2YXIgcHJvbWlzZSA9IGFzeW5jR3JlZXQoJ1JvYmluIEhvb2QnKTtcbiAqICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGdyZWV0aW5nKSB7XG4gKiAgICAgYWxlcnQoJ1N1Y2Nlc3M6ICcgKyBncmVldGluZyk7XG4gKiAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICogICAgIGFsZXJ0KCdGYWlsZWQ6ICcgKyByZWFzb24pO1xuICogICB9LCBmdW5jdGlvbih1cGRhdGUpIHtcbiAqICAgICBhbGVydCgnR290IG5vdGlmaWNhdGlvbjogJyArIHVwZGF0ZSk7XG4gKiAgIH0pO1xuICogYGBgXG4gKlxuICogQXQgZmlyc3QgaXQgbWlnaHQgbm90IGJlIG9idmlvdXMgd2h5IHRoaXMgZXh0cmEgY29tcGxleGl0eSBpcyB3b3J0aCB0aGUgdHJvdWJsZS4gVGhlIHBheW9mZlxuICogY29tZXMgaW4gdGhlIHdheSBvZiBndWFyYW50ZWVzIHRoYXQgcHJvbWlzZSBhbmQgZGVmZXJyZWQgQVBJcyBtYWtlLCBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvdW5jb21tb25qcy9ibG9iL21hc3Rlci9wcm9taXNlcy9zcGVjaWZpY2F0aW9uLm1kLlxuICpcbiAqIEFkZGl0aW9uYWxseSB0aGUgcHJvbWlzZSBhcGkgYWxsb3dzIGZvciBjb21wb3NpdGlvbiB0aGF0IGlzIHZlcnkgaGFyZCB0byBkbyB3aXRoIHRoZVxuICogdHJhZGl0aW9uYWwgY2FsbGJhY2sgKFtDUFNdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29udGludWF0aW9uLXBhc3Npbmdfc3R5bGUpKSBhcHByb2FjaC5cbiAqIEZvciBtb3JlIG9uIHRoaXMgcGxlYXNlIHNlZSB0aGUgW1EgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xKSBlc3BlY2lhbGx5IHRoZVxuICogc2VjdGlvbiBvbiBzZXJpYWwgb3IgcGFyYWxsZWwgam9pbmluZyBvZiBwcm9taXNlcy5cbiAqXG4gKiAjIFRoZSBEZWZlcnJlZCBBUElcbiAqXG4gKiBBIG5ldyBpbnN0YW5jZSBvZiBkZWZlcnJlZCBpcyBjb25zdHJ1Y3RlZCBieSBjYWxsaW5nIGAkcS5kZWZlcigpYC5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiB0aGUgZGVmZXJyZWQgb2JqZWN0IGlzIHRvIGV4cG9zZSB0aGUgYXNzb2NpYXRlZCBQcm9taXNlIGluc3RhbmNlIGFzIHdlbGwgYXMgQVBJc1xuICogdGhhdCBjYW4gYmUgdXNlZCBmb3Igc2lnbmFsaW5nIHRoZSBzdWNjZXNzZnVsIG9yIHVuc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLCBhcyB3ZWxsIGFzIHRoZSBzdGF0dXNcbiAqIG9mIHRoZSB0YXNrLlxuICpcbiAqICoqTWV0aG9kcyoqXG4gKlxuICogLSBgcmVzb2x2ZSh2YWx1ZSlgIOKAkyByZXNvbHZlcyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGB2YWx1ZWAuIElmIHRoZSB2YWx1ZSBpcyBhIHJlamVjdGlvblxuICogICBjb25zdHJ1Y3RlZCB2aWEgYCRxLnJlamVjdGAsIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaW5zdGVhZC5cbiAqIC0gYHJlamVjdChyZWFzb24pYCDigJMgcmVqZWN0cyB0aGUgZGVyaXZlZCBwcm9taXNlIHdpdGggdGhlIGByZWFzb25gLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAqICAgcmVzb2x2aW5nIGl0IHdpdGggYSByZWplY3Rpb24gY29uc3RydWN0ZWQgdmlhIGAkcS5yZWplY3RgLlxuICogLSBgbm90aWZ5KHZhbHVlKWAgLSBwcm92aWRlcyB1cGRhdGVzIG9uIHRoZSBzdGF0dXMgb2YgdGhlIHByb21pc2UncyBleGVjdXRpb24uIFRoaXMgbWF5IGJlIGNhbGxlZFxuICogICBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlIHByb21pc2UgaXMgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkLlxuICpcbiAqICoqUHJvcGVydGllcyoqXG4gKlxuICogLSBwcm9taXNlIOKAkyBge1Byb21pc2V9YCDigJMgcHJvbWlzZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGVmZXJyZWQuXG4gKlxuICpcbiAqICMgVGhlIFByb21pc2UgQVBJXG4gKlxuICogQSBuZXcgcHJvbWlzZSBpbnN0YW5jZSBpcyBjcmVhdGVkIHdoZW4gYSBkZWZlcnJlZCBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5XG4gKiBjYWxsaW5nIGBkZWZlcnJlZC5wcm9taXNlYC5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiB0aGUgcHJvbWlzZSBvYmplY3QgaXMgdG8gYWxsb3cgZm9yIGludGVyZXN0ZWQgcGFydGllcyB0byBnZXQgYWNjZXNzIHRvIHRoZSByZXN1bHRcbiAqIG9mIHRoZSBkZWZlcnJlZCB0YXNrIHdoZW4gaXQgY29tcGxldGVzLlxuICpcbiAqICoqTWV0aG9kcyoqXG4gKlxuICogLSBgdGhlbihzdWNjZXNzQ2FsbGJhY2ssIFtlcnJvckNhbGxiYWNrXSwgW25vdGlmeUNhbGxiYWNrXSlgIOKAkyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHByb21pc2Ugd2FzIG9yXG4gKiAgIHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQsIGB0aGVuYCBjYWxscyBvbmUgb2YgdGhlIHN1Y2Nlc3Mgb3IgZXJyb3IgY2FsbGJhY2tzIGFzeW5jaHJvbm91c2x5XG4gKiAgIGFzIHNvb24gYXMgdGhlIHJlc3VsdCBpcyBhdmFpbGFibGUuIFRoZSBjYWxsYmFja3MgYXJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50OiB0aGUgcmVzdWx0XG4gKiAgIG9yIHJlamVjdGlvbiByZWFzb24uIEFkZGl0aW9uYWxseSwgdGhlIG5vdGlmeSBjYWxsYmFjayBtYXkgYmUgY2FsbGVkIHplcm8gb3IgbW9yZSB0aW1lcyB0b1xuICogICBwcm92aWRlIGEgcHJvZ3Jlc3MgaW5kaWNhdGlvbiwgYmVmb3JlIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIG9yIHJlamVjdGVkLlxuICpcbiAqICAgVGhpcyBtZXRob2QgKnJldHVybnMgYSBuZXcgcHJvbWlzZSogd2hpY2ggaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlXG4gKiAgIGBzdWNjZXNzQ2FsbGJhY2tgLCBgZXJyb3JDYWxsYmFja2AgKHVubGVzcyB0aGF0IHZhbHVlIGlzIGEgcHJvbWlzZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyByZXNvbHZlZFxuICogICB3aXRoIHRoZSB2YWx1ZSB3aGljaCBpcyByZXNvbHZlZCBpbiB0aGF0IHByb21pc2UgdXNpbmdcbiAqICAgW3Byb21pc2UgY2hhaW5pbmddKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2VzNi9wcm9taXNlcy8jdG9jLXByb21pc2VzLXF1ZXVlcykpLlxuICogICBJdCBhbHNvIG5vdGlmaWVzIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBgbm90aWZ5Q2FsbGJhY2tgIG1ldGhvZC4gVGhlIHByb21pc2UgY2Fubm90IGJlXG4gKiAgIHJlc29sdmVkIG9yIHJlamVjdGVkIGZyb20gdGhlIG5vdGlmeUNhbGxiYWNrIG1ldGhvZC4gVGhlIGVycm9yQ2FsbGJhY2sgYW5kIG5vdGlmeUNhbGxiYWNrXG4gKiAgIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuXG4gKlxuICogLSBgY2F0Y2goZXJyb3JDYWxsYmFjaylgIOKAkyBzaG9ydGhhbmQgZm9yIGBwcm9taXNlLnRoZW4obnVsbCwgZXJyb3JDYWxsYmFjaylgXG4gKlxuICogLSBgZmluYWxseShjYWxsYmFjaywgbm90aWZ5Q2FsbGJhY2spYCDigJMgYWxsb3dzIHlvdSB0byBvYnNlcnZlIGVpdGhlciB0aGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIG9mIGEgcHJvbWlzZSxcbiAqICAgYnV0IHRvIGRvIHNvIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBmaW5hbCB2YWx1ZS4gVGhpcyBpcyB1c2VmdWwgdG8gcmVsZWFzZSByZXNvdXJjZXMgb3IgZG8gc29tZVxuICogICBjbGVhbi11cCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgd2hldGhlciB0aGUgcHJvbWlzZSB3YXMgcmVqZWN0ZWQgb3IgcmVzb2x2ZWQuIFNlZSB0aGUgW2Z1bGxcbiAqICAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3dpa2kvQVBJLVJlZmVyZW5jZSNwcm9taXNlZmluYWxseWNhbGxiYWNrKSBmb3JcbiAqICAgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiAjIENoYWluaW5nIHByb21pc2VzXG4gKlxuICogQmVjYXVzZSBjYWxsaW5nIHRoZSBgdGhlbmAgbWV0aG9kIG9mIGEgcHJvbWlzZSByZXR1cm5zIGEgbmV3IGRlcml2ZWQgcHJvbWlzZSwgaXQgaXMgZWFzaWx5XG4gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBjaGFpbiBvZiBwcm9taXNlczpcbiAqXG4gKiBgYGBqc1xuICogICBwcm9taXNlQiA9IHByb21pc2VBLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gKiAgICAgcmV0dXJuIHJlc3VsdCArIDE7XG4gKiAgIH0pO1xuICpcbiAqICAgLy8gcHJvbWlzZUIgd2lsbCBiZSByZXNvbHZlZCBpbW1lZGlhdGVseSBhZnRlciBwcm9taXNlQSBpcyByZXNvbHZlZCBhbmQgaXRzIHZhbHVlXG4gKiAgIC8vIHdpbGwgYmUgdGhlIHJlc3VsdCBvZiBwcm9taXNlQSBpbmNyZW1lbnRlZCBieSAxXG4gKiBgYGBcbiAqXG4gKiBJdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgY2hhaW5zIG9mIGFueSBsZW5ndGggYW5kIHNpbmNlIGEgcHJvbWlzZSBjYW4gYmUgcmVzb2x2ZWQgd2l0aCBhbm90aGVyXG4gKiBwcm9taXNlICh3aGljaCB3aWxsIGRlZmVyIGl0cyByZXNvbHV0aW9uIGZ1cnRoZXIpLCBpdCBpcyBwb3NzaWJsZSB0byBwYXVzZS9kZWZlciByZXNvbHV0aW9uIG9mXG4gKiB0aGUgcHJvbWlzZXMgYXQgYW55IHBvaW50IGluIHRoZSBjaGFpbi4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgcG93ZXJmdWwgQVBJcyBsaWtlXG4gKiAkaHR0cCdzIHJlc3BvbnNlIGludGVyY2VwdG9ycy5cbiAqXG4gKlxuICogIyBEaWZmZXJlbmNlcyBiZXR3ZWVuIEtyaXMgS293YWwncyBRIGFuZCAkcVxuICpcbiAqICBUaGVyZSBhcmUgdHdvIG1haW4gZGlmZmVyZW5jZXM6XG4gKlxuICogLSAkcSBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlfSBTY29wZSBtb2RlbCBvYnNlcnZhdGlvblxuICogICBtZWNoYW5pc20gaW4gYW5ndWxhciwgd2hpY2ggbWVhbnMgZmFzdGVyIHByb3BhZ2F0aW9uIG9mIHJlc29sdXRpb24gb3IgcmVqZWN0aW9uIGludG8geW91clxuICogICBtb2RlbHMgYW5kIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGJyb3dzZXIgcmVwYWludHMsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBmbGlja2VyaW5nIFVJLlxuICogLSBRIGhhcyBtYW55IG1vcmUgZmVhdHVyZXMgdGhhbiAkcSwgYnV0IHRoYXQgY29tZXMgYXQgYSBjb3N0IG9mIGJ5dGVzLiAkcSBpcyB0aW55LCBidXQgY29udGFpbnNcbiAqICAgYWxsIHRoZSBpbXBvcnRhbnQgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGNvbW1vbiBhc3luYyB0YXNrcy5cbiAqXG4gKiAjIFRlc3RpbmdcbiAqXG4gKiAgYGBganNcbiAqICAgIGl0KCdzaG91bGQgc2ltdWxhdGUgcHJvbWlzZScsIGluamVjdChmdW5jdGlvbigkcSwgJHJvb3RTY29wZSkge1xuICogICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICogICAgICB2YXIgcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7XG4gKiAgICAgIHZhciByZXNvbHZlZFZhbHVlO1xuICpcbiAqICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7IHJlc29sdmVkVmFsdWUgPSB2YWx1ZTsgfSk7XG4gKiAgICAgIGV4cGVjdChyZXNvbHZlZFZhbHVlKS50b0JlVW5kZWZpbmVkKCk7XG4gKlxuICogICAgICAvLyBTaW11bGF0ZSByZXNvbHZpbmcgb2YgcHJvbWlzZVxuICogICAgICBkZWZlcnJlZC5yZXNvbHZlKDEyMyk7XG4gKiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgJ3RoZW4nIGZ1bmN0aW9uIGRvZXMgbm90IGdldCBjYWxsZWQgc3luY2hyb25vdXNseS5cbiAqICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIHdhbnQgdGhlIHByb21pc2UgQVBJIHRvIGFsd2F5cyBiZSBhc3luYywgd2hldGhlciBvciBub3RcbiAqICAgICAgLy8gaXQgZ290IGNhbGxlZCBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LlxuICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9CZVVuZGVmaW5lZCgpO1xuICpcbiAqICAgICAgLy8gUHJvcGFnYXRlIHByb21pc2UgcmVzb2x1dGlvbiB0byAndGhlbicgZnVuY3Rpb25zIHVzaW5nICRhcHBseSgpLlxuICogICAgICAkcm9vdFNjb3BlLiRhcHBseSgpO1xuICogICAgICBleHBlY3QocmVzb2x2ZWRWYWx1ZSkudG9FcXVhbCgxMjMpO1xuICogICAgfSkpO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oZnVuY3Rpb24sIGZ1bmN0aW9uKX0gcmVzb2x2ZXIgRnVuY3Rpb24gd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHJlc29sdmluZyBvclxuICogICByZWplY3RpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgcHJvbWlzZS4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJlc29sdmVzIHRoZVxuICogICBwcm9taXNlLCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHJlamVjdHMgdGhlIHByb21pc2UuXG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBuZXdseSBjcmVhdGVkIHByb21pc2UuXG4gKi9cbi8qKlxuICogQG5nZG9jIHByb3ZpZGVyXG4gKiBAbmFtZSAkcVByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICovXG5mdW5jdGlvbiAkUVByb3ZpZGVyKCkge1xuICB2YXIgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuICB0aGlzLiRnZXQgPSBbJyRyb290U2NvcGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbigkcm9vdFNjb3BlLCAkZXhjZXB0aW9uSGFuZGxlcikge1xuICAgIHJldHVybiBxRmFjdG9yeShmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgJHJvb3RTY29wZS4kZXZhbEFzeW5jKGNhbGxiYWNrKTtcbiAgICB9LCAkZXhjZXB0aW9uSGFuZGxlciwgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMpO1xuICB9XTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkcVByb3ZpZGVyI2Vycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXRyaWV2ZXMgb3Igb3ZlcnJpZGVzIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhIHJlamVjdGVkIHByb21pc2UgaXMgbm90IGhhbmRsZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IHZhbHVlIFdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gZXJyb3Igd2hlbiBhIHJlamVjdGVkIHByb21pc2UgaXMgbm90IGhhbmRsZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufG5nLiRxUHJvdmlkZXJ9IEN1cnJlbnQgdmFsdWUgd2hlbiBjYWxsZWQgd2l0aG91dCBhIG5ldyB2YWx1ZSBvciBzZWxmIGZvclxuICAgKiAgICBjaGFpbmluZyBvdGhlcndpc2UuXG4gICAqL1xuICB0aGlzLmVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnM7XG4gICAgfVxuICB9O1xufVxuXG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICQkUVByb3ZpZGVyKCkge1xuICB2YXIgZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuICB0aGlzLiRnZXQgPSBbJyRicm93c2VyJywgJyRleGNlcHRpb25IYW5kbGVyJywgZnVuY3Rpb24oJGJyb3dzZXIsICRleGNlcHRpb25IYW5kbGVyKSB7XG4gICAgcmV0dXJuIHFGYWN0b3J5KGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAkYnJvd3Nlci5kZWZlcihjYWxsYmFjayk7XG4gICAgfSwgJGV4Y2VwdGlvbkhhbmRsZXIsIGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zKTtcbiAgfV07XG5cbiAgdGhpcy5lcnJvck9uVW5oYW5kbGVkUmVqZWN0aW9ucyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgcHJvbWlzZSBtYW5hZ2VyLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oZnVuY3Rpb24pfSBuZXh0VGljayBGdW5jdGlvbiBmb3IgZXhlY3V0aW5nIGZ1bmN0aW9ucyBpbiB0aGUgbmV4dCB0dXJuLlxuICogQHBhcmFtIHtmdW5jdGlvbiguLi4qKX0gZXhjZXB0aW9uSGFuZGxlciBGdW5jdGlvbiBpbnRvIHdoaWNoIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhcmUgcGFzc2VkIGZvclxuICogICAgIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiBAIHBhcmFtIHs9Ym9vbGVhbn0gZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnMgV2hldGhlciBhbiBlcnJvciBzaG91bGQgYmUgZ2VuZXJhdGVkIG9uIHVuaGFuZGxlZFxuICogICAgIHByb21pc2VzIHJlamVjdGlvbnMuXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIG1hbmFnZXIuXG4gKi9cbmZ1bmN0aW9uIHFGYWN0b3J5KG5leHRUaWNrLCBleGNlcHRpb25IYW5kbGVyLCBlcnJvck9uVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICB2YXIgJHFNaW5FcnIgPSBtaW5FcnIoJyRxJywgVHlwZUVycm9yKTtcbiAgdmFyIHF1ZXVlU2l6ZSA9IDA7XG4gIHZhciBjaGVja1F1ZXVlID0gW107XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmcuJHEjZGVmZXJcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgYSBgRGVmZXJyZWRgIG9iamVjdCB3aGljaCByZXByZXNlbnRzIGEgdGFzayB3aGljaCB3aWxsIGZpbmlzaCBpbiB0aGUgZnV0dXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7RGVmZXJyZWR9IFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgZGVmZXJyZWQuXG4gICAqL1xuICBmdW5jdGlvbiBkZWZlcigpIHtcbiAgICByZXR1cm4gbmV3IERlZmVycmVkKCk7XG4gIH1cblxuICBmdW5jdGlvbiBEZWZlcnJlZCgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCk7XG4gICAgLy9Ob24gcHJvdG90eXBlIG1ldGhvZHMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdW5ib3VuZCBleGVjdXRpb24gOi9cbiAgICB0aGlzLnJlc29sdmUgPSBmdW5jdGlvbih2YWwpIHsgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsKTsgfTtcbiAgICB0aGlzLnJlamVjdCA9IGZ1bmN0aW9uKHJlYXNvbikgeyByZWplY3RQcm9taXNlKHByb21pc2UsIHJlYXNvbik7IH07XG4gICAgdGhpcy5ub3RpZnkgPSBmdW5jdGlvbihwcm9ncmVzcykgeyBub3RpZnlQcm9taXNlKHByb21pc2UsIHByb2dyZXNzKTsgfTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gUHJvbWlzZSgpIHtcbiAgICB0aGlzLiQkc3RhdGUgPSB7IHN0YXR1czogMCB9O1xuICB9XG5cbiAgZXh0ZW5kKFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb2dyZXNzQmFjaykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKG9uRnVsZmlsbGVkKSAmJiBpc1VuZGVmaW5lZChvblJlamVjdGVkKSAmJiBpc1VuZGVmaW5lZChwcm9ncmVzc0JhY2spKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBQcm9taXNlKCk7XG5cbiAgICAgIHRoaXMuJCRzdGF0ZS5wZW5kaW5nID0gdGhpcy4kJHN0YXRlLnBlbmRpbmcgfHwgW107XG4gICAgICB0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtyZXN1bHQsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9ncmVzc0JhY2tdKTtcbiAgICAgIGlmICh0aGlzLiQkc3RhdGUuc3RhdHVzID4gMCkgc2NoZWR1bGVQcm9jZXNzUXVldWUodGhpcy4kJHN0YXRlKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICAnZmluYWxseSc6IGZ1bmN0aW9uKGNhbGxiYWNrLCBwcm9ncmVzc0JhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNhbGxiYWNrKHZhbHVlLCByZXNvbHZlLCBjYWxsYmFjayk7XG4gICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbGJhY2soZXJyb3IsIHJlamVjdCwgY2FsbGJhY2spO1xuICAgICAgfSwgcHJvZ3Jlc3NCYWNrKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3NRdWV1ZShzdGF0ZSkge1xuICAgIHZhciBmbiwgcHJvbWlzZSwgcGVuZGluZztcblxuICAgIHBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nO1xuICAgIHN0YXRlLnByb2Nlc3NTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBzdGF0ZS5wZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwZW5kaW5nLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICAgICAgc3RhdGUucHVyID0gdHJ1ZTtcbiAgICAgICAgcHJvbWlzZSA9IHBlbmRpbmdbaV1bMF07XG4gICAgICAgIGZuID0gcGVuZGluZ1tpXVtzdGF0ZS5zdGF0dXNdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZm4oc3RhdGUudmFsdWUpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXR1cyA9PT0gMSkge1xuICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3RQcm9taXNlKHByb21pc2UsIHN0YXRlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3RQcm9taXNlKHByb21pc2UsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC0tcXVldWVTaXplO1xuICAgICAgaWYgKGVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zICYmIHF1ZXVlU2l6ZSA9PT0gMCkge1xuICAgICAgICBuZXh0VGljayhwcm9jZXNzQ2hlY2tzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzQ2hlY2tzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uXG4gICAgd2hpbGUgKCFxdWV1ZVNpemUgJiYgY2hlY2tRdWV1ZS5sZW5ndGgpIHtcbiAgICAgIHZhciB0b0NoZWNrID0gY2hlY2tRdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKCF0b0NoZWNrLnB1cikge1xuICAgICAgICB0b0NoZWNrLnB1ciA9IHRydWU7XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnUG9zc2libHkgdW5oYW5kbGVkIHJlamVjdGlvbjogJyArIHRvRGVidWdTdHJpbmcodG9DaGVjay52YWx1ZSk7XG4gICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZVByb2Nlc3NRdWV1ZShzdGF0ZSkge1xuICAgIGlmIChlcnJvck9uVW5oYW5kbGVkUmVqZWN0aW9ucyAmJiAhc3RhdGUucGVuZGluZyAmJiBzdGF0ZS5zdGF0dXMgPT09IDIgJiYgIXN0YXRlLnB1cikge1xuICAgICAgaWYgKHF1ZXVlU2l6ZSA9PT0gMCAmJiBjaGVja1F1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuZXh0VGljayhwcm9jZXNzQ2hlY2tzKTtcbiAgICAgIH1cbiAgICAgIGNoZWNrUXVldWUucHVzaChzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5wcm9jZXNzU2NoZWR1bGVkIHx8ICFzdGF0ZS5wZW5kaW5nKSByZXR1cm47XG4gICAgc3RhdGUucHJvY2Vzc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgKytxdWV1ZVNpemU7XG4gICAgbmV4dFRpY2soZnVuY3Rpb24oKSB7IHByb2Nlc3NRdWV1ZShzdGF0ZSk7IH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsKSB7XG4gICAgaWYgKHByb21pc2UuJCRzdGF0ZS5zdGF0dXMpIHJldHVybjtcbiAgICBpZiAodmFsID09PSBwcm9taXNlKSB7XG4gICAgICAkJHJlamVjdChwcm9taXNlLCAkcU1pbkVycihcbiAgICAgICAgJ3FjeWNsZScsXG4gICAgICAgICdFeHBlY3RlZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIHdpdGggdmFsdWUgb3RoZXIgdGhhbiBpdHNlbGYgXFwnezB9XFwnJyxcbiAgICAgICAgdmFsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQkcmVzb2x2ZShwcm9taXNlLCB2YWwpO1xuICAgIH1cblxuICB9XG5cbiAgZnVuY3Rpb24gJCRyZXNvbHZlKHByb21pc2UsIHZhbCkge1xuICAgIHZhciB0aGVuO1xuICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc09iamVjdCh2YWwpIHx8IGlzRnVuY3Rpb24odmFsKSkgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgaWYgKGlzRnVuY3Rpb24odGhlbikpIHtcbiAgICAgICAgcHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA9IC0xO1xuICAgICAgICB0aGVuLmNhbGwodmFsLCBkb1Jlc29sdmUsIGRvUmVqZWN0LCBkb05vdGlmeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlLiQkc3RhdGUudmFsdWUgPSB2YWw7XG4gICAgICAgIHByb21pc2UuJCRzdGF0ZS5zdGF0dXMgPSAxO1xuICAgICAgICBzY2hlZHVsZVByb2Nlc3NRdWV1ZShwcm9taXNlLiQkc3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRvUmVqZWN0KGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvUmVzb2x2ZSh2YWwpIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICQkcmVzb2x2ZShwcm9taXNlLCB2YWwpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkb1JlamVjdCh2YWwpIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICQkcmVqZWN0KHByb21pc2UsIHZhbCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRvTm90aWZ5KHByb2dyZXNzKSB7XG4gICAgICBub3RpZnlQcm9taXNlKHByb21pc2UsIHByb2dyZXNzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWplY3RQcm9taXNlKHByb21pc2UsIHJlYXNvbikge1xuICAgIGlmIChwcm9taXNlLiQkc3RhdGUuc3RhdHVzKSByZXR1cm47XG4gICAgJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICQkcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICAgIHByb21pc2UuJCRzdGF0ZS52YWx1ZSA9IHJlYXNvbjtcbiAgICBwcm9taXNlLiQkc3RhdGUuc3RhdHVzID0gMjtcbiAgICBzY2hlZHVsZVByb2Nlc3NRdWV1ZShwcm9taXNlLiQkc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm90aWZ5UHJvbWlzZShwcm9taXNlLCBwcm9ncmVzcykge1xuICAgIHZhciBjYWxsYmFja3MgPSBwcm9taXNlLiQkc3RhdGUucGVuZGluZztcblxuICAgIGlmICgocHJvbWlzZS4kJHN0YXRlLnN0YXR1cyA8PSAwKSAmJiBjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgbmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBjYWxsYmFjaywgcmVzdWx0O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrc1tpXVswXTtcbiAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXVszXTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm90aWZ5UHJvbWlzZShyZXN1bHQsIGlzRnVuY3Rpb24oY2FsbGJhY2spID8gY2FsbGJhY2socHJvZ3Jlc3MpIDogcHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkcSNyZWplY3RcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgYXMgcmVqZWN0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGByZWFzb25gLiBUaGlzIGFwaSBzaG91bGQgYmVcbiAgICogdXNlZCB0byBmb3J3YXJkIHJlamVjdGlvbiBpbiBhIGNoYWluIG9mIHByb21pc2VzLiBJZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCB0aGUgbGFzdCBwcm9taXNlIGluXG4gICAqIGEgcHJvbWlzZSBjaGFpbiwgeW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQuXG4gICAqXG4gICAqIFdoZW4gY29tcGFyaW5nIGRlZmVycmVkcy9wcm9taXNlcyB0byB0aGUgZmFtaWxpYXIgYmVoYXZpb3Igb2YgdHJ5L2NhdGNoL3Rocm93LCB0aGluayBvZlxuICAgKiBgcmVqZWN0YCBhcyB0aGUgYHRocm93YCBrZXl3b3JkIGluIEphdmFTY3JpcHQuIFRoaXMgYWxzbyBtZWFucyB0aGF0IGlmIHlvdSBcImNhdGNoXCIgYW4gZXJyb3IgdmlhXG4gICAqIGEgcHJvbWlzZSBlcnJvciBjYWxsYmFjayBhbmQgeW91IHdhbnQgdG8gZm9yd2FyZCB0aGUgZXJyb3IgdG8gdGhlIHByb21pc2UgZGVyaXZlZCBmcm9tIHRoZVxuICAgKiBjdXJyZW50IHByb21pc2UsIHlvdSBoYXZlIHRvIFwicmV0aHJvd1wiIHRoZSBlcnJvciBieSByZXR1cm5pbmcgYSByZWplY3Rpb24gY29uc3RydWN0ZWQgdmlhXG4gICAqIGByZWplY3RgLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgIHByb21pc2VCID0gcHJvbWlzZUEudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICogICAgIC8vIHN1Y2Nlc3M6IGRvIHNvbWV0aGluZyBhbmQgcmVzb2x2ZSBwcm9taXNlQlxuICAgKiAgICAgLy8gICAgICAgICAgd2l0aCB0aGUgb2xkIG9yIGEgbmV3IHJlc3VsdFxuICAgKiAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICogICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICogICAgIC8vIGVycm9yOiBoYW5kbGUgdGhlIGVycm9yIGlmIHBvc3NpYmxlIGFuZFxuICAgKiAgICAgLy8gICAgICAgIHJlc29sdmUgcHJvbWlzZUIgd2l0aCBuZXdQcm9taXNlT3JWYWx1ZSxcbiAgICogICAgIC8vICAgICAgICBvdGhlcndpc2UgZm9yd2FyZCB0aGUgcmVqZWN0aW9uIHRvIHByb21pc2VCXG4gICAqICAgICBpZiAoY2FuSGFuZGxlKHJlYXNvbikpIHtcbiAgICogICAgICAvLyBoYW5kbGUgdGhlIGVycm9yIGFuZCByZWNvdmVyXG4gICAqICAgICAgcmV0dXJuIG5ld1Byb21pc2VPclZhbHVlO1xuICAgKiAgICAgfVxuICAgKiAgICAgcmV0dXJuICRxLnJlamVjdChyZWFzb24pO1xuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHsqfSByZWFzb24gQ29uc3RhbnQsIG1lc3NhZ2UsIGV4Y2VwdGlvbiBvciBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZWplY3Rpb24gcmVhc29uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHByb21pc2UgdGhhdCB3YXMgYWxyZWFkeSByZXNvbHZlZCBhcyByZWplY3RlZCB3aXRoIHRoZSBgcmVhc29uYC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlamVjdChyZWFzb24pIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IFByb21pc2UoKTtcbiAgICByZWplY3RQcm9taXNlKHJlc3VsdCwgcmVhc29uKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ2FsbGJhY2sodmFsdWUsIHJlc29sdmVyLCBjYWxsYmFjaykge1xuICAgIHZhciBjYWxsYmFja091dHB1dCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgY2FsbGJhY2tPdXRwdXQgPSBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2VMaWtlKGNhbGxiYWNrT3V0cHV0KSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrT3V0cHV0LnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlcih2YWx1ZSk7XG4gICAgICB9LCByZWplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXIodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRxI3doZW5cbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdyYXBzIGFuIG9iamVjdCB0aGF0IG1pZ2h0IGJlIGEgdmFsdWUgb3IgYSAoM3JkIHBhcnR5KSB0aGVuLWFibGUgcHJvbWlzZSBpbnRvIGEgJHEgcHJvbWlzZS5cbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBvYmplY3QgdGhhdCBtaWdodCBvciBtaWdodCBub3QgYmUgYSBwcm9taXNlLCBvciBpZlxuICAgKiB0aGUgcHJvbWlzZSBjb21lcyBmcm9tIGEgc291cmNlIHRoYXQgY2FuJ3QgYmUgdHJ1c3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvciBhIHByb21pc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IHN1Y2Nlc3NDYWxsYmFja1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXJyb3JDYWxsYmFja1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcHJvZ3Jlc3NDYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIHBhc3NlZCB2YWx1ZSBvciBwcm9taXNlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gd2hlbih2YWx1ZSwgY2FsbGJhY2ssIGVycmJhY2ssIHByb2dyZXNzQmFjaykge1xuICAgIHZhciByZXN1bHQgPSBuZXcgUHJvbWlzZSgpO1xuICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdCwgdmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQudGhlbihjYWxsYmFjaywgZXJyYmFjaywgcHJvZ3Jlc3NCYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRxI3Jlc29sdmVcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFsaWFzIG9mIHtAbGluayBuZy4kcSN3aGVuIHdoZW59IHRvIG1haW50YWluIG5hbWluZyBjb25zaXN0ZW5jeSB3aXRoIEVTNi5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvciBhIHByb21pc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IHN1Y2Nlc3NDYWxsYmFja1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXJyb3JDYWxsYmFja1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcHJvZ3Jlc3NDYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIHBhc3NlZCB2YWx1ZSBvciBwcm9taXNlXG4gICAqL1xuICB2YXIgcmVzb2x2ZSA9IHdoZW47XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJHEjYWxsXG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb21iaW5lcyBtdWx0aXBsZSBwcm9taXNlcyBpbnRvIGEgc2luZ2xlIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBvZiB0aGUgaW5wdXRcbiAgICogcHJvbWlzZXMgYXJlIHJlc29sdmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5LjxQcm9taXNlPnxPYmplY3QuPFByb21pc2U+fSBwcm9taXNlcyBBbiBhcnJheSBvciBoYXNoIG9mIHByb21pc2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJucyBhIHNpbmdsZSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIGFuIGFycmF5L2hhc2ggb2YgdmFsdWVzLFxuICAgKiAgIGVhY2ggdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvbWlzZSBhdCB0aGUgc2FtZSBpbmRleC9rZXkgaW4gdGhlIGBwcm9taXNlc2AgYXJyYXkvaGFzaC5cbiAgICogICBJZiBhbnkgb2YgdGhlIHByb21pc2VzIGlzIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24sIHRoaXMgcmVzdWx0aW5nIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZFxuICAgKiAgIHdpdGggdGhlIHNhbWUgcmVqZWN0aW9uIHZhbHVlLlxuICAgKi9cblxuICBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IFByb21pc2UoKSxcbiAgICAgICAgY291bnRlciA9IDAsXG4gICAgICAgIHJlc3VsdHMgPSBpc0FycmF5KHByb21pc2VzKSA/IFtdIDoge307XG5cbiAgICBmb3JFYWNoKHByb21pc2VzLCBmdW5jdGlvbihwcm9taXNlLCBrZXkpIHtcbiAgICAgIGNvdW50ZXIrKztcbiAgICAgIHdoZW4ocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKCEoLS1jb3VudGVyKSkgcmVzb2x2ZVByb21pc2UocmVzdWx0LCByZXN1bHRzKTtcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICByZWplY3RQcm9taXNlKHJlc3VsdCwgcmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGNvdW50ZXIgPT09IDApIHtcbiAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdCwgcmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRxI3JhY2VcbiAgICogQGtpbmQgZnVuY3Rpb25cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb3IgcmVqZWN0cyBhcyBzb29uIGFzIG9uZSBvZiB0aG9zZSBwcm9taXNlc1xuICAgKiByZXNvbHZlcyBvciByZWplY3RzLCB3aXRoIHRoZSB2YWx1ZSBvciByZWFzb24gZnJvbSB0aGF0IHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkuPFByb21pc2U+fE9iamVjdC48UHJvbWlzZT59IHByb21pc2VzIEFuIGFycmF5IG9yIGhhc2ggb2YgcHJvbWlzZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvciByZWplY3RzIGFzIHNvb24gYXMgb25lIG9mIHRoZSBgcHJvbWlzZXNgXG4gICAqIHJlc29sdmVzIG9yIHJlamVjdHMsIHdpdGggdGhlIHZhbHVlIG9yIHJlYXNvbiBmcm9tIHRoYXQgcHJvbWlzZS5cbiAgICovXG5cbiAgZnVuY3Rpb24gcmFjZShwcm9taXNlcykge1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG5cbiAgICBmb3JFYWNoKHByb21pc2VzLCBmdW5jdGlvbihwcm9taXNlKSB7XG4gICAgICB3aGVuKHByb21pc2UpLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSwgZGVmZXJyZWQucmVqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICB9XG5cbiAgZnVuY3Rpb24gJFEocmVzb2x2ZXIpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24ocmVzb2x2ZXIpKSB7XG4gICAgICB0aHJvdyAkcU1pbkVycignbm9yc2x2cicsICdFeHBlY3RlZCByZXNvbHZlckZuLCBnb3QgXFwnezB9XFwnJywgcmVzb2x2ZXIpO1xuICAgIH1cblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKTtcblxuICAgIGZ1bmN0aW9uIHJlc29sdmVGbih2YWx1ZSkge1xuICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdEZuKHJlYXNvbikge1xuICAgICAgcmVqZWN0UHJvbWlzZShwcm9taXNlLCByZWFzb24pO1xuICAgIH1cblxuICAgIHJlc29sdmVyKHJlc29sdmVGbiwgcmVqZWN0Rm4pO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvLyBMZXQncyBtYWtlIHRoZSBpbnN0YW5jZW9mIG9wZXJhdG9yIHdvcmsgZm9yIHByb21pc2VzLCBzbyB0aGF0XG4gIC8vIGBuZXcgJHEoZm4pIGluc3RhbmNlb2YgJHFgIHdvdWxkIGV2YWx1YXRlIHRvIHRydWUuXG4gICRRLnByb3RvdHlwZSA9IFByb21pc2UucHJvdG90eXBlO1xuXG4gICRRLmRlZmVyID0gZGVmZXI7XG4gICRRLnJlamVjdCA9IHJlamVjdDtcbiAgJFEud2hlbiA9IHdoZW47XG4gICRRLnJlc29sdmUgPSByZXNvbHZlO1xuICAkUS5hbGwgPSBhbGw7XG4gICRRLnJhY2UgPSByYWNlO1xuXG4gIHJldHVybiAkUTtcbn1cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkJFJBRlByb3ZpZGVyKCkgeyAvL3JBRlxuICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJHRpbWVvdXQnLCBmdW5jdGlvbigkd2luZG93LCAkdGltZW91dCkge1xuICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAkd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZTtcblxuICAgIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9ICR3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy53ZWJraXRDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbiAgICB2YXIgcmFmU3VwcG9ydGVkID0gISFyZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gICAgdmFyIHJhZiA9IHJhZlN1cHBvcnRlZFxuICAgICAgPyBmdW5jdGlvbihmbikge1xuICAgICAgICAgIHZhciBpZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICB2YXIgdGltZXIgPSAkdGltZW91dChmbiwgMTYuNjYsIGZhbHNlKTsgLy8gMTAwMCAvIDYwID0gMTYuNjY2XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHRpbWVyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgcmFmLnN1cHBvcnRlZCA9IHJhZlN1cHBvcnRlZDtcblxuICAgIHJldHVybiByYWY7XG4gIH1dO1xufVxuXG4vKipcbiAqIERFU0lHTiBOT1RFU1xuICpcbiAqIFRoZSBkZXNpZ24gZGVjaXNpb25zIGJlaGluZCB0aGUgc2NvcGUgYXJlIGhlYXZpbHkgZmF2b3JlZCBmb3Igc3BlZWQgYW5kIG1lbW9yeSBjb25zdW1wdGlvbi5cbiAqXG4gKiBUaGUgdHlwaWNhbCB1c2Ugb2Ygc2NvcGUgaXMgdG8gd2F0Y2ggdGhlIGV4cHJlc3Npb25zLCB3aGljaCBtb3N0IG9mIHRoZSB0aW1lIHJldHVybiB0aGUgc2FtZVxuICogdmFsdWUgYXMgbGFzdCB0aW1lIHNvIHdlIG9wdGltaXplIHRoZSBvcGVyYXRpb24uXG4gKlxuICogQ2xvc3VyZXMgY29uc3RydWN0aW9uIGlzIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzcGVlZCBhcyB3ZWxsIGFzIG1lbW9yeTpcbiAqICAgLSBObyBjbG9zdXJlcywgaW5zdGVhZCB1c2UgcHJvdG90eXBpY2FsIGluaGVyaXRhbmNlIGZvciBBUElcbiAqICAgLSBJbnRlcm5hbCBzdGF0ZSBuZWVkcyB0byBiZSBzdG9yZWQgb24gc2NvcGUgZGlyZWN0bHksIHdoaWNoIG1lYW5zIHRoYXQgcHJpdmF0ZSBzdGF0ZSBpc1xuICogICAgIGV4cG9zZWQgYXMgJCRfX19fIHByb3BlcnRpZXNcbiAqXG4gKiBMb29wIG9wZXJhdGlvbnMgYXJlIG9wdGltaXplZCBieSB1c2luZyB3aGlsZShjb3VudC0tKSB7IC4uLiB9XG4gKiAgIC0gVGhpcyBtZWFucyB0aGF0IGluIG9yZGVyIHRvIGtlZXAgdGhlIHNhbWUgb3JkZXIgb2YgZXhlY3V0aW9uIGFzIGFkZGl0aW9uIHdlIGhhdmUgdG8gYWRkXG4gKiAgICAgaXRlbXMgdG8gdGhlIGFycmF5IGF0IHRoZSBiZWdpbm5pbmcgKHVuc2hpZnQpIGluc3RlYWQgb2YgYXQgdGhlIGVuZCAocHVzaClcbiAqXG4gKiBDaGlsZCBzY29wZXMgYXJlIGNyZWF0ZWQgYW5kIHJlbW92ZWQgb2Z0ZW5cbiAqICAgLSBVc2luZyBhbiBhcnJheSB3b3VsZCBiZSBzbG93IHNpbmNlIGluc2VydHMgaW4gdGhlIG1pZGRsZSBhcmUgZXhwZW5zaXZlOyBzbyB3ZSB1c2UgbGlua2VkIGxpc3RzXG4gKlxuICogVGhlcmUgYXJlIGZld2VyIHdhdGNoZXMgdGhhbiBvYnNlcnZlcnMuIFRoaXMgaXMgd2h5IHlvdSBkb24ndCB3YW50IHRoZSBvYnNlcnZlciB0byBiZSBpbXBsZW1lbnRlZFxuICogaW4gdGhlIHNhbWUgd2F5IGFzIHdhdGNoLiBXYXRjaCByZXF1aXJlcyByZXR1cm4gb2YgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHdoaWNoIGlzIGV4cGVuc2l2ZVxuICogdG8gY29uc3RydWN0LlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRyb290U2NvcGVQcm92aWRlclxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUHJvdmlkZXIgZm9yIHRoZSAkcm9vdFNjb3BlIHNlcnZpY2UuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgbWV0aG9kXG4gKiBAbmFtZSAkcm9vdFNjb3BlUHJvdmlkZXIjZGlnZXN0VHRsXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBTZXRzIHRoZSBudW1iZXIgb2YgYCRkaWdlc3RgIGl0ZXJhdGlvbnMgdGhlIHNjb3BlIHNob3VsZCBhdHRlbXB0IHRvIGV4ZWN1dGUgYmVmb3JlIGdpdmluZyB1cCBhbmRcbiAqIGFzc3VtaW5nIHRoYXQgdGhlIG1vZGVsIGlzIHVuc3RhYmxlLlxuICpcbiAqIFRoZSBjdXJyZW50IGRlZmF1bHQgaXMgMTAgaXRlcmF0aW9ucy5cbiAqXG4gKiBJbiBjb21wbGV4IGFwcGxpY2F0aW9ucyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGAkd2F0Y2hgcyB3aWxsIHJlc3VsdCBpblxuICogc2V2ZXJhbCBkaWdlc3QgaXRlcmF0aW9ucy4gSG93ZXZlciBpZiBhbiBhcHBsaWNhdGlvbiBuZWVkcyBtb3JlIHRoYW4gdGhlIGRlZmF1bHQgMTAgZGlnZXN0XG4gKiBpdGVyYXRpb25zIGZvciBpdHMgbW9kZWwgdG8gc3RhYmlsaXplIHRoZW4geW91IHNob3VsZCBpbnZlc3RpZ2F0ZSB3aGF0IGlzIGNhdXNpbmcgdGhlIG1vZGVsIHRvXG4gKiBjb250aW51b3VzbHkgY2hhbmdlIGR1cmluZyB0aGUgZGlnZXN0LlxuICpcbiAqIEluY3JlYXNpbmcgdGhlIFRUTCBjb3VsZCBoYXZlIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucywgc28geW91IHNob3VsZCBub3QgY2hhbmdlIGl0IHdpdGhvdXRcbiAqIHByb3BlciBqdXN0aWZpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgbnVtYmVyIG9mIGRpZ2VzdCBpdGVyYXRpb25zLlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJHJvb3RTY29wZVxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBFdmVyeSBhcHBsaWNhdGlvbiBoYXMgYSBzaW5nbGUgcm9vdCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0uXG4gKiBBbGwgb3RoZXIgc2NvcGVzIGFyZSBkZXNjZW5kYW50IHNjb3BlcyBvZiB0aGUgcm9vdCBzY29wZS4gU2NvcGVzIHByb3ZpZGUgc2VwYXJhdGlvblxuICogYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSB2aWV3LCB2aWEgYSBtZWNoYW5pc20gZm9yIHdhdGNoaW5nIHRoZSBtb2RlbCBmb3IgY2hhbmdlcy5cbiAqIFRoZXkgYWxzbyBwcm92aWRlIGV2ZW50IGVtaXNzaW9uL2Jyb2FkY2FzdCBhbmQgc3Vic2NyaXB0aW9uIGZhY2lsaXR5LiBTZWUgdGhlXG4gKiB7QGxpbmsgZ3VpZGUvc2NvcGUgZGV2ZWxvcGVyIGd1aWRlIG9uIHNjb3Blc30uXG4gKi9cbmZ1bmN0aW9uICRSb290U2NvcGVQcm92aWRlcigpIHtcbiAgdmFyIFRUTCA9IDEwO1xuICB2YXIgJHJvb3RTY29wZU1pbkVyciA9IG1pbkVycignJHJvb3RTY29wZScpO1xuICB2YXIgbGFzdERpcnR5V2F0Y2ggPSBudWxsO1xuICB2YXIgYXBwbHlBc3luY0lkID0gbnVsbDtcblxuICB0aGlzLmRpZ2VzdFR0bCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIFRUTCA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gVFRMO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkU2NvcGVDbGFzcyhwYXJlbnQpIHtcbiAgICBmdW5jdGlvbiBDaGlsZFNjb3BlKCkge1xuICAgICAgdGhpcy4kJHdhdGNoZXJzID0gdGhpcy4kJG5leHRTaWJsaW5nID1cbiAgICAgICAgICB0aGlzLiQkY2hpbGRIZWFkID0gdGhpcy4kJGNoaWxkVGFpbCA9IG51bGw7XG4gICAgICB0aGlzLiQkbGlzdGVuZXJzID0ge307XG4gICAgICB0aGlzLiQkbGlzdGVuZXJDb3VudCA9IHt9O1xuICAgICAgdGhpcy4kJHdhdGNoZXJzQ291bnQgPSAwO1xuICAgICAgdGhpcy4kaWQgPSBuZXh0VWlkKCk7XG4gICAgICB0aGlzLiQkQ2hpbGRTY29wZSA9IG51bGw7XG4gICAgfVxuICAgIENoaWxkU2NvcGUucHJvdG90eXBlID0gcGFyZW50O1xuICAgIHJldHVybiBDaGlsZFNjb3BlO1xuICB9XG5cbiAgdGhpcy4kZ2V0ID0gWyckZXhjZXB0aW9uSGFuZGxlcicsICckcGFyc2UnLCAnJGJyb3dzZXInLFxuICAgICAgZnVuY3Rpb24oJGV4Y2VwdGlvbkhhbmRsZXIsICRwYXJzZSwgJGJyb3dzZXIpIHtcblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3lDaGlsZFNjb3BlKCRldmVudCkge1xuICAgICAgICAkZXZlbnQuY3VycmVudFNjb3BlLiQkZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhblVwU2NvcGUoJHNjb3BlKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IElFIDkgb25seVxuICAgICAgaWYgKG1zaWUgPT09IDkpIHtcbiAgICAgICAgLy8gVGhlcmUgaXMgYSBtZW1vcnkgbGVhayBpbiBJRTkgaWYgYWxsIGNoaWxkIHNjb3BlcyBhcmUgbm90IGRpc2Nvbm5lY3RlZFxuICAgICAgICAvLyBjb21wbGV0ZWx5IHdoZW4gYSBzY29wZSBpcyBkZXN0cm95ZWQuIFNvIHRoaXMgY29kZSB3aWxsIHJlY3Vyc2UgdXAgdGhyb3VnaFxuICAgICAgICAvLyBhbGwgdGhpcyBzY29wZXMgY2hpbGRyZW5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzEwNzA2XG4gICAgICAgIGlmICgkc2NvcGUuJCRjaGlsZEhlYWQpIHtcbiAgICAgICAgICBjbGVhblVwU2NvcGUoJHNjb3BlLiQkY2hpbGRIZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJHNjb3BlLiQkbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICBjbGVhblVwU2NvcGUoJHNjb3BlLiQkbmV4dFNpYmxpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb2RlIGJlbG93IHdvcmtzIGFyb3VuZCBJRTkgYW5kIFY4J3MgbWVtb3J5IGxlYWtzXG4gICAgICAvL1xuICAgICAgLy8gU2VlOlxuICAgICAgLy8gLSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MjA3MyNjMjZcbiAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvNjc5NCNpc3N1ZWNvbW1lbnQtMzg2NDg5MDlcbiAgICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvMTMxMyNpc3N1ZWNvbW1lbnQtMTAzNzg0NTFcblxuICAgICAgJHNjb3BlLiRwYXJlbnQgPSAkc2NvcGUuJCRuZXh0U2libGluZyA9ICRzY29wZS4kJHByZXZTaWJsaW5nID0gJHNjb3BlLiQkY2hpbGRIZWFkID1cbiAgICAgICAgICAkc2NvcGUuJCRjaGlsZFRhaWwgPSAkc2NvcGUuJHJvb3QgPSAkc2NvcGUuJCR3YXRjaGVycyA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIHR5cGVcbiAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBBIHJvb3Qgc2NvcGUgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUgJHJvb3RTY29wZX0ga2V5IGZyb20gdGhlXG4gICAgICoge0BsaW5rIGF1dG8uJGluamVjdG9yICRpbmplY3Rvcn0uIENoaWxkIHNjb3BlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGVcbiAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkbmV3ICRuZXcoKX0gbWV0aG9kLiAoTW9zdCBzY29wZXMgYXJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuXG4gICAgICogY29tcGlsZWQgSFRNTCB0ZW1wbGF0ZSBpcyBleGVjdXRlZC4pIFNlZSBhbHNvIHRoZSB7QGxpbmsgZ3VpZGUvc2NvcGUgU2NvcGVzIGd1aWRlfSBmb3JcbiAgICAgKiBhbiBpbi1kZXB0aCBpbnRyb2R1Y3Rpb24gYW5kIHVzYWdlIGV4YW1wbGVzLlxuICAgICAqXG4gICAgICpcbiAgICAgKiAjIEluaGVyaXRhbmNlXG4gICAgICogQSBzY29wZSBjYW4gaW5oZXJpdCBmcm9tIGEgcGFyZW50IHNjb3BlLCBhcyBpbiB0aGlzIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgICAgIHZhciBwYXJlbnQgPSAkcm9vdFNjb3BlO1xuICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50LiRuZXcoKTtcblxuICAgICAgICAgcGFyZW50LnNhbHV0YXRpb24gPSBcIkhlbGxvXCI7XG4gICAgICAgICBleHBlY3QoY2hpbGQuc2FsdXRhdGlvbikudG9FcXVhbCgnSGVsbG8nKTtcblxuICAgICAgICAgY2hpbGQuc2FsdXRhdGlvbiA9IFwiV2VsY29tZVwiO1xuICAgICAgICAgZXhwZWN0KGNoaWxkLnNhbHV0YXRpb24pLnRvRXF1YWwoJ1dlbGNvbWUnKTtcbiAgICAgICAgIGV4cGVjdChwYXJlbnQuc2FsdXRhdGlvbikudG9FcXVhbCgnSGVsbG8nKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBgU2NvcGVgIGluIHRlc3RzLCBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzIGFyZSBhdmFpbGFibGUgb24gdGhlXG4gICAgICogaW5zdGFuY2VzIG9mIGBTY29wZWAgdHlwZS4gU2VlIHtAbGluayBuZ01vY2suJHJvb3RTY29wZS5TY29wZSBuZ01vY2sgU2NvcGV9IGZvciBhZGRpdGlvbmFsXG4gICAgICogZGV0YWlscy5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgZnVuY3Rpb24oKT49fSBwcm92aWRlcnMgTWFwIG9mIHNlcnZpY2UgZmFjdG9yeSB3aGljaCBuZWVkIHRvIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuIERlZmF1bHRzIHRvIHtAbGluayBuZ30uXG4gICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgKj49fSBpbnN0YW5jZUNhY2hlIFByb3ZpZGVzIHByZS1pbnN0YW50aWF0ZWQgc2VydmljZXMgd2hpY2ggc2hvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQvb3ZlcnJpZGUgc2VydmljZXMgcHJvdmlkZWQgYnkgYHByb3ZpZGVyc2AuIFRoaXMgaXMgaGFuZHlcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdW5pdC10ZXN0aW5nIGFuZCBoYXZpbmcgdGhlIG5lZWQgdG8gb3ZlcnJpZGUgYSBkZWZhdWx0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE5ld2x5IGNyZWF0ZWQgc2NvcGUuXG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTY29wZSgpIHtcbiAgICAgIHRoaXMuJGlkID0gbmV4dFVpZCgpO1xuICAgICAgdGhpcy4kJHBoYXNlID0gdGhpcy4kcGFyZW50ID0gdGhpcy4kJHdhdGNoZXJzID1cbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuJCRuZXh0U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZyA9XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLiQkY2hpbGRIZWFkID0gdGhpcy4kJGNoaWxkVGFpbCA9IG51bGw7XG4gICAgICB0aGlzLiRyb290ID0gdGhpcztcbiAgICAgIHRoaXMuJCRkZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuJCRsaXN0ZW5lcnMgPSB7fTtcbiAgICAgIHRoaXMuJCRsaXN0ZW5lckNvdW50ID0ge307XG4gICAgICB0aGlzLiQkd2F0Y2hlcnNDb3VudCA9IDA7XG4gICAgICB0aGlzLiQkaXNvbGF0ZUJpbmRpbmdzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRpZFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVW5pcXVlIHNjb3BlIElEIChtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcpIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqL1xuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2MgcHJvcGVydHlcbiAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkcGFyZW50XG4gICAgICAqXG4gICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBzY29wZS5cbiAgICAgICovXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIHByb3BlcnR5XG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRyb290XG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3Qgc2NvcGUuXG4gICAgICAgKi9cblxuICAgIFNjb3BlLnByb3RvdHlwZSA9IHtcbiAgICAgIGNvbnN0cnVjdG9yOiBTY29wZSxcbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkbmV3XG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogQ3JlYXRlcyBhIG5ldyBjaGlsZCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSBzY29wZX0uXG4gICAgICAgKlxuICAgICAgICogVGhlIHBhcmVudCBzY29wZSB3aWxsIHByb3BhZ2F0ZSB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IGV2ZW50LlxuICAgICAgICogVGhlIHNjb3BlIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNjb3BlIGhpZXJhcmNoeSB1c2luZyB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveSAkZGVzdHJveSgpfS5cbiAgICAgICAqXG4gICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGVzdHJveSAkZGVzdHJveSgpfSBtdXN0IGJlIGNhbGxlZCBvbiBhIHNjb3BlIHdoZW4gaXQgaXNcbiAgICAgICAqIGRlc2lyZWQgZm9yIHRoZSBzY29wZSBhbmQgaXRzIGNoaWxkIHNjb3BlcyB0byBiZSBwZXJtYW5lbnRseSBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQgYW5kXG4gICAgICAgKiB0aHVzIHN0b3AgcGFydGljaXBhdGluZyBpbiBtb2RlbCBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBsaXN0ZW5lciBub3RpZmljYXRpb24gYnkgaW52b2tpbmcuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBpc29sYXRlIElmIHRydWUsIHRoZW4gdGhlIHNjb3BlIGRvZXMgbm90IHByb3RvdHlwaWNhbGx5IGluaGVyaXQgZnJvbSB0aGVcbiAgICAgICAqICAgICAgICAgcGFyZW50IHNjb3BlLiBUaGUgc2NvcGUgaXMgaXNvbGF0ZWQsIGFzIGl0IGNhbiBub3Qgc2VlIHBhcmVudCBzY29wZSBwcm9wZXJ0aWVzLlxuICAgICAgICogICAgICAgICBXaGVuIGNyZWF0aW5nIHdpZGdldHMsIGl0IGlzIHVzZWZ1bCBmb3IgdGhlIHdpZGdldCB0byBub3QgYWNjaWRlbnRhbGx5IHJlYWQgcGFyZW50XG4gICAgICAgKiAgICAgICAgIHN0YXRlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7U2NvcGV9IFtwYXJlbnQ9dGhpc10gVGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIGBTY29wZWB9IHRoYXQgd2lsbCBiZSB0aGUgYCRwYXJlbnRgXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXdseSBjcmVhdGVkIHNjb3BlLiBEZWZhdWx0cyB0byBgdGhpc2Agc2NvcGUgaWYgbm90IHByb3ZpZGVkLlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRyYW5zY2x1ZGUgc2NvcGUgdG8gY29ycmVjdGx5IHBsYWNlIGl0XG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBzY29wZSBoaWVyYXJjaHkgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGNvcnJlY3QgcHJvdG90eXBpY2FsXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRhbmNlLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBuZXdseSBjcmVhdGVkIGNoaWxkIHNjb3BlLlxuICAgICAgICpcbiAgICAgICAqL1xuICAgICAgJG5ldzogZnVuY3Rpb24oaXNvbGF0ZSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjaGlsZDtcblxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQgfHwgdGhpcztcblxuICAgICAgICBpZiAoaXNvbGF0ZSkge1xuICAgICAgICAgIGNoaWxkID0gbmV3IFNjb3BlKCk7XG4gICAgICAgICAgY2hpbGQuJHJvb3QgPSB0aGlzLiRyb290O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgY2hpbGQgc2NvcGUgY2xhc3MgaWYgc29tZWJvZHkgYXNrcyBmb3Igb25lLFxuICAgICAgICAgIC8vIGJ1dCBjYWNoZSBpdCB0byBhbGxvdyB0aGUgVk0gdG8gb3B0aW1pemUgbG9va3Vwcy5cbiAgICAgICAgICBpZiAoIXRoaXMuJCRDaGlsZFNjb3BlKSB7XG4gICAgICAgICAgICB0aGlzLiQkQ2hpbGRTY29wZSA9IGNyZWF0ZUNoaWxkU2NvcGVDbGFzcyh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hpbGQgPSBuZXcgdGhpcy4kJENoaWxkU2NvcGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZC4kcGFyZW50ID0gcGFyZW50O1xuICAgICAgICBjaGlsZC4kJHByZXZTaWJsaW5nID0gcGFyZW50LiQkY2hpbGRUYWlsO1xuICAgICAgICBpZiAocGFyZW50LiQkY2hpbGRIZWFkKSB7XG4gICAgICAgICAgcGFyZW50LiQkY2hpbGRUYWlsLiQkbmV4dFNpYmxpbmcgPSBjaGlsZDtcbiAgICAgICAgICBwYXJlbnQuJCRjaGlsZFRhaWwgPSBjaGlsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJlbnQuJCRjaGlsZEhlYWQgPSBwYXJlbnQuJCRjaGlsZFRhaWwgPSBjaGlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdoZW4gdGhlIG5ldyBzY29wZSBpcyBub3QgaXNvbGF0ZWQgb3Igd2UgaW5oZXJpdCBmcm9tIGB0aGlzYCwgYW5kXG4gICAgICAgIC8vIHRoZSBwYXJlbnQgc2NvcGUgaXMgZGVzdHJveWVkLCB0aGUgcHJvcGVydHkgYCQkZGVzdHJveWVkYCBpcyBpbmhlcml0ZWRcbiAgICAgICAgLy8gcHJvdG90eXBpY2FsbHkuIEluIGFsbCBvdGhlciBjYXNlcywgdGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBzZXRcbiAgICAgICAgLy8gd2hlbiB0aGUgcGFyZW50IHNjb3BlIGlzIGRlc3Ryb3llZC5cbiAgICAgICAgLy8gVGhlIGxpc3RlbmVyIG5lZWRzIHRvIGJlIGFkZGVkIGFmdGVyIHRoZSBwYXJlbnQgaXMgc2V0XG4gICAgICAgIGlmIChpc29sYXRlIHx8IHBhcmVudCAhPT0gdGhpcykgY2hpbGQuJG9uKCckZGVzdHJveScsIGRlc3Ryb3lDaGlsZFNjb3BlKTtcblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJHdhdGNoXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogUmVnaXN0ZXJzIGEgYGxpc3RlbmVyYCBjYWxsYmFjayB0byBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYHdhdGNoRXhwcmVzc2lvbmAgY2hhbmdlcy5cbiAgICAgICAqXG4gICAgICAgKiAtIFRoZSBgd2F0Y2hFeHByZXNzaW9uYCBpcyBjYWxsZWQgb24gZXZlcnkgY2FsbCB0byB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0XG4gICAgICAgKiAgICRkaWdlc3QoKX0gYW5kIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB3YXRjaGVkLiAoYHdhdGNoRXhwcmVzc2lvbmAgc2hvdWxkIG5vdCBjaGFuZ2VcbiAgICAgICAqICAgaXRzIHZhbHVlIHdoZW4gZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBpbnB1dCBiZWNhdXNlIGl0IG1heSBiZSBleGVjdXRlZCBtdWx0aXBsZVxuICAgICAgICogICB0aW1lcyBieSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3QoKX0uIFRoYXQgaXMsIGB3YXRjaEV4cHJlc3Npb25gIHNob3VsZCBiZVxuICAgICAgICogICBbaWRlbXBvdGVudF0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JZGVtcG90ZW5jZSkuKVxuICAgICAgICogLSBUaGUgYGxpc3RlbmVyYCBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IGB3YXRjaEV4cHJlc3Npb25gIGFuZCB0aGVcbiAgICAgICAqICAgcHJldmlvdXMgY2FsbCB0byBgd2F0Y2hFeHByZXNzaW9uYCBhcmUgbm90IGVxdWFsICh3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGluaXRpYWwgcnVuLFxuICAgICAgICogICBzZWUgYmVsb3cpLiBJbmVxdWFsaXR5IGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHJlZmVyZW5jZSBpbmVxdWFsaXR5LFxuICAgICAgICogICBbc3RyaWN0IGNvbXBhcmlzb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9Db21wYXJpc29uX09wZXJhdG9ycylcbiAgICAgICAqICAgIHZpYSB0aGUgYCE9PWAgSmF2YXNjcmlwdCBvcGVyYXRvciwgdW5sZXNzIGBvYmplY3RFcXVhbGl0eSA9PSB0cnVlYFxuICAgICAgICogICAoc2VlIG5leHQgcG9pbnQpXG4gICAgICAgKiAtIFdoZW4gYG9iamVjdEVxdWFsaXR5ID09IHRydWVgLCBpbmVxdWFsaXR5IG9mIHRoZSBgd2F0Y2hFeHByZXNzaW9uYCBpcyBkZXRlcm1pbmVkXG4gICAgICAgKiAgIGFjY29yZGluZyB0byB0aGUge0BsaW5rIGFuZ3VsYXIuZXF1YWxzfSBmdW5jdGlvbi4gVG8gc2F2ZSB0aGUgdmFsdWUgb2YgdGhlIG9iamVjdCBmb3JcbiAgICAgICAqICAgbGF0ZXIgY29tcGFyaXNvbiwgdGhlIHtAbGluayBhbmd1bGFyLmNvcHl9IGZ1bmN0aW9uIGlzIHVzZWQuIFRoaXMgdGhlcmVmb3JlIG1lYW5zIHRoYXRcbiAgICAgICAqICAgd2F0Y2hpbmcgY29tcGxleCBvYmplY3RzIHdpbGwgaGF2ZSBhZHZlcnNlIG1lbW9yeSBhbmQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zLlxuICAgICAgICogLSBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCB0byB3YXRjaCBmb3IgY2hhbmdlcyBpbiBvYmplY3RzIHRoYXQgYXJlXG4gICAgICAgKiAgIG9yIGNvbnRhaW4gW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIGR1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIHtAbGluayBhbmd1bGFyLmNvcHkgYGFuZ3VsYXIuY29weWB9LlxuICAgICAgICogLSBUaGUgd2F0Y2ggYGxpc3RlbmVyYCBtYXkgY2hhbmdlIHRoZSBtb2RlbCwgd2hpY2ggbWF5IHRyaWdnZXIgb3RoZXIgYGxpc3RlbmVyYHMgdG8gZmlyZS5cbiAgICAgICAqICAgVGhpcyBpcyBhY2hpZXZlZCBieSByZXJ1bm5pbmcgdGhlIHdhdGNoZXJzIHVudGlsIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkLiBUaGUgcmVydW5cbiAgICAgICAqICAgaXRlcmF0aW9uIGxpbWl0IGlzIDEwIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBkZWFkbG9jay5cbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogSWYgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBpcyBjYWxsZWQsXG4gICAgICAgKiB5b3UgY2FuIHJlZ2lzdGVyIGEgYHdhdGNoRXhwcmVzc2lvbmAgZnVuY3Rpb24gd2l0aCBubyBgbGlzdGVuZXJgLiAoQmUgcHJlcGFyZWQgZm9yXG4gICAgICAgKiBtdWx0aXBsZSBjYWxscyB0byB5b3VyIGB3YXRjaEV4cHJlc3Npb25gIGJlY2F1c2UgaXQgd2lsbCBleGVjdXRlIG11bHRpcGxlIHRpbWVzIGluIGFcbiAgICAgICAqIHNpbmdsZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3R9IGN5Y2xlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLilcbiAgICAgICAqXG4gICAgICAgKiBBZnRlciBhIHdhdGNoZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzY29wZSwgdGhlIGBsaXN0ZW5lcmAgZm4gaXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5XG4gICAgICAgKiAodmlhIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRldmFsQXN5bmMgJGV2YWxBc3luY30pIHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAgKiB3YXRjaGVyLiBJbiByYXJlIGNhc2VzLCB0aGlzIGlzIHVuZGVzaXJhYmxlIGJlY2F1c2UgdGhlIGxpc3RlbmVyIGlzIGNhbGxlZCB3aGVuIHRoZSByZXN1bHRcbiAgICAgICAqIG9mIGB3YXRjaEV4cHJlc3Npb25gIGRpZG4ndCBjaGFuZ2UuIFRvIGRldGVjdCB0aGlzIHNjZW5hcmlvIHdpdGhpbiB0aGUgYGxpc3RlbmVyYCBmbiwgeW91XG4gICAgICAgKiBjYW4gY29tcGFyZSB0aGUgYG5ld1ZhbGAgYW5kIGBvbGRWYWxgLiBJZiB0aGVzZSB0d28gdmFsdWVzIGFyZSBpZGVudGljYWwgKGA9PT1gKSB0aGVuIHRoZVxuICAgICAgICogbGlzdGVuZXIgd2FzIGNhbGxlZCBkdWUgdG8gaW5pdGlhbGl6YXRpb24uXG4gICAgICAgKlxuICAgICAgICpcbiAgICAgICAqXG4gICAgICAgKiAjIEV4YW1wbGVcbiAgICAgICAqIGBgYGpzXG4gICAgICAgICAgIC8vIGxldCdzIGFzc3VtZSB0aGF0IHNjb3BlIHdhcyBkZXBlbmRlbmN5IGluamVjdGVkIGFzIHRoZSAkcm9vdFNjb3BlXG4gICAgICAgICAgIHZhciBzY29wZSA9ICRyb290U2NvcGU7XG4gICAgICAgICAgIHNjb3BlLm5hbWUgPSAnbWlza28nO1xuICAgICAgICAgICBzY29wZS5jb3VudGVyID0gMDtcblxuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgwKTtcbiAgICAgICAgICAgc2NvcGUuJHdhdGNoKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgc2NvcGUuY291bnRlciA9IHNjb3BlLmNvdW50ZXIgKyAxO1xuICAgICAgICAgICB9KTtcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7XG5cbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICAvLyB0aGUgbGlzdGVuZXIgaXMgYWx3YXlzIGNhbGxlZCBkdXJpbmcgdGhlIGZpcnN0ICRkaWdlc3QgbG9vcCBhZnRlciBpdCB3YXMgcmVnaXN0ZXJlZFxuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgxKTtcblxuICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgIC8vIGJ1dCBub3cgaXQgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyB0aGUgdmFsdWUgY2hhbmdlc1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgxKTtcblxuICAgICAgICAgICBzY29wZS5uYW1lID0gJ2FkYW0nO1xuICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDIpO1xuXG5cblxuICAgICAgICAgICAvLyBVc2luZyBhIGZ1bmN0aW9uIGFzIGEgd2F0Y2hFeHByZXNzaW9uXG4gICAgICAgICAgIHZhciBmb29kO1xuICAgICAgICAgICBzY29wZS5mb29kQ291bnRlciA9IDA7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgwKTtcbiAgICAgICAgICAgc2NvcGUuJHdhdGNoKFxuICAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgYmVpbmcgd2F0Y2hlZC4gSXQgaXMgY2FsbGVkIGZvciBlYWNoIHR1cm4gb2YgdGhlICRkaWdlc3QgbG9vcFxuICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gZm9vZDsgfSxcbiAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjaGFuZ2UgbGlzdGVuZXIsIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBhYm92ZSBmdW5jdGlvbiBjaGFuZ2VzXG4gICAgICAgICAgICAgZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgICBpZiAoIG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSApIHtcbiAgICAgICAgICAgICAgICAgLy8gT25seSBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgaWYgdGhlIHZhbHVlIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgc2NvcGUuZm9vZENvdW50ZXIgPSBzY29wZS5mb29kQ291bnRlciArIDE7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICApO1xuICAgICAgICAgICAvLyBObyBkaWdlc3QgaGFzIGJlZW4gcnVuIHNvIHRoZSBjb3VudGVyIHdpbGwgYmUgemVyb1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuZm9vZENvdW50ZXIpLnRvRXF1YWwoMCk7XG5cbiAgICAgICAgICAgLy8gUnVuIHRoZSBkaWdlc3QgYnV0IHNpbmNlIGZvb2QgaGFzIG5vdCBjaGFuZ2VkIGNvdW50IHdpbGwgc3RpbGwgYmUgemVyb1xuICAgICAgICAgICBzY29wZS4kZGlnZXN0KCk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5mb29kQ291bnRlcikudG9FcXVhbCgwKTtcblxuICAgICAgICAgICAvLyBVcGRhdGUgZm9vZCBhbmQgcnVuIGRpZ2VzdC4gIE5vdyB0aGUgY291bnRlciB3aWxsIGluY3JlbWVudFxuICAgICAgICAgICBmb29kID0gJ2NoZWVzZWJ1cmdlcic7XG4gICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmZvb2RDb3VudGVyKS50b0VxdWFsKDEpO1xuXG4gICAgICAgKiBgYGBcbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCl8c3RyaW5nKX0gd2F0Y2hFeHByZXNzaW9uIEV4cHJlc3Npb24gdGhhdCBpcyBldmFsdWF0ZWQgb24gZWFjaFxuICAgICAgICogICAge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0fSBjeWNsZS4gQSBjaGFuZ2UgaW4gdGhlIHJldHVybiB2YWx1ZSB0cmlnZ2Vyc1xuICAgICAgICogICAgYSBjYWxsIHRvIHRoZSBgbGlzdGVuZXJgLlxuICAgICAgICpcbiAgICAgICAqICAgIC0gYHN0cmluZ2A6IEV2YWx1YXRlZCBhcyB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufVxuICAgICAgICogICAgLSBgZnVuY3Rpb24oc2NvcGUpYDogY2FsbGVkIHdpdGggY3VycmVudCBgc2NvcGVgIGFzIGEgcGFyYW1ldGVyLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXdWYWwsIG9sZFZhbCwgc2NvcGUpfSBsaXN0ZW5lciBDYWxsYmFjayBjYWxsZWQgd2hlbmV2ZXIgdGhlIHZhbHVlXG4gICAgICAgKiAgICBvZiBgd2F0Y2hFeHByZXNzaW9uYCBjaGFuZ2VzLlxuICAgICAgICpcbiAgICAgICAqICAgIC0gYG5ld1ZhbGAgY29udGFpbnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25gXG4gICAgICAgKiAgICAtIGBvbGRWYWxgIGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbmBcbiAgICAgICAqICAgIC0gYHNjb3BlYCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtvYmplY3RFcXVhbGl0eT1mYWxzZV0gQ29tcGFyZSBmb3Igb2JqZWN0IGVxdWFsaXR5IHVzaW5nIHtAbGluayBhbmd1bGFyLmVxdWFsc30gaW5zdGVhZCBvZlxuICAgICAgICogICAgIGNvbXBhcmluZyBmb3IgcmVmZXJlbmNlIGVxdWFsaXR5LlxuICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyBsaXN0ZW5lci5cbiAgICAgICAqL1xuICAgICAgJHdhdGNoOiBmdW5jdGlvbih3YXRjaEV4cCwgbGlzdGVuZXIsIG9iamVjdEVxdWFsaXR5LCBwcmV0dHlQcmludEV4cHJlc3Npb24pIHtcbiAgICAgICAgdmFyIGdldCA9ICRwYXJzZSh3YXRjaEV4cCk7XG5cbiAgICAgICAgaWYgKGdldC4kJHdhdGNoRGVsZWdhdGUpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0LiQkd2F0Y2hEZWxlZ2F0ZSh0aGlzLCBsaXN0ZW5lciwgb2JqZWN0RXF1YWxpdHksIGdldCwgd2F0Y2hFeHApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY29wZSA9IHRoaXMsXG4gICAgICAgICAgICBhcnJheSA9IHNjb3BlLiQkd2F0Y2hlcnMsXG4gICAgICAgICAgICB3YXRjaGVyID0ge1xuICAgICAgICAgICAgICBmbjogbGlzdGVuZXIsXG4gICAgICAgICAgICAgIGxhc3Q6IGluaXRXYXRjaFZhbCxcbiAgICAgICAgICAgICAgZ2V0OiBnZXQsXG4gICAgICAgICAgICAgIGV4cDogcHJldHR5UHJpbnRFeHByZXNzaW9uIHx8IHdhdGNoRXhwLFxuICAgICAgICAgICAgICBlcTogISFvYmplY3RFcXVhbGl0eVxuICAgICAgICAgICAgfTtcblxuICAgICAgICBsYXN0RGlydHlXYXRjaCA9IG51bGw7XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSkge1xuICAgICAgICAgIHdhdGNoZXIuZm4gPSBub29wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcnJheSkge1xuICAgICAgICAgIGFycmF5ID0gc2NvcGUuJCR3YXRjaGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlIHVzZSB1bnNoaWZ0IHNpbmNlIHdlIHVzZSBhIHdoaWxlIGxvb3AgaW4gJGRpZ2VzdCBmb3Igc3BlZWQuXG4gICAgICAgIC8vIHRoZSB3aGlsZSBsb29wIHJlYWRzIGluIHJldmVyc2Ugb3JkZXIuXG4gICAgICAgIGFycmF5LnVuc2hpZnQod2F0Y2hlcik7XG4gICAgICAgIGluY3JlbWVudFdhdGNoZXJzQ291bnQodGhpcywgMSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRlcmVnaXN0ZXJXYXRjaCgpIHtcbiAgICAgICAgICBpZiAoYXJyYXlSZW1vdmUoYXJyYXksIHdhdGNoZXIpID49IDApIHtcbiAgICAgICAgICAgIGluY3JlbWVudFdhdGNoZXJzQ291bnQoc2NvcGUsIC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyR3YXRjaEdyb3VwXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogQSB2YXJpYW50IG9mIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCAkd2F0Y2goKX0gd2hlcmUgaXQgd2F0Y2hlcyBhbiBhcnJheSBvZiBgd2F0Y2hFeHByZXNzaW9uc2AuXG4gICAgICAgKiBJZiBhbnkgb25lIGV4cHJlc3Npb24gaW4gdGhlIGNvbGxlY3Rpb24gY2hhbmdlcyB0aGUgYGxpc3RlbmVyYCBpcyBleGVjdXRlZC5cbiAgICAgICAqXG4gICAgICAgKiAtIFRoZSBpdGVtcyBpbiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgIGFycmF5IGFyZSBvYnNlcnZlZCB2aWEgdGhlIHN0YW5kYXJkIGAkd2F0Y2hgIG9wZXJhdGlvbi4gVGhlaXIgcmV0dXJuXG4gICAgICAgKiAgIHZhbHVlcyBhcmUgZXhhbWluZWQgZm9yIGNoYW5nZXMgb24gZXZlcnkgY2FsbCB0byBgJGRpZ2VzdGAuXG4gICAgICAgKiAtIFRoZSBgbGlzdGVuZXJgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgZXhwcmVzc2lvbiBpbiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgIGFycmF5IGNoYW5nZXMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nfEZ1bmN0aW9uKHNjb3BlKT59IHdhdGNoRXhwcmVzc2lvbnMgQXJyYXkgb2YgZXhwcmVzc2lvbnMgdGhhdCB3aWxsIGJlIGluZGl2aWR1YWxseVxuICAgICAgICogd2F0Y2hlZCB1c2luZyB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggJHdhdGNoKCl9XG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXdWYWx1ZXMsIG9sZFZhbHVlcywgc2NvcGUpfSBsaXN0ZW5lciBDYWxsYmFjayBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJldHVybiB2YWx1ZSBvZiBhbnlcbiAgICAgICAqICAgIGV4cHJlc3Npb24gaW4gYHdhdGNoRXhwcmVzc2lvbnNgIGNoYW5nZXNcbiAgICAgICAqICAgIFRoZSBgbmV3VmFsdWVzYCBhcnJheSBjb250YWlucyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGB3YXRjaEV4cHJlc3Npb25zYCwgd2l0aCB0aGUgaW5kZXhlcyBtYXRjaGluZ1xuICAgICAgICogICAgdGhvc2Ugb2YgYHdhdGNoRXhwcmVzc2lvbmBcbiAgICAgICAqICAgIGFuZCB0aGUgYG9sZFZhbHVlc2AgYXJyYXkgY29udGFpbnMgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiB0aGUgYHdhdGNoRXhwcmVzc2lvbnNgLCB3aXRoIHRoZSBpbmRleGVzIG1hdGNoaW5nXG4gICAgICAgKiAgICB0aG9zZSBvZiBgd2F0Y2hFeHByZXNzaW9uYFxuICAgICAgICogICAgVGhlIGBzY29wZWAgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHNjb3BlLlxuICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIGFsbCBsaXN0ZW5lcnMuXG4gICAgICAgKi9cbiAgICAgICR3YXRjaEdyb3VwOiBmdW5jdGlvbih3YXRjaEV4cHJlc3Npb25zLCBsaXN0ZW5lcikge1xuICAgICAgICB2YXIgb2xkVmFsdWVzID0gbmV3IEFycmF5KHdhdGNoRXhwcmVzc2lvbnMubGVuZ3RoKTtcbiAgICAgICAgdmFyIG5ld1ZhbHVlcyA9IG5ldyBBcnJheSh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCk7XG4gICAgICAgIHZhciBkZXJlZ2lzdGVyRm5zID0gW107XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBmaXJzdFJ1biA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCkge1xuICAgICAgICAgIC8vIE5vIGV4cHJlc3Npb25zIG1lYW5zIHdlIGNhbGwgdGhlIGxpc3RlbmVyIEFTQVBcbiAgICAgICAgICB2YXIgc2hvdWxkQ2FsbCA9IHRydWU7XG4gICAgICAgICAgc2VsZi4kZXZhbEFzeW5jKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHNob3VsZENhbGwpIGxpc3RlbmVyKG5ld1ZhbHVlcywgbmV3VmFsdWVzLCBzZWxmKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoR3JvdXAoKSB7XG4gICAgICAgICAgICBzaG91bGRDYWxsID0gZmFsc2U7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3YXRjaEV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBzaXplIG9mIG9uZVxuICAgICAgICAgIHJldHVybiB0aGlzLiR3YXRjaCh3YXRjaEV4cHJlc3Npb25zWzBdLCBmdW5jdGlvbiB3YXRjaEdyb3VwQWN0aW9uKHZhbHVlLCBvbGRWYWx1ZSwgc2NvcGUpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlc1swXSA9IHZhbHVlO1xuICAgICAgICAgICAgb2xkVmFsdWVzWzBdID0gb2xkVmFsdWU7XG4gICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZXMsICh2YWx1ZSA9PT0gb2xkVmFsdWUpID8gbmV3VmFsdWVzIDogb2xkVmFsdWVzLCBzY29wZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKHdhdGNoRXhwcmVzc2lvbnMsIGZ1bmN0aW9uKGV4cHIsIGkpIHtcbiAgICAgICAgICB2YXIgdW53YXRjaEZuID0gc2VsZi4kd2F0Y2goZXhwciwgZnVuY3Rpb24gd2F0Y2hHcm91cFN1YkFjdGlvbih2YWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlc1tpXSA9IHZhbHVlO1xuICAgICAgICAgICAgb2xkVmFsdWVzW2ldID0gb2xkVmFsdWU7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkKSB7XG4gICAgICAgICAgICAgIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc2VsZi4kZXZhbEFzeW5jKHdhdGNoR3JvdXBBY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRlcmVnaXN0ZXJGbnMucHVzaCh1bndhdGNoRm4pO1xuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiB3YXRjaEdyb3VwQWN0aW9uKCkge1xuICAgICAgICAgIGNoYW5nZVJlYWN0aW9uU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAoZmlyc3RSdW4pIHtcbiAgICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7XG4gICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZXMsIG5ld1ZhbHVlcywgc2VsZik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlcywgb2xkVmFsdWVzLCBzZWxmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVyZWdpc3RlcldhdGNoR3JvdXAoKSB7XG4gICAgICAgICAgd2hpbGUgKGRlcmVnaXN0ZXJGbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZXJlZ2lzdGVyRm5zLnNoaWZ0KCkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkd2F0Y2hDb2xsZWN0aW9uXG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogU2hhbGxvdyB3YXRjaGVzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmQgZmlyZXMgd2hlbmV2ZXIgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGNoYW5nZVxuICAgICAgICogKGZvciBhcnJheXMsIHRoaXMgaW1wbGllcyB3YXRjaGluZyB0aGUgYXJyYXkgaXRlbXM7IGZvciBvYmplY3QgbWFwcywgdGhpcyBpbXBsaWVzIHdhdGNoaW5nXG4gICAgICAgKiB0aGUgcHJvcGVydGllcykuIElmIGEgY2hhbmdlIGlzIGRldGVjdGVkLCB0aGUgYGxpc3RlbmVyYCBjYWxsYmFjayBpcyBmaXJlZC5cbiAgICAgICAqXG4gICAgICAgKiAtIFRoZSBgb2JqYCBjb2xsZWN0aW9uIGlzIG9ic2VydmVkIHZpYSBzdGFuZGFyZCAkd2F0Y2ggb3BlcmF0aW9uIGFuZCBpcyBleGFtaW5lZCBvbiBldmVyeVxuICAgICAgICogICBjYWxsIHRvICRkaWdlc3QoKSB0byBzZWUgaWYgYW55IGl0ZW1zIGhhdmUgYmVlbiBhZGRlZCwgcmVtb3ZlZCwgb3IgbW92ZWQuXG4gICAgICAgKiAtIFRoZSBgbGlzdGVuZXJgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnl0aGluZyB3aXRoaW4gdGhlIGBvYmpgIGhhcyBjaGFuZ2VkLiBFeGFtcGxlcyBpbmNsdWRlXG4gICAgICAgKiAgIGFkZGluZywgcmVtb3ZpbmcsIGFuZCBtb3ZpbmcgaXRlbXMgYmVsb25naW5nIHRvIGFuIG9iamVjdCBvciBhcnJheS5cbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogIyBFeGFtcGxlXG4gICAgICAgKiBgYGBqc1xuICAgICAgICAgICRzY29wZS5uYW1lcyA9IFsnaWdvcicsICdtYXRpYXMnLCAnbWlza28nLCAnamFtZXMnXTtcbiAgICAgICAgICAkc2NvcGUuZGF0YUNvdW50ID0gNDtcblxuICAgICAgICAgICRzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCduYW1lcycsIGZ1bmN0aW9uKG5ld05hbWVzLCBvbGROYW1lcykge1xuICAgICAgICAgICAgJHNjb3BlLmRhdGFDb3VudCA9IG5ld05hbWVzLmxlbmd0aDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGV4cGVjdCgkc2NvcGUuZGF0YUNvdW50KS50b0VxdWFsKDQpO1xuICAgICAgICAgICRzY29wZS4kZGlnZXN0KCk7XG5cbiAgICAgICAgICAvL3N0aWxsIGF0IDQgLi4uIG5vIGNoYW5nZXNcbiAgICAgICAgICBleHBlY3QoJHNjb3BlLmRhdGFDb3VudCkudG9FcXVhbCg0KTtcblxuICAgICAgICAgICRzY29wZS5uYW1lcy5wb3AoKTtcbiAgICAgICAgICAkc2NvcGUuJGRpZ2VzdCgpO1xuXG4gICAgICAgICAgLy9ub3cgdGhlcmUncyBiZWVuIGEgY2hhbmdlXG4gICAgICAgICAgZXhwZWN0KCRzY29wZS5kYXRhQ291bnQpLnRvRXF1YWwoMyk7XG4gICAgICAgKiBgYGBcbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oc2NvcGUpfSBvYmogRXZhbHVhdGVkIGFzIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LiBUaGVcbiAgICAgICAqICAgIGV4cHJlc3Npb24gdmFsdWUgc2hvdWxkIGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvciBhbiBhcnJheSB3aGljaCBpcyBvYnNlcnZlZCBvbiBlYWNoXG4gICAgICAgKiAgICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0ICRkaWdlc3R9IGN5Y2xlLiBBbnkgc2hhbGxvdyBjaGFuZ2Ugd2l0aGluIHRoZVxuICAgICAgICogICAgY29sbGVjdGlvbiB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIHRoZSBgbGlzdGVuZXJgLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3Q29sbGVjdGlvbiwgb2xkQ29sbGVjdGlvbiwgc2NvcGUpfSBsaXN0ZW5lciBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZFxuICAgICAgICogICAgd2hlbiBhIGNoYW5nZSBpcyBkZXRlY3RlZC5cbiAgICAgICAqICAgIC0gVGhlIGBuZXdDb2xsZWN0aW9uYCBvYmplY3QgaXMgdGhlIG5ld2x5IG1vZGlmaWVkIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgYG9iamAgZXhwcmVzc2lvblxuICAgICAgICogICAgLSBUaGUgYG9sZENvbGxlY3Rpb25gIG9iamVjdCBpcyBhIGNvcHkgb2YgdGhlIGZvcm1lciBjb2xsZWN0aW9uIGRhdGEuXG4gICAgICAgKiAgICAgIER1ZSB0byBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucywgdGhlYG9sZENvbGxlY3Rpb25gIHZhbHVlIGlzIGNvbXB1dGVkIG9ubHkgaWYgdGhlXG4gICAgICAgKiAgICAgIGBsaXN0ZW5lcmAgZnVuY3Rpb24gZGVjbGFyZXMgdHdvIG9yIG1vcmUgYXJndW1lbnRzLlxuICAgICAgICogICAgLSBUaGUgYHNjb3BlYCBhcmd1bWVudCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgc2NvcGUuXG4gICAgICAgKlxuICAgICAgICogQHJldHVybnMge2Z1bmN0aW9uKCl9IFJldHVybnMgYSBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgbGlzdGVuZXIuIFdoZW4gdGhlXG4gICAgICAgKiAgICBkZS1yZWdpc3RyYXRpb24gZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHRoZSBpbnRlcm5hbCB3YXRjaCBvcGVyYXRpb24gaXMgdGVybWluYXRlZC5cbiAgICAgICAqL1xuICAgICAgJHdhdGNoQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqLCBsaXN0ZW5lcikge1xuICAgICAgICAkd2F0Y2hDb2xsZWN0aW9uSW50ZXJjZXB0b3IuJHN0YXRlZnVsID0gdHJ1ZTtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIHRoZSBjdXJyZW50IHZhbHVlLCB1cGRhdGVkIG9uIGVhY2ggZGlydHktY2hlY2sgcnVuXG4gICAgICAgIHZhciBuZXdWYWx1ZTtcbiAgICAgICAgLy8gYSBzaGFsbG93IGNvcHkgb2YgdGhlIG5ld1ZhbHVlIGZyb20gdGhlIGxhc3QgZGlydHktY2hlY2sgcnVuLFxuICAgICAgICAvLyB1cGRhdGVkIHRvIG1hdGNoIG5ld1ZhbHVlIGR1cmluZyBkaXJ0eS1jaGVjayBydW5cbiAgICAgICAgdmFyIG9sZFZhbHVlO1xuICAgICAgICAvLyBhIHNoYWxsb3cgY29weSBvZiB0aGUgbmV3VmFsdWUgZnJvbSB3aGVuIHRoZSBsYXN0IGNoYW5nZSBoYXBwZW5lZFxuICAgICAgICB2YXIgdmVyeU9sZFZhbHVlO1xuICAgICAgICAvLyBvbmx5IHRyYWNrIHZlcnlPbGRWYWx1ZSBpZiB0aGUgbGlzdGVuZXIgaXMgYXNraW5nIGZvciBpdFxuICAgICAgICB2YXIgdHJhY2tWZXJ5T2xkVmFsdWUgPSAobGlzdGVuZXIubGVuZ3RoID4gMSk7XG4gICAgICAgIHZhciBjaGFuZ2VEZXRlY3RlZCA9IDA7XG4gICAgICAgIHZhciBjaGFuZ2VEZXRlY3RvciA9ICRwYXJzZShvYmosICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvcik7XG4gICAgICAgIHZhciBpbnRlcm5hbEFycmF5ID0gW107XG4gICAgICAgIHZhciBpbnRlcm5hbE9iamVjdCA9IHt9O1xuICAgICAgICB2YXIgaW5pdFJ1biA9IHRydWU7XG4gICAgICAgIHZhciBvbGRMZW5ndGggPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uICR3YXRjaENvbGxlY3Rpb25JbnRlcmNlcHRvcihfdmFsdWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgICB2YXIgbmV3TGVuZ3RoLCBrZXksIGJvdGhOYU4sIG5ld0l0ZW0sIG9sZEl0ZW07XG5cbiAgICAgICAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIHVuZGVmaW5lZCwgdGhlbiByZXR1cm4gdW5kZWZpbmVkIGFzIHRoZSB3YXRjaCBtYXkgYmUgYSBvbmUtdGltZSB3YXRjaFxuICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChuZXdWYWx1ZSkpIHJldHVybjtcblxuICAgICAgICAgIGlmICghaXNPYmplY3QobmV3VmFsdWUpKSB7IC8vIGlmIHByaW1pdGl2ZVxuICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICBvbGRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUxpa2UobmV3VmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IGludGVybmFsQXJyYXkpIHtcbiAgICAgICAgICAgICAgLy8gd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBhbiBhcnJheSBpbnRvIGFycmF5LlxuICAgICAgICAgICAgICBvbGRWYWx1ZSA9IGludGVybmFsQXJyYXk7XG4gICAgICAgICAgICAgIG9sZExlbmd0aCA9IG9sZFZhbHVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5ld0xlbmd0aCA9IG5ld1ZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKG9sZExlbmd0aCAhPT0gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIGlmIGxlbmd0aHMgZG8gbm90IG1hdGNoIHdlIG5lZWQgdG8gdHJpZ2dlciBjaGFuZ2Ugbm90aWZpY2F0aW9uXG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICAgIG9sZFZhbHVlLmxlbmd0aCA9IG9sZExlbmd0aCA9IG5ld0xlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvcHkgdGhlIGl0ZW1zIHRvIG9sZFZhbHVlIGFuZCBsb29rIGZvciBjaGFuZ2VzLlxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBvbGRJdGVtID0gb2xkVmFsdWVbaV07XG4gICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXdWYWx1ZVtpXTtcblxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICAgICAgICAgIGJvdGhOYU4gPSAob2xkSXRlbSAhPT0gb2xkSXRlbSkgJiYgKG5ld0l0ZW0gIT09IG5ld0l0ZW0pO1xuICAgICAgICAgICAgICBpZiAoIWJvdGhOYU4gJiYgKG9sZEl0ZW0gIT09IG5ld0l0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQrKztcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZVtpXSA9IG5ld0l0ZW07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBpbnRlcm5hbE9iamVjdCkge1xuICAgICAgICAgICAgICAvLyB3ZSBhcmUgdHJhbnNpdGlvbmluZyBmcm9tIHNvbWV0aGluZyB3aGljaCB3YXMgbm90IGFuIG9iamVjdCBpbnRvIG9iamVjdC5cbiAgICAgICAgICAgICAgb2xkVmFsdWUgPSBpbnRlcm5hbE9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICBvbGRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29weSB0aGUgaXRlbXMgdG8gb2xkVmFsdWUgYW5kIGxvb2sgZm9yIGNoYW5nZXMuXG4gICAgICAgICAgICBuZXdMZW5ndGggPSAwO1xuICAgICAgICAgICAgZm9yIChrZXkgaW4gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwobmV3VmFsdWUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBuZXdMZW5ndGgrKztcbiAgICAgICAgICAgICAgICBuZXdJdGVtID0gbmV3VmFsdWVba2V5XTtcbiAgICAgICAgICAgICAgICBvbGRJdGVtID0gb2xkVmFsdWVba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gb2xkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAgICAgICAgICAgIGJvdGhOYU4gPSAob2xkSXRlbSAhPT0gb2xkSXRlbSkgJiYgKG5ld0l0ZW0gIT09IG5ld0l0ZW0pO1xuICAgICAgICAgICAgICAgICAgaWYgKCFib3RoTmFOICYmIChvbGRJdGVtICE9PSBuZXdJdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCsrO1xuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZVtrZXldID0gbmV3SXRlbTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb2xkTGVuZ3RoKys7XG4gICAgICAgICAgICAgICAgICBvbGRWYWx1ZVtrZXldID0gbmV3SXRlbTtcbiAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2xkTGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIHdlIHVzZWQgdG8gaGF2ZSBtb3JlIGtleXMsIG5lZWQgdG8gZmluZCB0aGVtIGFuZCBkZXN0cm95IHRoZW0uXG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGVkKys7XG4gICAgICAgICAgICAgIGZvciAoa2V5IGluIG9sZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld1ZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICBvbGRMZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvbGRWYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hhbmdlRGV0ZWN0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiAkd2F0Y2hDb2xsZWN0aW9uQWN0aW9uKCkge1xuICAgICAgICAgIGlmIChpbml0UnVuKSB7XG4gICAgICAgICAgICBpbml0UnVuID0gZmFsc2U7XG4gICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSwgbmV3VmFsdWUsIHNlbGYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSwgdmVyeU9sZFZhbHVlLCBzZWxmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBtYWtlIGEgY29weSBmb3IgdGhlIG5leHQgdGltZSBhIGNvbGxlY3Rpb24gaXMgY2hhbmdlZFxuICAgICAgICAgIGlmICh0cmFja1ZlcnlPbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFpc09iamVjdChuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy9wcmltaXRpdmVcbiAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlMaWtlKG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWUgPSBuZXcgQXJyYXkobmV3VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZlcnlPbGRWYWx1ZVtpXSA9IG5ld1ZhbHVlW2ldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBpZiBvYmplY3RcbiAgICAgICAgICAgICAgdmVyeU9sZFZhbHVlID0ge307XG4gICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld1ZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ5T2xkVmFsdWVba2V5XSA9IG5ld1ZhbHVlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuJHdhdGNoKGNoYW5nZURldGVjdG9yLCAkd2F0Y2hDb2xsZWN0aW9uQWN0aW9uKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZGlnZXN0XG4gICAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAgICpcbiAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICogUHJvY2Vzc2VzIGFsbCBvZiB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJHdhdGNoIHdhdGNoZXJzfSBvZiB0aGUgY3VycmVudCBzY29wZSBhbmRcbiAgICAgICAqIGl0cyBjaGlsZHJlbi4gQmVjYXVzZSBhIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaGVyfSdzIGxpc3RlbmVyIGNhbiBjaGFuZ2VcbiAgICAgICAqIHRoZSBtb2RlbCwgdGhlIGAkZGlnZXN0KClgIGtlZXBzIGNhbGxpbmcgdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCB3YXRjaGVyc31cbiAgICAgICAqIHVudGlsIG5vIG1vcmUgbGlzdGVuZXJzIGFyZSBmaXJpbmcuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgaW50byBhbiBpbmZpbml0ZVxuICAgICAgICogbG9vcC4gVGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGAnTWF4aW11bSBpdGVyYXRpb24gbGltaXQgZXhjZWVkZWQuJ2AgaWYgdGhlIG51bWJlciBvZlxuICAgICAgICogaXRlcmF0aW9ucyBleGNlZWRzIDEwLlxuICAgICAgICpcbiAgICAgICAqIFVzdWFsbHksIHlvdSBkb24ndCBjYWxsIGAkZGlnZXN0KClgIGRpcmVjdGx5IGluXG4gICAgICAgKiB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ29udHJvbGxlciBjb250cm9sbGVyc30gb3IgaW5cbiAgICAgICAqIHtAbGluayBuZy4kY29tcGlsZVByb3ZpZGVyI2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS5cbiAgICAgICAqIEluc3RlYWQsIHlvdSBzaG91bGQgY2FsbCB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkYXBwbHkgJGFwcGx5KCl9ICh0eXBpY2FsbHkgZnJvbSB3aXRoaW5cbiAgICAgICAqIGEge0BsaW5rIG5nLiRjb21waWxlUHJvdmlkZXIjZGlyZWN0aXZlIGRpcmVjdGl2ZX0pLCB3aGljaCB3aWxsIGZvcmNlIGEgYCRkaWdlc3QoKWAuXG4gICAgICAgKlxuICAgICAgICogSWYgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgYCRkaWdlc3QoKWAgaXMgY2FsbGVkLFxuICAgICAgICogeW91IGNhbiByZWdpc3RlciBhIGB3YXRjaEV4cHJlc3Npb25gIGZ1bmN0aW9uIHdpdGhcbiAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyR3YXRjaCAkd2F0Y2goKX0gd2l0aCBubyBgbGlzdGVuZXJgLlxuICAgICAgICpcbiAgICAgICAqIEluIHVuaXQgdGVzdHMsIHlvdSBtYXkgbmVlZCB0byBjYWxsIGAkZGlnZXN0KClgIHRvIHNpbXVsYXRlIHRoZSBzY29wZSBsaWZlIGN5Y2xlLlxuICAgICAgICpcbiAgICAgICAqICMgRXhhbXBsZVxuICAgICAgICogYGBganNcbiAgICAgICAgICAgdmFyIHNjb3BlID0gLi4uO1xuICAgICAgICAgICBzY29wZS5uYW1lID0gJ21pc2tvJztcbiAgICAgICAgICAgc2NvcGUuY291bnRlciA9IDA7XG5cbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMCk7XG4gICAgICAgICAgIHNjb3BlLiR3YXRjaCgnbmFtZScsIGZ1bmN0aW9uKG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgICAgICAgIHNjb3BlLmNvdW50ZXIgPSBzY29wZS5jb3VudGVyICsgMTtcbiAgICAgICAgICAgfSk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS5jb3VudGVyKS50b0VxdWFsKDApO1xuXG4gICAgICAgICAgIHNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgICAgLy8gdGhlIGxpc3RlbmVyIGlzIGFsd2F5cyBjYWxsZWQgZHVyaW5nIHRoZSBmaXJzdCAkZGlnZXN0IGxvb3AgYWZ0ZXIgaXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7XG5cbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICAvLyBidXQgbm93IGl0IHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIHZhbHVlIGNoYW5nZXNcbiAgICAgICAgICAgZXhwZWN0KHNjb3BlLmNvdW50ZXIpLnRvRXF1YWwoMSk7XG5cbiAgICAgICAgICAgc2NvcGUubmFtZSA9ICdhZGFtJztcbiAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgICBleHBlY3Qoc2NvcGUuY291bnRlcikudG9FcXVhbCgyKTtcbiAgICAgICAqIGBgYFxuICAgICAgICpcbiAgICAgICAqL1xuICAgICAgJGRpZ2VzdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB3YXRjaCwgdmFsdWUsIGxhc3QsIGZuLCBnZXQsXG4gICAgICAgICAgICB3YXRjaGVycyxcbiAgICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgICAgIGRpcnR5LCB0dGwgPSBUVEwsXG4gICAgICAgICAgICBuZXh0LCBjdXJyZW50LCB0YXJnZXQgPSB0aGlzLFxuICAgICAgICAgICAgd2F0Y2hMb2cgPSBbXSxcbiAgICAgICAgICAgIGxvZ0lkeCwgYXN5bmNUYXNrO1xuXG4gICAgICAgIGJlZ2luUGhhc2UoJyRkaWdlc3QnKTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMgdG8gYnJvd3NlciB1cmwgdGhhdCBoYXBwZW5lZCBpbiBzeW5jIGJlZm9yZSB0aGUgY2FsbCB0byAkZGlnZXN0XG4gICAgICAgICRicm93c2VyLiQkY2hlY2tVcmxDaGFuZ2UoKTtcblxuICAgICAgICBpZiAodGhpcyA9PT0gJHJvb3RTY29wZSAmJiBhcHBseUFzeW5jSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IHNjb3BlLCBhbmQgJGFwcGx5QXN5bmMgaGFzIHNjaGVkdWxlZCBhIGRlZmVycmVkICRhcHBseSgpLCB0aGVuXG4gICAgICAgICAgLy8gY2FuY2VsIHRoZSBzY2hlZHVsZWQgJGFwcGx5IGFuZCBmbHVzaCB0aGUgcXVldWUgb2YgZXhwcmVzc2lvbnMgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICAgICRicm93c2VyLmRlZmVyLmNhbmNlbChhcHBseUFzeW5jSWQpO1xuICAgICAgICAgIGZsdXNoQXBwbHlBc3luYygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdERpcnR5V2F0Y2ggPSBudWxsO1xuXG4gICAgICAgIGRvIHsgLy8gXCJ3aGlsZSBkaXJ0eVwiIGxvb3BcbiAgICAgICAgICBkaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgIGN1cnJlbnQgPSB0YXJnZXQ7XG5cbiAgICAgICAgICAvLyBJdCdzIHNhZmUgZm9yIGFzeW5jUXVldWVQb3NpdGlvbiB0byBiZSBhIGxvY2FsIHZhcmlhYmxlIGhlcmUgYmVjYXVzZSB0aGlzIGxvb3AgY2FuJ3RcbiAgICAgICAgICAvLyBiZSByZWVudGVyZWQgcmVjdXJzaXZlbHkuIENhbGxpbmcgJGRpZ2VzdCBmcm9tIGEgZnVuY3Rpb24gcGFzc2VkIHRvICRhcHBseUFzeW5jIHdvdWxkXG4gICAgICAgICAgLy8gbGVhZCB0byBhICckZGlnZXN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MnIGVycm9yLlxuICAgICAgICAgIGZvciAodmFyIGFzeW5jUXVldWVQb3NpdGlvbiA9IDA7IGFzeW5jUXVldWVQb3NpdGlvbiA8IGFzeW5jUXVldWUubGVuZ3RoOyBhc3luY1F1ZXVlUG9zaXRpb24rKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXN5bmNUYXNrID0gYXN5bmNRdWV1ZVthc3luY1F1ZXVlUG9zaXRpb25dO1xuICAgICAgICAgICAgICBhc3luY1Rhc2suc2NvcGUuJGV2YWwoYXN5bmNUYXNrLmV4cHJlc3Npb24sIGFzeW5jVGFzay5sb2NhbHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3REaXJ0eVdhdGNoID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXN5bmNRdWV1ZS5sZW5ndGggPSAwO1xuXG4gICAgICAgICAgdHJhdmVyc2VTY29wZXNMb29wOlxuICAgICAgICAgIGRvIHsgLy8gXCJ0cmF2ZXJzZSB0aGUgc2NvcGVzXCIgbG9vcFxuICAgICAgICAgICAgaWYgKCh3YXRjaGVycyA9IGN1cnJlbnQuJCR3YXRjaGVycykpIHtcbiAgICAgICAgICAgICAgLy8gcHJvY2VzcyBvdXIgd2F0Y2hlc1xuICAgICAgICAgICAgICBsZW5ndGggPSB3YXRjaGVycy5sZW5ndGg7XG4gICAgICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB3YXRjaCA9IHdhdGNoZXJzW2xlbmd0aF07XG4gICAgICAgICAgICAgICAgICAvLyBNb3N0IGNvbW1vbiB3YXRjaGVzIGFyZSBvbiBwcmltaXRpdmVzLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBzaG9ydFxuICAgICAgICAgICAgICAgICAgLy8gY2lyY3VpdCBpdCB3aXRoID09PSBvcGVyYXRvciwgb25seSB3aGVuID09PSBmYWlscyBkbyB3ZSB1c2UgLmVxdWFsc1xuICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldCA9IHdhdGNoLmdldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IGdldChjdXJyZW50KSkgIT09IChsYXN0ID0gd2F0Y2gubGFzdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICEod2F0Y2guZXFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVxdWFscyh2YWx1ZSwgbGFzdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpc051bWJlck5hTih2YWx1ZSkgJiYgaXNOdW1iZXJOYU4obGFzdCkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0RGlydHlXYXRjaCA9IHdhdGNoO1xuICAgICAgICAgICAgICAgICAgICAgIHdhdGNoLmxhc3QgPSB3YXRjaC5lcSA/IGNvcHkodmFsdWUsIG51bGwpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgZm4gPSB3YXRjaC5mbjtcbiAgICAgICAgICAgICAgICAgICAgICBmbih2YWx1ZSwgKChsYXN0ID09PSBpbml0V2F0Y2hWYWwpID8gdmFsdWUgOiBsYXN0KSwgY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHR0bCA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0lkeCA9IDQgLSB0dGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdhdGNoTG9nW2xvZ0lkeF0pIHdhdGNoTG9nW2xvZ0lkeF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoTG9nW2xvZ0lkeF0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZzogaXNGdW5jdGlvbih3YXRjaC5leHApID8gJ2ZuOiAnICsgKHdhdGNoLmV4cC5uYW1lIHx8IHdhdGNoLmV4cC50b1N0cmluZygpKSA6IHdhdGNoLmV4cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsOiBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2F0Y2ggPT09IGxhc3REaXJ0eVdhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1vc3QgcmVjZW50bHkgZGlydHkgd2F0Y2hlciBpcyBub3cgY2xlYW4sIHNob3J0IGNpcmN1aXQgc2luY2UgdGhlIHJlbWFpbmluZyB3YXRjaGVyc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIHRlc3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRyYXZlcnNlU2NvcGVzTG9vcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbnNhbml0eSBXYXJuaW5nOiBzY29wZSBkZXB0aC1maXJzdCB0cmF2ZXJzYWxcbiAgICAgICAgICAgIC8vIHllcywgdGhpcyBjb2RlIGlzIGEgYml0IGNyYXp5LCBidXQgaXQgd29ya3MgYW5kIHdlIGhhdmUgdGVzdHMgdG8gcHJvdmUgaXQhXG4gICAgICAgICAgICAvLyB0aGlzIHBpZWNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdHJhdmVyc2FsIGluICRicm9hZGNhc3RcbiAgICAgICAgICAgIGlmICghKG5leHQgPSAoKGN1cnJlbnQuJCR3YXRjaGVyc0NvdW50ICYmIGN1cnJlbnQuJCRjaGlsZEhlYWQpIHx8XG4gICAgICAgICAgICAgICAgKGN1cnJlbnQgIT09IHRhcmdldCAmJiBjdXJyZW50LiQkbmV4dFNpYmxpbmcpKSkpIHtcbiAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IHRhcmdldCAmJiAhKG5leHQgPSBjdXJyZW50LiQkbmV4dFNpYmxpbmcpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuJHBhcmVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gbmV4dCkpO1xuXG4gICAgICAgICAgLy8gYGJyZWFrIHRyYXZlcnNlU2NvcGVzTG9vcDtgIHRha2VzIHVzIHRvIGhlcmVcblxuICAgICAgICAgIGlmICgoZGlydHkgfHwgYXN5bmNRdWV1ZS5sZW5ndGgpICYmICEodHRsLS0pKSB7XG4gICAgICAgICAgICBjbGVhclBoYXNlKCk7XG4gICAgICAgICAgICB0aHJvdyAkcm9vdFNjb3BlTWluRXJyKCdpbmZkaWcnLFxuICAgICAgICAgICAgICAgICd7MH0gJGRpZ2VzdCgpIGl0ZXJhdGlvbnMgcmVhY2hlZC4gQWJvcnRpbmchXFxuJyArXG4gICAgICAgICAgICAgICAgJ1dhdGNoZXJzIGZpcmVkIGluIHRoZSBsYXN0IDUgaXRlcmF0aW9uczogezF9JyxcbiAgICAgICAgICAgICAgICBUVEwsIHdhdGNoTG9nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSB3aGlsZSAoZGlydHkgfHwgYXN5bmNRdWV1ZS5sZW5ndGgpO1xuXG4gICAgICAgIGNsZWFyUGhhc2UoKTtcblxuICAgICAgICAvLyBwb3N0RGlnZXN0UXVldWVQb3NpdGlvbiBpc24ndCBsb2NhbCBoZXJlIGJlY2F1c2UgdGhpcyBsb29wIGNhbiBiZSByZWVudGVyZWQgcmVjdXJzaXZlbHkuXG4gICAgICAgIHdoaWxlIChwb3N0RGlnZXN0UXVldWVQb3NpdGlvbiA8IHBvc3REaWdlc3RRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcG9zdERpZ2VzdFF1ZXVlW3Bvc3REaWdlc3RRdWV1ZVBvc2l0aW9uKytdKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBvc3REaWdlc3RRdWV1ZS5sZW5ndGggPSBwb3N0RGlnZXN0UXVldWVQb3NpdGlvbiA9IDA7XG4gICAgICB9LFxuXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIGV2ZW50XG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRkZXN0cm95XG4gICAgICAgKiBAZXZlbnRUeXBlIGJyb2FkY2FzdCBvbiBzY29wZSBiZWluZyBkZXN0cm95ZWRcbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIEJyb2FkY2FzdGVkIHdoZW4gYSBzY29wZSBhbmQgaXRzIGNoaWxkcmVuIGFyZSBiZWluZyBkZXN0cm95ZWQuXG4gICAgICAgKlxuICAgICAgICogTm90ZSB0aGF0LCBpbiBBbmd1bGFySlMsIHRoZXJlIGlzIGFsc28gYSBgJGRlc3Ryb3lgIGpRdWVyeSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG9cbiAgICAgICAqIGNsZWFuIHVwIERPTSBiaW5kaW5ncyBiZWZvcmUgYW4gZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICAgICAqL1xuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGRlc3Ryb3lcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IHNjb3BlIChhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbikgZnJvbSB0aGUgcGFyZW50IHNjb3BlLiBSZW1vdmFsIGltcGxpZXNcbiAgICAgICAqIHRoYXQgY2FsbHMgdG8ge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IHdpbGwgbm8gbG9uZ2VyXG4gICAgICAgKiBwcm9wYWdhdGUgdG8gdGhlIGN1cnJlbnQgc2NvcGUgYW5kIGl0cyBjaGlsZHJlbi4gUmVtb3ZhbCBhbHNvIGltcGxpZXMgdGhhdCB0aGUgY3VycmVudFxuICAgICAgICogc2NvcGUgaXMgZWxpZ2libGUgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgYCRkZXN0cm95KClgIGlzIHVzdWFsbHkgdXNlZCBieSBkaXJlY3RpdmVzIHN1Y2ggYXNcbiAgICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgbmdSZXBlYXR9IGZvciBtYW5hZ2luZyB0aGVcbiAgICAgICAqIHVucm9sbGluZyBvZiB0aGUgbG9vcC5cbiAgICAgICAqXG4gICAgICAgKiBKdXN0IGJlZm9yZSBhIHNjb3BlIGlzIGRlc3Ryb3llZCwgYSBgJGRlc3Ryb3lgIGV2ZW50IGlzIGJyb2FkY2FzdGVkIG9uIHRoaXMgc2NvcGUuXG4gICAgICAgKiBBcHBsaWNhdGlvbiBjb2RlIGNhbiByZWdpc3RlciBhIGAkZGVzdHJveWAgZXZlbnQgaGFuZGxlciB0aGF0IHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0b1xuICAgICAgICogcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuXG4gICAgICAgKlxuICAgICAgICogTm90ZSB0aGF0LCBpbiBBbmd1bGFySlMsIHRoZXJlIGlzIGFsc28gYSBgJGRlc3Ryb3lgIGpRdWVyeSBldmVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG9cbiAgICAgICAqIGNsZWFuIHVwIERPTSBiaW5kaW5ncyBiZWZvcmUgYW4gZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICAgICAqL1xuICAgICAgJGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBXZSBjYW4ndCBkZXN0cm95IGEgc2NvcGUgdGhhdCBoYXMgYmVlbiBhbHJlYWR5IGRlc3Ryb3llZC5cbiAgICAgICAgaWYgKHRoaXMuJCRkZXN0cm95ZWQpIHJldHVybjtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblxuICAgICAgICB0aGlzLiRicm9hZGNhc3QoJyRkZXN0cm95Jyk7XG4gICAgICAgIHRoaXMuJCRkZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzID09PSAkcm9vdFNjb3BlKSB7XG4gICAgICAgICAgLy9SZW1vdmUgaGFuZGxlcnMgYXR0YWNoZWQgdG8gd2luZG93IHdoZW4gJHJvb3RTY29wZSBpcyByZW1vdmVkXG4gICAgICAgICAgJGJyb3dzZXIuJCRhcHBsaWNhdGlvbkRlc3Ryb3llZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5jcmVtZW50V2F0Y2hlcnNDb3VudCh0aGlzLCAtdGhpcy4kJHdhdGNoZXJzQ291bnQpO1xuICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gdGhpcy4kJGxpc3RlbmVyQ291bnQpIHtcbiAgICAgICAgICBkZWNyZW1lbnRMaXN0ZW5lckNvdW50KHRoaXMsIHRoaXMuJCRsaXN0ZW5lckNvdW50W2V2ZW50TmFtZV0sIGV2ZW50TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXZlciBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gcGFyZW50IHNjb3BlcyAoYWZ0ZXIgdGhpcyBjbGVhbnVwLCB0aGUgY3VycmVudCBzY29wZSBzaG91bGRcbiAgICAgICAgLy8gbm90IGJlIHJldGFpbmVkIGJ5IGFueSBvZiBvdXIgcmVmZXJlbmNlcyBhbmQgc2hvdWxkIGJlIGVsaWdpYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24pXG4gICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LiQkY2hpbGRIZWFkID09PSB0aGlzKSBwYXJlbnQuJCRjaGlsZEhlYWQgPSB0aGlzLiQkbmV4dFNpYmxpbmc7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LiQkY2hpbGRUYWlsID09PSB0aGlzKSBwYXJlbnQuJCRjaGlsZFRhaWwgPSB0aGlzLiQkcHJldlNpYmxpbmc7XG4gICAgICAgIGlmICh0aGlzLiQkcHJldlNpYmxpbmcpIHRoaXMuJCRwcmV2U2libGluZy4kJG5leHRTaWJsaW5nID0gdGhpcy4kJG5leHRTaWJsaW5nO1xuICAgICAgICBpZiAodGhpcy4kJG5leHRTaWJsaW5nKSB0aGlzLiQkbmV4dFNpYmxpbmcuJCRwcmV2U2libGluZyA9IHRoaXMuJCRwcmV2U2libGluZztcblxuICAgICAgICAvLyBEaXNhYmxlIGxpc3RlbmVycywgd2F0Y2hlcnMgYW5kIGFwcGx5L2RpZ2VzdCBtZXRob2RzXG4gICAgICAgIHRoaXMuJGRlc3Ryb3kgPSB0aGlzLiRkaWdlc3QgPSB0aGlzLiRhcHBseSA9IHRoaXMuJGV2YWxBc3luYyA9IHRoaXMuJGFwcGx5QXN5bmMgPSBub29wO1xuICAgICAgICB0aGlzLiRvbiA9IHRoaXMuJHdhdGNoID0gdGhpcy4kd2F0Y2hHcm91cCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbm9vcDsgfTtcbiAgICAgICAgdGhpcy4kJGxpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIG5leHQgc2libGluZyB0byBwcmV2ZW50IGBjbGVhblVwU2NvcGVgIGRlc3Ryb3lpbmcgdGhvc2UgdG9vXG4gICAgICAgIHRoaXMuJCRuZXh0U2libGluZyA9IG51bGw7XG4gICAgICAgIGNsZWFuVXBTY29wZSh0aGlzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkZXZhbFxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIEV4ZWN1dGVzIHRoZSBgZXhwcmVzc2lvbmAgb24gdGhlIGN1cnJlbnQgc2NvcGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQW55IGV4Y2VwdGlvbnMgaW5cbiAgICAgICAqIHRoZSBleHByZXNzaW9uIGFyZSBwcm9wYWdhdGVkICh1bmNhdWdodCkuIFRoaXMgaXMgdXNlZnVsIHdoZW4gZXZhbHVhdGluZyBBbmd1bGFyXG4gICAgICAgKiBleHByZXNzaW9ucy5cbiAgICAgICAqXG4gICAgICAgKiAjIEV4YW1wbGVcbiAgICAgICAqIGBgYGpzXG4gICAgICAgICAgIHZhciBzY29wZSA9IG5nLiRyb290U2NvcGUuU2NvcGUoKTtcbiAgICAgICAgICAgc2NvcGUuYSA9IDE7XG4gICAgICAgICAgIHNjb3BlLmIgPSAyO1xuXG4gICAgICAgICAgIGV4cGVjdChzY29wZS4kZXZhbCgnYStiJykpLnRvRXF1YWwoMyk7XG4gICAgICAgICAgIGV4cGVjdChzY29wZS4kZXZhbChmdW5jdGlvbihzY29wZSl7IHJldHVybiBzY29wZS5hICsgc2NvcGUuYjsgfSkpLnRvRXF1YWwoMyk7XG4gICAgICAgKiBgYGBcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHByZXNzaW9uIEFuIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZC5cbiAgICAgICAqXG4gICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluICB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufS5cbiAgICAgICAqICAgIC0gYGZ1bmN0aW9uKHNjb3BlKWA6IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsob2JqZWN0KT19IGxvY2FscyBMb2NhbCB2YXJpYWJsZXMgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluIHNjb3BlLlxuICAgICAgICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgJGV2YWw6IGZ1bmN0aW9uKGV4cHIsIGxvY2Fscykge1xuICAgICAgICByZXR1cm4gJHBhcnNlKGV4cHIpKHRoaXMsIGxvY2Fscyk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGV2YWxBc3luY1xuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIEV4ZWN1dGVzIHRoZSBleHByZXNzaW9uIG9uIHRoZSBjdXJyZW50IHNjb3BlIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgYCRldmFsQXN5bmNgIG1ha2VzIG5vIGd1YXJhbnRlZXMgYXMgdG8gd2hlbiB0aGUgYGV4cHJlc3Npb25gIHdpbGwgYmUgZXhlY3V0ZWQsIG9ubHlcbiAgICAgICAqIHRoYXQ6XG4gICAgICAgKlxuICAgICAgICogICAtIGl0IHdpbGwgZXhlY3V0ZSBhZnRlciB0aGUgZnVuY3Rpb24gdGhhdCBzY2hlZHVsZWQgdGhlIGV2YWx1YXRpb24gKHByZWZlcmFibHkgYmVmb3JlIERPTVxuICAgICAgICogICAgIHJlbmRlcmluZykuXG4gICAgICAgKiAgIC0gYXQgbGVhc3Qgb25lIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgJGRpZ2VzdCBjeWNsZX0gd2lsbCBiZSBwZXJmb3JtZWQgYWZ0ZXJcbiAgICAgICAqICAgICBgZXhwcmVzc2lvbmAgZXhlY3V0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEFueSBleGNlcHRpb25zIGZyb20gdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBhcmUgZm9yd2FyZGVkIHRvIHRoZVxuICAgICAgICoge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLlxuICAgICAgICpcbiAgICAgICAqIF9fTm90ZTpfXyBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGEgYCRkaWdlc3RgIGN5Y2xlLCBhIG5ldyBgJGRpZ2VzdGAgY3ljbGVcbiAgICAgICAqIHdpbGwgYmUgc2NoZWR1bGVkLiBIb3dldmVyLCBpdCBpcyBlbmNvdXJhZ2VkIHRvIGFsd2F5cyBjYWxsIGNvZGUgdGhhdCBjaGFuZ2VzIHRoZSBtb2RlbFxuICAgICAgICogZnJvbSB3aXRoaW4gYW4gYCRhcHBseWAgY2FsbC4gVGhhdCBpbmNsdWRlcyBjb2RlIGV2YWx1YXRlZCB2aWEgYCRldmFsQXN5bmNgLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xmdW5jdGlvbigpKT19IGV4cHJlc3Npb24gQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICpcbiAgICAgICAqICAgIC0gYHN0cmluZ2A6IGV4ZWN1dGUgdXNpbmcgdGhlIHJ1bGVzIGFzIGRlZmluZWQgaW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uXG4gICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBjdXJyZW50IGBzY29wZWAgcGFyYW1ldGVyLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7KG9iamVjdCk9fSBsb2NhbHMgTG9jYWwgdmFyaWFibGVzIG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpbiBzY29wZS5cbiAgICAgICAqL1xuICAgICAgJGV2YWxBc3luYzogZnVuY3Rpb24oZXhwciwgbG9jYWxzKSB7XG4gICAgICAgIC8vIGlmIHdlIGFyZSBvdXRzaWRlIG9mIGFuICRkaWdlc3QgbG9vcCBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgc2NoZWR1bGluZyBhc3luY1xuICAgICAgICAvLyB0YXNrIGFsc28gc2NoZWR1bGUgYXN5bmMgYXV0by1mbHVzaFxuICAgICAgICBpZiAoISRyb290U2NvcGUuJCRwaGFzZSAmJiAhYXN5bmNRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAkYnJvd3Nlci5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChhc3luY1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jUXVldWUucHVzaCh7c2NvcGU6IHRoaXMsIGV4cHJlc3Npb246ICRwYXJzZShleHByKSwgbG9jYWxzOiBsb2NhbHN9KTtcbiAgICAgIH0sXG5cbiAgICAgICQkcG9zdERpZ2VzdDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgcG9zdERpZ2VzdFF1ZXVlLnB1c2goZm4pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAgKiBAbmFtZSAkcm9vdFNjb3BlLlNjb3BlIyRhcHBseVxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIGAkYXBwbHkoKWAgaXMgdXNlZCB0byBleGVjdXRlIGFuIGV4cHJlc3Npb24gaW4gYW5ndWxhciBmcm9tIG91dHNpZGUgb2YgdGhlIGFuZ3VsYXJcbiAgICAgICAqIGZyYW1ld29yay4gKEZvciBleGFtcGxlIGZyb20gYnJvd3NlciBET00gZXZlbnRzLCBzZXRUaW1lb3V0LCBYSFIgb3IgdGhpcmQgcGFydHkgbGlicmFyaWVzKS5cbiAgICAgICAqIEJlY2F1c2Ugd2UgYXJlIGNhbGxpbmcgaW50byB0aGUgYW5ndWxhciBmcmFtZXdvcmsgd2UgbmVlZCB0byBwZXJmb3JtIHByb3BlciBzY29wZSBsaWZlXG4gICAgICAgKiBjeWNsZSBvZiB7QGxpbmsgbmcuJGV4Y2VwdGlvbkhhbmRsZXIgZXhjZXB0aW9uIGhhbmRsaW5nfSxcbiAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRkaWdlc3QgZXhlY3V0aW5nIHdhdGNoZXN9LlxuICAgICAgICpcbiAgICAgICAqICMjIExpZmUgY3ljbGVcbiAgICAgICAqXG4gICAgICAgKiAjIFBzZXVkby1Db2RlIG9mIGAkYXBwbHkoKWBcbiAgICAgICAqIGBgYGpzXG4gICAgICAgICAgIGZ1bmN0aW9uICRhcHBseShleHByKSB7XG4gICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgIHJldHVybiAkZXZhbChleHByKTtcbiAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgJHJvb3QuJGRpZ2VzdCgpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuICAgICAgICogYGBgXG4gICAgICAgKlxuICAgICAgICpcbiAgICAgICAqIFNjb3BlJ3MgYCRhcHBseSgpYCBtZXRob2QgdHJhbnNpdGlvbnMgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHN0YWdlczpcbiAgICAgICAqXG4gICAgICAgKiAxLiBUaGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgZXhlY3V0ZWQgdXNpbmcgdGhlXG4gICAgICAgKiAgICB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZXZhbCAkZXZhbCgpfSBtZXRob2QuXG4gICAgICAgKiAyLiBBbnkgZXhjZXB0aW9ucyBmcm9tIHRoZSBleGVjdXRpb24gb2YgdGhlIGV4cHJlc3Npb24gYXJlIGZvcndhcmRlZCB0byB0aGVcbiAgICAgICAqICAgIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS5cbiAgICAgICAqIDMuIFRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkd2F0Y2ggd2F0Y2h9IGxpc3RlbmVycyBhcmUgZmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXG4gICAgICAgKiAgICBleHByZXNzaW9uIHdhcyBleGVjdXRlZCB1c2luZyB0aGUge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJGRpZ2VzdCAkZGlnZXN0KCl9IG1ldGhvZC5cbiAgICAgICAqXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsoc3RyaW5nfGZ1bmN0aW9uKCkpPX0gZXhwIEFuIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZC5cbiAgICAgICAqXG4gICAgICAgKiAgICAtIGBzdHJpbmdgOiBleGVjdXRlIHVzaW5nIHRoZSBydWxlcyBhcyBkZWZpbmVkIGluIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259LlxuICAgICAgICogICAgLSBgZnVuY3Rpb24oc2NvcGUpYDogZXhlY3V0ZSB0aGUgZnVuY3Rpb24gd2l0aCBjdXJyZW50IGBzY29wZWAgcGFyYW1ldGVyLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24uXG4gICAgICAgKi9cbiAgICAgICRhcHBseTogZnVuY3Rpb24oZXhwcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJlZ2luUGhhc2UoJyRhcHBseScpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4kZXZhbChleHByKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJQaGFzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAkcm9vdFNjb3BlLiRkaWdlc3QoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAkZXhjZXB0aW9uSGFuZGxlcihlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnNhZmUtZmluYWxseVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkYXBwbHlBc3luY1xuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIFNjaGVkdWxlIHRoZSBpbnZvY2F0aW9uIG9mICRhcHBseSB0byBvY2N1ciBhdCBhIGxhdGVyIHRpbWUuIFRoZSBhY3R1YWwgdGltZSBkaWZmZXJlbmNlXG4gICAgICAgKiB2YXJpZXMgYWNyb3NzIGJyb3dzZXJzLCBidXQgaXMgdHlwaWNhbGx5IGFyb3VuZCB+MTAgbWlsbGlzZWNvbmRzLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcXVldWUgdXAgbXVsdGlwbGUgZXhwcmVzc2lvbnMgd2hpY2ggbmVlZCB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIHNhbWVcbiAgICAgICAqIGRpZ2VzdC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0geyhzdHJpbmd8ZnVuY3Rpb24oKSk9fSBleHAgQW4gYW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICpcbiAgICAgICAqICAgIC0gYHN0cmluZ2A6IGV4ZWN1dGUgdXNpbmcgdGhlIHJ1bGVzIGFzIGRlZmluZWQgaW4ge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0uXG4gICAgICAgKiAgICAtIGBmdW5jdGlvbihzY29wZSlgOiBleGVjdXRlIHRoZSBmdW5jdGlvbiB3aXRoIGN1cnJlbnQgYHNjb3BlYCBwYXJhbWV0ZXIuXG4gICAgICAgKi9cbiAgICAgICRhcHBseUFzeW5jOiBmdW5jdGlvbihleHByKSB7XG4gICAgICAgIHZhciBzY29wZSA9IHRoaXM7XG4gICAgICAgIGlmIChleHByKSB7XG4gICAgICAgICAgYXBwbHlBc3luY1F1ZXVlLnB1c2goJGFwcGx5QXN5bmNFeHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBleHByID0gJHBhcnNlKGV4cHIpO1xuICAgICAgICBzY2hlZHVsZUFwcGx5QXN5bmMoKTtcblxuICAgICAgICBmdW5jdGlvbiAkYXBwbHlBc3luY0V4cHJlc3Npb24oKSB7XG4gICAgICAgICAgc2NvcGUuJGV2YWwoZXhwcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAgICogQG5hbWUgJHJvb3RTY29wZS5TY29wZSMkb25cbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBMaXN0ZW5zIG9uIGV2ZW50cyBvZiBhIGdpdmVuIHR5cGUuIFNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkZW1pdCAkZW1pdH0gZm9yXG4gICAgICAgKiBkaXNjdXNzaW9uIG9mIGV2ZW50IGxpZmUgY3ljbGUuXG4gICAgICAgKlxuICAgICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uIGZvcm1hdCBpczogYGZ1bmN0aW9uKGV2ZW50LCBhcmdzLi4uKWAuIFRoZSBgZXZlbnRgIG9iamVjdFxuICAgICAgICogcGFzc2VkIGludG8gdGhlIGxpc3RlbmVyIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gICAgICAgKlxuICAgICAgICogICAtIGB0YXJnZXRTY29wZWAgLSBge1Njb3BlfWA6IHRoZSBzY29wZSBvbiB3aGljaCB0aGUgZXZlbnQgd2FzIGAkZW1pdGAtZWQgb3JcbiAgICAgICAqICAgICBgJGJyb2FkY2FzdGAtZWQuXG4gICAgICAgKiAgIC0gYGN1cnJlbnRTY29wZWAgLSBge1Njb3BlfWA6IHRoZSBzY29wZSB0aGF0IGlzIGN1cnJlbnRseSBoYW5kbGluZyB0aGUgZXZlbnQuIE9uY2UgdGhlXG4gICAgICAgKiAgICAgZXZlbnQgcHJvcGFnYXRlcyB0aHJvdWdoIHRoZSBzY29wZSBoaWVyYXJjaHksIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIG51bGwuXG4gICAgICAgKiAgIC0gYG5hbWVgIC0gYHtzdHJpbmd9YDogbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiAgIC0gYHN0b3BQcm9wYWdhdGlvbmAgLSBge2Z1bmN0aW9uPX1gOiBjYWxsaW5nIGBzdG9wUHJvcGFnYXRpb25gIGZ1bmN0aW9uIHdpbGwgY2FuY2VsXG4gICAgICAgKiAgICAgZnVydGhlciBldmVudCBwcm9wYWdhdGlvbiAoYXZhaWxhYmxlIG9ubHkgZm9yIGV2ZW50cyB0aGF0IHdlcmUgYCRlbWl0YC1lZCkuXG4gICAgICAgKiAgIC0gYHByZXZlbnREZWZhdWx0YCAtIGB7ZnVuY3Rpb259YDogY2FsbGluZyBgcHJldmVudERlZmF1bHRgIHNldHMgYGRlZmF1bHRQcmV2ZW50ZWRgIGZsYWdcbiAgICAgICAqICAgICB0byB0cnVlLlxuICAgICAgICogICAtIGBkZWZhdWx0UHJldmVudGVkYCAtIGB7Ym9vbGVhbn1gOiB0cnVlIGlmIGBwcmV2ZW50RGVmYXVsdGAgd2FzIGNhbGxlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBFdmVudCBuYW1lIHRvIGxpc3RlbiBvbi5cbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQsIC4uLmFyZ3MpfSBsaXN0ZW5lciBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oKX0gUmV0dXJucyBhIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAgICovXG4gICAgICAkb246IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBuYW1lZExpc3RlbmVycyA9IHRoaXMuJCRsaXN0ZW5lcnNbbmFtZV07XG4gICAgICAgIGlmICghbmFtZWRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICB0aGlzLiQkbGlzdGVuZXJzW25hbWVdID0gbmFtZWRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdKSB7XG4gICAgICAgICAgICBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdKys7XG4gICAgICAgIH0gd2hpbGUgKChjdXJyZW50ID0gY3VycmVudC4kcGFyZW50KSk7XG5cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGluZGV4T2ZMaXN0ZW5lciA9IG5hbWVkTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgIGlmIChpbmRleE9mTGlzdGVuZXIgIT09IC0xKSB7XG4gICAgICAgICAgICBuYW1lZExpc3RlbmVyc1tpbmRleE9mTGlzdGVuZXJdID0gbnVsbDtcbiAgICAgICAgICAgIGRlY3JlbWVudExpc3RlbmVyQ291bnQoc2VsZiwgMSwgbmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcblxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGVtaXRcbiAgICAgICAqIEBraW5kIGZ1bmN0aW9uXG4gICAgICAgKlxuICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGBuYW1lYCB1cHdhcmRzIHRocm91Z2ggdGhlIHNjb3BlIGhpZXJhcmNoeSBub3RpZnlpbmcgdGhlXG4gICAgICAgKiByZWdpc3RlcmVkIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn0gbGlzdGVuZXJzLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBldmVudCBsaWZlIGN5Y2xlIHN0YXJ0cyBhdCB0aGUgc2NvcGUgb24gd2hpY2ggYCRlbWl0YCB3YXMgY2FsbGVkLiBBbGxcbiAgICAgICAqIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbiBsaXN0ZW5lcnN9IGxpc3RlbmluZyBmb3IgYG5hbWVgIGV2ZW50IG9uIHRoaXMgc2NvcGUgZ2V0XG4gICAgICAgKiBub3RpZmllZC4gQWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHRyYXZlcnNlcyB1cHdhcmRzIHRvd2FyZCB0aGUgcm9vdCBzY29wZSBhbmQgY2FsbHMgYWxsXG4gICAgICAgKiByZWdpc3RlcmVkIGxpc3RlbmVycyBhbG9uZyB0aGUgd2F5LiBUaGUgZXZlbnQgd2lsbCBzdG9wIHByb3BhZ2F0aW5nIGlmIG9uZSBvZiB0aGUgbGlzdGVuZXJzXG4gICAgICAgKiBjYW5jZWxzIGl0LlxuICAgICAgICpcbiAgICAgICAqIEFueSBleGNlcHRpb24gZW1pdHRlZCBmcm9tIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSB3aWxsIGJlIHBhc3NlZFxuICAgICAgICogb250byB0aGUge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gZW1pdC5cbiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBPcHRpb25hbCBvbmUgb3IgbW9yZSBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb250byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICogQHJldHVybiB7T2JqZWN0fSBFdmVudCBvYmplY3QgKHNlZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb259KS5cbiAgICAgICAqL1xuICAgICAgJGVtaXQ6IGZ1bmN0aW9uKG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIGVtcHR5ID0gW10sXG4gICAgICAgICAgICBuYW1lZExpc3RlbmVycyxcbiAgICAgICAgICAgIHNjb3BlID0gdGhpcyxcbiAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlLFxuICAgICAgICAgICAgZXZlbnQgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldFNjb3BlOiBzY29wZSxcbiAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtzdG9wUHJvcGFnYXRpb24gPSB0cnVlO30sXG4gICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaXN0ZW5lckFyZ3MgPSBjb25jYXQoW2V2ZW50XSwgYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgIGksIGxlbmd0aDtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgbmFtZWRMaXN0ZW5lcnMgPSBzY29wZS4kJGxpc3RlbmVyc1tuYW1lXSB8fCBlbXB0eTtcbiAgICAgICAgICBldmVudC5jdXJyZW50U2NvcGUgPSBzY29wZTtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBuYW1lZExpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAvLyBpZiBsaXN0ZW5lcnMgd2VyZSBkZXJlZ2lzdGVyZWQsIGRlZnJhZ21lbnQgdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAoIW5hbWVkTGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvL2FsbG93IGFsbCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgc2NvcGUgdG8gcnVuXG4gICAgICAgICAgICAgIG5hbWVkTGlzdGVuZXJzW2ldLmFwcGx5KG51bGwsIGxpc3RlbmVyQXJncyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvL2lmIGFueSBsaXN0ZW5lciBvbiB0aGUgY3VycmVudCBzY29wZSBzdG9wcyBwcm9wYWdhdGlvbiwgcHJldmVudCBidWJibGluZ1xuICAgICAgICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vdHJhdmVyc2UgdXB3YXJkc1xuICAgICAgICAgIHNjb3BlID0gc2NvcGUuJHBhcmVudDtcbiAgICAgICAgfSB3aGlsZSAoc2NvcGUpO1xuXG4gICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfSxcblxuXG4gICAgICAvKipcbiAgICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgICAqIEBuYW1lICRyb290U2NvcGUuU2NvcGUjJGJyb2FkY2FzdFxuICAgICAgICogQGtpbmQgZnVuY3Rpb25cbiAgICAgICAqXG4gICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYG5hbWVgIGRvd253YXJkcyB0byBhbGwgY2hpbGQgc2NvcGVzIChhbmQgdGhlaXIgY2hpbGRyZW4pIG5vdGlmeWluZyB0aGVcbiAgICAgICAqIHJlZ2lzdGVyZWQge0BsaW5rIG5nLiRyb290U2NvcGUuU2NvcGUjJG9ufSBsaXN0ZW5lcnMuXG4gICAgICAgKlxuICAgICAgICogVGhlIGV2ZW50IGxpZmUgY3ljbGUgc3RhcnRzIGF0IHRoZSBzY29wZSBvbiB3aGljaCBgJGJyb2FkY2FzdGAgd2FzIGNhbGxlZC4gQWxsXG4gICAgICAgKiB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSBsaXN0ZW5pbmcgZm9yIGBuYW1lYCBldmVudCBvbiB0aGlzIHNjb3BlIGdldFxuICAgICAgICogbm90aWZpZWQuIEFmdGVyd2FyZHMsIHRoZSBldmVudCBwcm9wYWdhdGVzIHRvIGFsbCBkaXJlY3QgYW5kIGluZGlyZWN0IHNjb3BlcyBvZiB0aGUgY3VycmVudFxuICAgICAgICogc2NvcGUgYW5kIGNhbGxzIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBhbG9uZyB0aGUgd2F5LiBUaGUgZXZlbnQgY2Fubm90IGJlIGNhbmNlbGVkLlxuICAgICAgICpcbiAgICAgICAqIEFueSBleGNlcHRpb24gZW1pdHRlZCBmcm9tIHRoZSB7QGxpbmsgbmcuJHJvb3RTY29wZS5TY29wZSMkb24gbGlzdGVuZXJzfSB3aWxsIGJlIHBhc3NlZFxuICAgICAgICogb250byB0aGUge0BsaW5rIG5nLiRleGNlcHRpb25IYW5kbGVyICRleGNlcHRpb25IYW5kbGVyfSBzZXJ2aWNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEV2ZW50IG5hbWUgdG8gYnJvYWRjYXN0LlxuICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIE9wdGlvbmFsIG9uZSBvciBtb3JlIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCBvbnRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEV2ZW50IG9iamVjdCwgc2VlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRvbn1cbiAgICAgICAqL1xuICAgICAgJGJyb2FkY2FzdDogZnVuY3Rpb24obmFtZSwgYXJncykge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcyxcbiAgICAgICAgICAgIGN1cnJlbnQgPSB0YXJnZXQsXG4gICAgICAgICAgICBuZXh0ID0gdGFyZ2V0LFxuICAgICAgICAgICAgZXZlbnQgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldFNjb3BlOiB0YXJnZXQsXG4gICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0YXJnZXQuJCRsaXN0ZW5lckNvdW50W25hbWVdKSByZXR1cm4gZXZlbnQ7XG5cbiAgICAgICAgdmFyIGxpc3RlbmVyQXJncyA9IGNvbmNhdChbZXZlbnRdLCBhcmd1bWVudHMsIDEpLFxuICAgICAgICAgICAgbGlzdGVuZXJzLCBpLCBsZW5ndGg7XG5cbiAgICAgICAgLy9kb3duIHdoaWxlIHlvdSBjYW4sIHRoZW4gdXAgYW5kIG5leHQgc2libGluZyBvciB1cCBhbmQgbmV4dCBzaWJsaW5nIHVudGlsIGJhY2sgYXQgcm9vdFxuICAgICAgICB3aGlsZSAoKGN1cnJlbnQgPSBuZXh0KSkge1xuICAgICAgICAgIGV2ZW50LmN1cnJlbnRTY29wZSA9IGN1cnJlbnQ7XG4gICAgICAgICAgbGlzdGVuZXJzID0gY3VycmVudC4kJGxpc3RlbmVyc1tuYW1lXSB8fCBbXTtcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGlmIGxpc3RlbmVycyB3ZXJlIGRlcmVnaXN0ZXJlZCwgZGVmcmFnbWVudCB0aGUgYXJyYXlcbiAgICAgICAgICAgIGlmICghbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgbGVuZ3RoLS07XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkobnVsbCwgbGlzdGVuZXJBcmdzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSW5zYW5pdHkgV2FybmluZzogc2NvcGUgZGVwdGgtZmlyc3QgdHJhdmVyc2FsXG4gICAgICAgICAgLy8geWVzLCB0aGlzIGNvZGUgaXMgYSBiaXQgY3JhenksIGJ1dCBpdCB3b3JrcyBhbmQgd2UgaGF2ZSB0ZXN0cyB0byBwcm92ZSBpdCFcbiAgICAgICAgICAvLyB0aGlzIHBpZWNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdHJhdmVyc2FsIGluICRkaWdlc3RcbiAgICAgICAgICAvLyAodGhvdWdoIGl0IGRpZmZlcnMgZHVlIHRvIGhhdmluZyB0aGUgZXh0cmEgY2hlY2sgZm9yICQkbGlzdGVuZXJDb3VudClcbiAgICAgICAgICBpZiAoIShuZXh0ID0gKChjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSAmJiBjdXJyZW50LiQkY2hpbGRIZWFkKSB8fFxuICAgICAgICAgICAgICAoY3VycmVudCAhPT0gdGFyZ2V0ICYmIGN1cnJlbnQuJCRuZXh0U2libGluZykpKSkge1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IHRhcmdldCAmJiAhKG5leHQgPSBjdXJyZW50LiQkbmV4dFNpYmxpbmcpKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQuY3VycmVudFNjb3BlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgJHJvb3RTY29wZSA9IG5ldyBTY29wZSgpO1xuXG4gICAgLy9UaGUgaW50ZXJuYWwgcXVldWVzLiBFeHBvc2UgdGhlbSBvbiB0aGUgJHJvb3RTY29wZSBmb3IgZGVidWdnaW5nL3Rlc3RpbmcgcHVycG9zZXMuXG4gICAgdmFyIGFzeW5jUXVldWUgPSAkcm9vdFNjb3BlLiQkYXN5bmNRdWV1ZSA9IFtdO1xuICAgIHZhciBwb3N0RGlnZXN0UXVldWUgPSAkcm9vdFNjb3BlLiQkcG9zdERpZ2VzdFF1ZXVlID0gW107XG4gICAgdmFyIGFwcGx5QXN5bmNRdWV1ZSA9ICRyb290U2NvcGUuJCRhcHBseUFzeW5jUXVldWUgPSBbXTtcblxuICAgIHZhciBwb3N0RGlnZXN0UXVldWVQb3NpdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gJHJvb3RTY29wZTtcblxuXG4gICAgZnVuY3Rpb24gYmVnaW5QaGFzZShwaGFzZSkge1xuICAgICAgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkge1xuICAgICAgICB0aHJvdyAkcm9vdFNjb3BlTWluRXJyKCdpbnByb2cnLCAnezB9IGFscmVhZHkgaW4gcHJvZ3Jlc3MnLCAkcm9vdFNjb3BlLiQkcGhhc2UpO1xuICAgICAgfVxuXG4gICAgICAkcm9vdFNjb3BlLiQkcGhhc2UgPSBwaGFzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhclBoYXNlKCkge1xuICAgICAgJHJvb3RTY29wZS4kJHBoYXNlID0gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbmNyZW1lbnRXYXRjaGVyc0NvdW50KGN1cnJlbnQsIGNvdW50KSB7XG4gICAgICBkbyB7XG4gICAgICAgIGN1cnJlbnQuJCR3YXRjaGVyc0NvdW50ICs9IGNvdW50O1xuICAgICAgfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNyZW1lbnRMaXN0ZW5lckNvdW50KGN1cnJlbnQsIGNvdW50LCBuYW1lKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGN1cnJlbnQuJCRsaXN0ZW5lckNvdW50W25hbWVdIC09IGNvdW50O1xuXG4gICAgICAgIGlmIChjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXSA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSBjdXJyZW50LiQkbGlzdGVuZXJDb3VudFtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoKGN1cnJlbnQgPSBjdXJyZW50LiRwYXJlbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmdW5jdGlvbiB1c2VkIGFzIGFuIGluaXRpYWwgdmFsdWUgZm9yIHdhdGNoZXJzLlxuICAgICAqIGJlY2F1c2UgaXQncyB1bmlxdWUgd2UgY2FuIGVhc2lseSB0ZWxsIGl0IGFwYXJ0IGZyb20gb3RoZXIgdmFsdWVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdFdhdGNoVmFsKCkge31cblxuICAgIGZ1bmN0aW9uIGZsdXNoQXBwbHlBc3luYygpIHtcbiAgICAgIHdoaWxlIChhcHBseUFzeW5jUXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXBwbHlBc3luY1F1ZXVlLnNoaWZ0KCkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcHBseUFzeW5jSWQgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlQXBwbHlBc3luYygpIHtcbiAgICAgIGlmIChhcHBseUFzeW5jSWQgPT09IG51bGwpIHtcbiAgICAgICAgYXBwbHlBc3luY0lkID0gJGJyb3dzZXIuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJHJvb3RTY29wZS4kYXBwbHkoZmx1c2hBcHBseUFzeW5jKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJHJvb3RFbGVtZW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgcm9vdCBlbGVtZW50IG9mIEFuZ3VsYXIgYXBwbGljYXRpb24uIFRoaXMgaXMgZWl0aGVyIHRoZSBlbGVtZW50IHdoZXJlIHtAbGlua1xuICogbmcuZGlyZWN0aXZlOm5nQXBwIG5nQXBwfSB3YXMgZGVjbGFyZWQgb3IgdGhlIGVsZW1lbnQgcGFzc2VkIGludG9cbiAqIHtAbGluayBhbmd1bGFyLmJvb3RzdHJhcH0uIFRoZSBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHJvb3QgZWxlbWVudCBvZiBhcHBsaWNhdGlvbi4gSXQgaXMgYWxzbyB0aGVcbiAqIGxvY2F0aW9uIHdoZXJlIHRoZSBhcHBsaWNhdGlvbidzIHtAbGluayBhdXRvLiRpbmplY3RvciAkaW5qZWN0b3J9IHNlcnZpY2UgZ2V0c1xuICogcHVibGlzaGVkLCBhbmQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBgJHJvb3RFbGVtZW50LmluamVjdG9yKClgLlxuICovXG5cblxuLy8gdGhlIGltcGxlbWVudGF0aW9uIGlzIGluIGFuZ3VsYXIuYm9vdHN0cmFwXG5cbi8qKlxuICogQHRoaXNcbiAqIEBkZXNjcmlwdGlvblxuICogUHJpdmF0ZSBzZXJ2aWNlIHRvIHNhbml0aXplIHVyaXMgZm9yIGxpbmtzIGFuZCBpbWFnZXMuIFVzZWQgYnkgJGNvbXBpbGUgYW5kICRzYW5pdGl6ZS5cbiAqL1xuZnVuY3Rpb24gJCRTYW5pdGl6ZVVyaVByb3ZpZGVyKCkge1xuICB2YXIgYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSAvXlxccyooaHR0cHM/fGZ0cHxtYWlsdG98dGVsfGZpbGUpOi8sXG4gICAgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gL15cXHMqKChodHRwcz98ZnRwfGZpbGV8YmxvYik6fGRhdGE6aW1hZ2VcXC8pLztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJldHJpZXZlcyBvciBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9uIHRoYXQgaXMgdXNlZCBmb3Igd2hpdGVsaXN0aW5nIG9mIHNhZmVcbiAgICogdXJscyBkdXJpbmcgYVtocmVmXSBzYW5pdGl6YXRpb24uXG4gICAqXG4gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuXG4gICAqXG4gICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gYVtocmVmXSB2aWEgZGF0YS1iaW5kaW5nIGlzIGZpcnN0IG5vcm1hbGl6ZWQgYW5kIHR1cm5lZCBpbnRvXG4gICAqIGFuIGFic29sdXRlIHVybC4gQWZ0ZXJ3YXJkcywgdGhlIHVybCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdGBcbiAgICogcmVndWxhciBleHByZXNzaW9uLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGUgb3JpZ2luYWwgdXJsIGlzIHdyaXR0ZW4gaW50byB0aGUgZG9tLiBPdGhlcndpc2UsXG4gICAqIHRoZSBhYnNvbHV0ZSB1cmwgaXMgcHJlZml4ZWQgd2l0aCBgJ3Vuc2FmZTonYCBzdHJpbmcgYW5kIG9ubHkgdGhlbiBpcyBpdCB3cml0dGVuIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWdFeHA9fSByZWdleHAgTmV3IHJlZ2V4cCB0byB3aGl0ZWxpc3QgdXJscyB3aXRoLlxuICAgKiBAcmV0dXJucyB7UmVnRXhwfG5nLiRjb21waWxlUHJvdmlkZXJ9IEN1cnJlbnQgUmVnRXhwIGlmIGNhbGxlZCB3aXRob3V0IHZhbHVlIG9yIHNlbGYgZm9yXG4gICAqICAgIGNoYWluaW5nIG90aGVyd2lzZS5cbiAgICovXG4gIHRoaXMuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHtcbiAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHtcbiAgICAgIGFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0ID0gcmVnZXhwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdDtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0cmlldmVzIG9yIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIGZvciB3aGl0ZWxpc3Rpbmcgb2Ygc2FmZVxuICAgKiB1cmxzIGR1cmluZyBpbWdbc3JjXSBzYW5pdGl6YXRpb24uXG4gICAqXG4gICAqIFRoZSBzYW5pdGl6YXRpb24gaXMgYSBzZWN1cml0eSBtZWFzdXJlIGFpbWVkIGF0IHByZXZlbnQgWFNTIGF0dGFja3MgdmlhIGh0bWwgbGlua3MuXG4gICAqXG4gICAqIEFueSB1cmwgYWJvdXQgdG8gYmUgYXNzaWduZWQgdG8gaW1nW3NyY10gdmlhIGRhdGEtYmluZGluZyBpcyBmaXJzdCBub3JtYWxpemVkIGFuZCB0dXJuZWQgaW50b1xuICAgKiBhbiBhYnNvbHV0ZSB1cmwuIEFmdGVyd2FyZHMsIHRoZSB1cmwgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0YFxuICAgKiByZWd1bGFyIGV4cHJlc3Npb24uIElmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBvcmlnaW5hbCB1cmwgaXMgd3JpdHRlbiBpbnRvIHRoZSBkb20uIE90aGVyd2lzZSxcbiAgICogdGhlIGFic29sdXRlIHVybCBpcyBwcmVmaXhlZCB3aXRoIGAndW5zYWZlOidgIHN0cmluZyBhbmQgb25seSB0aGVuIGlzIGl0IHdyaXR0ZW4gaW50byB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlZ0V4cD19IHJlZ2V4cCBOZXcgcmVnZXhwIHRvIHdoaXRlbGlzdCB1cmxzIHdpdGguXG4gICAqIEByZXR1cm5zIHtSZWdFeHB8bmcuJGNvbXBpbGVQcm92aWRlcn0gQ3VycmVudCBSZWdFeHAgaWYgY2FsbGVkIHdpdGhvdXQgdmFsdWUgb3Igc2VsZiBmb3JcbiAgICogICAgY2hhaW5pbmcgb3RoZXJ3aXNlLlxuICAgKi9cbiAgdGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgPSBmdW5jdGlvbihyZWdleHApIHtcbiAgICBpZiAoaXNEZWZpbmVkKHJlZ2V4cCkpIHtcbiAgICAgIGltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCA9IHJlZ2V4cDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0O1xuICB9O1xuXG4gIHRoaXMuJGdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBzYW5pdGl6ZVVyaSh1cmksIGlzSW1hZ2UpIHtcbiAgICAgIHZhciByZWdleCA9IGlzSW1hZ2UgPyBpbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3QgOiBhSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdDtcbiAgICAgIHZhciBub3JtYWxpemVkVmFsO1xuICAgICAgbm9ybWFsaXplZFZhbCA9IHVybFJlc29sdmUodXJpKS5ocmVmO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRWYWwgIT09ICcnICYmICFub3JtYWxpemVkVmFsLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2FmZTonICsgbm9ybWFsaXplZFZhbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1cmk7XG4gICAgfTtcbiAgfTtcbn1cblxuLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKlxuICogICAgIEFueSBjb21taXRzIHRvIHRoaXMgZmlsZSBzaG91bGQgYmUgcmV2aWV3ZWQgd2l0aCBzZWN1cml0eSBpbiBtaW5kLiAgKlxuICogICBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBjYW4gcG90ZW50aWFsbHkgY3JlYXRlIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gKlxuICogICAgICAgICAgQW4gYXBwcm92YWwgZnJvbSAyIENvcmUgbWVtYmVycyB3aXRoIGhpc3Rvcnkgb2YgbW9kaWZ5aW5nICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlIGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICogIERvZXMgdGhlIGNoYW5nZSBzb21laG93IGFsbG93IGZvciBhcmJpdHJhcnkgamF2YXNjcmlwdCB0byBiZSBleGVjdXRlZD8gKlxuICogICAgT3IgYWxsb3dzIGZvciBzb21lb25lIHRvIGNoYW5nZSB0aGUgcHJvdG90eXBlIG9mIGJ1aWx0LWluIG9iamVjdHM/ICAgKlxuICogICAgIE9yIGdpdmVzIHVuZGVzaXJlZCBhY2Nlc3MgdG8gdmFyaWFibGVzIGxpa2VzIGRvY3VtZW50IG9yIHdpbmRvdz8gICAgKlxuICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi9cblxuLyogZXhwb3J0ZWQgJFNjZVByb3ZpZGVyLCAkU2NlRGVsZWdhdGVQcm92aWRlciAqL1xuXG52YXIgJHNjZU1pbkVyciA9IG1pbkVycignJHNjZScpO1xuXG52YXIgU0NFX0NPTlRFWFRTID0ge1xuICBIVE1MOiAnaHRtbCcsXG4gIENTUzogJ2NzcycsXG4gIFVSTDogJ3VybCcsXG4gIC8vIFJFU09VUkNFX1VSTCBpcyBhIHN1YnR5cGUgb2YgVVJMIHVzZWQgaW4gY29udGV4dHMgd2hlcmUgYSBwcml2aWxlZ2VkIHJlc291cmNlIGlzIHNvdXJjZWQgZnJvbSBhXG4gIC8vIHVybC4gIChlLmcuIG5nLWluY2x1ZGUsIHNjcmlwdCBzcmMsIHRlbXBsYXRlVXJsKVxuICBSRVNPVVJDRV9VUkw6ICdyZXNvdXJjZVVybCcsXG4gIEpTOiAnanMnXG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvbGxvdy5cblxudmFyIFVOREVSU0NPUkVfTE9XRVJDQVNFX1JFR0VYUCA9IC9fKFthLXpdKS9nO1xuXG5mdW5jdGlvbiBzbmFrZVRvQ2FtZWwobmFtZSkge1xuICByZXR1cm4gbmFtZVxuICAgIC5yZXBsYWNlKFVOREVSU0NPUkVfTE9XRVJDQVNFX1JFR0VYUCwgZm5DYW1lbENhc2VSZXBsYWNlKTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0TWF0Y2hlcihtYXRjaGVyKSB7XG4gIGlmIChtYXRjaGVyID09PSAnc2VsZicpIHtcbiAgICByZXR1cm4gbWF0Y2hlcjtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhtYXRjaGVyKSkge1xuICAgIC8vIFN0cmluZ3MgbWF0Y2ggZXhhY3RseSBleGNlcHQgZm9yIDIgd2lsZGNhcmRzIC0gJyonIGFuZCAnKionLlxuICAgIC8vICcqJyBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgZXhjZXB0IHRob3NlIGZyb20gdGhlIHNldCAnOi8uPyYnLlxuICAgIC8vICcqKicgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIChsaWtlIC4qIGluIGEgUmVnRXhwKS5cbiAgICAvLyBNb3JlIHRoYW4gMiAqJ3MgcmFpc2VzIGFuIGVycm9yIGFzIGl0J3MgaWxsIGRlZmluZWQuXG4gICAgaWYgKG1hdGNoZXIuaW5kZXhPZignKioqJykgPiAtMSkge1xuICAgICAgdGhyb3cgJHNjZU1pbkVycignaXdjYXJkJyxcbiAgICAgICAgICAnSWxsZWdhbCBzZXF1ZW5jZSAqKiogaW4gc3RyaW5nIG1hdGNoZXIuICBTdHJpbmc6IHswfScsIG1hdGNoZXIpO1xuICAgIH1cbiAgICBtYXRjaGVyID0gZXNjYXBlRm9yUmVnZXhwKG1hdGNoZXIpLlxuICAgICAgICAgICAgICAgICAgcmVwbGFjZSgvXFxcXFxcKlxcXFxcXCovZywgJy4qJykuXG4gICAgICAgICAgICAgICAgICByZXBsYWNlKC9cXFxcXFwqL2csICdbXjovLj8mO10qJyk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14nICsgbWF0Y2hlciArICckJyk7XG4gIH0gZWxzZSBpZiAoaXNSZWdFeHAobWF0Y2hlcikpIHtcbiAgICAvLyBUaGUgb25seSBvdGhlciB0eXBlIG9mIG1hdGNoZXIgYWxsb3dlZCBpcyBhIFJlZ2V4cC5cbiAgICAvLyBNYXRjaCBlbnRpcmUgVVJMIC8gZGlzYWxsb3cgcGFydGlhbCBtYXRjaGVzLlxuICAgIC8vIEZsYWdzIGFyZSByZXNldCAoaS5lLiBubyBnbG9iYWwsIGlnbm9yZUNhc2Ugb3IgbXVsdGlsaW5lKVxuICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIG1hdGNoZXIuc291cmNlICsgJyQnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyAkc2NlTWluRXJyKCdpbWF0Y2hlcicsXG4gICAgICAgICdNYXRjaGVycyBtYXkgb25seSBiZSBcInNlbGZcIiwgc3RyaW5nIHBhdHRlcm5zIG9yIFJlZ0V4cCBvYmplY3RzJyk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBhZGp1c3RNYXRjaGVycyhtYXRjaGVycykge1xuICB2YXIgYWRqdXN0ZWRNYXRjaGVycyA9IFtdO1xuICBpZiAoaXNEZWZpbmVkKG1hdGNoZXJzKSkge1xuICAgIGZvckVhY2gobWF0Y2hlcnMsIGZ1bmN0aW9uKG1hdGNoZXIpIHtcbiAgICAgIGFkanVzdGVkTWF0Y2hlcnMucHVzaChhZGp1c3RNYXRjaGVyKG1hdGNoZXIpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gYWRqdXN0ZWRNYXRjaGVycztcbn1cblxuXG4vKipcbiAqIEBuZ2RvYyBzZXJ2aWNlXG4gKiBAbmFtZSAkc2NlRGVsZWdhdGVcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogYCRzY2VEZWxlZ2F0ZWAgaXMgYSBzZXJ2aWNlIHRoYXQgaXMgdXNlZCBieSB0aGUgYCRzY2VgIHNlcnZpY2UgdG8gcHJvdmlkZSB7QGxpbmsgbmcuJHNjZSBTdHJpY3RcbiAqIENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9IHNlcnZpY2VzIHRvIEFuZ3VsYXJKUy5cbiAqXG4gKiBUeXBpY2FsbHksIHlvdSB3b3VsZCBjb25maWd1cmUgb3Igb3ZlcnJpZGUgdGhlIHtAbGluayBuZy4kc2NlRGVsZWdhdGUgJHNjZURlbGVnYXRlfSBpbnN0ZWFkIG9mXG4gKiB0aGUgYCRzY2VgIHNlcnZpY2UgdG8gY3VzdG9taXplIHRoZSB3YXkgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgd29ya3MgaW4gQW5ndWxhckpTLiAgVGhpcyBpc1xuICogYmVjYXVzZSwgd2hpbGUgdGhlIGAkc2NlYCBwcm92aWRlcyBudW1lcm91cyBzaG9ydGhhbmQgbWV0aG9kcywgZXRjLiwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG9cbiAqIG92ZXJyaWRlIDMgY29yZSBmdW5jdGlvbnMgKGB0cnVzdEFzYCwgYGdldFRydXN0ZWRgIGFuZCBgdmFsdWVPZmApIHRvIHJlcGxhY2UgdGhlIHdheSB0aGluZ3NcbiAqIHdvcmsgYmVjYXVzZSBgJHNjZWAgZGVsZWdhdGVzIHRvIGAkc2NlRGVsZWdhdGVgIGZvciB0aGVzZSBvcGVyYXRpb25zLlxuICpcbiAqIFJlZmVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gdG8gY29uZmlndXJlIHRoaXMgc2VydmljZS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBpbnN0YW5jZSBvZiBgJHNjZURlbGVnYXRlYCBzaG91bGQgd29yayBvdXQgb2YgdGhlIGJveCB3aXRoIGxpdHRsZSBwYWluLiAgV2hpbGUgeW91XG4gKiBjYW4gb3ZlcnJpZGUgaXQgY29tcGxldGVseSB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGAkc2NlYCwgdGhlIGNvbW1vbiBjYXNlIHdvdWxkXG4gKiBpbnZvbHZlIGNvbmZpZ3VyaW5nIHRoZSB7QGxpbmsgbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIgJHNjZURlbGVnYXRlUHJvdmlkZXJ9IGluc3RlYWQgYnkgc2V0dGluZ1xuICogeW91ciBvd24gd2hpdGVsaXN0cyBhbmQgYmxhY2tsaXN0cyBmb3IgdHJ1c3RpbmcgVVJMcyB1c2VkIGZvciBsb2FkaW5nIEFuZ3VsYXJKUyByZXNvdXJjZXMgc3VjaCBhc1xuICogdGVtcGxhdGVzLiAgUmVmZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0XG4gKiAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybFdoaXRlbGlzdH0gYW5kIHtAbGlua1xuICogbmcuJHNjZURlbGVnYXRlUHJvdmlkZXIjcmVzb3VyY2VVcmxCbGFja2xpc3QgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxCbGFja2xpc3R9XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRzY2VEZWxlZ2F0ZVByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoZSBgJHNjZURlbGVnYXRlUHJvdmlkZXJgIHByb3ZpZGVyIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVxuICogJHNjZURlbGVnYXRlfSBzZXJ2aWNlLiAgVGhpcyBhbGxvd3Mgb25lIHRvIGdldC9zZXQgdGhlIHdoaXRlbGlzdHMgYW5kIGJsYWNrbGlzdHMgdXNlZCB0byBlbnN1cmVcbiAqIHRoYXQgdGhlIFVSTHMgdXNlZCBmb3Igc291cmNpbmcgQW5ndWxhciB0ZW1wbGF0ZXMgYXJlIHNhZmUuICBSZWZlciB7QGxpbmtcbiAqIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0ICRzY2VEZWxlZ2F0ZVByb3ZpZGVyLnJlc291cmNlVXJsV2hpdGVsaXN0fSBhbmRcbiAqIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCAkc2NlRGVsZWdhdGVQcm92aWRlci5yZXNvdXJjZVVybEJsYWNrbGlzdH1cbiAqXG4gKiBGb3IgdGhlIGdlbmVyYWwgZGV0YWlscyBhYm91dCB0aGlzIHNlcnZpY2UgaW4gQW5ndWxhciwgcmVhZCB0aGUgbWFpbiBwYWdlIGZvciB7QGxpbmsgbmcuJHNjZVxuICogU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9LlxuICpcbiAqICoqRXhhbXBsZSoqOiAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlLiA8YSBuYW1lPVwiZXhhbXBsZVwiPjwvYT5cbiAqXG4gKiAtIHlvdXIgYXBwIGlzIGhvc3RlZCBhdCB1cmwgYGh0dHA6Ly9teWFwcC5leGFtcGxlLmNvbS9gXG4gKiAtIGJ1dCBzb21lIG9mIHlvdXIgdGVtcGxhdGVzIGFyZSBob3N0ZWQgb24gb3RoZXIgZG9tYWlucyB5b3UgY29udHJvbCBzdWNoIGFzXG4gKiAgIGBodHRwOi8vc3J2MDEuYXNzZXRzLmV4YW1wbGUuY29tL2AsIGBodHRwOi8vc3J2MDIuYXNzZXRzLmV4YW1wbGUuY29tL2AsIGV0Yy5cbiAqIC0gYW5kIHlvdSBoYXZlIGFuIG9wZW4gcmVkaXJlY3QgYXQgYGh0dHA6Ly9teWFwcC5leGFtcGxlLmNvbS9jbGlja1RocnU/Li4uYC5cbiAqXG4gKiBIZXJlIGlzIHdoYXQgYSBzZWN1cmUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzY2VuYXJpbyBtaWdodCBsb29rIGxpa2U6XG4gKlxuICogYGBgXG4gKiAgYW5ndWxhci5tb2R1bGUoJ215QXBwJywgW10pLmNvbmZpZyhmdW5jdGlvbigkc2NlRGVsZWdhdGVQcm92aWRlcikge1xuICogICAgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxXaGl0ZWxpc3QoW1xuICogICAgICAvLyBBbGxvdyBzYW1lIG9yaWdpbiByZXNvdXJjZSBsb2Fkcy5cbiAqICAgICAgJ3NlbGYnLFxuICogICAgICAvLyBBbGxvdyBsb2FkaW5nIGZyb20gb3VyIGFzc2V0cyBkb21haW4uICBOb3RpY2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAqIGFuZCAqKi5cbiAqICAgICAgJ2h0dHA6Ly9zcnYqLmFzc2V0cy5leGFtcGxlLmNvbS8qKidcbiAqICAgIF0pO1xuICpcbiAqICAgIC8vIFRoZSBibGFja2xpc3Qgb3ZlcnJpZGVzIHRoZSB3aGl0ZWxpc3Qgc28gdGhlIG9wZW4gcmVkaXJlY3QgaGVyZSBpcyBibG9ja2VkLlxuICogICAgJHNjZURlbGVnYXRlUHJvdmlkZXIucmVzb3VyY2VVcmxCbGFja2xpc3QoW1xuICogICAgICAnaHR0cDovL215YXBwLmV4YW1wbGUuY29tL2NsaWNrVGhydSoqJ1xuICogICAgXSk7XG4gKiAgfSk7XG4gKiBgYGBcbiAqL1xuXG5mdW5jdGlvbiAkU2NlRGVsZWdhdGVQcm92aWRlcigpIHtcbiAgdGhpcy5TQ0VfQ09OVEVYVFMgPSBTQ0VfQ09OVEVYVFM7XG5cbiAgLy8gUmVzb3VyY2UgVVJMcyBjYW4gYWxzbyBiZSB0cnVzdGVkIGJ5IHBvbGljeS5cbiAgdmFyIHJlc291cmNlVXJsV2hpdGVsaXN0ID0gWydzZWxmJ10sXG4gICAgICByZXNvdXJjZVVybEJsYWNrbGlzdCA9IFtdO1xuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lICRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0XG4gICAqIEBraW5kIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk9fSB3aGl0ZWxpc3QgV2hlbiBwcm92aWRlZCwgcmVwbGFjZXMgdGhlIHJlc291cmNlVXJsV2hpdGVsaXN0IHdpdGggdGhlIHZhbHVlXG4gICAqICAgIHByb3ZpZGVkLiAgVGhpcyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwuICBBIHNuYXBzaG90IG9mIHRoaXMgYXJyYXkgaXMgdXNlZCBzbyBmdXJ0aGVyXG4gICAqICAgIGNoYW5nZXMgdG8gdGhlIGFycmF5IGFyZSBpZ25vcmVkLlxuICAgKlxuICAgKiAgICBGb2xsb3cge0BsaW5rIG5nLiRzY2UjcmVzb3VyY2VVcmxQYXR0ZXJuSXRlbSB0aGlzIGxpbmt9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtc1xuICAgKiAgICBhbGxvd2VkIGluIHRoaXMgYXJyYXkuXG4gICAqXG4gICAqICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gICAqICAgICoqTm90ZToqKiBhbiBlbXB0eSB3aGl0ZWxpc3QgYXJyYXkgd2lsbCBibG9jayBhbGwgVVJMcyFcbiAgICogICAgPC9kaXY+XG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5fSB0aGUgY3VycmVudGx5IHNldCB3aGl0ZWxpc3QgYXJyYXkuXG4gICAqXG4gICAqIFRoZSAqKmRlZmF1bHQgdmFsdWUqKiB3aGVuIG5vIHdoaXRlbGlzdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCBpcyBgWydzZWxmJ11gIGFsbG93aW5nIG9ubHlcbiAgICogc2FtZSBvcmlnaW4gcmVzb3VyY2UgcmVxdWVzdHMuXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzL0dldHMgdGhlIHdoaXRlbGlzdCBvZiB0cnVzdGVkIHJlc291cmNlIFVSTHMuXG4gICAqL1xuICB0aGlzLnJlc291cmNlVXJsV2hpdGVsaXN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmVzb3VyY2VVcmxXaGl0ZWxpc3QgPSBhZGp1c3RNYXRjaGVycyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZVVybFdoaXRlbGlzdDtcbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdFxuICAgKiBAa2luZCBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PX0gYmxhY2tsaXN0IFdoZW4gcHJvdmlkZWQsIHJlcGxhY2VzIHRoZSByZXNvdXJjZVVybEJsYWNrbGlzdCB3aXRoIHRoZSB2YWx1ZVxuICAgKiAgICBwcm92aWRlZC4gIFRoaXMgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsLiAgQSBzbmFwc2hvdCBvZiB0aGlzIGFycmF5IGlzIHVzZWQgc28gZnVydGhlclxuICAgKiAgICBjaGFuZ2VzIHRvIHRoZSBhcnJheSBhcmUgaWdub3JlZC5cbiAgICpcbiAgICogICAgRm9sbG93IHtAbGluayBuZy4kc2NlI3Jlc291cmNlVXJsUGF0dGVybkl0ZW0gdGhpcyBsaW5rfSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaXRlbXNcbiAgICogICAgYWxsb3dlZCBpbiB0aGlzIGFycmF5LlxuICAgKlxuICAgKiAgICBUaGUgdHlwaWNhbCB1c2FnZSBmb3IgdGhlIGJsYWNrbGlzdCBpcyB0byAqKmJsb2NrXG4gICAqICAgIFtvcGVuIHJlZGlyZWN0c10oaHR0cDovL2N3ZS5taXRyZS5vcmcvZGF0YS9kZWZpbml0aW9ucy82MDEuaHRtbCkqKiBzZXJ2ZWQgYnkgeW91ciBkb21haW4gYXNcbiAgICogICAgdGhlc2Ugd291bGQgb3RoZXJ3aXNlIGJlIHRydXN0ZWQgYnV0IGFjdHVhbGx5IHJldHVybiBjb250ZW50IGZyb20gdGhlIHJlZGlyZWN0ZWQgZG9tYWluLlxuICAgKlxuICAgKiAgICBGaW5hbGx5LCAqKnRoZSBibGFja2xpc3Qgb3ZlcnJpZGVzIHRoZSB3aGl0ZWxpc3QqKiBhbmQgaGFzIHRoZSBmaW5hbCBzYXkuXG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5fSB0aGUgY3VycmVudGx5IHNldCBibGFja2xpc3QgYXJyYXkuXG4gICAqXG4gICAqIFRoZSAqKmRlZmF1bHQgdmFsdWUqKiB3aGVuIG5vIHdoaXRlbGlzdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCBpcyB0aGUgZW1wdHkgYXJyYXkgKGkuZS4gdGhlcmVcbiAgICogaXMgbm8gYmxhY2tsaXN0LilcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMvR2V0cyB0aGUgYmxhY2tsaXN0IG9mIHRydXN0ZWQgcmVzb3VyY2UgVVJMcy5cbiAgICovXG5cbiAgdGhpcy5yZXNvdXJjZVVybEJsYWNrbGlzdCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJlc291cmNlVXJsQmxhY2tsaXN0ID0gYWRqdXN0TWF0Y2hlcnModmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2VVcmxCbGFja2xpc3Q7XG4gIH07XG5cbiAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCBmdW5jdGlvbigkaW5qZWN0b3IpIHtcblxuICAgIHZhciBodG1sU2FuaXRpemVyID0gZnVuY3Rpb24gaHRtbFNhbml0aXplcihodG1sKSB7XG4gICAgICB0aHJvdyAkc2NlTWluRXJyKCd1bnNhZmUnLCAnQXR0ZW1wdGluZyB0byB1c2UgYW4gdW5zYWZlIHZhbHVlIGluIGEgc2FmZSBjb250ZXh0LicpO1xuICAgIH07XG5cbiAgICBpZiAoJGluamVjdG9yLmhhcygnJHNhbml0aXplJykpIHtcbiAgICAgIGh0bWxTYW5pdGl6ZXIgPSAkaW5qZWN0b3IuZ2V0KCckc2FuaXRpemUnKTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIG1hdGNoVXJsKG1hdGNoZXIsIHBhcnNlZFVybCkge1xuICAgICAgaWYgKG1hdGNoZXIgPT09ICdzZWxmJykge1xuICAgICAgICByZXR1cm4gdXJsSXNTYW1lT3JpZ2luKHBhcnNlZFVybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBkZWZpbml0ZWx5IGEgcmVnZXguICBTZWUgYWRqdXN0TWF0Y2hlcnMoKVxuICAgICAgICByZXR1cm4gISFtYXRjaGVyLmV4ZWMocGFyc2VkVXJsLmhyZWYpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzb3VyY2VVcmxBbGxvd2VkQnlQb2xpY3kodXJsKSB7XG4gICAgICB2YXIgcGFyc2VkVXJsID0gdXJsUmVzb2x2ZSh1cmwudG9TdHJpbmcoKSk7XG4gICAgICB2YXIgaSwgbiwgYWxsb3dlZCA9IGZhbHNlO1xuICAgICAgLy8gRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gZnJvbSB0aGUgd2hpdGVsaXN0IGFsbG93cyB0aGlzIHVybC5cbiAgICAgIGZvciAoaSA9IDAsIG4gPSByZXNvdXJjZVVybFdoaXRlbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKG1hdGNoVXJsKHJlc291cmNlVXJsV2hpdGVsaXN0W2ldLCBwYXJzZWRVcmwpKSB7XG4gICAgICAgICAgYWxsb3dlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IG5vIGl0ZW0gZnJvbSB0aGUgYmxhY2tsaXN0IGJsb2NrZWQgdGhpcyB1cmwuXG4gICAgICAgIGZvciAoaSA9IDAsIG4gPSByZXNvdXJjZVVybEJsYWNrbGlzdC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBpZiAobWF0Y2hVcmwocmVzb3VyY2VVcmxCbGFja2xpc3RbaV0sIHBhcnNlZFVybCkpIHtcbiAgICAgICAgICAgIGFsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFsbG93ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVIb2xkZXJUeXBlKEJhc2UpIHtcbiAgICAgIHZhciBob2xkZXJUeXBlID0gZnVuY3Rpb24gVHJ1c3RlZFZhbHVlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0cnVzdGVkVmFsdWU7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgaWYgKEJhc2UpIHtcbiAgICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUgPSBuZXcgQmFzZSgpO1xuICAgICAgfVxuICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uIHNjZVZhbHVlT2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCk7XG4gICAgICB9O1xuICAgICAgaG9sZGVyVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBzY2VUb1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKS50b1N0cmluZygpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBob2xkZXJUeXBlO1xuICAgIH1cblxuICAgIHZhciB0cnVzdGVkVmFsdWVIb2xkZXJCYXNlID0gZ2VuZXJhdGVIb2xkZXJUeXBlKCksXG4gICAgICAgIGJ5VHlwZSA9IHt9O1xuXG4gICAgYnlUeXBlW1NDRV9DT05URVhUUy5IVE1MXSA9IGdlbmVyYXRlSG9sZGVyVHlwZSh0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKTtcbiAgICBieVR5cGVbU0NFX0NPTlRFWFRTLkNTU10gPSBnZW5lcmF0ZUhvbGRlclR5cGUodHJ1c3RlZFZhbHVlSG9sZGVyQmFzZSk7XG4gICAgYnlUeXBlW1NDRV9DT05URVhUUy5VUkxdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpO1xuICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuSlNdID0gZ2VuZXJhdGVIb2xkZXJUeXBlKHRydXN0ZWRWYWx1ZUhvbGRlckJhc2UpO1xuICAgIGJ5VHlwZVtTQ0VfQ09OVEVYVFMuUkVTT1VSQ0VfVVJMXSA9IGdlbmVyYXRlSG9sZGVyVHlwZShieVR5cGVbU0NFX0NPTlRFWFRTLlVSTF0pO1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZSN0cnVzdEFzXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGlzIHRydXN0ZWQgYnkgYW5ndWxhciBmb3IgdXNlIGluIHNwZWNpZmllZCBzdHJpY3RcbiAgICAgKiBjb250ZXh0dWFsIGVzY2FwaW5nIGNvbnRleHRzIChzdWNoIGFzIG5nLWJpbmQtaHRtbCwgbmctaW5jbHVkZSwgYW55IHNyY1xuICAgICAqIGF0dHJpYnV0ZSBpbnRlcnBvbGF0aW9uLCBhbnkgZG9tIGV2ZW50IGJpbmRpbmcgYXR0cmlidXRlIGludGVycG9sYXRpb25cbiAgICAgKiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLikgdGhhdCB1c2VzIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICAgKiBTZWUge0BsaW5rIG5nLiRzY2UgJHNjZX0gZm9yIGVuYWJsaW5nIHN0cmljdCBjb250ZXh0dWFsIGVzY2FwaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHNhZmUgZm9yIHVzZS4gIGUuZy4gdXJsLFxuICAgICAqICAgcmVzb3VyY2VVcmwsIGh0bWwsIGpzIGFuZCBjc3MuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRydXN0ZWQvc2FmZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gQSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0YW5kIGluIGZvciB0aGUgcHJvdmlkZWQgYHZhbHVlYCBpbiBwbGFjZXNcbiAgICAgKiB3aGVyZSBBbmd1bGFyIGV4cGVjdHMgYSAkc2NlLnRydXN0QXMoKSByZXR1cm4gdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1c3RBcyh0eXBlLCB0cnVzdGVkVmFsdWUpIHtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IChieVR5cGUuaGFzT3duUHJvcGVydHkodHlwZSkgPyBieVR5cGVbdHlwZV0gOiBudWxsKTtcbiAgICAgIGlmICghQ29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhyb3cgJHNjZU1pbkVycignaWNvbnRleHQnLFxuICAgICAgICAgICAgJ0F0dGVtcHRlZCB0byB0cnVzdCBhIHZhbHVlIGluIGludmFsaWQgY29udGV4dC4gQ29udGV4dDogezB9OyBWYWx1ZTogezF9JyxcbiAgICAgICAgICAgIHR5cGUsIHRydXN0ZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodHJ1c3RlZFZhbHVlID09PSBudWxsIHx8IGlzVW5kZWZpbmVkKHRydXN0ZWRWYWx1ZSkgfHwgdHJ1c3RlZFZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1c3RlZFZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gQWxsIHRoZSBjdXJyZW50IGNvbnRleHRzIGluIFNDRV9DT05URVhUUyBoYXBwZW4gdG8gYmUgc3RyaW5ncy4gIEluIG9yZGVyIHRvIGF2b2lkIHRydXN0aW5nXG4gICAgICAvLyBtdXRhYmxlIG9iamVjdHMsIHdlIGVuc3VyZSBoZXJlIHRoYXQgdGhlIHZhbHVlIHBhc3NlZCBpbiBpcyBhY3R1YWxseSBhIHN0cmluZy5cbiAgICAgIGlmICh0eXBlb2YgdHJ1c3RlZFZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyAkc2NlTWluRXJyKCdpdHlwZScsXG4gICAgICAgICAgICAnQXR0ZW1wdGVkIHRvIHRydXN0IGEgbm9uLXN0cmluZyB2YWx1ZSBpbiBhIGNvbnRlbnQgcmVxdWlyaW5nIGEgc3RyaW5nOiBDb250ZXh0OiB7MH0nLFxuICAgICAgICAgICAgdHlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRydXN0ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZSN2YWx1ZU9mXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBJZiB0aGUgcGFzc2VkIHBhcmFtZXRlciBoYWQgYmVlbiByZXR1cm5lZCBieSBhIHByaW9yIGNhbGwgdG8ge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzXG4gICAgICogYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0sIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgaGFkIGJlZW4gcGFzc2VkIHRvIHtAbGlua1xuICAgICAqIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9LlxuICAgICAqXG4gICAgICogSWYgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsdWUgdGhhdCBoYWQgYmVlbiByZXR1cm5lZCBieSB7QGxpbmtcbiAgICAgKiBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSwgcmV0dXJucyBpdCBhcy1pcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHJlc3VsdCBvZiBhIHByaW9yIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXNgfVxuICAgICAqICAgICAgY2FsbCBvciBhbnl0aGluZyBlbHNlLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgYHZhbHVlYCB0aGF0IHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBc1xuICAgICAqICAgICBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBpZiBgdmFsdWVgIGlzIHRoZSByZXN1bHQgb2Ygc3VjaCBhIGNhbGwuICBPdGhlcndpc2UsIHJldHVybnNcbiAgICAgKiAgICAgYHZhbHVlYCB1bmNoYW5nZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVPZihtYXliZVRydXN0ZWQpIHtcbiAgICAgIGlmIChtYXliZVRydXN0ZWQgaW5zdGFuY2VvZiB0cnVzdGVkVmFsdWVIb2xkZXJCYXNlKSB7XG4gICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2VEZWxlZ2F0ZSNnZXRUcnVzdGVkXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBUYWtlcyB0aGUgcmVzdWx0IG9mIGEge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBc2B9IGNhbGwgYW5kXG4gICAgICogcmV0dXJucyB0aGUgb3JpZ2luYWxseSBzdXBwbGllZCB2YWx1ZSBpZiB0aGUgcXVlcmllZCBjb250ZXh0IHR5cGUgaXMgYSBzdXBlcnR5cGUgb2YgdGhlXG4gICAgICogY3JlYXRlZCB0eXBlLiAgSWYgdGhpcyBjb25kaXRpb24gaXNuJ3Qgc2F0aXNmaWVkLCB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAqXG4gICAgICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPlxuICAgICAqIERpc2FibGluZyBhdXRvLWVzY2FwaW5nIGlzIGV4dHJlbWVseSBkYW5nZXJvdXMsIGl0IHVzdWFsbHkgY3JlYXRlcyBhIENyb3NzIFNpdGUgU2NyaXB0aW5nXG4gICAgICogKFhTUykgdnVsbmVyYWJpbGl0eSBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgICAqIDwvZGl2PlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgY29udGV4dCBpbiB3aGljaCB0aGlzIHZhbHVlIGlzIHRvIGJlIHVzZWQuXG4gICAgICogQHBhcmFtIHsqfSBtYXliZVRydXN0ZWQgVGhlIHJlc3VsdCBvZiBhIHByaW9yIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBc1xuICAgICAqICAgICBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBjYWxsLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhlIHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBc1xuICAgICAqICAgICBgJHNjZURlbGVnYXRlLnRydXN0QXNgfSBpZiB2YWxpZCBpbiB0aGlzIGNvbnRleHQuICBPdGhlcndpc2UsIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VHJ1c3RlZCh0eXBlLCBtYXliZVRydXN0ZWQpIHtcbiAgICAgIGlmIChtYXliZVRydXN0ZWQgPT09IG51bGwgfHwgaXNVbmRlZmluZWQobWF5YmVUcnVzdGVkKSB8fCBtYXliZVRydXN0ZWQgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBtYXliZVRydXN0ZWQ7XG4gICAgICB9XG4gICAgICB2YXIgY29uc3RydWN0b3IgPSAoYnlUeXBlLmhhc093blByb3BlcnR5KHR5cGUpID8gYnlUeXBlW3R5cGVdIDogbnVsbCk7XG4gICAgICBpZiAoY29uc3RydWN0b3IgJiYgbWF5YmVUcnVzdGVkIGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG1heWJlVHJ1c3RlZC4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHRoZW4gd2UgbWF5IG9ubHkgdGFrZSBvbmUgb2YgdHdvIGFjdGlvbnMuXG4gICAgICAvLyAxLiBzYW5pdGl6ZSB0aGUgdmFsdWUgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSwgb3JcbiAgICAgIC8vIDIuIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICAgIGlmICh0eXBlID09PSBTQ0VfQ09OVEVYVFMuUkVTT1VSQ0VfVVJMKSB7XG4gICAgICAgIGlmIChpc1Jlc291cmNlVXJsQWxsb3dlZEJ5UG9saWN5KG1heWJlVHJ1c3RlZCkpIHtcbiAgICAgICAgICByZXR1cm4gbWF5YmVUcnVzdGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93ICRzY2VNaW5FcnIoJ2luc2VjdXJsJyxcbiAgICAgICAgICAgICAgJ0Jsb2NrZWQgbG9hZGluZyByZXNvdXJjZSBmcm9tIHVybCBub3QgYWxsb3dlZCBieSAkc2NlRGVsZWdhdGUgcG9saWN5LiAgVVJMOiB7MH0nLFxuICAgICAgICAgICAgICBtYXliZVRydXN0ZWQudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gU0NFX0NPTlRFWFRTLkhUTUwpIHtcbiAgICAgICAgcmV0dXJuIGh0bWxTYW5pdGl6ZXIobWF5YmVUcnVzdGVkKTtcbiAgICAgIH1cbiAgICAgIHRocm93ICRzY2VNaW5FcnIoJ3Vuc2FmZScsICdBdHRlbXB0aW5nIHRvIHVzZSBhbiB1bnNhZmUgdmFsdWUgaW4gYSBzYWZlIGNvbnRleHQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJ1c3RBczogdHJ1c3RBcyxcbiAgICAgICAgICAgICBnZXRUcnVzdGVkOiBnZXRUcnVzdGVkLFxuICAgICAgICAgICAgIHZhbHVlT2Y6IHZhbHVlT2YgfTtcbiAgfV07XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgcHJvdmlkZXJcbiAqIEBuYW1lICRzY2VQcm92aWRlclxuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBUaGUgJHNjZVByb3ZpZGVyIHByb3ZpZGVyIGFsbG93cyBkZXZlbG9wZXJzIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG5nLiRzY2UgJHNjZX0gc2VydmljZS5cbiAqIC0gICBlbmFibGUvZGlzYWJsZSBTdHJpY3QgQ29udGV4dHVhbCBFc2NhcGluZyAoU0NFKSBpbiBhIG1vZHVsZVxuICogLSAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpdGggYSBjdXN0b20gZGVsZWdhdGVcbiAqXG4gKiBSZWFkIG1vcmUgYWJvdXQge0BsaW5rIG5nLiRzY2UgU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSl9LlxuICovXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRzY2VcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogYCRzY2VgIGlzIGEgc2VydmljZSB0aGF0IHByb3ZpZGVzIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIHNlcnZpY2VzIHRvIEFuZ3VsYXJKUy5cbiAqXG4gKiAjIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nXG4gKlxuICogU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgKFNDRSkgaXMgYSBtb2RlIGluIHdoaWNoIEFuZ3VsYXJKUyByZXF1aXJlcyBiaW5kaW5ncyBpbiBjZXJ0YWluXG4gKiBjb250ZXh0cyB0byByZXN1bHQgaW4gYSB2YWx1ZSB0aGF0IGlzIG1hcmtlZCBhcyBzYWZlIHRvIHVzZSBmb3IgdGhhdCBjb250ZXh0LiAgT25lIGV4YW1wbGUgb2ZcbiAqIHN1Y2ggYSBjb250ZXh0IGlzIGJpbmRpbmcgYXJiaXRyYXJ5IGh0bWwgY29udHJvbGxlZCBieSB0aGUgdXNlciB2aWEgYG5nLWJpbmQtaHRtbGAuICBXZSByZWZlclxuICogdG8gdGhlc2UgY29udGV4dHMgYXMgcHJpdmlsZWdlZCBvciBTQ0UgY29udGV4dHMuXG4gKlxuICogQXMgb2YgdmVyc2lvbiAxLjIsIEFuZ3VsYXIgc2hpcHMgd2l0aCBTQ0UgZW5hYmxlZCBieSBkZWZhdWx0LlxuICpcbiAqIE5vdGU6ICBXaGVuIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSwgSUU8MTEgaW4gcXVpcmtzIG1vZGUgaXMgbm90IHN1cHBvcnRlZC4gIEluIHRoaXMgbW9kZSwgSUU8MTEgYWxsb3dcbiAqIG9uZSB0byBleGVjdXRlIGFyYml0cmFyeSBqYXZhc2NyaXB0IGJ5IHRoZSB1c2Ugb2YgdGhlIGV4cHJlc3Npb24oKSBzeW50YXguICBSZWZlclxuICogPGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9iL2llL2FyY2hpdmUvMjAwOC8xMC8xNi9lbmRpbmctZXhwcmVzc2lvbnMuYXNweD4gdG8gbGVhcm4gbW9yZSBhYm91dCB0aGVtLlxuICogWW91IGNhbiBlbnN1cmUgeW91ciBkb2N1bWVudCBpcyBpbiBzdGFuZGFyZHMgbW9kZSBhbmQgbm90IHF1aXJrcyBtb2RlIGJ5IGFkZGluZyBgPCFkb2N0eXBlIGh0bWw+YFxuICogdG8gdGhlIHRvcCBvZiB5b3VyIEhUTUwgZG9jdW1lbnQuXG4gKlxuICogU0NFIGFzc2lzdHMgaW4gd3JpdGluZyBjb2RlIGluIGEgd2F5IHRoYXQgKGEpIGlzIHNlY3VyZSBieSBkZWZhdWx0IGFuZCAoYikgbWFrZXMgYXVkaXRpbmcgZm9yXG4gKiBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgc3VjaCBhcyBYU1MsIGNsaWNramFja2luZywgZXRjLiBhIGxvdCBlYXNpZXIuXG4gKlxuICogSGVyZSdzIGFuIGV4YW1wbGUgb2YgYSBiaW5kaW5nIGluIGEgcHJpdmlsZWdlZCBjb250ZXh0OlxuICpcbiAqIGBgYFxuICogPGlucHV0IG5nLW1vZGVsPVwidXNlckh0bWxcIiBhcmlhLWxhYmVsPVwiVXNlciBpbnB1dFwiPlxuICogPGRpdiBuZy1iaW5kLWh0bWw9XCJ1c2VySHRtbFwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogTm90aWNlIHRoYXQgYG5nLWJpbmQtaHRtbGAgaXMgYm91bmQgdG8gYHVzZXJIdG1sYCBjb250cm9sbGVkIGJ5IHRoZSB1c2VyLiAgV2l0aCBTQ0VcbiAqIGRpc2FibGVkLCB0aGlzIGFwcGxpY2F0aW9uIGFsbG93cyB0aGUgdXNlciB0byByZW5kZXIgYXJiaXRyYXJ5IEhUTUwgaW50byB0aGUgRElWLlxuICogSW4gYSBtb3JlIHJlYWxpc3RpYyBleGFtcGxlLCBvbmUgbWF5IGJlIHJlbmRlcmluZyB1c2VyIGNvbW1lbnRzLCBibG9nIGFydGljbGVzLCBldGMuIHZpYVxuICogYmluZGluZ3MuICAoSFRNTCBpcyBqdXN0IG9uZSBleGFtcGxlIG9mIGEgY29udGV4dCB3aGVyZSByZW5kZXJpbmcgdXNlciBjb250cm9sbGVkIGlucHV0IGNyZWF0ZXNcbiAqIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4pXG4gKlxuICogRm9yIHRoZSBjYXNlIG9mIEhUTUwsIHlvdSBtaWdodCB1c2UgYSBsaWJyYXJ5LCBlaXRoZXIgb24gdGhlIGNsaWVudCBzaWRlLCBvciBvbiB0aGUgc2VydmVyIHNpZGUsXG4gKiB0byBzYW5pdGl6ZSB1bnNhZmUgSFRNTCBiZWZvcmUgYmluZGluZyB0byB0aGUgdmFsdWUgYW5kIHJlbmRlcmluZyBpdCBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogSG93IHdvdWxkIHlvdSBlbnN1cmUgdGhhdCBldmVyeSBwbGFjZSB0aGF0IHVzZWQgdGhlc2UgdHlwZXMgb2YgYmluZGluZ3Mgd2FzIGJvdW5kIHRvIGEgdmFsdWUgdGhhdFxuICogd2FzIHNhbml0aXplZCBieSB5b3VyIGxpYnJhcnkgKG9yIHJldHVybmVkIGFzIHNhZmUgZm9yIHJlbmRlcmluZyBieSB5b3VyIHNlcnZlcj8pICBIb3cgY2FuIHlvdVxuICogZW5zdXJlIHRoYXQgeW91IGRpZG4ndCBhY2NpZGVudGFsbHkgZGVsZXRlIHRoZSBsaW5lIHRoYXQgc2FuaXRpemVkIHRoZSB2YWx1ZSwgb3IgcmVuYW1lZCBzb21lXG4gKiBwcm9wZXJ0aWVzL2ZpZWxkcyBhbmQgZm9yZ290IHRvIHVwZGF0ZSB0aGUgYmluZGluZyB0byB0aGUgc2FuaXRpemVkIHZhbHVlP1xuICpcbiAqIFRvIGJlIHNlY3VyZSBieSBkZWZhdWx0LCB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCBhbnkgc3VjaCBiaW5kaW5ncyBhcmUgZGlzYWxsb3dlZCB1bmxlc3MgeW91IGNhblxuICogZGV0ZXJtaW5lIHRoYXQgc29tZXRoaW5nIGV4cGxpY2l0bHkgc2F5cyBpdCdzIHNhZmUgdG8gdXNlIGEgdmFsdWUgZm9yIGJpbmRpbmcgaW4gdGhhdFxuICogY29udGV4dC4gIFlvdSBjYW4gdGhlbiBhdWRpdCB5b3VyIGNvZGUgKGEgc2ltcGxlIGdyZXAgd291bGQgZG8pIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgb25seSBkb25lXG4gKiBmb3IgdGhvc2UgdmFsdWVzIHRoYXQgeW91IGNhbiBlYXNpbHkgdGVsbCBhcmUgc2FmZSAtIGJlY2F1c2UgdGhleSB3ZXJlIHJlY2VpdmVkIGZyb20geW91ciBzZXJ2ZXIsXG4gKiBzYW5pdGl6ZWQgYnkgeW91ciBsaWJyYXJ5LCBldGMuICBZb3UgY2FuIG9yZ2FuaXplIHlvdXIgY29kZWJhc2UgdG8gaGVscCB3aXRoIHRoaXMgLSBwZXJoYXBzXG4gKiBhbGxvd2luZyBvbmx5IHRoZSBmaWxlcyBpbiBhIHNwZWNpZmljIGRpcmVjdG9yeSB0byBkbyB0aGlzLiAgRW5zdXJpbmcgdGhhdCB0aGUgaW50ZXJuYWwgQVBJXG4gKiBleHBvc2VkIGJ5IHRoYXQgY29kZSBkb2Vzbid0IG1hcmt1cCBhcmJpdHJhcnkgdmFsdWVzIGFzIHNhZmUgdGhlbiBiZWNvbWVzIGEgbW9yZSBtYW5hZ2VhYmxlIHRhc2suXG4gKlxuICogSW4gdGhlIGNhc2Ugb2YgQW5ndWxhckpTJyBTQ0Ugc2VydmljZSwgb25lIHVzZXMge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9XG4gKiAoYW5kIHNob3J0aGFuZCBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIG5nLiRzY2UjdHJ1c3RBc0h0bWwgJHNjZS50cnVzdEFzSHRtbH0sIGV0Yy4pIHRvXG4gKiBvYnRhaW4gdmFsdWVzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBieSBTQ0UgLyBwcml2aWxlZ2VkIGNvbnRleHRzLlxuICpcbiAqXG4gKiAjIyBIb3cgZG9lcyBpdCB3b3JrP1xuICpcbiAqIEluIHByaXZpbGVnZWQgY29udGV4dHMsIGRpcmVjdGl2ZXMgYW5kIGNvZGUgd2lsbCBiaW5kIHRvIHRoZSByZXN1bHQgb2Yge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFxuICogJHNjZS5nZXRUcnVzdGVkKGNvbnRleHQsIHZhbHVlKX0gcmF0aGVyIHRoYW4gdG8gdGhlIHZhbHVlIGRpcmVjdGx5LiAgRGlyZWN0aXZlcyB1c2Uge0BsaW5rXG4gKiBuZy4kc2NlI3BhcnNlQXMgJHNjZS5wYXJzZUFzfSByYXRoZXIgdGhhbiBgJHBhcnNlYCB0byB3YXRjaCBhdHRyaWJ1dGUgYmluZGluZ3MsIHdoaWNoIHBlcmZvcm1zIHRoZVxuICoge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZCAkc2NlLmdldFRydXN0ZWR9IGJlaGluZCB0aGUgc2NlbmVzIG9uIG5vbi1jb25zdGFudCBsaXRlcmFscy5cbiAqXG4gKiBBcyBhbiBleGFtcGxlLCB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQmluZEh0bWwgbmdCaW5kSHRtbH0gdXNlcyB7QGxpbmtcbiAqIG5nLiRzY2UjcGFyc2VBc0h0bWwgJHNjZS5wYXJzZUFzSHRtbChiaW5kaW5nIGV4cHJlc3Npb24pfS4gIEhlcmUncyB0aGUgYWN0dWFsIGNvZGUgKHNsaWdodGx5XG4gKiBzaW1wbGlmaWVkKTpcbiAqXG4gKiBgYGBcbiAqIHZhciBuZ0JpbmRIdG1sRGlyZWN0aXZlID0gWyckc2NlJywgZnVuY3Rpb24oJHNjZSkge1xuICogICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAqICAgICBzY29wZS4kd2F0Y2goJHNjZS5wYXJzZUFzSHRtbChhdHRyLm5nQmluZEh0bWwpLCBmdW5jdGlvbih2YWx1ZSkge1xuICogICAgICAgZWxlbWVudC5odG1sKHZhbHVlIHx8ICcnKTtcbiAqICAgICB9KTtcbiAqICAgfTtcbiAqIH1dO1xuICogYGBgXG4gKlxuICogIyMgSW1wYWN0IG9uIGxvYWRpbmcgdGVtcGxhdGVzXG4gKlxuICogVGhpcyBhcHBsaWVzIGJvdGggdG8gdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6bmdJbmNsdWRlIGBuZy1pbmNsdWRlYH0gZGlyZWN0aXZlIGFzIHdlbGwgYXNcbiAqIGB0ZW1wbGF0ZVVybGAncyBzcGVjaWZpZWQgYnkge0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS5cbiAqXG4gKiBCeSBkZWZhdWx0LCBBbmd1bGFyIG9ubHkgbG9hZHMgdGVtcGxhdGVzIGZyb20gdGhlIHNhbWUgZG9tYWluIGFuZCBwcm90b2NvbCBhcyB0aGUgYXBwbGljYXRpb25cbiAqIGRvY3VtZW50LiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsXG4gKiAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0gb24gdGhlIHRlbXBsYXRlIFVSTC4gIFRvIGxvYWQgdGVtcGxhdGVzIGZyb20gb3RoZXIgZG9tYWlucyBhbmQvb3JcbiAqIHByb3RvY29scywgeW91IG1heSBlaXRoZXIge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsV2hpdGVsaXN0IHdoaXRlbGlzdFxuICogdGhlbX0gb3Ige0BsaW5rIG5nLiRzY2UjdHJ1c3RBc1Jlc291cmNlVXJsIHdyYXAgaXR9IGludG8gYSB0cnVzdGVkIHZhbHVlLlxuICpcbiAqICpQbGVhc2Ugbm90ZSo6XG4gKiBUaGUgYnJvd3NlcidzXG4gKiBbU2FtZSBPcmlnaW4gUG9saWN5XShodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Jyb3dzZXJzZWMvd2lraS9QYXJ0MiNTYW1lLW9yaWdpbl9wb2xpY3lfZm9yX1hNTEh0dHBSZXF1ZXN0KVxuICogYW5kIFtDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUyldKGh0dHA6Ly93d3cudzMub3JnL1RSL2NvcnMvKVxuICogcG9saWN5IGFwcGx5IGluIGFkZGl0aW9uIHRvIHRoaXMgYW5kIG1heSBmdXJ0aGVyIHJlc3RyaWN0IHdoZXRoZXIgdGhlIHRlbXBsYXRlIGlzIHN1Y2Nlc3NmdWxseVxuICogbG9hZGVkLiAgVGhpcyBtZWFucyB0aGF0IHdpdGhvdXQgdGhlIHJpZ2h0IENPUlMgcG9saWN5LCBsb2FkaW5nIHRlbXBsYXRlcyBmcm9tIGEgZGlmZmVyZW50IGRvbWFpblxuICogd29uJ3Qgd29yayBvbiBhbGwgYnJvd3NlcnMuICBBbHNvLCBsb2FkaW5nIHRlbXBsYXRlcyBmcm9tIGBmaWxlOi8vYCBVUkwgZG9lcyBub3Qgd29yayBvbiBzb21lXG4gKiBicm93c2Vycy5cbiAqXG4gKiAjIyBUaGlzIGZlZWxzIGxpa2UgdG9vIG11Y2ggb3ZlcmhlYWRcbiAqXG4gKiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IFNDRSBvbmx5IGFwcGxpZXMgdG8gaW50ZXJwb2xhdGlvbiBleHByZXNzaW9ucy5cbiAqXG4gKiBJZiB5b3VyIGV4cHJlc3Npb25zIGFyZSBjb25zdGFudCBsaXRlcmFscywgdGhleSdyZSBhdXRvbWF0aWNhbGx5IHRydXN0ZWQgYW5kIHlvdSBkb24ndCBuZWVkIHRvXG4gKiBjYWxsIGAkc2NlLnRydXN0QXNgIG9uIHRoZW0gKHJlbWVtYmVyIHRvIGluY2x1ZGUgdGhlIGBuZ1Nhbml0aXplYCBtb2R1bGUpIChlLmcuXG4gKiBgPGRpdiBuZy1iaW5kLWh0bWw9XCInPGI+aW1wbGljaXRseSB0cnVzdGVkPC9iPidcIj48L2Rpdj5gKSBqdXN0IHdvcmtzLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgYGFbaHJlZl1gIGFuZCBgaW1nW3NyY11gIGF1dG9tYXRpY2FsbHkgc2FuaXRpemUgdGhlaXIgVVJMcyBhbmQgZG8gbm90IHBhc3MgdGhlbVxuICogdGhyb3VnaCB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZH0uICBTQ0UgZG9lc24ndCBwbGF5IGEgcm9sZSBoZXJlLlxuICpcbiAqIFRoZSBpbmNsdWRlZCB7QGxpbmsgbmcuJHNjZURlbGVnYXRlICRzY2VEZWxlZ2F0ZX0gY29tZXMgd2l0aCBzYW5lIGRlZmF1bHRzIHRvIGFsbG93IHlvdSB0byBsb2FkXG4gKiB0ZW1wbGF0ZXMgaW4gYG5nLWluY2x1ZGVgIGZyb20geW91ciBhcHBsaWNhdGlvbidzIGRvbWFpbiB3aXRob3V0IGhhdmluZyB0byBldmVuIGtub3cgYWJvdXQgU0NFLlxuICogSXQgYmxvY2tzIGxvYWRpbmcgdGVtcGxhdGVzIGZyb20gb3RoZXIgZG9tYWlucyBvciBsb2FkaW5nIHRlbXBsYXRlcyBvdmVyIGh0dHAgZnJvbSBhbiBodHRwc1xuICogc2VydmVkIGRvY3VtZW50LiAgWW91IGNhbiBjaGFuZ2UgdGhlc2UgYnkgc2V0dGluZyB5b3VyIG93biBjdXN0b20ge0BsaW5rXG4gKiBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCB3aGl0ZWxpc3RzfSBhbmQge0BsaW5rXG4gKiBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybEJsYWNrbGlzdCBibGFja2xpc3RzfSBmb3IgbWF0Y2hpbmcgc3VjaCBVUkxzLlxuICpcbiAqIFRoaXMgc2lnbmlmaWNhbnRseSByZWR1Y2VzIHRoZSBvdmVyaGVhZC4gIEl0IGlzIGZhciBlYXNpZXIgdG8gcGF5IHRoZSBzbWFsbCBvdmVyaGVhZCBhbmQgaGF2ZSBhblxuICogYXBwbGljYXRpb24gdGhhdCdzIHNlY3VyZSBhbmQgY2FuIGJlIGF1ZGl0ZWQgdG8gdmVyaWZ5IHRoYXQgd2l0aCBtdWNoIG1vcmUgZWFzZSB0aGFuIGJvbHRpbmdcbiAqIHNlY3VyaXR5IG9udG8gYW4gYXBwbGljYXRpb24gbGF0ZXIuXG4gKlxuICogPGEgbmFtZT1cImNvbnRleHRzXCI+PC9hPlxuICogIyMgV2hhdCB0cnVzdGVkIGNvbnRleHQgdHlwZXMgYXJlIHN1cHBvcnRlZD9cbiAqXG4gKiB8IENvbnRleHQgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IGAkc2NlLkhUTUxgICAgICAgICAgfCBGb3IgSFRNTCB0aGF0J3Mgc2FmZSB0byBzb3VyY2UgaW50byB0aGUgYXBwbGljYXRpb24uICBUaGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0JpbmRIdG1sIG5nQmluZEh0bWx9IGRpcmVjdGl2ZSB1c2VzIHRoaXMgY29udGV4dCBmb3IgYmluZGluZ3MuIElmIGFuIHVuc2FmZSB2YWx1ZSBpcyBlbmNvdW50ZXJlZCBhbmQgdGhlIHtAbGluayBuZ1Nhbml0aXplICRzYW5pdGl6ZX0gbW9kdWxlIGlzIHByZXNlbnQgdGhpcyB3aWxsIHNhbml0aXplIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLiB8XG4gKiB8IGAkc2NlLkNTU2AgICAgICAgICAgfCBGb3IgQ1NTIHRoYXQncyBzYWZlIHRvIHNvdXJjZSBpbnRvIHRoZSBhcHBsaWNhdGlvbi4gIEN1cnJlbnRseSB1bnVzZWQuICBGZWVsIGZyZWUgdG8gdXNlIGl0IGluIHlvdXIgb3duIGRpcmVjdGl2ZXMuIHxcbiAqIHwgYCRzY2UuVVJMYCAgICAgICAgICB8IEZvciBVUkxzIHRoYXQgYXJlIHNhZmUgdG8gZm9sbG93IGFzIGxpbmtzLiAgQ3VycmVudGx5IHVudXNlZCAoYDxhIGhyZWY9YCBhbmQgYDxpbWcgc3JjPWAgc2FuaXRpemUgdGhlaXIgdXJscyBhbmQgZG9uJ3QgY29uc3RpdHV0ZSBhbiBTQ0UgY29udGV4dC4gfFxuICogfCBgJHNjZS5SRVNPVVJDRV9VUkxgIHwgRm9yIFVSTHMgdGhhdCBhcmUgbm90IG9ubHkgc2FmZSB0byBmb2xsb3cgYXMgbGlua3MsIGJ1dCB3aG9zZSBjb250ZW50cyBhcmUgYWxzbyBzYWZlIHRvIGluY2x1ZGUgaW4geW91ciBhcHBsaWNhdGlvbi4gIEV4YW1wbGVzIGluY2x1ZGUgYG5nLWluY2x1ZGVgLCBgc3JjYCAvIGBuZ1NyY2AgYmluZGluZ3MgZm9yIHRhZ3Mgb3RoZXIgdGhhbiBgSU1HYCwgYFZJREVPYCwgYEFVRElPYCwgYFNPVVJDRWAsIGFuZCBgVFJBQ0tgIChlLmcuIGBJRlJBTUVgLCBgT0JKRUNUYCwgZXRjLikgIDxicj48YnI+Tm90ZSB0aGF0IGAkc2NlLlJFU09VUkNFX1VSTGAgbWFrZXMgYSBzdHJvbmdlciBzdGF0ZW1lbnQgYWJvdXQgdGhlIFVSTCB0aGFuIGAkc2NlLlVSTGAgZG9lcyBhbmQgdGhlcmVmb3JlIGNvbnRleHRzIHJlcXVpcmluZyB2YWx1ZXMgdHJ1c3RlZCBmb3IgYCRzY2UuUkVTT1VSQ0VfVVJMYCBjYW4gYmUgdXNlZCBhbnl3aGVyZSB0aGF0IHZhbHVlcyB0cnVzdGVkIGZvciBgJHNjZS5VUkxgIGFyZSByZXF1aXJlZC4gfFxuICogfCBgJHNjZS5KU2AgICAgICAgICAgIHwgRm9yIEphdmFTY3JpcHQgdGhhdCBpcyBzYWZlIHRvIGV4ZWN1dGUgaW4geW91ciBhcHBsaWNhdGlvbidzIGNvbnRleHQuICBDdXJyZW50bHkgdW51c2VkLiAgRmVlbCBmcmVlIHRvIHVzZSBpdCBpbiB5b3VyIG93biBkaXJlY3RpdmVzLiB8XG4gKlxuICogIyMgRm9ybWF0IG9mIGl0ZW1zIGluIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCByZXNvdXJjZVVybFdoaXRlbGlzdH0ve0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZVByb3ZpZGVyI3Jlc291cmNlVXJsQmxhY2tsaXN0IEJsYWNrbGlzdH0gPGEgbmFtZT1cInJlc291cmNlVXJsUGF0dGVybkl0ZW1cIj48L2E+XG4gKlxuICogIEVhY2ggZWxlbWVudCBpbiB0aGVzZSBhcnJheXMgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgLSAqKidzZWxmJyoqXG4gKiAgICAtIFRoZSBzcGVjaWFsICoqc3RyaW5nKiosIGAnc2VsZidgLCBjYW4gYmUgdXNlZCB0byBtYXRjaCBhZ2FpbnN0IGFsbCBVUkxzIG9mIHRoZSAqKnNhbWVcbiAqICAgICAgZG9tYWluKiogYXMgdGhlIGFwcGxpY2F0aW9uIGRvY3VtZW50IHVzaW5nIHRoZSAqKnNhbWUgcHJvdG9jb2wqKi5cbiAqICAtICoqU3RyaW5nKiogKGV4Y2VwdCB0aGUgc3BlY2lhbCB2YWx1ZSBgJ3NlbGYnYClcbiAqICAgIC0gVGhlIHN0cmluZyBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGZ1bGwgKm5vcm1hbGl6ZWQgLyBhYnNvbHV0ZSBVUkwqIG9mIHRoZSByZXNvdXJjZVxuICogICAgICBiZWluZyB0ZXN0ZWQgKHN1YnN0cmluZyBtYXRjaGVzIGFyZSBub3QgZ29vZCBlbm91Z2guKVxuICogICAgLSBUaGVyZSBhcmUgZXhhY3RseSAqKnR3byB3aWxkY2FyZCBzZXF1ZW5jZXMqKiAtIGAqYCBhbmQgYCoqYC4gIEFsbCBvdGhlciBjaGFyYWN0ZXJzXG4gKiAgICAgIG1hdGNoIHRoZW1zZWx2ZXMuXG4gKiAgICAtIGAqYDogbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgYW55IGNoYXJhY3RlciBvdGhlciB0aGFuIG9uZSBvZiB0aGUgZm9sbG93aW5nIDZcbiAqICAgICAgY2hhcmFjdGVyczogJ2A6YCcsICdgL2AnLCAnYC5gJywgJ2A/YCcsICdgJmAnIGFuZCAnYDtgJy4gIEl0J3MgYSB1c2VmdWwgd2lsZGNhcmQgZm9yIHVzZVxuICogICAgICBpbiBhIHdoaXRlbGlzdC5cbiAqICAgIC0gYCoqYDogbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgKmFueSogY2hhcmFjdGVyLiAgQXMgc3VjaCwgaXQncyBub3RcbiAqICAgICAgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBhIHNjaGVtZSwgZG9tYWluLCBldGMuIGFzIGl0IHdvdWxkIG1hdGNoIHRvbyBtdWNoLiAgKGUuZy5cbiAqICAgICAgaHR0cDovLyoqLmV4YW1wbGUuY29tLyB3b3VsZCBtYXRjaCBodHRwOi8vZXZpbC5jb20vP2lnbm9yZT0uZXhhbXBsZS5jb20vIGFuZCB0aGF0IG1pZ2h0XG4gKiAgICAgIG5vdCBoYXZlIGJlZW4gdGhlIGludGVudGlvbi4pICBJdHMgdXNhZ2UgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBwYXRoIGlzIG9rLiAgKGUuZy5cbiAqICAgICAgaHR0cDovL2Zvby5leGFtcGxlLmNvbS90ZW1wbGF0ZXMvKiopLlxuICogIC0gKipSZWdFeHAqKiAoKnNlZSBjYXZlYXQgYmVsb3cqKVxuICogICAgLSAqQ2F2ZWF0KjogIFdoaWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHBvd2VyZnVsIGFuZCBvZmZlciBncmVhdCBmbGV4aWJpbGl0eSwgIHRoZWlyIHN5bnRheFxuICogICAgICAoYW5kIGFsbCB0aGUgaW5ldml0YWJsZSBlc2NhcGluZykgbWFrZXMgdGhlbSAqaGFyZGVyIHRvIG1haW50YWluKi4gIEl0J3MgZWFzeSB0b1xuICogICAgICBhY2NpZGVudGFsbHkgaW50cm9kdWNlIGEgYnVnIHdoZW4gb25lIHVwZGF0ZXMgYSBjb21wbGV4IGV4cHJlc3Npb24gKGltaG8sIGFsbCByZWdleGVzIHNob3VsZFxuICogICAgICBoYXZlIGdvb2QgdGVzdCBjb3ZlcmFnZSkuICBGb3IgaW5zdGFuY2UsIHRoZSB1c2Ugb2YgYC5gIGluIHRoZSByZWdleCBpcyBjb3JyZWN0IG9ubHkgaW4gYVxuICogICAgICBzbWFsbCBudW1iZXIgb2YgY2FzZXMuICBBIGAuYCBjaGFyYWN0ZXIgaW4gdGhlIHJlZ2V4IHVzZWQgd2hlbiBtYXRjaGluZyB0aGUgc2NoZW1lIG9yIGFcbiAqICAgICAgc3ViZG9tYWluIGNvdWxkIGJlIG1hdGNoZWQgYWdhaW5zdCBhIGA6YCBvciBsaXRlcmFsIGAuYCB0aGF0IHdhcyBsaWtlbHkgbm90IGludGVuZGVkLiAgIEl0XG4gKiAgICAgIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIHN0cmluZyBwYXR0ZXJucyBhbmQgb25seSBmYWxsIGJhY2sgdG8gcmVndWxhciBleHByZXNzaW9uc1xuICogICAgICBhcyBhIGxhc3QgcmVzb3J0LlxuICogICAgLSBUaGUgcmVndWxhciBleHByZXNzaW9uIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUmVnRXhwIChpLmUuIG5vdCBhIHN0cmluZy4pICBJdCBpc1xuICogICAgICBtYXRjaGVkIGFnYWluc3QgdGhlICoqZW50aXJlKiogKm5vcm1hbGl6ZWQgLyBhYnNvbHV0ZSBVUkwqIG9mIHRoZSByZXNvdXJjZSBiZWluZyB0ZXN0ZWRcbiAqICAgICAgKGV2ZW4gd2hlbiB0aGUgUmVnRXhwIGRpZCBub3QgaGF2ZSB0aGUgYF5gIGFuZCBgJGAgY29kZXMuKSAgSW4gYWRkaXRpb24sIGFueSBmbGFnc1xuICogICAgICBwcmVzZW50IG9uIHRoZSBSZWdFeHAgKHN1Y2ggYXMgbXVsdGlsaW5lLCBnbG9iYWwsIGlnbm9yZUNhc2UpIGFyZSBpZ25vcmVkLlxuICogICAgLSBJZiB5b3UgYXJlIGdlbmVyYXRpbmcgeW91ciBKYXZhU2NyaXB0IGZyb20gc29tZSBvdGhlciB0ZW1wbGF0aW5nIGVuZ2luZSAobm90XG4gKiAgICAgIHJlY29tbWVuZGVkLCBlLmcuIGluIGlzc3VlIFsjNDAwNl0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9pc3N1ZXMvNDAwNikpLFxuICogICAgICByZW1lbWJlciB0byBlc2NhcGUgeW91ciByZWd1bGFyIGV4cHJlc3Npb24gKGFuZCBiZSBhd2FyZSB0aGF0IHlvdSBtaWdodCBuZWVkIG1vcmUgdGhhblxuICogICAgICBvbmUgbGV2ZWwgb2YgZXNjYXBpbmcgZGVwZW5kaW5nIG9uIHlvdXIgdGVtcGxhdGluZyBlbmdpbmUgYW5kIHRoZSB3YXkgeW91IGludGVycG9sYXRlZFxuICogICAgICB0aGUgdmFsdWUuKSAgRG8gbWFrZSB1c2Ugb2YgeW91ciBwbGF0Zm9ybSdzIGVzY2FwaW5nIG1lY2hhbmlzbSBhcyBpdCBtaWdodCBiZSBnb29kXG4gKiAgICAgIGVub3VnaCBiZWZvcmUgY29kaW5nIHlvdXIgb3duLiAgRS5nLiBSdWJ5IGhhc1xuICogICAgICBbUmVnZXhwLmVzY2FwZShzdHIpXShodHRwOi8vd3d3LnJ1YnktZG9jLm9yZy9jb3JlLTIuMC4wL1JlZ2V4cC5odG1sI21ldGhvZC1jLWVzY2FwZSlcbiAqICAgICAgYW5kIFB5dGhvbiBoYXMgW3JlLmVzY2FwZV0oaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3JlLmh0bWwjcmUuZXNjYXBlKS5cbiAqICAgICAgSmF2YXNjcmlwdCBsYWNrcyBhIHNpbWlsYXIgYnVpbHQgaW4gZnVuY3Rpb24gZm9yIGVzY2FwaW5nLiAgVGFrZSBhIGxvb2sgYXQgR29vZ2xlXG4gKiAgICAgIENsb3N1cmUgbGlicmFyeSdzIFtnb29nLnN0cmluZy5yZWdFeHBFc2NhcGUocyldKFxuICogICAgICBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19zdHJpbmdfc3RyaW5nLmpzLnNvdXJjZS5odG1sI2xpbmU5NjIpLlxuICpcbiAqIFJlZmVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciAkc2NlRGVsZWdhdGVQcm92aWRlcn0gZm9yIGFuIGV4YW1wbGUuXG4gKlxuICogIyMgU2hvdyBtZSBhbiBleGFtcGxlIHVzaW5nIFNDRS5cbiAqXG4gKiA8ZXhhbXBsZSBtb2R1bGU9XCJteVNjZUFwcFwiIGRlcHM9XCJhbmd1bGFyLXNhbml0aXplLmpzXCIgbmFtZT1cInNjZS1zZXJ2aWNlXCI+XG4gKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJBcHBDb250cm9sbGVyIGFzIG15Q3RybFwiPlxuICogICAgIDxpIG5nLWJpbmQtaHRtbD1cIm15Q3RybC5leHBsaWNpdGx5VHJ1c3RlZEh0bWxcIiBpZD1cImV4cGxpY2l0bHlUcnVzdGVkSHRtbFwiPjwvaT48YnI+PGJyPlxuICogICAgIDxiPlVzZXIgY29tbWVudHM8L2I+PGJyPlxuICogICAgIEJ5IGRlZmF1bHQsIEhUTUwgdGhhdCBpc24ndCBleHBsaWNpdGx5IHRydXN0ZWQgKGUuZy4gQWxpY2UncyBjb21tZW50KSBpcyBzYW5pdGl6ZWQgd2hlblxuICogICAgICRzYW5pdGl6ZSBpcyBhdmFpbGFibGUuICBJZiAkc2FuaXRpemUgaXNuJ3QgYXZhaWxhYmxlLCB0aGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IgaW5zdGVhZCBvZiBhblxuICogICAgIGV4cGxvaXQuXG4gKiAgICAgPGRpdiBjbGFzcz1cIndlbGxcIj5cbiAqICAgICAgIDxkaXYgbmctcmVwZWF0PVwidXNlckNvbW1lbnQgaW4gbXlDdHJsLnVzZXJDb21tZW50c1wiPlxuICogICAgICAgICA8Yj57e3VzZXJDb21tZW50Lm5hbWV9fTwvYj46XG4gKiAgICAgICAgIDxzcGFuIG5nLWJpbmQtaHRtbD1cInVzZXJDb21tZW50Lmh0bWxDb21tZW50XCIgY2xhc3M9XCJodG1sQ29tbWVudFwiPjwvc3Bhbj5cbiAqICAgICAgICAgPGJyPlxuICogICAgICAgPC9kaXY+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZGl2PlxuICogPC9maWxlPlxuICpcbiAqIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAqICAgYW5ndWxhci5tb2R1bGUoJ215U2NlQXBwJywgWyduZ1Nhbml0aXplJ10pXG4gKiAgICAgLmNvbnRyb2xsZXIoJ0FwcENvbnRyb2xsZXInLCBbJyRodHRwJywgJyR0ZW1wbGF0ZUNhY2hlJywgJyRzY2UnLFxuICogICAgICAgZnVuY3Rpb24gQXBwQ29udHJvbGxlcigkaHR0cCwgJHRlbXBsYXRlQ2FjaGUsICRzY2UpIHtcbiAqICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICogICAgICAgICAkaHR0cC5nZXQoJ3Rlc3RfZGF0YS5qc29uJywge2NhY2hlOiAkdGVtcGxhdGVDYWNoZX0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAqICAgICAgICAgICBzZWxmLnVzZXJDb21tZW50cyA9IHJlc3BvbnNlLmRhdGE7XG4gKiAgICAgICAgIH0pO1xuICogICAgICAgICBzZWxmLmV4cGxpY2l0bHlUcnVzdGVkSHRtbCA9ICRzY2UudHJ1c3RBc0h0bWwoXG4gKiAgICAgICAgICAgICAnPHNwYW4gb25tb3VzZW92ZXI9XCJ0aGlzLnRleHRDb250ZW50PSZxdW90O0V4cGxpY2l0bHkgdHJ1c3RlZCBIVE1MIGJ5cGFzc2VzICcgK1xuICogICAgICAgICAgICAgJ3Nhbml0aXphdGlvbi4mcXVvdDtcIj5Ib3ZlciBvdmVyIHRoaXMgdGV4dC48L3NwYW4+Jyk7XG4gKiAgICAgICB9XSk7XG4gKiA8L2ZpbGU+XG4gKlxuICogPGZpbGUgbmFtZT1cInRlc3RfZGF0YS5qc29uXCI+XG4gKiBbXG4gKiAgIHsgXCJuYW1lXCI6IFwiQWxpY2VcIixcbiAqICAgICBcImh0bWxDb21tZW50XCI6XG4gKiAgICAgICAgIFwiPHNwYW4gb25tb3VzZW92ZXI9J3RoaXMudGV4dENvbnRlbnQ9XFxcIlBXTjNEIVxcXCInPklzIDxpPmFueW9uZTwvaT4gcmVhZGluZyB0aGlzPzwvc3Bhbj5cIlxuICogICB9LFxuICogICB7IFwibmFtZVwiOiBcIkJvYlwiLFxuICogICAgIFwiaHRtbENvbW1lbnRcIjogXCI8aT5ZZXMhPC9pPiAgQW0gSSB0aGUgb25seSBvdGhlciBvbmU/XCJcbiAqICAgfVxuICogXVxuICogPC9maWxlPlxuICpcbiAqIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAqICAgZGVzY3JpYmUoJ1NDRSBkb2MgZGVtbycsIGZ1bmN0aW9uKCkge1xuICogICAgIGl0KCdzaG91bGQgc2FuaXRpemUgdW50cnVzdGVkIHZhbHVlcycsIGZ1bmN0aW9uKCkge1xuICogICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnLmh0bWxDb21tZW50JykpLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdpbm5lckhUTUwnKSlcbiAqICAgICAgICAgICAudG9CZSgnPHNwYW4+SXMgPGk+YW55b25lPC9pPiByZWFkaW5nIHRoaXM/PC9zcGFuPicpO1xuICogICAgIH0pO1xuICpcbiAqICAgICBpdCgnc2hvdWxkIE5PVCBzYW5pdGl6ZSBleHBsaWNpdGx5IHRydXN0ZWQgdmFsdWVzJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZXhwbGljaXRseVRydXN0ZWRIdG1sJykpLmdldEF0dHJpYnV0ZSgnaW5uZXJIVE1MJykpLnRvQmUoXG4gKiAgICAgICAgICAgJzxzcGFuIG9ubW91c2VvdmVyPVwidGhpcy50ZXh0Q29udGVudD0mcXVvdDtFeHBsaWNpdGx5IHRydXN0ZWQgSFRNTCBieXBhc3NlcyAnICtcbiAqICAgICAgICAgICAnc2FuaXRpemF0aW9uLiZxdW90O1wiPkhvdmVyIG92ZXIgdGhpcyB0ZXh0Ljwvc3Bhbj4nKTtcbiAqICAgICB9KTtcbiAqICAgfSk7XG4gKiA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICpcbiAqXG4gKiAjIyBDYW4gSSBkaXNhYmxlIFNDRSBjb21wbGV0ZWx5P1xuICpcbiAqIFllcywgeW91IGNhbi4gIEhvd2V2ZXIsIHRoaXMgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuICBTQ0UgZ2l2ZXMgeW91IGEgbG90IG9mIHNlY3VyaXR5IGJlbmVmaXRzXG4gKiBmb3IgbGl0dGxlIGNvZGluZyBvdmVyaGVhZC4gIEl0IHdpbGwgYmUgbXVjaCBoYXJkZXIgdG8gdGFrZSBhbiBTQ0UgZGlzYWJsZWQgYXBwbGljYXRpb24gYW5kXG4gKiBlaXRoZXIgc2VjdXJlIGl0IG9uIHlvdXIgb3duIG9yIGVuYWJsZSBTQ0UgYXQgYSBsYXRlciBzdGFnZS4gIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gZGlzYWJsZSBTQ0VcbiAqIGZvciBjYXNlcyB3aGVyZSB5b3UgaGF2ZSBhIGxvdCBvZiBleGlzdGluZyBjb2RlIHRoYXQgd2FzIHdyaXR0ZW4gYmVmb3JlIFNDRSB3YXMgaW50cm9kdWNlZCBhbmRcbiAqIHlvdSdyZSBtaWdyYXRpbmcgdGhlbSBhIG1vZHVsZSBhdCBhIHRpbWUuXG4gKlxuICogVGhhdCBzYWlkLCBoZXJlJ3MgaG93IHlvdSBjYW4gY29tcGxldGVseSBkaXNhYmxlIFNDRTpcbiAqXG4gKiBgYGBcbiAqIGFuZ3VsYXIubW9kdWxlKCdteUFwcFdpdGhTY2VEaXNhYmxlZG15QXBwJywgW10pLmNvbmZpZyhmdW5jdGlvbigkc2NlUHJvdmlkZXIpIHtcbiAqICAgLy8gQ29tcGxldGVseSBkaXNhYmxlIFNDRS4gIEZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIG9ubHkhXG4gKiAgIC8vIERvIG5vdCB1c2UgaW4gbmV3IHByb2plY3RzLlxuICogICAkc2NlUHJvdmlkZXIuZW5hYmxlZChmYWxzZSk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqL1xuXG5mdW5jdGlvbiAkU2NlUHJvdmlkZXIoKSB7XG4gIHZhciBlbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkc2NlUHJvdmlkZXIjZW5hYmxlZFxuICAgKiBAa2luZCBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB2YWx1ZSBJZiBwcm92aWRlZCwgdGhlbiBlbmFibGVzL2Rpc2FibGVzIFNDRS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBTQ0UgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcy9kaXNhYmxlcyBTQ0UgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAqL1xuICB0aGlzLmVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBlbmFibGVkID0gISF2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVuYWJsZWQ7XG4gIH07XG5cblxuICAvKiBEZXNpZ24gbm90ZXMgb24gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIFNDRS5cbiAgICpcbiAgICogVGhlIEFQSSBjb250cmFjdCBmb3IgdGhlIFNDRSBkZWxlZ2F0ZVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIFRoZSBTQ0UgZGVsZWdhdGUgb2JqZWN0IG11c3QgcHJvdmlkZSB0aGUgZm9sbG93aW5nIDMgbWV0aG9kczpcbiAgICpcbiAgICogLSB0cnVzdEFzKGNvbnRleHRFbnVtLCB2YWx1ZSlcbiAgICogICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdGVsbCB0aGUgU0NFIHNlcnZpY2UgdGhhdCB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgT0sgdG8gdXNlIGluIHRoZVxuICAgKiAgICAgY29udGV4dHMgc3BlY2lmaWVkIGJ5IGNvbnRleHRFbnVtLiAgSXQgbXVzdCByZXR1cm4gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBieVxuICAgKiAgICAgZ2V0VHJ1c3RlZCgpIGZvciBhIGNvbXBhdGlibGUgY29udGV4dEVudW0gYW5kIHJldHVybiB0aGlzIHZhbHVlLlxuICAgKlxuICAgKiAtIHZhbHVlT2YodmFsdWUpXG4gICAqICAgICBGb3IgdmFsdWVzIHRoYXQgd2VyZSBub3QgcHJvZHVjZWQgYnkgdHJ1c3RBcygpLCByZXR1cm4gdGhlbSBhcyBpcy4gIEZvciB2YWx1ZXMgdGhhdCB3ZXJlXG4gICAqICAgICBwcm9kdWNlZCBieSB0cnVzdEFzKCksIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCB2YWx1ZSB0byB0cnVzdEFzLiAgQmFzaWNhbGx5LCBpZlxuICAgKiAgICAgdHJ1c3RBcyBpcyB3cmFwcGluZyB0aGUgZ2l2ZW4gdmFsdWVzIGludG8gc29tZSB0eXBlLCB0aGlzIG9wZXJhdGlvbiB1bndyYXBzIGl0IHdoZW4gZ2l2ZW5cbiAgICogICAgIHN1Y2ggYSB2YWx1ZS5cbiAgICpcbiAgICogLSBnZXRUcnVzdGVkKGNvbnRleHRFbnVtLCB2YWx1ZSlcbiAgICogICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgYSB2YWx1ZSB0aGF0IGlzIHNhZmUgdG8gdXNlIGluIHRoZSBjb250ZXh0IHNwZWNpZmllZCBieVxuICAgKiAgICAgY29udGV4dEVudW0gb3IgdGhyb3cgYW5kIGV4Y2VwdGlvbiBvdGhlcndpc2UuXG4gICAqXG4gICAqIE5PVEU6IFRoaXMgY29udHJhY3QgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHN0YXRlIHRoYXQgdmFsdWVzIHJldHVybmVkIGJ5IHRydXN0QXMoKSBtdXN0IGJlXG4gICAqIG9wYXF1ZSBvciB3cmFwcGVkIGluIHNvbWUgaG9sZGVyIG9iamVjdC4gIFRoYXQgaGFwcGVucyB0byBiZSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBGb3JcbiAgICogaW5zdGFuY2UsIGFuIGltcGxlbWVudGF0aW9uIGNvdWxkIG1haW50YWluIGEgcmVnaXN0cnkgb2YgYWxsIHRydXN0ZWQgb2JqZWN0cyBieSBjb250ZXh0LiAgSW5cbiAgICogc3VjaCBhIGNhc2UsIHRydXN0QXMoKSB3b3VsZCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBpbi4gIGdldFRydXN0ZWQoKSB3b3VsZFxuICAgKiByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IHBhc3NlZCBpbiBpZiBpdCB3YXMgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5IHVuZGVyIGEgY29tcGF0aWJsZSBjb250ZXh0IG9yXG4gICAqIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2UuICBBbiBpbXBsZW1lbnRhdGlvbiBtaWdodCBvbmx5IHdyYXAgdmFsdWVzIHNvbWUgb2YgdGhlIHRpbWUgYmFzZWRcbiAgICogb24gc29tZSBjcml0ZXJpYS4gIGdldFRydXN0ZWQoKSBtaWdodCByZXR1cm4gYSB2YWx1ZSBhbmQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBmb3Igc3BlY2lhbFxuICAgKiBjb25zdGFudHMgb3Igb2JqZWN0cyBldmVuIGlmIG5vdCB3cmFwcGVkLiAgQWxsIHN1Y2ggaW1wbGVtZW50YXRpb25zIGZ1bGZpbGwgdGhpcyBjb250cmFjdC5cbiAgICpcbiAgICpcbiAgICogQSBub3RlIG9uIHRoZSBpbmhlcml0YW5jZSBtb2RlbCBmb3IgU0NFIGNvbnRleHRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBJJ3ZlIHVzZWQgaW5oZXJpdGFuY2UgYW5kIG1hZGUgUkVTT1VSQ0VfVVJMIHdyYXBwZWQgdHlwZXMgYSBzdWJ0eXBlIG9mIFVSTCB3cmFwcGVkIHR5cGVzLiAgVGhpc1xuICAgKiBpcyBwdXJlbHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbiAgICpcbiAgICogVGhlIGNvbnRyYWN0IGlzIHNpbXBseSB0aGlzOlxuICAgKlxuICAgKiAgICAgZ2V0VHJ1c3RlZCgkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpIHN1Y2NlZWRpbmcgaW1wbGllcyB0aGF0IGdldFRydXN0ZWQoJHNjZS5VUkwsIHZhbHVlKVxuICAgKiAgICAgd2lsbCBhbHNvIHN1Y2NlZWQuXG4gICAqXG4gICAqIEluaGVyaXRhbmNlIGhhcHBlbnMgdG8gY2FwdHVyZSB0aGlzIGluIGEgbmF0dXJhbCB3YXkuICBJbiBzb21lIGZ1dHVyZSwgd2VcbiAgICogbWF5IG5vdCB1c2UgaW5oZXJpdGFuY2UgYW55bW9yZS4gIFRoYXQgaXMgT0sgYmVjYXVzZSBubyBjb2RlIG91dHNpZGUgb2ZcbiAgICogc2NlLmpzIGFuZCBzY2VTcGVjcy5qcyB3b3VsZCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgZGV0YWlsLlxuICAgKi9cblxuICB0aGlzLiRnZXQgPSBbJyRwYXJzZScsICckc2NlRGVsZWdhdGUnLCBmdW5jdGlvbihcbiAgICAgICAgICAgICAgICAkcGFyc2UsICAgJHNjZURlbGVnYXRlKSB7XG4gICAgLy8gU3VwcG9ydDogSUUgOS0xMSBvbmx5XG4gICAgLy8gUHJlcmVxOiBFbnN1cmUgdGhhdCB3ZSdyZSBub3QgcnVubmluZyBpbiBJRTwxMSBxdWlya3MgbW9kZS4gIEluIHRoYXQgbW9kZSwgSUUgPCAxMSBhbGxvd1xuICAgIC8vIHRoZSBcImV4cHJlc3Npb24oamF2YXNjcmlwdCBleHByZXNzaW9uKVwiIHN5bnRheCB3aGljaCBpcyBpbnNlY3VyZS5cbiAgICBpZiAoZW5hYmxlZCAmJiBtc2llIDwgOCkge1xuICAgICAgdGhyb3cgJHNjZU1pbkVycignaWVxdWlya3MnLFxuICAgICAgICAnU3RyaWN0IENvbnRleHR1YWwgRXNjYXBpbmcgZG9lcyBub3Qgc3VwcG9ydCBJbnRlcm5ldCBFeHBsb3JlciB2ZXJzaW9uIDwgMTEgaW4gcXVpcmtzICcgK1xuICAgICAgICAnbW9kZS4gIFlvdSBjYW4gZml4IHRoaXMgYnkgYWRkaW5nIHRoZSB0ZXh0IDwhZG9jdHlwZSBodG1sPiB0byB0aGUgdG9wIG9mIHlvdXIgSFRNTCAnICtcbiAgICAgICAgJ2RvY3VtZW50LiAgU2VlIGh0dHA6Ly9kb2NzLmFuZ3VsYXJqcy5vcmcvYXBpL25nLiRzY2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgdmFyIHNjZSA9IHNoYWxsb3dDb3B5KFNDRV9DT05URVhUUyk7XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNpc0VuYWJsZWRcbiAgICAgKiBAa2luZCBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBTQ0UgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLiAgSWYgeW91IHdhbnQgdG8gc2V0IHRoZSB2YWx1ZSwgeW91XG4gICAgICogaGF2ZSB0byBkbyBpdCBhdCBtb2R1bGUgY29uZmlnIHRpbWUgb24ge0BsaW5rIG5nLiRzY2VQcm92aWRlciAkc2NlUHJvdmlkZXJ9LlxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBTQ0UgaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBzY2UuaXNFbmFibGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZW5hYmxlZDtcbiAgICB9O1xuICAgIHNjZS50cnVzdEFzID0gJHNjZURlbGVnYXRlLnRydXN0QXM7XG4gICAgc2NlLmdldFRydXN0ZWQgPSAkc2NlRGVsZWdhdGUuZ2V0VHJ1c3RlZDtcbiAgICBzY2UudmFsdWVPZiA9ICRzY2VEZWxlZ2F0ZS52YWx1ZU9mO1xuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICBzY2UudHJ1c3RBcyA9IHNjZS5nZXRUcnVzdGVkID0gZnVuY3Rpb24odHlwZSwgdmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuICAgICAgc2NlLnZhbHVlT2YgPSBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBDb252ZXJ0cyBBbmd1bGFyIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGludG8gYSBmdW5jdGlvbi4gIFRoaXMgaXMgbGlrZSB7QGxpbmtcbiAgICAgKiBuZy4kcGFyc2UgJHBhcnNlfSBhbmQgaXMgaWRlbnRpY2FsIHdoZW4gdGhlIGV4cHJlc3Npb24gaXMgYSBsaXRlcmFsIGNvbnN0YW50LiAgT3RoZXJ3aXNlLCBpdFxuICAgICAqIHdyYXBzIHRoZSBleHByZXNzaW9uIGluIGEgY2FsbCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkICRzY2UuZ2V0VHJ1c3RlZCgqdHlwZSosXG4gICAgICogKnJlc3VsdCopfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGtpbmQgb2YgU0NFIGNvbnRleHQgaW4gd2hpY2ggdGhpcyByZXN1bHQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjpcbiAgICAgKlxuICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3NcbiAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS5cbiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gICAgICogICAgICBgY29udGV4dGAuXG4gICAgICovXG4gICAgc2NlLnBhcnNlQXMgPSBmdW5jdGlvbiBzY2VQYXJzZUFzKHR5cGUsIGV4cHIpIHtcbiAgICAgIHZhciBwYXJzZWQgPSAkcGFyc2UoZXhwcik7XG4gICAgICBpZiAocGFyc2VkLmxpdGVyYWwgJiYgcGFyc2VkLmNvbnN0YW50KSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJHBhcnNlKGV4cHIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHNjZS5nZXRUcnVzdGVkKHR5cGUsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI3RydXN0QXMgYCRzY2VEZWxlZ2F0ZS50cnVzdEFzYH0uICBBcyBzdWNoLFxuICAgICAqIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaXMgdHJ1c3RlZCBieSBhbmd1bGFyIGZvciB1c2UgaW4gc3BlY2lmaWVkIHN0cmljdCBjb250ZXh0dWFsXG4gICAgICogZXNjYXBpbmcgY29udGV4dHMgKHN1Y2ggYXMgbmctYmluZC1odG1sLCBuZy1pbmNsdWRlLCBhbnkgc3JjIGF0dHJpYnV0ZVxuICAgICAqIGludGVycG9sYXRpb24sIGFueSBkb20gZXZlbnQgYmluZGluZyBhdHRyaWJ1dGUgaW50ZXJwb2xhdGlvbiBzdWNoIGFzIGZvciBvbmNsaWNrLCAgZXRjLilcbiAgICAgKiB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIHZhbHVlLiAgU2VlICoge0BsaW5rIG5nLiRzY2UgJHNjZX0gZm9yIGVuYWJsaW5nIHN0cmljdCBjb250ZXh0dWFsXG4gICAgICogZXNjYXBpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgc2FmZSBmb3IgdXNlLiAgZS5nLiB1cmwsXG4gICAgICogICByZXNvdXJjZVVybCwgaHRtbCwganMgYW5kIGNzcy5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdHJ1c3RlZC9zYWZlLlxuICAgICAqIEByZXR1cm5zIHsqfSBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RhbmQgaW4gZm9yIHRoZSBwcm92aWRlZCBgdmFsdWVgIGluIHBsYWNlc1xuICAgICAqIHdoZXJlIEFuZ3VsYXIgZXhwZWN0cyBhICRzY2UudHJ1c3RBcygpIHJldHVybiB2YWx1ZS5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNIdG1sXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UudHJ1c3RBc0h0bWwodmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLkhUTUwsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLlxuICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRIdG1sXG4gICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZEh0bWwodmFsdWUpfSB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIHZhbHVlLiAgKHByaXZpbGVnZWQgZGlyZWN0aXZlc1xuICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZVxuICAgICAqICAgICByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LilcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3RydXN0QXNVcmxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzVXJsKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjdHJ1c3RBcyBgJHNjZURlbGVnYXRlLnRydXN0QXMoJHNjZS5VUkwsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB0cnVzdEFzLlxuICAgICAqIEByZXR1cm5zIHsqfSBBbiBvYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBuZy4kc2NlI2dldFRydXN0ZWRVcmxcbiAgICAgKiAgICAgJHNjZS5nZXRUcnVzdGVkVXJsKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXNcbiAgICAgKiAgICAgb25seSBhY2NlcHQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgZWl0aGVyIGxpdGVyYWwgY29uc3RhbnRzIG9yIGFyZSB0aGVcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfS4pXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSN0cnVzdEFzUmVzb3VyY2VVcmxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRydXN0QXMuXG4gICAgICogQHJldHVybnMgeyp9IEFuIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIG5nLiRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsXG4gICAgICogICAgICRzY2UuZ2V0VHJ1c3RlZFJlc291cmNlVXJsKHZhbHVlKX0gdG8gb2J0YWluIHRoZSBvcmlnaW5hbCB2YWx1ZS4gIChwcml2aWxlZ2VkIGRpcmVjdGl2ZXNcbiAgICAgKiAgICAgb25seSBhY2NlcHQgZXhwcmVzc2lvbnMgdGhhdCBhcmUgZWl0aGVyIGxpdGVyYWwgY29uc3RhbnRzIG9yIGFyZSB0aGUgcmV0dXJuXG4gICAgICogICAgIHZhbHVlIG9mIHtAbGluayBuZy4kc2NlI3RydXN0QXMgJHNjZS50cnVzdEFzfS4pXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSN0cnVzdEFzSnNcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS50cnVzdEFzSnModmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2VEZWxlZ2F0ZSN0cnVzdEFzIGAkc2NlRGVsZWdhdGUudHJ1c3RBcygkc2NlLkpTLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJ1c3RBcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB7QGxpbmsgbmcuJHNjZSNnZXRUcnVzdGVkSnNcbiAgICAgKiAgICAgJHNjZS5nZXRUcnVzdGVkSnModmFsdWUpfSB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIHZhbHVlLiAgKHByaXZpbGVnZWQgZGlyZWN0aXZlc1xuICAgICAqICAgICBvbmx5IGFjY2VwdCBleHByZXNzaW9ucyB0aGF0IGFyZSBlaXRoZXIgbGl0ZXJhbCBjb25zdGFudHMgb3IgYXJlIHRoZVxuICAgICAqICAgICByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyAkc2NlLnRydXN0QXN9LilcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkYH0uICBBcyBzdWNoLFxuICAgICAqIHRha2VzIHRoZSByZXN1bHQgb2YgYSB7QGxpbmsgbmcuJHNjZSN0cnVzdEFzIGAkc2NlLnRydXN0QXNgfSgpIGNhbGwgYW5kIHJldHVybnMgdGhlXG4gICAgICogb3JpZ2luYWxseSBzdXBwbGllZCB2YWx1ZSBpZiB0aGUgcXVlcmllZCBjb250ZXh0IHR5cGUgaXMgYSBzdXBlcnR5cGUgb2YgdGhlIGNyZWF0ZWQgdHlwZS5cbiAgICAgKiBJZiB0aGlzIGNvbmRpdGlvbiBpc24ndCBzYXRpc2ZpZWQsIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUga2luZCBvZiBjb250ZXh0IGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgdG8gYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0geyp9IG1heWJlVHJ1c3RlZCBUaGUgcmVzdWx0IG9mIGEgcHJpb3Ige0BsaW5rIG5nLiRzY2UjdHJ1c3RBcyBgJHNjZS50cnVzdEFzYH1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhlIHdhcyBvcmlnaW5hbGx5IHByb3ZpZGVkIHRvXG4gICAgICogICAgICAgICAgICAgIHtAbGluayBuZy4kc2NlI3RydXN0QXMgYCRzY2UudHJ1c3RBc2B9IGlmIHZhbGlkIGluIHRoaXMgY29udGV4dC5cbiAgICAgKiAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjZ2V0VHJ1c3RlZEh0bWxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkSHRtbCh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuSFRNTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBhc3MgdG8gYCRzY2UuZ2V0VHJ1c3RlZGAuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgYCRzY2UuZ2V0VHJ1c3RlZCgkc2NlLkhUTUwsIHZhbHVlKWBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRDc3NcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkQ3NzKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5DU1MsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5DU1MsIHZhbHVlKWBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRVcmxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5nZXRUcnVzdGVkVXJsKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlRGVsZWdhdGUjZ2V0VHJ1c3RlZCBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWQoJHNjZS5VUkwsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5VUkwsIHZhbHVlKWBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRSZXNvdXJjZVVybFxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybCh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuUkVTT1VSQ0VfVVJMLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFzcyB0byBgJHNjZURlbGVnYXRlLmdldFRydXN0ZWRgLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5SRVNPVVJDRV9VUkwsIHZhbHVlKWBcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI2dldFRydXN0ZWRKc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRoYW5kIG1ldGhvZC4gIGAkc2NlLmdldFRydXN0ZWRKcyh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZURlbGVnYXRlI2dldFRydXN0ZWQgYCRzY2VEZWxlZ2F0ZS5nZXRUcnVzdGVkKCRzY2UuSlMsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXNzIHRvIGAkc2NlLmdldFRydXN0ZWRgLlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcmV0dXJuIHZhbHVlIG9mIGAkc2NlLmdldFRydXN0ZWQoJHNjZS5KUywgdmFsdWUpYFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc0h0bWxcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzSHRtbChleHByZXNzaW9uIHN0cmluZylgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5IVE1MLCB2YWx1ZSlgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gU3RyaW5nIGV4cHJlc3Npb24gdG8gY29tcGlsZS5cbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24oY29udGV4dCwgbG9jYWxzKX0gYSBmdW5jdGlvbiB3aGljaCByZXByZXNlbnRzIHRoZSBjb21waWxlZCBleHByZXNzaW9uOlxuICAgICAqXG4gICAgICogICAgKiBgY29udGV4dGAg4oCTIGB7b2JqZWN0fWAg4oCTIGFuIG9iamVjdCBhZ2FpbnN0IHdoaWNoIGFueSBleHByZXNzaW9ucyBlbWJlZGRlZCBpbiB0aGUgc3RyaW5nc1xuICAgICAqICAgICAgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0ICh0eXBpY2FsbHkgYSBzY29wZSBvYmplY3QpLlxuICAgICAqICAgICogYGxvY2Fsc2Ag4oCTIGB7b2JqZWN0PX1gIOKAkyBsb2NhbCB2YXJpYWJsZXMgY29udGV4dCBvYmplY3QsIHVzZWZ1bCBmb3Igb3ZlcnJpZGluZyB2YWx1ZXMgaW5cbiAgICAgKiAgICAgIGBjb250ZXh0YC5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBtZXRob2RcbiAgICAgKiBAbmFtZSAkc2NlI3BhcnNlQXNDc3NcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzQ3NzKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLkNTUywgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjpcbiAgICAgKlxuICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3NcbiAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS5cbiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gICAgICogICAgICBgY29udGV4dGAuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzVXJsXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc1VybCh2YWx1ZSlgIOKGklxuICAgICAqICAgICB7QGxpbmsgbmcuJHNjZSNwYXJzZUFzIGAkc2NlLnBhcnNlQXMoJHNjZS5VUkwsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLlxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246XG4gICAgICpcbiAgICAgKiAgICAqIGBjb250ZXh0YCDigJMgYHtvYmplY3R9YCDigJMgYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzXG4gICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuXG4gICAgICogICAgKiBgbG9jYWxzYCDigJMgYHtvYmplY3Q9fWAg4oCTIGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpblxuICAgICAqICAgICAgYGNvbnRleHRgLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG5nZG9jIG1ldGhvZFxuICAgICAqIEBuYW1lICRzY2UjcGFyc2VBc1Jlc291cmNlVXJsXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTaG9ydGhhbmQgbWV0aG9kLiAgYCRzY2UucGFyc2VBc1Jlc291cmNlVXJsKHZhbHVlKWAg4oaSXG4gICAgICogICAgIHtAbGluayBuZy4kc2NlI3BhcnNlQXMgYCRzY2UucGFyc2VBcygkc2NlLlJFU09VUkNFX1VSTCwgdmFsdWUpYH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFN0cmluZyBleHByZXNzaW9uIHRvIGNvbXBpbGUuXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQsIGxvY2Fscyl9IGEgZnVuY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbjpcbiAgICAgKlxuICAgICAqICAgICogYGNvbnRleHRgIOKAkyBge29iamVjdH1gIOKAkyBhbiBvYmplY3QgYWdhaW5zdCB3aGljaCBhbnkgZXhwcmVzc2lvbnMgZW1iZWRkZWQgaW4gdGhlIHN0cmluZ3NcbiAgICAgKiAgICAgIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCAodHlwaWNhbGx5IGEgc2NvcGUgb2JqZWN0KS5cbiAgICAgKiAgICAqIGBsb2NhbHNgIOKAkyBge29iamVjdD19YCDigJMgbG9jYWwgdmFyaWFibGVzIGNvbnRleHQgb2JqZWN0LCB1c2VmdWwgZm9yIG92ZXJyaWRpbmcgdmFsdWVzIGluXG4gICAgICogICAgICBgY29udGV4dGAuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICogQG5hbWUgJHNjZSNwYXJzZUFzSnNcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0aGFuZCBtZXRob2QuICBgJHNjZS5wYXJzZUFzSnModmFsdWUpYCDihpJcbiAgICAgKiAgICAge0BsaW5rIG5nLiRzY2UjcGFyc2VBcyBgJHNjZS5wYXJzZUFzKCRzY2UuSlMsIHZhbHVlKWB9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBTdHJpbmcgZXhwcmVzc2lvbiB0byBjb21waWxlLlxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihjb250ZXh0LCBsb2NhbHMpfSBhIGZ1bmN0aW9uIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb246XG4gICAgICpcbiAgICAgKiAgICAqIGBjb250ZXh0YCDigJMgYHtvYmplY3R9YCDigJMgYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzXG4gICAgICogICAgICBhcmUgZXZhbHVhdGVkIGFnYWluc3QgKHR5cGljYWxseSBhIHNjb3BlIG9iamVjdCkuXG4gICAgICogICAgKiBgbG9jYWxzYCDigJMgYHtvYmplY3Q9fWAg4oCTIGxvY2FsIHZhcmlhYmxlcyBjb250ZXh0IG9iamVjdCwgdXNlZnVsIGZvciBvdmVycmlkaW5nIHZhbHVlcyBpblxuICAgICAqICAgICAgYGNvbnRleHRgLlxuICAgICAqL1xuXG4gICAgLy8gU2hvcnRoYW5kIGRlbGVnYXRpb25zLlxuICAgIHZhciBwYXJzZSA9IHNjZS5wYXJzZUFzLFxuICAgICAgICBnZXRUcnVzdGVkID0gc2NlLmdldFRydXN0ZWQsXG4gICAgICAgIHRydXN0QXMgPSBzY2UudHJ1c3RBcztcblxuICAgIGZvckVhY2goU0NFX0NPTlRFWFRTLCBmdW5jdGlvbihlbnVtVmFsdWUsIG5hbWUpIHtcbiAgICAgIHZhciBsTmFtZSA9IGxvd2VyY2FzZShuYW1lKTtcbiAgICAgIHNjZVtzbmFrZVRvQ2FtZWwoJ3BhcnNlX2FzXycgKyBsTmFtZSldID0gZnVuY3Rpb24oZXhwcikge1xuICAgICAgICByZXR1cm4gcGFyc2UoZW51bVZhbHVlLCBleHByKTtcbiAgICAgIH07XG4gICAgICBzY2Vbc25ha2VUb0NhbWVsKCdnZXRfdHJ1c3RlZF8nICsgbE5hbWUpXSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBnZXRUcnVzdGVkKGVudW1WYWx1ZSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIHNjZVtzbmFrZVRvQ2FtZWwoJ3RydXN0X2FzXycgKyBsTmFtZSldID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRydXN0QXMoZW51bVZhbHVlLCB2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNjZTtcbiAgfV07XG59XG5cbi8qIGV4cG9ydGVkICRTbmlmZmVyUHJvdmlkZXIgKi9cblxuLyoqXG4gKiAhISEgVGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQgXCJwcml2YXRlXCIgc2VydmljZSAhISFcbiAqXG4gKiBAbmFtZSAkc25pZmZlclxuICogQHJlcXVpcmVzICR3aW5kb3dcbiAqIEByZXF1aXJlcyAkZG9jdW1lbnRcbiAqIEB0aGlzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBoaXN0b3J5IERvZXMgdGhlIGJyb3dzZXIgc3VwcG9ydCBodG1sNSBoaXN0b3J5IGFwaSA/XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRyYW5zaXRpb25zIERvZXMgdGhlIGJyb3dzZXIgc3VwcG9ydCBDU1MgdHJhbnNpdGlvbiBldmVudHMgP1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbmltYXRpb25zIERvZXMgdGhlIGJyb3dzZXIgc3VwcG9ydCBDU1MgYW5pbWF0aW9uIGV2ZW50cyA/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGlzIHZlcnkgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRlc3RpbmcgYnJvd3NlcidzIGZlYXR1cmVzLlxuICovXG5mdW5jdGlvbiAkU25pZmZlclByb3ZpZGVyKCkge1xuICB0aGlzLiRnZXQgPSBbJyR3aW5kb3cnLCAnJGRvY3VtZW50JywgZnVuY3Rpb24oJHdpbmRvdywgJGRvY3VtZW50KSB7XG4gICAgdmFyIGV2ZW50U3VwcG9ydCA9IHt9LFxuICAgICAgICAvLyBDaHJvbWUgUGFja2FnZWQgQXBwcyBhcmUgbm90IGFsbG93ZWQgdG8gYWNjZXNzIGBoaXN0b3J5LnB1c2hTdGF0ZWAuXG4gICAgICAgIC8vIElmIG5vdCBzYW5kYm94ZWQsIHRoZXkgY2FuIGJlIGRldGVjdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBgY2hyb21lLmFwcC5ydW50aW1lYFxuICAgICAgICAvLyAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vYXBwcy9hcGlfaW5kZXgpLiBJZiBzYW5kYm94ZWQsIHRoZXkgY2FuIGJlIGRldGVjdGVkIGJ5XG4gICAgICAgIC8vIHRoZSBwcmVzZW5jZSBvZiBhbiBleHRlbnNpb24gcnVudGltZSBJRCBhbmQgdGhlIGFic2VuY2Ugb2Ygb3RoZXIgQ2hyb21lIHJ1bnRpbWUgQVBJc1xuICAgICAgICAvLyAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vYXBwcy9tYW5pZmVzdC9zYW5kYm94KS5cbiAgICAgICAgaXNDaHJvbWVQYWNrYWdlZEFwcCA9XG4gICAgICAgICAgICAkd2luZG93LmNocm9tZSAmJlxuICAgICAgICAgICAgKCR3aW5kb3cuY2hyb21lLmFwcCAmJiAkd2luZG93LmNocm9tZS5hcHAucnVudGltZSB8fFxuICAgICAgICAgICAgICAgICEkd2luZG93LmNocm9tZS5hcHAgJiYgJHdpbmRvdy5jaHJvbWUucnVudGltZSAmJiAkd2luZG93LmNocm9tZS5ydW50aW1lLmlkKSxcbiAgICAgICAgaGFzSGlzdG9yeVB1c2hTdGF0ZSA9ICFpc0Nocm9tZVBhY2thZ2VkQXBwICYmICR3aW5kb3cuaGlzdG9yeSAmJiAkd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlLFxuICAgICAgICBhbmRyb2lkID1cbiAgICAgICAgICB0b0ludCgoL2FuZHJvaWQgKFxcZCspLy5leGVjKGxvd2VyY2FzZSgoJHdpbmRvdy5uYXZpZ2F0b3IgfHwge30pLnVzZXJBZ2VudCkpIHx8IFtdKVsxXSksXG4gICAgICAgIGJveGVlID0gL0JveGVlL2kudGVzdCgoJHdpbmRvdy5uYXZpZ2F0b3IgfHwge30pLnVzZXJBZ2VudCksXG4gICAgICAgIGRvY3VtZW50ID0gJGRvY3VtZW50WzBdIHx8IHt9LFxuICAgICAgICBib2R5U3R5bGUgPSBkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuc3R5bGUsXG4gICAgICAgIHRyYW5zaXRpb25zID0gZmFsc2UsXG4gICAgICAgIGFuaW1hdGlvbnMgPSBmYWxzZTtcblxuICAgIGlmIChib2R5U3R5bGUpIHtcbiAgICAgIC8vIFN1cHBvcnQ6IEFuZHJvaWQgPDUsIEJsYWNrYmVycnkgQnJvd3NlciAxMCwgZGVmYXVsdCBDaHJvbWUgaW4gQW5kcm9pZCA0LjQueFxuICAgICAgLy8gTWVudGlvbmVkIGJyb3dzZXJzIG5lZWQgYSAtd2Via2l0LSBwcmVmaXggZm9yIHRyYW5zaXRpb25zICYgYW5pbWF0aW9ucy5cbiAgICAgIHRyYW5zaXRpb25zID0gISEoJ3RyYW5zaXRpb24nIGluIGJvZHlTdHlsZSB8fCAnd2Via2l0VHJhbnNpdGlvbicgaW4gYm9keVN0eWxlKTtcbiAgICAgIGFuaW1hdGlvbnMgPSAhISgnYW5pbWF0aW9uJyBpbiBib2R5U3R5bGUgfHwgJ3dlYmtpdEFuaW1hdGlvbicgaW4gYm9keVN0eWxlKTtcbiAgICB9XG5cblxuICAgIHJldHVybiB7XG4gICAgICAvLyBBbmRyb2lkIGhhcyBoaXN0b3J5LnB1c2hTdGF0ZSwgYnV0IGl0IGRvZXMgbm90IHVwZGF0ZSBsb2NhdGlvbiBjb3JyZWN0bHlcbiAgICAgIC8vIHNvIGxldCdzIG5vdCB1c2UgdGhlIGhpc3RvcnkgQVBJIGF0IGFsbC5cbiAgICAgIC8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MTc0NzFcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzkwNFxuXG4gICAgICAvLyBvbGRlciB3ZWJraXQgYnJvd3NlciAoNTMzLjkpIG9uIEJveGVlIGJveCBoYXMgZXhhY3RseSB0aGUgc2FtZSBwcm9ibGVtIGFzIEFuZHJvaWQgaGFzXG4gICAgICAvLyBzbyBsZXQncyBub3QgdXNlIHRoZSBoaXN0b3J5IEFQSSBhbHNvXG4gICAgICAvLyBXZSBhcmUgcHVycG9zZWZ1bGx5IHVzaW5nIGAhKGFuZHJvaWQgPCA0KWAgdG8gY292ZXIgdGhlIGNhc2Ugd2hlbiBgYW5kcm9pZGAgaXMgdW5kZWZpbmVkXG4gICAgICBoaXN0b3J5OiAhIShoYXNIaXN0b3J5UHVzaFN0YXRlICYmICEoYW5kcm9pZCA8IDQpICYmICFib3hlZSksXG4gICAgICBoYXNFdmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOS0xMSBvbmx5XG4gICAgICAgIC8vIElFOSBpbXBsZW1lbnRzICdpbnB1dCcgZXZlbnQgaXQncyBzbyBmdWJhcmVkIHRoYXQgd2UgcmF0aGVyIHByZXRlbmQgdGhhdCBpdCBkb2Vzbid0IGhhdmVcbiAgICAgICAgLy8gaXQuIEluIHBhcnRpY3VsYXIgdGhlIGV2ZW50IGlzIG5vdCBmaXJlZCB3aGVuIGJhY2tzcGFjZSBvciBkZWxldGUga2V5IGFyZSBwcmVzc2VkIG9yXG4gICAgICAgIC8vIHdoZW4gY3V0IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAgICAgIC8vIElFMTArIGltcGxlbWVudHMgJ2lucHV0JyBldmVudCBidXQgaXQgZXJyb25lb3VzbHkgZmlyZXMgdW5kZXIgdmFyaW91cyBzaXR1YXRpb25zLFxuICAgICAgICAvLyBlLmcuIHdoZW4gcGxhY2Vob2xkZXIgY2hhbmdlcywgb3IgYSBmb3JtIGlzIGZvY3VzZWQuXG4gICAgICAgIGlmIChldmVudCA9PT0gJ2lucHV0JyAmJiBtc2llKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGV2ZW50U3VwcG9ydFtldmVudF0pKSB7XG4gICAgICAgICAgdmFyIGRpdkVsbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGV2ZW50U3VwcG9ydFtldmVudF0gPSAnb24nICsgZXZlbnQgaW4gZGl2RWxtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50U3VwcG9ydFtldmVudF07XG4gICAgICB9LFxuICAgICAgY3NwOiBjc3AoKSxcbiAgICAgIHRyYW5zaXRpb25zOiB0cmFuc2l0aW9ucyxcbiAgICAgIGFuaW1hdGlvbnM6IGFuaW1hdGlvbnMsXG4gICAgICBhbmRyb2lkOiBhbmRyb2lkXG4gICAgfTtcbiAgfV07XG59XG5cbnZhciAkdGVtcGxhdGVSZXF1ZXN0TWluRXJyID0gbWluRXJyKCckY29tcGlsZScpO1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJHRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyXG4gKiBAdGhpc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlZCB0byBjb25maWd1cmUgdGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgJGh0dHB9IHNlcnZpY2Ugd2hlbiBtYWtpbmcgYSB0ZW1wbGF0ZSByZXF1ZXN0LlxuICpcbiAqIEZvciBleGFtcGxlLCBpdCBjYW4gYmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgXCJBY2NlcHRcIiBoZWFkZXIgdGhhdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIsIHdoZW5cbiAqIHJlcXVlc3RpbmcgYSB0ZW1wbGF0ZS5cbiAqL1xuZnVuY3Rpb24gJFRlbXBsYXRlUmVxdWVzdFByb3ZpZGVyKCkge1xuXG4gIHZhciBodHRwT3B0aW9ucztcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSAkdGVtcGxhdGVSZXF1ZXN0UHJvdmlkZXIjaHR0cE9wdGlvbnNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byB0aGUge0BsaW5rICRodHRwfSBzZXJ2aWNlIHdoZW4gbWFraW5nIHRoZSByZXF1ZXN0LlxuICAgKiBZb3UgY2FuIHVzZSB0aGlzIHRvIG92ZXJyaWRlIG9wdGlvbnMgc3VjaCBhcyB0aGUgXCJBY2NlcHRcIiBoZWFkZXIgZm9yIHRlbXBsYXRlIHJlcXVlc3RzLlxuICAgKlxuICAgKiBUaGUge0BsaW5rICR0ZW1wbGF0ZVJlcXVlc3R9IHdpbGwgc2V0IHRoZSBgY2FjaGVgIGFuZCB0aGUgYHRyYW5zZm9ybVJlc3BvbnNlYCBwcm9wZXJ0aWVzIG9mIHRoZVxuICAgKiBvcHRpb25zIGlmIG5vdCBvdmVycmlkZGVuIGhlcmUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gdmFsdWUgbmV3IHZhbHVlIGZvciB0aGUge0BsaW5rICRodHRwfSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfHNlbGZ9IFJldHVybnMgdGhlIHtAbGluayAkaHR0cH0gb3B0aW9ucyB3aGVuIHVzZWQgYXMgZ2V0dGVyIGFuZCBzZWxmIGlmIHVzZWQgYXMgc2V0dGVyLlxuICAgKi9cbiAgdGhpcy5odHRwT3B0aW9ucyA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGh0dHBPcHRpb25zID0gdmFsO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBodHRwT3B0aW9ucztcbiAgfTtcblxuICAvKipcbiAgICogQG5nZG9jIHNlcnZpY2VcbiAgICogQG5hbWUgJHRlbXBsYXRlUmVxdWVzdFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIGAkdGVtcGxhdGVSZXF1ZXN0YCBzZXJ2aWNlIHJ1bnMgc2VjdXJpdHkgY2hlY2tzIHRoZW4gZG93bmxvYWRzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB1c2luZ1xuICAgKiBgJGh0dHBgIGFuZCwgdXBvbiBzdWNjZXNzLCBzdG9yZXMgdGhlIGNvbnRlbnRzIGluc2lkZSBvZiBgJHRlbXBsYXRlQ2FjaGVgLiBJZiB0aGUgSFRUUCByZXF1ZXN0XG4gICAqIGZhaWxzIG9yIHRoZSByZXNwb25zZSBkYXRhIG9mIHRoZSBIVFRQIHJlcXVlc3QgaXMgZW1wdHksIGEgYCRjb21waWxlYCBlcnJvciB3aWxsIGJlIHRocm93biAodGhlXG4gICAqIGV4Y2VwdGlvbiBjYW4gYmUgdGh3YXJ0ZWQgYnkgc2V0dGluZyB0aGUgMm5kIHBhcmFtZXRlciBvZiB0aGUgZnVuY3Rpb24gdG8gdHJ1ZSkuIE5vdGUgdGhhdCB0aGVcbiAgICogY29udGVudHMgb2YgYCR0ZW1wbGF0ZUNhY2hlYCBhcmUgdHJ1c3RlZCwgc28gdGhlIGNhbGwgdG8gYCRzY2UuZ2V0VHJ1c3RlZFVybCh0cGwpYCBpcyBvbWl0dGVkXG4gICAqIHdoZW4gYHRwbGAgaXMgb2YgdHlwZSBzdHJpbmcgYW5kIGAkdGVtcGxhdGVDYWNoZWAgaGFzIHRoZSBtYXRjaGluZyBlbnRyeS5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gcGFzcyBjdXN0b20gb3B0aW9ucyB0byB0aGUgYCRodHRwYCBzZXJ2aWNlLCBzdWNoIGFzIHNldHRpbmcgdGhlIEFjY2VwdCBoZWFkZXIgeW91XG4gICAqIGNhbiBjb25maWd1cmUgdGhpcyB2aWEge0BsaW5rICR0ZW1wbGF0ZVJlcXVlc3RQcm92aWRlciNodHRwT3B0aW9uc30uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfFRydXN0ZWRSZXNvdXJjZVVybH0gdHBsIFRoZSBIVFRQIHJlcXVlc3QgdGVtcGxhdGUgVVJMXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGlnbm9yZVJlcXVlc3RFcnJvciBXaGV0aGVyIG9yIG5vdCB0byBpZ25vcmUgdGhlIGV4Y2VwdGlvbiB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzIG9yIHRoZSB0ZW1wbGF0ZSBpcyBlbXB0eVxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGRhdGEgb2YgdGhlIGdpdmVuIFVSTC5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHRvdGFsUGVuZGluZ1JlcXVlc3RzIHRvdGFsIGFtb3VudCBvZiBwZW5kaW5nIHRlbXBsYXRlIHJlcXVlc3RzIGJlaW5nIGRvd25sb2FkZWQuXG4gICAqL1xuICB0aGlzLiRnZXQgPSBbJyRleGNlcHRpb25IYW5kbGVyJywgJyR0ZW1wbGF0ZUNhY2hlJywgJyRodHRwJywgJyRxJywgJyRzY2UnLFxuICAgIGZ1bmN0aW9uKCRleGNlcHRpb25IYW5kbGVyLCAkdGVtcGxhdGVDYWNoZSwgJGh0dHAsICRxLCAkc2NlKSB7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3RGbih0cGwsIGlnbm9yZVJlcXVlc3RFcnJvcikge1xuICAgICAgICBoYW5kbGVSZXF1ZXN0Rm4udG90YWxQZW5kaW5nUmVxdWVzdHMrKztcblxuICAgICAgICAvLyBXZSBjb25zaWRlciB0aGUgdGVtcGxhdGUgY2FjaGUgaG9sZHMgb25seSB0cnVzdGVkIHRlbXBsYXRlcywgc29cbiAgICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIGdvIHRocm91Z2ggd2hpdGVsaXN0aW5nIGFnYWluIGZvciBrZXlzIHRoYXQgYWxyZWFkeVxuICAgICAgICAvLyBhcmUgaW5jbHVkZWQgaW4gdGhlcmUuIFRoaXMgYWxzbyBtYWtlcyBBbmd1bGFyIGFjY2VwdCBhbnkgc2NyaXB0XG4gICAgICAgIC8vIGRpcmVjdGl2ZSwgbm8gbWF0dGVyIGl0cyBuYW1lLiBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIHVud3JhcCB0cnVzdGVkXG4gICAgICAgIC8vIHR5cGVzLlxuICAgICAgICBpZiAoIWlzU3RyaW5nKHRwbCkgfHwgaXNVbmRlZmluZWQoJHRlbXBsYXRlQ2FjaGUuZ2V0KHRwbCkpKSB7XG4gICAgICAgICAgdHBsID0gJHNjZS5nZXRUcnVzdGVkUmVzb3VyY2VVcmwodHBsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0cmFuc2Zvcm1SZXNwb25zZSA9ICRodHRwLmRlZmF1bHRzICYmICRodHRwLmRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlO1xuXG4gICAgICAgIGlmIChpc0FycmF5KHRyYW5zZm9ybVJlc3BvbnNlKSkge1xuICAgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlID0gdHJhbnNmb3JtUmVzcG9uc2UuZmlsdGVyKGZ1bmN0aW9uKHRyYW5zZm9ybWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIgIT09IGRlZmF1bHRIdHRwUmVzcG9uc2VUcmFuc2Zvcm07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtUmVzcG9uc2UgPT09IGRlZmF1bHRIdHRwUmVzcG9uc2VUcmFuc2Zvcm0pIHtcbiAgICAgICAgICB0cmFuc2Zvcm1SZXNwb25zZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJGh0dHAuZ2V0KHRwbCwgZXh0ZW5kKHtcbiAgICAgICAgICAgIGNhY2hlOiAkdGVtcGxhdGVDYWNoZSxcbiAgICAgICAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiB0cmFuc2Zvcm1SZXNwb25zZVxuICAgICAgICAgIH0sIGh0dHBPcHRpb25zKSlcbiAgICAgICAgICAuZmluYWxseShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGhhbmRsZVJlcXVlc3RGbi50b3RhbFBlbmRpbmdSZXF1ZXN0cy0tO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICR0ZW1wbGF0ZUNhY2hlLnB1dCh0cGwsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZUVycm9yKHJlc3ApIHtcbiAgICAgICAgICBpZiAoIWlnbm9yZVJlcXVlc3RFcnJvcikge1xuICAgICAgICAgICAgcmVzcCA9ICR0ZW1wbGF0ZVJlcXVlc3RNaW5FcnIoJ3RwbG9hZCcsXG4gICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIHRlbXBsYXRlOiB7MH0gKEhUVFAgc3RhdHVzOiB7MX0gezJ9KScsXG4gICAgICAgICAgICAgICAgdHBsLCByZXNwLnN0YXR1cywgcmVzcC5zdGF0dXNUZXh0KTtcblxuICAgICAgICAgICAgJGV4Y2VwdGlvbkhhbmRsZXIocmVzcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICRxLnJlamVjdChyZXNwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVSZXF1ZXN0Rm4udG90YWxQZW5kaW5nUmVxdWVzdHMgPSAwO1xuXG4gICAgICByZXR1cm4gaGFuZGxlUmVxdWVzdEZuO1xuICAgIH1cbiAgXTtcbn1cblxuLyoqIEB0aGlzICovXG5mdW5jdGlvbiAkJFRlc3RhYmlsaXR5UHJvdmlkZXIoKSB7XG4gIHRoaXMuJGdldCA9IFsnJHJvb3RTY29wZScsICckYnJvd3NlcicsICckbG9jYXRpb24nLFxuICAgICAgIGZ1bmN0aW9uKCRyb290U2NvcGUsICAgJGJyb3dzZXIsICAgJGxvY2F0aW9uKSB7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSAkdGVzdGFiaWxpdHlcbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFRoZSBwcml2YXRlICQkdGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgbWV0aG9kcyBmb3IgdXNlIHdoZW4gZGVidWdnaW5nXG4gICAgICogb3IgYnkgYXV0b21hdGVkIHRlc3QgYW5kIGRlYnVnZ2luZyB0b29scy5cbiAgICAgKi9cbiAgICB2YXIgdGVzdGFiaWxpdHkgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjZmluZEJpbmRpbmdzXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIGJvdW5kICh2aWEgbmctYmluZCBvciB7e319KVxuICAgICAqIHRvIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoZSBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCByb290IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRfZXhhY3RNYXRjaCBJZiB0cnVlLCBvbmx5IHJldHVybnMgZXhhY3QgbWF0Y2hlc1xuICAgICAqICAgICBmb3IgdGhlIGV4cHJlc3Npb24uIEZpbHRlcnMgYW5kIHdoaXRlc3BhY2UgYXJlIGlnbm9yZWQuXG4gICAgICovXG4gICAgdGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzID0gZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgb3B0X2V4YWN0TWF0Y2gpIHtcbiAgICAgIHZhciBiaW5kaW5ncyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbmctYmluZGluZycpO1xuICAgICAgdmFyIG1hdGNoZXMgPSBbXTtcbiAgICAgIGZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHtcbiAgICAgICAgdmFyIGRhdGFCaW5kaW5nID0gYW5ndWxhci5lbGVtZW50KGJpbmRpbmcpLmRhdGEoJyRiaW5kaW5nJyk7XG4gICAgICAgIGlmIChkYXRhQmluZGluZykge1xuICAgICAgICAgIGZvckVhY2goZGF0YUJpbmRpbmcsIGZ1bmN0aW9uKGJpbmRpbmdOYW1lKSB7XG4gICAgICAgICAgICBpZiAob3B0X2V4YWN0TWF0Y2gpIHtcbiAgICAgICAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgUmVnRXhwKCcoXnxcXFxccyknICsgZXNjYXBlRm9yUmVnZXhwKGV4cHJlc3Npb24pICsgJyhcXFxcc3xcXFxcfHwkKScpO1xuICAgICAgICAgICAgICBpZiAobWF0Y2hlci50ZXN0KGJpbmRpbmdOYW1lKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChiaW5kaW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGJpbmRpbmdOYW1lLmluZGV4T2YoZXhwcmVzc2lvbikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGJpbmRpbmcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjZmluZE1vZGVsc1xuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB0d28td2F5IGZvdW5kIHZpYSBuZy1tb2RlbCB0b1xuICAgICAqIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoZSBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCByb290IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBtb2RlbCBleHByZXNzaW9uIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0X2V4YWN0TWF0Y2ggSWYgdHJ1ZSwgb25seSByZXR1cm5zIGV4YWN0IG1hdGNoZXNcbiAgICAgKiAgICAgZm9yIHRoZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIHRlc3RhYmlsaXR5LmZpbmRNb2RlbHMgPSBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBvcHRfZXhhY3RNYXRjaCkge1xuICAgICAgdmFyIHByZWZpeGVzID0gWyduZy0nLCAnZGF0YS1uZy0nLCAnbmdcXFxcOiddO1xuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwcmVmaXhlcy5sZW5ndGg7ICsrcCkge1xuICAgICAgICB2YXIgYXR0cmlidXRlRXF1YWxzID0gb3B0X2V4YWN0TWF0Y2ggPyAnPScgOiAnKj0nO1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSAnWycgKyBwcmVmaXhlc1twXSArICdtb2RlbCcgKyBhdHRyaWJ1dGVFcXVhbHMgKyAnXCInICsgZXhwcmVzc2lvbiArICdcIl0nO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjZ2V0TG9jYXRpb25cbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNob3J0Y3V0IGZvciBnZXR0aW5nIHRoZSBsb2NhdGlvbiBpbiBhIGJyb3dzZXIgYWdub3N0aWMgd2F5LiBSZXR1cm5zXG4gICAgICogICAgIHRoZSBwYXRoLCBzZWFyY2gsIGFuZCBoYXNoLiAoZS5nLiAvcGF0aD9hPWIjaGFzaClcbiAgICAgKi9cbiAgICB0ZXN0YWJpbGl0eS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICRsb2NhdGlvbi51cmwoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgJCR0ZXN0YWJpbGl0eSNzZXRMb2NhdGlvblxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2hvcnRjdXQgZm9yIG5hdmlnYXRpbmcgdG8gYSBsb2NhdGlvbiB3aXRob3V0IGRvaW5nIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGxvY2F0aW9uIHVybCAocGF0aCwgc2VhcmNoIGFuZCBoYXNoLFxuICAgICAqICAgICBlLmcuIC9wYXRoP2E9YiNoYXNoKSB0byBnbyB0by5cbiAgICAgKi9cbiAgICB0ZXN0YWJpbGl0eS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uKHVybCkge1xuICAgICAgaWYgKHVybCAhPT0gJGxvY2F0aW9uLnVybCgpKSB7XG4gICAgICAgICRsb2NhdGlvbi51cmwodXJsKTtcbiAgICAgICAgJHJvb3RTY29wZS4kZGlnZXN0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lICQkdGVzdGFiaWxpdHkjd2hlblN0YWJsZVxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIHdoZW4gJHRpbWVvdXQgYW5kICRodHRwIHJlcXVlc3RzIGFyZSBjb21wbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqL1xuICAgIHRlc3RhYmlsaXR5LndoZW5TdGFibGUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgJGJyb3dzZXIubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyhjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIHJldHVybiB0ZXN0YWJpbGl0eTtcbiAgfV07XG59XG5cbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJFRpbWVvdXRQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gWyckcm9vdFNjb3BlJywgJyRicm93c2VyJywgJyRxJywgJyQkcScsICckZXhjZXB0aW9uSGFuZGxlcicsXG4gICAgICAgZnVuY3Rpb24oJHJvb3RTY29wZSwgICAkYnJvd3NlciwgICAkcSwgICAkJHEsICAgJGV4Y2VwdGlvbkhhbmRsZXIpIHtcblxuICAgIHZhciBkZWZlcnJlZHMgPSB7fTtcblxuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2Mgc2VydmljZVxuICAgICAgKiBAbmFtZSAkdGltZW91dFxuICAgICAgKlxuICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICogQW5ndWxhcidzIHdyYXBwZXIgZm9yIGB3aW5kb3cuc2V0VGltZW91dGAuIFRoZSBgZm5gIGZ1bmN0aW9uIGlzIHdyYXBwZWQgaW50byBhIHRyeS9jYXRjaFxuICAgICAgKiBibG9jayBhbmQgZGVsZWdhdGVzIGFueSBleGNlcHRpb25zIHRvXG4gICAgICAqIHtAbGluayBuZy4kZXhjZXB0aW9uSGFuZGxlciAkZXhjZXB0aW9uSGFuZGxlcn0gc2VydmljZS5cbiAgICAgICpcbiAgICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiBjYWxsaW5nIGAkdGltZW91dGAgaXMgYSBwcm9taXNlLCB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHdoZW5cbiAgICAgICogdGhlIGRlbGF5IGhhcyBwYXNzZWQgYW5kIHRoZSB0aW1lb3V0IGZ1bmN0aW9uLCBpZiBwcm92aWRlZCwgaXMgZXhlY3V0ZWQuXG4gICAgICAqXG4gICAgICAqIFRvIGNhbmNlbCBhIHRpbWVvdXQgcmVxdWVzdCwgY2FsbCBgJHRpbWVvdXQuY2FuY2VsKHByb21pc2UpYC5cbiAgICAgICpcbiAgICAgICogSW4gdGVzdHMgeW91IGNhbiB1c2Uge0BsaW5rIG5nTW9jay4kdGltZW91dCBgJHRpbWVvdXQuZmx1c2goKWB9IHRvXG4gICAgICAqIHN5bmNocm9ub3VzbHkgZmx1c2ggdGhlIHF1ZXVlIG9mIGRlZmVycmVkIGZ1bmN0aW9ucy5cbiAgICAgICpcbiAgICAgICogSWYgeW91IG9ubHkgd2FudCBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIGFmdGVyIHNvbWUgc3BlY2lmaWVkIGRlbGF5XG4gICAgICAqIHRoZW4geW91IGNhbiBjYWxsIGAkdGltZW91dGAgd2l0aG91dCB0aGUgYGZuYCBmdW5jdGlvbi5cbiAgICAgICpcbiAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpPX0gZm4gQSBmdW5jdGlvbiwgd2hvc2UgZXhlY3V0aW9uIHNob3VsZCBiZSBkZWxheWVkLlxuICAgICAgKiBAcGFyYW0ge251bWJlcj19IFtkZWxheT0wXSBEZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtpbnZva2VBcHBseT10cnVlXSBJZiBzZXQgdG8gYGZhbHNlYCBza2lwcyBtb2RlbCBkaXJ0eSBjaGVja2luZywgb3RoZXJ3aXNlXG4gICAgICAqICAgd2lsbCBpbnZva2UgYGZuYCB3aXRoaW4gdGhlIHtAbGluayBuZy4kcm9vdFNjb3BlLlNjb3BlIyRhcHBseSAkYXBwbHl9IGJsb2NrLlxuICAgICAgKiBAcGFyYW0gey4uLio9fSBQYXNzIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgZXhlY3V0ZWQgZnVuY3Rpb24uXG4gICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuIFRoZSBwcm9taXNlXG4gICAgICAqICAgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGBmbmAgZnVuY3Rpb24uXG4gICAgICAqXG4gICAgICAqL1xuICAgIGZ1bmN0aW9uIHRpbWVvdXQoZm4sIGRlbGF5LCBpbnZva2VBcHBseSkge1xuICAgICAgaWYgKCFpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICBpbnZva2VBcHBseSA9IGRlbGF5O1xuICAgICAgICBkZWxheSA9IGZuO1xuICAgICAgICBmbiA9IG5vb3A7XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmdzID0gc2xpY2VBcmdzKGFyZ3VtZW50cywgMyksXG4gICAgICAgICAgc2tpcEFwcGx5ID0gKGlzRGVmaW5lZChpbnZva2VBcHBseSkgJiYgIWludm9rZUFwcGx5KSxcbiAgICAgICAgICBkZWZlcnJlZCA9IChza2lwQXBwbHkgPyAkJHEgOiAkcSkuZGVmZXIoKSxcbiAgICAgICAgICBwcm9taXNlID0gZGVmZXJyZWQucHJvbWlzZSxcbiAgICAgICAgICB0aW1lb3V0SWQ7XG5cbiAgICAgIHRpbWVvdXRJZCA9ICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZm4uYXBwbHkobnVsbCwgYXJncykpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpO1xuICAgICAgICAgICRleGNlcHRpb25IYW5kbGVyKGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGRlbGV0ZSBkZWZlcnJlZHNbcHJvbWlzZS4kJHRpbWVvdXRJZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNraXBBcHBseSkgJHJvb3RTY29wZS4kYXBwbHkoKTtcbiAgICAgIH0sIGRlbGF5KTtcblxuICAgICAgcHJvbWlzZS4kJHRpbWVvdXRJZCA9IHRpbWVvdXRJZDtcbiAgICAgIGRlZmVycmVkc1t0aW1lb3V0SWRdID0gZGVmZXJyZWQ7XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuXG4gICAgIC8qKlxuICAgICAgKiBAbmdkb2MgbWV0aG9kXG4gICAgICAqIEBuYW1lICR0aW1lb3V0I2NhbmNlbFxuICAgICAgKlxuICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICogQ2FuY2VscyBhIHRhc2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBgcHJvbWlzZWAuIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHRoZSBwcm9taXNlIHdpbGwgYmVcbiAgICAgICogcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi5cbiAgICAgICpcbiAgICAgICogQHBhcmFtIHtQcm9taXNlPX0gcHJvbWlzZSBQcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgJHRpbWVvdXRgIGZ1bmN0aW9uLlxuICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHRhc2sgaGFzbid0IGV4ZWN1dGVkIHlldCBhbmQgd2FzIHN1Y2Nlc3NmdWxseVxuICAgICAgKiAgIGNhbmNlbGVkLlxuICAgICAgKi9cbiAgICB0aW1lb3V0LmNhbmNlbCA9IGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlICYmIHByb21pc2UuJCR0aW1lb3V0SWQgaW4gZGVmZXJyZWRzKSB7XG4gICAgICAgIC8vIFRpbWVvdXQgY2FuY2VscyBzaG91bGQgbm90IHJlcG9ydCBhbiB1bmhhbmRsZWQgcHJvbWlzZS5cbiAgICAgICAgZGVmZXJyZWRzW3Byb21pc2UuJCR0aW1lb3V0SWRdLnByb21pc2UuY2F0Y2gobm9vcCk7XG4gICAgICAgIGRlZmVycmVkc1twcm9taXNlLiQkdGltZW91dElkXS5yZWplY3QoJ2NhbmNlbGVkJyk7XG4gICAgICAgIGRlbGV0ZSBkZWZlcnJlZHNbcHJvbWlzZS4kJHRpbWVvdXRJZF07XG4gICAgICAgIHJldHVybiAkYnJvd3Nlci5kZWZlci5jYW5jZWwocHJvbWlzZS4kJHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHJldHVybiB0aW1lb3V0O1xuICB9XTtcbn1cblxuLy8gTk9URTogIFRoZSB1c2FnZSBvZiB3aW5kb3cgYW5kIGRvY3VtZW50IGluc3RlYWQgb2YgJHdpbmRvdyBhbmQgJGRvY3VtZW50IGhlcmUgaXNcbi8vIGRlbGliZXJhdGUuICBUaGlzIHNlcnZpY2UgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgYmVoYXZpb3Igb2YgYW5jaG9yIG5vZGVzIGNyZWF0ZWQgYnkgdGhlXG4vLyBicm93c2VyIChyZXNvbHZpbmcgYW5kIHBhcnNpbmcgVVJMcykgdGhhdCBpcyB1bmxpa2VseSB0byBiZSBwcm92aWRlZCBieSBtb2NrIG9iamVjdHMgYW5kXG4vLyBjYXVzZSB1cyB0byBicmVhayB0ZXN0cy4gIEluIGFkZGl0aW9uLCB3aGVuIHRoZSBicm93c2VyIHJlc29sdmVzIGEgVVJMIGZvciBYSFIsIGl0XG4vLyBkb2Vzbid0IGtub3cgYWJvdXQgbW9ja2VkIGxvY2F0aW9ucyBhbmQgcmVzb2x2ZXMgVVJMcyB0byB0aGUgcmVhbCBkb2N1bWVudCAtIHdoaWNoIGlzXG4vLyBleGFjdGx5IHRoZSBiZWhhdmlvciBuZWVkZWQgaGVyZS4gIFRoZXJlIGlzIGxpdHRsZSB2YWx1ZSBpcyBtb2NraW5nIHRoZXNlIG91dCBmb3IgdGhpc1xuLy8gc2VydmljZS5cbnZhciB1cmxQYXJzaW5nTm9kZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG52YXIgb3JpZ2luVXJsID0gdXJsUmVzb2x2ZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cblxuLyoqXG4gKlxuICogSW1wbGVtZW50YXRpb24gTm90ZXMgZm9yIG5vbi1JRSBicm93c2Vyc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQXNzaWduaW5nIGEgVVJMIHRvIHRoZSBocmVmIHByb3BlcnR5IG9mIGFuIGFuY2hvciBET00gbm9kZSwgZXZlbiBvbmUgYXR0YWNoZWQgdG8gdGhlIERPTSxcbiAqIHJlc3VsdHMgYm90aCBpbiB0aGUgbm9ybWFsaXppbmcgYW5kIHBhcnNpbmcgb2YgdGhlIFVSTC4gIE5vcm1hbGl6aW5nIG1lYW5zIHRoYXQgYSByZWxhdGl2ZVxuICogVVJMIHdpbGwgYmUgcmVzb2x2ZWQgaW50byBhbiBhYnNvbHV0ZSBVUkwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIGRvY3VtZW50LlxuICogUGFyc2luZyBtZWFucyB0aGF0IHRoZSBhbmNob3Igbm9kZSdzIGhvc3QsIGhvc3RuYW1lLCBwcm90b2NvbCwgcG9ydCwgcGF0aG5hbWUgYW5kIHJlbGF0ZWRcbiAqIHByb3BlcnRpZXMgYXJlIGFsbCBwb3B1bGF0ZWQgdG8gcmVmbGVjdCB0aGUgbm9ybWFsaXplZCBVUkwuICBUaGlzIGFwcHJvYWNoIGhhcyB3aWRlXG4gKiBjb21wYXRpYmlsaXR5IC0gU2FmYXJpIDErLCBNb3ppbGxhIDErLCBPcGVyYSA3KyxlIGV0Yy4gIFNlZVxuICogaHR0cDovL3d3dy5hcHRhbmEuY29tL3JlZmVyZW5jZS9odG1sL2FwaS9IVE1MQW5jaG9yRWxlbWVudC5odG1sXG4gKlxuICogSW1wbGVtZW50YXRpb24gTm90ZXMgZm9yIElFXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIElFIDw9IDEwIG5vcm1hbGl6ZXMgdGhlIFVSTCB3aGVuIGFzc2lnbmVkIHRvIHRoZSBhbmNob3Igbm9kZSBzaW1pbGFyIHRvIHRoZSBvdGhlclxuICogYnJvd3NlcnMuICBIb3dldmVyLCB0aGUgcGFyc2VkIGNvbXBvbmVudHMgd2lsbCBub3QgYmUgc2V0IGlmIHRoZSBVUkwgYXNzaWduZWQgZGlkIG5vdCBzcGVjaWZ5XG4gKiB0aGVtLiAgKGUuZy4gaWYgeW91IGFzc2lnbiBhLmhyZWYgPSBcImZvb1wiLCB0aGVuIGEucHJvdG9jb2wsIGEuaG9zdCwgZXRjLiB3aWxsIGJlIGVtcHR5LikgIFdlXG4gKiB3b3JrIGFyb3VuZCB0aGF0IGJ5IHBlcmZvcm1pbmcgdGhlIHBhcnNpbmcgaW4gYSAybmQgc3RlcCBieSB0YWtpbmcgYSBwcmV2aW91c2x5IG5vcm1hbGl6ZWRcbiAqIFVSTCAoZS5nLiBieSBhc3NpZ25pbmcgdG8gYS5ocmVmKSBhbmQgYXNzaWduaW5nIGl0IGEuaHJlZiBhZ2Fpbi4gIFRoaXMgY29ycmVjdGx5IHBvcHVsYXRlcyB0aGVcbiAqIHByb3BlcnRpZXMgc3VjaCBhcyBwcm90b2NvbCwgaG9zdG5hbWUsIHBvcnQsIGV0Yy5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICBodHRwOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MQW5jaG9yRWxlbWVudFxuICogICBodHRwOi8vd3d3LmFwdGFuYS5jb20vcmVmZXJlbmNlL2h0bWwvYXBpL0hUTUxBbmNob3JFbGVtZW50Lmh0bWxcbiAqICAgaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvcHVsbC8yOTAyXG4gKiAgIGh0dHA6Ly9qYW1lcy5wYWRvbHNleS5jb20vamF2YXNjcmlwdC9wYXJzaW5nLXVybHMtd2l0aC10aGUtZG9tL1xuICpcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkLlxuICogQGRlc2NyaXB0aW9uIE5vcm1hbGl6ZXMgYW5kIHBhcnNlcyBhIFVSTC5cbiAqIEByZXR1cm5zIHtvYmplY3R9IFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgVVJMIGFzIGEgZGljdGlvbmFyeS5cbiAqXG4gKiAgIHwgbWVtYmVyIG5hbWUgICB8IERlc2NyaXB0aW9uICAgIHxcbiAqICAgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfFxuICogICB8IGhyZWYgICAgICAgICAgfCBBIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcHJvdmlkZWQgVVJMIGlmIGl0IHdhcyBub3QgYW4gYWJzb2x1dGUgVVJMIHxcbiAqICAgfCBwcm90b2NvbCAgICAgIHwgVGhlIHByb3RvY29sIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgY29sb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgIHwgaG9zdCAgICAgICAgICB8IFRoZSBob3N0IGFuZCBwb3J0IChpZiB0aGUgcG9ydCBpcyBub24tZGVmYXVsdCkgb2YgdGhlIG5vcm1hbGl6ZWRVcmwgICAgfFxuICogICB8IHNlYXJjaCAgICAgICAgfCBUaGUgc2VhcmNoIHBhcmFtcywgbWludXMgdGhlIHF1ZXN0aW9uIG1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgfCBoYXNoICAgICAgICAgIHwgVGhlIGhhc2ggc3RyaW5nLCBtaW51cyB0aGUgaGFzaCBzeW1ib2xcbiAqICAgfCBob3N0bmFtZSAgICAgIHwgVGhlIGhvc3RuYW1lXG4gKiAgIHwgcG9ydCAgICAgICAgICB8IFRoZSBwb3J0LCB3aXRob3V0IFwiOlwiXG4gKiAgIHwgcGF0aG5hbWUgICAgICB8IFRoZSBwYXRobmFtZSwgYmVnaW5uaW5nIHdpdGggXCIvXCJcbiAqXG4gKi9cbmZ1bmN0aW9uIHVybFJlc29sdmUodXJsKSB7XG4gIHZhciBocmVmID0gdXJsO1xuXG4gIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seVxuICBpZiAobXNpZSkge1xuICAgIC8vIE5vcm1hbGl6ZSBiZWZvcmUgcGFyc2UuICBSZWZlciBJbXBsZW1lbnRhdGlvbiBOb3RlcyBvbiB3aHkgdGhpcyBpc1xuICAgIC8vIGRvbmUgaW4gdHdvIHN0ZXBzIG9uIElFLlxuICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICB9XG5cbiAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICByZXR1cm4ge1xuICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpXG4gICAgICA/IHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICA6ICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gIH07XG59XG5cbi8qKlxuICogUGFyc2UgYSByZXF1ZXN0IFVSTCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHNhbWUtb3JpZ2luIHJlcXVlc3QgYXMgdGhlIGFwcGxpY2F0aW9uIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVxdWVzdFVybCBUaGUgdXJsIG9mIHRoZSByZXF1ZXN0IGFzIGEgc3RyaW5nIHRoYXQgd2lsbCBiZSByZXNvbHZlZFxuICogb3IgYSBwYXJzZWQgVVJMIG9iamVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGZvciB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGFwcGxpY2F0aW9uIGRvY3VtZW50LlxuICovXG5mdW5jdGlvbiB1cmxJc1NhbWVPcmlnaW4ocmVxdWVzdFVybCkge1xuICB2YXIgcGFyc2VkID0gKGlzU3RyaW5nKHJlcXVlc3RVcmwpKSA/IHVybFJlc29sdmUocmVxdWVzdFVybCkgOiByZXF1ZXN0VXJsO1xuICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVXJsLnByb3RvY29sICYmXG4gICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVybC5ob3N0KTtcbn1cblxuLyoqXG4gKiBAbmdkb2Mgc2VydmljZVxuICogQG5hbWUgJHdpbmRvd1xuICogQHRoaXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgcmVmZXJlbmNlIHRvIHRoZSBicm93c2VyJ3MgYHdpbmRvd2Agb2JqZWN0LiBXaGlsZSBgd2luZG93YFxuICogaXMgZ2xvYmFsbHkgYXZhaWxhYmxlIGluIEphdmFTY3JpcHQsIGl0IGNhdXNlcyB0ZXN0YWJpbGl0eSBwcm9ibGVtcywgYmVjYXVzZVxuICogaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuIEluIGFuZ3VsYXIgd2UgYWx3YXlzIHJlZmVyIHRvIGl0IHRocm91Z2ggdGhlXG4gKiBgJHdpbmRvd2Agc2VydmljZSwgc28gaXQgbWF5IGJlIG92ZXJyaWRkZW4sIHJlbW92ZWQgb3IgbW9ja2VkIGZvciB0ZXN0aW5nLlxuICpcbiAqIEV4cHJlc3Npb25zLCBsaWtlIHRoZSBvbmUgZGVmaW5lZCBmb3IgdGhlIGBuZ0NsaWNrYCBkaXJlY3RpdmUgaW4gdGhlIGV4YW1wbGVcbiAqIGJlbG93LCBhcmUgZXZhbHVhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCBzY29wZS4gIFRoZXJlZm9yZSwgdGhlcmUgaXNcbiAqIG5vIHJpc2sgb2YgaW5hZHZlcnRlbnRseSBjb2RpbmcgaW4gYSBkZXBlbmRlbmN5IG9uIGEgZ2xvYmFsIHZhbHVlIGluIHN1Y2ggYW5cbiAqIGV4cHJlc3Npb24uXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG1vZHVsZT1cIndpbmRvd0V4YW1wbGVcIiBuYW1lPVwid2luZG93LXNlcnZpY2VcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8c2NyaXB0PlxuICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3dpbmRvd0V4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCAnJHdpbmRvdycsIGZ1bmN0aW9uKCRzY29wZSwgJHdpbmRvdykge1xuICAgICAgICAgICAgICRzY29wZS5ncmVldGluZyA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgICAgICAgICAkc2NvcGUuZG9HcmVldGluZyA9IGZ1bmN0aW9uKGdyZWV0aW5nKSB7XG4gICAgICAgICAgICAgICAkd2luZG93LmFsZXJ0KGdyZWV0aW5nKTtcbiAgICAgICAgICAgICB9O1xuICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwiZ3JlZXRpbmdcIiBhcmlhLWxhYmVsPVwiZ3JlZXRpbmdcIiAvPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImRvR3JlZXRpbmcoZ3JlZXRpbmcpXCI+QUxFUlQ8L2J1dHRvbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICBpdCgnc2hvdWxkIGRpc3BsYXkgdGhlIGdyZWV0aW5nIGluIHRoZSBpbnB1dCBib3gnLCBmdW5jdGlvbigpIHtcbiAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdncmVldGluZycpKS5zZW5kS2V5cygnSGVsbG8sIEUyRSBUZXN0cycpO1xuICAgICAgIC8vIElmIHdlIGNsaWNrIHRoZSBidXR0b24gaXQgd2lsbCBibG9jayB0aGUgdGVzdCBydW5uZXJcbiAgICAgICAvLyBlbGVtZW50KCc6YnV0dG9uJykuY2xpY2soKTtcbiAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbmZ1bmN0aW9uICRXaW5kb3dQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gdmFsdWVGbih3aW5kb3cpO1xufVxuXG4vKipcbiAqIEBuYW1lICQkY29va2llUmVhZGVyXG4gKiBAcmVxdWlyZXMgJGRvY3VtZW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGlzIGEgcHJpdmF0ZSBzZXJ2aWNlIGZvciByZWFkaW5nIGNvb2tpZXMgdXNlZCBieSAkaHR0cCBhbmQgbmdDb29raWVzXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBhIGtleS92YWx1ZSBtYXAgb2YgdGhlIGN1cnJlbnQgY29va2llc1xuICovXG5mdW5jdGlvbiAkJENvb2tpZVJlYWRlcigkZG9jdW1lbnQpIHtcbiAgdmFyIHJhd0RvY3VtZW50ID0gJGRvY3VtZW50WzBdIHx8IHt9O1xuICB2YXIgbGFzdENvb2tpZXMgPSB7fTtcbiAgdmFyIGxhc3RDb29raWVTdHJpbmcgPSAnJztcblxuICBmdW5jdGlvbiBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KHN0cikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvb2tpZUFycmF5LCBjb29raWUsIGksIGluZGV4LCBuYW1lO1xuICAgIHZhciBjdXJyZW50Q29va2llU3RyaW5nID0gcmF3RG9jdW1lbnQuY29va2llIHx8ICcnO1xuXG4gICAgaWYgKGN1cnJlbnRDb29raWVTdHJpbmcgIT09IGxhc3RDb29raWVTdHJpbmcpIHtcbiAgICAgIGxhc3RDb29raWVTdHJpbmcgPSBjdXJyZW50Q29va2llU3RyaW5nO1xuICAgICAgY29va2llQXJyYXkgPSBsYXN0Q29va2llU3RyaW5nLnNwbGl0KCc7ICcpO1xuICAgICAgbGFzdENvb2tpZXMgPSB7fTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGNvb2tpZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvb2tpZSA9IGNvb2tpZUFycmF5W2ldO1xuICAgICAgICBpbmRleCA9IGNvb2tpZS5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHsgLy9pZ25vcmUgbmFtZWxlc3MgY29va2llc1xuICAgICAgICAgIG5hbWUgPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoMCwgaW5kZXgpKTtcbiAgICAgICAgICAvLyB0aGUgZmlyc3QgdmFsdWUgdGhhdCBpcyBzZWVuIGZvciBhIGNvb2tpZSBpcyB0aGUgbW9zdFxuICAgICAgICAgIC8vIHNwZWNpZmljIG9uZS4gIHZhbHVlcyBmb3IgdGhlIHNhbWUgY29va2llIG5hbWUgdGhhdFxuICAgICAgICAgIC8vIGZvbGxvdyBhcmUgZm9yIGxlc3Mgc3BlY2lmaWMgcGF0aHMuXG4gICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGxhc3RDb29raWVzW25hbWVdKSkge1xuICAgICAgICAgICAgbGFzdENvb2tpZXNbbmFtZV0gPSBzYWZlRGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXN0Q29va2llcztcbiAgfTtcbn1cblxuJCRDb29raWVSZWFkZXIuJGluamVjdCA9IFsnJGRvY3VtZW50J107XG5cbi8qKiBAdGhpcyAqL1xuZnVuY3Rpb24gJCRDb29raWVSZWFkZXJQcm92aWRlcigpIHtcbiAgdGhpcy4kZ2V0ID0gJCRDb29raWVSZWFkZXI7XG59XG5cbi8qIGdsb2JhbCBjdXJyZW5jeUZpbHRlcjogdHJ1ZSxcbiBkYXRlRmlsdGVyOiB0cnVlLFxuIGZpbHRlckZpbHRlcjogdHJ1ZSxcbiBqc29uRmlsdGVyOiB0cnVlLFxuIGxpbWl0VG9GaWx0ZXI6IHRydWUsXG4gbG93ZXJjYXNlRmlsdGVyOiB0cnVlLFxuIG51bWJlckZpbHRlcjogdHJ1ZSxcbiBvcmRlckJ5RmlsdGVyOiB0cnVlLFxuIHVwcGVyY2FzZUZpbHRlcjogdHJ1ZSxcbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBwcm92aWRlclxuICogQG5hbWUgJGZpbHRlclByb3ZpZGVyXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBGaWx0ZXJzIGFyZSBqdXN0IGZ1bmN0aW9ucyB3aGljaCB0cmFuc2Zvcm0gaW5wdXQgdG8gYW4gb3V0cHV0LiBIb3dldmVyIGZpbHRlcnMgbmVlZCB0byBiZVxuICogRGVwZW5kZW5jeSBJbmplY3RlZC4gVG8gYWNoaWV2ZSB0aGlzIGEgZmlsdGVyIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGlzXG4gKiBhbm5vdGF0ZWQgd2l0aCBkZXBlbmRlbmNpZXMgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIGZpbHRlciBmdW5jdGlvbi5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlOioqIEZpbHRlciBuYW1lcyBtdXN0IGJlIHZhbGlkIGFuZ3VsYXIge0BsaW5rIGV4cHJlc3Npb259IGlkZW50aWZpZXJzLCBzdWNoIGFzIGB1cHBlcmNhc2VgIG9yIGBvcmRlckJ5YC5cbiAqIE5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGh5cGhlbnMgYW5kIGRvdHMsIGFyZSBub3QgYWxsb3dlZC4gSWYgeW91IHdpc2ggdG8gbmFtZXNwYWNlXG4gKiB5b3VyIGZpbHRlcnMsIHRoZW4geW91IGNhbiB1c2UgY2FwaXRhbGl6YXRpb24gKGBteWFwcFN1YnNlY3Rpb25GaWx0ZXJ4YCkgb3IgdW5kZXJzY29yZXNcbiAqIChgbXlhcHBfc3Vic2VjdGlvbl9maWx0ZXJ4YCkuXG4gKiA8L2Rpdj5cbiAqXG4gKiBgYGBqc1xuICogICAvLyBGaWx0ZXIgcmVnaXN0cmF0aW9uXG4gKiAgIGZ1bmN0aW9uIE15TW9kdWxlKCRwcm92aWRlLCAkZmlsdGVyUHJvdmlkZXIpIHtcbiAqICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlIHRvIGRlbW9uc3RyYXRlIGluamVjdGlvbiAobm90IGFsd2F5cyBuZWVkZWQpXG4gKiAgICAgJHByb3ZpZGUudmFsdWUoJ2dyZWV0JywgZnVuY3Rpb24obmFtZSl7XG4gKiAgICAgICByZXR1cm4gJ0hlbGxvICcgKyBuYW1lICsgJyEnO1xuICogICAgIH0pO1xuICpcbiAqICAgICAvLyByZWdpc3RlciBhIGZpbHRlciBmYWN0b3J5IHdoaWNoIHVzZXMgdGhlXG4gKiAgICAgLy8gZ3JlZXQgc2VydmljZSB0byBkZW1vbnN0cmF0ZSBESS5cbiAqICAgICAkZmlsdGVyUHJvdmlkZXIucmVnaXN0ZXIoJ2dyZWV0JywgZnVuY3Rpb24oZ3JlZXQpe1xuICogICAgICAgLy8gcmV0dXJuIHRoZSBmaWx0ZXIgZnVuY3Rpb24gd2hpY2ggdXNlcyB0aGUgZ3JlZXQgc2VydmljZVxuICogICAgICAgLy8gdG8gZ2VuZXJhdGUgc2FsdXRhdGlvblxuICogICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRleHQpIHtcbiAqICAgICAgICAgLy8gZmlsdGVycyBuZWVkIHRvIGJlIGZvcmdpdmluZyBzbyBjaGVjayBpbnB1dCB2YWxpZGl0eVxuICogICAgICAgICByZXR1cm4gdGV4dCAmJiBncmVldCh0ZXh0KSB8fCB0ZXh0O1xuICogICAgICAgfTtcbiAqICAgICB9KTtcbiAqICAgfVxuICogYGBgXG4gKlxuICogVGhlIGZpbHRlciBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGAkaW5qZWN0b3JgIHVuZGVyIHRoZSBmaWx0ZXIgbmFtZSBzdWZmaXggd2l0aFxuICogYEZpbHRlcmAuXG4gKlxuICogYGBganNcbiAqICAgaXQoJ3Nob3VsZCBiZSB0aGUgc2FtZSBpbnN0YW5jZScsIGluamVjdChcbiAqICAgICBmdW5jdGlvbigkZmlsdGVyUHJvdmlkZXIpIHtcbiAqICAgICAgICRmaWx0ZXJQcm92aWRlci5yZWdpc3RlcigncmV2ZXJzZScsIGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgIHJldHVybiAuLi47XG4gKiAgICAgICB9KTtcbiAqICAgICB9LFxuICogICAgIGZ1bmN0aW9uKCRmaWx0ZXIsIHJldmVyc2VGaWx0ZXIpIHtcbiAqICAgICAgIGV4cGVjdCgkZmlsdGVyKCdyZXZlcnNlJykpLnRvQmUocmV2ZXJzZUZpbHRlcik7XG4gKiAgICAgfSk7XG4gKiBgYGBcbiAqXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGFuZ3VsYXIgZmlsdGVycyB3b3JrLCBhbmQgaG93IHRvIGNyZWF0ZSB5b3VyIG93biBmaWx0ZXJzLCBzZWVcbiAqIHtAbGluayBndWlkZS9maWx0ZXIgRmlsdGVyc30gaW4gdGhlIEFuZ3VsYXIgRGV2ZWxvcGVyIEd1aWRlLlxuICovXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRmaWx0ZXJcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqIEZpbHRlcnMgYXJlIHVzZWQgZm9yIGZvcm1hdHRpbmcgZGF0YSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gKlxuICogVGhleSBjYW4gYmUgdXNlZCBpbiB2aWV3IHRlbXBsYXRlcywgY29udHJvbGxlcnMgb3Igc2VydmljZXMuQW5ndWxhciBjb21lc1xuICogd2l0aCBhIGNvbGxlY3Rpb24gb2YgW2J1aWx0LWluIGZpbHRlcnNdKGFwaS9uZy9maWx0ZXIpLCBidXQgaXQgaXMgZWFzeSB0b1xuICogZGVmaW5lIHlvdXIgb3duIGFzIHdlbGwuXG4gKlxuICogVGhlIGdlbmVyYWwgc3ludGF4IGluIHRlbXBsYXRlcyBpcyBhcyBmb2xsb3dzOlxuICpcbiAqIGBgYGh0bWxcbiAqIHt7IGV4cHJlc3Npb24gW3wgZmlsdGVyX25hbWVbOnBhcmFtZXRlcl92YWx1ZV0gLi4uIF0gfX1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpbHRlciBmdW5jdGlvbiB0byByZXRyaWV2ZVxuICogQHJldHVybiB7RnVuY3Rpb259IHRoZSBmaWx0ZXIgZnVuY3Rpb25cbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwiJGZpbHRlclwiIG1vZHVsZT1cImZpbHRlckV4YW1wbGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJNYWluQ3RybFwiPlxuICAgICAgICA8aDM+e3sgb3JpZ2luYWxUZXh0IH19PC9oMz5cbiAgICAgICAgPGgzPnt7IGZpbHRlcmVkVGV4dCB9fTwvaDM+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cblxuICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICBhbmd1bGFyLm1vZHVsZSgnZmlsdGVyRXhhbXBsZScsIFtdKVxuICAgICAgLmNvbnRyb2xsZXIoJ01haW5DdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkZmlsdGVyKSB7XG4gICAgICAgICRzY29wZS5vcmlnaW5hbFRleHQgPSAnaGVsbG8nO1xuICAgICAgICAkc2NvcGUuZmlsdGVyZWRUZXh0ID0gJGZpbHRlcigndXBwZXJjYXNlJykoJHNjb3BlLm9yaWdpbmFsVGV4dCk7XG4gICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICAqL1xuJEZpbHRlclByb3ZpZGVyLiRpbmplY3QgPSBbJyRwcm92aWRlJ107XG4vKiogQHRoaXMgKi9cbmZ1bmN0aW9uICRGaWx0ZXJQcm92aWRlcigkcHJvdmlkZSkge1xuICB2YXIgc3VmZml4ID0gJ0ZpbHRlcic7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgJGZpbHRlclByb3ZpZGVyI3JlZ2lzdGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gbmFtZSBOYW1lIG9mIHRoZSBmaWx0ZXIgZnVuY3Rpb24sIG9yIGFuIG9iamVjdCBtYXAgb2YgZmlsdGVycyB3aGVyZVxuICAgKiAgICB0aGUga2V5cyBhcmUgdGhlIGZpbHRlciBuYW1lcyBhbmQgdGhlIHZhbHVlcyBhcmUgdGhlIGZpbHRlciBmYWN0b3JpZXMuXG4gICAqXG4gICAqICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gICAqICAgICoqTm90ZToqKiBGaWx0ZXIgbmFtZXMgbXVzdCBiZSB2YWxpZCBhbmd1bGFyIHtAbGluayBleHByZXNzaW9ufSBpZGVudGlmaWVycywgc3VjaCBhcyBgdXBwZXJjYXNlYCBvciBgb3JkZXJCeWAuXG4gICAqICAgIE5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGh5cGhlbnMgYW5kIGRvdHMsIGFyZSBub3QgYWxsb3dlZC4gSWYgeW91IHdpc2ggdG8gbmFtZXNwYWNlXG4gICAqICAgIHlvdXIgZmlsdGVycywgdGhlbiB5b3UgY2FuIHVzZSBjYXBpdGFsaXphdGlvbiAoYG15YXBwU3Vic2VjdGlvbkZpbHRlcnhgKSBvciB1bmRlcnNjb3Jlc1xuICAgKiAgICAoYG15YXBwX3N1YnNlY3Rpb25fZmlsdGVyeGApLlxuICAgKiAgICA8L2Rpdj5cbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZhY3RvcnkgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHdhcyBhIHN0cmluZywgYSBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgZmlsdGVyIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJlZ2lzdGVyZWQgZmlsdGVyIGluc3RhbmNlLCBvciBpZiBhIG1hcCBvZiBmaWx0ZXJzIHdhcyBwcm92aWRlZCB0aGVuIGEgbWFwXG4gICAqICAgIG9mIHRoZSByZWdpc3RlcmVkIGZpbHRlciBpbnN0YW5jZXMuXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3RlcihuYW1lLCBmYWN0b3J5KSB7XG4gICAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgICB2YXIgZmlsdGVycyA9IHt9O1xuICAgICAgZm9yRWFjaChuYW1lLCBmdW5jdGlvbihmaWx0ZXIsIGtleSkge1xuICAgICAgICBmaWx0ZXJzW2tleV0gPSByZWdpc3RlcihrZXksIGZpbHRlcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJHByb3ZpZGUuZmFjdG9yeShuYW1lICsgc3VmZml4LCBmYWN0b3J5KTtcbiAgICB9XG4gIH1cbiAgdGhpcy5yZWdpc3RlciA9IHJlZ2lzdGVyO1xuXG4gIHRoaXMuJGdldCA9IFsnJGluamVjdG9yJywgZnVuY3Rpb24oJGluamVjdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJldHVybiAkaW5qZWN0b3IuZ2V0KG5hbWUgKyBzdWZmaXgpO1xuICAgIH07XG4gIH1dO1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAvKiBnbG9iYWxcbiAgICBjdXJyZW5jeUZpbHRlcjogZmFsc2UsXG4gICAgZGF0ZUZpbHRlcjogZmFsc2UsXG4gICAgZmlsdGVyRmlsdGVyOiBmYWxzZSxcbiAgICBqc29uRmlsdGVyOiBmYWxzZSxcbiAgICBsaW1pdFRvRmlsdGVyOiBmYWxzZSxcbiAgICBsb3dlcmNhc2VGaWx0ZXI6IGZhbHNlLFxuICAgIG51bWJlckZpbHRlcjogZmFsc2UsXG4gICAgb3JkZXJCeUZpbHRlcjogZmFsc2UsXG4gICAgdXBwZXJjYXNlRmlsdGVyOiBmYWxzZVxuICAqL1xuXG4gIHJlZ2lzdGVyKCdjdXJyZW5jeScsIGN1cnJlbmN5RmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ2RhdGUnLCBkYXRlRmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ2ZpbHRlcicsIGZpbHRlckZpbHRlcik7XG4gIHJlZ2lzdGVyKCdqc29uJywganNvbkZpbHRlcik7XG4gIHJlZ2lzdGVyKCdsaW1pdFRvJywgbGltaXRUb0ZpbHRlcik7XG4gIHJlZ2lzdGVyKCdsb3dlcmNhc2UnLCBsb3dlcmNhc2VGaWx0ZXIpO1xuICByZWdpc3RlcignbnVtYmVyJywgbnVtYmVyRmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ29yZGVyQnknLCBvcmRlckJ5RmlsdGVyKTtcbiAgcmVnaXN0ZXIoJ3VwcGVyY2FzZScsIHVwcGVyY2FzZUZpbHRlcik7XG59XG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgZmlsdGVyXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2VsZWN0cyBhIHN1YnNldCBvZiBpdGVtcyBmcm9tIGBhcnJheWAgYW5kIHJldHVybnMgaXQgYXMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvdXJjZSBhcnJheS5cbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdHxmdW5jdGlvbigpfSBleHByZXNzaW9uIFRoZSBwcmVkaWNhdGUgdG8gYmUgdXNlZCBmb3Igc2VsZWN0aW5nIGl0ZW1zIGZyb21cbiAqICAgYGFycmF5YC5cbiAqXG4gKiAgIENhbiBiZSBvbmUgb2Y6XG4gKlxuICogICAtIGBzdHJpbmdgOiBUaGUgc3RyaW5nIGlzIHVzZWQgZm9yIG1hdGNoaW5nIGFnYWluc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBgYXJyYXlgLiBBbGwgc3RyaW5ncyBvclxuICogICAgIG9iamVjdHMgd2l0aCBzdHJpbmcgcHJvcGVydGllcyBpbiBgYXJyYXlgIHRoYXQgbWF0Y2ggdGhpcyBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBhbHNvXG4gKiAgICAgYXBwbGllcyB0byBuZXN0ZWQgb2JqZWN0IHByb3BlcnRpZXMuXG4gKiAgICAgVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoIGAhYC5cbiAqXG4gKiAgIC0gYE9iamVjdGA6IEEgcGF0dGVybiBvYmplY3QgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHNwZWNpZmljIHByb3BlcnRpZXMgb24gb2JqZWN0cyBjb250YWluZWRcbiAqICAgICBieSBgYXJyYXlgLiBGb3IgZXhhbXBsZSBge25hbWU6XCJNXCIsIHBob25lOlwiMVwifWAgcHJlZGljYXRlIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zXG4gKiAgICAgd2hpY2ggaGF2ZSBwcm9wZXJ0eSBgbmFtZWAgY29udGFpbmluZyBcIk1cIiBhbmQgcHJvcGVydHkgYHBob25lYCBjb250YWluaW5nIFwiMVwiLiBBIHNwZWNpYWxcbiAqICAgICBwcm9wZXJ0eSBuYW1lIChgJGAgYnkgZGVmYXVsdCkgY2FuIGJlIHVzZWQgKGUuZy4gYXMgaW4gYHskOiBcInRleHRcIn1gKSB0byBhY2NlcHQgYSBtYXRjaFxuICogICAgIGFnYWluc3QgYW55IHByb3BlcnR5IG9mIHRoZSBvYmplY3Qgb3IgaXRzIG5lc3RlZCBvYmplY3QgcHJvcGVydGllcy4gVGhhdCdzIGVxdWl2YWxlbnQgdG8gdGhlXG4gKiAgICAgc2ltcGxlIHN1YnN0cmluZyBtYXRjaCB3aXRoIGEgYHN0cmluZ2AgYXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgc3BlY2lhbCBwcm9wZXJ0eSBuYW1lIGNhbiBiZVxuICogICAgIG92ZXJ3cml0dGVuLCB1c2luZyB0aGUgYGFueVByb3BlcnR5S2V5YCBwYXJhbWV0ZXIuXG4gKiAgICAgVGhlIHByZWRpY2F0ZSBjYW4gYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIHN0cmluZyB3aXRoIGAhYC5cbiAqICAgICBGb3IgZXhhbXBsZSBge25hbWU6IFwiIU1cIn1gIHByZWRpY2F0ZSB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBoYXZlIHByb3BlcnR5IGBuYW1lYFxuICogICAgIG5vdCBjb250YWluaW5nIFwiTVwiLlxuICpcbiAqICAgICBOb3RlIHRoYXQgYSBuYW1lZCBwcm9wZXJ0eSB3aWxsIG1hdGNoIHByb3BlcnRpZXMgb24gdGhlIHNhbWUgbGV2ZWwgb25seSwgd2hpbGUgdGhlIHNwZWNpYWxcbiAqICAgICBgJGAgcHJvcGVydHkgd2lsbCBtYXRjaCBwcm9wZXJ0aWVzIG9uIHRoZSBzYW1lIGxldmVsIG9yIGRlZXBlci4gRS5nLiBhbiBhcnJheSBpdGVtIGxpa2VcbiAqICAgICBge25hbWU6IHtmaXJzdDogJ0pvaG4nLCBsYXN0OiAnRG9lJ319YCB3aWxsICoqbm90KiogYmUgbWF0Y2hlZCBieSBge25hbWU6ICdKb2huJ31gLCBidXRcbiAqICAgICAqKndpbGwqKiBiZSBtYXRjaGVkIGJ5IGB7JDogJ0pvaG4nfWAuXG4gKlxuICogICAtIGBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGFycmF5KWA6IEEgcHJlZGljYXRlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFyYml0cmFyeSBmaWx0ZXJzLlxuICogICAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXksIHdpdGggdGhlIGVsZW1lbnQsIGl0cyBpbmRleCwgYW5kXG4gKiAgICAgdGhlIGVudGlyZSBhcnJheSBpdHNlbGYgYXMgYXJndW1lbnRzLlxuICpcbiAqICAgICBUaGUgZmluYWwgcmVzdWx0IGlzIGFuIGFycmF5IG9mIHRob3NlIGVsZW1lbnRzIHRoYXQgdGhlIHByZWRpY2F0ZSByZXR1cm5lZCB0cnVlIGZvci5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpfHRydWV8ZmFsc2V9IFtjb21wYXJhdG9yXSBDb21wYXJhdG9yIHdoaWNoIGlzIHVzZWQgaW5cbiAqICAgICBkZXRlcm1pbmluZyBpZiB0aGUgZXhwZWN0ZWQgdmFsdWUgKGZyb20gdGhlIGZpbHRlciBleHByZXNzaW9uKSBhbmQgYWN0dWFsIHZhbHVlIChmcm9tXG4gKiAgICAgdGhlIG9iamVjdCBpbiB0aGUgYXJyYXkpIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgbWF0Y2guXG4gKlxuICogICBDYW4gYmUgb25lIG9mOlxuICpcbiAqICAgLSBgZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZClgOlxuICogICAgIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGdpdmVuIHRoZSBvYmplY3QgdmFsdWUgYW5kIHRoZSBwcmVkaWNhdGUgdmFsdWUgdG8gY29tcGFyZSBhbmRcbiAqICAgICBzaG91bGQgcmV0dXJuIHRydWUgaWYgYm90aCB2YWx1ZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwuXG4gKlxuICogICAtIGB0cnVlYDogQSBzaG9ydGhhbmQgZm9yIGBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkKSB7IHJldHVybiBhbmd1bGFyLmVxdWFscyhhY3R1YWwsIGV4cGVjdGVkKX1gLlxuICogICAgIFRoaXMgaXMgZXNzZW50aWFsbHkgc3RyaWN0IGNvbXBhcmlzb24gb2YgZXhwZWN0ZWQgYW5kIGFjdHVhbC5cbiAqXG4gKiAgIC0gYGZhbHNlYDogQSBzaG9ydCBoYW5kIGZvciBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgbG9vayBmb3IgYSBzdWJzdHJpbmcgbWF0Y2ggaW4gYSBjYXNlXG4gKiAgICAgaW5zZW5zaXRpdmUgd2F5LiBQcmltaXRpdmUgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4gT2JqZWN0cyBhcmUgbm90IGNvbXBhcmVkIGFnYWluc3RcbiAqICAgICBwcmltaXRpdmVzLCB1bmxlc3MgdGhleSBoYXZlIGEgY3VzdG9tIGB0b1N0cmluZ2AgbWV0aG9kIChlLmcuIGBEYXRlYCBvYmplY3RzKS5cbiAqXG4gKlxuICogICBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYW55UHJvcGVydHlLZXldIFRoZSBzcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBtYXRjaGVzIGFnYWluc3QgYW55IHByb3BlcnR5LlxuICogICAgIEJ5IGRlZmF1bHQgYCRgLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwiZmlsdGVyLWZpbHRlclwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctaW5pdD1cImZyaWVuZHMgPSBbe25hbWU6J0pvaG4nLCBwaG9uZTonNTU1LTEyNzYnfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge25hbWU6J01hcnknLCBwaG9uZTonODAwLUJJRy1NQVJZJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidNaWtlJywgcGhvbmU6JzU1NS00MzIxJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidBZGFtJywgcGhvbmU6JzU1NS01Njc4J30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOidKdWxpZScsIHBob25lOic1NTUtODc2NSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTonSnVsaWV0dGUnLCBwaG9uZTonNTU1LTU2NzgnfV1cIj48L2Rpdj5cblxuICAgICAgIDxsYWJlbD5TZWFyY2g6IDxpbnB1dCBuZy1tb2RlbD1cInNlYXJjaFRleHRcIj48L2xhYmVsPlxuICAgICAgIDx0YWJsZSBpZD1cInNlYXJjaFRleHRSZXN1bHRzXCI+XG4gICAgICAgICA8dHI+PHRoPk5hbWU8L3RoPjx0aD5QaG9uZTwvdGg+PC90cj5cbiAgICAgICAgIDx0ciBuZy1yZXBlYXQ9XCJmcmllbmQgaW4gZnJpZW5kcyB8IGZpbHRlcjpzZWFyY2hUZXh0XCI+XG4gICAgICAgICAgIDx0ZD57e2ZyaWVuZC5uYW1lfX08L3RkPlxuICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+XG4gICAgICAgICA8L3RyPlxuICAgICAgIDwvdGFibGU+XG4gICAgICAgPGhyPlxuICAgICAgIDxsYWJlbD5Bbnk6IDxpbnB1dCBuZy1tb2RlbD1cInNlYXJjaC4kXCI+PC9sYWJlbD4gPGJyPlxuICAgICAgIDxsYWJlbD5OYW1lIG9ubHkgPGlucHV0IG5nLW1vZGVsPVwic2VhcmNoLm5hbWVcIj48L2xhYmVsPjxicj5cbiAgICAgICA8bGFiZWw+UGhvbmUgb25seSA8aW5wdXQgbmctbW9kZWw9XCJzZWFyY2gucGhvbmVcIj48L2xhYmVsPjxicj5cbiAgICAgICA8bGFiZWw+RXF1YWxpdHkgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwic3RyaWN0XCI+PC9sYWJlbD48YnI+XG4gICAgICAgPHRhYmxlIGlkPVwic2VhcmNoT2JqUmVzdWx0c1wiPlxuICAgICAgICAgPHRyPjx0aD5OYW1lPC90aD48dGg+UGhvbmU8L3RoPjwvdHI+XG4gICAgICAgICA8dHIgbmctcmVwZWF0PVwiZnJpZW5kT2JqIGluIGZyaWVuZHMgfCBmaWx0ZXI6c2VhcmNoOnN0cmljdFwiPlxuICAgICAgICAgICA8dGQ+e3tmcmllbmRPYmoubmFtZX19PC90ZD5cbiAgICAgICAgICAgPHRkPnt7ZnJpZW5kT2JqLnBob25lfX08L3RkPlxuICAgICAgICAgPC90cj5cbiAgICAgICA8L3RhYmxlPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICB2YXIgZXhwZWN0RnJpZW5kTmFtZXMgPSBmdW5jdGlvbihleHBlY3RlZE5hbWVzLCBrZXkpIHtcbiAgICAgICAgIGVsZW1lbnQuYWxsKGJ5LnJlcGVhdGVyKGtleSArICcgaW4gZnJpZW5kcycpLmNvbHVtbihrZXkgKyAnLm5hbWUnKSkudGhlbihmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24od2QsIGkpIHtcbiAgICAgICAgICAgICBleHBlY3Qod2QuZ2V0VGV4dCgpKS50b01hdGNoKGV4cGVjdGVkTmFtZXNbaV0pO1xuICAgICAgICAgICB9KTtcbiAgICAgICAgIH0pO1xuICAgICAgIH07XG5cbiAgICAgICBpdCgnc2hvdWxkIHNlYXJjaCBhY3Jvc3MgYWxsIGZpZWxkcyB3aGVuIGZpbHRlcmluZyB3aXRoIGEgc3RyaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICB2YXIgc2VhcmNoVGV4dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlYXJjaFRleHQnKSk7XG4gICAgICAgICBzZWFyY2hUZXh0LmNsZWFyKCk7XG4gICAgICAgICBzZWFyY2hUZXh0LnNlbmRLZXlzKCdtJyk7XG4gICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ01hcnknLCAnTWlrZScsICdBZGFtJ10sICdmcmllbmQnKTtcblxuICAgICAgICAgc2VhcmNoVGV4dC5jbGVhcigpO1xuICAgICAgICAgc2VhcmNoVGV4dC5zZW5kS2V5cygnNzYnKTtcbiAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnSm9obicsICdKdWxpZSddLCAnZnJpZW5kJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNlYXJjaCBpbiBzcGVjaWZpYyBmaWVsZHMgd2hlbiBmaWx0ZXJpbmcgd2l0aCBhIHByZWRpY2F0ZSBvYmplY3QnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIHZhciBzZWFyY2hBbnkgPSBlbGVtZW50KGJ5Lm1vZGVsKCdzZWFyY2guJCcpKTtcbiAgICAgICAgIHNlYXJjaEFueS5jbGVhcigpO1xuICAgICAgICAgc2VhcmNoQW55LnNlbmRLZXlzKCdpJyk7XG4gICAgICAgICBleHBlY3RGcmllbmROYW1lcyhbJ01hcnknLCAnTWlrZScsICdKdWxpZScsICdKdWxpZXR0ZSddLCAnZnJpZW5kT2JqJyk7XG4gICAgICAgfSk7XG4gICAgICAgaXQoJ3Nob3VsZCB1c2UgYSBlcXVhbCBjb21wYXJpc29uIHdoZW4gY29tcGFyYXRvciBpcyB0cnVlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICB2YXIgc2VhcmNoTmFtZSA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlYXJjaC5uYW1lJykpO1xuICAgICAgICAgdmFyIHN0cmljdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3N0cmljdCcpKTtcbiAgICAgICAgIHNlYXJjaE5hbWUuY2xlYXIoKTtcbiAgICAgICAgIHNlYXJjaE5hbWUuc2VuZEtleXMoJ0p1bGllJyk7XG4gICAgICAgICBzdHJpY3QuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdEZyaWVuZE5hbWVzKFsnSnVsaWUnXSwgJ2ZyaWVuZE9iaicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuZnVuY3Rpb24gZmlsdGVyRmlsdGVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGV4cHJlc3Npb24sIGNvbXBhcmF0b3IsIGFueVByb3BlcnR5S2V5KSB7XG4gICAgaWYgKCFpc0FycmF5TGlrZShhcnJheSkpIHtcbiAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG1pbkVycignZmlsdGVyJykoJ25vdGFycmF5JywgJ0V4cGVjdGVkIGFycmF5IGJ1dCByZWNlaXZlZDogezB9JywgYXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFueVByb3BlcnR5S2V5ID0gYW55UHJvcGVydHlLZXkgfHwgJyQnO1xuICAgIHZhciBleHByZXNzaW9uVHlwZSA9IGdldFR5cGVGb3JGaWx0ZXIoZXhwcmVzc2lvbik7XG4gICAgdmFyIHByZWRpY2F0ZUZuO1xuICAgIHZhciBtYXRjaEFnYWluc3RBbnlQcm9wO1xuXG4gICAgc3dpdGNoIChleHByZXNzaW9uVHlwZSkge1xuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICBwcmVkaWNhdGVGbiA9IGV4cHJlc3Npb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBtYXRjaEFnYWluc3RBbnlQcm9wID0gdHJ1ZTtcbiAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcHJlZGljYXRlRm4gPSBjcmVhdGVQcmVkaWNhdGVGbihleHByZXNzaW9uLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYXJyYXksIHByZWRpY2F0ZUZuKTtcbiAgfTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYGZpbHRlckZpbHRlcmBcbmZ1bmN0aW9uIGNyZWF0ZVByZWRpY2F0ZUZuKGV4cHJlc3Npb24sIGNvbXBhcmF0b3IsIGFueVByb3BlcnR5S2V5LCBtYXRjaEFnYWluc3RBbnlQcm9wKSB7XG4gIHZhciBzaG91bGRNYXRjaFByaW1pdGl2ZXMgPSBpc09iamVjdChleHByZXNzaW9uKSAmJiAoYW55UHJvcGVydHlLZXkgaW4gZXhwcmVzc2lvbik7XG4gIHZhciBwcmVkaWNhdGVGbjtcblxuICBpZiAoY29tcGFyYXRvciA9PT0gdHJ1ZSkge1xuICAgIGNvbXBhcmF0b3IgPSBlcXVhbHM7XG4gIH0gZWxzZSBpZiAoIWlzRnVuY3Rpb24oY29tcGFyYXRvcikpIHtcbiAgICBjb21wYXJhdG9yID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKGFjdHVhbCkpIHtcbiAgICAgICAgLy8gTm8gc3Vic3RyaW5nIG1hdGNoaW5nIGFnYWluc3QgYHVuZGVmaW5lZGBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKChhY3R1YWwgPT09IG51bGwpIHx8IChleHBlY3RlZCA9PT0gbnVsbCkpIHtcbiAgICAgICAgLy8gTm8gc3Vic3RyaW5nIG1hdGNoaW5nIGFnYWluc3QgYG51bGxgOyBvbmx5IG1hdGNoIGFnYWluc3QgYG51bGxgXG4gICAgICAgIHJldHVybiBhY3R1YWwgPT09IGV4cGVjdGVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KGV4cGVjdGVkKSB8fCAoaXNPYmplY3QoYWN0dWFsKSAmJiAhaGFzQ3VzdG9tVG9TdHJpbmcoYWN0dWFsKSkpIHtcbiAgICAgICAgLy8gU2hvdWxkIG5vdCBjb21wYXJlIHByaW1pdGl2ZXMgYWdhaW5zdCBvYmplY3RzLCB1bmxlc3MgdGhleSBoYXZlIGN1c3RvbSBgdG9TdHJpbmdgIG1ldGhvZFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGFjdHVhbCA9IGxvd2VyY2FzZSgnJyArIGFjdHVhbCk7XG4gICAgICBleHBlY3RlZCA9IGxvd2VyY2FzZSgnJyArIGV4cGVjdGVkKTtcbiAgICAgIHJldHVybiBhY3R1YWwuaW5kZXhPZihleHBlY3RlZCkgIT09IC0xO1xuICAgIH07XG4gIH1cblxuICBwcmVkaWNhdGVGbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICBpZiAoc2hvdWxkTWF0Y2hQcmltaXRpdmVzICYmICFpc09iamVjdChpdGVtKSkge1xuICAgICAgcmV0dXJuIGRlZXBDb21wYXJlKGl0ZW0sIGV4cHJlc3Npb25bYW55UHJvcGVydHlLZXldLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gZGVlcENvbXBhcmUoaXRlbSwgZXhwcmVzc2lvbiwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIG1hdGNoQWdhaW5zdEFueVByb3ApO1xuICB9O1xuXG4gIHJldHVybiBwcmVkaWNhdGVGbjtcbn1cblxuZnVuY3Rpb24gZGVlcENvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIG1hdGNoQWdhaW5zdEFueVByb3AsIGRvbnRNYXRjaFdob2xlT2JqZWN0KSB7XG4gIHZhciBhY3R1YWxUeXBlID0gZ2V0VHlwZUZvckZpbHRlcihhY3R1YWwpO1xuICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZUZvckZpbHRlcihleHBlY3RlZCk7XG5cbiAgaWYgKChleHBlY3RlZFR5cGUgPT09ICdzdHJpbmcnKSAmJiAoZXhwZWN0ZWQuY2hhckF0KDApID09PSAnIScpKSB7XG4gICAgcmV0dXJuICFkZWVwQ29tcGFyZShhY3R1YWwsIGV4cGVjdGVkLnN1YnN0cmluZygxKSwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIG1hdGNoQWdhaW5zdEFueVByb3ApO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoYWN0dWFsKSkge1xuICAgIC8vIEluIGNhc2UgYGFjdHVhbGAgaXMgYW4gYXJyYXksIGNvbnNpZGVyIGl0IGEgbWF0Y2hcbiAgICAvLyBpZiBBTlkgb2YgaXQncyBpdGVtcyBtYXRjaGVzIGBleHBlY3RlZGBcbiAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgcmV0dXJuIGRlZXBDb21wYXJlKGl0ZW0sIGV4cGVjdGVkLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgbWF0Y2hBZ2FpbnN0QW55UHJvcCk7XG4gICAgfSk7XG4gIH1cblxuICBzd2l0Y2ggKGFjdHVhbFR5cGUpIHtcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgdmFyIGtleTtcbiAgICAgIGlmIChtYXRjaEFnYWluc3RBbnlQcm9wKSB7XG4gICAgICAgIGZvciAoa2V5IGluIGFjdHVhbCkge1xuICAgICAgICAgIGlmICgoa2V5LmNoYXJBdCgwKSAhPT0gJyQnKSAmJiBkZWVwQ29tcGFyZShhY3R1YWxba2V5XSwgZXhwZWN0ZWQsIGNvbXBhcmF0b3IsIGFueVByb3BlcnR5S2V5LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb250TWF0Y2hXaG9sZU9iamVjdCA/IGZhbHNlIDogZGVlcENvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCwgY29tcGFyYXRvciwgYW55UHJvcGVydHlLZXksIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGtleSBpbiBleHBlY3RlZCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZFZhbCA9IGV4cGVjdGVkW2tleV07XG4gICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRWYWwpIHx8IGlzVW5kZWZpbmVkKGV4cGVjdGVkVmFsKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG1hdGNoQW55UHJvcGVydHkgPSBrZXkgPT09IGFueVByb3BlcnR5S2V5O1xuICAgICAgICAgIHZhciBhY3R1YWxWYWwgPSBtYXRjaEFueVByb3BlcnR5ID8gYWN0dWFsIDogYWN0dWFsW2tleV07XG4gICAgICAgICAgaWYgKCFkZWVwQ29tcGFyZShhY3R1YWxWYWwsIGV4cGVjdGVkVmFsLCBjb21wYXJhdG9yLCBhbnlQcm9wZXJ0eUtleSwgbWF0Y2hBbnlQcm9wZXJ0eSwgbWF0Y2hBbnlQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihhY3R1YWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb21wYXJhdG9yKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICB9XG59XG5cbi8vIFVzZWQgZm9yIGVhc2lseSBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBgbnVsbGAgYW5kIGFjdHVhbCBgb2JqZWN0YFxuZnVuY3Rpb24gZ2V0VHlwZUZvckZpbHRlcih2YWwpIHtcbiAgcmV0dXJuICh2YWwgPT09IG51bGwpID8gJ251bGwnIDogdHlwZW9mIHZhbDtcbn1cblxudmFyIE1BWF9ESUdJVFMgPSAyMjtcbnZhciBERUNJTUFMX1NFUCA9ICcuJztcbnZhciBaRVJPX0NIQVIgPSAnMCc7XG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgY3VycmVuY3lcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGEgY3VycmVuY3kgKGllICQxLDIzNC41NikuIFdoZW4gbm8gY3VycmVuY3kgc3ltYm9sIGlzIHByb3ZpZGVkLCBkZWZhdWx0XG4gKiBzeW1ib2wgZm9yIGN1cnJlbnQgbG9jYWxlIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudCBJbnB1dCB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZz19IHN5bWJvbCBDdXJyZW5jeSBzeW1ib2wgb3IgaWRlbnRpZmllciB0byBiZSBkaXNwbGF5ZWQuXG4gKiBAcGFyYW0ge251bWJlcj19IGZyYWN0aW9uU2l6ZSBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdGhlIGFtb3VudCB0bywgZGVmYXVsdHMgdG8gZGVmYXVsdCBtYXggZnJhY3Rpb24gc2l6ZSBmb3IgY3VycmVudCBsb2NhbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBudW1iZXIuXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJjdXJyZW5jeUV4YW1wbGVcIiBuYW1lPVwiY3VycmVuY3ktZmlsdGVyXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjdXJyZW5jeUV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAkc2NvcGUuYW1vdW50ID0gMTIzNC41NjtcbiAgICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwiYW1vdW50XCIgYXJpYS1sYWJlbD1cImFtb3VudFwiPiA8YnI+XG4gICAgICAgICBkZWZhdWx0IGN1cnJlbmN5IHN5bWJvbCAoJCk6IDxzcGFuIGlkPVwiY3VycmVuY3ktZGVmYXVsdFwiPnt7YW1vdW50IHwgY3VycmVuY3l9fTwvc3Bhbj48YnI+XG4gICAgICAgICBjdXN0b20gY3VycmVuY3kgaWRlbnRpZmllciAoVVNEJCk6IDxzcGFuIGlkPVwiY3VycmVuY3ktY3VzdG9tXCI+e3thbW91bnQgfCBjdXJyZW5jeTpcIlVTRCRcIn19PC9zcGFuPjxicj5cbiAgICAgICAgIG5vIGZyYWN0aW9ucyAoMCk6IDxzcGFuIGlkPVwiY3VycmVuY3ktbm8tZnJhY3Rpb25zXCI+e3thbW91bnQgfCBjdXJyZW5jeTpcIlVTRCRcIjowfX08L3NwYW4+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgaW5pdCB3aXRoIDEyMzQuNTYnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXJyZW5jeS1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnJDEsMjM0LjU2Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM0LjU2Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktbm8tZnJhY3Rpb25zJykpLmdldFRleHQoKSkudG9CZSgnVVNEJDEsMjM1Jyk7XG4gICAgICAgfSk7XG4gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09PSAnc2FmYXJpJykge1xuICAgICAgICAgICAvLyBTYWZhcmkgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgbWludXMga2V5LiBTZWVcbiAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNDgxXG4gICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2Ftb3VudCcpKS5jbGVhcigpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnYW1vdW50JykpLnNlbmRLZXlzKCctMTIzNCcpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LWRlZmF1bHQnKSkuZ2V0VGV4dCgpKS50b0JlKCctJDEsMjM0LjAwJyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY3VycmVuY3ktY3VzdG9tJykpLmdldFRleHQoKSkudG9CZSgnLVVTRCQxLDIzNC4wMCcpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2N1cnJlbmN5LW5vLWZyYWN0aW9ucycpKS5nZXRUZXh0KCkpLnRvQmUoJy1VU0QkMSwyMzQnKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5jdXJyZW5jeUZpbHRlci4kaW5qZWN0ID0gWyckbG9jYWxlJ107XG5mdW5jdGlvbiBjdXJyZW5jeUZpbHRlcigkbG9jYWxlKSB7XG4gIHZhciBmb3JtYXRzID0gJGxvY2FsZS5OVU1CRVJfRk9STUFUUztcbiAgcmV0dXJuIGZ1bmN0aW9uKGFtb3VudCwgY3VycmVuY3lTeW1ib2wsIGZyYWN0aW9uU2l6ZSkge1xuICAgIGlmIChpc1VuZGVmaW5lZChjdXJyZW5jeVN5bWJvbCkpIHtcbiAgICAgIGN1cnJlbmN5U3ltYm9sID0gZm9ybWF0cy5DVVJSRU5DWV9TWU07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKGZyYWN0aW9uU2l6ZSkpIHtcbiAgICAgIGZyYWN0aW9uU2l6ZSA9IGZvcm1hdHMuUEFUVEVSTlNbMV0ubWF4RnJhYztcbiAgICB9XG5cbiAgICAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZCBwYXNzIGl0IHRocm91Z2hcbiAgICByZXR1cm4gKGFtb3VudCA9PSBudWxsKVxuICAgICAgICA/IGFtb3VudFxuICAgICAgICA6IGZvcm1hdE51bWJlcihhbW91bnQsIGZvcm1hdHMuUEFUVEVSTlNbMV0sIGZvcm1hdHMuR1JPVVBfU0VQLCBmb3JtYXRzLkRFQ0lNQUxfU0VQLCBmcmFjdGlvblNpemUpLlxuICAgICAgICAgICAgcmVwbGFjZSgvXFx1MDBBNC9nLCBjdXJyZW5jeVN5bWJvbCk7XG4gIH07XG59XG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgbnVtYmVyXG4gKiBAa2luZCBmdW5jdGlvblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRm9ybWF0cyBhIG51bWJlciBhcyB0ZXh0LlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZCwgaXQgd2lsbCBqdXN0IGJlIHJldHVybmVkLlxuICogSWYgdGhlIGlucHV0IGlzIGluZmluaXRlIChJbmZpbml0eSBvciAtSW5maW5pdHkpLCB0aGUgSW5maW5pdHkgc3ltYm9sICfiiJ4nIG9yICct4oieJyBpcyByZXR1cm5lZCwgcmVzcGVjdGl2ZWx5LlxuICogSWYgdGhlIGlucHV0IGlzIG5vdCBhIG51bWJlciBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gbnVtYmVyIE51bWJlciB0byBmb3JtYXQuXG4gKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKT19IGZyYWN0aW9uU2l6ZSBOdW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdGhlIG51bWJlciB0by5cbiAqIElmIHRoaXMgaXMgbm90IHByb3ZpZGVkIHRoZW4gdGhlIGZyYWN0aW9uIHNpemUgaXMgY29tcHV0ZWQgZnJvbSB0aGUgY3VycmVudCBsb2NhbGUncyBudW1iZXJcbiAqIGZvcm1hdHRpbmcgcGF0dGVybi4gSW4gdGhlIGNhc2Ugb2YgdGhlIGRlZmF1bHQgbG9jYWxlLCBpdCB3aWxsIGJlIDMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBOdW1iZXIgcm91bmRlZCB0byBgZnJhY3Rpb25TaXplYCBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgY3VycmVudFxuICogICAgICAgICAgICAgICAgICAgbG9jYWxlIChlLmcuLCBpbiB0aGUgZW5fVVMgbG9jYWxlIGl0IHdpbGwgaGF2ZSBcIi5cIiBhcyB0aGUgZGVjaW1hbCBzZXBhcmF0b3IgYW5kXG4gKiAgICAgICAgICAgICAgICAgICBpbmNsdWRlIFwiLFwiIGdyb3VwIHNlcGFyYXRvcnMgYWZ0ZXIgZWFjaCB0aGlyZCBkaWdpdCkuXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG1vZHVsZT1cIm51bWJlckZpbHRlckV4YW1wbGVcIiBuYW1lPVwibnVtYmVyLWZpbHRlclwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICBhbmd1bGFyLm1vZHVsZSgnbnVtYmVyRmlsdGVyRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS52YWwgPSAxMjM0LjU2Nzg5O1xuICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxsYWJlbD5FbnRlciBudW1iZXI6IDxpbnB1dCBuZy1tb2RlbD0ndmFsJz48L2xhYmVsPjxicj5cbiAgICAgICAgIERlZmF1bHQgZm9ybWF0dGluZzogPHNwYW4gaWQ9J251bWJlci1kZWZhdWx0Jz57e3ZhbCB8IG51bWJlcn19PC9zcGFuPjxicj5cbiAgICAgICAgIE5vIGZyYWN0aW9uczogPHNwYW4+e3t2YWwgfCBudW1iZXI6MH19PC9zcGFuPjxicj5cbiAgICAgICAgIE5lZ2F0aXZlIG51bWJlcjogPHNwYW4+e3stdmFsIHwgbnVtYmVyOjR9fTwvc3Bhbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBmb3JtYXQgbnVtYmVycycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ251bWJlci1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnMSwyMzQuNTY4Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd2YWwgfCBudW1iZXI6MCcpKS5nZXRUZXh0KCkpLnRvQmUoJzEsMjM1Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCctdmFsIHwgbnVtYmVyOjQnKSkuZ2V0VGV4dCgpKS50b0JlKCctMSwyMzQuNTY3OScpO1xuICAgICAgIH0pO1xuXG4gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3ZhbCcpKS5jbGVhcigpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsJykpLnNlbmRLZXlzKCczMzc0LjMzMycpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ251bWJlci1kZWZhdWx0JykpLmdldFRleHQoKSkudG9CZSgnMywzNzQuMzMzJyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd2YWwgfCBudW1iZXI6MCcpKS5nZXRUZXh0KCkpLnRvQmUoJzMsMzc0Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCctdmFsIHwgbnVtYmVyOjQnKSkuZ2V0VGV4dCgpKS50b0JlKCctMywzNzQuMzMzMCcpO1xuICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xubnVtYmVyRmlsdGVyLiRpbmplY3QgPSBbJyRsb2NhbGUnXTtcbmZ1bmN0aW9uIG51bWJlckZpbHRlcigkbG9jYWxlKSB7XG4gIHZhciBmb3JtYXRzID0gJGxvY2FsZS5OVU1CRVJfRk9STUFUUztcbiAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgZnJhY3Rpb25TaXplKSB7XG5cbiAgICAvLyBpZiBudWxsIG9yIHVuZGVmaW5lZCBwYXNzIGl0IHRocm91Z2hcbiAgICByZXR1cm4gKG51bWJlciA9PSBudWxsKVxuICAgICAgICA/IG51bWJlclxuICAgICAgICA6IGZvcm1hdE51bWJlcihudW1iZXIsIGZvcm1hdHMuUEFUVEVSTlNbMF0sIGZvcm1hdHMuR1JPVVBfU0VQLCBmb3JtYXRzLkRFQ0lNQUxfU0VQLFxuICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvblNpemUpO1xuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgbnVtYmVyIChhcyBhIHN0cmluZykgaW50byB0aHJlZSBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHVzZWRcbiAqIGZvciBmb3JtYXR0aW5nIHRoZSBudW1iZXIuXG4gKlxuICogKFNpZ25pZmljYW50IGJpdHMgb2YgdGhpcyBwYXJzZSBhbGdvcml0aG0gY2FtZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWtlTWNsL2JpZy5qcy8pXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBudW1TdHIgVGhlIG51bWJlciB0byBwYXJzZVxuICogQHJldHVybiB7b2JqZWN0fSBBbiBvYmplY3QgZGVzY3JpYmluZyB0aGlzIG51bWJlciwgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGtleXM6XG4gKiAgLSBkIDogYW4gYXJyYXkgb2YgZGlnaXRzIGNvbnRhaW5pbmcgbGVhZGluZyB6ZXJvcyBhcyBuZWNlc3NhcnlcbiAqICAtIGkgOiB0aGUgbnVtYmVyIG9mIHRoZSBkaWdpdHMgaW4gYGRgIHRoYXQgYXJlIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsIHBvaW50XG4gKiAgLSBlIDogdGhlIGV4cG9uZW50IGZvciBudW1iZXJzIHRoYXQgd291bGQgbmVlZCBtb3JlIHRoYW4gYE1BWF9ESUdJVFNgIGRpZ2l0cyBpbiBgZGBcbiAqXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKG51bVN0cikge1xuICB2YXIgZXhwb25lbnQgPSAwLCBkaWdpdHMsIG51bWJlck9mSW50ZWdlckRpZ2l0cztcbiAgdmFyIGksIGosIHplcm9zO1xuXG4gIC8vIERlY2ltYWwgcG9pbnQ/XG4gIGlmICgobnVtYmVyT2ZJbnRlZ2VyRGlnaXRzID0gbnVtU3RyLmluZGV4T2YoREVDSU1BTF9TRVApKSA+IC0xKSB7XG4gICAgbnVtU3RyID0gbnVtU3RyLnJlcGxhY2UoREVDSU1BTF9TRVAsICcnKTtcbiAgfVxuXG4gIC8vIEV4cG9uZW50aWFsIGZvcm0/XG4gIGlmICgoaSA9IG51bVN0ci5zZWFyY2goL2UvaSkpID4gMCkge1xuICAgIC8vIFdvcmsgb3V0IHRoZSBleHBvbmVudC5cbiAgICBpZiAobnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIDwgMCkgbnVtYmVyT2ZJbnRlZ2VyRGlnaXRzID0gaTtcbiAgICBudW1iZXJPZkludGVnZXJEaWdpdHMgKz0gK251bVN0ci5zbGljZShpICsgMSk7XG4gICAgbnVtU3RyID0gbnVtU3RyLnN1YnN0cmluZygwLCBpKTtcbiAgfSBlbHNlIGlmIChudW1iZXJPZkludGVnZXJEaWdpdHMgPCAwKSB7XG4gICAgLy8gVGhlcmUgd2FzIG5vIGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQgc28gaXQgaXMgYW4gaW50ZWdlci5cbiAgICBudW1iZXJPZkludGVnZXJEaWdpdHMgPSBudW1TdHIubGVuZ3RoO1xuICB9XG5cbiAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zLlxuICBmb3IgKGkgPSAwOyBudW1TdHIuY2hhckF0KGkpID09PSBaRVJPX0NIQVI7IGkrKykgeyAvKiBlbXB0eSAqLyB9XG5cbiAgaWYgKGkgPT09ICh6ZXJvcyA9IG51bVN0ci5sZW5ndGgpKSB7XG4gICAgLy8gVGhlIGRpZ2l0cyBhcmUgYWxsIHplcm8uXG4gICAgZGlnaXRzID0gWzBdO1xuICAgIG51bWJlck9mSW50ZWdlckRpZ2l0cyA9IDE7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvc1xuICAgIHplcm9zLS07XG4gICAgd2hpbGUgKG51bVN0ci5jaGFyQXQoemVyb3MpID09PSBaRVJPX0NIQVIpIHplcm9zLS07XG5cbiAgICAvLyBUcmFpbGluZyB6ZXJvcyBhcmUgaW5zaWduaWZpY2FudCBzbyBpZ25vcmUgdGhlbVxuICAgIG51bWJlck9mSW50ZWdlckRpZ2l0cyAtPSBpO1xuICAgIGRpZ2l0cyA9IFtdO1xuICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIGFycmF5IG9mIGRpZ2l0cyB3aXRob3V0IGxlYWRpbmcvdHJhaWxpbmcgemVyb3MuXG4gICAgZm9yIChqID0gMDsgaSA8PSB6ZXJvczsgaSsrLCBqKyspIHtcbiAgICAgIGRpZ2l0c1tqXSA9ICtudW1TdHIuY2hhckF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBudW1iZXIgb3ZlcmZsb3dzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGlnaXRzIHRoZW4gdXNlIGFuIGV4cG9uZW50LlxuICBpZiAobnVtYmVyT2ZJbnRlZ2VyRGlnaXRzID4gTUFYX0RJR0lUUykge1xuICAgIGRpZ2l0cyA9IGRpZ2l0cy5zcGxpY2UoMCwgTUFYX0RJR0lUUyAtIDEpO1xuICAgIGV4cG9uZW50ID0gbnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIC0gMTtcbiAgICBudW1iZXJPZkludGVnZXJEaWdpdHMgPSAxO1xuICB9XG5cbiAgcmV0dXJuIHsgZDogZGlnaXRzLCBlOiBleHBvbmVudCwgaTogbnVtYmVyT2ZJbnRlZ2VyRGlnaXRzIH07XG59XG5cbi8qKlxuICogUm91bmQgdGhlIHBhcnNlZCBudW1iZXIgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlZCB0aGUgcGFyc2VkTnVtYmVyIGluLXBsYWNlXG4gKi9cbmZ1bmN0aW9uIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgZnJhY3Rpb25TaXplLCBtaW5GcmFjLCBtYXhGcmFjKSB7XG4gICAgdmFyIGRpZ2l0cyA9IHBhcnNlZE51bWJlci5kO1xuICAgIHZhciBmcmFjdGlvbkxlbiA9IGRpZ2l0cy5sZW5ndGggLSBwYXJzZWROdW1iZXIuaTtcblxuICAgIC8vIGRldGVybWluZSBmcmFjdGlvblNpemUgaWYgaXQgaXMgbm90IHNwZWNpZmllZDsgYCtmcmFjdGlvblNpemVgIGNvbnZlcnRzIGl0IHRvIGEgbnVtYmVyXG4gICAgZnJhY3Rpb25TaXplID0gKGlzVW5kZWZpbmVkKGZyYWN0aW9uU2l6ZSkpID8gTWF0aC5taW4oTWF0aC5tYXgobWluRnJhYywgZnJhY3Rpb25MZW4pLCBtYXhGcmFjKSA6ICtmcmFjdGlvblNpemU7XG5cbiAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0IHRvIHdoZXJlIHJvdW5kaW5nIGlzIHRvIG9jY3VyXG4gICAgdmFyIHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyBwYXJzZWROdW1iZXIuaTtcbiAgICB2YXIgZGlnaXQgPSBkaWdpdHNbcm91bmRBdF07XG5cbiAgICBpZiAocm91bmRBdCA+IDApIHtcbiAgICAgIC8vIERyb3AgZnJhY3Rpb25hbCBkaWdpdHMgYmV5b25kIGByb3VuZEF0YFxuICAgICAgZGlnaXRzLnNwbGljZShNYXRoLm1heChwYXJzZWROdW1iZXIuaSwgcm91bmRBdCkpO1xuXG4gICAgICAvLyBTZXQgbm9uLWZyYWN0aW9uYWwgZGlnaXRzIGJleW9uZCBgcm91bmRBdGAgdG8gMFxuICAgICAgZm9yICh2YXIgaiA9IHJvdW5kQXQ7IGogPCBkaWdpdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgZGlnaXRzW2pdID0gMDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugcm91bmRlZCB0byB6ZXJvIHNvIHJlc2V0IHRoZSBwYXJzZWROdW1iZXJcbiAgICAgIGZyYWN0aW9uTGVuID0gTWF0aC5tYXgoMCwgZnJhY3Rpb25MZW4pO1xuICAgICAgcGFyc2VkTnVtYmVyLmkgPSAxO1xuICAgICAgZGlnaXRzLmxlbmd0aCA9IE1hdGgubWF4KDEsIHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyAxKTtcbiAgICAgIGRpZ2l0c1swXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJvdW5kQXQ7IGkrKykgZGlnaXRzW2ldID0gMDtcbiAgICB9XG5cbiAgICBpZiAoZGlnaXQgPj0gNSkge1xuICAgICAgaWYgKHJvdW5kQXQgLSAxIDwgMCkge1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA+IHJvdW5kQXQ7IGstLSkge1xuICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApO1xuICAgICAgICAgIHBhcnNlZE51bWJlci5pKys7XG4gICAgICAgIH1cbiAgICAgICAgZGlnaXRzLnVuc2hpZnQoMSk7XG4gICAgICAgIHBhcnNlZE51bWJlci5pKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaWdpdHNbcm91bmRBdCAtIDFdKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFkIG91dCB3aXRoIHplcm9zIHRvIGdldCB0aGUgcmVxdWlyZWQgZnJhY3Rpb24gbGVuZ3RoXG4gICAgZm9yICg7IGZyYWN0aW9uTGVuIDwgTWF0aC5tYXgoMCwgZnJhY3Rpb25TaXplKTsgZnJhY3Rpb25MZW4rKykgZGlnaXRzLnB1c2goMCk7XG5cblxuICAgIC8vIERvIGFueSBjYXJyeWluZywgZS5nLiBhIGRpZ2l0IHdhcyByb3VuZGVkIHVwIHRvIDEwXG4gICAgdmFyIGNhcnJ5ID0gZGlnaXRzLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uKGNhcnJ5LCBkLCBpLCBkaWdpdHMpIHtcbiAgICAgIGQgPSBkICsgY2Fycnk7XG4gICAgICBkaWdpdHNbaV0gPSBkICUgMTA7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihkIC8gMTApO1xuICAgIH0sIDApO1xuICAgIGlmIChjYXJyeSkge1xuICAgICAgZGlnaXRzLnVuc2hpZnQoY2FycnkpO1xuICAgICAgcGFyc2VkTnVtYmVyLmkrKztcbiAgICB9XG59XG5cbi8qKlxuICogRm9ybWF0IGEgbnVtYmVyIGludG8gYSBzdHJpbmdcbiAqIEBwYXJhbSAge251bWJlcn0gbnVtYmVyICAgICAgIFRoZSBudW1iZXIgdG8gZm9ybWF0XG4gKiBAcGFyYW0gIHt7XG4gKiAgICAgICAgICAgbWluRnJhYywgLy8gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgZnJhY3Rpb24gcGFydCBvZiB0aGUgbnVtYmVyXG4gKiAgICAgICAgICAgbWF4RnJhYywgLy8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgZnJhY3Rpb24gcGFydCBvZiB0aGUgbnVtYmVyXG4gKiAgICAgICAgICAgZ1NpemUsICAgLy8gbnVtYmVyIG9mIGRpZ2l0cyBpbiBlYWNoIGdyb3VwIG9mIHNlcGFyYXRlZCBkaWdpdHNcbiAqICAgICAgICAgICBsZ1NpemUsICAvLyBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBsYXN0IGdyb3VwIG9mIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgc2VwYXJhdG9yXG4gKiAgICAgICAgICAgbmVnUHJlLCAgLy8gdGhlIHN0cmluZyB0byBnbyBpbiBmcm9udCBvZiBhIG5lZ2F0aXZlIG51bWJlciAoZS5nLiBgLWAgb3IgYChgKSlcbiAqICAgICAgICAgICBwb3NQcmUsICAvLyB0aGUgc3RyaW5nIHRvIGdvIGluIGZyb250IG9mIGEgcG9zaXRpdmUgbnVtYmVyXG4gKiAgICAgICAgICAgbmVnU3VmLCAgLy8gdGhlIHN0cmluZyB0byBnbyBhZnRlciBhIG5lZ2F0aXZlIG51bWJlciAoZS5nLiBgKWApXG4gKiAgICAgICAgICAgcG9zU3VmICAgLy8gdGhlIHN0cmluZyB0byBnbyBhZnRlciBhIHBvc2l0aXZlIG51bWJlclxuICogICAgICAgICB9fSBwYXR0ZXJuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGdyb3VwU2VwICAgICBUaGUgc3RyaW5nIHRvIHNlcGFyYXRlIGdyb3VwcyBvZiBudW1iZXIgKGUuZy4gYCxgKVxuICogQHBhcmFtICB7c3RyaW5nfSBkZWNpbWFsU2VwICAgVGhlIHN0cmluZyB0byBhY3QgYXMgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIChlLmcuIGAuYClcbiAqIEBwYXJhbSAge1t0eXBlXX0gZnJhY3Rpb25TaXplIFRoZSBzaXplIG9mIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIG51bWJlclxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgVGhlIG51bWJlciBmb3JtYXR0ZWQgYXMgYSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG51bWJlciwgcGF0dGVybiwgZ3JvdXBTZXAsIGRlY2ltYWxTZXAsIGZyYWN0aW9uU2l6ZSkge1xuXG4gIGlmICghKGlzU3RyaW5nKG51bWJlcikgfHwgaXNOdW1iZXIobnVtYmVyKSkgfHwgaXNOYU4obnVtYmVyKSkgcmV0dXJuICcnO1xuXG4gIHZhciBpc0luZmluaXR5ID0gIWlzRmluaXRlKG51bWJlcik7XG4gIHZhciBpc1plcm8gPSBmYWxzZTtcbiAgdmFyIG51bVN0ciA9IE1hdGguYWJzKG51bWJlcikgKyAnJyxcbiAgICAgIGZvcm1hdHRlZFRleHQgPSAnJyxcbiAgICAgIHBhcnNlZE51bWJlcjtcblxuICBpZiAoaXNJbmZpbml0eSkge1xuICAgIGZvcm1hdHRlZFRleHQgPSAnXFx1MjIxZSc7XG4gIH0gZWxzZSB7XG4gICAgcGFyc2VkTnVtYmVyID0gcGFyc2UobnVtU3RyKTtcblxuICAgIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgZnJhY3Rpb25TaXplLCBwYXR0ZXJuLm1pbkZyYWMsIHBhdHRlcm4ubWF4RnJhYyk7XG5cbiAgICB2YXIgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmQ7XG4gICAgdmFyIGludGVnZXJMZW4gPSBwYXJzZWROdW1iZXIuaTtcbiAgICB2YXIgZXhwb25lbnQgPSBwYXJzZWROdW1iZXIuZTtcbiAgICB2YXIgZGVjaW1hbHMgPSBbXTtcbiAgICBpc1plcm8gPSBkaWdpdHMucmVkdWNlKGZ1bmN0aW9uKGlzWmVybywgZCkgeyByZXR1cm4gaXNaZXJvICYmICFkOyB9LCB0cnVlKTtcblxuICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVyc1xuICAgIHdoaWxlIChpbnRlZ2VyTGVuIDwgMCkge1xuICAgICAgZGlnaXRzLnVuc2hpZnQoMCk7XG4gICAgICBpbnRlZ2VyTGVuKys7XG4gICAgfVxuXG4gICAgLy8gZXh0cmFjdCBkZWNpbWFscyBkaWdpdHNcbiAgICBpZiAoaW50ZWdlckxlbiA+IDApIHtcbiAgICAgIGRlY2ltYWxzID0gZGlnaXRzLnNwbGljZShpbnRlZ2VyTGVuLCBkaWdpdHMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVjaW1hbHMgPSBkaWdpdHM7XG4gICAgICBkaWdpdHMgPSBbMF07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IHRoZSBpbnRlZ2VyIGRpZ2l0cyB3aXRoIGdyb3VwaW5nIHNlcGFyYXRvcnNcbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgaWYgKGRpZ2l0cy5sZW5ndGggPj0gcGF0dGVybi5sZ1NpemUpIHtcbiAgICAgIGdyb3Vwcy51bnNoaWZ0KGRpZ2l0cy5zcGxpY2UoLXBhdHRlcm4ubGdTaXplLCBkaWdpdHMubGVuZ3RoKS5qb2luKCcnKSk7XG4gICAgfVxuICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoID4gcGF0dGVybi5nU2l6ZSkge1xuICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5nU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpO1xuICAgIH1cbiAgICBpZiAoZGlnaXRzLmxlbmd0aCkge1xuICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLmpvaW4oJycpKTtcbiAgICB9XG4gICAgZm9ybWF0dGVkVGV4dCA9IGdyb3Vwcy5qb2luKGdyb3VwU2VwKTtcblxuICAgIC8vIGFwcGVuZCB0aGUgZGVjaW1hbCBkaWdpdHNcbiAgICBpZiAoZGVjaW1hbHMubGVuZ3RoKSB7XG4gICAgICBmb3JtYXR0ZWRUZXh0ICs9IGRlY2ltYWxTZXAgKyBkZWNpbWFscy5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoZXhwb25lbnQpIHtcbiAgICAgIGZvcm1hdHRlZFRleHQgKz0gJ2UrJyArIGV4cG9uZW50O1xuICAgIH1cbiAgfVxuICBpZiAobnVtYmVyIDwgMCAmJiAhaXNaZXJvKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4ubmVnUHJlICsgZm9ybWF0dGVkVGV4dCArIHBhdHRlcm4ubmVnU3VmO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXR0ZXJuLnBvc1ByZSArIGZvcm1hdHRlZFRleHQgKyBwYXR0ZXJuLnBvc1N1ZjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYWROdW1iZXIobnVtLCBkaWdpdHMsIHRyaW0sIG5lZ1dyYXApIHtcbiAgdmFyIG5lZyA9ICcnO1xuICBpZiAobnVtIDwgMCB8fCAobmVnV3JhcCAmJiBudW0gPD0gMCkpIHtcbiAgICBpZiAobmVnV3JhcCkge1xuICAgICAgbnVtID0gLW51bSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG51bSA9IC1udW07XG4gICAgICBuZWcgPSAnLSc7XG4gICAgfVxuICB9XG4gIG51bSA9ICcnICsgbnVtO1xuICB3aGlsZSAobnVtLmxlbmd0aCA8IGRpZ2l0cykgbnVtID0gWkVST19DSEFSICsgbnVtO1xuICBpZiAodHJpbSkge1xuICAgIG51bSA9IG51bS5zdWJzdHIobnVtLmxlbmd0aCAtIGRpZ2l0cyk7XG4gIH1cbiAgcmV0dXJuIG5lZyArIG51bTtcbn1cblxuXG5mdW5jdGlvbiBkYXRlR2V0dGVyKG5hbWUsIHNpemUsIG9mZnNldCwgdHJpbSwgbmVnV3JhcCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgdmFsdWUgPSBkYXRlWydnZXQnICsgbmFtZV0oKTtcbiAgICBpZiAob2Zmc2V0ID4gMCB8fCB2YWx1ZSA+IC1vZmZzZXQpIHtcbiAgICAgIHZhbHVlICs9IG9mZnNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAwICYmIG9mZnNldCA9PT0gLTEyKSB2YWx1ZSA9IDEyO1xuICAgIHJldHVybiBwYWROdW1iZXIodmFsdWUsIHNpemUsIHRyaW0sIG5lZ1dyYXApO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkYXRlU3RyR2V0dGVyKG5hbWUsIHNob3J0Rm9ybSwgc3RhbmRBbG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgZm9ybWF0cykge1xuICAgIHZhciB2YWx1ZSA9IGRhdGVbJ2dldCcgKyBuYW1lXSgpO1xuICAgIHZhciBwcm9wUHJlZml4ID0gKHN0YW5kQWxvbmUgPyAnU1RBTkRBTE9ORScgOiAnJykgKyAoc2hvcnRGb3JtID8gJ1NIT1JUJyA6ICcnKTtcbiAgICB2YXIgZ2V0ID0gdXBwZXJjYXNlKHByb3BQcmVmaXggKyBuYW1lKTtcblxuICAgIHJldHVybiBmb3JtYXRzW2dldF1bdmFsdWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0aW1lWm9uZUdldHRlcihkYXRlLCBmb3JtYXRzLCBvZmZzZXQpIHtcbiAgdmFyIHpvbmUgPSAtMSAqIG9mZnNldDtcbiAgdmFyIHBhZGRlZFpvbmUgPSAoem9uZSA+PSAwKSA/ICcrJyA6ICcnO1xuXG4gIHBhZGRlZFpvbmUgKz0gcGFkTnVtYmVyKE1hdGhbem9uZSA+IDAgPyAnZmxvb3InIDogJ2NlaWwnXSh6b25lIC8gNjApLCAyKSArXG4gICAgICAgICAgICAgICAgcGFkTnVtYmVyKE1hdGguYWJzKHpvbmUgJSA2MCksIDIpO1xuXG4gIHJldHVybiBwYWRkZWRab25lO1xufVxuXG5mdW5jdGlvbiBnZXRGaXJzdFRodXJzZGF5T2ZZZWFyKHllYXIpIHtcbiAgICAvLyAwID0gaW5kZXggb2YgSmFudWFyeVxuICAgIHZhciBkYXlPZldlZWtPbkZpcnN0ID0gKG5ldyBEYXRlKHllYXIsIDAsIDEpKS5nZXREYXkoKTtcbiAgICAvLyA0ID0gaW5kZXggb2YgVGh1cnNkYXkgKCsxIHRvIGFjY291bnQgZm9yIDFzdCA9IDUpXG4gICAgLy8gMTEgPSBpbmRleCBvZiAqbmV4dCogVGh1cnNkYXkgKCsxIGFjY291bnQgZm9yIDFzdCA9IDEyKVxuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAoKGRheU9mV2Vla09uRmlyc3QgPD0gNCkgPyA1IDogMTIpIC0gZGF5T2ZXZWVrT25GaXJzdCk7XG59XG5cbmZ1bmN0aW9uIGdldFRodXJzZGF5VGhpc1dlZWsoZGF0ZXRpbWUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZXRpbWUuZ2V0RnVsbFllYXIoKSwgZGF0ZXRpbWUuZ2V0TW9udGgoKSxcbiAgICAgIC8vIDQgPSBpbmRleCBvZiBUaHVyc2RheVxuICAgICAgZGF0ZXRpbWUuZ2V0RGF0ZSgpICsgKDQgLSBkYXRldGltZS5nZXREYXkoKSkpO1xufVxuXG5mdW5jdGlvbiB3ZWVrR2V0dGVyKHNpemUpIHtcbiAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgZmlyc3RUaHVycyA9IGdldEZpcnN0VGh1cnNkYXlPZlllYXIoZGF0ZS5nZXRGdWxsWWVhcigpKSxcbiAgICAgICAgIHRoaXNUaHVycyA9IGdldFRodXJzZGF5VGhpc1dlZWsoZGF0ZSk7XG5cbiAgICAgIHZhciBkaWZmID0gK3RoaXNUaHVycyAtICtmaXJzdFRodXJzLFxuICAgICAgICAgcmVzdWx0ID0gMSArIE1hdGgucm91bmQoZGlmZiAvIDYuMDQ4ZTgpOyAvLyA2LjA0OGU4IG1zIHBlciB3ZWVrXG5cbiAgICAgIHJldHVybiBwYWROdW1iZXIocmVzdWx0LCBzaXplKTtcbiAgIH07XG59XG5cbmZ1bmN0aW9uIGFtcG1HZXR0ZXIoZGF0ZSwgZm9ybWF0cykge1xuICByZXR1cm4gZGF0ZS5nZXRIb3VycygpIDwgMTIgPyBmb3JtYXRzLkFNUE1TWzBdIDogZm9ybWF0cy5BTVBNU1sxXTtcbn1cblxuZnVuY3Rpb24gZXJhR2V0dGVyKGRhdGUsIGZvcm1hdHMpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSA8PSAwID8gZm9ybWF0cy5FUkFTWzBdIDogZm9ybWF0cy5FUkFTWzFdO1xufVxuXG5mdW5jdGlvbiBsb25nRXJhR2V0dGVyKGRhdGUsIGZvcm1hdHMpIHtcbiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSA8PSAwID8gZm9ybWF0cy5FUkFOQU1FU1swXSA6IGZvcm1hdHMuRVJBTkFNRVNbMV07XG59XG5cbnZhciBEQVRFX0ZPUk1BVFMgPSB7XG4gIHl5eXk6IGRhdGVHZXR0ZXIoJ0Z1bGxZZWFyJywgNCwgMCwgZmFsc2UsIHRydWUpLFxuICAgIHl5OiBkYXRlR2V0dGVyKCdGdWxsWWVhcicsIDIsIDAsIHRydWUsIHRydWUpLFxuICAgICB5OiBkYXRlR2V0dGVyKCdGdWxsWWVhcicsIDEsIDAsIGZhbHNlLCB0cnVlKSxcbiAgTU1NTTogZGF0ZVN0ckdldHRlcignTW9udGgnKSxcbiAgIE1NTTogZGF0ZVN0ckdldHRlcignTW9udGgnLCB0cnVlKSxcbiAgICBNTTogZGF0ZUdldHRlcignTW9udGgnLCAyLCAxKSxcbiAgICAgTTogZGF0ZUdldHRlcignTW9udGgnLCAxLCAxKSxcbiAgTExMTDogZGF0ZVN0ckdldHRlcignTW9udGgnLCBmYWxzZSwgdHJ1ZSksXG4gICAgZGQ6IGRhdGVHZXR0ZXIoJ0RhdGUnLCAyKSxcbiAgICAgZDogZGF0ZUdldHRlcignRGF0ZScsIDEpLFxuICAgIEhIOiBkYXRlR2V0dGVyKCdIb3VycycsIDIpLFxuICAgICBIOiBkYXRlR2V0dGVyKCdIb3VycycsIDEpLFxuICAgIGhoOiBkYXRlR2V0dGVyKCdIb3VycycsIDIsIC0xMiksXG4gICAgIGg6IGRhdGVHZXR0ZXIoJ0hvdXJzJywgMSwgLTEyKSxcbiAgICBtbTogZGF0ZUdldHRlcignTWludXRlcycsIDIpLFxuICAgICBtOiBkYXRlR2V0dGVyKCdNaW51dGVzJywgMSksXG4gICAgc3M6IGRhdGVHZXR0ZXIoJ1NlY29uZHMnLCAyKSxcbiAgICAgczogZGF0ZUdldHRlcignU2Vjb25kcycsIDEpLFxuICAgICAvLyB3aGlsZSBJU08gODYwMSByZXF1aXJlcyBmcmFjdGlvbnMgdG8gYmUgcHJlZml4ZWQgd2l0aCBgLmAgb3IgYCxgXG4gICAgIC8vIHdlIGNhbiBiZSBqdXN0IHNhZmVseSByZWx5IG9uIHVzaW5nIGBzc3NgIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHNpbmdsZSBvciB0d28gZGlnaXQgZnJhY3Rpb25zXG4gICBzc3M6IGRhdGVHZXR0ZXIoJ01pbGxpc2Vjb25kcycsIDMpLFxuICBFRUVFOiBkYXRlU3RyR2V0dGVyKCdEYXknKSxcbiAgIEVFRTogZGF0ZVN0ckdldHRlcignRGF5JywgdHJ1ZSksXG4gICAgIGE6IGFtcG1HZXR0ZXIsXG4gICAgIFo6IHRpbWVab25lR2V0dGVyLFxuICAgIHd3OiB3ZWVrR2V0dGVyKDIpLFxuICAgICB3OiB3ZWVrR2V0dGVyKDEpLFxuICAgICBHOiBlcmFHZXR0ZXIsXG4gICAgIEdHOiBlcmFHZXR0ZXIsXG4gICAgIEdHRzogZXJhR2V0dGVyLFxuICAgICBHR0dHOiBsb25nRXJhR2V0dGVyXG59O1xuXG52YXIgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXnlNTGRIaG1zYVpFd0cnXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpFK3x5K3xNK3xMK3xkK3xIK3xoK3xtK3xzK3xhfFp8Ryt8dyspKSguKikvLFxuICAgIE5VTUJFUl9TVFJJTkcgPSAvXi0/XFxkKyQvO1xuXG4vKipcbiAqIEBuZ2RvYyBmaWx0ZXJcbiAqIEBuYW1lIGRhdGVcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiAgIEZvcm1hdHMgYGRhdGVgIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgYGZvcm1hdGAuXG4gKlxuICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6XG4gKlxuICogICAqIGAneXl5eSdgOiA0IGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIgKGUuZy4gQUQgMSA9PiAwMDAxLCBBRCAyMDEwID0+IDIwMTApXG4gKiAgICogYCd5eSdgOiAyIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIsIHBhZGRlZCAoMDAtOTkpLiAoZS5nLiBBRCAyMDAxID0+IDAxLCBBRCAyMDEwID0+IDEwKVxuICogICAqIGAneSdgOiAxIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHllYXIsIGUuZy4gKEFEIDEgPT4gMSwgQUQgMTk5ID0+IDE5OSlcbiAqICAgKiBgJ01NTU0nYDogTW9udGggaW4geWVhciAoSmFudWFyeS1EZWNlbWJlcilcbiAqICAgKiBgJ01NTSdgOiBNb250aCBpbiB5ZWFyIChKYW4tRGVjKVxuICogICAqIGAnTU0nYDogTW9udGggaW4geWVhciwgcGFkZGVkICgwMS0xMilcbiAqICAgKiBgJ00nYDogTW9udGggaW4geWVhciAoMS0xMilcbiAqICAgKiBgJ0xMTEwnYDogU3RhbmQtYWxvbmUgbW9udGggaW4geWVhciAoSmFudWFyeS1EZWNlbWJlcilcbiAqICAgKiBgJ2RkJ2A6IERheSBpbiBtb250aCwgcGFkZGVkICgwMS0zMSlcbiAqICAgKiBgJ2QnYDogRGF5IGluIG1vbnRoICgxLTMxKVxuICogICAqIGAnRUVFRSdgOiBEYXkgaW4gV2VlaywoU3VuZGF5LVNhdHVyZGF5KVxuICogICAqIGAnRUVFJ2A6IERheSBpbiBXZWVrLCAoU3VuLVNhdClcbiAqICAgKiBgJ0hIJ2A6IEhvdXIgaW4gZGF5LCBwYWRkZWQgKDAwLTIzKVxuICogICAqIGAnSCdgOiBIb3VyIGluIGRheSAoMC0yMylcbiAqICAgKiBgJ2hoJ2A6IEhvdXIgaW4gQU0vUE0sIHBhZGRlZCAoMDEtMTIpXG4gKiAgICogYCdoJ2A6IEhvdXIgaW4gQU0vUE0sICgxLTEyKVxuICogICAqIGAnbW0nYDogTWludXRlIGluIGhvdXIsIHBhZGRlZCAoMDAtNTkpXG4gKiAgICogYCdtJ2A6IE1pbnV0ZSBpbiBob3VyICgwLTU5KVxuICogICAqIGAnc3MnYDogU2Vjb25kIGluIG1pbnV0ZSwgcGFkZGVkICgwMC01OSlcbiAqICAgKiBgJ3MnYDogU2Vjb25kIGluIG1pbnV0ZSAoMC01OSlcbiAqICAgKiBgJ3NzcydgOiBNaWxsaXNlY29uZCBpbiBzZWNvbmQsIHBhZGRlZCAoMDAwLTk5OSlcbiAqICAgKiBgJ2EnYDogQU0vUE0gbWFya2VyXG4gKiAgICogYCdaJ2A6IDQgZGlnaXQgKCtzaWduKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGltZXpvbmUgb2Zmc2V0ICgtMTIwMC0rMTIwMClcbiAqICAgKiBgJ3d3J2A6IFdlZWsgb2YgeWVhciwgcGFkZGVkICgwMC01MykuIFdlZWsgMDEgaXMgdGhlIHdlZWsgd2l0aCB0aGUgZmlyc3QgVGh1cnNkYXkgb2YgdGhlIHllYXJcbiAqICAgKiBgJ3cnYDogV2VlayBvZiB5ZWFyICgwLTUzKS4gV2VlayAxIGlzIHRoZSB3ZWVrIHdpdGggdGhlIGZpcnN0IFRodXJzZGF5IG9mIHRoZSB5ZWFyXG4gKiAgICogYCdHJ2AsIGAnR0cnYCwgYCdHR0cnYDogVGhlIGFiYnJldmlhdGVkIGZvcm0gb2YgdGhlIGVyYSBzdHJpbmcgKGUuZy4gJ0FEJylcbiAqICAgKiBgJ0dHR0cnYDogVGhlIGxvbmcgZm9ybSBvZiB0aGUgZXJhIHN0cmluZyAoZS5nLiAnQW5ubyBEb21pbmknKVxuICpcbiAqICAgYGZvcm1hdGAgc3RyaW5nIGNhbiBhbHNvIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByZWRlZmluZWRcbiAqICAge0BsaW5rIGd1aWRlL2kxOG4gbG9jYWxpemFibGUgZm9ybWF0c306XG4gKlxuICogICAqIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSBoOm1tOnNzIGEnYCBmb3IgZW5fVVMgbG9jYWxlXG4gKiAgICAgKGUuZy4gU2VwIDMsIDIwMTAgMTI6MDU6MDggUE0pXG4gKiAgICogYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5IGg6bW0gYSdgIGZvciBlbl9VUyAgbG9jYWxlIChlLmcuIDkvMy8xMCAxMjowNSBQTSlcbiAqICAgKiBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHknYCBmb3IgZW5fVVMgIGxvY2FsZVxuICogICAgIChlLmcuIEZyaWRheSwgU2VwdGVtYmVyIDMsIDIwMTApXG4gKiAgICogYCdsb25nRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTU1NTSBkLCB5J2AgZm9yIGVuX1VTICBsb2NhbGUgKGUuZy4gU2VwdGVtYmVyIDMsIDIwMTApXG4gKiAgICogYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSdgIGZvciBlbl9VUyAgbG9jYWxlIChlLmcuIFNlcCAzLCAyMDEwKVxuICogICAqIGAnc2hvcnREYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXknYCBmb3IgZW5fVVMgbG9jYWxlIChlLmcuIDkvMy8xMClcbiAqICAgKiBgJ21lZGl1bVRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gMTI6MDU6MDggUE0pXG4gKiAgICogYCdzaG9ydFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW0gYSdgIGZvciBlbl9VUyBsb2NhbGUgKGUuZy4gMTI6MDUgUE0pXG4gKlxuICogICBgZm9ybWF0YCBzdHJpbmcgY2FuIGNvbnRhaW4gbGl0ZXJhbCB2YWx1ZXMuIFRoZXNlIG5lZWQgdG8gYmUgZXNjYXBlZCBieSBzdXJyb3VuZGluZyB3aXRoIHNpbmdsZSBxdW90ZXMgKGUuZy5cbiAqICAgYFwiaCAnaW4gdGhlIG1vcm5pbmcnXCJgKS4gSW4gb3JkZXIgdG8gb3V0cHV0IGEgc2luZ2xlIHF1b3RlLCBlc2NhcGUgaXQgLSBpLmUuLCB0d28gc2luZ2xlIHF1b3RlcyBpbiBhIHNlcXVlbmNlXG4gKiAgIChlLmcuIGBcImggJ28nJ2Nsb2NrJ1wiYCkuXG4gKlxuICogQHBhcmFtIHsoRGF0ZXxudW1iZXJ8c3RyaW5nKX0gZGF0ZSBEYXRlIHRvIGZvcm1hdCBlaXRoZXIgYXMgRGF0ZSBvYmplY3QsIG1pbGxpc2Vjb25kcyAoc3RyaW5nIG9yXG4gKiAgICBudW1iZXIpIG9yIHZhcmlvdXMgSVNPIDg2MDEgZGF0ZXRpbWUgc3RyaW5nIGZvcm1hdHMgKGUuZy4geXl5eS1NTS1kZFRISDptbTpzcy5zc3NaIGFuZCBpdHNcbiAqICAgIHNob3J0ZXIgdmVyc2lvbnMgbGlrZSB5eXl5LU1NLWRkVEhIOm1tWiwgeXl5eS1NTS1kZCBvciB5eXl5TU1kZFRISG1tc3NaKS4gSWYgbm8gdGltZXpvbmUgaXNcbiAqICAgIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGlucHV0LCB0aGUgdGltZSBpcyBjb25zaWRlcmVkIHRvIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gZm9ybWF0IEZvcm1hdHRpbmcgcnVsZXMgKHNlZSBEZXNjcmlwdGlvbikuIElmIG5vdCBzcGVjaWZpZWQsXG4gKiAgICBgbWVkaXVtRGF0ZWAgaXMgdXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGltZXpvbmUgVGltZXpvbmUgdG8gYmUgdXNlZCBmb3IgZm9ybWF0dGluZy4gSXQgdW5kZXJzdGFuZHMgVVRDL0dNVCBhbmQgdGhlXG4gKiAgICBjb250aW5lbnRhbCBVUyB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucywgYnV0IGZvciBnZW5lcmFsIHVzZSwgdXNlIGEgdGltZSB6b25lIG9mZnNldCwgZm9yXG4gKiAgICBleGFtcGxlLCBgJyswNDMwJ2AgKDQgaG91cnMsIDMwIG1pbnV0ZXMgZWFzdCBvZiB0aGUgR3JlZW53aWNoIG1lcmlkaWFuKVxuICogICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyIHdpbGwgYmUgdXNlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBzdHJpbmcgb3IgdGhlIGlucHV0IGlmIGlucHV0IGlzIG5vdCByZWNvZ25pemVkIGFzIGRhdGUvbWlsbGlzLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwiZmlsdGVyLWRhdGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJ319PC9zcGFuPjpcbiAgICAgICAgICAgPHNwYW4+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTonbWVkaXVtJ319PC9zcGFuPjxicj5cbiAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ319PC9zcGFuPjpcbiAgICAgICAgICA8c3Bhbj57ezEyODgzMjM2MjMwMDYgfCBkYXRlOid5eXl5LU1NLWRkIEhIOm1tOnNzIFonfX08L3NwYW4+PGJyPlxuICAgICAgIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57ezEyODgzMjM2MjMwMDYgfCBkYXRlOidNTS9kZC95eXl5IEAgaDptbWEnfX08L3NwYW4+OlxuICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZTonTU0vZGQveXl5eSBAIGg6bW1hJ319PC9zcGFuPjxicj5cbiAgICAgICA8c3BhbiBuZy1ub24tYmluZGFibGU+e3sxMjg4MzIzNjIzMDA2IHwgZGF0ZTpcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVwifX08L3NwYW4+OlxuICAgICAgICAgIDxzcGFuPnt7JzEyODgzMjM2MjMwMDYnIHwgZGF0ZTpcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVwifX08L3NwYW4+PGJyPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGZvcm1hdCBkYXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKFwiMTI4ODMyMzYyMzAwNiB8IGRhdGU6J21lZGl1bSdcIikpLmdldFRleHQoKSkuXG4gICAgICAgICAgICB0b01hdGNoKC9PY3QgMlxcZCwgMjAxMCBcXGR7MSwyfTpcXGR7Mn06XFxkezJ9IChBTXxQTSkvKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoXCIxMjg4MzIzNjIzMDA2IHwgZGF0ZToneXl5eS1NTS1kZCBISDptbTpzcyBaJ1wiKSkuZ2V0VGV4dCgpKS5cbiAgICAgICAgICAgIHRvTWF0Y2goLzIwMTAtMTAtMlxcZCBcXGR7Mn06XFxkezJ9OlxcZHsyfSAoLXxcXCspP1xcZHs0fS8pO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZyhcIicxMjg4MzIzNjIzMDA2JyB8IGRhdGU6J01NL2RkL3l5eXkgQCBoOm1tYSdcIikpLmdldFRleHQoKSkuXG4gICAgICAgICAgICB0b01hdGNoKC8xMFxcLzJcXGRcXC8yMDEwIEAgXFxkezEsMn06XFxkezJ9KEFNfFBNKS8pO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZyhcIicxMjg4MzIzNjIzMDA2JyB8IGRhdGU6XFxcIk1NL2RkL3l5eXkgJ2F0JyBoOm1tYVxcXCJcIikpLmdldFRleHQoKSkuXG4gICAgICAgICAgICB0b01hdGNoKC8xMFxcLzJcXGRcXC8yMDEwIGF0IFxcZHsxLDJ9OlxcZHsyfShBTXxQTSkvKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5kYXRlRmlsdGVyLiRpbmplY3QgPSBbJyRsb2NhbGUnXTtcbmZ1bmN0aW9uIGRhdGVGaWx0ZXIoJGxvY2FsZSkge1xuXG5cbiAgdmFyIFJfSVNPODYwMV9TVFIgPSAvXihcXGR7NH0pLT8oXFxkXFxkKS0/KFxcZFxcZCkoPzpUKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlxcLihcXGQrKSk/KT8pPyhafChbKy1dKShcXGRcXGQpOj8oXFxkXFxkKSk/KT8kLztcbiAgICAgICAgICAgICAgICAgICAgIC8vIDEgICAgICAgIDIgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNSAgICAgICAgICA2ICAgICAgICAgIDcgICAgICAgICAgOCAgOSAgICAgMTAgICAgICAxMVxuICBmdW5jdGlvbiBqc29uU3RyaW5nVG9EYXRlKHN0cmluZykge1xuICAgIHZhciBtYXRjaDtcbiAgICBpZiAoKG1hdGNoID0gc3RyaW5nLm1hdGNoKFJfSVNPODYwMV9TVFIpKSkge1xuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgwKSxcbiAgICAgICAgICB0ekhvdXIgPSAwLFxuICAgICAgICAgIHR6TWluICA9IDAsXG4gICAgICAgICAgZGF0ZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENGdWxsWWVhciA6IGRhdGUuc2V0RnVsbFllYXIsXG4gICAgICAgICAgdGltZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENIb3VycyA6IGRhdGUuc2V0SG91cnM7XG5cbiAgICAgIGlmIChtYXRjaFs5XSkge1xuICAgICAgICB0ekhvdXIgPSB0b0ludChtYXRjaFs5XSArIG1hdGNoWzEwXSk7XG4gICAgICAgIHR6TWluID0gdG9JbnQobWF0Y2hbOV0gKyBtYXRjaFsxMV0pO1xuICAgICAgfVxuICAgICAgZGF0ZVNldHRlci5jYWxsKGRhdGUsIHRvSW50KG1hdGNoWzFdKSwgdG9JbnQobWF0Y2hbMl0pIC0gMSwgdG9JbnQobWF0Y2hbM10pKTtcbiAgICAgIHZhciBoID0gdG9JbnQobWF0Y2hbNF0gfHwgMCkgLSB0ekhvdXI7XG4gICAgICB2YXIgbSA9IHRvSW50KG1hdGNoWzVdIHx8IDApIC0gdHpNaW47XG4gICAgICB2YXIgcyA9IHRvSW50KG1hdGNoWzZdIHx8IDApO1xuICAgICAgdmFyIG1zID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KCcwLicgKyAobWF0Y2hbN10gfHwgMCkpICogMTAwMCk7XG4gICAgICB0aW1lU2V0dGVyLmNhbGwoZGF0ZSwgaCwgbSwgcywgbXMpO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cblxuXG4gIHJldHVybiBmdW5jdGlvbihkYXRlLCBmb3JtYXQsIHRpbWV6b25lKSB7XG4gICAgdmFyIHRleHQgPSAnJyxcbiAgICAgICAgcGFydHMgPSBbXSxcbiAgICAgICAgZm4sIG1hdGNoO1xuXG4gICAgZm9ybWF0ID0gZm9ybWF0IHx8ICdtZWRpdW1EYXRlJztcbiAgICBmb3JtYXQgPSAkbG9jYWxlLkRBVEVUSU1FX0ZPUk1BVFNbZm9ybWF0XSB8fCBmb3JtYXQ7XG4gICAgaWYgKGlzU3RyaW5nKGRhdGUpKSB7XG4gICAgICBkYXRlID0gTlVNQkVSX1NUUklORy50ZXN0KGRhdGUpID8gdG9JbnQoZGF0ZSkgOiBqc29uU3RyaW5nVG9EYXRlKGRhdGUpO1xuICAgIH1cblxuICAgIGlmIChpc051bWJlcihkYXRlKSkge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIH1cblxuICAgIGlmICghaXNEYXRlKGRhdGUpIHx8ICFpc0Zpbml0ZShkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIHdoaWxlIChmb3JtYXQpIHtcbiAgICAgIG1hdGNoID0gREFURV9GT1JNQVRTX1NQTElULmV4ZWMoZm9ybWF0KTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBwYXJ0cyA9IGNvbmNhdChwYXJ0cywgbWF0Y2gsIDEpO1xuICAgICAgICBmb3JtYXQgPSBwYXJ0cy5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnB1c2goZm9ybWF0KTtcbiAgICAgICAgZm9ybWF0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KTtcbiAgICAgIGRhdGUgPSBjb252ZXJ0VGltZXpvbmVUb0xvY2FsKGRhdGUsIHRpbWV6b25lLCB0cnVlKTtcbiAgICB9XG4gICAgZm9yRWFjaChwYXJ0cywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGZuID0gREFURV9GT1JNQVRTW3ZhbHVlXTtcbiAgICAgIHRleHQgKz0gZm4gPyBmbihkYXRlLCAkbG9jYWxlLkRBVEVUSU1FX0ZPUk1BVFMsIGRhdGVUaW1lem9uZU9mZnNldClcbiAgICAgICAgICAgICAgICAgOiB2YWx1ZSA9PT0gJ1xcJ1xcJycgPyAnXFwnJyA6IHZhbHVlLnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICdcXCcnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9O1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUganNvblxuICogQGtpbmQgZnVuY3Rpb25cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgQWxsb3dzIHlvdSB0byBjb252ZXJ0IGEgSmF2YVNjcmlwdCBvYmplY3QgaW50byBKU09OIHN0cmluZy5cbiAqXG4gKiAgIFRoaXMgZmlsdGVyIGlzIG1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gV2hlbiB1c2luZyB0aGUgZG91YmxlIGN1cmx5IHt7dmFsdWV9fSBub3RhdGlvblxuICogICB0aGUgYmluZGluZyBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBKU09OLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IEFueSBKYXZhU2NyaXB0IG9iamVjdCAoaW5jbHVkaW5nIGFycmF5cyBhbmQgcHJpbWl0aXZlIHR5cGVzKSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge251bWJlcj19IHNwYWNpbmcgVGhlIG51bWJlciBvZiBzcGFjZXMgdG8gdXNlIHBlciBpbmRlbnRhdGlvbiwgZGVmYXVsdHMgdG8gMi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEpTT04gc3RyaW5nLlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cImZpbHRlci1qc29uXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHByZSBpZD1cImRlZmF1bHQtc3BhY2luZ1wiPnt7IHsnbmFtZSc6J3ZhbHVlJ30gfCBqc29uIH19PC9wcmU+XG4gICAgICAgPHByZSBpZD1cImN1c3RvbS1zcGFjaW5nXCI+e3sgeyduYW1lJzondmFsdWUnfSB8IGpzb246NCB9fTwvcHJlPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGpzb25pZnkgZmlsdGVyZWQgb2JqZWN0cycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RlZmF1bHQtc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1xce1xcbiB7Mn1cIm5hbWVcIjogP1widmFsdWVcIlxcbn0vKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdjdXN0b20tc3BhY2luZycpKS5nZXRUZXh0KCkpLnRvTWF0Y2goL1xce1xcbiB7NH1cIm5hbWVcIjogP1widmFsdWVcIlxcbn0vKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICpcbiAqL1xuZnVuY3Rpb24ganNvbkZpbHRlcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgc3BhY2luZykge1xuICAgIGlmIChpc1VuZGVmaW5lZChzcGFjaW5nKSkge1xuICAgICAgICBzcGFjaW5nID0gMjtcbiAgICB9XG4gICAgcmV0dXJuIHRvSnNvbihvYmplY3QsIHNwYWNpbmcpO1xuICB9O1xufVxuXG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgbG93ZXJjYXNlXG4gKiBAa2luZCBmdW5jdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gbG93ZXJjYXNlLlxuICogQHNlZSBhbmd1bGFyLmxvd2VyY2FzZVxuICovXG52YXIgbG93ZXJjYXNlRmlsdGVyID0gdmFsdWVGbihsb3dlcmNhc2UpO1xuXG5cbi8qKlxuICogQG5nZG9jIGZpbHRlclxuICogQG5hbWUgdXBwZXJjYXNlXG4gKiBAa2luZCBmdW5jdGlvblxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gdXBwZXJjYXNlLlxuICogQHNlZSBhbmd1bGFyLnVwcGVyY2FzZVxuICovXG52YXIgdXBwZXJjYXNlRmlsdGVyID0gdmFsdWVGbih1cHBlcmNhc2UpO1xuXG4vKipcbiAqIEBuZ2RvYyBmaWx0ZXJcbiAqIEBuYW1lIGxpbWl0VG9cbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9yIHN0cmluZyBjb250YWluaW5nIG9ubHkgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLiBUaGUgZWxlbWVudHMgYXJlXG4gKiB0YWtlbiBmcm9tIGVpdGhlciB0aGUgYmVnaW5uaW5nIG9yIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBhcnJheSwgc3RyaW5nIG9yIG51bWJlciwgYXMgc3BlY2lmaWVkIGJ5XG4gKiB0aGUgdmFsdWUgYW5kIHNpZ24gKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKSBvZiBgbGltaXRgLiBPdGhlciBhcnJheS1saWtlIG9iamVjdHMgYXJlIGFsc28gc3VwcG9ydGVkXG4gKiAoZS5nLiBhcnJheSBzdWJjbGFzc2VzLCBOb2RlTGlzdHMsIGpxTGl0ZS9qUXVlcnkgY29sbGVjdGlvbnMgZXRjKS4gSWYgYSBudW1iZXIgaXMgdXNlZCBhcyBpbnB1dCxcbiAqIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5TGlrZXxzdHJpbmd8bnVtYmVyfSBpbnB1dCAtIEFycmF5L2FycmF5LWxpa2UsIHN0cmluZyBvciBudW1iZXIgdG8gYmUgbGltaXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGltaXQgLSBUaGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBhcnJheSBvciBzdHJpbmcuIElmIHRoZSBgbGltaXRgIG51bWJlclxuICogICAgIGlzIHBvc2l0aXZlLCBgbGltaXRgIG51bWJlciBvZiBpdGVtcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBhcnJheS9zdHJpbmcgYXJlIGNvcGllZC5cbiAqICAgICBJZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLCBgbGltaXRgIG51bWJlciAgb2YgaXRlbXMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzb3VyY2UgYXJyYXkvc3RyaW5nXG4gKiAgICAgYXJlIGNvcGllZC4gVGhlIGBsaW1pdGAgd2lsbCBiZSB0cmltbWVkIGlmIGl0IGV4Y2VlZHMgYGFycmF5Lmxlbmd0aGAuIElmIGBsaW1pdGAgaXMgdW5kZWZpbmVkLFxuICogICAgIHRoZSBpbnB1dCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gYmVnaW4gLSBJbmRleCBhdCB3aGljaCB0byBiZWdpbiBsaW1pdGF0aW9uLiBBcyBhIG5lZ2F0aXZlIGluZGV4LFxuICogICAgIGBiZWdpbmAgaW5kaWNhdGVzIGFuIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGlucHV0YC4gRGVmYXVsdHMgdG8gYDBgLlxuICogQHJldHVybnMge0FycmF5fHN0cmluZ30gQSBuZXcgc3ViLWFycmF5IG9yIHN1YnN0cmluZyBvZiBsZW5ndGggYGxpbWl0YCBvciBsZXNzIGlmIHRoZSBpbnB1dCBoYWRcbiAqICAgICBsZXNzIHRoYW4gYGxpbWl0YCBlbGVtZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbW9kdWxlPVwibGltaXRUb0V4YW1wbGVcIiBuYW1lPVwibGltaXQtdG8tZmlsdGVyXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdsaW1pdFRvRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS5udW1iZXJzID0gWzEsMiwzLDQsNSw2LDcsOCw5XTtcbiAgICAgICAgICAgICAkc2NvcGUubGV0dGVycyA9IFwiYWJjZGVmZ2hpXCI7XG4gICAgICAgICAgICAgJHNjb3BlLmxvbmdOdW1iZXIgPSAyMzQ1NDMyMzQyO1xuICAgICAgICAgICAgICRzY29wZS5udW1MaW1pdCA9IDM7XG4gICAgICAgICAgICAgJHNjb3BlLmxldHRlckxpbWl0ID0gMztcbiAgICAgICAgICAgICAkc2NvcGUubG9uZ051bWJlckxpbWl0ID0gMztcbiAgICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICBMaW1pdCB7e251bWJlcnN9fSB0bzpcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgc3RlcD1cIjFcIiBuZy1tb2RlbD1cIm51bUxpbWl0XCI+XG4gICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgPHA+T3V0cHV0IG51bWJlcnM6IHt7IG51bWJlcnMgfCBsaW1pdFRvOm51bUxpbWl0IH19PC9wPlxuICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgTGltaXQge3tsZXR0ZXJzfX0gdG86XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHN0ZXA9XCIxXCIgbmctbW9kZWw9XCJsZXR0ZXJMaW1pdFwiPlxuICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgIDxwPk91dHB1dCBsZXR0ZXJzOiB7eyBsZXR0ZXJzIHwgbGltaXRUbzpsZXR0ZXJMaW1pdCB9fTwvcD5cbiAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIExpbWl0IHt7bG9uZ051bWJlcn19IHRvOlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiMVwiIG5nLW1vZGVsPVwibG9uZ051bWJlckxpbWl0XCI+XG4gICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgPHA+T3V0cHV0IGxvbmcgbnVtYmVyOiB7eyBsb25nTnVtYmVyIHwgbGltaXRUbzpsb25nTnVtYmVyTGltaXQgfX08L3A+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIHZhciBudW1MaW1pdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbnVtTGltaXQnKSk7XG4gICAgICAgdmFyIGxldHRlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsZXR0ZXJMaW1pdCcpKTtcbiAgICAgICB2YXIgbG9uZ051bWJlckxpbWl0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdsb25nTnVtYmVyTGltaXQnKSk7XG4gICAgICAgdmFyIGxpbWl0ZWROdW1iZXJzID0gZWxlbWVudChieS5iaW5kaW5nKCdudW1iZXJzIHwgbGltaXRUbzpudW1MaW1pdCcpKTtcbiAgICAgICB2YXIgbGltaXRlZExldHRlcnMgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xldHRlcnMgfCBsaW1pdFRvOmxldHRlckxpbWl0JykpO1xuICAgICAgIHZhciBsaW1pdGVkTG9uZ051bWJlciA9IGVsZW1lbnQoYnkuYmluZGluZygnbG9uZ051bWJlciB8IGxpbWl0VG86bG9uZ051bWJlckxpbWl0JykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBsaW1pdCB0aGUgbnVtYmVyIGFycmF5IHRvIGZpcnN0IHRocmVlIGl0ZW1zJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QobnVtTGltaXRJbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJzMnKTtcbiAgICAgICAgIGV4cGVjdChsZXR0ZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpO1xuICAgICAgICAgZXhwZWN0KGxvbmdOdW1iZXJMaW1pdElucHV0LmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnMycpO1xuICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsM10nKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmMnKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0Jyk7XG4gICAgICAgfSk7XG5cbiAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBzYWZhcmkgYW5kIHByb3RyYWN0b3IgdGhhdCBkb2Vzbid0IGxpa2UgdGhlIG1pbnVzIGtleVxuICAgICAgIC8vIGl0KCdzaG91bGQgdXBkYXRlIHRoZSBvdXRwdXQgd2hlbiAtMyBpcyBlbnRlcmVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgLy8gICBudW1MaW1pdElucHV0LmNsZWFyKCk7XG4gICAgICAgLy8gICBudW1MaW1pdElucHV0LnNlbmRLZXlzKCctMycpO1xuICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5jbGVhcigpO1xuICAgICAgIC8vICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTtcbiAgICAgICAvLyAgIGxvbmdOdW1iZXJMaW1pdElucHV0LmNsZWFyKCk7XG4gICAgICAgLy8gICBsb25nTnVtYmVyTGltaXRJbnB1dC5zZW5kS2V5cygnLTMnKTtcbiAgICAgICAvLyAgIGV4cGVjdChsaW1pdGVkTnVtYmVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBudW1iZXJzOiBbNyw4LDldJyk7XG4gICAgICAgLy8gICBleHBlY3QobGltaXRlZExldHRlcnMuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbGV0dGVyczogZ2hpJyk7XG4gICAgICAgLy8gICBleHBlY3QobGltaXRlZExvbmdOdW1iZXIuZ2V0VGV4dCgpKS50b0VxdWFsKCdPdXRwdXQgbG9uZyBudW1iZXI6IDM0MicpO1xuICAgICAgIC8vIH0pO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUgb2YgaW5wdXQgYXJyYXknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIG51bUxpbWl0SW5wdXQuY2xlYXIoKTtcbiAgICAgICAgIG51bUxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpO1xuICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbGV0dGVyTGltaXRJbnB1dC5zZW5kS2V5cygnMTAwJyk7XG4gICAgICAgICBsb25nTnVtYmVyTGltaXRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbG9uZ051bWJlckxpbWl0SW5wdXQuc2VuZEtleXMoJzEwMCcpO1xuICAgICAgICAgZXhwZWN0KGxpbWl0ZWROdW1iZXJzLmdldFRleHQoKSkudG9FcXVhbCgnT3V0cHV0IG51bWJlcnM6IFsxLDIsMyw0LDUsNiw3LDgsOV0nKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTGV0dGVycy5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsZXR0ZXJzOiBhYmNkZWZnaGknKTtcbiAgICAgICAgIGV4cGVjdChsaW1pdGVkTG9uZ051bWJlci5nZXRUZXh0KCkpLnRvRXF1YWwoJ091dHB1dCBsb25nIG51bWJlcjogMjM0NTQzMjM0MicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4qL1xuZnVuY3Rpb24gbGltaXRUb0ZpbHRlcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBsaW1pdCwgYmVnaW4pIHtcbiAgICBpZiAoTWF0aC5hYnMoTnVtYmVyKGxpbWl0KSkgPT09IEluZmluaXR5KSB7XG4gICAgICBsaW1pdCA9IE51bWJlcihsaW1pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbWl0ID0gdG9JbnQobGltaXQpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXJOYU4obGltaXQpKSByZXR1cm4gaW5wdXQ7XG5cbiAgICBpZiAoaXNOdW1iZXIoaW5wdXQpKSBpbnB1dCA9IGlucHV0LnRvU3RyaW5nKCk7XG4gICAgaWYgKCFpc0FycmF5TGlrZShpbnB1dCkpIHJldHVybiBpbnB1dDtcblxuICAgIGJlZ2luID0gKCFiZWdpbiB8fCBpc05hTihiZWdpbikpID8gMCA6IHRvSW50KGJlZ2luKTtcbiAgICBiZWdpbiA9IChiZWdpbiA8IDApID8gTWF0aC5tYXgoMCwgaW5wdXQubGVuZ3RoICsgYmVnaW4pIDogYmVnaW47XG5cbiAgICBpZiAobGltaXQgPj0gMCkge1xuICAgICAgcmV0dXJuIHNsaWNlRm4oaW5wdXQsIGJlZ2luLCBiZWdpbiArIGxpbWl0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGJlZ2luID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzbGljZUZuKGlucHV0LCBsaW1pdCwgaW5wdXQubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzbGljZUZuKGlucHV0LCBNYXRoLm1heCgwLCBiZWdpbiArIGxpbWl0KSwgYmVnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gc2xpY2VGbihpbnB1dCwgYmVnaW4sIGVuZCkge1xuICBpZiAoaXNTdHJpbmcoaW5wdXQpKSByZXR1cm4gaW5wdXQuc2xpY2UoYmVnaW4sIGVuZCk7XG5cbiAgcmV0dXJuIHNsaWNlLmNhbGwoaW5wdXQsIGJlZ2luLCBlbmQpO1xufVxuXG4vKipcbiAqIEBuZ2RvYyBmaWx0ZXJcbiAqIEBuYW1lIG9yZGVyQnlcbiAqIEBraW5kIGZ1bmN0aW9uXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBgY29sbGVjdGlvbmAsIG9yZGVyZWQgYnkgYSBgY29tcGFyYXRvcmBcbiAqIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZXMgY29tcHV0ZWQgdXNpbmcgdGhlIGBleHByZXNzaW9uYCBwcmVkaWNhdGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGBbe2lkOiAnZm9vJ30sIHtpZDogJ2Jhcid9XSB8IG9yZGVyQnk6J2lkJ2Agd291bGQgcmVzdWx0IGluXG4gKiBgW3tpZDogJ2Jhcid9LCB7aWQ6ICdmb28nfV1gLlxuICpcbiAqIFRoZSBgY29sbGVjdGlvbmAgY2FuIGJlIGFuIEFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0IChlLmcuIE5vZGVMaXN0LCBqUXVlcnkgb2JqZWN0LCBUeXBlZEFycmF5LFxuICogU3RyaW5nLCBldGMpLlxuICpcbiAqIFRoZSBgZXhwcmVzc2lvbmAgY2FuIGJlIGEgc2luZ2xlIHByZWRpY2F0ZSwgb3IgYSBsaXN0IG9mIHByZWRpY2F0ZXMgZWFjaCBzZXJ2aW5nIGFzIGEgdGllLWJyZWFrZXJcbiAqIGZvciB0aGUgcHJlY2VkaW5nIG9uZS4gVGhlIGBleHByZXNzaW9uYCBpcyBldmFsdWF0ZWQgYWdhaW5zdCBlYWNoIGl0ZW0gYW5kIHRoZSBvdXRwdXQgaXMgdXNlZFxuICogZm9yIGNvbXBhcmluZyB3aXRoIG90aGVyIGl0ZW1zLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSBzb3J0aW5nIG9yZGVyIGJ5IHNldHRpbmcgYHJldmVyc2VgIHRvIGB0cnVlYC4gQnkgZGVmYXVsdCwgaXRlbXMgYXJlIHNvcnRlZCBpblxuICogYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIFRoZSBjb21wYXJpc29uIGlzIGRvbmUgdXNpbmcgdGhlIGBjb21wYXJhdG9yYCBmdW5jdGlvbi4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsIGEgZGVmYXVsdCwgYnVpbHQtaW5cbiAqIGNvbXBhcmF0b3IgaXMgdXNlZCAoc2VlIGJlbG93IGZvciBkZXRhaWxzIC0gaW4gYSBudXRzaGVsbCwgaXQgY29tcGFyZXMgbnVtYmVycyBudW1lcmljYWxseSBhbmRcbiAqIHN0cmluZ3MgYWxwaGFiZXRpY2FsbHkpLlxuICpcbiAqICMjIyBVbmRlciB0aGUgaG9vZFxuICpcbiAqIE9yZGVyaW5nIHRoZSBzcGVjaWZpZWQgYGNvbGxlY3Rpb25gIGhhcHBlbnMgaW4gdHdvIHBoYXNlczpcbiAqXG4gKiAxLiBBbGwgaXRlbXMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBwcmVkaWNhdGUgKG9yIHByZWRpY2F0ZXMpLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlcyBhcmUgc2F2ZWRcbiAqICAgIGFsb25nIHdpdGggdGhlaXIgdHlwZSAoYHN0cmluZ2AsIGBudW1iZXJgIGV0YykuIEZvciBleGFtcGxlLCBhbiBpdGVtIGB7bGFiZWw6ICdmb28nfWAsIHBhc3NlZFxuICogICAgdGhyb3VnaCBhIHByZWRpY2F0ZSB0aGF0IGV4dHJhY3RzIHRoZSB2YWx1ZSBvZiB0aGUgYGxhYmVsYCBwcm9wZXJ0eSwgd291bGQgYmUgdHJhbnNmb3JtZWQgdG86XG4gKiAgICBgYGBcbiAqICAgIHtcbiAqICAgICAgdmFsdWU6ICdmb28nLFxuICogICAgICB0eXBlOiAnc3RyaW5nJyxcbiAqICAgICAgaW5kZXg6IC4uLlxuICogICAgfVxuICogICAgYGBgXG4gKiAyLiBUaGUgY29tcGFyYXRvciBmdW5jdGlvbiBpcyB1c2VkIHRvIHNvcnQgdGhlIGl0ZW1zLCBiYXNlZCBvbiB0aGUgZGVyaXZlZCB2YWx1ZXMsIHR5cGVzIGFuZFxuICogICAgaW5kaWNlcy5cbiAqXG4gKiBJZiB5b3UgdXNlIGEgY3VzdG9tIGNvbXBhcmF0b3IsIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggcGFpcnMgb2Ygb2JqZWN0cyBvZiB0aGUgZm9ybVxuICogYHt2YWx1ZTogLi4uLCB0eXBlOiAnLi4uJywgaW5kZXg6IC4uLn1gIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm4gYDBgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbFxuICogKGFzIGZhciBhcyB0aGUgY29tcGFyYXRvciBpcyBjb25jZXJuZWQpLCBgLTFgIGlmIHRoZSAxc3Qgb25lIHNob3VsZCBiZSByYW5rZWQgaGlnaGVyIHRoYW4gdGhlXG4gKiBzZWNvbmQsIG9yIGAxYCBvdGhlcndpc2UuXG4gKlxuICogSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNvcnRpbmcgd2lsbCBiZSBkZXRlcm1pbmlzdGljIGFjcm9zcyBwbGF0Zm9ybXMsIGlmIG5vbmUgb2YgdGhlXG4gKiBzcGVjaWZpZWQgcHJlZGljYXRlcyBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0d28gaXRlbXMsIGBvcmRlckJ5YCB3aWxsIGF1dG9tYXRpY2FsbHkgaW50cm9kdWNlIGFcbiAqIGR1bW15IHByZWRpY2F0ZSB0aGF0IHJldHVybnMgdGhlIGl0ZW0ncyBpbmRleCBhcyBgdmFsdWVgLlxuICogKElmIHlvdSBhcmUgdXNpbmcgYSBjdXN0b20gY29tcGFyYXRvciwgbWFrZSBzdXJlIGl0IGNhbiBoYW5kbGUgdGhpcyBwcmVkaWNhdGUgYXMgd2VsbC4pXG4gKlxuICogRmluYWxseSwgaW4gYW4gYXR0ZW1wdCB0byBzaW1wbGlmeSB0aGluZ3MsIGlmIGEgcHJlZGljYXRlIHJldHVybnMgYW4gb2JqZWN0IGFzIHRoZSBleHRyYWN0ZWRcbiAqIHZhbHVlIGZvciBhbiBpdGVtLCBgb3JkZXJCeWAgd2lsbCB0cnkgdG8gY29udmVydCB0aGF0IG9iamVjdCB0byBhIHByaW1pdGl2ZSB2YWx1ZSwgYmVmb3JlIHBhc3NpbmdcbiAqIGl0IHRvIHRoZSBjb21wYXJhdG9yLiBUaGUgZm9sbG93aW5nIHJ1bGVzIGdvdmVybiB0aGUgY29udmVyc2lvbjpcbiAqXG4gKiAxLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGB2YWx1ZU9mKClgIG1ldGhvZCB0aGF0IHJldHVybnMgYSBwcmltaXRpdmUsIGl0cyByZXR1cm4gdmFsdWUgd2lsbCBiZVxuICogICAgdXNlZCBpbnN0ZWFkLjxiciAvPlxuICogICAgKElmIHRoZSBvYmplY3QgaGFzIGEgYHZhbHVlT2YoKWAgbWV0aG9kIHRoYXQgcmV0dXJucyBhbm90aGVyIG9iamVjdCwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0XG4gKiAgICB3aWxsIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBzdGVwcy4pXG4gKiAyLiBJZiB0aGUgb2JqZWN0IGhhcyBhIGN1c3RvbSBgdG9TdHJpbmcoKWAgbWV0aG9kIChpLmUuIG5vdCB0aGUgb25lIGluaGVyaXRlZCBmcm9tIGBPYmplY3RgKSB0aGF0XG4gKiAgICByZXR1cm5zIGEgcHJpbWl0aXZlLCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLjxiciAvPlxuICogICAgKElmIHRoZSBvYmplY3QgaGFzIGEgYHRvU3RyaW5nKClgIG1ldGhvZCB0aGF0IHJldHVybnMgYW5vdGhlciBvYmplY3QsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdFxuICogICAgd2lsbCBiZSB1c2VkIGluIHN1YnNlcXVlbnQgc3RlcHMuKVxuICogMy4gTm8gY29udmVyc2lvbjsgdGhlIG9iamVjdCBpdHNlbGYgaXMgdXNlZC5cbiAqXG4gKiAjIyMgVGhlIGRlZmF1bHQgY29tcGFyYXRvclxuICpcbiAqIFRoZSBkZWZhdWx0LCBidWlsdC1pbiBjb21wYXJhdG9yIHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBtb3N0IHVzZWNhc2VzLiBJbiBzaG9ydCwgaXQgY29tcGFyZXNcbiAqIG51bWJlcnMgbnVtZXJpY2FsbHksIHN0cmluZ3MgYWxwaGFiZXRpY2FsbHkgKGFuZCBjYXNlLWluc2Vuc2l0aXZlbHkpLCBmb3Igb2JqZWN0cyBmYWxscyBiYWNrIHRvXG4gKiB1c2luZyB0aGVpciBpbmRleCBpbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiwgYW5kIHNvcnRzIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMgYnkgdHlwZS5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseSwgaXQgZm9sbG93cyB0aGVzZSBzdGVwcyB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGl0ZW1zOlxuICpcbiAqIDEuIElmIHRoZSBjb21wYXJlZCB2YWx1ZXMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgY29tcGFyZSB0aGUgdHlwZXMgdGhlbXNlbHZlcyBhbHBoYWJldGljYWxseS5cbiAqIDIuIElmIGJvdGggdmFsdWVzIGFyZSBvZiB0eXBlIGBzdHJpbmdgLCBjb21wYXJlIHRoZW0gYWxwaGFiZXRpY2FsbHkgaW4gYSBjYXNlLSBhbmRcbiAqICAgIGxvY2FsZS1pbnNlbnNpdGl2ZSB3YXkuXG4gKiAzLiBJZiBib3RoIHZhbHVlcyBhcmUgb2JqZWN0cywgY29tcGFyZSB0aGVpciBpbmRpY2VzIGluc3RlYWQuXG4gKiA0LiBPdGhlcndpc2UsIHJldHVybjpcbiAqICAgIC0gIGAwYCwgaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwgKGJ5IHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29uLCBpLmUuIHVzaW5nIGA9PT1gKS5cbiAqICAgIC0gYC0xYCwgaWYgdGhlIDFzdCB2YWx1ZSBpcyBcImxlc3MgdGhhblwiIHRoZSAybmQgdmFsdWUgKGNvbXBhcmVkIHVzaW5nIHRoZSBgPGAgb3BlcmF0b3IpLlxuICogICAgLSAgYDFgLCBvdGhlcndpc2UuXG4gKlxuICogKipOb3RlOioqIElmIHlvdSBub3RpY2UgbnVtYmVycyBub3QgYmVpbmcgc29ydGVkIGFzIGV4cGVjdGVkLCBtYWtlIHN1cmUgdGhleSBhcmUgYWN0dWFsbHkgYmVpbmdcbiAqICAgICAgICAgICBzYXZlZCBhcyBudW1iZXJzIGFuZCBub3Qgc3RyaW5ncy5cbiAqICoqTm90ZToqKiBGb3IgdGhlIHB1cnBvc2Ugb2Ygc29ydGluZywgYG51bGxgIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyB0aGUgc3RyaW5nIGAnbnVsbCdgIChpLmUuXG4gKiAgICAgICAgICAgYHR5cGU6ICdzdHJpbmcnYCwgYHZhbHVlOiAnbnVsbCdgKS4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBzb3J0IG9yZGVyIHJlbGF0aXZlIHRvXG4gKiAgICAgICAgICAgb3RoZXIgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlMaWtlfSBjb2xsZWN0aW9uIC0gVGhlIGNvbGxlY3Rpb24gKGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0KSB0byBzb3J0LlxuICogQHBhcmFtIHsoRnVuY3Rpb258c3RyaW5nfEFycmF5LjxGdW5jdGlvbnxzdHJpbmc+KT19IGV4cHJlc3Npb24gLSBBIHByZWRpY2F0ZSAob3IgbGlzdCBvZlxuICogICAgcHJlZGljYXRlcykgdG8gYmUgdXNlZCBieSB0aGUgY29tcGFyYXRvciB0byBkZXRlcm1pbmUgdGhlIG9yZGVyIG9mIGVsZW1lbnRzLlxuICpcbiAqICAgIENhbiBiZSBvbmUgb2Y6XG4gKlxuICogICAgLSBgRnVuY3Rpb25gOiBBIGdldHRlciBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIGVhY2ggaXRlbSBhcyBhcmd1bWVudCBhbmRcbiAqICAgICAgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcuXG4gKiAgICAtIGBzdHJpbmdgOiBBbiBBbmd1bGFyIGV4cHJlc3Npb24uIFRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IGVhY2ggaXRlbSBhbmQgdGhlXG4gKiAgICAgIHJlc3VsdCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcuIEZvciBleGFtcGxlLCB1c2UgYCdsYWJlbCdgIHRvIHNvcnQgYnkgYSBwcm9wZXJ0eSBjYWxsZWRcbiAqICAgICAgYGxhYmVsYCBvciBgJ2xhYmVsLnN1YnN0cmluZygwLCAzKSdgIHRvIHNvcnQgYnkgdGhlIGZpcnN0IDMgY2hhcmFjdGVycyBvZiB0aGUgYGxhYmVsYFxuICogICAgICBwcm9wZXJ0eS48YnIgLz5cbiAqICAgICAgKFRoZSByZXN1bHQgb2YgYSBjb25zdGFudCBleHByZXNzaW9uIGlzIGludGVycHJldGVkIGFzIGEgcHJvcGVydHkgbmFtZSB0byBiZSB1c2VkIGZvclxuICogICAgICBjb21wYXJpc29uLiBGb3IgZXhhbXBsZSwgdXNlIGAnXCJzcGVjaWFsIG5hbWVcIidgIChub3RlIHRoZSBleHRyYSBwYWlyIG9mIHF1b3RlcykgdG8gc29ydCBieSBhXG4gKiAgICAgIHByb3BlcnR5IGNhbGxlZCBgc3BlY2lhbCBuYW1lYC4pPGJyIC8+XG4gKiAgICAgIEFuIGV4cHJlc3Npb24gY2FuIGJlIG9wdGlvbmFsbHkgcHJlZml4ZWQgd2l0aCBgK2Agb3IgYC1gIHRvIGNvbnRyb2wgdGhlIHNvcnRpbmcgZGlyZWN0aW9uLFxuICogICAgICBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZy4gRm9yIGV4YW1wbGUsIGAnK2xhYmVsJ2Agb3IgYCctbGFiZWwnYC4gSWYgbm8gcHJvcGVydHkgaXMgcHJvdmlkZWQsXG4gKiAgICAgIChlLmcuIGAnKydgIG9yIGAnLSdgKSwgdGhlIGNvbGxlY3Rpb24gZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBpbiBjb21wYXJpc29ucy5cbiAqICAgIC0gYEFycmF5YDogQW4gYXJyYXkgb2YgZnVuY3Rpb24gYW5kL29yIHN0cmluZyBwcmVkaWNhdGVzLiBJZiBhIHByZWRpY2F0ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZVxuICogICAgICByZWxhdGl2ZSBvcmRlciBvZiB0d28gaXRlbXMsIHRoZSBuZXh0IHByZWRpY2F0ZSBpcyB1c2VkIGFzIGEgdGllLWJyZWFrZXIuXG4gKlxuICogKipOb3RlOioqIElmIHRoZSBwcmVkaWNhdGUgaXMgbWlzc2luZyBvciBlbXB0eSB0aGVuIGl0IGRlZmF1bHRzIHRvIGAnKydgLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHJldmVyc2UgLSBJZiBgdHJ1ZWAsIHJldmVyc2UgdGhlIHNvcnRpbmcgb3JkZXIuXG4gKiBAcGFyYW0geyhGdW5jdGlvbik9fSBjb21wYXJhdG9yIC0gVGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIG9yZGVyIG9mXG4gKiAgICB2YWx1ZSBwYWlycy4gSWYgb21pdHRlZCwgdGhlIGJ1aWx0LWluIGNvbXBhcmF0b3Igd2lsbCBiZSB1c2VkLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX0gLSBUaGUgc29ydGVkIGFycmF5LlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIE9yZGVyaW5nIGEgdGFibGUgd2l0aCBgbmdSZXBlYXRgXG4gKlxuICogVGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIGEgc2ltcGxlIHtAbGluayBuZ1JlcGVhdCBuZ1JlcGVhdH0sIHdoZXJlIHRoZSBkYXRhIGlzIHNvcnRlZCBieVxuICogYWdlIGluIGRlc2NlbmRpbmcgb3JkZXIgKGV4cHJlc3Npb24gaXMgc2V0IHRvIGAnLWFnZSdgKS4gVGhlIGBjb21wYXJhdG9yYCBpcyBub3Qgc2V0LCB3aGljaCBtZWFuc1xuICogaXQgZGVmYXVsdHMgdG8gdGhlIGJ1aWx0LWluIGNvbXBhcmF0b3IuXG4gKlxuICAgPGV4YW1wbGUgbmFtZT1cIm9yZGVyQnktc3RhdGljXCIgbW9kdWxlPVwib3JkZXJCeUV4YW1wbGUxXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZyaWVuZHNcIj5cbiAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICA8dGg+UGhvbmUgTnVtYmVyPC90aD5cbiAgICAgICAgICAgICA8dGg+QWdlPC90aD5cbiAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzIHwgb3JkZXJCeTonLWFnZSdcIj5cbiAgICAgICAgICAgICA8dGQ+e3tmcmllbmQubmFtZX19PC90ZD5cbiAgICAgICAgICAgICA8dGQ+e3tmcmllbmQucGhvbmV9fTwvdGQ+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLmFnZX19PC90ZD5cbiAgICAgICAgICAgPC90cj5cbiAgICAgICAgIDwvdGFibGU+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgIGFuZ3VsYXIubW9kdWxlKCdvcmRlckJ5RXhhbXBsZTEnLCBbXSlcbiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICRzY29wZS5mcmllbmRzID0gW1xuICAgICAgICAgICAgIHtuYW1lOiAnSm9obicsICAgcGhvbmU6ICc1NTUtMTIxMicsICBhZ2U6IDEwfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01hcnknLCAgIHBob25lOiAnNTU1LTk4NzYnLCAgYWdlOiAxOX0sXG4gICAgICAgICAgICAge25hbWU6ICdNaWtlJywgICBwaG9uZTogJzU1NS00MzIxJywgIGFnZTogMjF9LFxuICAgICAgICAgICAgIHtuYW1lOiAnQWRhbScsICAgcGhvbmU6ICc1NTUtNTY3OCcsICBhZ2U6IDM1fSxcbiAgICAgICAgICAgICB7bmFtZTogJ0p1bGllJywgIHBob25lOiAnNTU1LTg3NjUnLCAgYWdlOiAyOX1cbiAgICAgICAgICAgXTtcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLmZyaWVuZHMge1xuICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICAgICB9XG5cbiAgICAgICAuZnJpZW5kcyB0aCB7XG4gICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7XG4gICAgICAgfVxuICAgICAgIC5mcmllbmRzIHRkLCAuZnJpZW5kcyB0aCB7XG4gICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkO1xuICAgICAgICAgcGFkZGluZzogNXB4IDEwcHg7XG4gICAgICAgfVxuICAgICAgIC5mcmllbmRzIHRkOmZpcnN0LWNoaWxkLCAuZnJpZW5kcyB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIC8vIEVsZW1lbnQgbG9jYXRvcnNcbiAgICAgICB2YXIgbmFtZXMgPSBlbGVtZW50LmFsbChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBieSBhZ2UgaW4gcmV2ZXJzZSBvcmRlcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgwKS5nZXRUZXh0KCkpLnRvQmUoJ0FkYW0nKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoMSkuZ2V0VGV4dCgpKS50b0JlKCdKdWxpZScpO1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgyKS5nZXRUZXh0KCkpLnRvQmUoJ01pa2UnKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoMykuZ2V0VGV4dCgpKS50b0JlKCdNYXJ5Jyk7XG4gICAgICAgICBleHBlY3QobmFtZXMuZ2V0KDQpLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKiA8aHIgLz5cbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIENoYW5naW5nIHBhcmFtZXRlcnMgZHluYW1pY2FsbHlcbiAqXG4gKiBBbGwgcGFyYW1ldGVycyBjYW4gYmUgY2hhbmdlZCBkeW5hbWljYWxseS4gVGhlIG5leHQgZXhhbXBsZSBzaG93cyBob3cgeW91IGNhbiBtYWtlIHRoZSBjb2x1bW5zIG9mXG4gKiBhIHRhYmxlIHNvcnRhYmxlLCBieSBiaW5kaW5nIHRoZSBgZXhwcmVzc2lvbmAgYW5kIGByZXZlcnNlYCBwYXJhbWV0ZXJzIHRvIHNjb3BlIHByb3BlcnRpZXMuXG4gKlxuICAgPGV4YW1wbGUgbmFtZT1cIm9yZGVyQnktZHluYW1pY1wiIG1vZHVsZT1cIm9yZGVyQnlFeGFtcGxlMlwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8cHJlPlNvcnQgYnkgPSB7e3Byb3BlcnR5TmFtZX19OyByZXZlcnNlID0ge3tyZXZlcnNlfX08L3ByZT5cbiAgICAgICAgIDxoci8+XG4gICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwicHJvcGVydHlOYW1lID0gbnVsbDsgcmV2ZXJzZSA9IGZhbHNlXCI+U2V0IHRvIHVuc29ydGVkPC9idXR0b24+XG4gICAgICAgICA8aHIvPlxuICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZnJpZW5kc1wiPlxuICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNvcnRCeSgnbmFtZScpXCI+TmFtZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0b3JkZXJcIiBuZy1zaG93PVwicHJvcGVydHlOYW1lID09PSAnbmFtZSdcIiBuZy1jbGFzcz1cIntyZXZlcnNlOiByZXZlcnNlfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzb3J0QnkoJ3Bob25lJylcIj5QaG9uZSBOdW1iZXI8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydG9yZGVyXCIgbmctc2hvdz1cInByb3BlcnR5TmFtZSA9PT0gJ3Bob25lJ1wiIG5nLWNsYXNzPVwie3JldmVyc2U6IHJldmVyc2V9XCI+PC9zcGFuPlxuICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNvcnRCeSgnYWdlJylcIj5BZ2U8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydG9yZGVyXCIgbmctc2hvdz1cInByb3BlcnR5TmFtZSA9PT0gJ2FnZSdcIiBuZy1jbGFzcz1cIntyZXZlcnNlOiByZXZlcnNlfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICA8dHIgbmctcmVwZWF0PVwiZnJpZW5kIGluIGZyaWVuZHMgfCBvcmRlckJ5OnByb3BlcnR5TmFtZTpyZXZlcnNlXCI+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLnBob25lfX08L3RkPlxuICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5hZ2V9fTwvdGQ+XG4gICAgICAgICAgIDwvdHI+XG4gICAgICAgICA8L3RhYmxlPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUyJywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICB2YXIgZnJpZW5kcyA9IFtcbiAgICAgICAgICAgICB7bmFtZTogJ0pvaG4nLCAgIHBob25lOiAnNTU1LTEyMTInLCAgYWdlOiAxMH0sXG4gICAgICAgICAgICAge25hbWU6ICdNYXJ5JywgICBwaG9uZTogJzU1NS05ODc2JywgIGFnZTogMTl9LFxuICAgICAgICAgICAgIHtuYW1lOiAnTWlrZScsICAgcGhvbmU6ICc1NTUtNDMyMScsICBhZ2U6IDIxfSxcbiAgICAgICAgICAgICB7bmFtZTogJ0FkYW0nLCAgIHBob25lOiAnNTU1LTU2NzgnLCAgYWdlOiAzNX0sXG4gICAgICAgICAgICAge25hbWU6ICdKdWxpZScsICBwaG9uZTogJzU1NS04NzY1JywgIGFnZTogMjl9XG4gICAgICAgICAgIF07XG5cbiAgICAgICAgICAgJHNjb3BlLnByb3BlcnR5TmFtZSA9ICdhZ2UnO1xuICAgICAgICAgICAkc2NvcGUucmV2ZXJzZSA9IHRydWU7XG4gICAgICAgICAgICRzY29wZS5mcmllbmRzID0gZnJpZW5kcztcblxuICAgICAgICAgICAkc2NvcGUuc29ydEJ5ID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgJHNjb3BlLnJldmVyc2UgPSAoJHNjb3BlLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlOYW1lKSA/ICEkc2NvcGUucmV2ZXJzZSA6IGZhbHNlO1xuICAgICAgICAgICAgICRzY29wZS5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgIH07XG4gICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIC5mcmllbmRzIHtcbiAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgfVxuXG4gICAgICAgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZCwgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcbiAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZDpmaXJzdC1jaGlsZCwgLmZyaWVuZHMgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgfVxuXG4gICAgICAgLnNvcnRvcmRlcjphZnRlciB7XG4gICAgICAgICBjb250ZW50OiAnXFwyNWIyJzsgICAvLyBCTEFDSyBVUC1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgICAuc29ydG9yZGVyLnJldmVyc2U6YWZ0ZXIge1xuICAgICAgICAgY29udGVudDogJ1xcMjViYyc7ICAgLy8gQkxBQ0sgRE9XTi1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgLy8gRWxlbWVudCBsb2NhdG9yc1xuICAgICAgIHZhciB1bnNvcnRCdXR0b24gPSBlbGVtZW50KGJ5LnBhcnRpYWxCdXR0b25UZXh0KCd1bnNvcnRlZCcpKTtcbiAgICAgICB2YXIgbmFtZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ05hbWUnKSk7XG4gICAgICAgdmFyIHBob25lSGVhZGVyID0gZWxlbWVudChieS5wYXJ0aWFsQnV0dG9uVGV4dCgnUGhvbmUnKSk7XG4gICAgICAgdmFyIGFnZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ0FnZScpKTtcbiAgICAgICB2YXIgZmlyc3ROYW1lID0gZWxlbWVudChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKS5yb3coMCkpO1xuICAgICAgIHZhciBsYXN0TmFtZSA9IGVsZW1lbnQoYnkucmVwZWF0ZXIoJ2ZyaWVuZHMnKS5jb2x1bW4oJ2ZyaWVuZC5uYW1lJykucm93KDQpKTtcblxuICAgICAgIGl0KCdzaG91bGQgc29ydCBmcmllbmRzIGJ5IHNvbWUgcHJvcGVydHksIHdoZW4gY2xpY2tpbmcgb24gdGhlIGNvbHVtbiBoZWFkZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHBob25lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWFyeScpO1xuXG4gICAgICAgICBuYW1lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWlrZScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBpbiByZXZlcnNlIG9yZGVyLCB3aGVuIGNsaWNraW5nIG9uIHRoZSBzYW1lIGNvbHVtbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0FkYW0nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcblxuICAgICAgICAgYWdlSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9yZGVyLCB3aGVuIGNsaWNraW5nIFwiU2V0IHRvIHVuc29ydGVkXCInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHVuc29ydEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0p1bGllJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqIDxociAvPlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgVXNpbmcgYG9yZGVyQnlgIGluc2lkZSBhIGNvbnRyb2xsZXJcbiAqXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNhbGwgdGhlIGBvcmRlckJ5YCBmaWx0ZXIgbWFudWFsbHksIGJ5IGluamVjdGluZyBgb3JkZXJCeUZpbHRlcmAsIGFuZFxuICogY2FsbGluZyBpdCB3aXRoIHRoZSBkZXNpcmVkIHBhcmFtZXRlcnMuIChBbHRlcm5hdGl2ZWx5LCB5b3UgY291bGQgaW5qZWN0IHRoZSBgJGZpbHRlcmAgZmFjdG9yeVxuICogYW5kIHJldHJpZXZlIHRoZSBgb3JkZXJCeWAgZmlsdGVyIHdpdGggYCRmaWx0ZXIoJ29yZGVyQnknKWAuKVxuICpcbiAgIDxleGFtcGxlIG5hbWU9XCJvcmRlckJ5LWNhbGwtbWFudWFsbHlcIiBtb2R1bGU9XCJvcmRlckJ5RXhhbXBsZTNcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPHByZT5Tb3J0IGJ5ID0ge3twcm9wZXJ0eU5hbWV9fTsgcmV2ZXJzZSA9IHt7cmV2ZXJzZX19PC9wcmU+XG4gICAgICAgICA8aHIvPlxuICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cInNvcnRCeShudWxsKVwiPlNldCB0byB1bnNvcnRlZDwvYnV0dG9uPlxuICAgICAgICAgPGhyLz5cbiAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZyaWVuZHNcIj5cbiAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzb3J0QnkoJ25hbWUnKVwiPk5hbWU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydG9yZGVyXCIgbmctc2hvdz1cInByb3BlcnR5TmFtZSA9PT0gJ25hbWUnXCIgbmctY2xhc3M9XCJ7cmV2ZXJzZTogcmV2ZXJzZX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICA8dGg+XG4gICAgICAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwic29ydEJ5KCdwaG9uZScpXCI+UGhvbmUgTnVtYmVyPC9idXR0b24+XG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnRvcmRlclwiIG5nLXNob3c9XCJwcm9wZXJ0eU5hbWUgPT09ICdwaG9uZSdcIiBuZy1jbGFzcz1cIntyZXZlcnNlOiByZXZlcnNlfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzb3J0QnkoJ2FnZScpXCI+QWdlPC9idXR0b24+XG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnRvcmRlclwiIG5nLXNob3c9XCJwcm9wZXJ0eU5hbWUgPT09ICdhZ2UnXCIgbmctY2xhc3M9XCJ7cmV2ZXJzZTogcmV2ZXJzZX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzXCI+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLnBob25lfX08L3RkPlxuICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5hZ2V9fTwvdGQ+XG4gICAgICAgICAgIDwvdHI+XG4gICAgICAgICA8L3RhYmxlPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGUzJywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsICdvcmRlckJ5RmlsdGVyJywgZnVuY3Rpb24oJHNjb3BlLCBvcmRlckJ5KSB7XG4gICAgICAgICAgIHZhciBmcmllbmRzID0gW1xuICAgICAgICAgICAgIHtuYW1lOiAnSm9obicsICAgcGhvbmU6ICc1NTUtMTIxMicsICBhZ2U6IDEwfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01hcnknLCAgIHBob25lOiAnNTU1LTk4NzYnLCAgYWdlOiAxOX0sXG4gICAgICAgICAgICAge25hbWU6ICdNaWtlJywgICBwaG9uZTogJzU1NS00MzIxJywgIGFnZTogMjF9LFxuICAgICAgICAgICAgIHtuYW1lOiAnQWRhbScsICAgcGhvbmU6ICc1NTUtNTY3OCcsICBhZ2U6IDM1fSxcbiAgICAgICAgICAgICB7bmFtZTogJ0p1bGllJywgIHBob25lOiAnNTU1LTg3NjUnLCAgYWdlOiAyOX1cbiAgICAgICAgICAgXTtcblxuICAgICAgICAgICAkc2NvcGUucHJvcGVydHlOYW1lID0gJ2FnZSc7XG4gICAgICAgICAgICRzY29wZS5yZXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICAgJHNjb3BlLmZyaWVuZHMgPSBvcmRlckJ5KGZyaWVuZHMsICRzY29wZS5wcm9wZXJ0eU5hbWUsICRzY29wZS5yZXZlcnNlKTtcblxuICAgICAgICAgICAkc2NvcGUuc29ydEJ5ID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgJHNjb3BlLnJldmVyc2UgPSAocHJvcGVydHlOYW1lICE9PSBudWxsICYmICRzY29wZS5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgICAgPyAhJHNjb3BlLnJldmVyc2UgOiBmYWxzZTtcbiAgICAgICAgICAgICAkc2NvcGUucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICRzY29wZS5mcmllbmRzID0gb3JkZXJCeShmcmllbmRzLCAkc2NvcGUucHJvcGVydHlOYW1lLCAkc2NvcGUucmV2ZXJzZSk7XG4gICAgICAgICAgIH07XG4gICAgICAgICB9XSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIC5mcmllbmRzIHtcbiAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgfVxuXG4gICAgICAgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZCwgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcbiAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZDpmaXJzdC1jaGlsZCwgLmZyaWVuZHMgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgfVxuXG4gICAgICAgLnNvcnRvcmRlcjphZnRlciB7XG4gICAgICAgICBjb250ZW50OiAnXFwyNWIyJzsgICAvLyBCTEFDSyBVUC1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgICAuc29ydG9yZGVyLnJldmVyc2U6YWZ0ZXIge1xuICAgICAgICAgY29udGVudDogJ1xcMjViYyc7ICAgLy8gQkxBQ0sgRE9XTi1QT0lOVElORyBUUklBTkdMRVxuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgLy8gRWxlbWVudCBsb2NhdG9yc1xuICAgICAgIHZhciB1bnNvcnRCdXR0b24gPSBlbGVtZW50KGJ5LnBhcnRpYWxCdXR0b25UZXh0KCd1bnNvcnRlZCcpKTtcbiAgICAgICB2YXIgbmFtZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ05hbWUnKSk7XG4gICAgICAgdmFyIHBob25lSGVhZGVyID0gZWxlbWVudChieS5wYXJ0aWFsQnV0dG9uVGV4dCgnUGhvbmUnKSk7XG4gICAgICAgdmFyIGFnZUhlYWRlciA9IGVsZW1lbnQoYnkucGFydGlhbEJ1dHRvblRleHQoJ0FnZScpKTtcbiAgICAgICB2YXIgZmlyc3ROYW1lID0gZWxlbWVudChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKS5yb3coMCkpO1xuICAgICAgIHZhciBsYXN0TmFtZSA9IGVsZW1lbnQoYnkucmVwZWF0ZXIoJ2ZyaWVuZHMnKS5jb2x1bW4oJ2ZyaWVuZC5uYW1lJykucm93KDQpKTtcblxuICAgICAgIGl0KCdzaG91bGQgc29ydCBmcmllbmRzIGJ5IHNvbWUgcHJvcGVydHksIHdoZW4gY2xpY2tpbmcgb24gdGhlIGNvbHVtbiBoZWFkZXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHBob25lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWFyeScpO1xuXG4gICAgICAgICBuYW1lSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnTWlrZScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBpbiByZXZlcnNlIG9yZGVyLCB3aGVuIGNsaWNraW5nIG9uIHRoZSBzYW1lIGNvbHVtbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0FkYW0nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcblxuICAgICAgICAgYWdlSGVhZGVyLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoZmlyc3ROYW1lLmdldFRleHQoKSkudG9CZSgnSm9obicpO1xuICAgICAgICAgZXhwZWN0KGxhc3ROYW1lLmdldFRleHQoKSkudG9CZSgnQWRhbScpO1xuXG4gICAgICAgICBhZ2VIZWFkZXIuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG4gICAgICAgfSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9yZGVyLCB3aGVuIGNsaWNraW5nIFwiU2V0IHRvIHVuc29ydGVkXCInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmaXJzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobGFzdE5hbWUuZ2V0VGV4dCgpKS50b0JlKCdKb2huJyk7XG5cbiAgICAgICAgIHVuc29ydEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGZpcnN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcbiAgICAgICAgIGV4cGVjdChsYXN0TmFtZS5nZXRUZXh0KCkpLnRvQmUoJ0p1bGllJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqIDxociAvPlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgVXNpbmcgYSBjdXN0b20gY29tcGFyYXRvclxuICpcbiAqIElmIHlvdSBoYXZlIHZlcnkgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGFib3V0IHRoZSB3YXkgaXRlbXMgYXJlIHNvcnRlZCwgeW91IGNhbiBwYXNzIHlvdXIgb3duXG4gKiBjb21wYXJhdG9yIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IG5lZWQgdG8gY29tcGFyZSBzb21lIHN0cmluZ3MgaW4gYSBsb2NhbGUtc2Vuc2l0aXZlXG4gKiB3YXkuIChXaGVuIHNwZWNpZnlpbmcgYSBjdXN0b20gY29tcGFyYXRvciwgeW91IGFsc28gbmVlZCB0byBwYXNzIGEgdmFsdWUgZm9yIHRoZSBgcmV2ZXJzZWBcbiAqIGFyZ3VtZW50IC0gcGFzc2luZyBgZmFsc2VgIHJldGFpbnMgdGhlIGRlZmF1bHQgc29ydGluZyBvcmRlciwgaS5lLiBhc2NlbmRpbmcuKVxuICpcbiAgIDxleGFtcGxlIG5hbWU9XCJvcmRlckJ5LWN1c3RvbS1jb21wYXJhdG9yXCIgbW9kdWxlPVwib3JkZXJCeUV4YW1wbGU0XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJmcmllbmRzLWNvbnRhaW5lciBjdXN0b20tY29tcGFyYXRvclwiPlxuICAgICAgICAgICA8aDM+TG9jYWxlLXNlbnNpdGl2ZSBDb21wYXJhdG9yPC9oMz5cbiAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZnJpZW5kc1wiPlxuICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cbiAgICAgICAgICAgICAgIDx0aD5GYXZvcml0ZSBMZXR0ZXI8L3RoPlxuICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgPHRyIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzIHwgb3JkZXJCeTonZmF2b3JpdGVMZXR0ZXInOmZhbHNlOmxvY2FsZVNlbnNpdGl2ZUNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgICAgIDx0ZD57e2ZyaWVuZC5uYW1lfX08L3RkPlxuICAgICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLmZhdm9yaXRlTGV0dGVyfX08L3RkPlxuICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDxkaXYgY2xhc3M9XCJmcmllbmRzLWNvbnRhaW5lciBkZWZhdWx0LWNvbXBhcmF0b3JcIj5cbiAgICAgICAgICAgPGgzPkRlZmF1bHQgQ29tcGFyYXRvcjwvaDM+XG4gICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZyaWVuZHNcIj5cbiAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XG4gICAgICAgICAgICAgICA8dGg+RmF2b3JpdGUgTGV0dGVyPC90aD5cbiAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgIDx0ciBuZy1yZXBlYXQ9XCJmcmllbmQgaW4gZnJpZW5kcyB8IG9yZGVyQnk6J2Zhdm9yaXRlTGV0dGVyJ1wiPlxuICAgICAgICAgICAgICAgPHRkPnt7ZnJpZW5kLm5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgICA8dGQ+e3tmcmllbmQuZmF2b3JpdGVMZXR0ZXJ9fTwvdGQ+XG4gICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnb3JkZXJCeUV4YW1wbGU0JywgW10pXG4gICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAkc2NvcGUuZnJpZW5kcyA9IFtcbiAgICAgICAgICAgICB7bmFtZTogJ0pvaG4nLCAgIGZhdm9yaXRlTGV0dGVyOiAnw4QnfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01hcnknLCAgIGZhdm9yaXRlTGV0dGVyOiAnw5wnfSxcbiAgICAgICAgICAgICB7bmFtZTogJ01pa2UnLCAgIGZhdm9yaXRlTGV0dGVyOiAnw5YnfSxcbiAgICAgICAgICAgICB7bmFtZTogJ0FkYW0nLCAgIGZhdm9yaXRlTGV0dGVyOiAnSCd9LFxuICAgICAgICAgICAgIHtuYW1lOiAnSnVsaWUnLCAgZmF2b3JpdGVMZXR0ZXI6ICdaJ31cbiAgICAgICAgICAgXTtcblxuICAgICAgICAgICAkc2NvcGUubG9jYWxlU2Vuc2l0aXZlQ29tcGFyYXRvciA9IGZ1bmN0aW9uKHYxLCB2Mikge1xuICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBzdHJpbmdzLCBqdXN0IGNvbXBhcmUgYnkgaW5kZXhcbiAgICAgICAgICAgICBpZiAodjEudHlwZSAhPT0gJ3N0cmluZycgfHwgdjIudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgIHJldHVybiAodjEuaW5kZXggPCB2Mi5pbmRleCkgPyAtMSA6IDE7XG4gICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgLy8gQ29tcGFyZSBzdHJpbmdzIGFscGhhYmV0aWNhbGx5LCB0YWtpbmcgbG9jYWxlIGludG8gYWNjb3VudFxuICAgICAgICAgICAgIHJldHVybiB2MS52YWx1ZS5sb2NhbGVDb21wYXJlKHYyLnZhbHVlKTtcbiAgICAgICAgICAgfTtcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLmZyaWVuZHMtY29udGFpbmVyIHtcbiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgIG1hcmdpbjogMCAzMHB4O1xuICAgICAgIH1cblxuICAgICAgIC5mcmllbmRzIHtcbiAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgICAgfVxuXG4gICAgICAgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZCwgLmZyaWVuZHMgdGgge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDtcbiAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgICAgIH1cbiAgICAgICAuZnJpZW5kcyB0ZDpmaXJzdC1jaGlsZCwgLmZyaWVuZHMgdGg6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgICAgfVxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAvLyBFbGVtZW50IGxvY2F0b3JzXG4gICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuY3NzKCcuY3VzdG9tLWNvbXBhcmF0b3InKSk7XG4gICAgICAgdmFyIG5hbWVzID0gY29udGFpbmVyLmFsbChieS5yZXBlYXRlcignZnJpZW5kcycpLmNvbHVtbignZnJpZW5kLm5hbWUnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHNvcnQgZnJpZW5kcyBieSBmYXZvcml0ZSBsZXR0ZXIgKGluIGNvcnJlY3QgYWxwaGFiZXRpY2FsIG9yZGVyKScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgwKS5nZXRUZXh0KCkpLnRvQmUoJ0pvaG4nKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoMSkuZ2V0VGV4dCgpKS50b0JlKCdBZGFtJyk7XG4gICAgICAgICBleHBlY3QobmFtZXMuZ2V0KDIpLmdldFRleHQoKSkudG9CZSgnTWlrZScpO1xuICAgICAgICAgZXhwZWN0KG5hbWVzLmdldCgzKS5nZXRUZXh0KCkpLnRvQmUoJ01hcnknKTtcbiAgICAgICAgIGV4cGVjdChuYW1lcy5nZXQoNCkuZ2V0VGV4dCgpKS50b0JlKCdKdWxpZScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKlxuICovXG5vcmRlckJ5RmlsdGVyLiRpbmplY3QgPSBbJyRwYXJzZSddO1xuZnVuY3Rpb24gb3JkZXJCeUZpbHRlcigkcGFyc2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCBzb3J0UHJlZGljYXRlLCByZXZlcnNlT3JkZXIsIGNvbXBhcmVGbikge1xuXG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiBhcnJheTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGFycmF5KSkge1xuICAgICAgdGhyb3cgbWluRXJyKCdvcmRlckJ5JykoJ25vdGFycmF5JywgJ0V4cGVjdGVkIGFycmF5IGJ1dCByZWNlaXZlZDogezB9JywgYXJyYXkpO1xuICAgIH1cblxuICAgIGlmICghaXNBcnJheShzb3J0UHJlZGljYXRlKSkgeyBzb3J0UHJlZGljYXRlID0gW3NvcnRQcmVkaWNhdGVdOyB9XG4gICAgaWYgKHNvcnRQcmVkaWNhdGUubGVuZ3RoID09PSAwKSB7IHNvcnRQcmVkaWNhdGUgPSBbJysnXTsgfVxuXG4gICAgdmFyIHByZWRpY2F0ZXMgPSBwcm9jZXNzUHJlZGljYXRlcyhzb3J0UHJlZGljYXRlKTtcblxuICAgIHZhciBkZXNjZW5kaW5nID0gcmV2ZXJzZU9yZGVyID8gLTEgOiAxO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBgY29tcGFyZSgpYCBmdW5jdGlvbi4gVXNlIGEgZGVmYXVsdCBjb21wYXJhdG9yIGlmIG5vbmUgaXMgc3BlY2lmaWVkLlxuICAgIHZhciBjb21wYXJlID0gaXNGdW5jdGlvbihjb21wYXJlRm4pID8gY29tcGFyZUZuIDogZGVmYXVsdENvbXBhcmU7XG5cbiAgICAvLyBUaGUgbmV4dCB0aHJlZSBsaW5lcyBhcmUgYSB2ZXJzaW9uIG9mIGEgU3dhcnR6aWFuIFRyYW5zZm9ybSBpZGlvbSBmcm9tIFBlcmxcbiAgICAvLyAoc29tZXRpbWVzIGNhbGxlZCB0aGUgRGVjb3JhdGUtU29ydC1VbmRlY29yYXRlIGlkaW9tKVxuICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY2h3YXJ0emlhbl90cmFuc2Zvcm1cbiAgICB2YXIgY29tcGFyZVZhbHVlcyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChhcnJheSwgZ2V0Q29tcGFyaXNvbk9iamVjdCk7XG4gICAgY29tcGFyZVZhbHVlcy5zb3J0KGRvQ29tcGFyaXNvbik7XG4gICAgYXJyYXkgPSBjb21wYXJlVmFsdWVzLm1hcChmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtLnZhbHVlOyB9KTtcblxuICAgIHJldHVybiBhcnJheTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBhcmlzb25PYmplY3QodmFsdWUsIGluZGV4KSB7XG4gICAgICAvLyBOT1RFOiBXZSBhcmUgYWRkaW5nIGFuIGV4dHJhIGB0aWVCcmVha2VyYCB2YWx1ZSBiYXNlZCBvbiB0aGUgZWxlbWVudCdzIGluZGV4LlxuICAgICAgLy8gVGhpcyB3aWxsIGJlIHVzZWQgdG8ga2VlcCB0aGUgc29ydCBzdGFibGUgd2hlbiBub25lIG9mIHRoZSBpbnB1dCBwcmVkaWNhdGVzIGNhblxuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0d28gZWxlbWVudHMuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHRpZUJyZWFrZXI6IHt2YWx1ZTogaW5kZXgsIHR5cGU6ICdudW1iZXInLCBpbmRleDogaW5kZXh9LFxuICAgICAgICBwcmVkaWNhdGVWYWx1ZXM6IHByZWRpY2F0ZXMubWFwKGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgICAgIHJldHVybiBnZXRQcmVkaWNhdGVWYWx1ZShwcmVkaWNhdGUuZ2V0KHZhbHVlKSwgaW5kZXgpO1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb0NvbXBhcmlzb24odjEsIHYyKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwcmVkaWNhdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmUodjEucHJlZGljYXRlVmFsdWVzW2ldLCB2Mi5wcmVkaWNhdGVWYWx1ZXNbaV0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIHByZWRpY2F0ZXNbaV0uZGVzY2VuZGluZyAqIGRlc2NlbmRpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBhcmUodjEudGllQnJlYWtlciwgdjIudGllQnJlYWtlcikgKiBkZXNjZW5kaW5nO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBwcm9jZXNzUHJlZGljYXRlcyhzb3J0UHJlZGljYXRlcykge1xuICAgIHJldHVybiBzb3J0UHJlZGljYXRlcy5tYXAoZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICB2YXIgZGVzY2VuZGluZyA9IDEsIGdldCA9IGlkZW50aXR5O1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbihwcmVkaWNhdGUpKSB7XG4gICAgICAgIGdldCA9IHByZWRpY2F0ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcocHJlZGljYXRlKSkge1xuICAgICAgICBpZiAoKHByZWRpY2F0ZS5jaGFyQXQoMCkgPT09ICcrJyB8fCBwcmVkaWNhdGUuY2hhckF0KDApID09PSAnLScpKSB7XG4gICAgICAgICAgZGVzY2VuZGluZyA9IHByZWRpY2F0ZS5jaGFyQXQoMCkgPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBwcmVkaWNhdGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVkaWNhdGUgIT09ICcnKSB7XG4gICAgICAgICAgZ2V0ID0gJHBhcnNlKHByZWRpY2F0ZSk7XG4gICAgICAgICAgaWYgKGdldC5jb25zdGFudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IGdldCgpO1xuICAgICAgICAgICAgZ2V0ID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlW2tleV07IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge2dldDogZ2V0LCBkZXNjZW5kaW5nOiBkZXNjZW5kaW5nfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6IC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvYmplY3RWYWx1ZSh2YWx1ZSkge1xuICAgIC8vIElmIGB2YWx1ZU9mYCBpcyBhIHZhbGlkIGZ1bmN0aW9uIHVzZSB0aGF0XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUudmFsdWVPZikpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvLyBJZiBgdG9TdHJpbmdgIGlzIGEgdmFsaWQgZnVuY3Rpb24gYW5kIG5vdCB0aGUgb25lIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIHVzZSB0aGF0XG4gICAgaWYgKGhhc0N1c3RvbVRvU3RyaW5nKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZWRpY2F0ZVZhbHVlKHZhbHVlLCBpbmRleCkge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZSA9ICdzdHJpbmcnO1xuICAgICAgdmFsdWUgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFsdWUgPSBvYmplY3RWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IHZhbHVlLCB0eXBlOiB0eXBlLCBpbmRleDogaW5kZXh9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUodjEsIHYyKSB7XG4gICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgdmFyIHR5cGUxID0gdjEudHlwZTtcbiAgICB2YXIgdHlwZTIgPSB2Mi50eXBlO1xuXG4gICAgaWYgKHR5cGUxID09PSB0eXBlMikge1xuICAgICAgdmFyIHZhbHVlMSA9IHYxLnZhbHVlO1xuICAgICAgdmFyIHZhbHVlMiA9IHYyLnZhbHVlO1xuXG4gICAgICBpZiAodHlwZTEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIENvbXBhcmUgc3RyaW5ncyBjYXNlLWluc2Vuc2l0aXZlbHlcbiAgICAgICAgdmFsdWUxID0gdmFsdWUxLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhbHVlMiA9IHZhbHVlMi50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlMSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gRm9yIGJhc2ljIG9iamVjdHMsIHVzZSB0aGUgcG9zaXRpb24gb2YgdGhlIG9iamVjdFxuICAgICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbiBpbnN0ZWFkIG9mIHRoZSB2YWx1ZVxuICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUxKSkgdmFsdWUxID0gdjEuaW5kZXg7XG4gICAgICAgIGlmIChpc09iamVjdCh2YWx1ZTIpKSB2YWx1ZTIgPSB2Mi5pbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlMSAhPT0gdmFsdWUyKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdHlwZTEgPCB0eXBlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5nRGlyZWN0aXZlKGRpcmVjdGl2ZSkge1xuICBpZiAoaXNGdW5jdGlvbihkaXJlY3RpdmUpKSB7XG4gICAgZGlyZWN0aXZlID0ge1xuICAgICAgbGluazogZGlyZWN0aXZlXG4gICAgfTtcbiAgfVxuICBkaXJlY3RpdmUucmVzdHJpY3QgPSBkaXJlY3RpdmUucmVzdHJpY3QgfHwgJ0FDJztcbiAgcmV0dXJuIHZhbHVlRm4oZGlyZWN0aXZlKTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBhXG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogTW9kaWZpZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlIGh0bWwgYSB0YWcgc28gdGhhdCB0aGUgZGVmYXVsdCBhY3Rpb24gaXMgcHJldmVudGVkIHdoZW5cbiAqIHRoZSBocmVmIGF0dHJpYnV0ZSBpcyBlbXB0eS5cbiAqXG4gKiBGb3IgZHluYW1pY2FsbHkgY3JlYXRpbmcgYGhyZWZgIGF0dHJpYnV0ZXMgZm9yIGEgdGFncywgc2VlIHRoZSB7QGxpbmsgbmcubmdIcmVmIGBuZ0hyZWZgfSBkaXJlY3RpdmUuXG4gKi9cbnZhciBodG1sQW5jaG9yRGlyZWN0aXZlID0gdmFsdWVGbih7XG4gIHJlc3RyaWN0OiAnRScsXG4gIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHtcbiAgICBpZiAoIWF0dHIuaHJlZiAmJiAhYXR0ci54bGlua0hyZWYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBJZiB0aGUgbGlua2VkIGVsZW1lbnQgaXMgbm90IGFuIGFuY2hvciB0YWcgYW55bW9yZSwgZG8gbm90aGluZ1xuICAgICAgICBpZiAoZWxlbWVudFswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnYScpIHJldHVybjtcblxuICAgICAgICAvLyBTVkdBRWxlbWVudCBkb2VzIG5vdCB1c2UgdGhlIGhyZWYgYXR0cmlidXRlLCBidXQgcmF0aGVyIHRoZSAneGxpbmtIcmVmJyBhdHRyaWJ1dGUuXG4gICAgICAgIHZhciBocmVmID0gdG9TdHJpbmcuY2FsbChlbGVtZW50LnByb3AoJ2hyZWYnKSkgPT09ICdbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXScgP1xuICAgICAgICAgICAgICAgICAgICd4bGluazpocmVmJyA6ICdocmVmJztcbiAgICAgICAgZWxlbWVudC5vbignY2xpY2snLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIC8vIGlmIHdlIGhhdmUgbm8gaHJlZiB1cmwsIHRoZW4gZG9uJ3QgbmF2aWdhdGUgYW55d2hlcmUuXG4gICAgICAgICAgaWYgKCFlbGVtZW50LmF0dHIoaHJlZikpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0hyZWZcbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgOTlcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhbiBocmVmIGF0dHJpYnV0ZSB3aWxsXG4gKiBtYWtlIHRoZSBsaW5rIGdvIHRvIHRoZSB3cm9uZyBVUkwgaWYgdGhlIHVzZXIgY2xpY2tzIGl0IGJlZm9yZVxuICogQW5ndWxhciBoYXMgYSBjaGFuY2UgdG8gcmVwbGFjZSB0aGUgYHt7aGFzaH19YCBtYXJrdXAgd2l0aCBpdHNcbiAqIHZhbHVlLiBVbnRpbCBBbmd1bGFyIHJlcGxhY2VzIHRoZSBtYXJrdXAgdGhlIGxpbmsgd2lsbCBiZSBicm9rZW5cbiAqIGFuZCB3aWxsIG1vc3QgbGlrZWx5IHJldHVybiBhIDQwNCBlcnJvci4gVGhlIGBuZ0hyZWZgIGRpcmVjdGl2ZVxuICogc29sdmVzIHRoaXMgcHJvYmxlbS5cbiAqXG4gKiBUaGUgd3Jvbmcgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGEgaHJlZj1cImh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fVwiPmxpbmsxPC9hPlxuICogYGBgXG4gKlxuICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGEgbmctaHJlZj1cImh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fVwiPmxpbmsxPC9hPlxuICogYGBgXG4gKlxuICogQGVsZW1lbnQgQVxuICogQHBhcmFtIHt0ZW1wbGF0ZX0gbmdIcmVmIGFueSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gYHt7fX1gIG1hcmt1cC5cbiAqXG4gKiBAZXhhbXBsZVxuICogVGhpcyBleGFtcGxlIHNob3dzIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGBocmVmYCwgYG5nLWhyZWZgIGFuZCBgbmctY2xpY2tgIGF0dHJpYnV0ZXNcbiAqIGluIGxpbmtzIGFuZCB0aGVpciBkaWZmZXJlbnQgYmVoYXZpb3JzOlxuICAgIDxleGFtcGxlIG5hbWU9XCJuZy1ocmVmXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJ2YWx1ZVwiIC8+PGJyIC8+XG4gICAgICAgIDxhIGlkPVwibGluay0xXCIgaHJlZiBuZy1jbGljaz1cInZhbHVlID0gMVwiPmxpbmsgMTwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz5cbiAgICAgICAgPGEgaWQ9XCJsaW5rLTJcIiBocmVmPVwiXCIgbmctY2xpY2s9XCJ2YWx1ZSA9IDJcIj5saW5rIDI8L2E+IChsaW5rLCBkb24ndCByZWxvYWQpPGJyIC8+XG4gICAgICAgIDxhIGlkPVwibGluay0zXCIgbmctaHJlZj1cIi97eycxMjMnfX1cIj5saW5rIDM8L2E+IChsaW5rLCByZWxvYWQhKTxiciAvPlxuICAgICAgICA8YSBpZD1cImxpbmstNFwiIGhyZWY9XCJcIiBuYW1lPVwieHhcIiBuZy1jbGljaz1cInZhbHVlID0gNFwiPmFuY2hvcjwvYT4gKGxpbmssIGRvbid0IHJlbG9hZCk8YnIgLz5cbiAgICAgICAgPGEgaWQ9XCJsaW5rLTVcIiBuYW1lPVwieHh4XCIgbmctY2xpY2s9XCJ2YWx1ZSA9IDVcIj5hbmNob3I8L2E+IChubyBsaW5rKTxiciAvPlxuICAgICAgICA8YSBpZD1cImxpbmstNlwiIG5nLWhyZWY9XCJ7e3ZhbHVlfX1cIj5saW5rPC9hPiAobGluaywgY2hhbmdlIGxvY2F0aW9uKVxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIHdpdGhvdXQgdmFsdWUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTEnKSkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCcxJyk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstMScpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIGhyZWYgZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay0yJykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnMicpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTInKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUoJycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYW5kIGNoYW5nZSB1cmwgd2hlbiBuZy1ocmVmIHNwZWNpZmllZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTMnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvTWF0Y2goL1xcLzEyMyQvKTtcblxuICAgICAgICAgIGVsZW1lbnQoYnkuaWQoJ2xpbmstMycpKS5jbGljaygpO1xuXG4gICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmF2aWdhdGUgYXdheSBmcm9tIGFuIEFuZ3VsYXIgcGFnZSwgc28gd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHVzZSBicm93c2VyLmRyaXZlciB0byBnZXQgdGhlIGJhc2Ugd2ViZHJpdmVyLlxuXG4gICAgICAgICAgYnJvd3Nlci53YWl0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuZHJpdmVyLmdldEN1cnJlbnRVcmwoKS50aGVuKGZ1bmN0aW9uKHVybCkge1xuICAgICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9cXC8xMjMkLyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCA1MDAwLCAncGFnZSBzaG91bGQgbmF2aWdhdGUgdG8gLzEyMycpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgbmctY2xpY2sgYnV0IG5vdCByZWxvYWQgd2hlbiBocmVmIGVtcHR5IHN0cmluZyBhbmQgbmFtZSBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTQnKSkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0VxdWFsKCc0Jyk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2xpbmstNCcpKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkudG9CZSgnJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBuZy1jbGljayBidXQgbm90IHJlbG9hZCB3aGVuIG5vIGhyZWYgYnV0IG5hbWUgc3BlY2lmaWVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudChieS5pZCgnbGluay01JykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkubW9kZWwoJ3ZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9FcXVhbCgnNScpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTUnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvQmUobnVsbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgb25seSBjaGFuZ2UgdXJsIHdoZW4gb25seSBuZy1ocmVmJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgndmFsdWUnKSkuY2xlYXIoKTtcbiAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd2YWx1ZScpKS5zZW5kS2V5cygnNicpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmlkKCdsaW5rLTYnKSkuZ2V0QXR0cmlidXRlKCdocmVmJykpLnRvTWF0Y2goL1xcLzYkLyk7XG5cbiAgICAgICAgICBlbGVtZW50KGJ5LmlkKCdsaW5rLTYnKSkuY2xpY2soKTtcblxuICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5hdmlnYXRlIGF3YXkgZnJvbSBhbiBBbmd1bGFyIHBhZ2UsIHNvIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byB1c2UgYnJvd3Nlci5kcml2ZXIgdG8gZ2V0IHRoZSBiYXNlIHdlYmRyaXZlci5cbiAgICAgICAgICBicm93c2VyLndhaXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5kcml2ZXIuZ2V0Q3VycmVudFVybCgpLnRoZW4oZnVuY3Rpb24odXJsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cmwubWF0Y2goL1xcLzYkLyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCA1MDAwLCAncGFnZSBzaG91bGQgbmF2aWdhdGUgdG8gLzYnKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdTcmNcbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgOTlcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzaW5nIEFuZ3VsYXIgbWFya3VwIGxpa2UgYHt7aGFzaH19YCBpbiBhIGBzcmNgIGF0dHJpYnV0ZSBkb2Vzbid0XG4gKiB3b3JrIHJpZ2h0OiBUaGUgYnJvd3NlciB3aWxsIGZldGNoIGZyb20gdGhlIFVSTCB3aXRoIHRoZSBsaXRlcmFsXG4gKiB0ZXh0IGB7e2hhc2h9fWAgdW50aWwgQW5ndWxhciByZXBsYWNlcyB0aGUgZXhwcmVzc2lvbiBpbnNpZGVcbiAqIGB7e2hhc2h9fWAuIFRoZSBgbmdTcmNgIGRpcmVjdGl2ZSBzb2x2ZXMgdGhpcyBwcm9ibGVtLlxuICpcbiAqIFRoZSBidWdneSB3YXkgdG8gd3JpdGUgaXQ6XG4gKiBgYGBodG1sXG4gKiA8aW1nIHNyYz1cImh0dHA6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci97e2hhc2h9fVwiIGFsdD1cIkRlc2NyaXB0aW9uXCIvPlxuICogYGBgXG4gKlxuICogVGhlIGNvcnJlY3Qgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGltZyBuZy1zcmM9XCJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX1cIiBhbHQ9XCJEZXNjcmlwdGlvblwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAZWxlbWVudCBJTUdcbiAqIEBwYXJhbSB7dGVtcGxhdGV9IG5nU3JjIGFueSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gYHt7fX1gIG1hcmt1cC5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU3Jjc2V0XG4gKiBAcmVzdHJpY3QgQVxuICogQHByaW9yaXR5IDk5XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2luZyBBbmd1bGFyIG1hcmt1cCBsaWtlIGB7e2hhc2h9fWAgaW4gYSBgc3Jjc2V0YCBhdHRyaWJ1dGUgZG9lc24ndFxuICogd29yayByaWdodDogVGhlIGJyb3dzZXIgd2lsbCBmZXRjaCBmcm9tIHRoZSBVUkwgd2l0aCB0aGUgbGl0ZXJhbFxuICogdGV4dCBge3toYXNofX1gIHVudGlsIEFuZ3VsYXIgcmVwbGFjZXMgdGhlIGV4cHJlc3Npb24gaW5zaWRlXG4gKiBge3toYXNofX1gLiBUaGUgYG5nU3Jjc2V0YCBkaXJlY3RpdmUgc29sdmVzIHRoaXMgcHJvYmxlbS5cbiAqXG4gKiBUaGUgYnVnZ3kgd2F5IHRvIHdyaXRlIGl0OlxuICogYGBgaHRtbFxuICogPGltZyBzcmNzZXQ9XCJodHRwOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIve3toYXNofX0gMnhcIiBhbHQ9XCJEZXNjcmlwdGlvblwiLz5cbiAqIGBgYFxuICpcbiAqIFRoZSBjb3JyZWN0IHdheSB0byB3cml0ZSBpdDpcbiAqIGBgYGh0bWxcbiAqIDxpbWcgbmctc3Jjc2V0PVwiaHR0cDovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyL3t7aGFzaH19IDJ4XCIgYWx0PVwiRGVzY3JpcHRpb25cIiAvPlxuICogYGBgXG4gKlxuICogQGVsZW1lbnQgSU1HXG4gKiBAcGFyYW0ge3RlbXBsYXRlfSBuZ1NyY3NldCBhbnkgc3RyaW5nIHdoaWNoIGNhbiBjb250YWluIGB7e319YCBtYXJrdXAuXG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0Rpc2FibGVkXG4gKiBAcmVzdHJpY3QgQVxuICogQHByaW9yaXR5IDEwMFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGBkaXNhYmxlZGAgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGlmIHRoZVxuICoge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaW5zaWRlIGBuZ0Rpc2FibGVkYCBldmFsdWF0ZXMgdG8gdHJ1dGh5LlxuICpcbiAqIEEgc3BlY2lhbCBkaXJlY3RpdmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2Fubm90IHVzZSBpbnRlcnBvbGF0aW9uIGluc2lkZSB0aGUgYGRpc2FibGVkYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctZGlzYWJsZWRcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxsYWJlbD5DbGljayBtZSB0byB0b2dnbGU6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImNoZWNrZWRcIj48L2xhYmVsPjxici8+XG4gICAgICAgIDxidXR0b24gbmctbW9kZWw9XCJidXR0b25cIiBuZy1kaXNhYmxlZD1cImNoZWNrZWRcIj5CdXR0b248L2J1dHRvbj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgYnV0dG9uJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdidXR0b24nKSkuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKS50b0JlRmFsc3koKTtcbiAgICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCdidXR0b24nKSkuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqXG4gKiBAZWxlbWVudCBJTlBVVFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0Rpc2FibGVkIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksXG4gKiAgICAgdGhlbiB0aGUgYGRpc2FibGVkYCBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnRcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDaGVja2VkXG4gKiBAcmVzdHJpY3QgQVxuICogQHByaW9yaXR5IDEwMFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0cyB0aGUgYGNoZWNrZWRgIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCwgaWYgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGBuZ0NoZWNrZWRgIGlzIHRydXRoeS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBkaXJlY3RpdmUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfSxcbiAqIGFzIHRoaXMgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci5cbiAqXG4gKiBBIHNwZWNpYWwgZGlyZWN0aXZlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhlIGBjaGVja2VkYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctY2hlY2tlZFwiPlxuICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgPGxhYmVsPkNoZWNrIG1lIHRvIGNoZWNrIGJvdGg6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cIm1hc3RlclwiPjwvbGFiZWw+PGJyLz5cbiAgICAgICAgPGlucHV0IGlkPVwiY2hlY2tTbGF2ZVwiIHR5cGU9XCJjaGVja2JveFwiIG5nLWNoZWNrZWQ9XCJtYXN0ZXJcIiBhcmlhLWxhYmVsPVwiU2xhdmUgaW5wdXRcIj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBib3RoIGNoZWNrQm94ZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnY2hlY2tTbGF2ZScpKS5nZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnbWFzdGVyJykpLmNsaWNrKCk7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2NoZWNrU2xhdmUnKSkuZ2V0QXR0cmlidXRlKCdjaGVja2VkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICpcbiAqIEBlbGVtZW50IElOUFVUXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2hlY2tlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LFxuICogICAgIHRoZW4gdGhlIGBjaGVja2VkYCBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQgb24gdGhlIGVsZW1lbnRcbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdSZWFkb25seVxuICogQHJlc3RyaWN0IEFcbiAqIEBwcmlvcml0eSAxMDBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBTZXRzIHRoZSBgcmVhZG9ubHlgIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCwgaWYgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGBuZ1JlYWRvbmx5YCBpcyB0cnV0aHkuXG4gKiBOb3RlIHRoYXQgYHJlYWRvbmx5YCBhcHBsaWVzIG9ubHkgdG8gYGlucHV0YCBlbGVtZW50cyB3aXRoIHNwZWNpZmljIHR5cGVzLiBbU2VlIHRoZSBpbnB1dCBkb2NzIG9uXG4gKiBNRE5dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dCNhdHRyLXJlYWRvbmx5KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBBIHNwZWNpYWwgZGlyZWN0aXZlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhlIGByZWFkb25seWBcbiAqIGF0dHJpYnV0ZS4gU2VlIHRoZSB7QGxpbmsgZ3VpZGUvaW50ZXJwb2xhdGlvbiBpbnRlcnBvbGF0aW9uIGd1aWRlfSBmb3IgbW9yZSBpbmZvLlxuICpcbiAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbmFtZT1cIm5nLXJlYWRvbmx5XCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8bGFiZWw+Q2hlY2sgbWUgdG8gbWFrZSB0ZXh0IHJlYWRvbmx5OiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2VkXCI+PC9sYWJlbD48YnIvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1yZWFkb25seT1cImNoZWNrZWRcIiB2YWx1ZT1cIkknbSBBbmd1bGFyXCIgYXJpYS1sYWJlbD1cIlJlYWRvbmx5IGZpZWxkXCIgLz5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgcmVhZG9ubHkgYXR0cicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9XCJ0ZXh0XCJdJykpLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tlZCcpKS5jbGljaygpO1xuICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnW3R5cGU9XCJ0ZXh0XCJdJykpLmdldEF0dHJpYnV0ZSgncmVhZG9ubHknKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgIDwvZmlsZT5cbiAgICA8L2V4YW1wbGU+XG4gKlxuICogQGVsZW1lbnQgSU5QVVRcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdSZWFkb25seSBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LFxuICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgXCJyZWFkb25seVwiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nU2VsZWN0ZWRcbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgMTAwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2V0cyB0aGUgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQsIGlmIHRoZSBleHByZXNzaW9uIGluc2lkZSBgbmdTZWxlY3RlZGAgaXMgdHJ1dGh5LlxuICpcbiAqIEEgc3BlY2lhbCBkaXJlY3RpdmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2Fubm90IHVzZSBpbnRlcnBvbGF0aW9uIGluc2lkZSB0aGUgYHNlbGVjdGVkYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICAgKipOb3RlOioqIGBuZ1NlbGVjdGVkYCBkb2VzIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBgc2VsZWN0YCBhbmQgYG5nTW9kZWxgIGRpcmVjdGl2ZXMsIGl0IG9ubHlcbiAqICAgc2V0cyB0aGUgYHNlbGVjdGVkYCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQuIElmIHlvdSBhcmUgdXNpbmcgYG5nTW9kZWxgIG9uIHRoZSBzZWxlY3QsIHlvdVxuICogICBzaG91bGQgbm90IHVzZSBgbmdTZWxlY3RlZGAgb24gdGhlIG9wdGlvbnMsIGFzIGBuZ01vZGVsYCB3aWxsIHNldCB0aGUgc2VsZWN0IHZhbHVlIGFuZFxuICogICBzZWxlY3RlZCBvcHRpb25zLlxuICogPC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctc2VsZWN0ZWRcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxsYWJlbD5DaGVjayBtZSB0byBzZWxlY3Q6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cInNlbGVjdGVkXCI+PC9sYWJlbD48YnIvPlxuICAgICAgICA8c2VsZWN0IGFyaWEtbGFiZWw9XCJuZ1NlbGVjdGVkIGRlbW9cIj5cbiAgICAgICAgICA8b3B0aW9uPkhlbGxvITwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gaWQ9XCJncmVldFwiIG5nLXNlbGVjdGVkPVwic2VsZWN0ZWRcIj5HcmVldGluZ3MhPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIHNlbGVjdCBHcmVldGluZ3MhJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2dyZWV0JykpLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc2VsZWN0ZWQnKSkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZ3JlZXQnKSkuZ2V0QXR0cmlidXRlKCdzZWxlY3RlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqXG4gKiBAZWxlbWVudCBPUFRJT05cbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdTZWxlY3RlZCBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5LFxuICogICAgIHRoZW4gc3BlY2lhbCBhdHRyaWJ1dGUgXCJzZWxlY3RlZFwiIHdpbGwgYmUgc2V0IG9uIHRoZSBlbGVtZW50XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ09wZW5cbiAqIEByZXN0cmljdCBBXG4gKiBAcHJpb3JpdHkgMTAwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogU2V0cyB0aGUgYG9wZW5gIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCwgaWYgdGhlIGV4cHJlc3Npb24gaW5zaWRlIGBuZ09wZW5gIGlzIHRydXRoeS5cbiAqXG4gKiBBIHNwZWNpYWwgZGlyZWN0aXZlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGNhbm5vdCB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhlIGBvcGVuYFxuICogYXR0cmlidXRlLiBTZWUgdGhlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24gZ3VpZGV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogIyMgQSBub3RlIGFib3V0IGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICpcbiAqIEVkZ2UsIEZpcmVmb3gsIGFuZCBJbnRlcm5ldCBFeHBsb3JlciBkbyBub3Qgc3VwcG9ydCB0aGUgYGRldGFpbHNgIGVsZW1lbnQsIGl0IGlzXG4gKiByZWNvbW1lbmRlZCB0byB1c2Uge0BsaW5rIG5nLm5nU2hvd30gYW5kIHtAbGluayBuZy5uZ0hpZGV9IGluc3RlYWQuXG4gKlxuICogQGV4YW1wbGVcbiAgICAgPGV4YW1wbGUgbmFtZT1cIm5nLW9wZW5cIj5cbiAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPGxhYmVsPkNoZWNrIG1lIGNoZWNrIG11bHRpcGxlOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJvcGVuXCI+PC9sYWJlbD48YnIvPlxuICAgICAgICAgPGRldGFpbHMgaWQ9XCJkZXRhaWxzXCIgbmctb3Blbj1cIm9wZW5cIj5cbiAgICAgICAgICAgIDxzdW1tYXJ5PlNob3cvSGlkZSBtZTwvc3VtbWFyeT5cbiAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICA8L2ZpbGU+XG4gICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICAgaXQoJ3Nob3VsZCB0b2dnbGUgb3BlbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5pZCgnZGV0YWlscycpKS5nZXRBdHRyaWJ1dGUoJ29wZW4nKSkudG9CZUZhbHN5KCk7XG4gICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ29wZW4nKSkuY2xpY2soKTtcbiAgICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2RldGFpbHMnKSkuZ2V0QXR0cmlidXRlKCdvcGVuJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgIH0pO1xuICAgICAgIDwvZmlsZT5cbiAgICAgPC9leGFtcGxlPlxuICpcbiAqIEBlbGVtZW50IERFVEFJTFNcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdPcGVuIElmIHRoZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufSBpcyB0cnV0aHksXG4gKiAgICAgdGhlbiBzcGVjaWFsIGF0dHJpYnV0ZSBcIm9wZW5cIiB3aWxsIGJlIHNldCBvbiB0aGUgZWxlbWVudFxuICovXG5cbnZhciBuZ0F0dHJpYnV0ZUFsaWFzRGlyZWN0aXZlcyA9IHt9O1xuXG4vLyBib29sZWFuIGF0dHJzIGFyZSBldmFsdWF0ZWRcbmZvckVhY2goQk9PTEVBTl9BVFRSLCBmdW5jdGlvbihwcm9wTmFtZSwgYXR0ck5hbWUpIHtcbiAgLy8gYmluZGluZyB0byBtdWx0aXBsZSBpcyBub3Qgc3VwcG9ydGVkXG4gIGlmIChwcm9wTmFtZSA9PT0gJ211bHRpcGxlJykgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRMaW5rRm4oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICBzY29wZS4kd2F0Y2goYXR0cltub3JtYWxpemVkXSwgZnVuY3Rpb24gbmdCb29sZWFuQXR0cldhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICBhdHRyLiRzZXQoYXR0ck5hbWUsICEhdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIG5vcm1hbGl6ZWQgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBhdHRyTmFtZSk7XG4gIHZhciBsaW5rRm4gPSBkZWZhdWx0TGlua0ZuO1xuXG4gIGlmIChwcm9wTmFtZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgbGlua0ZuID0gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIC8vIGVuc3VyaW5nIG5nQ2hlY2tlZCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIG5nTW9kZWwgd2hlbiBib3RoIGFyZSBzZXQgb24gdGhlIHNhbWUgaW5wdXRcbiAgICAgIGlmIChhdHRyLm5nTW9kZWwgIT09IGF0dHJbbm9ybWFsaXplZF0pIHtcbiAgICAgICAgZGVmYXVsdExpbmtGbihzY29wZSwgZWxlbWVudCwgYXR0cik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25vcm1hbGl6ZWRdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICBwcmlvcml0eTogMTAwLFxuICAgICAgbGluazogbGlua0ZuXG4gICAgfTtcbiAgfTtcbn0pO1xuXG4vLyBhbGlhc2VkIGlucHV0IGF0dHJzIGFyZSBldmFsdWF0ZWRcbmZvckVhY2goQUxJQVNFRF9BVFRSLCBmdW5jdGlvbihodG1sQXR0ciwgbmdBdHRyKSB7XG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25nQXR0cl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJpb3JpdHk6IDEwMCxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIC8vc3BlY2lhbCBjYXNlIG5nUGF0dGVybiB3aGVuIGEgbGl0ZXJhbCByZWd1bGFyIGV4cHJlc3Npb24gdmFsdWVcbiAgICAgICAgLy9pcyB1c2VkIGFzIHRoZSBleHByZXNzaW9uICh0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHdhdGNoIGFueXRoaW5nKS5cbiAgICAgICAgaWYgKG5nQXR0ciA9PT0gJ25nUGF0dGVybicgJiYgYXR0ci5uZ1BhdHRlcm4uY2hhckF0KDApID09PSAnLycpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBhdHRyLm5nUGF0dGVybi5tYXRjaChSRUdFWF9TVFJJTkdfUkVHRVhQKTtcbiAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGF0dHIuJHNldCgnbmdQYXR0ZXJuJywgbmV3IFJlZ0V4cChtYXRjaFsxXSwgbWF0Y2hbMl0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY29wZS4kd2F0Y2goYXR0cltuZ0F0dHJdLCBmdW5jdGlvbiBuZ0F0dHJBbGlhc1dhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgYXR0ci4kc2V0KG5nQXR0ciwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufSk7XG5cbi8vIG5nLXNyYywgbmctc3Jjc2V0LCBuZy1ocmVmIGFyZSBpbnRlcnBvbGF0ZWRcbmZvckVhY2goWydzcmMnLCAnc3Jjc2V0JywgJ2hyZWYnXSwgZnVuY3Rpb24oYXR0ck5hbWUpIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBhdHRyTmFtZSk7XG4gIG5nQXR0cmlidXRlQWxpYXNEaXJlY3RpdmVzW25vcm1hbGl6ZWRdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByaW9yaXR5OiA5OSwgLy8gaXQgbmVlZHMgdG8gcnVuIGFmdGVyIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnRlcnBvbGF0ZWRcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IGF0dHJOYW1lLFxuICAgICAgICAgICAgbmFtZSA9IGF0dHJOYW1lO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZSA9PT0gJ2hyZWYnICYmXG4gICAgICAgICAgICB0b1N0cmluZy5jYWxsKGVsZW1lbnQucHJvcCgnaHJlZicpKSA9PT0gJ1tvYmplY3QgU1ZHQW5pbWF0ZWRTdHJpbmddJykge1xuICAgICAgICAgIG5hbWUgPSAneGxpbmtIcmVmJztcbiAgICAgICAgICBhdHRyLiRhdHRyW25hbWVdID0gJ3hsaW5rOmhyZWYnO1xuICAgICAgICAgIHByb3BOYW1lID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHIuJG9ic2VydmUobm9ybWFsaXplZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT09ICdocmVmJykge1xuICAgICAgICAgICAgICBhdHRyLiRzZXQobmFtZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0ci4kc2V0KG5hbWUsIHZhbHVlKTtcblxuICAgICAgICAgIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seVxuICAgICAgICAgIC8vIE9uIElFLCBpZiBcIm5nOnNyY1wiIGRpcmVjdGl2ZSBkZWNsYXJhdGlvbiBpcyB1c2VkIGFuZCBcInNyY1wiIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgLy8gdGhlbiBjYWxsaW5nIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcmMnLCAnZm9vJykgZG9lc24ndCBkbyBhbnl0aGluZywgc28gd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNldCB0aGUgcHJvcGVydHkgYXMgd2VsbCB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdC5cbiAgICAgICAgICAvLyBXZSB1c2UgYXR0clthdHRyTmFtZV0gdmFsdWUgc2luY2UgJHNldCBjYW4gc2FuaXRpemUgdGhlIHVybC5cbiAgICAgICAgICBpZiAobXNpZSAmJiBwcm9wTmFtZSkgZWxlbWVudC5wcm9wKHByb3BOYW1lLCBhdHRyW25hbWVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn0pO1xuXG4vKiBnbG9iYWwgLW51bGxGb3JtQ3RybCwgLVBFTkRJTkdfQ0xBU1MsIC1TVUJNSVRURURfQ0xBU1NcbiAqL1xudmFyIG51bGxGb3JtQ3RybCA9IHtcbiAgJGFkZENvbnRyb2w6IG5vb3AsXG4gICQkcmVuYW1lQ29udHJvbDogbnVsbEZvcm1SZW5hbWVDb250cm9sLFxuICAkcmVtb3ZlQ29udHJvbDogbm9vcCxcbiAgJHNldFZhbGlkaXR5OiBub29wLFxuICAkc2V0RGlydHk6IG5vb3AsXG4gICRzZXRQcmlzdGluZTogbm9vcCxcbiAgJHNldFN1Ym1pdHRlZDogbm9vcFxufSxcblBFTkRJTkdfQ0xBU1MgPSAnbmctcGVuZGluZycsXG5TVUJNSVRURURfQ0xBU1MgPSAnbmctc3VibWl0dGVkJztcblxuZnVuY3Rpb24gbnVsbEZvcm1SZW5hbWVDb250cm9sKGNvbnRyb2wsIG5hbWUpIHtcbiAgY29udHJvbC4kbmFtZSA9IG5hbWU7XG59XG5cbi8qKlxuICogQG5nZG9jIHR5cGVcbiAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXJcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwcmlzdGluZSBUcnVlIGlmIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggdGhlIGZvcm0geWV0LlxuICogQHByb3BlcnR5IHtib29sZWFufSAkZGlydHkgVHJ1ZSBpZiB1c2VyIGhhcyBhbHJlYWR5IGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgYWxsIG9mIHRoZSBjb250YWluaW5nIGZvcm1zIGFuZCBjb250cm9scyBhcmUgdmFsaWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRpbnZhbGlkIFRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnRhaW5pbmcgY29udHJvbCBvciBmb3JtIGlzIGludmFsaWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwZW5kaW5nIFRydWUgaWYgYXQgbGVhc3Qgb25lIGNvbnRhaW5pbmcgY29udHJvbCBvciBmb3JtIGlzIHBlbmRpbmcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRzdWJtaXR0ZWQgVHJ1ZSBpZiB1c2VyIGhhcyBzdWJtaXR0ZWQgdGhlIGZvcm0gZXZlbiBpZiBpdHMgaW52YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkge09iamVjdH0gJGVycm9yIElzIGFuIG9iamVjdCBoYXNoLCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gY29udHJvbHMgb3JcbiAqICBmb3JtcyB3aXRoIGZhaWxpbmcgdmFsaWRhdG9ycywgd2hlcmU6XG4gKlxuICogIC0ga2V5cyBhcmUgdmFsaWRhdGlvbiB0b2tlbnMgKGVycm9yIG5hbWVzKSxcbiAqICAtIHZhbHVlcyBhcmUgYXJyYXlzIG9mIGNvbnRyb2xzIG9yIGZvcm1zIHRoYXQgaGF2ZSBhIGZhaWxpbmcgdmFsaWRhdG9yIGZvciBnaXZlbiBlcnJvciBuYW1lLlxuICpcbiAqICBCdWlsdC1pbiB2YWxpZGF0aW9uIHRva2VuczpcbiAqXG4gKiAgLSBgZW1haWxgXG4gKiAgLSBgbWF4YFxuICogIC0gYG1heGxlbmd0aGBcbiAqICAtIGBtaW5gXG4gKiAgLSBgbWlubGVuZ3RoYFxuICogIC0gYG51bWJlcmBcbiAqICAtIGBwYXR0ZXJuYFxuICogIC0gYHJlcXVpcmVkYFxuICogIC0gYHVybGBcbiAqICAtIGBkYXRlYFxuICogIC0gYGRhdGV0aW1lbG9jYWxgXG4gKiAgLSBgdGltZWBcbiAqICAtIGB3ZWVrYFxuICogIC0gYG1vbnRoYFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogYEZvcm1Db250cm9sbGVyYCBrZWVwcyB0cmFjayBvZiBhbGwgaXRzIGNvbnRyb2xzIGFuZCBuZXN0ZWQgZm9ybXMgYXMgd2VsbCBhcyB0aGUgc3RhdGUgb2YgdGhlbSxcbiAqIHN1Y2ggYXMgYmVpbmcgdmFsaWQvaW52YWxpZCBvciBkaXJ0eS9wcmlzdGluZS5cbiAqXG4gKiBFYWNoIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBmb3JtfSBkaXJlY3RpdmUgY3JlYXRlcyBhbiBpbnN0YW5jZVxuICogb2YgYEZvcm1Db250cm9sbGVyYC5cbiAqXG4gKi9cbi8vYXNrcyBmb3IgJHNjb3BlIHRvIGZvb2wgdGhlIEJDIGNvbnRyb2xsZXIgbW9kdWxlXG5Gb3JtQ29udHJvbGxlci4kaW5qZWN0ID0gWyckZWxlbWVudCcsICckYXR0cnMnLCAnJHNjb3BlJywgJyRhbmltYXRlJywgJyRpbnRlcnBvbGF0ZSddO1xuZnVuY3Rpb24gRm9ybUNvbnRyb2xsZXIoJGVsZW1lbnQsICRhdHRycywgJHNjb3BlLCAkYW5pbWF0ZSwgJGludGVycG9sYXRlKSB7XG4gIHRoaXMuJCRjb250cm9scyA9IFtdO1xuXG4gIC8vIGluaXQgc3RhdGVcbiAgdGhpcy4kZXJyb3IgPSB7fTtcbiAgdGhpcy4kJHN1Y2Nlc3MgPSB7fTtcbiAgdGhpcy4kcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgdGhpcy4kbmFtZSA9ICRpbnRlcnBvbGF0ZSgkYXR0cnMubmFtZSB8fCAkYXR0cnMubmdGb3JtIHx8ICcnKSgkc2NvcGUpO1xuICB0aGlzLiRkaXJ0eSA9IGZhbHNlO1xuICB0aGlzLiRwcmlzdGluZSA9IHRydWU7XG4gIHRoaXMuJHZhbGlkID0gdHJ1ZTtcbiAgdGhpcy4kaW52YWxpZCA9IGZhbHNlO1xuICB0aGlzLiRzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy4kJHBhcmVudEZvcm0gPSBudWxsRm9ybUN0cmw7XG5cbiAgdGhpcy4kJGVsZW1lbnQgPSAkZWxlbWVudDtcbiAgdGhpcy4kJGFuaW1hdGUgPSAkYW5pbWF0ZTtcblxuICBzZXR1cFZhbGlkaXR5KHRoaXMpO1xufVxuXG5Gb3JtQ29udHJvbGxlci5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHJvbGxiYWNrVmlld1ZhbHVlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSb2xsYmFjayBhbGwgZm9ybSBjb250cm9scyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGAkbW9kZWxWYWx1ZWAuXG4gICAqXG4gICAqIFVwZGF0ZXMgbWF5IGJlIHBlbmRpbmcgYnkgYSBkZWJvdW5jZWQgZXZlbnQgb3IgYmVjYXVzZSB0aGUgaW5wdXQgaXMgd2FpdGluZyBmb3IgYSBzb21lIGZ1dHVyZVxuICAgKiBldmVudCBkZWZpbmVkIGluIGBuZy1tb2RlbC1vcHRpb25zYC4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IG5lZWRlZCBieSB0aGUgcmVzZXQgYnV0dG9uIG9mXG4gICAqIGEgZm9ybSB0aGF0IHVzZXMgYG5nLW1vZGVsLW9wdGlvbnNgIHRvIHBlbmQgdXBkYXRlcy5cbiAgICovXG4gICRyb2xsYmFja1ZpZXdWYWx1ZTogZnVuY3Rpb24oKSB7XG4gICAgZm9yRWFjaCh0aGlzLiQkY29udHJvbHMsIGZ1bmN0aW9uKGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2wuJHJvbGxiYWNrVmlld1ZhbHVlKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkY29tbWl0Vmlld1ZhbHVlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb21taXQgYWxsIGZvcm0gY29udHJvbHMgcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBgJG1vZGVsVmFsdWVgLlxuICAgKlxuICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmVcbiAgICogZXZlbnQgZGVmaW5lZCBpbiBgbmctbW9kZWwtb3B0aW9uc2AuIFRoaXMgbWV0aG9kIGlzIHJhcmVseSBuZWVkZWQgYXMgYE5nTW9kZWxDb250cm9sbGVyYFxuICAgKiB1c3VhbGx5IGhhbmRsZXMgY2FsbGluZyB0aGlzIGluIHJlc3BvbnNlIHRvIGlucHV0IGV2ZW50cy5cbiAgICovXG4gICRjb21taXRWaWV3VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgIGZvckVhY2godGhpcy4kJGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7XG4gICAgICBjb250cm9sLiRjb21taXRWaWV3VmFsdWUoKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRhZGRDb250cm9sXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250cm9sIGNvbnRyb2wgb2JqZWN0LCBlaXRoZXIgYSB7QGxpbmsgZm9ybS5Gb3JtQ29udHJvbGxlcn0gb3IgYW5cbiAgICoge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXJ9XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlciBhIGNvbnRyb2wgd2l0aCB0aGUgZm9ybS4gSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5XG4gICAqIHdoZW4gdGhleSBhcmUgbGlua2VkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbnRyb2wgd2lsbCBub3QgYmUgcmVmbGVjdGVkIG9uIHRoZSBuZXcgcGFyZW50IGZvcm0uIFRoaXNcbiAgICogaXMgbm90IGFuIGlzc3VlIHdpdGggbm9ybWFsIHVzZSwgYXMgZnJlc2hseSBjb21waWxlZCBhbmQgbGlua2VkIGNvbnRyb2xzIGFyZSBpbiBhIGAkcHJpc3RpbmVgXG4gICAqIHN0YXRlLlxuICAgKlxuICAgKiBIb3dldmVyLCBpZiB0aGUgbWV0aG9kIGlzIHVzZWQgcHJvZ3JhbW1hdGljYWxseSwgZm9yIGV4YW1wbGUgYnkgYWRkaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29udHJvbHMsXG4gICAqIG9yIGNvbnRyb2xzIHRoYXQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVtb3ZlZCB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlaXIgY29ycmVzcG9uZGluZyBET00gZWxlbWVudCxcbiAgICogaXQncyB0aGUgZGV2ZWxvcGVycyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgc3RhdGUgcHJvcGFnYXRlcyB0byB0aGUgcGFyZW50IGZvcm0uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiBhbiBpbnB1dCBjb250cm9sIGlzIGFkZGVkIHRoYXQgaXMgYWxyZWFkeSBgJGRpcnR5YCBhbmQgaGFzIGAkZXJyb3JgIHByb3BlcnRpZXMsXG4gICAqIGNhbGxpbmcgYCRzZXREaXJ0eSgpYCBhbmQgYCR2YWxpZGF0ZSgpYCBhZnRlcndhcmRzIHdpbGwgcHJvcGFnYXRlIHRoZSBzdGF0ZSB0byB0aGUgcGFyZW50IGZvcm0uXG4gICAqL1xuICAkYWRkQ29udHJvbDogZnVuY3Rpb24oY29udHJvbCkge1xuICAgIC8vIEJyZWFraW5nIGNoYW5nZSAtIGJlZm9yZSwgaW5wdXRzIHdob3NlIG5hbWUgd2FzIFwiaGFzT3duUHJvcGVydHlcIiB3ZXJlIHF1aWV0bHkgaWdub3JlZFxuICAgIC8vIGFuZCBub3QgYWRkZWQgdG8gdGhlIHNjb3BlLiAgTm93IHdlIHRocm93IGFuIGVycm9yLlxuICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KGNvbnRyb2wuJG5hbWUsICdpbnB1dCcpO1xuICAgIHRoaXMuJCRjb250cm9scy5wdXNoKGNvbnRyb2wpO1xuXG4gICAgaWYgKGNvbnRyb2wuJG5hbWUpIHtcbiAgICAgIHRoaXNbY29udHJvbC4kbmFtZV0gPSBjb250cm9sO1xuICAgIH1cblxuICAgIGNvbnRyb2wuJCRwYXJlbnRGb3JtID0gdGhpcztcbiAgfSxcblxuICAvLyBQcml2YXRlIEFQSTogcmVuYW1lIGEgZm9ybSBjb250cm9sXG4gICQkcmVuYW1lQ29udHJvbDogZnVuY3Rpb24oY29udHJvbCwgbmV3TmFtZSkge1xuICAgIHZhciBvbGROYW1lID0gY29udHJvbC4kbmFtZTtcblxuICAgIGlmICh0aGlzW29sZE5hbWVdID09PSBjb250cm9sKSB7XG4gICAgICBkZWxldGUgdGhpc1tvbGROYW1lXTtcbiAgICB9XG4gICAgdGhpc1tuZXdOYW1lXSA9IGNvbnRyb2w7XG4gICAgY29udHJvbC4kbmFtZSA9IG5ld05hbWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgZm9ybS5Gb3JtQ29udHJvbGxlciMkcmVtb3ZlQ29udHJvbFxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udHJvbCBjb250cm9sIG9iamVjdCwgZWl0aGVyIGEge0BsaW5rIGZvcm0uRm9ybUNvbnRyb2xsZXJ9IG9yIGFuXG4gICAqIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyfVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGVyZWdpc3RlciBhIGNvbnRyb2wgZnJvbSB0aGUgZm9ybS5cbiAgICpcbiAgICogSW5wdXQgZWxlbWVudHMgdXNpbmcgbmdNb2RlbENvbnRyb2xsZXIgZG8gdGhpcyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhcmUgZGVzdHJveWVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgb25seSB0aGUgcmVtb3ZlZCBjb250cm9sJ3MgdmFsaWRhdGlvbiBzdGF0ZSAoYCRlcnJvcnNgZXRjLikgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlXG4gICAqIGZvcm0uIGAkZGlydHlgLCBgJHN1Ym1pdHRlZGAgc3RhdGVzIHdpbGwgbm90IGJlIGNoYW5nZWQsIGJlY2F1c2UgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGNhbiBiZVxuICAgKiBkaWZmZXJlbnQgZnJvbSBjYXNlIHRvIGNhc2UuIEZvciBleGFtcGxlLCByZW1vdmluZyB0aGUgb25seSBgJGRpcnR5YCBjb250cm9sIGZyb20gYSBmb3JtIG1heSBvclxuICAgKiBtYXkgbm90IG1lYW4gdGhhdCB0aGUgZm9ybSBpcyBzdGlsbCBgJGRpcnR5YC5cbiAgICovXG4gICRyZW1vdmVDb250cm9sOiBmdW5jdGlvbihjb250cm9sKSB7XG4gICAgaWYgKGNvbnRyb2wuJG5hbWUgJiYgdGhpc1tjb250cm9sLiRuYW1lXSA9PT0gY29udHJvbCkge1xuICAgICAgZGVsZXRlIHRoaXNbY29udHJvbC4kbmFtZV07XG4gICAgfVxuICAgIGZvckVhY2godGhpcy4kcGVuZGluZywgZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcbiAgICAgIHRoaXMuJHNldFZhbGlkaXR5KG5hbWUsIG51bGwsIGNvbnRyb2wpO1xuICAgIH0sIHRoaXMpO1xuICAgIGZvckVhY2godGhpcy4kZXJyb3IsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW52YWxpZC10aGlzXG4gICAgICB0aGlzLiRzZXRWYWxpZGl0eShuYW1lLCBudWxsLCBjb250cm9sKTtcbiAgICB9LCB0aGlzKTtcbiAgICBmb3JFYWNoKHRoaXMuJCRzdWNjZXNzLCBmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWludmFsaWQtdGhpc1xuICAgICAgdGhpcy4kc2V0VmFsaWRpdHkobmFtZSwgbnVsbCwgY29udHJvbCk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICBhcnJheVJlbW92ZSh0aGlzLiQkY29udHJvbHMsIGNvbnRyb2wpO1xuICAgIGNvbnRyb2wuJCRwYXJlbnRGb3JtID0gbnVsbEZvcm1DdHJsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldERpcnR5XG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBmb3JtIHRvIGEgZGlydHkgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gYWRkIHRoZSAnbmctZGlydHknIGNsYXNzIGFuZCBzZXQgdGhlIGZvcm0gdG8gYSBkaXJ0eVxuICAgKiBzdGF0ZSAobmctZGlydHkgY2xhc3MpLiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy5cbiAgICovXG4gICRzZXREaXJ0eTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy4kJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIFBSSVNUSU5FX0NMQVNTKTtcbiAgICB0aGlzLiQkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwgRElSVFlfQ0xBU1MpO1xuICAgIHRoaXMuJGRpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLiRwcmlzdGluZSA9IGZhbHNlO1xuICAgIHRoaXMuJCRwYXJlbnRGb3JtLiRzZXREaXJ0eSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFByaXN0aW5lXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBmb3JtIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSdzIGAkcHJpc3RpbmVgIHN0YXRlIHRvIHRydWUsIHRoZSBgJGRpcnR5YCBzdGF0ZSB0byBmYWxzZSwgcmVtb3Zlc1xuICAgKiB0aGUgYG5nLWRpcnR5YCBjbGFzcyBhbmQgYWRkcyB0aGUgYG5nLXByaXN0aW5lYCBjbGFzcy4gQWRkaXRpb25hbGx5LCBpdCBzZXRzIHRoZSBgJHN1Ym1pdHRlZGBcbiAgICogc3RhdGUgdG8gZmFsc2UuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBwcm9wYWdhdGUgdG8gYWxsIHRoZSBjb250cm9scyBjb250YWluZWQgaW4gdGhpcyBmb3JtLlxuICAgKlxuICAgKiBTZXR0aW5nIGEgZm9ybSBiYWNrIHRvIGEgcHJpc3RpbmUgc3RhdGUgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4gd2Ugd2FudCB0byAncmV1c2UnIGEgZm9ybSBhZnRlclxuICAgKiBzYXZpbmcgb3IgcmVzZXR0aW5nIGl0LlxuICAgKi9cbiAgJHNldFByaXN0aW5lOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiQkYW5pbWF0ZS5zZXRDbGFzcyh0aGlzLiQkZWxlbWVudCwgUFJJU1RJTkVfQ0xBU1MsIERJUlRZX0NMQVNTICsgJyAnICsgU1VCTUlUVEVEX0NMQVNTKTtcbiAgICB0aGlzLiRkaXJ0eSA9IGZhbHNlO1xuICAgIHRoaXMuJHByaXN0aW5lID0gdHJ1ZTtcbiAgICB0aGlzLiRzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBmb3JFYWNoKHRoaXMuJCRjb250cm9scywgZnVuY3Rpb24oY29udHJvbCkge1xuICAgICAgY29udHJvbC4kc2V0UHJpc3RpbmUoKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRVbnRvdWNoZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHVudG91Y2hlZCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlICduZy10b3VjaGVkJyBjbGFzcyBhbmQgc2V0IHRoZSBmb3JtIGNvbnRyb2xzIHRvIHRoZWlyXG4gICAqIHVudG91Y2hlZCBzdGF0ZSAobmctdW50b3VjaGVkIGNsYXNzKS5cbiAgICpcbiAgICogU2V0dGluZyBhIGZvcm0gY29udHJvbHMgYmFjayB0byB0aGVpciB1bnRvdWNoZWQgc3RhdGUgaXMgb2Z0ZW4gdXNlZnVsIHdoZW4gc2V0dGluZyB0aGUgZm9ybVxuICAgKiBiYWNrIHRvIGl0cyBwcmlzdGluZSBzdGF0ZS5cbiAgICovXG4gICRzZXRVbnRvdWNoZWQ6IGZ1bmN0aW9uKCkge1xuICAgIGZvckVhY2godGhpcy4kJGNvbnRyb2xzLCBmdW5jdGlvbihjb250cm9sKSB7XG4gICAgICBjb250cm9sLiRzZXRVbnRvdWNoZWQoKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBmb3JtLkZvcm1Db250cm9sbGVyIyRzZXRTdWJtaXR0ZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGZvcm0gdG8gaXRzIHN1Ym1pdHRlZCBzdGF0ZS5cbiAgICovXG4gICRzZXRTdWJtaXR0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJCRhbmltYXRlLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LCBTVUJNSVRURURfQ0xBU1MpO1xuICAgIHRoaXMuJHN1Ym1pdHRlZCA9IHRydWU7XG4gICAgdGhpcy4kJHBhcmVudEZvcm0uJHNldFN1Ym1pdHRlZCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEBuZ2RvYyBtZXRob2RcbiAqIEBuYW1lIGZvcm0uRm9ybUNvbnRyb2xsZXIjJHNldFZhbGlkaXR5XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXRzIHRoZSB2YWxpZGl0eSBvZiBhIGZvcm0gY29udHJvbC5cbiAqXG4gKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gcHJvcGFnYXRlIHRvIHBhcmVudCBmb3Jtcy5cbiAqL1xuYWRkU2V0VmFsaWRpdHlNZXRob2Qoe1xuICBjbGF6ejogRm9ybUNvbnRyb2xsZXIsXG4gIHNldDogZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSwgY29udHJvbGxlcikge1xuICAgIHZhciBsaXN0ID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICBpZiAoIWxpc3QpIHtcbiAgICAgIG9iamVjdFtwcm9wZXJ0eV0gPSBbY29udHJvbGxlcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihjb250cm9sbGVyKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgbGlzdC5wdXNoKGNvbnRyb2xsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdW5zZXQ6IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHksIGNvbnRyb2xsZXIpIHtcbiAgICB2YXIgbGlzdCA9IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFycmF5UmVtb3ZlKGxpc3QsIGNvbnRyb2xsZXIpO1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0Zvcm1cbiAqIEByZXN0cmljdCBFQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE5lc3RhYmxlIGFsaWFzIG9mIHtAbGluayBuZy5kaXJlY3RpdmU6Zm9ybSBgZm9ybWB9IGRpcmVjdGl2ZS4gSFRNTFxuICogZG9lcyBub3QgYWxsb3cgbmVzdGluZyBvZiBmb3JtIGVsZW1lbnRzLiBJdCBpcyB1c2VmdWwgdG8gbmVzdCBmb3JtcywgZm9yIGV4YW1wbGUgaWYgdGhlIHZhbGlkaXR5IG9mIGFcbiAqIHN1Yi1ncm91cCBvZiBjb250cm9scyBuZWVkcyB0byBiZSBkZXRlcm1pbmVkLlxuICpcbiAqIE5vdGU6IHRoZSBwdXJwb3NlIG9mIGBuZ0Zvcm1gIGlzIHRvIGdyb3VwIGNvbnRyb2xzLFxuICogYnV0IG5vdCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgYDxmb3JtPmAgdGFnIHdpdGggYWxsIG9mIGl0cyBjYXBhYmlsaXRpZXNcbiAqIChlLmcuIHBvc3RpbmcgdG8gdGhlIHNlcnZlciwgLi4uKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nRm9ybXxuYW1lIE5hbWUgb2YgdGhlIGZvcm0uIElmIHNwZWNpZmllZCwgdGhlIGZvcm0gY29udHJvbGxlciB3aWxsIGJlIHB1Ymxpc2hlZCBpbnRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBzY29wZSwgdW5kZXIgdGhpcyBuYW1lLlxuICpcbiAqL1xuXG4gLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBmb3JtXG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRGlyZWN0aXZlIHRoYXQgaW5zdGFudGlhdGVzXG4gKiB7QGxpbmsgZm9ybS5Gb3JtQ29udHJvbGxlciBGb3JtQ29udHJvbGxlcn0uXG4gKlxuICogSWYgdGhlIGBuYW1lYCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIGlzIHB1Ymxpc2hlZCBvbnRvIHRoZSBjdXJyZW50IHNjb3BlIHVuZGVyXG4gKiB0aGlzIG5hbWUuXG4gKlxuICogIyBBbGlhczoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Zvcm0gYG5nRm9ybWB9XG4gKlxuICogSW4gQW5ndWxhciwgZm9ybXMgY2FuIGJlIG5lc3RlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBvdXRlciBmb3JtIGlzIHZhbGlkIHdoZW4gYWxsIG9mIHRoZSBjaGlsZFxuICogZm9ybXMgYXJlIHZhbGlkIGFzIHdlbGwuIEhvd2V2ZXIsIGJyb3dzZXJzIGRvIG5vdCBhbGxvdyBuZXN0aW5nIG9mIGA8Zm9ybT5gIGVsZW1lbnRzLCBzb1xuICogQW5ndWxhciBwcm92aWRlcyB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Zvcm0gYG5nRm9ybWB9IGRpcmVjdGl2ZSwgd2hpY2ggYmVoYXZlcyBpZGVudGljYWxseSB0b1xuICogYGZvcm1gIGJ1dCBjYW4gYmUgbmVzdGVkLiBOZXN0ZWQgZm9ybXMgY2FuIGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIGlmIHRoZSB2YWxpZGl0eSBvZiBhIHN1Yi1ncm91cFxuICogb2YgY29udHJvbHMgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiAjIENTUyBjbGFzc2VzXG4gKiAgLSBgbmctdmFsaWRgIGlzIHNldCBpZiB0aGUgZm9ybSBpcyB2YWxpZC5cbiAqICAtIGBuZy1pbnZhbGlkYCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgaW52YWxpZC5cbiAqICAtIGBuZy1wZW5kaW5nYCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgcGVuZGluZy5cbiAqICAtIGBuZy1wcmlzdGluZWAgaXMgc2V0IGlmIHRoZSBmb3JtIGlzIHByaXN0aW5lLlxuICogIC0gYG5nLWRpcnR5YCBpcyBzZXQgaWYgdGhlIGZvcm0gaXMgZGlydHkuXG4gKiAgLSBgbmctc3VibWl0dGVkYCBpcyBzZXQgaWYgdGhlIGZvcm0gd2FzIHN1Ym1pdHRlZC5cbiAqXG4gKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC5cbiAqXG4gKlxuICogIyBTdWJtaXR0aW5nIGEgZm9ybSBhbmQgcHJldmVudGluZyB0aGUgZGVmYXVsdCBhY3Rpb25cbiAqXG4gKiBTaW5jZSB0aGUgcm9sZSBvZiBmb3JtcyBpbiBjbGllbnQtc2lkZSBBbmd1bGFyIGFwcGxpY2F0aW9ucyBpcyBkaWZmZXJlbnQgdGhhbiBpbiBjbGFzc2ljYWxcbiAqIHJvdW5kdHJpcCBhcHBzLCBpdCBpcyBkZXNpcmFibGUgZm9yIHRoZSBicm93c2VyIG5vdCB0byB0cmFuc2xhdGUgdGhlIGZvcm0gc3VibWlzc2lvbiBpbnRvIGEgZnVsbFxuICogcGFnZSByZWxvYWQgdGhhdCBzZW5kcyB0aGUgZGF0YSB0byB0aGUgc2VydmVyLiBJbnN0ZWFkIHNvbWUgamF2YXNjcmlwdCBsb2dpYyBzaG91bGQgYmUgdHJpZ2dlcmVkXG4gKiB0byBoYW5kbGUgdGhlIGZvcm0gc3VibWlzc2lvbiBpbiBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpYyB3YXkuXG4gKlxuICogRm9yIHRoaXMgcmVhc29uLCBBbmd1bGFyIHByZXZlbnRzIHRoZSBkZWZhdWx0IGFjdGlvbiAoZm9ybSBzdWJtaXNzaW9uIHRvIHRoZSBzZXJ2ZXIpIHVubGVzcyB0aGVcbiAqIGA8Zm9ybT5gIGVsZW1lbnQgaGFzIGFuIGBhY3Rpb25gIGF0dHJpYnV0ZSBzcGVjaWZpZWQuXG4gKlxuICogWW91IGNhbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdheXMgdG8gc3BlY2lmeSB3aGF0IGphdmFzY3JpcHQgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlblxuICogYSBmb3JtIGlzIHN1Ym1pdHRlZDpcbiAqXG4gKiAtIHtAbGluayBuZy5kaXJlY3RpdmU6bmdTdWJtaXQgbmdTdWJtaXR9IGRpcmVjdGl2ZSBvbiB0aGUgZm9ybSBlbGVtZW50XG4gKiAtIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGljayBuZ0NsaWNrfSBkaXJlY3RpdmUgb24gdGhlIGZpcnN0XG4gICogIGJ1dHRvbiBvciBpbnB1dCBmaWVsZCBvZiB0eXBlIHN1Ym1pdCAoaW5wdXRbdHlwZT1zdWJtaXRdKVxuICpcbiAqIFRvIHByZXZlbnQgZG91YmxlIGV4ZWN1dGlvbiBvZiB0aGUgaGFuZGxlciwgdXNlIG9ubHkgb25lIG9mIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nU3VibWl0IG5nU3VibWl0fVxuICogb3Ige0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9IGRpcmVjdGl2ZXMuXG4gKiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtIHN1Ym1pc3Npb24gcnVsZXMgaW4gdGhlIEhUTUwgc3BlY2lmaWNhdGlvbjpcbiAqXG4gKiAtIElmIGEgZm9ybSBoYXMgb25seSBvbmUgaW5wdXQgZmllbGQgdGhlbiBoaXR0aW5nIGVudGVyIGluIHRoaXMgZmllbGQgdHJpZ2dlcnMgZm9ybSBzdWJtaXRcbiAqIChgbmdTdWJtaXRgKVxuICogLSBpZiBhIGZvcm0gaGFzIDIrIGlucHV0IGZpZWxkcyBhbmQgbm8gYnV0dG9ucyBvciBpbnB1dFt0eXBlPXN1Ym1pdF0gdGhlbiBoaXR0aW5nIGVudGVyXG4gKiBkb2Vzbid0IHRyaWdnZXIgc3VibWl0XG4gKiAtIGlmIGEgZm9ybSBoYXMgb25lIG9yIG1vcmUgaW5wdXQgZmllbGRzIGFuZCBvbmUgb3IgbW9yZSBidXR0b25zIG9yIGlucHV0W3R5cGU9c3VibWl0XSB0aGVuXG4gKiBoaXR0aW5nIGVudGVyIGluIGFueSBvZiB0aGUgaW5wdXQgZmllbGRzIHdpbGwgdHJpZ2dlciB0aGUgY2xpY2sgaGFuZGxlciBvbiB0aGUgKmZpcnN0KiBidXR0b24gb3JcbiAqIGlucHV0W3R5cGU9c3VibWl0XSAoYG5nQ2xpY2tgKSAqYW5kKiBhIHN1Ym1pdCBoYW5kbGVyIG9uIHRoZSBlbmNsb3NpbmcgZm9ybSAoYG5nU3VibWl0YClcbiAqXG4gKiBBbnkgcGVuZGluZyBgbmdNb2RlbE9wdGlvbnNgIGNoYW5nZXMgd2lsbCB0YWtlIHBsYWNlIGltbWVkaWF0ZWx5IHdoZW4gYW4gZW5jbG9zaW5nIGZvcm0gaXNcbiAqIHN1Ym1pdHRlZC4gTm90ZSB0aGF0IGBuZ0NsaWNrYCBldmVudHMgd2lsbCBvY2N1ciBiZWZvcmUgdGhlIG1vZGVsIGlzIHVwZGF0ZWQuIFVzZSBgbmdTdWJtaXRgXG4gKiB0byBoYXZlIGFjY2VzcyB0byB0aGUgdXBkYXRlZCBtb2RlbC5cbiAqXG4gKiAjIyBBbmltYXRpb24gSG9va3NcbiAqXG4gKiBBbmltYXRpb25zIGluIG5nRm9ybSBhcmUgdHJpZ2dlcmVkIHdoZW4gYW55IG9mIHRoZSBhc3NvY2lhdGVkIENTUyBjbGFzc2VzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZC5cbiAqIFRoZXNlIGNsYXNzZXMgYXJlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsIGAubmctaW52YWxpZGAgYW5kIGAubmctdmFsaWRgIGFzIHdlbGwgYXMgYW55XG4gKiBvdGhlciB2YWxpZGF0aW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgd2l0aGluIHRoZSBmb3JtLiBBbmltYXRpb25zIGluIG5nRm9ybSBhcmUgc2ltaWxhciB0byBob3dcbiAqIHRoZXkgd29yayBpbiBuZ0NsYXNzIGFuZCBhbmltYXRpb25zIGNhbiBiZSBob29rZWQgaW50byB1c2luZyBDU1MgdHJhbnNpdGlvbnMsIGtleWZyYW1lcyBhcyB3ZWxsXG4gKiBhcyBKUyBhbmltYXRpb25zLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSB3YXkgdG8gdXRpbGl6ZSBDU1MgdHJhbnNpdGlvbnMgdG8gc3R5bGUgYSBmb3JtIGVsZW1lbnRcbiAqIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQgYXMgaW52YWxpZCBhZnRlciBpdCBoYXMgYmVlbiB2YWxpZGF0ZWQ6XG4gKlxuICogPHByZT5cbiAqIC8vYmUgc3VyZSB0byBpbmNsdWRlIG5nQW5pbWF0ZSBhcyBhIG1vZHVsZSB0byBob29rIGludG8gbW9yZVxuICogLy9hZHZhbmNlZCBhbmltYXRpb25zXG4gKiAubXktZm9ybSB7XG4gKiAgIHRyYW5zaXRpb246MC41cyBsaW5lYXIgYWxsO1xuICogICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAqIH1cbiAqIC5teS1mb3JtLm5nLWludmFsaWQge1xuICogICBiYWNrZ3JvdW5kOiByZWQ7XG4gKiAgIGNvbG9yOndoaXRlO1xuICogfVxuICogPC9wcmU+XG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctZm9ybVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIGZpeEJhc2U9XCJ0cnVlXCIgbW9kdWxlPVwiZm9ybUV4YW1wbGVcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdmb3JtRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRm9ybUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS51c2VyVHlwZSA9ICdndWVzdCc7XG4gICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8c3R5bGU+XG4gICAgICAgIC5teS1mb3JtIHtcbiAgICAgICAgICB0cmFuc2l0aW9uOmFsbCBsaW5lYXIgMC41cztcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgfVxuICAgICAgICAubXktZm9ybS5uZy1pbnZhbGlkIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICAgIH1cbiAgICAgICA8L3N0eWxlPlxuICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRm9ybUNvbnRyb2xsZXJcIiBjbGFzcz1cIm15LWZvcm1cIj5cbiAgICAgICAgIHVzZXJUeXBlOiA8aW5wdXQgbmFtZT1cImlucHV0XCIgbmctbW9kZWw9XCJ1c2VyVHlwZVwiIHJlcXVpcmVkPlxuICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+UmVxdWlyZWQhPC9zcGFuPjxicj5cbiAgICAgICAgIDxjb2RlPnVzZXJUeXBlID0ge3t1c2VyVHlwZX19PC9jb2RlPjxicj5cbiAgICAgICAgIDxjb2RlPm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvY29kZT48YnI+XG4gICAgICAgICA8Y29kZT5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L2NvZGU+PGJyPlxuICAgICAgICAgPGNvZGU+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC9jb2RlPjxicj5cbiAgICAgICAgIDxjb2RlPm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC9jb2RlPjxicj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdXNlclR5cGUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ3VzZXJUeXBlJykpO1xuICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcblxuICAgICAgICAgIGV4cGVjdCh1c2VyVHlwZS5nZXRUZXh0KCkpLnRvQ29udGFpbignZ3Vlc3QnKTtcbiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHVzZXJUeXBlID0gZWxlbWVudChieS5iaW5kaW5nKCd1c2VyVHlwZScpKTtcbiAgICAgICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG4gICAgICAgICAgdmFyIHVzZXJJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXJUeXBlJykpO1xuXG4gICAgICAgICAgdXNlcklucHV0LmNsZWFyKCk7XG4gICAgICAgICAgdXNlcklucHV0LnNlbmRLZXlzKCcnKTtcblxuICAgICAgICAgIGV4cGVjdCh1c2VyVHlwZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3VzZXJUeXBlID0nKTtcbiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgTmFtZSBvZiB0aGUgZm9ybS4gSWYgc3BlY2lmaWVkLCB0aGUgZm9ybSBjb250cm9sbGVyIHdpbGwgYmUgcHVibGlzaGVkIGludG9cbiAqICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkIHNjb3BlLCB1bmRlciB0aGlzIG5hbWUuXG4gKi9cbnZhciBmb3JtRGlyZWN0aXZlRmFjdG9yeSA9IGZ1bmN0aW9uKGlzTmdGb3JtKSB7XG4gIHJldHVybiBbJyR0aW1lb3V0JywgJyRwYXJzZScsIGZ1bmN0aW9uKCR0aW1lb3V0LCAkcGFyc2UpIHtcbiAgICB2YXIgZm9ybURpcmVjdGl2ZSA9IHtcbiAgICAgIG5hbWU6ICdmb3JtJyxcbiAgICAgIHJlc3RyaWN0OiBpc05nRm9ybSA/ICdFQUMnIDogJ0UnLFxuICAgICAgcmVxdWlyZTogWydmb3JtJywgJ15eP2Zvcm0nXSwgLy9maXJzdCBpcyB0aGUgZm9ybSdzIG93biBjdHJsLCBzZWNvbmQgaXMgYW4gb3B0aW9uYWwgcGFyZW50IGZvcm1cbiAgICAgIGNvbnRyb2xsZXI6IEZvcm1Db250cm9sbGVyLFxuICAgICAgY29tcGlsZTogZnVuY3Rpb24gbmdGb3JtQ29tcGlsZShmb3JtRWxlbWVudCwgYXR0cikge1xuICAgICAgICAvLyBTZXR1cCBpbml0aWFsIHN0YXRlIG9mIHRoZSBjb250cm9sXG4gICAgICAgIGZvcm1FbGVtZW50LmFkZENsYXNzKFBSSVNUSU5FX0NMQVNTKS5hZGRDbGFzcyhWQUxJRF9DTEFTUyk7XG5cbiAgICAgICAgdmFyIG5hbWVBdHRyID0gYXR0ci5uYW1lID8gJ25hbWUnIDogKGlzTmdGb3JtICYmIGF0dHIubmdGb3JtID8gJ25nRm9ybScgOiBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcmU6IGZ1bmN0aW9uIG5nRm9ybVByZUxpbmsoc2NvcGUsIGZvcm1FbGVtZW50LCBhdHRyLCBjdHJscykge1xuICAgICAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBjdHJsc1swXTtcblxuICAgICAgICAgICAgLy8gaWYgYGFjdGlvbmAgYXR0ciBpcyBub3QgcHJlc2VudCBvbiB0aGUgZm9ybSwgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gKHN1Ym1pc3Npb24pXG4gICAgICAgICAgICBpZiAoISgnYWN0aW9uJyBpbiBhdHRyKSkge1xuICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UganEgZXZlbnRzIGJlY2F1c2UgaWYgYSBmb3JtIGlzIGRlc3Ryb3llZCBkdXJpbmcgc3VibWlzc2lvbiB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgICAvLyBhY3Rpb24gaXMgbm90IHByZXZlbnRlZC4gc2VlICMxMjM4XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIElFIDkgaXMgbm90IGFmZmVjdGVkIGJlY2F1c2UgaXQgZG9lc24ndCBmaXJlIGEgc3VibWl0IGV2ZW50IGFuZCB0cnkgdG8gZG8gYSBmdWxsXG4gICAgICAgICAgICAgIC8vIHBhZ2UgcmVsb2FkIGlmIHRoZSBmb3JtIHdhcyBkZXN0cm95ZWQgYnkgc3VibWlzc2lvbiBvZiB0aGUgZm9ybSB2aWEgYSBjbGljayBoYW5kbGVyXG4gICAgICAgICAgICAgIC8vIG9uIGEgYnV0dG9uIGluIHRoZSBmb3JtLiBMb29rcyBsaWtlIGFuIElFOSBzcGVjaWZpYyBidWcuXG4gICAgICAgICAgICAgIHZhciBoYW5kbGVGb3JtU3VibWlzc2lvbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbGxlci4kY29tbWl0Vmlld1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRzZXRTdWJtaXR0ZWQoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgZm9ybUVsZW1lbnRbMF0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pO1xuXG4gICAgICAgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIHByZXZlbnREZWZhdWx0IGxpc3RlbmVyIHNvIHRoYXQgd2UgZG9uJ3Qgbm90IGxlYWsgbWVtb3J5IGJ1dCBpbiBhXG4gICAgICAgICAgICAgIC8vIHdheSB0aGF0IHdpbGwgYWNoaWV2ZSB0aGUgcHJldmVudGlvbiBvZiB0aGUgZGVmYXVsdCBhY3Rpb24uXG4gICAgICAgICAgICAgIGZvcm1FbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgZm9ybUVsZW1lbnRbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VibWl0JywgaGFuZGxlRm9ybVN1Ym1pc3Npb24pO1xuICAgICAgICAgICAgICAgIH0sIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGb3JtQ3RybCA9IGN0cmxzWzFdIHx8IGNvbnRyb2xsZXIuJCRwYXJlbnRGb3JtO1xuICAgICAgICAgICAgcGFyZW50Rm9ybUN0cmwuJGFkZENvbnRyb2woY29udHJvbGxlcik7XG5cbiAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBuYW1lQXR0ciA/IGdldFNldHRlcihjb250cm9sbGVyLiRuYW1lKSA6IG5vb3A7XG5cbiAgICAgICAgICAgIGlmIChuYW1lQXR0cikge1xuICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICBhdHRyLiRvYnNlcnZlKG5hbWVBdHRyLCBmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLiRuYW1lID09PSBuZXdWYWx1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNldHRlcihzY29wZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLiQkcGFyZW50Rm9ybS4kJHJlbmFtZUNvbnRyb2woY29udHJvbGxlciwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHNldHRlciA9IGdldFNldHRlcihjb250cm9sbGVyLiRuYW1lKTtcbiAgICAgICAgICAgICAgICBzZXR0ZXIoc2NvcGUsIGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1FbGVtZW50Lm9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLiQkcGFyZW50Rm9ybS4kcmVtb3ZlQ29udHJvbChjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgc2V0dGVyKHNjb3BlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICBleHRlbmQoY29udHJvbGxlciwgbnVsbEZvcm1DdHJsKTsgLy9zdG9wIHByb3BhZ2F0aW5nIGNoaWxkIGRlc3RydWN0aW9uIGhhbmRsZXJzIHVwd2FyZHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1EaXJlY3RpdmU7XG5cbiAgICBmdW5jdGlvbiBnZXRTZXR0ZXIoZXhwcmVzc2lvbikge1xuICAgICAgaWYgKGV4cHJlc3Npb24gPT09ICcnKSB7XG4gICAgICAgIC8vY3JlYXRlIGFuIGFzc2lnbmFibGUgZXhwcmVzc2lvbiwgc28gZm9ybXMgd2l0aCBhbiBlbXB0eSBuYW1lIGNhbiBiZSByZW5hbWVkIGxhdGVyXG4gICAgICAgIHJldHVybiAkcGFyc2UoJ3RoaXNbXCJcIl0nKS5hc3NpZ247XG4gICAgICB9XG4gICAgICByZXR1cm4gJHBhcnNlKGV4cHJlc3Npb24pLmFzc2lnbiB8fCBub29wO1xuICAgIH1cbiAgfV07XG59O1xuXG52YXIgZm9ybURpcmVjdGl2ZSA9IGZvcm1EaXJlY3RpdmVGYWN0b3J5KCk7XG52YXIgbmdGb3JtRGlyZWN0aXZlID0gZm9ybURpcmVjdGl2ZUZhY3RvcnkodHJ1ZSk7XG5cblxuXG4vLyBoZWxwZXIgbWV0aG9kc1xuZnVuY3Rpb24gc2V0dXBWYWxpZGl0eShpbnN0YW5jZSkge1xuICBpbnN0YW5jZS4kJGNsYXNzQ2FjaGUgPSB7fTtcbiAgaW5zdGFuY2UuJCRjbGFzc0NhY2hlW0lOVkFMSURfQ0xBU1NdID0gIShpbnN0YW5jZS4kJGNsYXNzQ2FjaGVbVkFMSURfQ0xBU1NdID0gaW5zdGFuY2UuJCRlbGVtZW50Lmhhc0NsYXNzKFZBTElEX0NMQVNTKSk7XG59XG5mdW5jdGlvbiBhZGRTZXRWYWxpZGl0eU1ldGhvZChjb250ZXh0KSB7XG4gIHZhciBjbGF6eiA9IGNvbnRleHQuY2xhenosXG4gICAgICBzZXQgPSBjb250ZXh0LnNldCxcbiAgICAgIHVuc2V0ID0gY29udGV4dC51bnNldDtcblxuICBjbGF6ei5wcm90b3R5cGUuJHNldFZhbGlkaXR5ID0gZnVuY3Rpb24odmFsaWRhdGlvbkVycm9yS2V5LCBzdGF0ZSwgY29udHJvbGxlcikge1xuICAgIGlmIChpc1VuZGVmaW5lZChzdGF0ZSkpIHtcbiAgICAgIGNyZWF0ZUFuZFNldCh0aGlzLCAnJHBlbmRpbmcnLCB2YWxpZGF0aW9uRXJyb3JLZXksIGNvbnRyb2xsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnNldEFuZENsZWFudXAodGhpcywgJyRwZW5kaW5nJywgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oc3RhdGUpKSB7XG4gICAgICB1bnNldCh0aGlzLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICAgIHVuc2V0KHRoaXMuJCRzdWNjZXNzLCB2YWxpZGF0aW9uRXJyb3JLZXksIGNvbnRyb2xsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgdW5zZXQodGhpcy4kZXJyb3IsIHZhbGlkYXRpb25FcnJvcktleSwgY29udHJvbGxlcik7XG4gICAgICAgIHNldCh0aGlzLiQkc3VjY2VzcywgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldCh0aGlzLiRlcnJvciwgdmFsaWRhdGlvbkVycm9yS2V5LCBjb250cm9sbGVyKTtcbiAgICAgICAgdW5zZXQodGhpcy4kJHN1Y2Nlc3MsIHZhbGlkYXRpb25FcnJvcktleSwgY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLiRwZW5kaW5nKSB7XG4gICAgICBjYWNoZWRUb2dnbGVDbGFzcyh0aGlzLCBQRU5ESU5HX0NMQVNTLCB0cnVlKTtcbiAgICAgIHRoaXMuJHZhbGlkID0gdGhpcy4kaW52YWxpZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModGhpcywgJycsIG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZWRUb2dnbGVDbGFzcyh0aGlzLCBQRU5ESU5HX0NMQVNTLCBmYWxzZSk7XG4gICAgICB0aGlzLiR2YWxpZCA9IGlzT2JqZWN0RW1wdHkodGhpcy4kZXJyb3IpO1xuICAgICAgdGhpcy4kaW52YWxpZCA9ICF0aGlzLiR2YWxpZDtcbiAgICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModGhpcywgJycsIHRoaXMuJHZhbGlkKTtcbiAgICB9XG5cbiAgICAvLyByZS1yZWFkIHRoZSBzdGF0ZSBhcyB0aGUgc2V0L3Vuc2V0IG1ldGhvZHMgY291bGQgaGF2ZVxuICAgIC8vIGNvbWJpbmVkIHN0YXRlIGluIHRoaXMuJGVycm9yW3ZhbGlkYXRpb25FcnJvcl0gKHVzZWQgZm9yIGZvcm1zKSxcbiAgICAvLyB3aGVyZSBzZXR0aW5nL3Vuc2V0dGluZyBvbmx5IGluY3JlbWVudHMvZGVjcmVtZW50cyB0aGUgdmFsdWUsXG4gICAgLy8gYW5kIGRvZXMgbm90IHJlcGxhY2UgaXQuXG4gICAgdmFyIGNvbWJpbmVkU3RhdGU7XG4gICAgaWYgKHRoaXMuJHBlbmRpbmcgJiYgdGhpcy4kcGVuZGluZ1t2YWxpZGF0aW9uRXJyb3JLZXldKSB7XG4gICAgICBjb21iaW5lZFN0YXRlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy4kZXJyb3JbdmFsaWRhdGlvbkVycm9yS2V5XSkge1xuICAgICAgY29tYmluZWRTdGF0ZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy4kJHN1Y2Nlc3NbdmFsaWRhdGlvbkVycm9yS2V5XSkge1xuICAgICAgY29tYmluZWRTdGF0ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJpbmVkU3RhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIHRvZ2dsZVZhbGlkYXRpb25Dc3ModGhpcywgdmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlKTtcbiAgICB0aGlzLiQkcGFyZW50Rm9ybS4kc2V0VmFsaWRpdHkodmFsaWRhdGlvbkVycm9yS2V5LCBjb21iaW5lZFN0YXRlLCB0aGlzKTtcbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVBbmRTZXQoY3RybCwgbmFtZSwgdmFsdWUsIGNvbnRyb2xsZXIpIHtcbiAgICBpZiAoIWN0cmxbbmFtZV0pIHtcbiAgICAgIGN0cmxbbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgc2V0KGN0cmxbbmFtZV0sIHZhbHVlLCBjb250cm9sbGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuc2V0QW5kQ2xlYW51cChjdHJsLCBuYW1lLCB2YWx1ZSwgY29udHJvbGxlcikge1xuICAgIGlmIChjdHJsW25hbWVdKSB7XG4gICAgICB1bnNldChjdHJsW25hbWVdLCB2YWx1ZSwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIGlmIChpc09iamVjdEVtcHR5KGN0cmxbbmFtZV0pKSB7XG4gICAgICBjdHJsW25hbWVdID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhY2hlZFRvZ2dsZUNsYXNzKGN0cmwsIGNsYXNzTmFtZSwgc3dpdGNoVmFsdWUpIHtcbiAgICBpZiAoc3dpdGNoVmFsdWUgJiYgIWN0cmwuJCRjbGFzc0NhY2hlW2NsYXNzTmFtZV0pIHtcbiAgICAgIGN0cmwuJCRhbmltYXRlLmFkZENsYXNzKGN0cmwuJCRlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgICAgY3RybC4kJGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghc3dpdGNoVmFsdWUgJiYgY3RybC4kJGNsYXNzQ2FjaGVbY2xhc3NOYW1lXSkge1xuICAgICAgY3RybC4kJGFuaW1hdGUucmVtb3ZlQ2xhc3MoY3RybC4kJGVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICBjdHJsLiQkY2xhc3NDYWNoZVtjbGFzc05hbWVdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlVmFsaWRhdGlvbkNzcyhjdHJsLCB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQpIHtcbiAgICB2YWxpZGF0aW9uRXJyb3JLZXkgPSB2YWxpZGF0aW9uRXJyb3JLZXkgPyAnLScgKyBzbmFrZV9jYXNlKHZhbGlkYXRpb25FcnJvcktleSwgJy0nKSA6ICcnO1xuXG4gICAgY2FjaGVkVG9nZ2xlQ2xhc3MoY3RybCwgVkFMSURfQ0xBU1MgKyB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQgPT09IHRydWUpO1xuICAgIGNhY2hlZFRvZ2dsZUNsYXNzKGN0cmwsIElOVkFMSURfQ0xBU1MgKyB2YWxpZGF0aW9uRXJyb3JLZXksIGlzVmFsaWQgPT09IGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICBpZiAob2JqKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyogZ2xvYmFsXG4gIFZBTElEX0NMQVNTOiBmYWxzZSxcbiAgSU5WQUxJRF9DTEFTUzogZmFsc2UsXG4gIFBSSVNUSU5FX0NMQVNTOiBmYWxzZSxcbiAgRElSVFlfQ0xBU1M6IGZhbHNlLFxuICBuZ01vZGVsTWluRXJyOiBmYWxzZVxuKi9cblxuLy8gUmVnZXggY29kZSB3YXMgaW5pdGlhbGx5IG9idGFpbmVkIGZyb20gU08gcHJpb3IgdG8gbW9kaWZpY2F0aW9uOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTQzMDcwL2phdmFzY3JpcHQtcmVnZXgtaXNvLWRhdGV0aW1lI2Fuc3dlci0zMTQzMjMxXG52YXIgSVNPX0RBVEVfUkVHRVhQID0gL15cXGR7NCx9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGRcXC5cXGQrKD86WystXVswLTJdXFxkOlswLTVdXFxkfFopJC87XG4vLyBTZWUgdmFsaWQgVVJMcyBpbiBSRkMzOTg3IChodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg3KVxuLy8gTm90ZTogV2UgYXJlIGJlaW5nIG1vcmUgbGVuaWVudCwgYmVjYXVzZSBicm93c2VycyBhcmUgdG9vLlxuLy8gICAxLiBTY2hlbWVcbi8vICAgMi4gU2xhc2hlc1xuLy8gICAzLiBVc2VybmFtZVxuLy8gICA0LiBQYXNzd29yZFxuLy8gICA1LiBIb3N0bmFtZVxuLy8gICA2LiBQb3J0XG4vLyAgIDcuIFBhdGhcbi8vICAgOC4gUXVlcnlcbi8vICAgOS4gRnJhZ21lbnRcbi8vICAgICAgICAgICAgICAgICAxMTExMTExMTExMTExMTExIDIyMiAgIDMzMzMzMyAgICA0NDQ0NCAgICAgICAgNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUgICAgIDY2NiAgICAgNzc3Nzc3NzcgICAgIDg4ODg4ODggICAgIDk5OVxudmFyIFVSTF9SRUdFWFAgPSAvXlthLXpdW2EtelxcZC4rLV0qOlxcLyooPzpbXjpAXSsoPzo6W15AXSspP0ApPyg/OlteXFxzOi8/I10rfFxcW1thLWZcXGQ6XStdKSg/OjpcXGQrKT8oPzpcXC9bXj8jXSopPyg/OlxcP1teI10qKT8oPzojLiopPyQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG52YXIgRU1BSUxfUkVHRVhQID0gL14oPz0uezEsMjU0fSQpKD89LnsxLDY0fUApWy0hIyQlJicqKy8wLTk9P0EtWl5fYGEtent8fX5dKyhcXC5bLSEjJCUmJyorLzAtOT0/QS1aXl9gYS16e3x9fl0rKSpAW0EtWmEtejAtOV0oW0EtWmEtejAtOS1dezAsNjF9W0EtWmEtejAtOV0pPyhcXC5bQS1aYS16MC05XShbQS1aYS16MC05LV17MCw2MX1bQS1aYS16MC05XSk/KSokLztcbnZhciBOVU1CRVJfUkVHRVhQID0gL15cXHMqKC18XFwrKT8oXFxkK3woXFxkKihcXC5cXGQqKSkpKFtlRV1bKy1dP1xcZCspP1xccyokLztcbnZhciBEQVRFX1JFR0VYUCA9IC9eKFxcZHs0LH0pLShcXGR7Mn0pLShcXGR7Mn0pJC87XG52YXIgREFURVRJTUVMT0NBTF9SRUdFWFAgPSAvXihcXGR7NCx9KS0oXFxkXFxkKS0oXFxkXFxkKVQoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKShcXC5cXGR7MSwzfSk/KT8kLztcbnZhciBXRUVLX1JFR0VYUCA9IC9eKFxcZHs0LH0pLVcoXFxkXFxkKSQvO1xudmFyIE1PTlRIX1JFR0VYUCA9IC9eKFxcZHs0LH0pLShcXGRcXGQpJC87XG52YXIgVElNRV9SRUdFWFAgPSAvXihcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKFxcLlxcZHsxLDN9KT8pPyQvO1xuXG52YXIgUEFSVElBTF9WQUxJREFUSU9OX0VWRU5UUyA9ICdrZXlkb3duIHdoZWVsIG1vdXNlZG93bic7XG52YXIgUEFSVElBTF9WQUxJREFUSU9OX1RZUEVTID0gY3JlYXRlTWFwKCk7XG5mb3JFYWNoKCdkYXRlLGRhdGV0aW1lLWxvY2FsLG1vbnRoLHRpbWUsd2Vlaycuc3BsaXQoJywnKSwgZnVuY3Rpb24odHlwZSkge1xuICBQQVJUSUFMX1ZBTElEQVRJT05fVFlQRVNbdHlwZV0gPSB0cnVlO1xufSk7XG5cbnZhciBpbnB1dFR5cGUgPSB7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFt0ZXh0XVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhbmRhcmQgSFRNTCB0ZXh0IGlucHV0IHdpdGggYW5ndWxhciBkYXRhIGJpbmRpbmcsIGluaGVyaXRlZCBieSBtb3N0IG9mIHRoZSBgaW5wdXRgIGVsZW1lbnRzLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2ZcbiAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuXG4gICAqICAgIG1pbmxlbmd0aC5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01heGxlbmd0aCBTZXRzIGBtYXhsZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBsb25nZXIgdGhhblxuICAgKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2ZcbiAgICogICAgYW55IGxlbmd0aC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBwYXR0ZXJuIFNpbWlsYXIgdG8gYG5nUGF0dGVybmAgZXhjZXB0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZ1xuICAgKiAgICB0aGF0IGNvbnRhaW5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYm9keSB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgcmVndWxhciBleHByZXNzaW9uXG4gICAqICAgIGFzIGluIHRoZSBuZ1BhdHRlcm4gZGlyZWN0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgbmdNb2RlbCB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlICR2aWV3VmFsdWV9XG4gICAqICAgIGRvZXMgbm90IG1hdGNoIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLlxuICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBSZWdFeHAgb2JqZWN0LCB0aGVuIHRoaXMgaXMgdXNlZCBkaXJlY3RseS5cbiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgc3RyaW5nLCB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwXG4gICAqICAgIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYFwiYWJjXCJgIHdpbGwgYmUgY29udmVydGVkIHRvXG4gICAqICAgIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC48YnIgLz5cbiAgICogICAgKipOb3RlOioqIEF2b2lkIHVzaW5nIHRoZSBgZ2AgZmxhZyBvbiB0aGUgUmVnRXhwLCBhcyBpdCB3aWxsIGNhdXNlIGVhY2ggc3VjY2Vzc2l2ZSBzZWFyY2ggdG9cbiAgICogICAgc3RhcnQgYXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNlYXJjaCdzIG1hdGNoLCB0aHVzIG5vdCB0YWtpbmcgdGhlIHdob2xlIGlucHV0IHZhbHVlIGludG9cbiAgICogICAgYWNjb3VudC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IFtuZ1RyaW09dHJ1ZV0gSWYgc2V0IHRvIGZhbHNlIEFuZ3VsYXIgd2lsbCBub3QgYXV0b21hdGljYWxseSB0cmltIHRoZSBpbnB1dC5cbiAgICogICAgVGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZCBmb3IgaW5wdXRbdHlwZT1wYXNzd29yZF0gY29udHJvbHMsIHdoaWNoIHdpbGwgbmV2ZXIgdHJpbSB0aGVcbiAgICogICAgaW5wdXQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgICA8ZXhhbXBsZSBuYW1lPVwidGV4dC1pbnB1dC1kaXJlY3RpdmVcIiBtb2R1bGU9XCJ0ZXh0SW5wdXRFeGFtcGxlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgndGV4dElucHV0RXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAgICAkc2NvcGUuZXhhbXBsZSA9IHtcbiAgICAgICAgICAgICAgICAgdGV4dDogJ2d1ZXN0JyxcbiAgICAgICAgICAgICAgICAgd29yZDogL15cXHMqXFx3KlxccyokL1xuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPlNpbmdsZSB3b3JkOlxuICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS50ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgbmctcGF0dGVybj1cImV4YW1wbGUud29yZFwiIHJlcXVpcmVkIG5nLXRyaW09XCJmYWxzZVwiPlxuICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5wYXR0ZXJuXCI+XG4gICAgICAgICAgICAgICBTaW5nbGUgd29yZCBvbmx5ITwvc3Bhbj5cbiAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgIDxjb2RlPnRleHQgPSB7e2V4YW1wbGUudGV4dH19PC9jb2RlPjxici8+XG4gICAgICAgICAgIDxjb2RlPm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvY29kZT48YnIvPlxuICAgICAgICAgICA8Y29kZT5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L2NvZGU+PGJyLz5cbiAgICAgICAgICAgPGNvZGU+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC9jb2RlPjxici8+XG4gICAgICAgICAgIDxjb2RlPm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC9jb2RlPjxici8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2ZpbGU+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgICB2YXIgdGV4dCA9IGVsZW1lbnQoYnkuYmluZGluZygnZXhhbXBsZS50ZXh0JykpO1xuICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcbiAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdleGFtcGxlLnRleHQnKSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdndWVzdCcpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7XG4gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7XG5cbiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9FcXVhbCgndGV4dCA9Jyk7XG4gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgbXVsdGkgd29yZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdoZWxsbyB3b3JsZCcpO1xuXG4gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIDwvZmlsZT5cbiAgICAgIDwvZXhhbXBsZT5cbiAgICovXG4gICd0ZXh0JzogdGV4dElucHV0VHlwZSxcblxuICAgIC8qKlxuICAgICAqIEBuZ2RvYyBpbnB1dFxuICAgICAqIEBuYW1lIGlucHV0W2RhdGVdXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBJbnB1dCB3aXRoIGRhdGUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0XG4gICAgICogdGhlIEhUTUw1IGRhdGUgaW5wdXQsIGEgdGV4dCBlbGVtZW50IHdpbGwgYmUgdXNlZC4gSW4gdGhhdCBjYXNlLCB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAgICogZGF0ZSBmb3JtYXQgKHl5eXktTU0tZGQpLCBmb3IgZXhhbXBsZTogYDIwMDktMDEtMDZgLiBTaW5jZSBtYW55XG4gICAgICogbW9kZXJuIGJyb3dzZXJzIGRvIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGlucHV0IHR5cGUsIGl0IGlzIGltcG9ydGFudCB0byBwcm92aWRlIGN1ZXMgdG8gdXNlcnMgb24gdGhlXG4gICAgICogZXhwZWN0ZWQgaW5wdXQgZm9ybWF0IHZpYSBhIHBsYWNlaG9sZGVyIG9yIGxhYmVsLlxuICAgICAqXG4gICAgICogVGhlIG1vZGVsIG11c3QgYWx3YXlzIGJlIGEgRGF0ZSBvYmplY3QsIG90aGVyd2lzZSBBbmd1bGFyIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhlIHRpbWV6b25lIHRvIGJlIHVzZWQgdG8gcmVhZC93cml0ZSB0aGUgYERhdGVgIGluc3RhbmNlIGluIHRoZSBtb2RlbCBjYW4gYmUgZGVmaW5lZCB1c2luZ1xuICAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLiBUaGlzIG11c3QgYmUgYVxuICAgICAqICAgdmFsaWQgSVNPIGRhdGUgc3RyaW5nICh5eXl5LU1NLWRkKS4gWW91IGNhbiBhbHNvIHVzZSBpbnRlcnBvbGF0aW9uIGluc2lkZSB0aGlzIGF0dHJpYnV0ZVxuICAgICAqICAgKGUuZy4gYG1pbj1cInt7bWluRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQnfX1cImApLiBOb3RlIHRoYXQgYG1pbmAgd2lsbCBhbHNvIGFkZCBuYXRpdmUgSFRNTDVcbiAgICAgKiAgIGNvbnN0cmFpbnQgdmFsaWRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuIFRoaXMgbXVzdCBiZVxuICAgICAqICAgYSB2YWxpZCBJU08gZGF0ZSBzdHJpbmcgKHl5eXktTU0tZGQpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXMgYXR0cmlidXRlXG4gICAgICogICAoZS5nLiBgbWF4PVwie3ttYXhEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiYCkuIE5vdGUgdGhhdCBgbWF4YCB3aWxsIGFsc28gYWRkIG5hdGl2ZSBIVE1MNVxuICAgICAqICAgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyBkYXRlIHN0cmluZ1xuICAgICAqICAgdGhlIGBuZ01pbmAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBzZXQgdGhlIGBtaW5gIGF0dHJpYnV0ZS5cbiAgICAgKiBAcGFyYW0geyhkYXRlfHN0cmluZyk9fSBuZ01heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8gdGhlIERhdGUgLyBJU08gZGF0ZSBzdHJpbmdcbiAgICAgKiAgIHRoZSBgbmdNYXhgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWF4YCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgIDxleGFtcGxlIG5hbWU9XCJkYXRlLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cImRhdGVJbnB1dEV4YW1wbGVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8c2NyaXB0PlxuICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdkYXRlSW5wdXRFeGFtcGxlJywgW10pXG4gICAgICAgICAgICAuY29udHJvbGxlcignRGF0ZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAkc2NvcGUuZXhhbXBsZSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAxMywgOSwgMjIpXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGFtcGxlSW5wdXRcIj5QaWNrIGEgZGF0ZSBpbiAyMDEzOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgaWQ9XCJleGFtcGxlSW5wdXRcIiBuYW1lPVwiaW5wdXRcIiBuZy1tb2RlbD1cImV4YW1wbGUudmFsdWVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInl5eXktTU0tZGRcIiBtaW49XCIyMDEzLTAxLTAxXCIgbWF4PVwiMjAxMy0xMi0zMVwiIHJlcXVpcmVkIC8+XG4gICAgICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5kYXRlXCI+XG4gICAgICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcInl5eXktTU0tZGRcIn19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiR2YWxpZCA9IHt7bXlGb3JtLmlucHV0LiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5yZXF1aXJlZCA9IHt7ISFteUZvcm0uJGVycm9yLnJlcXVpcmVkfX08L3R0Pjxici8+XG4gICAgICAgPC9mb3JtPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LU1NLWRkXCInKSk7XG4gICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcblxuICAgICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydFxuICAgICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAgIC8vIGZvciB2YXJpb3VzIGJyb3dzZXJzIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgICAgZnVuY3Rpb24gc2V0SW5wdXQodmFsKSB7XG4gICAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi5cbiAgICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgICAgXCJpcHQudmFsdWUgPSAnXCIgKyB2YWwgKyBcIic7XCIgK1xuICAgICAgICAgIFwiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnXCIgKyB2YWwgKyBcIicpOyB9KTtcIjtcbiAgICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMC0yMicpO1xuICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2V0SW5wdXQoJycpO1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMScpO1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7XG4gICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTtcbiAgICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgICAgPC9leGFtcGxlPlxuICAgICAqL1xuICAnZGF0ZSc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ2RhdGUnLCBEQVRFX1JFR0VYUCxcbiAgICAgICAgIGNyZWF0ZURhdGVQYXJzZXIoREFURV9SRUdFWFAsIFsneXl5eScsICdNTScsICdkZCddKSxcbiAgICAgICAgICd5eXl5LU1NLWRkJyksXG5cbiAgIC8qKlxuICAgICogQG5nZG9jIGlucHV0XG4gICAgKiBAbmFtZSBpbnB1dFtkYXRldGltZS1sb2NhbF1cbiAgICAqXG4gICAgKiBAZGVzY3JpcHRpb25cbiAgICAqIElucHV0IHdpdGggZGF0ZXRpbWUgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0XG4gICAgKiB0aGUgSFRNTDUgZGF0ZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAgKiBsb2NhbCBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLCBmb3IgZXhhbXBsZTogYDIwMTAtMTItMjhUMTQ6NTc6MDBgLlxuICAgICpcbiAgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICpcbiAgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuXG4gICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyBkYXRldGltZSBmb3JtYXQgKHl5eXktTU0tZGRUSEg6bW06c3MpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb25cbiAgICAqICAgaW5zaWRlIHRoaXMgYXR0cmlidXRlIChlLmcuIGBtaW49XCJ7e21pbkRhdGV0aW1lTG9jYWwgfCBkYXRlOid5eXl5LU1NLWRkVEhIOm1tOnNzJ319XCJgKS5cbiAgICAqICAgTm90ZSB0aGF0IGBtaW5gIHdpbGwgYWxzbyBhZGQgbmF0aXZlIEhUTUw1IGNvbnN0cmFpbnQgdmFsaWRhdGlvbi5cbiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YC5cbiAgICAqICAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgSVNPIGRhdGV0aW1lIGZvcm1hdCAoeXl5eS1NTS1kZFRISDptbTpzcykuIFlvdSBjYW4gYWxzbyB1c2UgaW50ZXJwb2xhdGlvblxuICAgICogICBpbnNpZGUgdGhpcyBhdHRyaWJ1dGUgKGUuZy4gYG1heD1cInt7bWF4RGF0ZXRpbWVMb2NhbCB8IGRhdGU6J3l5eXktTU0tZGRUSEg6bW06c3MnfX1cImApLlxuICAgICogICBOb3RlIHRoYXQgYG1heGAgd2lsbCBhbHNvIGFkZCBuYXRpdmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgICogQHBhcmFtIHsoZGF0ZXxzdHJpbmcpPX0gbmdNaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgdG8gdGhlIERhdGUgLyBJU08gZGF0ZXRpbWUgc3RyaW5nXG4gICAgKiAgIHRoZSBgbmdNaW5gIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWluYCBhdHRyaWJ1dGUuXG4gICAgKiBAcGFyYW0geyhkYXRlfHN0cmluZyk9fSBuZ01heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSB0byB0aGUgRGF0ZSAvIElTTyBkYXRldGltZSBzdHJpbmdcbiAgICAqICAgdGhlIGBuZ01heGAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBzZXQgdGhlIGBtYXhgIGF0dHJpYnV0ZS5cbiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2ZcbiAgICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLlxuICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICpcbiAgICAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbmFtZT1cImRhdGV0aW1lbG9jYWwtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwiZGF0ZUV4YW1wbGVcIj5cbiAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPHNjcmlwdD5cbiAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2RhdGVFeGFtcGxlJywgW10pXG4gICAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICRzY29wZS5leGFtcGxlID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAxMCwgMTEsIDI4LCAxNCwgNTcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1dKTtcbiAgICAgIDwvc2NyaXB0PlxuICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJEYXRlQ29udHJvbGxlciBhcyBkYXRlQ3RybFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0XCI+UGljayBhIGRhdGUgYmV0d2VlbiBpbiAyMDEzOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBpZD1cImV4YW1wbGVJbnB1dFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS52YWx1ZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInl5eXktTU0tZGRUSEg6bW06c3NcIiBtaW49XCIyMDAxLTAxLTAxVDAwOjAwOjAwXCIgbWF4PVwiMjAxMy0xMi0zMVQwMDowMDowMFwiIHJlcXVpcmVkIC8+XG4gICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5pbnB1dC4kZXJyb3IuZGF0ZXRpbWVsb2NhbFwiPlxuICAgICAgICAgICAgICBOb3QgYSB2YWxpZCBkYXRlITwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0dD52YWx1ZSA9IHt7ZXhhbXBsZS52YWx1ZSB8IGRhdGU6IFwieXl5eS1NTS1kZFRISDptbTpzc1wifX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LU1NLWRkVEhIOm1tOnNzXCInKSk7XG4gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG5cbiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkge1xuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLlxuICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgIFwiaXB0LnZhbHVlID0gJ1wiICsgdmFsICsgXCInO1wiICtcbiAgICAgICAgXCJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCdcIiArIHZhbCArIFwiJyk7IH0pO1wiO1xuICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgIH1cblxuICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMC0xMi0yOFQxNDo1NzowMCcpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldElucHV0KCcnKTtcbiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMS0wMVQyMzo1OTowMCcpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAgICAqL1xuICAnZGF0ZXRpbWUtbG9jYWwnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdkYXRldGltZWxvY2FsJywgREFURVRJTUVMT0NBTF9SRUdFWFAsXG4gICAgICBjcmVhdGVEYXRlUGFyc2VyKERBVEVUSU1FTE9DQUxfUkVHRVhQLCBbJ3l5eXknLCAnTU0nLCAnZGQnLCAnSEgnLCAnbW0nLCAnc3MnLCAnc3NzJ10pLFxuICAgICAgJ3l5eXktTU0tZGRUSEg6bW06c3Muc3NzJyksXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFt0aW1lXVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5wdXQgd2l0aCB0aW1lIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLiBJbiBicm93c2VycyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydFxuICAgKiB0aGUgSFRNTDUgdGltZSBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAqIGxvY2FsIHRpbWUgZm9ybWF0IChISDptbTpzcyksIGZvciBleGFtcGxlOiBgMTQ6NTc6MDBgLiBNb2RlbCBtdXN0IGJlIGEgRGF0ZSBvYmplY3QuIFRoaXMgYmluZGluZyB3aWxsIGFsd2F5cyBvdXRwdXQgYVxuICAgKiBEYXRlIG9iamVjdCB0byB0aGUgbW9kZWwgb2YgSmFudWFyeSAxLCAxOTcwLCBvciBsb2NhbCBkYXRlIGBuZXcgRGF0ZSgxOTcwLCAwLCAxLCBISCwgbW0sIHNzKWAuXG4gICAqXG4gICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLlxuICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyB0aW1lIGZvcm1hdCAoSEg6bW06c3MpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICogICBhdHRyaWJ1dGUgKGUuZy4gYG1pbj1cInt7bWluVGltZSB8IGRhdGU6J0hIOm1tOnNzJ319XCJgKS4gTm90ZSB0aGF0IGBtaW5gIHdpbGwgYWxzbyBhZGRcbiAgICogICBuYXRpdmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gICAqICAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgSVNPIHRpbWUgZm9ybWF0IChISDptbTpzcykuIFlvdSBjYW4gYWxzbyB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhpc1xuICAgKiAgIGF0dHJpYnV0ZSAoZS5nLiBgbWF4PVwie3ttYXhUaW1lIHwgZGF0ZTonSEg6bW06c3MnfX1cImApLiBOb3RlIHRoYXQgYG1heGAgd2lsbCBhbHNvIGFkZFxuICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB0aW1lIHN0cmluZyB0aGVcbiAgICogICBgbmdNaW5gIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWluYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB0aW1lIHN0cmluZyB0aGVcbiAgICogICBgbmdNYXhgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWF4YCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJ0aW1lLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cInRpbWVFeGFtcGxlXCI+XG4gICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICA8c2NyaXB0PlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ3RpbWVFeGFtcGxlJywgW10pXG4gICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLmV4YW1wbGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMTk3MCwgMCwgMSwgMTQsIDU3LCAwKVxuICAgICAgICAgIH07XG4gICAgICAgIH1dKTtcbiAgICAgPC9zY3JpcHQ+XG4gICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmxcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dFwiPlBpY2sgYSB0aW1lIGJldHdlZW4gOGFtIGFuZCA1cG06PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgaWQ9XCJleGFtcGxlSW5wdXRcIiBuYW1lPVwiaW5wdXRcIiBuZy1tb2RlbD1cImV4YW1wbGUudmFsdWVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJISDptbTpzc1wiIG1pbj1cIjA4OjAwOjAwXCIgbWF4PVwiMTc6MDA6MDBcIiByZXF1aXJlZCAvPlxuICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnRpbWVcIj5cbiAgICAgICAgICAgICAgTm90IGEgdmFsaWQgZGF0ZSE8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcIkhIOm1tOnNzXCJ9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICA8L2Zvcm0+XG4gICA8L2ZpbGU+XG4gICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICB2YXIgdmFsdWUgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcIkhIOm1tOnNzXCInKSk7XG4gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG5cbiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkge1xuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLlxuICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgIFwiaXB0LnZhbHVlID0gJ1wiICsgdmFsICsgXCInO1wiICtcbiAgICAgICAgXCJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCdcIiArIHZhbCArIFwiJyk7IH0pO1wiO1xuICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgIH1cblxuICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMTQ6NTc6MDAnKTtcbiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gdHJ1ZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRJbnB1dCgnJyk7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdteUZvcm0uaW5wdXQuJHZhbGlkID0gZmFsc2UnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgb3ZlciBtYXgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0SW5wdXQoJzIzOjU5OjAwJyk7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7XG4gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7XG4gICAgICB9KTtcbiAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAgICovXG4gICd0aW1lJzogY3JlYXRlRGF0ZUlucHV0VHlwZSgndGltZScsIFRJTUVfUkVHRVhQLFxuICAgICAgY3JlYXRlRGF0ZVBhcnNlcihUSU1FX1JFR0VYUCwgWydISCcsICdtbScsICdzcycsICdzc3MnXSksXG4gICAgICdISDptbTpzcy5zc3MnKSxcblxuICAgLyoqXG4gICAgKiBAbmdkb2MgaW5wdXRcbiAgICAqIEBuYW1lIGlucHV0W3dlZWtdXG4gICAgKlxuICAgICogQGRlc2NyaXB0aW9uXG4gICAgKiBJbnB1dCB3aXRoIHdlZWstb2YtdGhlLXllYXIgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gdG8gRGF0ZS4gSW4gYnJvd3NlcnMgdGhhdCBkbyBub3QgeWV0IHN1cHBvcnRcbiAgICAqIHRoZSBIVE1MNSB3ZWVrIGlucHV0LCBhIHRleHQgZWxlbWVudCB3aWxsIGJlIHVzZWQuIEluIHRoYXQgY2FzZSwgdGhlIHRleHQgbXVzdCBiZSBlbnRlcmVkIGluIGEgdmFsaWQgSVNPLTg2MDFcbiAgICAqIHdlZWsgZm9ybWF0ICh5eXl5LVcjIyksIGZvciBleGFtcGxlOiBgMjAxMy1XMDJgLlxuICAgICpcbiAgICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICogSW52YWxpZCBgRGF0ZWAgb2JqZWN0cyAoZGF0ZXMgd2hvc2UgYGdldFRpbWUoKWAgaXMgYE5hTmApIHdpbGwgYmUgcmVuZGVyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICpcbiAgICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdNb2RlbE9wdGlvbnMgbmdNb2RlbE9wdGlvbnN9LiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICAqXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBsZXNzIHRoYW4gYG1pbmAuXG4gICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyB3ZWVrIGZvcm1hdCAoeXl5eS1XIyMpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICAqICAgYXR0cmlidXRlIChlLmcuIGBtaW49XCJ7e21pbldlZWsgfCBkYXRlOid5eXl5LVd3dyd9fVwiYCkuIE5vdGUgdGhhdCBgbWluYCB3aWxsIGFsc28gYWRkXG4gICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyB3ZWVrIGZvcm1hdCAoeXl5eS1XIyMpLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICAqICAgYXR0cmlidXRlIChlLmcuIGBtYXg9XCJ7e21heFdlZWsgfCBkYXRlOid5eXl5LVd3dyd9fVwiYCkuIE5vdGUgdGhhdCBgbWF4YCB3aWxsIGFsc28gYWRkXG4gICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAgKiBAcGFyYW0geyhkYXRlfHN0cmluZyk9fSBuZ01pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG8gdGhlIERhdGUgLyBJU08gd2VlayBzdHJpbmdcbiAgICAqICAgdGhlIGBuZ01pbmAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8uIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBzZXQgdGhlIGBtaW5gIGF0dHJpYnV0ZS5cbiAgICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB3ZWVrIHN0cmluZ1xuICAgICogICB0aGUgYG5nTWF4YCBleHByZXNzaW9uIGV2YWx1YXRlcyB0by4gTm90ZSB0aGF0IGl0IGRvZXMgbm90IHNldCB0aGUgYG1heGAgYXR0cmlidXRlLlxuICAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwid2Vlay1pbnB1dC1kaXJlY3RpdmVcIiBtb2R1bGU9XCJ3ZWVrRXhhbXBsZVwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8c2NyaXB0PlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ3dlZWtFeGFtcGxlJywgW10pXG4gICAgICAgIC5jb250cm9sbGVyKCdEYXRlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLmV4YW1wbGUgPSB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IERhdGUoMjAxMywgMCwgMylcbiAgICAgICAgICB9O1xuICAgICAgICB9XSk7XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmxcIj5cbiAgICAgICAgPGxhYmVsPlBpY2sgYSBkYXRlIGJldHdlZW4gaW4gMjAxMzpcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJleGFtcGxlSW5wdXRcIiB0eXBlPVwid2Vla1wiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiWVlZWS1XIyNcIiBtaW49XCIyMDEyLVczMlwiXG4gICAgICAgICAgICAgICAgIG1heD1cIjIwMTMtVzUyXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci53ZWVrXCI+XG4gICAgICAgICAgICAgIE5vdCBhIHZhbGlkIGRhdGUhPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHR0PnZhbHVlID0ge3tleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LVd3d1wifX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LVd3d1wiJykpO1xuICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpO1xuXG4gICAgICAvLyBjdXJyZW50bHkgcHJvdHJhY3Rvci93ZWJkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydFxuICAgICAgLy8gc2VuZGluZyBrZXlzIHRvIGFsbCBrbm93biBIVE1MNSBpbnB1dCBjb250cm9sc1xuICAgICAgLy8gZm9yIHZhcmlvdXMgYnJvd3NlcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3Byb3RyYWN0b3IvaXNzdWVzLzU2MikuXG4gICAgICBmdW5jdGlvbiBzZXRJbnB1dCh2YWwpIHtcbiAgICAgICAgLy8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhbmQgZm9yY2UgdmFsaWRhdGlvbi5cbiAgICAgICAgdmFyIHNjciA9IFwidmFyIGlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlSW5wdXQnKTsgXCIgK1xuICAgICAgICBcImlwdC52YWx1ZSA9ICdcIiArIHZhbCArIFwiJztcIiArXG4gICAgICAgIFwiYW5ndWxhci5lbGVtZW50KGlwdCkuc2NvcGUoKS4kYXBwbHkoZnVuY3Rpb24ocykgeyBzLm15Rm9ybVtpcHQubmFtZV0uJHNldFZpZXdWYWx1ZSgnXCIgKyB2YWwgKyBcIicpOyB9KTtcIjtcbiAgICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcik7XG4gICAgICB9XG5cbiAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzIwMTMtVzAxJyk7XG4gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IHRydWUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0SW5wdXQoJycpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0VxdWFsKCd2YWx1ZSA9Jyk7XG4gICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignbXlGb3JtLmlucHV0LiR2YWxpZCA9IGZhbHNlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG92ZXIgbWF4JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldElucHV0KCcyMDE1LVcwMScpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAgICAqL1xuICAnd2Vlayc6IGNyZWF0ZURhdGVJbnB1dFR5cGUoJ3dlZWsnLCBXRUVLX1JFR0VYUCwgd2Vla1BhcnNlciwgJ3l5eXktV3d3JyksXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFttb250aF1cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIElucHV0IHdpdGggbW9udGggdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIEluIGJyb3dzZXJzIHRoYXQgZG8gbm90IHlldCBzdXBwb3J0XG4gICAqIHRoZSBIVE1MNSBtb250aCBpbnB1dCwgYSB0ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLiBJbiB0aGF0IGNhc2UsIHRoZSB0ZXh0IG11c3QgYmUgZW50ZXJlZCBpbiBhIHZhbGlkIElTTy04NjAxXG4gICAqIG1vbnRoIGZvcm1hdCAoeXl5eS1NTSksIGZvciBleGFtcGxlOiBgMjAwOS0wMWAuXG4gICAqXG4gICAqIFRoZSBtb2RlbCBtdXN0IGFsd2F5cyBiZSBhIERhdGUgb2JqZWN0LCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiBJbnZhbGlkIGBEYXRlYCBvYmplY3RzIChkYXRlcyB3aG9zZSBgZ2V0VGltZSgpYCBpcyBgTmFOYCkgd2lsbCBiZSByZW5kZXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHRoZSBtb2RlbCBpcyBub3Qgc2V0IHRvIHRoZSBmaXJzdCBvZiB0aGUgbW9udGgsIHRoZSBuZXh0IHZpZXcgdG8gbW9kZWwgdXBkYXRlIHdpbGwgc2V0IGl0XG4gICAqIHRvIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguXG4gICAqXG4gICAqIFRoZSB0aW1lem9uZSB0byBiZSB1c2VkIHRvIHJlYWQvd3JpdGUgdGhlIGBEYXRlYCBpbnN0YW5jZSBpbiB0aGUgbW9kZWwgY2FuIGJlIGRlZmluZWQgdXNpbmdcbiAgICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30uIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlIHRpbWV6b25lIG9mIHRoZSBicm93c2VyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtaW4gU2V0cyB0aGUgYG1pbmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgbGVzcyB0aGFuIGBtaW5gLlxuICAgKiAgIFRoaXMgbXVzdCBiZSBhIHZhbGlkIElTTyBtb250aCBmb3JtYXQgKHl5eXktTU0pLiBZb3UgY2FuIGFsc28gdXNlIGludGVycG9sYXRpb24gaW5zaWRlIHRoaXNcbiAgICogICBhdHRyaWJ1dGUgKGUuZy4gYG1pbj1cInt7bWluTW9udGggfCBkYXRlOid5eXl5LU1NJ319XCJgKS4gTm90ZSB0aGF0IGBtaW5gIHdpbGwgYWxzbyBhZGRcbiAgICogICBuYXRpdmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG1heGAuXG4gICAqICAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgSVNPIG1vbnRoIGZvcm1hdCAoeXl5eS1NTSkuIFlvdSBjYW4gYWxzbyB1c2UgaW50ZXJwb2xhdGlvbiBpbnNpZGUgdGhpc1xuICAgKiAgIGF0dHJpYnV0ZSAoZS5nLiBgbWF4PVwie3ttYXhNb250aCB8IGRhdGU6J3l5eXktTU0nfX1cImApLiBOb3RlIHRoYXQgYG1heGAgd2lsbCBhbHNvIGFkZFxuICAgKiAgIG5hdGl2ZSBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb24uXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB3ZWVrIHN0cmluZ1xuICAgKiAgIHRoZSBgbmdNaW5gIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWluYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7KGRhdGV8c3RyaW5nKT19IG5nTWF4IFNldHMgdGhlIGBtYXhgIHZhbGlkYXRpb24gY29uc3RyYWludCB0byB0aGUgRGF0ZSAvIElTTyB3ZWVrIHN0cmluZ1xuICAgKiAgIHRoZSBgbmdNYXhgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvLiBOb3RlIHRoYXQgaXQgZG9lcyBub3Qgc2V0IHRoZSBgbWF4YCBhdHRyaWJ1dGUuXG5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSByZXF1aXJlZCBTZXRzIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIG5vdCBlbnRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAgICogICAgdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgYG5nUmVxdWlyZWRgIGluc3RlYWQgb2ZcbiAgICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlclxuICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm1vbnRoLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cIm1vbnRoRXhhbXBsZVwiPlxuICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgPHNjcmlwdD5cbiAgICAgIGFuZ3VsYXIubW9kdWxlKCdtb250aEV4YW1wbGUnLCBbXSlcbiAgICAgICAgLmNvbnRyb2xsZXIoJ0RhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAkc2NvcGUuZXhhbXBsZSA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZSgyMDEzLCA5LCAxKVxuICAgICAgICAgIH07XG4gICAgICAgIH1dKTtcbiAgICAgPC9zY3JpcHQ+XG4gICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRGF0ZUNvbnRyb2xsZXIgYXMgZGF0ZUN0cmxcIj5cbiAgICAgICA8bGFiZWwgZm9yPVwiZXhhbXBsZUlucHV0XCI+UGljayBhIG1vbnRoIGluIDIwMTM6PC9sYWJlbD5cbiAgICAgICA8aW5wdXQgaWQ9XCJleGFtcGxlSW5wdXRcIiB0eXBlPVwibW9udGhcIiBuYW1lPVwiaW5wdXRcIiBuZy1tb2RlbD1cImV4YW1wbGUudmFsdWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwieXl5eS1NTVwiIG1pbj1cIjIwMTMtMDFcIiBtYXg9XCIyMDEzLTEyXCIgcmVxdWlyZWQgLz5cbiAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5pbnB1dC4kZXJyb3IubW9udGhcIj5cbiAgICAgICAgICAgIE5vdCBhIHZhbGlkIG1vbnRoITwvc3Bhbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWUgfCBkYXRlOiBcInl5eXktTU1cIn19PC90dD48YnIvPlxuICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgPC9mb3JtPlxuICAgPC9maWxlPlxuICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlIHwgZGF0ZTogXCJ5eXl5LU1NXCInKSk7XG4gICAgICB2YXIgdmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS5pbnB1dC4kdmFsaWQnKSk7XG5cbiAgICAgIC8vIGN1cnJlbnRseSBwcm90cmFjdG9yL3dlYmRyaXZlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgICAvLyBzZW5kaW5nIGtleXMgdG8gYWxsIGtub3duIEhUTUw1IGlucHV0IGNvbnRyb2xzXG4gICAgICAvLyBmb3IgdmFyaW91cyBicm93c2VycyAoaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNTYyKS5cbiAgICAgIGZ1bmN0aW9uIHNldElucHV0KHZhbCkge1xuICAgICAgICAvLyBzZXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGFuZCBmb3JjZSB2YWxpZGF0aW9uLlxuICAgICAgICB2YXIgc2NyID0gXCJ2YXIgaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVJbnB1dCcpOyBcIiArXG4gICAgICAgIFwiaXB0LnZhbHVlID0gJ1wiICsgdmFsICsgXCInO1wiICtcbiAgICAgICAgXCJhbmd1bGFyLmVsZW1lbnQoaXB0KS5zY29wZSgpLiRhcHBseShmdW5jdGlvbihzKSB7IHMubXlGb3JtW2lwdC5uYW1lXS4kc2V0Vmlld1ZhbHVlKCdcIiArIHZhbCArIFwiJyk7IH0pO1wiO1xuICAgICAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoc2NyKTtcbiAgICAgIH1cblxuICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvQ29udGFpbignMjAxMy0xMCcpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSB0cnVlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldElucHV0KCcnKTtcbiAgICAgICAgZXhwZWN0KHZhbHVlLmdldFRleHQoKSkudG9FcXVhbCgndmFsdWUgPScpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRJbnB1dCgnMjAxNS0wMScpO1xuICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJycpO1xuICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ215Rm9ybS5pbnB1dC4kdmFsaWQgPSBmYWxzZScpO1xuICAgICAgfSk7XG4gICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gICAqL1xuICAnbW9udGgnOiBjcmVhdGVEYXRlSW5wdXRUeXBlKCdtb250aCcsIE1PTlRIX1JFR0VYUCxcbiAgICAgY3JlYXRlRGF0ZVBhcnNlcihNT05USF9SRUdFWFAsIFsneXl5eScsICdNTSddKSxcbiAgICAgJ3l5eXktTU0nKSxcblxuICAvKipcbiAgICogQG5nZG9jIGlucHV0XG4gICAqIEBuYW1lIGlucHV0W251bWJlcl1cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRleHQgaW5wdXQgd2l0aCBudW1iZXIgdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24uIFNldHMgdGhlIGBudW1iZXJgIHZhbGlkYXRpb25cbiAgICogZXJyb3IgaWYgbm90IGEgdmFsaWQgbnVtYmVyLlxuICAgKlxuICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgKiBUaGUgbW9kZWwgbXVzdCBhbHdheXMgYmUgb2YgdHlwZSBgbnVtYmVyYCBvdGhlcndpc2UgQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgKiBCZSBhd2FyZSB0aGF0IGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBudW1iZXIgaXMgbm90IGVub3VnaC4gU2VlIHRoZSB7QGxpbmsgbmdNb2RlbDpudW1mbXR9XG4gICAqIGVycm9yIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGFuIGV4YW1wbGUgb2YgaG93IHRvIGNvbnZlcnQgeW91ciBtb2RlbCBpZiBuZWNlc3NhcnkuXG4gICAqIDwvZGl2PlxuICAgKlxuICAgKiAjIyBJc3N1ZXMgd2l0aCBIVE1MNSBjb25zdHJhaW50IHZhbGlkYXRpb25cbiAgICpcbiAgICogSW4gYnJvd3NlcnMgdGhhdCBmb2xsb3cgdGhlXG4gICAqIFtIVE1MNSBzcGVjaWZpY2F0aW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI251bWJlci1zdGF0ZS0lMjh0eXBlPW51bWJlciUyOSksXG4gICAqIGBpbnB1dFtudW1iZXJdYCBkb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkIHdpdGgge0BsaW5rIG5nTW9kZWxPcHRpb25zIGBuZ01vZGVsT3B0aW9ucy5hbGxvd0ludmFsaWRgfS5cbiAgICogSWYgYSBub24tbnVtYmVyIGlzIGVudGVyZWQgaW4gdGhlIGlucHV0LCB0aGUgYnJvd3NlciB3aWxsIHJlcG9ydCB0aGUgdmFsdWUgYXMgYW4gZW1wdHkgc3RyaW5nLFxuICAgKiB3aGljaCBtZWFucyB0aGUgdmlldyAvIG1vZGVsIHZhbHVlcyBpbiBgbmdNb2RlbGAgYW5kIHN1YnNlcXVlbnRseSB0aGUgc2NvcGUgdmFsdWVcbiAgICogd2lsbCBhbHNvIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbWluIFNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWluYC5cbiAgICogICAgQ2FuIGJlIGludGVycG9sYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBtYXggU2V0cyB0aGUgYG1heGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgaXMgZ3JlYXRlciB0aGFuIGBtYXhgLlxuICAgKiAgICBDYW4gYmUgaW50ZXJwb2xhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nTWluIExpa2UgYG1pbmAsIHNldHMgdGhlIGBtaW5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbmdNaW5gLFxuICAgKiAgICBidXQgZG9lcyBub3QgdHJpZ2dlciBIVE1MNSBuYXRpdmUgdmFsaWRhdGlvbi4gVGFrZXMgYW4gZXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ01heCBMaWtlIGBtYXhgLCBzZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBpcyBncmVhdGVyIHRoYW4gYG5nTWF4YCxcbiAgICogICAgYnV0IGRvZXMgbm90IHRyaWdnZXIgSFRNTDUgbmF0aXZlIHZhbGlkYXRpb24uIFRha2VzIGFuIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc3RlcCBTZXRzIHRoZSBgc3RlcGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGVudGVyZWQgZG9lcyBub3QgZml0IHRoZSBgc3RlcGAgY29uc3RyYWludC5cbiAgICogICAgQ2FuIGJlIGludGVycG9sYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1N0ZXAgTGlrZSBgc3RlcGAsIHNldHMgdGhlIGBzdGVwYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgZW50ZXJlZCBkb2VzIG5vdCBmaXQgdGhlIGBuZ1N0ZXBgIGNvbnN0cmFpbnQsXG4gICAqICAgIGJ1dCBkb2VzIG5vdCB0cmlnZ2VyIEhUTUw1IG5hdGl2ZSB2YWxpZGF0aW9uLiBUYWtlcyBhbiBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW5cbiAgICogICAgbWlubGVuZ3RoLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuXG4gICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZlxuICAgKiAgICBhbnkgbGVuZ3RoLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nXG4gICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgJHZpZXdWYWx1ZX1cbiAgICogICAgZG9lcyBub3QgbWF0Y2ggYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHBcbiAgICogICAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgXCJhYmNcImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG9cbiAgICogICAgYG5ldyBSZWdFeHAoJ15hYmMkJylgLjxiciAvPlxuICAgKiAgICAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICAgKiAgICBzdGFydCBhdCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2VhcmNoJ3MgbWF0Y2gsIHRodXMgbm90IHRha2luZyB0aGUgd2hvbGUgaW5wdXQgdmFsdWUgaW50b1xuICAgKiAgICBhY2NvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJudW1iZXItaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwibnVtYmVyRXhhbXBsZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ251bWJlckV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmV4YW1wbGUgPSB7XG4gICAgICAgICAgICAgICAgIHZhbHVlOiAxMlxuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPk51bWJlcjpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwiZXhhbXBsZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIiBtYXg9XCI5OVwiIHJlcXVpcmVkPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICBSZXF1aXJlZCE8L3NwYW4+XG4gICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLm51bWJlclwiPlxuICAgICAgICAgICAgICAgTm90IHZhbGlkIG51bWJlciE8L3NwYW4+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICA8dHQ+dmFsdWUgPSB7e2V4YW1wbGUudmFsdWV9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kZXJyb3IgPSB7e215Rm9ybS5pbnB1dC4kZXJyb3J9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS4kdmFsaWQgPSB7e215Rm9ybS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudChieS5iaW5kaW5nKCdleGFtcGxlLnZhbHVlJykpO1xuICAgICAgICAgIHZhciB2YWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmlucHV0LiR2YWxpZCcpKTtcbiAgICAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCdleGFtcGxlLnZhbHVlJykpO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBleHBlY3QodmFsdWUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzEyJyk7XG4gICAgICAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcnKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBvdmVyIG1heCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcxMjMnKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZS5nZXRUZXh0KCkpLnRvRXF1YWwoJ3ZhbHVlID0nKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgJ251bWJlcic6IG51bWJlcklucHV0VHlwZSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgaW5wdXRcbiAgICogQG5hbWUgaW5wdXRbdXJsXVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGV4dCBpbnB1dCB3aXRoIFVSTCB2YWxpZGF0aW9uLiBTZXRzIHRoZSBgdXJsYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgY29udGVudCBpcyBub3QgYVxuICAgKiB2YWxpZCBVUkwuXG4gICAqXG4gICAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gICAqICoqTm90ZToqKiBgaW5wdXRbdXJsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIHVybHMgdGhhdCBpcyBkZXJpdmVkIGZyb20gdGhlIHJlZ2V4XG4gICAqIHVzZWQgaW4gQ2hyb21pdW0uIElmIHlvdSBuZWVkIHN0cmljdGVyIHZhbGlkYXRpb24sIHlvdSBjYW4gdXNlIGBuZy1wYXR0ZXJuYCBvciBtb2RpZnlcbiAgICogdGhlIGJ1aWx0LWluIHZhbGlkYXRvcnMgKHNlZSB0aGUge0BsaW5rIGd1aWRlL2Zvcm1zIEZvcm1zIGd1aWRlfSlcbiAgICogPC9kaXY+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdSZXF1aXJlZCBBZGRzIGByZXF1aXJlZGAgYXR0cmlidXRlIGFuZCBgcmVxdWlyZWRgIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICAgKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICAgKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW5cbiAgICogICAgbWlubGVuZ3RoLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuXG4gICAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZlxuICAgKiAgICBhbnkgbGVuZ3RoLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHBhdHRlcm4gU2ltaWxhciB0byBgbmdQYXR0ZXJuYCBleGNlcHQgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nXG4gICAqICAgIHRoYXQgY29udGFpbnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBib2R5IHRoYXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogICAgYXMgaW4gdGhlIG5nUGF0dGVybiBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgJHZpZXdWYWx1ZX1cbiAgICogICAgZG9lcyBub3QgbWF0Y2ggYSBSZWdFeHAgZm91bmQgYnkgZXZhbHVhdGluZyB0aGUgQW5ndWxhciBleHByZXNzaW9uIGdpdmVuIGluIHRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICAgKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHBcbiAgICogICAgYWZ0ZXIgd3JhcHBpbmcgaXQgaW4gYF5gIGFuZCBgJGAgY2hhcmFjdGVycy4gRm9yIGluc3RhbmNlLCBgXCJhYmNcImAgd2lsbCBiZSBjb252ZXJ0ZWQgdG9cbiAgICogICAgYG5ldyBSZWdFeHAoJ15hYmMkJylgLjxiciAvPlxuICAgKiAgICAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICAgKiAgICBzdGFydCBhdCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2VhcmNoJ3MgbWF0Y2gsIHRodXMgbm90IHRha2luZyB0aGUgd2hvbGUgaW5wdXQgdmFsdWUgaW50b1xuICAgKiAgICBhY2NvdW50LlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAgICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJ1cmwtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwidXJsRXhhbXBsZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3VybEV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLnVybCA9IHtcbiAgICAgICAgICAgICAgICAgdGV4dDogJ2h0dHA6Ly9nb29nbGUuY29tJ1xuICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPlVSTDpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInVybFwiIG5hbWU9XCJpbnB1dFwiIG5nLW1vZGVsPVwidXJsLnRleHRcIiByZXF1aXJlZD5cbiAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci51cmxcIj5cbiAgICAgICAgICAgICAgIE5vdCB2YWxpZCB1cmwhPC9zcGFuPlxuICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgPHR0PnRleHQgPSB7e3VybC50ZXh0fX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJHZhbGlkID0ge3tteUZvcm0uaW5wdXQuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uaW5wdXQuJGVycm9yID0ge3tteUZvcm0uaW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IudXJsID0ge3shIW15Rm9ybS4kZXJyb3IudXJsfX08L3R0Pjxici8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2ZpbGU+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgICB2YXIgdGV4dCA9IGVsZW1lbnQoYnkuYmluZGluZygndXJsLnRleHQnKSk7XG4gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpO1xuICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VybC50ZXh0JykpO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvQ29udGFpbignaHR0cDovL2dvb2dsZS5jb20nKTtcbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGVtcHR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbnB1dC5jbGVhcigpO1xuICAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJycpO1xuXG4gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3RleHQgPScpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCB1cmwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7XG4gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnYm94Jyk7XG5cbiAgICAgICAgICAgIGV4cGVjdCh2YWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgJ3VybCc6IHVybElucHV0VHlwZSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgaW5wdXRcbiAgICogQG5hbWUgaW5wdXRbZW1haWxdXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUZXh0IGlucHV0IHdpdGggZW1haWwgdmFsaWRhdGlvbi4gU2V0cyB0aGUgYGVtYWlsYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiBub3QgYSB2YWxpZCBlbWFpbFxuICAgKiBhZGRyZXNzLlxuICAgKlxuICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgKiAqKk5vdGU6KiogYGlucHV0W2VtYWlsXWAgdXNlcyBhIHJlZ2V4IHRvIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3NlcyB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgcmVnZXhcbiAgICogdXNlZCBpbiBDaHJvbWl1bS4gSWYgeW91IG5lZWQgc3RyaWN0ZXIgdmFsaWRhdGlvbiAoZS5nLiByZXF1aXJpbmcgYSB0b3AtbGV2ZWwgZG9tYWluKSwgeW91IGNhblxuICAgKiB1c2UgYG5nLXBhdHRlcm5gIG9yIG1vZGlmeSB0aGUgYnVpbHQtaW4gdmFsaWRhdG9ycyAoc2VlIHRoZSB7QGxpbmsgZ3VpZGUvZm9ybXMgRm9ybXMgZ3VpZGV9KVxuICAgKiA8L2Rpdj5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gICAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gICAqICAgIGByZXF1aXJlZGAgd2hlbiB5b3Ugd2FudCB0byBkYXRhLWJpbmQgdG8gdGhlIGByZXF1aXJlZGAgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0ge251bWJlcj19IG5nTWlubGVuZ3RoIFNldHMgYG1pbmxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIHNob3J0ZXIgdGhhblxuICAgKiAgICBtaW5sZW5ndGguXG4gICAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW5cbiAgICogICAgbWF4bGVuZ3RoLiBTZXR0aW5nIHRoZSBhdHRyaWJ1dGUgdG8gYSBuZWdhdGl2ZSBvciBub24tbnVtZXJpYyB2YWx1ZSwgYWxsb3dzIHZpZXcgdmFsdWVzIG9mXG4gICAqICAgIGFueSBsZW5ndGguXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gcGF0dGVybiBTaW1pbGFyIHRvIGBuZ1BhdHRlcm5gIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIGFjdHVhbCBzdHJpbmdcbiAgICogICAgdGhhdCBjb250YWlucyB0aGUgcmVndWxhciBleHByZXNzaW9uIGJvZHkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgKiAgICBhcyBpbiB0aGUgbmdQYXR0ZXJuIGRpcmVjdGl2ZS5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ1BhdHRlcm4gU2V0cyBgcGF0dGVybmAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIG5nTW9kZWwge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZSAkdmlld1ZhbHVlfVxuICAgKiAgICBkb2VzIG5vdCBtYXRjaCBhIFJlZ0V4cCBmb3VuZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCwgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuXG4gICAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHN0cmluZywgdGhlbiBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFJlZ0V4cFxuICAgKiAgICBhZnRlciB3cmFwcGluZyBpdCBpbiBgXmAgYW5kIGAkYCBjaGFyYWN0ZXJzLiBGb3IgaW5zdGFuY2UsIGBcImFiY1wiYCB3aWxsIGJlIGNvbnZlcnRlZCB0b1xuICAgKiAgICBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuPGJyIC8+XG4gICAqICAgICoqTm90ZToqKiBBdm9pZCB1c2luZyB0aGUgYGdgIGZsYWcgb24gdGhlIFJlZ0V4cCwgYXMgaXQgd2lsbCBjYXVzZSBlYWNoIHN1Y2Nlc3NpdmUgc2VhcmNoIHRvXG4gICAqICAgIHN0YXJ0IGF0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZWFyY2gncyBtYXRjaCwgdGh1cyBub3QgdGFraW5nIHRoZSB3aG9sZSBpbnB1dCB2YWx1ZSBpbnRvXG4gICAqICAgIGFjY291bnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmdDaGFuZ2UgQW5ndWxhciBleHByZXNzaW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gaW5wdXQgY2hhbmdlcyBkdWUgdG8gdXNlclxuICAgKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgICAgPGV4YW1wbGUgbmFtZT1cImVtYWlsLWlucHV0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cImVtYWlsRXhhbXBsZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2VtYWlsRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAgICAkc2NvcGUuZW1haWwgPSB7XG4gICAgICAgICAgICAgICAgIHRleHQ6ICdtZUBleGFtcGxlLmNvbSdcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgfV0pO1xuICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgICA8bGFiZWw+RW1haWw6XG4gICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgbmFtZT1cImlucHV0XCIgbmctbW9kZWw9XCJlbWFpbC50ZXh0XCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0uaW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgIFJlcXVpcmVkITwvc3Bhbj5cbiAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLmlucHV0LiRlcnJvci5lbWFpbFwiPlxuICAgICAgICAgICAgICAgICBOb3QgdmFsaWQgZW1haWwhPC9zcGFuPlxuICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDx0dD50ZXh0ID0ge3tlbWFpbC50ZXh0fX08L3R0Pjxici8+XG4gICAgICAgICAgICAgPHR0Pm15Rm9ybS5pbnB1dC4kdmFsaWQgPSB7e215Rm9ybS5pbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgICA8dHQ+bXlGb3JtLmlucHV0LiRlcnJvciA9IHt7bXlGb3JtLmlucHV0LiRlcnJvcn19PC90dD48YnIvPlxuICAgICAgICAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICAgICAgICAgIDx0dD5teUZvcm0uJGVycm9yLmVtYWlsID0ge3shIW15Rm9ybS4kZXJyb3IuZW1haWx9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgdmFyIHRleHQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2VtYWlsLnRleHQnKSk7XG4gICAgICAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0uaW5wdXQuJHZhbGlkJykpO1xuICAgICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ2VtYWlsLnRleHQnKSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgdG8gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGV4cGVjdCh0ZXh0LmdldFRleHQoKSkudG9Db250YWluKCdtZUBleGFtcGxlLmNvbScpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlucHV0LmNsZWFyKCk7XG4gICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnJyk7XG4gICAgICAgICAgICBleHBlY3QodGV4dC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3RleHQgPScpO1xuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIG5vdCBlbWFpbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICAgIGlucHV0LnNlbmRLZXlzKCd4eHgnKTtcblxuICAgICAgICAgICAgZXhwZWN0KHZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCdmYWxzZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICA8L2ZpbGU+XG4gICAgICA8L2V4YW1wbGU+XG4gICAqL1xuICAnZW1haWwnOiBlbWFpbElucHV0VHlwZSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgaW5wdXRcbiAgICogQG5hbWUgaW5wdXRbcmFkaW9dXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBIVE1MIHJhZGlvIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBgbmdNb2RlbGAgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuXG4gICAqICAgIE5vdGUgdGhhdCBgdmFsdWVgIG9ubHkgc3VwcG9ydHMgYHN0cmluZ2AgdmFsdWVzLCBpLmUuIHRoZSBzY29wZSBtb2RlbCBuZWVkcyB0byBiZSBhIHN0cmluZyxcbiAgICogICAgdG9vLiBVc2UgYG5nVmFsdWVgIGlmIHlvdSBuZWVkIGNvbXBsZXggbW9kZWxzIChgbnVtYmVyYCwgYG9iamVjdGAsIC4uLikuXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZ1ZhbHVlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byB3aGljaCBgbmdNb2RlbGAgd2lsbCBiZSBiZSBzZXQgd2hlbiB0aGUgcmFkaW9cbiAgICogICAgaXMgc2VsZWN0ZWQuIFNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGB2YWx1ZWAgYXR0cmlidXRlIGlmIHlvdSBuZWVkXG4gICAqICAgIGEgbm9uLXN0cmluZyBgbmdNb2RlbGAgKGBib29sZWFuYCwgYGFycmF5YCwgLi4uKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJyYWRpby1pbnB1dC1kaXJlY3RpdmVcIiBtb2R1bGU9XCJyYWRpb0V4YW1wbGVcIj5cbiAgICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdyYWRpb0V4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgJHNjb3BlLmNvbG9yID0ge1xuICAgICAgICAgICAgICAgICBuYW1lOiAnYmx1ZSdcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAkc2NvcGUuc3BlY2lhbFZhbHVlID0ge1xuICAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTIzNDVcIixcbiAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBcImdyZWVuXCJcbiAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgfV0pO1xuICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICA8Zm9ybSBuYW1lPVwibXlGb3JtXCIgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmctbW9kZWw9XCJjb2xvci5uYW1lXCIgdmFsdWU9XCJyZWRcIj5cbiAgICAgICAgICAgICBSZWRcbiAgICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5nLW1vZGVsPVwiY29sb3IubmFtZVwiIG5nLXZhbHVlPVwic3BlY2lhbFZhbHVlXCI+XG4gICAgICAgICAgICAgR3JlZW5cbiAgICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5nLW1vZGVsPVwiY29sb3IubmFtZVwiIHZhbHVlPVwiYmx1ZVwiPlxuICAgICAgICAgICAgIEJsdWVcbiAgICAgICAgICAgPC9sYWJlbD48YnIvPlxuICAgICAgICAgICA8dHQ+Y29sb3IgPSB7e2NvbG9yLm5hbWUgfCBqc29ufX08L3R0Pjxici8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIE5vdGUgdGhhdCBgbmctdmFsdWU9XCJzcGVjaWFsVmFsdWVcImAgc2V0cyByYWRpbyBpdGVtJ3MgdmFsdWUgdG8gYmUgdGhlIHZhbHVlIG9mIGAkc2NvcGUuc3BlY2lhbFZhbHVlYC5cbiAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgICAgaXQoJ3Nob3VsZCBjaGFuZ2Ugc3RhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dHMgPSBlbGVtZW50LmFsbChieS5tb2RlbCgnY29sb3IubmFtZScpKTtcbiAgICAgICAgICAgIHZhciBjb2xvciA9IGVsZW1lbnQoYnkuYmluZGluZygnY29sb3IubmFtZScpKTtcblxuICAgICAgICAgICAgZXhwZWN0KGNvbG9yLmdldFRleHQoKSkudG9Db250YWluKCdibHVlJyk7XG5cbiAgICAgICAgICAgIGlucHV0cy5nZXQoMCkuY2xpY2soKTtcbiAgICAgICAgICAgIGV4cGVjdChjb2xvci5nZXRUZXh0KCkpLnRvQ29udGFpbigncmVkJyk7XG5cbiAgICAgICAgICAgIGlucHV0cy5nZXQoMSkuY2xpY2soKTtcbiAgICAgICAgICAgIGV4cGVjdChjb2xvci5nZXRUZXh0KCkpLnRvQ29udGFpbignZ3JlZW4nKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAgKi9cbiAgJ3JhZGlvJzogcmFkaW9JbnB1dFR5cGUsXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBpbnB1dFxuICAgKiBAbmFtZSBpbnB1dFtyYW5nZV1cbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE5hdGl2ZSByYW5nZSBpbnB1dCB3aXRoIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBUaGUgbW9kZWwgZm9yIHRoZSByYW5nZSBpbnB1dCBtdXN0IGFsd2F5cyBiZSBhIGBOdW1iZXJgLlxuICAgKlxuICAgKiBJRTkgYW5kIG90aGVyIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIGByYW5nZWAgdHlwZSBmYWxsIGJhY2tcbiAgICogdG8gYSB0ZXh0IGlucHV0IHdpdGhvdXQgYW55IGRlZmF1bHQgdmFsdWVzIGZvciBgbWluYCwgYG1heGAgYW5kIGBzdGVwYC4gTW9kZWwgYmluZGluZyxcbiAgICogdmFsaWRhdGlvbiBhbmQgbnVtYmVyIHBhcnNpbmcgYXJlIG5ldmVydGhlbGVzcyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCByYW5nZSAobGF0ZXN0IENocm9tZSwgU2FmYXJpLCBGaXJlZm94LCBFZGdlKSB0cmVhdCBgaW5wdXRbcmFuZ2VdYFxuICAgKiBpbiBhIHdheSB0aGF0IG5ldmVyIGFsbG93cyB0aGUgaW5wdXQgdG8gaG9sZCBhbiBpbnZhbGlkIHZhbHVlLiBUaGF0IG1lYW5zOlxuICAgKiAtIGFueSBub24tbnVtZXJpY2FsIHZhbHVlIGlzIHNldCB0byBgKG1heCArIG1pbikgLyAyYC5cbiAgICogLSBhbnkgbnVtZXJpY2FsIHZhbHVlIHRoYXQgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG1pbiB2YWwsIG9yIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtYXggdmFsXG4gICAqIGlzIHNldCB0byB0aGUgbWluIC8gbWF4IHZhbCByZXNwZWN0aXZlbHkuXG4gICAqIC0gYWRkaXRpb25hbGx5LCB0aGUgY3VycmVudCBgc3RlcGAgaXMgcmVzcGVjdGVkLCBzbyB0aGUgbmVhcmVzdCB2YWx1ZSB0aGF0IHNhdGlzZmllcyBhIHN0ZXBcbiAgICogaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHRoZSBbSFRNTCBTcGVjIG9uIGlucHV0W3R5cGU9cmFuZ2VdXShodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNyYW5nZS1zdGF0ZS0odHlwZT1yYW5nZSkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIFRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgY29uc2VxdWVuY2VzIGZvciBBbmd1bGFyOlxuICAgKlxuICAgKiBTaW5jZSB0aGUgZWxlbWVudCB2YWx1ZSBzaG91bGQgYWx3YXlzIHJlZmxlY3QgdGhlIGN1cnJlbnQgbW9kZWwgdmFsdWUsIGEgcmFuZ2UgaW5wdXRcbiAgICogd2lsbCBzZXQgdGhlIGJvdW5kIG5nTW9kZWwgZXhwcmVzc2lvbiB0byB0aGUgdmFsdWUgdGhhdCB0aGUgYnJvd3NlciBoYXMgc2V0IGZvciB0aGVcbiAgICogaW5wdXQgZWxlbWVudC4gRm9yIGV4YW1wbGUsIGluIHRoZSBmb2xsb3dpbmcgaW5wdXQgYDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBuZy1tb2RlbD1cIm1vZGVsLnZhbHVlXCI+YCxcbiAgICogaWYgdGhlIGFwcGxpY2F0aW9uIHNldHMgYG1vZGVsLnZhbHVlID0gbnVsbGAsIHRoZSBicm93c2VyIHdpbGwgc2V0IHRoZSBpbnB1dCB0byBgJzUwJ2AuXG4gICAqIEFuZ3VsYXIgd2lsbCB0aGVuIHNldCB0aGUgbW9kZWwgdG8gYDUwYCwgdG8gcHJldmVudCBpbnB1dCBhbmQgbW9kZWwgdmFsdWUgYmVpbmcgb3V0IG9mIHN5bmMuXG4gICAqXG4gICAqIFRoYXQgbWVhbnMgdGhlIG1vZGVsIGZvciByYW5nZSB3aWxsIGltbWVkaWF0ZWx5IGJlIHNldCB0byBgNTBgIGFmdGVyIGBuZ01vZGVsYCBoYXMgYmVlblxuICAgKiBpbml0aWFsaXplZC4gSXQgYWxzbyBtZWFucyBhIHJhbmdlIGlucHV0IGNhbiBuZXZlciBoYXZlIHRoZSByZXF1aXJlZCBlcnJvci5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBvbmx5IGFmZmVjdCBjaGFuZ2VzIHRvIHRoZSBtb2RlbCB2YWx1ZSwgYnV0IGFsc28gdG8gdGhlIHZhbHVlcyBvZiB0aGUgYG1pbmAsXG4gICAqIGBtYXhgLCBhbmQgYHN0ZXBgIGF0dHJpYnV0ZXMuIFdoZW4gdGhlc2UgY2hhbmdlIGluIGEgd2F5IHRoYXQgd2lsbCBjYXVzZSB0aGUgYnJvd3NlciB0byBtb2RpZnlcbiAgICogdGhlIGlucHV0IHZhbHVlLCBBbmd1bGFyIHdpbGwgYWxzbyB1cGRhdGUgdGhlIG1vZGVsIHZhbHVlLlxuICAgKlxuICAgKiBBdXRvbWF0aWMgdmFsdWUgYWRqdXN0bWVudCBhbHNvIG1lYW5zIHRoYXQgYSByYW5nZSBpbnB1dCBlbGVtZW50IGNhbiBuZXZlciBoYXZlIHRoZSBgcmVxdWlyZWRgLFxuICAgKiBgbWluYCwgb3IgYG1heGAgZXJyb3JzLlxuICAgKlxuICAgKiBIb3dldmVyLCBgc3RlcGAgaXMgY3VycmVudGx5IG9ubHkgZnVsbHkgaW1wbGVtZW50ZWQgYnkgRmlyZWZveC4gT3RoZXIgYnJvd3NlcnMgaGF2ZSBwcm9ibGVtc1xuICAgKiB3aGVuIHRoZSBzdGVwIHZhbHVlIGNoYW5nZXMgZHluYW1pY2FsbHkgLSB0aGV5IGRvIG5vdCBhZGp1c3QgdGhlIGVsZW1lbnQgdmFsdWUgY29ycmVjdGx5LCBidXRcbiAgICogaW5zdGVhZCBtYXkgc2V0IHRoZSBgc3RlcE1pc21hdGNoYCBlcnJvci4gSWYgdGhhdCdzIHRoZSBjYXNlLCB0aGUgQW5ndWxhciB3aWxsIHNldCB0aGUgYHN0ZXBgXG4gICAqIGVycm9yIG9uIHRoZSBpbnB1dCwgYW5kIHNldCB0aGUgbW9kZWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBgaW5wdXRbcmFuZ2VdYCBpcyBub3QgY29tcGF0aWJsZSB3aXRoYG5nTWF4YCwgYG5nTWluYCwgYW5kIGBuZ1N0ZXBgLCBiZWNhdXNlIHRoZXkgZG9cbiAgICogbm90IHNldCB0aGUgYG1pbmAgYW5kIGBtYXhgIGF0dHJpYnV0ZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGJyb3dzZXIgd29uJ3QgYXV0b21hdGljYWxseSBhZGp1c3RcbiAgICogdGhlIGlucHV0IHZhbHVlIGJhc2VkIG9uIHRoZWlyIHZhbHVlcywgYW5kIHdpbGwgYWx3YXlzIGFzc3VtZSBtaW4gPSAwLCBtYXggPSAxMDAsIGFuZCBzdGVwID0gMS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9ICBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGZvcm0gdW5kZXIgd2hpY2ggdGhlIGNvbnRyb2wgaXMgcHVibGlzaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1pbiBTZXRzIHRoZSBgbWluYCB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGdyZWF0ZXJcbiAgICogICAgICAgICAgICAgICAgICB0aGFuIGBtaW5gLiBDYW4gYmUgaW50ZXJwb2xhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG1heCBTZXRzIHRoZSBgbWF4YCB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZSBlbnRlcmVkIGlzIGxlc3MgdGhhbiBgbWF4YC5cbiAgICogICAgICAgICAgICAgICAgICBDYW4gYmUgaW50ZXJwb2xhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IHN0ZXAgU2V0cyB0aGUgYHN0ZXBgIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIGVudGVyZWQgbWF0Y2hlcyB0aGUgYHN0ZXBgXG4gICAqICAgICAgICAgICAgICAgICAgQ2FuIGJlIGludGVycG9sYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgbmdNb2RlbCB2YWx1ZSBjaGFuZ2VzIGR1ZVxuICAgKiAgICAgICAgICAgICAgICAgIHRvIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICogQHBhcmFtIHtleHByZXNzaW9uPX0gbmdDaGVja2VkIElmIHRoZSBleHByZXNzaW9uIGlzIHRydXRoeSwgdGhlbiB0aGUgYGNoZWNrZWRgIGF0dHJpYnV0ZSB3aWxsIGJlIHNldCBvbiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gKipOb3RlKiogOiBgbmdDaGVja2VkYCBzaG91bGQgbm90IGJlIHVzZWQgYWxvbmdzaWRlIGBuZ01vZGVsYC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgQ2hlY2tvdXQge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NoZWNrZWQgbmdDaGVja2VkfSBmb3IgdXNhZ2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgICA8ZXhhbXBsZSBuYW1lPVwicmFuZ2UtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwicmFuZ2VFeGFtcGxlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdyYW5nZUV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUudmFsdWUgPSA3NTtcbiAgICAgICAgICAgICAgICAkc2NvcGUubWluID0gMTA7XG4gICAgICAgICAgICAgICAgJHNjb3BlLm1heCA9IDkwO1xuICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiIG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuXG4gICAgICAgICAgICBNb2RlbCBhcyByYW5nZTogPGlucHV0IHR5cGU9XCJyYW5nZVwiIG5hbWU9XCJyYW5nZVwiIG5nLW1vZGVsPVwidmFsdWVcIiBtaW49XCJ7e21pbn19XCIgIG1heD1cInt7bWF4fX1cIj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIE1vZGVsIGFzIG51bWJlcjogPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cInZhbHVlXCI+PGJyPlxuICAgICAgICAgICAgTWluOiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWluXCI+PGJyPlxuICAgICAgICAgICAgTWF4OiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWF4XCI+PGJyPlxuICAgICAgICAgICAgdmFsdWUgPSA8Y29kZT57e3ZhbHVlfX08L2NvZGU+PGJyLz5cbiAgICAgICAgICAgIG15Rm9ybS5yYW5nZS4kdmFsaWQgPSA8Y29kZT57e215Rm9ybS5yYW5nZS4kdmFsaWR9fTwvY29kZT48YnIvPlxuICAgICAgICAgICAgbXlGb3JtLnJhbmdlLiRlcnJvciA9IDxjb2RlPnt7bXlGb3JtLnJhbmdlLiRlcnJvcn19PC9jb2RlPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuXG4gICAqICMjIFJhbmdlIElucHV0IHdpdGggbmdNaW4gJiBuZ01heCBhdHRyaWJ1dGVzXG5cbiAgICogQGV4YW1wbGVcbiAgICAgIDxleGFtcGxlIG5hbWU9XCJyYW5nZS1pbnB1dC1kaXJlY3RpdmUtbmdcIiBtb2R1bGU9XCJyYW5nZUV4YW1wbGVcIj5cbiAgICAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3JhbmdlRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICAgICRzY29wZS52YWx1ZSA9IDc1O1xuICAgICAgICAgICAgICAgICRzY29wZS5taW4gPSAxMDtcbiAgICAgICAgICAgICAgICAkc2NvcGUubWF4ID0gOTA7XG4gICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICA8Zm9ybSBuYW1lPVwibXlGb3JtXCIgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICAgICBNb2RlbCBhcyByYW5nZTogPGlucHV0IHR5cGU9XCJyYW5nZVwiIG5hbWU9XCJyYW5nZVwiIG5nLW1vZGVsPVwidmFsdWVcIiBuZy1taW49XCJtaW5cIiBuZy1tYXg9XCJtYXhcIj5cbiAgICAgICAgICAgIDxocj5cbiAgICAgICAgICAgIE1vZGVsIGFzIG51bWJlcjogPGlucHV0IHR5cGU9XCJudW1iZXJcIiBuZy1tb2RlbD1cInZhbHVlXCI+PGJyPlxuICAgICAgICAgICAgTWluOiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWluXCI+PGJyPlxuICAgICAgICAgICAgTWF4OiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWF4XCI+PGJyPlxuICAgICAgICAgICAgdmFsdWUgPSA8Y29kZT57e3ZhbHVlfX08L2NvZGU+PGJyLz5cbiAgICAgICAgICAgIG15Rm9ybS5yYW5nZS4kdmFsaWQgPSA8Y29kZT57e215Rm9ybS5yYW5nZS4kdmFsaWR9fTwvY29kZT48YnIvPlxuICAgICAgICAgICAgbXlGb3JtLnJhbmdlLiRlcnJvciA9IDxjb2RlPnt7bXlGb3JtLnJhbmdlLiRlcnJvcn19PC9jb2RlPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuXG4gICAqL1xuICAncmFuZ2UnOiByYW5nZUlucHV0VHlwZSxcblxuICAvKipcbiAgICogQG5nZG9jIGlucHV0XG4gICAqIEBuYW1lIGlucHV0W2NoZWNrYm94XVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSFRNTCBjaGVja2JveC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5nTW9kZWwgQXNzaWduYWJsZSBhbmd1bGFyIGV4cHJlc3Npb24gdG8gZGF0YS1iaW5kIHRvLlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gICAqIEBwYXJhbSB7ZXhwcmVzc2lvbj19IG5nVHJ1ZVZhbHVlIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgc2V0IHdoZW4gc2VsZWN0ZWQuXG4gICAqIEBwYXJhbSB7ZXhwcmVzc2lvbj19IG5nRmFsc2VWYWx1ZSBUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHNldCB3aGVuIG5vdCBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gICAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAgICA8ZXhhbXBsZSBuYW1lPVwiY2hlY2tib3gtaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwiY2hlY2tib3hFeGFtcGxlXCI+XG4gICAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICBhbmd1bGFyLm1vZHVsZSgnY2hlY2tib3hFeGFtcGxlJywgW10pXG4gICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgICRzY29wZS5jaGVja2JveE1vZGVsID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlMSA6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWUyIDogJ1lFUydcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XSk7XG4gICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICAgPGxhYmVsPlZhbHVlMTpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2JveE1vZGVsLnZhbHVlMVwiPlxuICAgICAgICAgICA8L2xhYmVsPjxici8+XG4gICAgICAgICAgIDxsYWJlbD5WYWx1ZTI6XG4gICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwiY2hlY2tib3hNb2RlbC52YWx1ZTJcIlxuICAgICAgICAgICAgICAgICAgICBuZy10cnVlLXZhbHVlPVwiJ1lFUydcIiBuZy1mYWxzZS12YWx1ZT1cIidOTydcIj5cbiAgICAgICAgICAgIDwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgPHR0PnZhbHVlMSA9IHt7Y2hlY2tib3hNb2RlbC52YWx1ZTF9fTwvdHQ+PGJyLz5cbiAgICAgICAgICAgPHR0PnZhbHVlMiA9IHt7Y2hlY2tib3hNb2RlbC52YWx1ZTJ9fTwvdHQ+PGJyLz5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZmlsZT5cbiAgICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHN0YXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUxID0gZWxlbWVudChieS5iaW5kaW5nKCdjaGVja2JveE1vZGVsLnZhbHVlMScpKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZTIgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2NoZWNrYm94TW9kZWwudmFsdWUyJykpO1xuXG4gICAgICAgICAgICBleHBlY3QodmFsdWUxLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdZRVMnKTtcblxuICAgICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnY2hlY2tib3hNb2RlbC52YWx1ZTEnKSkuY2xpY2soKTtcbiAgICAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2NoZWNrYm94TW9kZWwudmFsdWUyJykpLmNsaWNrKCk7XG5cbiAgICAgICAgICAgIGV4cGVjdCh2YWx1ZTEuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgICBleHBlY3QodmFsdWUyLmdldFRleHQoKSkudG9Db250YWluKCdOTycpO1xuICAgICAgICAgIH0pO1xuICAgICAgICA8L2ZpbGU+XG4gICAgICA8L2V4YW1wbGU+XG4gICAqL1xuICAnY2hlY2tib3gnOiBjaGVja2JveElucHV0VHlwZSxcblxuICAnaGlkZGVuJzogbm9vcCxcbiAgJ2J1dHRvbic6IG5vb3AsXG4gICdzdWJtaXQnOiBub29wLFxuICAncmVzZXQnOiBub29wLFxuICAnZmlsZSc6IG5vb3Bcbn07XG5cbmZ1bmN0aW9uIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpIHtcbiAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdGV4dElucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKSB7XG4gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7XG4gIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpO1xufVxuXG5mdW5jdGlvbiBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgdmFyIHR5cGUgPSBsb3dlcmNhc2UoZWxlbWVudFswXS50eXBlKTtcblxuICAvLyBJbiBjb21wb3NpdGlvbiBtb2RlLCB1c2VycyBhcmUgc3RpbGwgaW5wdXR0aW5nIGludGVybWVkaWF0ZSB0ZXh0IGJ1ZmZlcixcbiAgLy8gaG9sZCB0aGUgbGlzdGVuZXIgdW50aWwgY29tcG9zaXRpb24gaXMgZG9uZS5cbiAgLy8gTW9yZSBhYm91dCBjb21wb3NpdGlvbiBldmVudHM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Db21wb3NpdGlvbkV2ZW50XG4gIGlmICghJHNuaWZmZXIuYW5kcm9pZCkge1xuICAgIHZhciBjb21wb3NpbmcgPSBmYWxzZTtcblxuICAgIGVsZW1lbnQub24oJ2NvbXBvc2l0aW9uc3RhcnQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbXBvc2luZyA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBlbGVtZW50Lm9uKCdjb21wb3NpdGlvbmVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgJGJyb3dzZXIuZGVmZXIuY2FuY2VsKHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChjb21wb3NpbmcpIHJldHVybjtcbiAgICB2YXIgdmFsdWUgPSBlbGVtZW50LnZhbCgpLFxuICAgICAgICBldmVudCA9IGV2ICYmIGV2LnR5cGU7XG5cbiAgICAvLyBCeSBkZWZhdWx0IHdlIHdpbGwgdHJpbSB0aGUgdmFsdWVcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlIG5nLXRyaW0gZXhpc3RzIHdlIHdpbGwgYXZvaWQgdHJpbW1pbmdcbiAgICAvLyBJZiBpbnB1dCB0eXBlIGlzICdwYXNzd29yZCcsIHRoZSB2YWx1ZSBpcyBuZXZlciB0cmltbWVkXG4gICAgaWYgKHR5cGUgIT09ICdwYXNzd29yZCcgJiYgKCFhdHRyLm5nVHJpbSB8fCBhdHRyLm5nVHJpbSAhPT0gJ2ZhbHNlJykpIHtcbiAgICAgIHZhbHVlID0gdHJpbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBjb250cm9sIGlzIHN1ZmZlcmluZyBmcm9tIGJhZCBpbnB1dCAoZHVlIHRvIG5hdGl2ZSB2YWxpZGF0b3JzKSwgYnJvd3NlcnMgZGlzY2FyZCBpdHNcbiAgICAvLyB2YWx1ZSwgc28gaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byByZXZhbGlkYXRlIChieSBjYWxsaW5nICRzZXRWaWV3VmFsdWUgYWdhaW4pIGV2ZW4gaWYgdGhlXG4gICAgLy8gY29udHJvbCdzIHZhbHVlIGlzIHRoZSBzYW1lIGVtcHR5IHZhbHVlIHR3aWNlIGluIGEgcm93LlxuICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZhbHVlIHx8ICh2YWx1ZSA9PT0gJycgJiYgY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpKSB7XG4gICAgICBjdHJsLiRzZXRWaWV3VmFsdWUodmFsdWUsIGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaWYgdGhlIGJyb3dzZXIgZG9lcyBzdXBwb3J0IFwiaW5wdXRcIiBldmVudCwgd2UgYXJlIGZpbmUgLSBleGNlcHQgb24gSUU5IHdoaWNoIGRvZXNuJ3QgZmlyZSB0aGVcbiAgLy8gaW5wdXQgZXZlbnQgb24gYmFja3NwYWNlLCBkZWxldGUgb3IgY3V0XG4gIGlmICgkc25pZmZlci5oYXNFdmVudCgnaW5wdXQnKSkge1xuICAgIGVsZW1lbnQub24oJ2lucHV0JywgbGlzdGVuZXIpO1xuICB9IGVsc2Uge1xuICAgIHZhciBkZWZlckxpc3RlbmVyID0gZnVuY3Rpb24oZXYsIGlucHV0LCBvcmlnVmFsdWUpIHtcbiAgICAgIGlmICghdGltZW91dCkge1xuICAgICAgICB0aW1lb3V0ID0gJGJyb3dzZXIuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC52YWx1ZSAhPT0gb3JpZ1ZhbHVlKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcihldik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZWxlbWVudC5vbigna2V5ZG93bicsIC8qKiBAdGhpcyAqLyBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICAgIC8vIGlnbm9yZVxuICAgICAgLy8gICAgY29tbWFuZCAgICAgICAgICAgIG1vZGlmaWVycyAgICAgICAgICAgICAgICAgICBhcnJvd3NcbiAgICAgIGlmIChrZXkgPT09IDkxIHx8ICgxNSA8IGtleSAmJiBrZXkgPCAxOSkgfHwgKDM3IDw9IGtleSAmJiBrZXkgPD0gNDApKSByZXR1cm47XG5cbiAgICAgIGRlZmVyTGlzdGVuZXIoZXZlbnQsIHRoaXMsIHRoaXMudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gaWYgdXNlciBtb2RpZmllcyBpbnB1dCB2YWx1ZSB1c2luZyBjb250ZXh0IG1lbnUgaW4gSUUsIHdlIG5lZWQgXCJwYXN0ZVwiIGFuZCBcImN1dFwiIGV2ZW50cyB0byBjYXRjaCBpdFxuICAgIGlmICgkc25pZmZlci5oYXNFdmVudCgncGFzdGUnKSkge1xuICAgICAgZWxlbWVudC5vbigncGFzdGUgY3V0JywgZGVmZXJMaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdXNlciBwYXN0ZSBpbnRvIGlucHV0IHVzaW5nIG1vdXNlIG9uIG9sZGVyIGJyb3dzZXJcbiAgLy8gb3IgZm9ybSBhdXRvY29tcGxldGUgb24gbmV3ZXIgYnJvd3Nlciwgd2UgbmVlZCBcImNoYW5nZVwiIGV2ZW50IHRvIGNhdGNoIGl0XG4gIGVsZW1lbnQub24oJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAvLyBTb21lIG5hdGl2ZSBpbnB1dCB0eXBlcyAoZGF0ZS1mYW1pbHkpIGhhdmUgdGhlIGFiaWxpdHkgdG8gY2hhbmdlIHZhbGlkaXR5IHdpdGhvdXRcbiAgLy8gZmlyaW5nIGFueSBpbnB1dC9jaGFuZ2UgZXZlbnRzLlxuICAvLyBGb3IgdGhlc2UgZXZlbnQgdHlwZXMsIHdoZW4gbmF0aXZlIHZhbGlkYXRvcnMgYXJlIHByZXNlbnQgYW5kIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSB0eXBlLFxuICAvLyBjaGVjayBmb3IgdmFsaWRpdHkgY2hhbmdlcyBvbiB2YXJpb3VzIERPTSBldmVudHMuXG4gIGlmIChQQVJUSUFMX1ZBTElEQVRJT05fVFlQRVNbdHlwZV0gJiYgY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMgJiYgdHlwZSA9PT0gYXR0ci50eXBlKSB7XG4gICAgZWxlbWVudC5vbihQQVJUSUFMX1ZBTElEQVRJT05fRVZFTlRTLCAvKiogQHRoaXMgKi8gZnVuY3Rpb24oZXYpIHtcbiAgICAgIGlmICghdGltZW91dCkge1xuICAgICAgICB2YXIgdmFsaWRpdHkgPSB0aGlzW1ZBTElESVRZX1NUQVRFX1BST1BFUlRZXTtcbiAgICAgICAgdmFyIG9yaWdCYWRJbnB1dCA9IHZhbGlkaXR5LmJhZElucHV0O1xuICAgICAgICB2YXIgb3JpZ1R5cGVNaXNtYXRjaCA9IHZhbGlkaXR5LnR5cGVNaXNtYXRjaDtcbiAgICAgICAgdGltZW91dCA9ICRicm93c2VyLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIGlmICh2YWxpZGl0eS5iYWRJbnB1dCAhPT0gb3JpZ0JhZElucHV0IHx8IHZhbGlkaXR5LnR5cGVNaXNtYXRjaCAhPT0gb3JpZ1R5cGVNaXNtYXRjaCkge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBXb3JrYXJvdW5kIGZvciBGaXJlZm94IHZhbGlkYXRpb24gIzEyMTAyLlxuICAgIHZhciB2YWx1ZSA9IGN0cmwuJGlzRW1wdHkoY3RybC4kdmlld1ZhbHVlKSA/ICcnIDogY3RybC4kdmlld1ZhbHVlO1xuICAgIGlmIChlbGVtZW50LnZhbCgpICE9PSB2YWx1ZSkge1xuICAgICAgZWxlbWVudC52YWwodmFsdWUpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gd2Vla1BhcnNlcihpc29XZWVrLCBleGlzdGluZ0RhdGUpIHtcbiAgaWYgKGlzRGF0ZShpc29XZWVrKSkge1xuICAgIHJldHVybiBpc29XZWVrO1xuICB9XG5cbiAgaWYgKGlzU3RyaW5nKGlzb1dlZWspKSB7XG4gICAgV0VFS19SRUdFWFAubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgcGFydHMgPSBXRUVLX1JFR0VYUC5leGVjKGlzb1dlZWspO1xuICAgIGlmIChwYXJ0cykge1xuICAgICAgdmFyIHllYXIgPSArcGFydHNbMV0sXG4gICAgICAgICAgd2VlayA9ICtwYXJ0c1syXSxcbiAgICAgICAgICBob3VycyA9IDAsXG4gICAgICAgICAgbWludXRlcyA9IDAsXG4gICAgICAgICAgc2Vjb25kcyA9IDAsXG4gICAgICAgICAgbWlsbGlzZWNvbmRzID0gMCxcbiAgICAgICAgICBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSxcbiAgICAgICAgICBhZGREYXlzID0gKHdlZWsgLSAxKSAqIDc7XG5cbiAgICAgIGlmIChleGlzdGluZ0RhdGUpIHtcbiAgICAgICAgaG91cnMgPSBleGlzdGluZ0RhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgbWludXRlcyA9IGV4aXN0aW5nRGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICBtaWxsaXNlY29uZHMgPSBleGlzdGluZ0RhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCBmaXJzdFRodXJzLmdldERhdGUoKSArIGFkZERheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBOYU47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGVQYXJzZXIocmVnZXhwLCBtYXBwaW5nKSB7XG4gIHJldHVybiBmdW5jdGlvbihpc28sIGRhdGUpIHtcbiAgICB2YXIgcGFydHMsIG1hcDtcblxuICAgIGlmIChpc0RhdGUoaXNvKSkge1xuICAgICAgcmV0dXJuIGlzbztcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoaXNvKSkge1xuICAgICAgLy8gV2hlbiBhIGRhdGUgaXMgSlNPTidpZmllZCB0byB3cmFwcyBpdHNlbGYgaW5zaWRlIG9mIGFuIGV4dHJhXG4gICAgICAvLyBzZXQgb2YgZG91YmxlIHF1b3Rlcy4gVGhpcyBtYWtlcyB0aGUgZGF0ZSBwYXJzaW5nIGNvZGUgdW5hYmxlXG4gICAgICAvLyB0byBtYXRjaCB0aGUgZGF0ZSBzdHJpbmcgYW5kIHBhcnNlIGl0IGFzIGEgZGF0ZS5cbiAgICAgIGlmIChpc28uY2hhckF0KDApID09PSAnXCInICYmIGlzby5jaGFyQXQoaXNvLmxlbmd0aCAtIDEpID09PSAnXCInKSB7XG4gICAgICAgIGlzbyA9IGlzby5zdWJzdHJpbmcoMSwgaXNvLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKElTT19EQVRFX1JFR0VYUC50ZXN0KGlzbykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGlzbyk7XG4gICAgICB9XG4gICAgICByZWdleHAubGFzdEluZGV4ID0gMDtcbiAgICAgIHBhcnRzID0gcmVnZXhwLmV4ZWMoaXNvKTtcblxuICAgICAgaWYgKHBhcnRzKSB7XG4gICAgICAgIHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgbWFwID0ge1xuICAgICAgICAgICAgeXl5eTogZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgTU06IGRhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgICBkZDogZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICBISDogZGF0ZS5nZXRIb3VycygpLFxuICAgICAgICAgICAgbW06IGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgc3M6IGRhdGUuZ2V0U2Vjb25kcygpLFxuICAgICAgICAgICAgc3NzOiBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC8gMTAwMFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFwID0geyB5eXl5OiAxOTcwLCBNTTogMSwgZGQ6IDEsIEhIOiAwLCBtbTogMCwgc3M6IDAsIHNzczogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaChwYXJ0cywgZnVuY3Rpb24ocGFydCwgaW5kZXgpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBtYXBwaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgbWFwW21hcHBpbmdbaW5kZXhdXSA9ICtwYXJ0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXAueXl5eSwgbWFwLk1NIC0gMSwgbWFwLmRkLCBtYXAuSEgsIG1hcC5tbSwgbWFwLnNzIHx8IDAsIG1hcC5zc3MgKiAxMDAwIHx8IDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBOYU47XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGVJbnB1dFR5cGUodHlwZSwgcmVnZXhwLCBwYXJzZURhdGUsIGZvcm1hdCkge1xuICByZXR1cm4gZnVuY3Rpb24gZHluYW1pY0RhdGVJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3NlciwgJGZpbHRlcikge1xuICAgIGJhZElucHV0Q2hlY2tlcihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCk7XG4gICAgYmFzZUlucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHNuaWZmZXIsICRicm93c2VyKTtcbiAgICB2YXIgdGltZXpvbmUgPSBjdHJsICYmIGN0cmwuJG9wdGlvbnMuZ2V0T3B0aW9uKCd0aW1lem9uZScpO1xuICAgIHZhciBwcmV2aW91c0RhdGU7XG5cbiAgICBjdHJsLiQkcGFyc2VyTmFtZSA9IHR5cGU7XG4gICAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBpZiAoY3RybC4kaXNFbXB0eSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHJlZ2V4cC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAvLyBOb3RlOiBXZSBjYW5ub3QgcmVhZCBjdHJsLiRtb2RlbFZhbHVlLCBhcyB0aGVyZSBtaWdodCBiZSBhIGRpZmZlcmVudFxuICAgICAgICAvLyBwYXJzZXIvZm9ybWF0dGVyIGluIHRoZSBwcm9jZXNzaW5nIGNoYWluIHNvIHRoYXQgdGhlIG1vZGVsXG4gICAgICAgIC8vIGNvbnRhaW5zIHNvbWUgZGlmZmVyZW50IGRhdGEgZm9ybWF0IVxuICAgICAgICB2YXIgcGFyc2VkRGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgcHJldmlvdXNEYXRlKTtcbiAgICAgICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAgICAgcGFyc2VkRGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwocGFyc2VkRGF0ZSwgdGltZXpvbmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIGN0cmwuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlICYmICFpc0RhdGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5nTW9kZWxNaW5FcnIoJ2RhdGVmbXQnLCAnRXhwZWN0ZWQgYHswfWAgdG8gYmUgYSBkYXRlJywgdmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHByZXZpb3VzRGF0ZSAmJiB0aW1lem9uZSkge1xuICAgICAgICAgIHByZXZpb3VzRGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwocHJldmlvdXNEYXRlLCB0aW1lem9uZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICRmaWx0ZXIoJ2RhdGUnKSh2YWx1ZSwgZm9ybWF0LCB0aW1lem9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2aW91c0RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNEZWZpbmVkKGF0dHIubWluKSB8fCBhdHRyLm5nTWluKSB7XG4gICAgICB2YXIgbWluVmFsO1xuICAgICAgY3RybC4kdmFsaWRhdG9ycy5taW4gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gIWlzVmFsaWREYXRlKHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHBhcnNlRGF0ZSh2YWx1ZSkgPj0gbWluVmFsO1xuICAgICAgfTtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ21pbicsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICBtaW5WYWwgPSBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCk7XG4gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNEZWZpbmVkKGF0dHIubWF4KSB8fCBhdHRyLm5nTWF4KSB7XG4gICAgICB2YXIgbWF4VmFsO1xuICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXggPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gIWlzVmFsaWREYXRlKHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtYXhWYWwpIHx8IHBhcnNlRGF0ZSh2YWx1ZSkgPD0gbWF4VmFsO1xuICAgICAgfTtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICBtYXhWYWwgPSBwYXJzZU9ic2VydmVkRGF0ZVZhbHVlKHZhbCk7XG4gICAgICAgIGN0cmwuJHZhbGlkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICAgICAgLy8gSW52YWxpZCBEYXRlOiBnZXRUaW1lKCkgcmV0dXJucyBOYU5cbiAgICAgIHJldHVybiB2YWx1ZSAmJiAhKHZhbHVlLmdldFRpbWUgJiYgdmFsdWUuZ2V0VGltZSgpICE9PSB2YWx1ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlT2JzZXJ2ZWREYXRlVmFsdWUodmFsKSB7XG4gICAgICByZXR1cm4gaXNEZWZpbmVkKHZhbCkgJiYgIWlzRGF0ZSh2YWwpID8gcGFyc2VEYXRlKHZhbCkgfHwgdW5kZWZpbmVkIDogdmFsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7XG4gIHZhciBub2RlID0gZWxlbWVudFswXTtcbiAgdmFyIG5hdGl2ZVZhbGlkYXRpb24gPSBjdHJsLiQkaGFzTmF0aXZlVmFsaWRhdG9ycyA9IGlzT2JqZWN0KG5vZGUudmFsaWRpdHkpO1xuICBpZiAobmF0aXZlVmFsaWRhdGlvbikge1xuICAgIGN0cmwuJHBhcnNlcnMucHVzaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIHZhbGlkaXR5ID0gZWxlbWVudC5wcm9wKFZBTElESVRZX1NUQVRFX1BST1BFUlRZKSB8fCB7fTtcbiAgICAgIHJldHVybiB2YWxpZGl0eS5iYWRJbnB1dCB8fCB2YWxpZGl0eS50eXBlTWlzbWF0Y2ggPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBudW1iZXJGb3JtYXR0ZXJQYXJzZXIoY3RybCkge1xuICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdudW1iZXInO1xuICBjdHJsLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoY3RybC4kaXNFbXB0eSh2YWx1ZSkpICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSkpIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9KTtcblxuICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoIWN0cmwuJGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZ01vZGVsTWluRXJyKCdudW1mbXQnLCAnRXhwZWN0ZWQgYHswfWAgdG8gYmUgYSBudW1iZXInLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyQXR0clZhbCh2YWwpIHtcbiAgaWYgKGlzRGVmaW5lZCh2YWwpICYmICFpc051bWJlcih2YWwpKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpO1xuICB9XG4gIHJldHVybiAhaXNOdW1iZXJOYU4odmFsKSA/IHZhbCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXJJbnRlZ2VyKG51bSkge1xuICAvLyBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDYzNjUzNi9ob3ctdG8tY2hlY2staWYtYS12YXJpYWJsZS1pcy1hbi1pbnRlZ2VyLWluLWphdmFzY3JpcHQjMTQ3OTQwNjZcbiAgLy8gKG1pbnVzIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG51bWAgaXMgYSBudW1iZXIpXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuIChudW0gfCAwKSA9PT0gbnVtO1xufVxuXG5mdW5jdGlvbiBjb3VudERlY2ltYWxzKG51bSkge1xuICB2YXIgbnVtU3RyaW5nID0gbnVtLnRvU3RyaW5nKCk7XG4gIHZhciBkZWNpbWFsU3ltYm9sSW5kZXggPSBudW1TdHJpbmcuaW5kZXhPZignLicpO1xuXG4gIGlmIChkZWNpbWFsU3ltYm9sSW5kZXggPT09IC0xKSB7XG4gICAgaWYgKC0xIDwgbnVtICYmIG51bSA8IDEpIHtcbiAgICAgIC8vIEl0IG1heSBiZSBpbiB0aGUgZXhwb25lbnRpYWwgbm90YXRpb24gZm9ybWF0IChgMWUtWGApXG4gICAgICB2YXIgbWF0Y2ggPSAvZS0oXFxkKykkLy5leGVjKG51bVN0cmluZyk7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiBudW1TdHJpbmcubGVuZ3RoIC0gZGVjaW1hbFN5bWJvbEluZGV4IC0gMTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEZvclN0ZXAodmlld1ZhbHVlLCBzdGVwQmFzZSwgc3RlcCkge1xuICAvLyBBdCB0aGlzIHBvaW50IGBzdGVwQmFzZWAgYW5kIGBzdGVwYCBhcmUgZXhwZWN0ZWQgdG8gYmUgbm9uLU5hTiB2YWx1ZXNcbiAgLy8gYW5kIGB2aWV3VmFsdWVgIGlzIGV4cGVjdGVkIHRvIGJlIGEgdmFsaWQgc3RyaW5naWZpZWQgbnVtYmVyLlxuICB2YXIgdmFsdWUgPSBOdW1iZXIodmlld1ZhbHVlKTtcblxuICAvLyBEdWUgdG8gbGltaXRhdGlvbnMgaW4gRmxvYXRpbmcgUG9pbnQgQXJpdGhtZXRpYyAoZS5nLiBgMC4zIC0gMC4yICE9PSAwLjFgIG9yXG4gIC8vIGAwLjUgJSAwLjEgIT09IDBgKSwgd2UgbmVlZCB0byBjb252ZXJ0IGFsbCBudW1iZXJzIHRvIGludGVnZXJzLlxuICBpZiAoIWlzTnVtYmVySW50ZWdlcih2YWx1ZSkgfHwgIWlzTnVtYmVySW50ZWdlcihzdGVwQmFzZSkgfHwgIWlzTnVtYmVySW50ZWdlcihzdGVwKSkge1xuICAgIHZhciBkZWNpbWFsQ291bnQgPSBNYXRoLm1heChjb3VudERlY2ltYWxzKHZhbHVlKSwgY291bnREZWNpbWFscyhzdGVwQmFzZSksIGNvdW50RGVjaW1hbHMoc3RlcCkpO1xuICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIGRlY2ltYWxDb3VudCk7XG5cbiAgICB2YWx1ZSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICBzdGVwQmFzZSA9IHN0ZXBCYXNlICogbXVsdGlwbGllcjtcbiAgICBzdGVwID0gc3RlcCAqIG11bHRpcGxpZXI7XG4gIH1cblxuICByZXR1cm4gKHZhbHVlIC0gc3RlcEJhc2UpICUgc3RlcCA9PT0gMDtcbn1cblxuZnVuY3Rpb24gbnVtYmVySW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTtcbiAgbnVtYmVyRm9ybWF0dGVyUGFyc2VyKGN0cmwpO1xuICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpO1xuXG4gIHZhciBtaW5WYWw7XG4gIHZhciBtYXhWYWw7XG5cbiAgaWYgKGlzRGVmaW5lZChhdHRyLm1pbikgfHwgYXR0ci5uZ01pbikge1xuICAgIGN0cmwuJHZhbGlkYXRvcnMubWluID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHZhbHVlID49IG1pblZhbDtcbiAgICB9O1xuXG4gICAgYXR0ci4kb2JzZXJ2ZSgnbWluJywgZnVuY3Rpb24odmFsKSB7XG4gICAgICBtaW5WYWwgPSBwYXJzZU51bWJlckF0dHJWYWwodmFsKTtcbiAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9uc1xuICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc0RlZmluZWQoYXR0ci5tYXgpIHx8IGF0dHIubmdNYXgpIHtcbiAgICBjdHJsLiR2YWxpZGF0b3JzLm1heCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgfHwgaXNVbmRlZmluZWQobWF4VmFsKSB8fCB2YWx1ZSA8PSBtYXhWYWw7XG4gICAgfTtcblxuICAgIGF0dHIuJG9ic2VydmUoJ21heCcsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgbWF4VmFsID0gcGFyc2VOdW1iZXJBdHRyVmFsKHZhbCk7XG4gICAgICAvLyBUT0RPKG1hdHNrbyk6IGltcGxlbWVudCB2YWxpZGF0ZUxhdGVyIHRvIHJlZHVjZSBudW1iZXIgb2YgdmFsaWRhdGlvbnNcbiAgICAgIGN0cmwuJHZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNEZWZpbmVkKGF0dHIuc3RlcCkgfHwgYXR0ci5uZ1N0ZXApIHtcbiAgICB2YXIgc3RlcFZhbDtcbiAgICBjdHJsLiR2YWxpZGF0b3JzLnN0ZXAgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgaXNVbmRlZmluZWQoc3RlcFZhbCkgfHxcbiAgICAgICAgICAgICBpc1ZhbGlkRm9yU3RlcCh2aWV3VmFsdWUsIG1pblZhbCB8fCAwLCBzdGVwVmFsKTtcbiAgICB9O1xuXG4gICAgYXR0ci4kb2JzZXJ2ZSgnc3RlcCcsIGZ1bmN0aW9uKHZhbCkge1xuICAgICAgc3RlcFZhbCA9IHBhcnNlTnVtYmVyQXR0clZhbCh2YWwpO1xuICAgICAgLy8gVE9ETyhtYXRza28pOiBpbXBsZW1lbnQgdmFsaWRhdGVMYXRlciB0byByZWR1Y2UgbnVtYmVyIG9mIHZhbGlkYXRpb25zXG4gICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJhbmdlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgYmFkSW5wdXRDaGVja2VyKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKTtcbiAgbnVtYmVyRm9ybWF0dGVyUGFyc2VyKGN0cmwpO1xuICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpO1xuXG4gIHZhciBzdXBwb3J0c1JhbmdlID0gY3RybC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMgJiYgZWxlbWVudFswXS50eXBlID09PSAncmFuZ2UnLFxuICAgICAgbWluVmFsID0gc3VwcG9ydHNSYW5nZSA/IDAgOiB1bmRlZmluZWQsXG4gICAgICBtYXhWYWwgPSBzdXBwb3J0c1JhbmdlID8gMTAwIDogdW5kZWZpbmVkLFxuICAgICAgc3RlcFZhbCA9IHN1cHBvcnRzUmFuZ2UgPyAxIDogdW5kZWZpbmVkLFxuICAgICAgdmFsaWRpdHkgPSBlbGVtZW50WzBdLnZhbGlkaXR5LFxuICAgICAgaGFzTWluQXR0ciA9IGlzRGVmaW5lZChhdHRyLm1pbiksXG4gICAgICBoYXNNYXhBdHRyID0gaXNEZWZpbmVkKGF0dHIubWF4KSxcbiAgICAgIGhhc1N0ZXBBdHRyID0gaXNEZWZpbmVkKGF0dHIuc3RlcCk7XG5cbiAgdmFyIG9yaWdpbmFsUmVuZGVyID0gY3RybC4kcmVuZGVyO1xuXG4gIGN0cmwuJHJlbmRlciA9IHN1cHBvcnRzUmFuZ2UgJiYgaXNEZWZpbmVkKHZhbGlkaXR5LnJhbmdlVW5kZXJmbG93KSAmJiBpc0RlZmluZWQodmFsaWRpdHkucmFuZ2VPdmVyZmxvdykgP1xuICAgIC8vQnJvd3NlcnMgdGhhdCBpbXBsZW1lbnQgcmFuZ2Ugd2lsbCBzZXQgdGhlc2UgdmFsdWVzIGF1dG9tYXRpY2FsbHksIGJ1dCByZWFkaW5nIHRoZSBhZGp1c3RlZCB2YWx1ZXMgYWZ0ZXJcbiAgICAvLyRyZW5kZXIgd291bGQgY2F1c2UgdGhlIG1pbiAvIG1heCB2YWxpZGF0b3JzIHRvIGJlIGFwcGxpZWQgd2l0aCB0aGUgd3JvbmcgdmFsdWVcbiAgICBmdW5jdGlvbiByYW5nZVJlbmRlcigpIHtcbiAgICAgIG9yaWdpbmFsUmVuZGVyKCk7XG4gICAgICBjdHJsLiRzZXRWaWV3VmFsdWUoZWxlbWVudC52YWwoKSk7XG4gICAgfSA6XG4gICAgb3JpZ2luYWxSZW5kZXI7XG5cbiAgaWYgKGhhc01pbkF0dHIpIHtcbiAgICBjdHJsLiR2YWxpZGF0b3JzLm1pbiA9IHN1cHBvcnRzUmFuZ2UgP1xuICAgICAgLy8gU2luY2UgYWxsIGJyb3dzZXJzIHNldCB0aGUgaW5wdXQgdG8gYSB2YWxpZCB2YWx1ZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB2YWxpZGl0eVxuICAgICAgZnVuY3Rpb24gbm9vcE1pblZhbGlkYXRvcigpIHsgcmV0dXJuIHRydWU7IH0gOlxuICAgICAgLy8gbm9uLXN1cHBvcnQgYnJvd3NlcnMgdmFsaWRhdGUgdGhlIG1pbiB2YWxcbiAgICAgIGZ1bmN0aW9uIG1pblZhbGlkYXRvcihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKSB8fCBpc1VuZGVmaW5lZChtaW5WYWwpIHx8IHZpZXdWYWx1ZSA+PSBtaW5WYWw7XG4gICAgICB9O1xuXG4gICAgc2V0SW5pdGlhbFZhbHVlQW5kT2JzZXJ2ZXIoJ21pbicsIG1pbkNoYW5nZSk7XG4gIH1cblxuICBpZiAoaGFzTWF4QXR0cikge1xuICAgIGN0cmwuJHZhbGlkYXRvcnMubWF4ID0gc3VwcG9ydHNSYW5nZSA/XG4gICAgICAvLyBTaW5jZSBhbGwgYnJvd3NlcnMgc2V0IHRoZSBpbnB1dCB0byBhIHZhbGlkIHZhbHVlLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHZhbGlkaXR5XG4gICAgICBmdW5jdGlvbiBub29wTWF4VmFsaWRhdG9yKCkgeyByZXR1cm4gdHJ1ZTsgfSA6XG4gICAgICAvLyBub24tc3VwcG9ydCBicm93c2VycyB2YWxpZGF0ZSB0aGUgbWF4IHZhbFxuICAgICAgZnVuY3Rpb24gbWF4VmFsaWRhdG9yKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2aWV3VmFsdWUpIHx8IGlzVW5kZWZpbmVkKG1heFZhbCkgfHwgdmlld1ZhbHVlIDw9IG1heFZhbDtcbiAgICAgIH07XG5cbiAgICBzZXRJbml0aWFsVmFsdWVBbmRPYnNlcnZlcignbWF4JywgbWF4Q2hhbmdlKTtcbiAgfVxuXG4gIGlmIChoYXNTdGVwQXR0cikge1xuICAgIGN0cmwuJHZhbGlkYXRvcnMuc3RlcCA9IHN1cHBvcnRzUmFuZ2UgP1xuICAgICAgZnVuY3Rpb24gbmF0aXZlU3RlcFZhbGlkYXRvcigpIHtcbiAgICAgICAgLy8gQ3VycmVudGx5LCBvbmx5IEZGIGltcGxlbWVudHMgdGhlIHNwZWMgb24gc3RlcCBjaGFuZ2UgY29ycmVjdGx5IChpLmUuIGFkanVzdGluZyB0aGVcbiAgICAgICAgLy8gaW5wdXQgZWxlbWVudCB2YWx1ZSB0byBhIHZhbGlkIHZhbHVlKS4gSXQncyBwb3NzaWJsZSB0aGF0IG90aGVyIGJyb3dzZXJzIHNldCB0aGUgc3RlcE1pc21hdGNoXG4gICAgICAgIC8vIHZhbGlkaXR5IGVycm9yIGluc3RlYWQsIHNvIHdlIGNhbiBhdCBsZWFzdCByZXBvcnQgYW4gZXJyb3IgaW4gdGhhdCBjYXNlLlxuICAgICAgICByZXR1cm4gIXZhbGlkaXR5LnN0ZXBNaXNtYXRjaDtcbiAgICAgIH0gOlxuICAgICAgLy8gbmdTdGVwIGRvZXNuJ3Qgc2V0IHRoZSBzZXRwIGF0dHIsIHNvIHRoZSBicm93c2VyIGRvZXNuJ3QgYWRqdXN0IHRoZSBpbnB1dCB2YWx1ZSBhcyBzZXR0aW5nIHN0ZXAgd291bGRcbiAgICAgIGZ1bmN0aW9uIHN0ZXBWYWxpZGF0b3IobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgaXNVbmRlZmluZWQoc3RlcFZhbCkgfHxcbiAgICAgICAgICAgICAgIGlzVmFsaWRGb3JTdGVwKHZpZXdWYWx1ZSwgbWluVmFsIHx8IDAsIHN0ZXBWYWwpO1xuICAgICAgfTtcblxuICAgIHNldEluaXRpYWxWYWx1ZUFuZE9ic2VydmVyKCdzdGVwJywgc3RlcENoYW5nZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbml0aWFsVmFsdWVBbmRPYnNlcnZlcihodG1sQXR0ck5hbWUsIGNoYW5nZUZuKSB7XG4gICAgLy8gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZXMgc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgb25seSBhZnRlciBhIGRpZ2VzdCwgYnV0IHdlIG5lZWQgdGhlXG4gICAgLy8gYXR0cmlidXRlIHZhbHVlIHdoZW4gdGhlIGlucHV0IGlzIGZpcnN0IHJlbmRlcmVkLCBzbyB0aGF0IHRoZSBicm93c2VyIGNhbiBhZGp1c3QgdGhlXG4gICAgLy8gaW5wdXQgdmFsdWUgYmFzZWQgb24gdGhlIG1pbi9tYXggdmFsdWVcbiAgICBlbGVtZW50LmF0dHIoaHRtbEF0dHJOYW1lLCBhdHRyW2h0bWxBdHRyTmFtZV0pO1xuICAgIGF0dHIuJG9ic2VydmUoaHRtbEF0dHJOYW1lLCBjaGFuZ2VGbik7XG4gIH1cblxuICBmdW5jdGlvbiBtaW5DaGFuZ2UodmFsKSB7XG4gICAgbWluVmFsID0gcGFyc2VOdW1iZXJBdHRyVmFsKHZhbCk7XG4gICAgLy8gaWdub3JlIGNoYW5nZXMgYmVmb3JlIG1vZGVsIGlzIGluaXRpYWxpemVkXG4gICAgaWYgKGlzTnVtYmVyTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvcnRzUmFuZ2UpIHtcbiAgICAgIHZhciBlbFZhbCA9IGVsZW1lbnQudmFsKCk7XG4gICAgICAvLyBJRTExIGRvZXNuJ3Qgc2V0IHRoZSBlbCB2YWwgY29ycmVjdGx5IGlmIHRoZSBtaW5WYWwgaXMgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50IHZhbHVlXG4gICAgICBpZiAobWluVmFsID4gZWxWYWwpIHtcbiAgICAgICAgZWxWYWwgPSBtaW5WYWw7XG4gICAgICAgIGVsZW1lbnQudmFsKGVsVmFsKTtcbiAgICAgIH1cbiAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbFZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9uc1xuICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYXhDaGFuZ2UodmFsKSB7XG4gICAgbWF4VmFsID0gcGFyc2VOdW1iZXJBdHRyVmFsKHZhbCk7XG4gICAgLy8gaWdub3JlIGNoYW5nZXMgYmVmb3JlIG1vZGVsIGlzIGluaXRpYWxpemVkXG4gICAgaWYgKGlzTnVtYmVyTmFOKGN0cmwuJG1vZGVsVmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvcnRzUmFuZ2UpIHtcbiAgICAgIHZhciBlbFZhbCA9IGVsZW1lbnQudmFsKCk7XG4gICAgICAvLyBJRTExIGRvZXNuJ3Qgc2V0IHRoZSBlbCB2YWwgY29ycmVjdGx5IGlmIHRoZSBtYXhWYWwgaXMgbGVzcyB0aGFuIHRoZSBlbGVtZW50IHZhbHVlXG4gICAgICBpZiAobWF4VmFsIDwgZWxWYWwpIHtcbiAgICAgICAgZWxlbWVudC52YWwobWF4VmFsKTtcbiAgICAgICAgLy8gSUUxMSBhbmQgQ2hyb21lIGRvbid0IHNldCB0aGUgdmFsdWUgdG8gdGhlIG1pblZhbCB3aGVuIG1heCA8IG1pblxuICAgICAgICBlbFZhbCA9IG1heFZhbCA8IG1pblZhbCA/IG1pblZhbCA6IG1heFZhbDtcbiAgICAgIH1cbiAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbFZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8obWF0c2tvKTogaW1wbGVtZW50IHZhbGlkYXRlTGF0ZXIgdG8gcmVkdWNlIG51bWJlciBvZiB2YWxpZGF0aW9uc1xuICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGVwQ2hhbmdlKHZhbCkge1xuICAgIHN0ZXBWYWwgPSBwYXJzZU51bWJlckF0dHJWYWwodmFsKTtcbiAgICAvLyBpZ25vcmUgY2hhbmdlcyBiZWZvcmUgbW9kZWwgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAoaXNOdW1iZXJOYU4oY3RybC4kbW9kZWxWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTb21lIGJyb3dzZXJzIGRvbid0IGFkanVzdCB0aGUgaW5wdXQgdmFsdWUgY29ycmVjdGx5LCBidXQgc2V0IHRoZSBzdGVwTWlzbWF0Y2ggZXJyb3JcbiAgICBpZiAoc3VwcG9ydHNSYW5nZSAmJiBjdHJsLiR2aWV3VmFsdWUgIT09IGVsZW1lbnQudmFsKCkpIHtcbiAgICAgIGN0cmwuJHNldFZpZXdWYWx1ZShlbGVtZW50LnZhbCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhtYXRza28pOiBpbXBsZW1lbnQgdmFsaWRhdGVMYXRlciB0byByZWR1Y2UgbnVtYmVyIG9mIHZhbGlkYXRpb25zXG4gICAgICBjdHJsLiR2YWxpZGF0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cmxJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcikge1xuICAvLyBOb3RlOiBubyBiYWRJbnB1dENoZWNrZXIgaGVyZSBieSBwdXJwb3NlIGFzIGB1cmxgIGlzIG9ubHkgYSB2YWxpZGF0aW9uXG4gIC8vIGluIGJyb3dzZXJzLCBpLmUuIHdlIGNhbiBhbHdheXMgcmVhZCBvdXQgaW5wdXQudmFsdWUgZXZlbiBpZiBpdCBpcyBub3QgdmFsaWQhXG4gIGJhc2VJbnB1dFR5cGUoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwsICRzbmlmZmVyLCAkYnJvd3Nlcik7XG4gIHN0cmluZ0Jhc2VkSW5wdXRUeXBlKGN0cmwpO1xuXG4gIGN0cmwuJCRwYXJzZXJOYW1lID0gJ3VybCc7XG4gIGN0cmwuJHZhbGlkYXRvcnMudXJsID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gICAgdmFyIHZhbHVlID0gbW9kZWxWYWx1ZSB8fCB2aWV3VmFsdWU7XG4gICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmFsdWUpIHx8IFVSTF9SRUdFWFAudGVzdCh2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtYWlsSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpIHtcbiAgLy8gTm90ZTogbm8gYmFkSW5wdXRDaGVja2VyIGhlcmUgYnkgcHVycG9zZSBhcyBgdXJsYCBpcyBvbmx5IGEgdmFsaWRhdGlvblxuICAvLyBpbiBicm93c2VycywgaS5lLiB3ZSBjYW4gYWx3YXlzIHJlYWQgb3V0IGlucHV0LnZhbHVlIGV2ZW4gaWYgaXQgaXMgbm90IHZhbGlkIVxuICBiYXNlSW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIpO1xuICBzdHJpbmdCYXNlZElucHV0VHlwZShjdHJsKTtcblxuICBjdHJsLiQkcGFyc2VyTmFtZSA9ICdlbWFpbCc7XG4gIGN0cmwuJHZhbGlkYXRvcnMuZW1haWwgPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBtb2RlbFZhbHVlIHx8IHZpZXdWYWx1ZTtcbiAgICByZXR1cm4gY3RybC4kaXNFbXB0eSh2YWx1ZSkgfHwgRU1BSUxfUkVHRVhQLnRlc3QodmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiByYWRpb0lucHV0VHlwZShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCkge1xuICB2YXIgZG9UcmltID0gIWF0dHIubmdUcmltIHx8IHRyaW0oYXR0ci5uZ1RyaW0pICE9PSAnZmFsc2UnO1xuICAvLyBtYWtlIHRoZSBuYW1lIHVuaXF1ZSwgaWYgbm90IGRlZmluZWRcbiAgaWYgKGlzVW5kZWZpbmVkKGF0dHIubmFtZSkpIHtcbiAgICBlbGVtZW50LmF0dHIoJ25hbWUnLCBuZXh0VWlkKCkpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICB2YXIgdmFsdWU7XG4gICAgaWYgKGVsZW1lbnRbMF0uY2hlY2tlZCkge1xuICAgICAgdmFsdWUgPSBhdHRyLnZhbHVlO1xuICAgICAgaWYgKGRvVHJpbSkge1xuICAgICAgICB2YWx1ZSA9IHRyaW0odmFsdWUpO1xuICAgICAgfVxuICAgICAgY3RybC4kc2V0Vmlld1ZhbHVlKHZhbHVlLCBldiAmJiBldi50eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgZWxlbWVudC5vbignY2xpY2snLCBsaXN0ZW5lcik7XG5cbiAgY3RybC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICBpZiAoZG9UcmltKSB7XG4gICAgICB2YWx1ZSA9IHRyaW0odmFsdWUpO1xuICAgIH1cbiAgICBlbGVtZW50WzBdLmNoZWNrZWQgPSAodmFsdWUgPT09IGN0cmwuJHZpZXdWYWx1ZSk7XG4gIH07XG5cbiAgYXR0ci4kb2JzZXJ2ZSgndmFsdWUnLCBjdHJsLiRyZW5kZXIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvbnN0YW50RXhwcigkcGFyc2UsIGNvbnRleHQsIG5hbWUsIGV4cHJlc3Npb24sIGZhbGxiYWNrKSB7XG4gIHZhciBwYXJzZUZuO1xuICBpZiAoaXNEZWZpbmVkKGV4cHJlc3Npb24pKSB7XG4gICAgcGFyc2VGbiA9ICRwYXJzZShleHByZXNzaW9uKTtcbiAgICBpZiAoIXBhcnNlRm4uY29uc3RhbnQpIHtcbiAgICAgIHRocm93IG5nTW9kZWxNaW5FcnIoJ2NvbnN0ZXhwcicsICdFeHBlY3RlZCBjb25zdGFudCBleHByZXNzaW9uIGZvciBgezB9YCwgYnV0IHNhdyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2B7MX1gLicsIG5hbWUsIGV4cHJlc3Npb24pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbihjb250ZXh0KTtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGNoZWNrYm94SW5wdXRUeXBlKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsLCAkc25pZmZlciwgJGJyb3dzZXIsICRmaWx0ZXIsICRwYXJzZSkge1xuICB2YXIgdHJ1ZVZhbHVlID0gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBzY29wZSwgJ25nVHJ1ZVZhbHVlJywgYXR0ci5uZ1RydWVWYWx1ZSwgdHJ1ZSk7XG4gIHZhciBmYWxzZVZhbHVlID0gcGFyc2VDb25zdGFudEV4cHIoJHBhcnNlLCBzY29wZSwgJ25nRmFsc2VWYWx1ZScsIGF0dHIubmdGYWxzZVZhbHVlLCBmYWxzZSk7XG5cbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZXYpIHtcbiAgICBjdHJsLiRzZXRWaWV3VmFsdWUoZWxlbWVudFswXS5jaGVja2VkLCBldiAmJiBldi50eXBlKTtcbiAgfTtcblxuICBlbGVtZW50Lm9uKCdjbGljaycsIGxpc3RlbmVyKTtcblxuICBjdHJsLiRyZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICBlbGVtZW50WzBdLmNoZWNrZWQgPSBjdHJsLiR2aWV3VmFsdWU7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGAkaXNFbXB0eWAgYmVjYXVzZSB0aGUgJHZpZXdWYWx1ZSBvZiBhbiBlbXB0eSBjaGVja2JveCBpcyBhbHdheXMgc2V0IHRvIGBmYWxzZWBcbiAgLy8gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBwYXJzZXIgYmVsb3csIHdoaWNoIGNvbXBhcmVzIHRoZSBgJG1vZGVsVmFsdWVgIHdpdGggYHRydWVWYWx1ZWAgdG8gY29udmVydFxuICAvLyBpdCB0byBhIGJvb2xlYW4uXG4gIGN0cmwuJGlzRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7XG4gIH07XG5cbiAgY3RybC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVxdWFscyh2YWx1ZSwgdHJ1ZVZhbHVlKTtcbiAgfSk7XG5cbiAgY3RybC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gdHJ1ZVZhbHVlIDogZmFsc2VWYWx1ZTtcbiAgfSk7XG59XG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSB0ZXh0YXJlYVxuICogQHJlc3RyaWN0IEVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhUTUwgdGV4dGFyZWEgZWxlbWVudCBjb250cm9sIHdpdGggYW5ndWxhciBkYXRhLWJpbmRpbmcuIFRoZSBkYXRhLWJpbmRpbmcgYW5kIHZhbGlkYXRpb25cbiAqIHByb3BlcnRpZXMgb2YgdGhpcyBlbGVtZW50IGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRob3NlIG9mIHRoZVxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTppbnB1dCBpbnB1dCBlbGVtZW50fS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBhbmQgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGNvbnN0cmFpbnQgdG9cbiAqICAgIHRoZSBlbGVtZW50IHdoZW4gdGhlIG5nUmVxdWlyZWQgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gVXNlIGBuZ1JlcXVpcmVkYCBpbnN0ZWFkIG9mXG4gKiAgICBgcmVxdWlyZWRgIHdoZW4geW91IHdhbnQgdG8gZGF0YS1iaW5kIHRvIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNaW5sZW5ndGggU2V0cyBgbWlubGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgc2hvcnRlciB0aGFuXG4gKiAgICBtaW5sZW5ndGguXG4gKiBAcGFyYW0ge251bWJlcj19IG5nTWF4bGVuZ3RoIFNldHMgYG1heGxlbmd0aGAgdmFsaWRhdGlvbiBlcnJvciBrZXkgaWYgdGhlIHZhbHVlIGlzIGxvbmdlciB0aGFuXG4gKiAgICBtYXhsZW5ndGguIFNldHRpbmcgdGhlIGF0dHJpYnV0ZSB0byBhIG5lZ2F0aXZlIG9yIG5vbi1udW1lcmljIHZhbHVlLCBhbGxvd3MgdmlldyB2YWx1ZXMgb2YgYW55XG4gKiAgICBsZW5ndGguXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nUGF0dGVybiBTZXRzIGBwYXR0ZXJuYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgbmdNb2RlbCB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlICR2aWV3VmFsdWV9XG4gKiAgICBkb2VzIG5vdCBtYXRjaCBhIFJlZ0V4cCBmb3VuZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqICAgIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgc3RyaW5nLCB0aGVuIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgUmVnRXhwXG4gKiAgICBhZnRlciB3cmFwcGluZyBpdCBpbiBgXmAgYW5kIGAkYCBjaGFyYWN0ZXJzLiBGb3IgaW5zdGFuY2UsIGBcImFiY1wiYCB3aWxsIGJlIGNvbnZlcnRlZCB0b1xuICogICAgYG5ldyBSZWdFeHAoJ15hYmMkJylgLjxiciAvPlxuICogICAgKipOb3RlOioqIEF2b2lkIHVzaW5nIHRoZSBgZ2AgZmxhZyBvbiB0aGUgUmVnRXhwLCBhcyBpdCB3aWxsIGNhdXNlIGVhY2ggc3VjY2Vzc2l2ZSBzZWFyY2ggdG9cbiAqICAgIHN0YXJ0IGF0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZWFyY2gncyBtYXRjaCwgdGh1cyBub3QgdGFraW5nIHRoZSB3aG9sZSBpbnB1dCB2YWx1ZSBpbnRvXG4gKiAgICBhY2NvdW50LlxuICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBpbnB1dCBjaGFuZ2VzIGR1ZSB0byB1c2VyXG4gKiAgICBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnB1dCBlbGVtZW50LlxuICogQHBhcmFtIHtib29sZWFuPX0gW25nVHJpbT10cnVlXSBJZiBzZXQgdG8gZmFsc2UgQW5ndWxhciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHRyaW0gdGhlIGlucHV0LlxuICpcbiAqIEBrbm93bklzc3VlXG4gKlxuICogV2hlbiBzcGVjaWZ5aW5nIHRoZSBgcGxhY2Vob2xkZXJgIGF0dHJpYnV0ZSBvZiBgPHRleHRhcmVhPmAsIEludGVybmV0IEV4cGxvcmVyIHdpbGwgdGVtcG9yYXJpbHlcbiAqIGluc2VydCB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgYXMgdGhlIHRleHRhcmVhJ3MgY29udGVudC4gSWYgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGNvbnRhaW5zXG4gKiBpbnRlcnBvbGF0aW9uIChge3sgLi4uIH19YCksIGFuIGVycm9yIHdpbGwgYmUgbG9nZ2VkIGluIHRoZSBjb25zb2xlIHdoZW4gQW5ndWxhciB0cmllcyB0byB1cGRhdGVcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYnktdGhlbi1yZW1vdmVkIHRleHQgbm9kZS4gVGhpcyBkb2Vzbid0IGFmZmVjdCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGVcbiAqIHRleHRhcmVhLCBidXQgY2FuIGJlIHVuZGVzaXJhYmxlLlxuICpcbiAqIFlvdSBjYW4gd29yayBhcm91bmQgdGhpcyBJbnRlcm5ldCBFeHBsb3JlciBpc3N1ZSBieSB1c2luZyBgbmctYXR0ci1wbGFjZWhvbGRlcmAgaW5zdGVhZCBvZlxuICogYHBsYWNlaG9sZGVyYCBvbiB0ZXh0YXJlYXMsIHdoZW5ldmVyIHlvdSBuZWVkIGludGVycG9sYXRpb24gaW4gdGhlIHBsYWNlaG9sZGVyIHZhbHVlLiBZb3UgY2FuXG4gKiBmaW5kIG1vcmUgZGV0YWlscyBvbiBgbmdBdHRyYCBpbiB0aGVcbiAqIFtJbnRlcnBvbGF0aW9uXShndWlkZS9pbnRlcnBvbGF0aW9uIy1uZ2F0dHItZm9yLWJpbmRpbmctdG8tYXJiaXRyYXJ5LWF0dHJpYnV0ZXMpIHNlY3Rpb24gb2YgdGhlXG4gKiBEZXZlbG9wZXIgR3VpZGUuXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIGlucHV0XG4gKiBAcmVzdHJpY3QgRVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSFRNTCBpbnB1dCBlbGVtZW50IGNvbnRyb2wuIFdoZW4gdXNlZCB0b2dldGhlciB3aXRoIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0sIGl0IHByb3ZpZGVzIGRhdGEtYmluZGluZyxcbiAqIGlucHV0IHN0YXRlIGNvbnRyb2wsIGFuZCB2YWxpZGF0aW9uLlxuICogSW5wdXQgY29udHJvbCBmb2xsb3dzIEhUTUw1IGlucHV0IHR5cGVzIGFuZCBwb2x5ZmlsbHMgdGhlIEhUTUw1IHZhbGlkYXRpb24gYmVoYXZpb3IgZm9yIG9sZGVyIGJyb3dzZXJzLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAqKk5vdGU6KiogTm90IGV2ZXJ5IGZlYXR1cmUgb2ZmZXJlZCBpcyBhdmFpbGFibGUgZm9yIGFsbCBpbnB1dCB0eXBlcy5cbiAqIFNwZWNpZmljYWxseSwgZGF0YSBiaW5kaW5nIGFuZCBldmVudCBoYW5kbGluZyB2aWEgYG5nLW1vZGVsYCBpcyB1bnN1cHBvcnRlZCBmb3IgYGlucHV0W2ZpbGVdYC5cbiAqIDwvZGl2PlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ01vZGVsIEFzc2lnbmFibGUgYW5ndWxhciBleHByZXNzaW9uIHRvIGRhdGEtYmluZCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBQcm9wZXJ0eSBuYW1lIG9mIHRoZSBmb3JtIHVuZGVyIHdoaWNoIHRoZSBjb250cm9sIGlzIHB1Ymxpc2hlZC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gcmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBub3QgZW50ZXJlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IG5nUmVxdWlyZWQgU2V0cyBgcmVxdWlyZWRgIGF0dHJpYnV0ZSBpZiBzZXQgdG8gdHJ1ZVxuICogQHBhcmFtIHtudW1iZXI9fSBuZ01pbmxlbmd0aCBTZXRzIGBtaW5sZW5ndGhgIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSB2YWx1ZSBpcyBzaG9ydGVyIHRoYW5cbiAqICAgIG1pbmxlbmd0aC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gbmdNYXhsZW5ndGggU2V0cyBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbG9uZ2VyIHRoYW5cbiAqICAgIG1heGxlbmd0aC4gU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvIGEgbmVnYXRpdmUgb3Igbm9uLW51bWVyaWMgdmFsdWUsIGFsbG93cyB2aWV3IHZhbHVlcyBvZiBhbnlcbiAqICAgIGxlbmd0aC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmdQYXR0ZXJuIFNldHMgYHBhdHRlcm5gIHZhbGlkYXRpb24gZXJyb3Iga2V5IGlmIHRoZSBuZ01vZGVsIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgJHZpZXdWYWx1ZX1cbiAqICAgIHZhbHVlIGRvZXMgbm90IG1hdGNoIGEgUmVnRXhwIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYXR0cmlidXRlIHZhbHVlLlxuICogICAgSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgUmVnRXhwIG9iamVjdCwgdGhlbiB0aGlzIGlzIHVzZWQgZGlyZWN0bHkuXG4gKiAgICBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHBcbiAqICAgIGFmdGVyIHdyYXBwaW5nIGl0IGluIGBeYCBhbmQgYCRgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYFwiYWJjXCJgIHdpbGwgYmUgY29udmVydGVkIHRvXG4gKiAgICBgbmV3IFJlZ0V4cCgnXmFiYyQnKWAuPGJyIC8+XG4gKiAgICAqKk5vdGU6KiogQXZvaWQgdXNpbmcgdGhlIGBnYCBmbGFnIG9uIHRoZSBSZWdFeHAsIGFzIGl0IHdpbGwgY2F1c2UgZWFjaCBzdWNjZXNzaXZlIHNlYXJjaCB0b1xuICogICAgc3RhcnQgYXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNlYXJjaCdzIG1hdGNoLCB0aHVzIG5vdCB0YWtpbmcgdGhlIHdob2xlIGlucHV0IHZhbHVlIGludG9cbiAqICAgIGFjY291bnQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nQ2hhbmdlIEFuZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSBleGVjdXRlZCB3aGVuIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXJcbiAqICAgIGludGVyYWN0aW9uIHdpdGggdGhlIGlucHV0IGVsZW1lbnQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbbmdUcmltPXRydWVdIElmIHNldCB0byBmYWxzZSBBbmd1bGFyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgdHJpbSB0aGUgaW5wdXQuXG4gKiAgICBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciBpbnB1dFt0eXBlPXBhc3N3b3JkXSBjb250cm9scywgd2hpY2ggd2lsbCBuZXZlciB0cmltIHRoZVxuICogICAgaW5wdXQuXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwiaW5wdXQtZGlyZWN0aXZlXCIgbW9kdWxlPVwiaW5wdXRFeGFtcGxlXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2lucHV0RXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLnVzZXIgPSB7bmFtZTogJ2d1ZXN0JywgbGFzdDogJ3Zpc2l0b3InfTtcbiAgICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgIFVzZXIgbmFtZTpcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJOYW1lXCIgbmctbW9kZWw9XCJ1c2VyLm5hbWVcIiByZXF1aXJlZD5cbiAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS51c2VyTmFtZS4kZXJyb3IucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICBMYXN0IG5hbWU6XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJsYXN0TmFtZVwiIG5nLW1vZGVsPVwidXNlci5sYXN0XCJcbiAgICAgICAgICAgICAgbmctbWlubGVuZ3RoPVwiM1wiIG5nLW1heGxlbmd0aD1cIjEwXCI+XG4gICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiIG5nLXNob3c9XCJteUZvcm0ubGFzdE5hbWUuJGVycm9yLm1pbmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgVG9vIHNob3J0ITwvc3Bhbj5cbiAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCIgbmctc2hvdz1cIm15Rm9ybS5sYXN0TmFtZS4kZXJyb3IubWF4bGVuZ3RoXCI+XG4gICAgICAgICAgICAgICBUb28gbG9uZyE8L3NwYW4+XG4gICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgPGhyPlxuICAgICAgICAgPHR0PnVzZXIgPSB7e3VzZXJ9fTwvdHQ+PGJyLz5cbiAgICAgICAgIDx0dD5teUZvcm0udXNlck5hbWUuJHZhbGlkID0ge3tteUZvcm0udXNlck5hbWUuJHZhbGlkfX08L3R0Pjxici8+XG4gICAgICAgICA8dHQ+bXlGb3JtLnVzZXJOYW1lLiRlcnJvciA9IHt7bXlGb3JtLnVzZXJOYW1lLiRlcnJvcn19PC90dD48YnIvPlxuICAgICAgICAgPHR0Pm15Rm9ybS5sYXN0TmFtZS4kdmFsaWQgPSB7e215Rm9ybS5sYXN0TmFtZS4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAgICAgICAgIDx0dD5teUZvcm0ubGFzdE5hbWUuJGVycm9yID0ge3tteUZvcm0ubGFzdE5hbWUuJGVycm9yfX08L3R0Pjxici8+XG4gICAgICAgICA8dHQ+bXlGb3JtLiR2YWxpZCA9IHt7bXlGb3JtLiR2YWxpZH19PC90dD48YnIvPlxuICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IucmVxdWlyZWQgPSB7eyEhbXlGb3JtLiRlcnJvci5yZXF1aXJlZH19PC90dD48YnIvPlxuICAgICAgICAgPHR0Pm15Rm9ybS4kZXJyb3IubWlubGVuZ3RoID0ge3shIW15Rm9ybS4kZXJyb3IubWlubGVuZ3RofX08L3R0Pjxici8+XG4gICAgICAgICA8dHQ+bXlGb3JtLiRlcnJvci5tYXhsZW5ndGggPSB7eyEhbXlGb3JtLiRlcnJvci5tYXhsZW5ndGh9fTwvdHQ+PGJyLz5cbiAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgdmFyIHVzZXIgPSBlbGVtZW50KGJ5LmV4YWN0QmluZGluZygndXNlcicpKTtcbiAgICAgICAgdmFyIHVzZXJOYW1lVmFsaWQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ215Rm9ybS51c2VyTmFtZS4kdmFsaWQnKSk7XG4gICAgICAgIHZhciBsYXN0TmFtZVZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0ubGFzdE5hbWUuJHZhbGlkJykpO1xuICAgICAgICB2YXIgbGFzdE5hbWVFcnJvciA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLmxhc3ROYW1lLiRlcnJvcicpKTtcbiAgICAgICAgdmFyIGZvcm1WYWxpZCA9IGVsZW1lbnQoYnkuYmluZGluZygnbXlGb3JtLiR2YWxpZCcpKTtcbiAgICAgICAgdmFyIHVzZXJOYW1lSW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLm5hbWUnKSk7XG4gICAgICAgIHZhciB1c2VyTGFzdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgndXNlci5sYXN0JykpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7XCJuYW1lXCI6XCJndWVzdFwiLFwibGFzdFwiOlwidmlzaXRvclwifScpO1xuICAgICAgICAgIGV4cGVjdCh1c2VyTmFtZVZhbGlkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGJlIGludmFsaWQgaWYgZW1wdHkgd2hlbiByZXF1aXJlZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHVzZXJOYW1lSW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICB1c2VyTmFtZUlucHV0LnNlbmRLZXlzKCcnKTtcblxuICAgICAgICAgIGV4cGVjdCh1c2VyLmdldFRleHQoKSkudG9Db250YWluKCd7XCJsYXN0XCI6XCJ2aXNpdG9yXCJ9Jyk7XG4gICAgICAgICAgZXhwZWN0KHVzZXJOYW1lVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSB2YWxpZCBpZiBlbXB0eSB3aGVuIG1pbiBsZW5ndGggaXMgc2V0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIHVzZXJMYXN0SW5wdXQuc2VuZEtleXMoJycpO1xuXG4gICAgICAgICAgZXhwZWN0KHVzZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3tcIm5hbWVcIjpcImd1ZXN0XCIsXCJsYXN0XCI6XCJcIn0nKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbigndHJ1ZScpO1xuICAgICAgICAgIGV4cGVjdChmb3JtVmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGxlc3MgdGhhbiByZXF1aXJlZCBtaW4gbGVuZ3RoJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdXNlckxhc3RJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIHVzZXJMYXN0SW5wdXQuc2VuZEtleXMoJ3h4Jyk7XG5cbiAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigne1wibmFtZVwiOlwiZ3Vlc3RcIn0nKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVFcnJvci5nZXRUZXh0KCkpLnRvQ29udGFpbignbWlubGVuZ3RoJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBiZSBpbnZhbGlkIGlmIGxvbmdlciB0aGFuIG1heCBsZW5ndGgnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB1c2VyTGFzdElucHV0LmNsZWFyKCk7XG4gICAgICAgICAgdXNlckxhc3RJbnB1dC5zZW5kS2V5cygnc29tZSByaWRpY3Vsb3VzbHkgbG9uZyBuYW1lJyk7XG5cbiAgICAgICAgICBleHBlY3QodXNlci5nZXRUZXh0KCkpLnRvQ29udGFpbigne1wibmFtZVwiOlwiZ3Vlc3RcIn0nKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVWYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgICBleHBlY3QobGFzdE5hbWVFcnJvci5nZXRUZXh0KCkpLnRvQ29udGFpbignbWF4bGVuZ3RoJyk7XG4gICAgICAgICAgZXhwZWN0KGZvcm1WYWxpZC5nZXRUZXh0KCkpLnRvQ29udGFpbignZmFsc2UnKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICovXG52YXIgaW5wdXREaXJlY3RpdmUgPSBbJyRicm93c2VyJywgJyRzbmlmZmVyJywgJyRmaWx0ZXInLCAnJHBhcnNlJyxcbiAgICBmdW5jdGlvbigkYnJvd3NlciwgJHNuaWZmZXIsICRmaWx0ZXIsICRwYXJzZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRScsXG4gICAgcmVxdWlyZTogWyc/bmdNb2RlbCddLFxuICAgIGxpbms6IHtcbiAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7XG4gICAgICAgIGlmIChjdHJsc1swXSkge1xuICAgICAgICAgIChpbnB1dFR5cGVbbG93ZXJjYXNlKGF0dHIudHlwZSldIHx8IGlucHV0VHlwZS50ZXh0KShzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybHNbMF0sICRzbmlmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnJvd3NlciwgJGZpbHRlciwgJHBhcnNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1dO1xuXG5cblxudmFyIENPTlNUQU5UX1ZBTFVFX1JFR0VYUCA9IC9eKHRydWV8ZmFsc2V8XFxkKykkLztcbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdWYWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQmluZHMgdGhlIGdpdmVuIGV4cHJlc3Npb24gdG8gdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEl0IGlzIG1haW5seSB1c2VkIG9uIHtAbGluayBpbnB1dFtyYWRpb10gYGlucHV0W3JhZGlvXWB9IGFuZCBvcHRpb24gZWxlbWVudHMsXG4gKiBzbyB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHRoZSB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9IG9mIHRoYXQgZWxlbWVudCAob3IgaXRzXG4gKiB7QGxpbmsgc2VsZWN0IGBzZWxlY3RgfSBwYXJlbnQgZWxlbWVudCkgaXMgc2V0IHRvIHRoZSBib3VuZCB2YWx1ZS4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWxcbiAqIGZvciBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbGlzdHMgdXNpbmcge0BsaW5rIG5nUmVwZWF0IGBuZ1JlcGVhdGB9LCBhcyBzaG93biBiZWxvdy5cbiAqXG4gKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFjaGlldmUgb25lLXdheSBiaW5kaW5nIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbiB0byBhbiBpbnB1dCBlbGVtZW50XG4gKiBzdWNoIGFzIGFuIGBpbnB1dFt0ZXh0XWAgb3IgYSBgdGV4dGFyZWFgLCB3aGVuIHRoYXQgZWxlbWVudCBkb2VzIG5vdCB1c2UgbmdNb2RlbC5cbiAqXG4gKiBAZWxlbWVudCBpbnB1dFxuICogQHBhcmFtIHtzdHJpbmc9fSBuZ1ZhbHVlIGFuZ3VsYXIgZXhwcmVzc2lvbiwgd2hvc2UgdmFsdWUgd2lsbCBiZSBib3VuZCB0byB0aGUgYHZhbHVlYCBhdHRyaWJ1dGVcbiAqIGFuZCBgdmFsdWVgIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbmFtZT1cIm5nVmFsdWUtZGlyZWN0aXZlXCIgbW9kdWxlPVwidmFsdWVFeGFtcGxlXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3ZhbHVlRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgICAgJHNjb3BlLm5hbWVzID0gWydwaXp6YScsICd1bmljb3JucycsICdyb2JvdHMnXTtcbiAgICAgICAgICAgICAgJHNjb3BlLm15ID0geyBmYXZvcml0ZTogJ3VuaWNvcm5zJyB9O1xuICAgICAgICAgICAgfV0pO1xuICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8Zm9ybSBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICA8aDI+V2hpY2ggaXMgeW91ciBmYXZvcml0ZT88L2gyPlxuICAgICAgICAgICAgPGxhYmVsIG5nLXJlcGVhdD1cIm5hbWUgaW4gbmFtZXNcIiBmb3I9XCJ7e25hbWV9fVwiPlxuICAgICAgICAgICAgICB7e25hbWV9fVxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsPVwibXkuZmF2b3JpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgbmctdmFsdWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tuYW1lfX1cIlxuICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImZhdm9yaXRlXCI+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXY+WW91IGNob3NlIHt7bXkuZmF2b3JpdGV9fTwvZGl2PlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2ZpbGU+XG4gICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgIHZhciBmYXZvcml0ZSA9IGVsZW1lbnQoYnkuYmluZGluZygnbXkuZmF2b3JpdGUnKSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZXhwZWN0KGZhdm9yaXRlLmdldFRleHQoKSkudG9Db250YWluKCd1bmljb3JucycpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBiaW5kIHRoZSB2YWx1ZXMgdG8gdGhlIGlucHV0cycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5Lm1vZGVsKCdteS5mYXZvcml0ZScpKS5nZXQoMCkuY2xpY2soKTtcbiAgICAgICAgICBleHBlY3QoZmF2b3JpdGUuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3BpenphJyk7XG4gICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nVmFsdWVEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgLyoqXG4gICAqICBpbnB1dHMgdXNlIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgYXMgdGhlaXIgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgcHJvcGVydHkgaXMgbm90IHNldC5cbiAgICogIE9uY2UgdGhlIHZhbHVlIHByb3BlcnR5IGhhcyBiZWVuIHNldCAoYnkgYWRkaW5nIGlucHV0KSwgaXQgd2lsbCBub3QgcmVhY3QgdG8gY2hhbmdlcyB0b1xuICAgKiAgdGhlIHZhbHVlIGF0dHJpYnV0ZSBhbnltb3JlLiBTZXR0aW5nIGJvdGggYXR0cmlidXRlIGFuZCBwcm9wZXJ0eSBmaXhlcyB0aGlzIGJlaGF2aW9yLCBhbmRcbiAgICogIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBuZ1ZhbHVlIGFzIGEgc29ydCBvZiBvbmUtd2F5IGJpbmQuXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50VmFsdWUoZWxlbWVudCwgYXR0ciwgdmFsdWUpIHtcbiAgICBlbGVtZW50LnByb3AoJ3ZhbHVlJywgdmFsdWUpO1xuICAgIGF0dHIuJHNldCgndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcHJpb3JpdHk6IDEwMCxcbiAgICBjb21waWxlOiBmdW5jdGlvbih0cGwsIHRwbEF0dHIpIHtcbiAgICAgIGlmIChDT05TVEFOVF9WQUxVRV9SRUdFWFAudGVzdCh0cGxBdHRyLm5nVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlQ29uc3RhbnRMaW5rKHNjb3BlLCBlbG0sIGF0dHIpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBzY29wZS4kZXZhbChhdHRyLm5nVmFsdWUpO1xuICAgICAgICAgIHVwZGF0ZUVsZW1lbnRWYWx1ZShlbG0sIGF0dHIsIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1ZhbHVlTGluayhzY29wZSwgZWxtLCBhdHRyKSB7XG4gICAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHIubmdWYWx1ZSwgZnVuY3Rpb24gdmFsdWVXYXRjaEFjdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdXBkYXRlRWxlbWVudFZhbHVlKGVsbSwgYXR0ciwgdmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdCaW5kXG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdCaW5kYCBhdHRyaWJ1dGUgdGVsbHMgQW5ndWxhciB0byByZXBsYWNlIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBIVE1MIGVsZW1lbnRcbiAqIHdpdGggdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbiwgYW5kIHRvIHVwZGF0ZSB0aGUgdGV4dCBjb250ZW50IHdoZW4gdGhlIHZhbHVlIG9mIHRoYXRcbiAqIGV4cHJlc3Npb24gY2hhbmdlcy5cbiAqXG4gKiBUeXBpY2FsbHksIHlvdSBkb24ndCB1c2UgYG5nQmluZGAgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIHlvdSB1c2UgdGhlIGRvdWJsZSBjdXJseSBtYXJrdXAgbGlrZVxuICogYHt7IGV4cHJlc3Npb24gfX1gIHdoaWNoIGlzIHNpbWlsYXIgYnV0IGxlc3MgdmVyYm9zZS5cbiAqXG4gKiBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSBgbmdCaW5kYCBpbnN0ZWFkIG9mIGB7eyBleHByZXNzaW9uIH19YCBpZiBhIHRlbXBsYXRlIGlzIG1vbWVudGFyaWx5XG4gKiBkaXNwbGF5ZWQgYnkgdGhlIGJyb3dzZXIgaW4gaXRzIHJhdyBzdGF0ZSBiZWZvcmUgQW5ndWxhciBjb21waWxlcyBpdC4gU2luY2UgYG5nQmluZGAgaXMgYW5cbiAqIGVsZW1lbnQgYXR0cmlidXRlLCBpdCBtYWtlcyB0aGUgYmluZGluZ3MgaW52aXNpYmxlIHRvIHRoZSB1c2VyIHdoaWxlIHRoZSBwYWdlIGlzIGxvYWRpbmcuXG4gKlxuICogQW4gYWx0ZXJuYXRpdmUgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHVzaW5nIHRoZVxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0Nsb2FrIG5nQ2xvYWt9IGRpcmVjdGl2ZS5cbiAqXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQmluZCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRW50ZXIgYSBuYW1lIGluIHRoZSBMaXZlIFByZXZpZXcgdGV4dCBib3g7IHRoZSBncmVldGluZyBiZWxvdyB0aGUgdGV4dCBib3ggY2hhbmdlcyBpbnN0YW50bHkuXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJiaW5kRXhhbXBsZVwiIG5hbWU9XCJuZy1iaW5kXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdiaW5kRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS5uYW1lID0gJ1doaXJsZWQnO1xuICAgICAgICAgICB9XSk7XG4gICAgICAgPC9zY3JpcHQ+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxsYWJlbD5FbnRlciBuYW1lOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm5hbWVcIj48L2xhYmVsPjxicj5cbiAgICAgICAgIEhlbGxvIDxzcGFuIG5nLWJpbmQ9XCJuYW1lXCI+PC9zcGFuPiFcbiAgICAgICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1iaW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICB2YXIgbmFtZUlucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbmFtZScpKTtcblxuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbmFtZScpKS5nZXRUZXh0KCkpLnRvQmUoJ1doaXJsZWQnKTtcbiAgICAgICAgIG5hbWVJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbmFtZUlucHV0LnNlbmRLZXlzKCd3b3JsZCcpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbmFtZScpKS5nZXRUZXh0KCkpLnRvQmUoJ3dvcmxkJyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nQmluZERpcmVjdGl2ZSA9IFsnJGNvbXBpbGUnLCBmdW5jdGlvbigkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQUMnLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZENvbXBpbGUodGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAkY29tcGlsZS4kJGFkZEJpbmRpbmdDbGFzcyh0ZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nQmluZExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZCk7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdO1xuICAgICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZ0JpbmQsIGZ1bmN0aW9uIG5nQmluZFdhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQmluZFRlbXBsYXRlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nQmluZFRlbXBsYXRlYCBkaXJlY3RpdmUgc3BlY2lmaWVzIHRoYXQgdGhlIGVsZW1lbnRcbiAqIHRleHQgY29udGVudCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgaW50ZXJwb2xhdGlvbiBvZiB0aGUgdGVtcGxhdGVcbiAqIGluIHRoZSBgbmdCaW5kVGVtcGxhdGVgIGF0dHJpYnV0ZS5cbiAqIFVubGlrZSBgbmdCaW5kYCwgdGhlIGBuZ0JpbmRUZW1wbGF0ZWAgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYHt7YCBgfX1gXG4gKiBleHByZXNzaW9ucy4gVGhpcyBkaXJlY3RpdmUgaXMgbmVlZGVkIHNpbmNlIHNvbWUgSFRNTCBlbGVtZW50c1xuICogKHN1Y2ggYXMgVElUTEUgYW5kIE9QVElPTikgY2Fubm90IGNvbnRhaW4gU1BBTiBlbGVtZW50cy5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZ0JpbmRUZW1wbGF0ZSB0ZW1wbGF0ZSBvZiBmb3JtXG4gKiAgIDx0dD57ezwvdHQ+IDx0dD5leHByZXNzaW9uPC90dD4gPHR0Pn19PC90dD4gdG8gZXZhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogVHJ5IGl0IGhlcmU6IGVudGVyIHRleHQgaW4gdGV4dCBib3ggYW5kIHdhdGNoIHRoZSBncmVldGluZyBjaGFuZ2UuXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJiaW5kRXhhbXBsZVwiIG5hbWU9XCJuZy1iaW5kLXRlbXBsYXRlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdiaW5kRXhhbXBsZScsIFtdKVxuICAgICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICAgICRzY29wZS5zYWx1dGF0aW9uID0gJ0hlbGxvJztcbiAgICAgICAgICAgICAkc2NvcGUubmFtZSA9ICdXb3JsZCc7XG4gICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8bGFiZWw+U2FsdXRhdGlvbjogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJzYWx1dGF0aW9uXCI+PC9sYWJlbD48YnI+XG4gICAgICAgIDxsYWJlbD5OYW1lOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm5hbWVcIj48L2xhYmVsPjxicj5cbiAgICAgICAgPHByZSBuZy1iaW5kLXRlbXBsYXRlPVwie3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hXCI+PC9wcmU+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctYmluZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgdmFyIHNhbHV0YXRpb25FbGVtID0gZWxlbWVudChieS5iaW5kaW5nKCdzYWx1dGF0aW9uJykpO1xuICAgICAgICAgdmFyIHNhbHV0YXRpb25JbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3NhbHV0YXRpb24nKSk7XG4gICAgICAgICB2YXIgbmFtZUlucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbmFtZScpKTtcblxuICAgICAgICAgZXhwZWN0KHNhbHV0YXRpb25FbGVtLmdldFRleHQoKSkudG9CZSgnSGVsbG8gV29ybGQhJyk7XG5cbiAgICAgICAgIHNhbHV0YXRpb25JbnB1dC5jbGVhcigpO1xuICAgICAgICAgc2FsdXRhdGlvbklucHV0LnNlbmRLZXlzKCdHcmVldGluZ3MnKTtcbiAgICAgICAgIG5hbWVJbnB1dC5jbGVhcigpO1xuICAgICAgICAgbmFtZUlucHV0LnNlbmRLZXlzKCd1c2VyJyk7XG5cbiAgICAgICAgIGV4cGVjdChzYWx1dGF0aW9uRWxlbS5nZXRUZXh0KCkpLnRvQmUoJ0dyZWV0aW5ncyB1c2VyIScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0JpbmRUZW1wbGF0ZURpcmVjdGl2ZSA9IFsnJGludGVycG9sYXRlJywgJyRjb21waWxlJywgZnVuY3Rpb24oJGludGVycG9sYXRlLCAkY29tcGlsZSkge1xuICByZXR1cm4ge1xuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZFRlbXBsYXRlQ29tcGlsZSh0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICRjb21waWxlLiQkYWRkQmluZGluZ0NsYXNzKHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmdCaW5kVGVtcGxhdGVMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHZhciBpbnRlcnBvbGF0ZUZuID0gJGludGVycG9sYXRlKGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyLm5nQmluZFRlbXBsYXRlKSk7XG4gICAgICAgICRjb21waWxlLiQkYWRkQmluZGluZ0luZm8oZWxlbWVudCwgaW50ZXJwb2xhdGVGbi5leHByZXNzaW9ucyk7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50WzBdO1xuICAgICAgICBhdHRyLiRvYnNlcnZlKCduZ0JpbmRUZW1wbGF0ZScsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGlzVW5kZWZpbmVkKHZhbHVlKSA/ICcnIDogdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQmluZEh0bWxcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaW5zZXJ0cyB0aGUgcmVzdWx0aW5nIEhUTUwgaW50byB0aGUgZWxlbWVudCBpbiBhIHNlY3VyZSB3YXkuIEJ5IGRlZmF1bHQsXG4gKiB0aGUgcmVzdWx0aW5nIEhUTUwgY29udGVudCB3aWxsIGJlIHNhbml0aXplZCB1c2luZyB0aGUge0BsaW5rIG5nU2FuaXRpemUuJHNhbml0aXplICRzYW5pdGl6ZX0gc2VydmljZS5cbiAqIFRvIHV0aWxpemUgdGhpcyBmdW5jdGlvbmFsaXR5LCBlbnN1cmUgdGhhdCBgJHNhbml0aXplYCBpcyBhdmFpbGFibGUsIGZvciBleGFtcGxlLCBieSBpbmNsdWRpbmcge0BsaW5rXG4gKiBuZ1Nhbml0aXplfSBpbiB5b3VyIG1vZHVsZSdzIGRlcGVuZGVuY2llcyAobm90IGluIGNvcmUgQW5ndWxhcikuIEluIG9yZGVyIHRvIHVzZSB7QGxpbmsgbmdTYW5pdGl6ZX1cbiAqIGluIHlvdXIgbW9kdWxlJ3MgZGVwZW5kZW5jaWVzLCB5b3UgbmVlZCB0byBpbmNsdWRlIFwiYW5ndWxhci1zYW5pdGl6ZS5qc1wiIGluIHlvdXIgYXBwbGljYXRpb24uXG4gKlxuICogWW91IG1heSBhbHNvIGJ5cGFzcyBzYW5pdGl6YXRpb24gZm9yIHZhbHVlcyB5b3Uga25vdyBhcmUgc2FmZS4gVG8gZG8gc28sIGJpbmQgdG9cbiAqIGFuIGV4cGxpY2l0bHkgdHJ1c3RlZCB2YWx1ZSB2aWEge0BsaW5rIG5nLiRzY2UjdHJ1c3RBc0h0bWwgJHNjZS50cnVzdEFzSHRtbH0uICBTZWUgdGhlIGV4YW1wbGVcbiAqIHVuZGVyIHtAbGluayBuZy4kc2NlI3Nob3ctbWUtYW4tZXhhbXBsZS11c2luZy1zY2UtIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nIChTQ0UpfS5cbiAqXG4gKiBOb3RlOiBJZiBhIGAkc2FuaXRpemVgIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgYW5kIHRoZSBib3VuZCB2YWx1ZSBpc24ndCBleHBsaWNpdGx5IHRydXN0ZWQsIHlvdVxuICogd2lsbCBoYXZlIGFuIGV4Y2VwdGlvbiAoaW5zdGVhZCBvZiBhbiBleHBsb2l0LilcbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdCaW5kSHRtbCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJiaW5kSHRtbEV4YW1wbGVcIiBkZXBzPVwiYW5ndWxhci1zYW5pdGl6ZS5qc1wiIG5hbWU9XCJuZy1iaW5kLWh0bWxcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICA8cCBuZy1iaW5kLWh0bWw9XCJteUhUTUxcIj48L3A+XG4gICAgICAgPC9kaXY+XG4gICAgIDwvZmlsZT5cblxuICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICAgYW5ndWxhci5tb2R1bGUoJ2JpbmRIdG1sRXhhbXBsZScsIFsnbmdTYW5pdGl6ZSddKVxuICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgJHNjb3BlLm15SFRNTCA9XG4gICAgICAgICAgICAgICdJIGFtIGFuIDxjb2RlPkhUTUw8L2NvZGU+c3RyaW5nIHdpdGggJyArXG4gICAgICAgICAgICAgICc8YSBocmVmPVwiI1wiPmxpbmtzITwvYT4gYW5kIG90aGVyIDxlbT5zdHVmZjwvZW0+JztcbiAgICAgICAgIH1dKTtcbiAgICAgPC9maWxlPlxuXG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWJpbmQtaHRtbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbXlIVE1MJykpLmdldFRleHQoKSkudG9CZShcbiAgICAgICAgICAgICAnSSBhbSBhbiBIVE1Mc3RyaW5nIHdpdGggbGlua3MhIGFuZCBvdGhlciBzdHVmZicpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0JpbmRIdG1sRGlyZWN0aXZlID0gWyckc2NlJywgJyRwYXJzZScsICckY29tcGlsZScsIGZ1bmN0aW9uKCRzY2UsICRwYXJzZSwgJGNvbXBpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uIG5nQmluZEh0bWxDb21waWxlKHRFbGVtZW50LCB0QXR0cnMpIHtcbiAgICAgIHZhciBuZ0JpbmRIdG1sR2V0dGVyID0gJHBhcnNlKHRBdHRycy5uZ0JpbmRIdG1sKTtcbiAgICAgIHZhciBuZ0JpbmRIdG1sV2F0Y2ggPSAkcGFyc2UodEF0dHJzLm5nQmluZEh0bWwsIGZ1bmN0aW9uIHNjZVZhbHVlT2YodmFsKSB7XG4gICAgICAgIC8vIFVud3JhcCB0aGUgdmFsdWUgdG8gY29tcGFyZSB0aGUgYWN0dWFsIGlubmVyIHNhZmUgdmFsdWUsIG5vdCB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICAgIHJldHVybiAkc2NlLnZhbHVlT2YodmFsKTtcbiAgICAgIH0pO1xuICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nQ2xhc3ModEVsZW1lbnQpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gbmdCaW5kSHRtbExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgJGNvbXBpbGUuJCRhZGRCaW5kaW5nSW5mbyhlbGVtZW50LCBhdHRyLm5nQmluZEh0bWwpO1xuXG4gICAgICAgIHNjb3BlLiR3YXRjaChuZ0JpbmRIdG1sV2F0Y2gsIGZ1bmN0aW9uIG5nQmluZEh0bWxXYXRjaEFjdGlvbigpIHtcbiAgICAgICAgICAvLyBUaGUgd2F0Y2hlZCB2YWx1ZSBpcyB0aGUgdW53cmFwcGVkIHZhbHVlLiBUbyBhdm9pZCByZS1lc2NhcGluZywgdXNlIHRoZSBkaXJlY3QgZ2V0dGVyLlxuICAgICAgICAgIHZhciB2YWx1ZSA9IG5nQmluZEh0bWxHZXR0ZXIoc2NvcGUpO1xuICAgICAgICAgIGVsZW1lbnQuaHRtbCgkc2NlLmdldFRydXN0ZWRIdG1sKHZhbHVlKSB8fCAnJyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0NoYW5nZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRXZhbHVhdGUgdGhlIGdpdmVuIGV4cHJlc3Npb24gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBpbnB1dC5cbiAqIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBpbW1lZGlhdGVseSwgdW5saWtlIHRoZSBKYXZhU2NyaXB0IG9uY2hhbmdlIGV2ZW50XG4gKiB3aGljaCBvbmx5IHRyaWdnZXJzIGF0IHRoZSBlbmQgb2YgYSBjaGFuZ2UgKHVzdWFsbHksIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZVxuICogZm9ybSBlbGVtZW50IG9yIHByZXNzZXMgdGhlIHJldHVybiBrZXkpLlxuICpcbiAqIFRoZSBgbmdDaGFuZ2VgIGV4cHJlc3Npb24gaXMgb25seSBldmFsdWF0ZWQgd2hlbiBhIGNoYW5nZSBpbiB0aGUgaW5wdXQgdmFsdWUgY2F1c2VzXG4gKiBhIG5ldyB2YWx1ZSB0byBiZSBjb21taXR0ZWQgdG8gdGhlIG1vZGVsLlxuICpcbiAqIEl0IHdpbGwgbm90IGJlIGV2YWx1YXRlZDpcbiAqICogaWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGAkcGFyc2Vyc2AgdHJhbnNmb3JtYXRpb24gcGlwZWxpbmUgaGFzIG5vdCBjaGFuZ2VkXG4gKiAqIGlmIHRoZSBpbnB1dCBoYXMgY29udGludWVkIHRvIGJlIGludmFsaWQgc2luY2UgdGhlIG1vZGVsIHdpbGwgc3RheSBgbnVsbGBcbiAqICogaWYgdGhlIG1vZGVsIGlzIGNoYW5nZWQgcHJvZ3JhbW1hdGljYWxseSBhbmQgbm90IGJ5IGEgY2hhbmdlIHRvIHRoZSBpbnB1dCB2YWx1ZVxuICpcbiAqXG4gKiBOb3RlLCB0aGlzIGRpcmVjdGl2ZSByZXF1aXJlcyBgbmdNb2RlbGAgdG8gYmUgcHJlc2VudC5cbiAqXG4gKiBAZWxlbWVudCBpbnB1dFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NoYW5nZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uIGNoYW5nZVxuICogaW4gaW5wdXQgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ0NoYW5nZS1kaXJlY3RpdmVcIiBtb2R1bGU9XCJjaGFuZ2VFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNjcmlwdD5cbiAqICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjaGFuZ2VFeGFtcGxlJywgW10pXG4gKiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICAgJHNjb3BlLmNvdW50ZXIgPSAwO1xuICogICAgICAgICAgICRzY29wZS5jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgICAgICRzY29wZS5jb3VudGVyKys7XG4gKiAgICAgICAgICAgfTtcbiAqICAgICAgICAgfV0pO1xuICogICAgIDwvc2NyaXB0PlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjb25maXJtZWRcIiBuZy1jaGFuZ2U9XCJjaGFuZ2UoKVwiIGlkPVwibmctY2hhbmdlLWV4YW1wbGUxXCIgLz5cbiAqICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImNvbmZpcm1lZFwiIGlkPVwibmctY2hhbmdlLWV4YW1wbGUyXCIgLz5cbiAqICAgICAgIDxsYWJlbCBmb3I9XCJuZy1jaGFuZ2UtZXhhbXBsZTJcIj5Db25maXJtZWQ8L2xhYmVsPjxiciAvPlxuICogICAgICAgPHR0PmRlYnVnID0ge3tjb25maXJtZWR9fTwvdHQ+PGJyLz5cbiAqICAgICAgIDx0dD5jb3VudGVyID0ge3tjb3VudGVyfX08L3R0Pjxici8+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgIHZhciBjb3VudGVyID0gZWxlbWVudChieS5iaW5kaW5nKCdjb3VudGVyJykpO1xuICogICAgIHZhciBkZWJ1ZyA9IGVsZW1lbnQoYnkuYmluZGluZygnY29uZmlybWVkJykpO1xuICpcbiAqICAgICBpdCgnc2hvdWxkIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGlmIGNoYW5naW5nIGZyb20gdmlldycsIGZ1bmN0aW9uKCkge1xuICogICAgICAgZXhwZWN0KGNvdW50ZXIuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJzAnKTtcbiAqXG4gKiAgICAgICBlbGVtZW50KGJ5LmlkKCduZy1jaGFuZ2UtZXhhbXBsZTEnKSkuY2xpY2soKTtcbiAqXG4gKiAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvQ29udGFpbignMScpO1xuICogICAgICAgZXhwZWN0KGRlYnVnLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gKiAgICAgfSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgbm90IGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGlmIGNoYW5naW5nIGZyb20gbW9kZWwnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIGVsZW1lbnQoYnkuaWQoJ25nLWNoYW5nZS1leGFtcGxlMicpKS5jbGljaygpO1xuXG4gKiAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvQ29udGFpbignMCcpO1xuICogICAgICAgZXhwZWN0KGRlYnVnLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG4gKiAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nQ2hhbmdlRGlyZWN0aXZlID0gdmFsdWVGbih7XG4gIHJlc3RyaWN0OiAnQScsXG4gIHJlcXVpcmU6ICduZ01vZGVsJyxcbiAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmwpIHtcbiAgICBjdHJsLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICBzY29wZS4kZXZhbChhdHRyLm5nQ2hhbmdlKTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbi8qIGV4cG9ydGVkXG4gIG5nQ2xhc3NEaXJlY3RpdmUsXG4gIG5nQ2xhc3NFdmVuRGlyZWN0aXZlLFxuICBuZ0NsYXNzT2RkRGlyZWN0aXZlXG4qL1xuXG5mdW5jdGlvbiBjbGFzc0RpcmVjdGl2ZShuYW1lLCBzZWxlY3Rvcikge1xuICBuYW1lID0gJ25nQ2xhc3MnICsgbmFtZTtcbiAgcmV0dXJuIFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0FDJyxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICAgIHZhciBvbGRWYWw7XG5cbiAgICAgICAgc2NvcGUuJHdhdGNoKGF0dHJbbmFtZV0sIG5nQ2xhc3NXYXRjaEFjdGlvbiwgdHJ1ZSk7XG5cbiAgICAgICAgYXR0ci4kb2JzZXJ2ZSgnY2xhc3MnLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIG5nQ2xhc3NXYXRjaEFjdGlvbihzY29wZS4kZXZhbChhdHRyW25hbWVdKSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgaWYgKG5hbWUgIT09ICduZ0NsYXNzJykge1xuICAgICAgICAgIHNjb3BlLiR3YXRjaCgnJGluZGV4JywgZnVuY3Rpb24oJGluZGV4LCBvbGQkaW5kZXgpIHtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgICAgICAgICAgIHZhciBtb2QgPSAkaW5kZXggJiAxO1xuICAgICAgICAgICAgaWYgKG1vZCAhPT0gKG9sZCRpbmRleCAmIDEpKSB7XG4gICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gYXJyYXlDbGFzc2VzKHNjb3BlLiRldmFsKGF0dHJbbmFtZV0pKTtcbiAgICAgICAgICAgICAgaWYgKG1vZCA9PT0gc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICBhZGRDbGFzc2VzKGNsYXNzZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoY2xhc3Nlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFkZENsYXNzZXMoY2xhc3Nlcykge1xuICAgICAgICAgIHZhciBuZXdDbGFzc2VzID0gZGlnZXN0Q2xhc3NDb3VudHMoY2xhc3NlcywgMSk7XG4gICAgICAgICAgYXR0ci4kYWRkQ2xhc3MobmV3Q2xhc3Nlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZW1vdmVDbGFzc2VzKGNsYXNzZXMpIHtcbiAgICAgICAgICB2YXIgbmV3Q2xhc3NlcyA9IGRpZ2VzdENsYXNzQ291bnRzKGNsYXNzZXMsIC0xKTtcbiAgICAgICAgICBhdHRyLiRyZW1vdmVDbGFzcyhuZXdDbGFzc2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRpZ2VzdENsYXNzQ291bnRzKGNsYXNzZXMsIGNvdW50KSB7XG4gICAgICAgICAgLy8gVXNlIGNyZWF0ZU1hcCgpIHRvIHByZXZlbnQgY2xhc3MgYXNzdW1wdGlvbnMgaW52b2x2aW5nIHByb3BlcnR5XG4gICAgICAgICAgLy8gbmFtZXMgaW4gT2JqZWN0LnByb3RvdHlwZVxuICAgICAgICAgIHZhciBjbGFzc0NvdW50cyA9IGVsZW1lbnQuZGF0YSgnJGNsYXNzQ291bnRzJykgfHwgY3JlYXRlTWFwKCk7XG4gICAgICAgICAgdmFyIGNsYXNzZXNUb1VwZGF0ZSA9IFtdO1xuICAgICAgICAgIGZvckVhY2goY2xhc3NlcywgZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBpZiAoY291bnQgPiAwIHx8IGNsYXNzQ291bnRzW2NsYXNzTmFtZV0pIHtcbiAgICAgICAgICAgICAgY2xhc3NDb3VudHNbY2xhc3NOYW1lXSA9IChjbGFzc0NvdW50c1tjbGFzc05hbWVdIHx8IDApICsgY291bnQ7XG4gICAgICAgICAgICAgIGlmIChjbGFzc0NvdW50c1tjbGFzc05hbWVdID09PSArKGNvdW50ID4gMCkpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzVG9VcGRhdGUucHVzaChjbGFzc05hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZWxlbWVudC5kYXRhKCckY2xhc3NDb3VudHMnLCBjbGFzc0NvdW50cyk7XG4gICAgICAgICAgcmV0dXJuIGNsYXNzZXNUb1VwZGF0ZS5qb2luKCcgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVDbGFzc2VzKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpIHtcbiAgICAgICAgICB2YXIgdG9BZGQgPSBhcnJheURpZmZlcmVuY2UobmV3Q2xhc3Nlcywgb2xkQ2xhc3Nlcyk7XG4gICAgICAgICAgdmFyIHRvUmVtb3ZlID0gYXJyYXlEaWZmZXJlbmNlKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpO1xuICAgICAgICAgIHRvQWRkID0gZGlnZXN0Q2xhc3NDb3VudHModG9BZGQsIDEpO1xuICAgICAgICAgIHRvUmVtb3ZlID0gZGlnZXN0Q2xhc3NDb3VudHModG9SZW1vdmUsIC0xKTtcbiAgICAgICAgICBpZiAodG9BZGQgJiYgdG9BZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICAkYW5pbWF0ZS5hZGRDbGFzcyhlbGVtZW50LCB0b0FkZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICRhbmltYXRlLnJlbW92ZUNsYXNzKGVsZW1lbnQsIHRvUmVtb3ZlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBuZ0NsYXNzV2F0Y2hBY3Rpb24obmV3VmFsKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICBpZiAoc2VsZWN0b3IgPT09IHRydWUgfHwgKHNjb3BlLiRpbmRleCAmIDEpID09PSBzZWxlY3Rvcikge1xuICAgICAgICAgICAgdmFyIG5ld0NsYXNzZXMgPSBhcnJheUNsYXNzZXMobmV3VmFsIHx8IFtdKTtcbiAgICAgICAgICAgIGlmICghb2xkVmFsKSB7XG4gICAgICAgICAgICAgIGFkZENsYXNzZXMobmV3Q2xhc3Nlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFlcXVhbHMobmV3VmFsLG9sZFZhbCkpIHtcbiAgICAgICAgICAgICAgdmFyIG9sZENsYXNzZXMgPSBhcnJheUNsYXNzZXMob2xkVmFsKTtcbiAgICAgICAgICAgICAgdXBkYXRlQ2xhc3NlcyhvbGRDbGFzc2VzLCBuZXdDbGFzc2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzQXJyYXkobmV3VmFsKSkge1xuICAgICAgICAgICAgb2xkVmFsID0gbmV3VmFsLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBzaGFsbG93Q29weSh2KTsgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9sZFZhbCA9IHNoYWxsb3dDb3B5KG5ld1ZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFycmF5RGlmZmVyZW5jZSh0b2tlbnMxLCB0b2tlbnMyKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b2tlbiA9IHRva2VuczFbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG9rZW5zMi5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0b2tlbiA9PT0gdG9rZW5zMltqXSkgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzLnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcnJheUNsYXNzZXMoY2xhc3NWYWwpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gW107XG4gICAgICBpZiAoaXNBcnJheShjbGFzc1ZhbCkpIHtcbiAgICAgICAgZm9yRWFjaChjbGFzc1ZhbCwgZnVuY3Rpb24odikge1xuICAgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmNvbmNhdChhcnJheUNsYXNzZXModikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGNsYXNzVmFsKSkge1xuICAgICAgICByZXR1cm4gY2xhc3NWYWwuc3BsaXQoJyAnKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoY2xhc3NWYWwpKSB7XG4gICAgICAgIGZvckVhY2goY2xhc3NWYWwsIGZ1bmN0aW9uKHYsIGspIHtcbiAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuY29uY2F0KGsuc3BsaXQoJyAnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xhc3NWYWw7XG4gICAgfVxuICB9XTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0NsYXNzXG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdDbGFzc2AgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgc2V0IENTUyBjbGFzc2VzIG9uIGFuIEhUTUwgZWxlbWVudCBieSBkYXRhYmluZGluZ1xuICogYW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgYWxsIGNsYXNzZXMgdG8gYmUgYWRkZWQuXG4gKlxuICogVGhlIGRpcmVjdGl2ZSBvcGVyYXRlcyBpbiB0aHJlZSBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHdoaWNoIG9mIHRocmVlIHR5cGVzIHRoZSBleHByZXNzaW9uXG4gKiBldmFsdWF0ZXMgdG86XG4gKlxuICogMS4gSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgc3RyaW5nLCB0aGUgc3RyaW5nIHNob3VsZCBiZSBvbmUgb3IgbW9yZSBzcGFjZS1kZWxpbWl0ZWQgY2xhc3NcbiAqIG5hbWVzLlxuICpcbiAqIDIuIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhbiBvYmplY3QsIHRoZW4gZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgb2YgdGhlXG4gKiBvYmplY3Qgd2l0aCBhIHRydXRoeSB2YWx1ZSB0aGUgY29ycmVzcG9uZGluZyBrZXkgaXMgdXNlZCBhcyBhIGNsYXNzIG5hbWUuXG4gKlxuICogMy4gSWYgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGFuIGFycmF5LCBlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IHNob3VsZCBlaXRoZXIgYmUgYSBzdHJpbmcgYXMgaW5cbiAqIHR5cGUgMSBvciBhbiBvYmplY3QgYXMgaW4gdHlwZSAyLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBtaXggc3RyaW5ncyBhbmQgb2JqZWN0cyB0b2dldGhlciBpbiBhbiBhcnJheVxuICogdG8gZ2l2ZSB5b3UgbW9yZSBjb250cm9sIG92ZXIgd2hhdCBDU1MgY2xhc3NlcyBhcHBlYXIuIFNlZSB0aGUgY29kZSBiZWxvdyBmb3IgYW4gZXhhbXBsZSBvZiB0aGlzLlxuICpcbiAqXG4gKiBUaGUgZGlyZWN0aXZlIHdvbid0IGFkZCBkdXBsaWNhdGUgY2xhc3NlcyBpZiBhIHBhcnRpY3VsYXIgY2xhc3Mgd2FzIGFscmVhZHkgc2V0LlxuICpcbiAqIFdoZW4gdGhlIGV4cHJlc3Npb24gY2hhbmdlcywgdGhlIHByZXZpb3VzbHkgYWRkZWQgY2xhc3NlcyBhcmUgcmVtb3ZlZCBhbmQgb25seSB0aGVuIGFyZSB0aGVcbiAqIG5ldyBjbGFzc2VzIGFkZGVkLlxuICpcbiAqIEBrbm93bklzc3VlXG4gKiBZb3Ugc2hvdWxkIG5vdCB1c2Uge0BsaW5rIGd1aWRlL2ludGVycG9sYXRpb24gaW50ZXJwb2xhdGlvbn0gaW4gdGhlIHZhbHVlIG9mIHRoZSBgY2xhc3NgXG4gKiBhdHRyaWJ1dGUsIHdoZW4gdXNpbmcgdGhlIGBuZ0NsYXNzYCBkaXJlY3RpdmUgb24gdGhlIHNhbWUgZWxlbWVudC5cbiAqIFNlZSB7QGxpbmsgZ3VpZGUvaW50ZXJwb2xhdGlvbiNrbm93bi1pc3N1ZXMgaGVyZX0gZm9yIG1vcmUgaW5mby5cbiAqXG4gKiBAYW5pbWF0aW9uc1xuICogfCBBbmltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IE9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHtAbGluayBuZy4kYW5pbWF0ZSNhZGRDbGFzcyBhZGRDbGFzc30gICAgICAgfCBqdXN0IGJlZm9yZSB0aGUgY2xhc3MgaXMgYXBwbGllZCB0byB0aGUgZWxlbWVudCAgIHxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI3JlbW92ZUNsYXNzIHJlbW92ZUNsYXNzfSB8IGp1c3QgYmVmb3JlIHRoZSBjbGFzcyBpcyByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQgfFxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NsYXNzIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWwuIFRoZSByZXN1bHRcbiAqICAgb2YgdGhlIGV2YWx1YXRpb24gY2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBzcGFjZSBkZWxpbWl0ZWQgY2xhc3NcbiAqICAgbmFtZXMsIGFuIGFycmF5LCBvciBhIG1hcCBvZiBjbGFzcyBuYW1lcyB0byBib29sZWFuIHZhbHVlcy4gSW4gdGhlIGNhc2Ugb2YgYSBtYXAsIHRoZVxuICogICBuYW1lcyBvZiB0aGUgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMgYXJlIHRydXRoeSB3aWxsIGJlIGFkZGVkIGFzIGNzcyBjbGFzc2VzIHRvIHRoZVxuICogICBlbGVtZW50LlxuICpcbiAqIEBleGFtcGxlIEV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgYmFzaWMgYmluZGluZ3MgdmlhIG5nQ2xhc3MgZGlyZWN0aXZlLlxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWNsYXNzXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHAgbmctY2xhc3M9XCJ7c3RyaWtlOiBkZWxldGVkLCBib2xkOiBpbXBvcnRhbnQsICdoYXMtZXJyb3InOiBlcnJvcn1cIj5NYXAgU3ludGF4IEV4YW1wbGU8L3A+XG4gICAgICAgPGxhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImRlbGV0ZWRcIj5cbiAgICAgICAgICBkZWxldGVkIChhcHBseSBcInN0cmlrZVwiIGNsYXNzKVxuICAgICAgIDwvbGFiZWw+PGJyPlxuICAgICAgIDxsYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJpbXBvcnRhbnRcIj5cbiAgICAgICAgICBpbXBvcnRhbnQgKGFwcGx5IFwiYm9sZFwiIGNsYXNzKVxuICAgICAgIDwvbGFiZWw+PGJyPlxuICAgICAgIDxsYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJlcnJvclwiPlxuICAgICAgICAgIGVycm9yIChhcHBseSBcImhhcy1lcnJvclwiIGNsYXNzKVxuICAgICAgIDwvbGFiZWw+XG4gICAgICAgPGhyPlxuICAgICAgIDxwIG5nLWNsYXNzPVwic3R5bGVcIj5Vc2luZyBTdHJpbmcgU3ludGF4PC9wPlxuICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwic3R5bGVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGU6IGJvbGQgc3RyaWtlIHJlZFwiIGFyaWEtbGFiZWw9XCJUeXBlOiBib2xkIHN0cmlrZSByZWRcIj5cbiAgICAgICA8aHI+XG4gICAgICAgPHAgbmctY2xhc3M9XCJbc3R5bGUxLCBzdHlsZTIsIHN0eWxlM11cIj5Vc2luZyBBcnJheSBTeW50YXg8L3A+XG4gICAgICAgPGlucHV0IG5nLW1vZGVsPVwic3R5bGUxXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlOiBib2xkLCBzdHJpa2Ugb3IgcmVkXCIgYXJpYS1sYWJlbD1cIlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWRcIj48YnI+XG4gICAgICAgPGlucHV0IG5nLW1vZGVsPVwic3R5bGUyXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlOiBib2xkLCBzdHJpa2Ugb3IgcmVkXCIgYXJpYS1sYWJlbD1cIlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWQgMlwiPjxicj5cbiAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJzdHlsZTNcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGU6IGJvbGQsIHN0cmlrZSBvciByZWRcIiBhcmlhLWxhYmVsPVwiVHlwZTogYm9sZCwgc3RyaWtlIG9yIHJlZCAzXCI+PGJyPlxuICAgICAgIDxocj5cbiAgICAgICA8cCBuZy1jbGFzcz1cIltzdHlsZTQsIHtvcmFuZ2U6IHdhcm5pbmd9XVwiPlVzaW5nIEFycmF5IGFuZCBNYXAgU3ludGF4PC9wPlxuICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cInN0eWxlNFwiIHBsYWNlaG9sZGVyPVwiVHlwZTogYm9sZCwgc3RyaWtlXCIgYXJpYS1sYWJlbD1cIlR5cGU6IGJvbGQsIHN0cmlrZVwiPjxicj5cbiAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwid2FybmluZ1wiPiB3YXJuaW5nIChhcHBseSBcIm9yYW5nZVwiIGNsYXNzKTwvbGFiZWw+XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgIC5zdHJpa2Uge1xuICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbiAgICAgICB9XG4gICAgICAgLmJvbGQge1xuICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICB9XG4gICAgICAgLnJlZCB7XG4gICAgICAgICAgIGNvbG9yOiByZWQ7XG4gICAgICAgfVxuICAgICAgIC5oYXMtZXJyb3Ige1xuICAgICAgICAgICBjb2xvcjogcmVkO1xuICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7XG4gICAgICAgfVxuICAgICAgIC5vcmFuZ2Uge1xuICAgICAgICAgICBjb2xvcjogb3JhbmdlO1xuICAgICAgIH1cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgdmFyIHBzID0gZWxlbWVudC5hbGwoYnkuY3NzKCdwJykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBsZXQgeW91IHRvZ2dsZSB0aGUgY2xhc3MnLCBmdW5jdGlvbigpIHtcblxuICAgICAgICAgZXhwZWN0KHBzLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QudG9NYXRjaCgvYm9sZC8pO1xuICAgICAgICAgZXhwZWN0KHBzLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5ub3QudG9NYXRjaCgvaGFzLWVycm9yLyk7XG5cbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2ltcG9ydGFudCcpKS5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KHBzLmZpcnN0KCkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b01hdGNoKC9ib2xkLyk7XG5cbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ2Vycm9yJykpLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QocHMuZmlyc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvTWF0Y2goL2hhcy1lcnJvci8pO1xuICAgICAgIH0pO1xuXG4gICAgICAgaXQoJ3Nob3VsZCBsZXQgeW91IHRvZ2dsZSBzdHJpbmcgZXhhbXBsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KHBzLmdldCgxKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJycpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUnKSkuY2xlYXIoKTtcbiAgICAgICAgIGVsZW1lbnQoYnkubW9kZWwoJ3N0eWxlJykpLnNlbmRLZXlzKCdyZWQnKTtcbiAgICAgICAgIGV4cGVjdChwcy5nZXQoMSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCdyZWQnKTtcbiAgICAgICB9KTtcblxuICAgICAgIGl0KCdhcnJheSBleGFtcGxlIHNob3VsZCBoYXZlIDMgY2xhc3NlcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KHBzLmdldCgyKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJycpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUxJykpLnNlbmRLZXlzKCdib2xkJyk7XG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdzdHlsZTInKSkuc2VuZEtleXMoJ3N0cmlrZScpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGUzJykpLnNlbmRLZXlzKCdyZWQnKTtcbiAgICAgICAgIGV4cGVjdChwcy5nZXQoMikuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS50b0JlKCdib2xkIHN0cmlrZSByZWQnKTtcbiAgICAgICB9KTtcblxuICAgICAgIGl0KCdhcnJheSB3aXRoIG1hcCBleGFtcGxlIHNob3VsZCBoYXZlIDIgY2xhc3NlcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KHBzLmxhc3QoKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLnRvQmUoJycpO1xuICAgICAgICAgZWxlbWVudChieS5tb2RlbCgnc3R5bGU0JykpLnNlbmRLZXlzKCdib2xkJyk7XG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCd3YXJuaW5nJykpLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QocHMubGFzdCgpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9CZSgnYm9sZCBvcmFuZ2UnKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuXG4gICAjIyBBbmltYXRpb25zXG5cbiAgIFRoZSBleGFtcGxlIGJlbG93IGRlbW9uc3RyYXRlcyBob3cgdG8gcGVyZm9ybSBhbmltYXRpb25zIHVzaW5nIG5nQ2xhc3MuXG5cbiAgIDxleGFtcGxlIG1vZHVsZT1cIm5nQW5pbWF0ZVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIG5hbWU9XCJuZy1jbGFzc1wiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGlucHV0IGlkPVwic2V0YnRuXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwic2V0XCIgbmctY2xpY2s9XCJteVZhcj0nbXktY2xhc3MnXCI+XG4gICAgICA8aW5wdXQgaWQ9XCJjbGVhcmJ0blwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cImNsZWFyXCIgbmctY2xpY2s9XCJteVZhcj0nJ1wiPlxuICAgICAgPGJyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJiYXNlLWNsYXNzXCIgbmctY2xhc3M9XCJteVZhclwiPlNhbXBsZSBUZXh0PC9zcGFuPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICAuYmFzZS1jbGFzcyB7XG4gICAgICAgICB0cmFuc2l0aW9uOmFsbCBjdWJpYy1iZXppZXIoMC4yNTAsIDAuNDYwLCAwLjQ1MCwgMC45NDApIDAuNXM7XG4gICAgICAgfVxuXG4gICAgICAgLmJhc2UtY2xhc3MubXktY2xhc3Mge1xuICAgICAgICAgY29sb3I6IHJlZDtcbiAgICAgICAgIGZvbnQtc2l6ZTozZW07XG4gICAgICAgfVxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWNsYXNzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJy5iYXNlLWNsYXNzJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90LlxuICAgICAgICAgICB0b01hdGNoKC9teS1jbGFzcy8pO1xuXG4gICAgICAgICBlbGVtZW50KGJ5LmlkKCdzZXRidG4nKSkuY2xpY2soKTtcblxuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuY3NzKCcuYmFzZS1jbGFzcycpKS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpLlxuICAgICAgICAgICB0b01hdGNoKC9teS1jbGFzcy8pO1xuXG4gICAgICAgICBlbGVtZW50KGJ5LmlkKCdjbGVhcmJ0bicpKS5jbGljaygpO1xuXG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5jc3MoJy5iYXNlLWNsYXNzJykpLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkubm90LlxuICAgICAgICAgICB0b01hdGNoKC9teS1jbGFzcy8pO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG5cblxuICAgIyMgbmdDbGFzcyBhbmQgcHJlLWV4aXN0aW5nIENTUzMgVHJhbnNpdGlvbnMvQW5pbWF0aW9uc1xuICAgVGhlIG5nQ2xhc3MgZGlyZWN0aXZlIHN0aWxsIHN1cHBvcnRzIENTUzMgVHJhbnNpdGlvbnMvQW5pbWF0aW9ucyBldmVuIGlmIHRoZXkgZG8gbm90IGZvbGxvdyB0aGUgbmdBbmltYXRlIENTUyBuYW1pbmcgc3RydWN0dXJlLlxuICAgVXBvbiBhbmltYXRpb24gbmdBbmltYXRlIHdpbGwgYXBwbHkgc3VwcGxlbWVudGFyeSBDU1MgY2xhc3NlcyB0byB0cmFjayB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhbiBhbmltYXRpb24sIGJ1dCB0aGlzIHdpbGwgbm90IGhpbmRlclxuICAgYW55IHByZS1leGlzdGluZyBDU1MgdHJhbnNpdGlvbnMgYWxyZWFkeSBvbiB0aGUgZWxlbWVudC4gVG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCBoYXBwZW5zIGR1cmluZyBhIGNsYXNzLWJhc2VkIGFuaW1hdGlvbiwgYmUgc3VyZVxuICAgdG8gdmlldyB0aGUgc3RlcCBieSBzdGVwIGRldGFpbHMgb2Yge0BsaW5rICRhbmltYXRlI2FkZENsYXNzICRhbmltYXRlLmFkZENsYXNzfSBhbmRcbiAgIHtAbGluayAkYW5pbWF0ZSNyZW1vdmVDbGFzcyAkYW5pbWF0ZS5yZW1vdmVDbGFzc30uXG4gKi9cbnZhciBuZ0NsYXNzRGlyZWN0aXZlID0gY2xhc3NEaXJlY3RpdmUoJycsIHRydWUpO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ2xhc3NPZGRcbiAqIEByZXN0cmljdCBBQ1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ0NsYXNzT2RkYCBhbmQgYG5nQ2xhc3NFdmVuYCBkaXJlY3RpdmVzIHdvcmsgZXhhY3RseSBhc1xuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsYXNzIG5nQ2xhc3N9LCBleGNlcHQgdGhleSB3b3JrIGluXG4gKiBjb25qdW5jdGlvbiB3aXRoIGBuZ1JlcGVhdGAgYW5kIHRha2UgZWZmZWN0IG9ubHkgb24gb2RkIChldmVuKSByb3dzLlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSBhcHBsaWVkIG9ubHkgd2l0aGluIHRoZSBzY29wZSBvZiBhblxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0uXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xhc3NPZGQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbC4gVGhlIHJlc3VsdFxuICogICBvZiB0aGUgZXZhbHVhdGlvbiBjYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHNwYWNlIGRlbGltaXRlZCBjbGFzcyBuYW1lcyBvciBhbiBhcnJheS5cbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWNsYXNzLW9kZFwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8b2wgbmctaW5pdD1cIm5hbWVzPVsnSm9obicsICdNYXJ5JywgJ0NhdGUnLCAnU3V6J11cIj5cbiAgICAgICAgICA8bGkgbmctcmVwZWF0PVwibmFtZSBpbiBuYW1lc1wiPlxuICAgICAgICAgICA8c3BhbiBuZy1jbGFzcy1vZGQ9XCInb2RkJ1wiIG5nLWNsYXNzLWV2ZW49XCInZXZlbidcIj5cbiAgICAgICAgICAgICB7e25hbWV9fVxuICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC9vbD5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLm9kZCB7XG4gICAgICAgICBjb2xvcjogcmVkO1xuICAgICAgIH1cbiAgICAgICAuZXZlbiB7XG4gICAgICAgICBjb2xvcjogYmx1ZTtcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygwKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5cbiAgICAgICAgICAgdG9NYXRjaCgvb2RkLyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5cbiAgICAgICAgICAgdG9NYXRjaCgvZXZlbi8pO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0NsYXNzT2RkRGlyZWN0aXZlID0gY2xhc3NEaXJlY3RpdmUoJ09kZCcsIDApO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ2xhc3NFdmVuXG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdDbGFzc09kZGAgYW5kIGBuZ0NsYXNzRXZlbmAgZGlyZWN0aXZlcyB3b3JrIGV4YWN0bHkgYXNcbiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdDbGFzcyBuZ0NsYXNzfSwgZXhjZXB0IHRoZXkgd29yayBpblxuICogY29uanVuY3Rpb24gd2l0aCBgbmdSZXBlYXRgIGFuZCB0YWtlIGVmZmVjdCBvbmx5IG9uIG9kZCAoZXZlbikgcm93cy5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYW5cbiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgbmdSZXBlYXR9LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NsYXNzRXZlbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLiBUaGVcbiAqICAgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgc3BhY2UgZGVsaW1pdGVkIGNsYXNzIG5hbWVzIG9yIGFuIGFycmF5LlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctY2xhc3MtZXZlblwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8b2wgbmctaW5pdD1cIm5hbWVzPVsnSm9obicsICdNYXJ5JywgJ0NhdGUnLCAnU3V6J11cIj5cbiAgICAgICAgICA8bGkgbmctcmVwZWF0PVwibmFtZSBpbiBuYW1lc1wiPlxuICAgICAgICAgICA8c3BhbiBuZy1jbGFzcy1vZGQ9XCInb2RkJ1wiIG5nLWNsYXNzLWV2ZW49XCInZXZlbidcIj5cbiAgICAgICAgICAgICB7e25hbWV9fSAmbmJzcDsgJm5ic3A7ICZuYnNwO1xuICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC9vbD5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgLm9kZCB7XG4gICAgICAgICBjb2xvcjogcmVkO1xuICAgICAgIH1cbiAgICAgICAuZXZlbiB7XG4gICAgICAgICBjb2xvcjogYmx1ZTtcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctY2xhc3Mtb2RkIGFuZCBuZy1jbGFzcy1ldmVuJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygwKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5cbiAgICAgICAgICAgdG9NYXRjaCgvb2RkLyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5yZXBlYXRlcignbmFtZSBpbiBuYW1lcycpLnJvdygxKS5jb2x1bW4oJ25hbWUnKSkuZ2V0QXR0cmlidXRlKCdjbGFzcycpKS5cbiAgICAgICAgICAgdG9NYXRjaCgvZXZlbi8pO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ0NsYXNzRXZlbkRpcmVjdGl2ZSA9IGNsYXNzRGlyZWN0aXZlKCdFdmVuJywgMSk7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdDbG9ha1xuICogQHJlc3RyaWN0IEFDXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nQ2xvYWtgIGRpcmVjdGl2ZSBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIEFuZ3VsYXIgaHRtbCB0ZW1wbGF0ZSBmcm9tIGJlaW5nIGJyaWVmbHlcbiAqIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciBpbiBpdHMgcmF3ICh1bmNvbXBpbGVkKSBmb3JtIHdoaWxlIHlvdXIgYXBwbGljYXRpb24gaXMgbG9hZGluZy4gVXNlIHRoaXNcbiAqIGRpcmVjdGl2ZSB0byBhdm9pZCB0aGUgdW5kZXNpcmFibGUgZmxpY2tlciBlZmZlY3QgY2F1c2VkIGJ5IHRoZSBodG1sIHRlbXBsYXRlIGRpc3BsYXkuXG4gKlxuICogVGhlIGRpcmVjdGl2ZSBjYW4gYmUgYXBwbGllZCB0byB0aGUgYDxib2R5PmAgZWxlbWVudCwgYnV0IHRoZSBwcmVmZXJyZWQgdXNhZ2UgaXMgdG8gYXBwbHlcbiAqIG11bHRpcGxlIGBuZ0Nsb2FrYCBkaXJlY3RpdmVzIHRvIHNtYWxsIHBvcnRpb25zIG9mIHRoZSBwYWdlIHRvIHBlcm1pdCBwcm9ncmVzc2l2ZSByZW5kZXJpbmdcbiAqIG9mIHRoZSBicm93c2VyIHZpZXcuXG4gKlxuICogYG5nQ2xvYWtgIHdvcmtzIGluIGNvb3BlcmF0aW9uIHdpdGggdGhlIGZvbGxvd2luZyBjc3MgcnVsZSBlbWJlZGRlZCB3aXRoaW4gYGFuZ3VsYXIuanNgIGFuZFxuICogYGFuZ3VsYXIubWluLmpzYC5cbiAqIEZvciBDU1AgbW9kZSBwbGVhc2UgYWRkIGBhbmd1bGFyLWNzcC5jc3NgIHRvIHlvdXIgaHRtbCBmaWxlIChzZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NzcCBuZ0NzcH0pLlxuICpcbiAqIGBgYGNzc1xuICogW25nXFw6Y2xvYWtdLCBbbmctY2xvYWtdLCBbZGF0YS1uZy1jbG9ha10sIFt4LW5nLWNsb2FrXSwgLm5nLWNsb2FrLCAueC1uZy1jbG9hayB7XG4gKiAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdoZW4gdGhpcyBjc3MgcnVsZSBpcyBsb2FkZWQgYnkgdGhlIGJyb3dzZXIsIGFsbCBodG1sIGVsZW1lbnRzIChpbmNsdWRpbmcgdGhlaXIgY2hpbGRyZW4pIHRoYXRcbiAqIGFyZSB0YWdnZWQgd2l0aCB0aGUgYG5nQ2xvYWtgIGRpcmVjdGl2ZSBhcmUgaGlkZGVuLiBXaGVuIEFuZ3VsYXIgZW5jb3VudGVycyB0aGlzIGRpcmVjdGl2ZVxuICogZHVyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgdGVtcGxhdGUgaXQgZGVsZXRlcyB0aGUgYG5nQ2xvYWtgIGVsZW1lbnQgYXR0cmlidXRlLCBtYWtpbmdcbiAqIHRoZSBjb21waWxlZCBlbGVtZW50IHZpc2libGUuXG4gKlxuICogRm9yIHRoZSBiZXN0IHJlc3VsdCwgdGhlIGBhbmd1bGFyLmpzYCBzY3JpcHQgbXVzdCBiZSBsb2FkZWQgaW4gdGhlIGhlYWQgc2VjdGlvbiBvZiB0aGUgaHRtbFxuICogZG9jdW1lbnQ7IGFsdGVybmF0aXZlbHksIHRoZSBjc3MgcnVsZSBhYm92ZSBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBleHRlcm5hbCBzdHlsZXNoZWV0IG9mIHRoZVxuICogYXBwbGljYXRpb24uXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1jbG9ha1wiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8ZGl2IGlkPVwidGVtcGxhdGUxXCIgbmctY2xvYWs+e3sgJ2hlbGxvJyB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwidGVtcGxhdGUyXCIgY2xhc3M9XCJuZy1jbG9ha1wiPnt7ICd3b3JsZCcgfX08L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCByZW1vdmUgdGhlIHRlbXBsYXRlIGRpcmVjdGl2ZSBhbmQgY3NzIGNsYXNzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoJCgnI3RlbXBsYXRlMScpLmdldEF0dHJpYnV0ZSgnbmctY2xvYWsnKSkuXG4gICAgICAgICAgIHRvQmVOdWxsKCk7XG4gICAgICAgICBleHBlY3QoJCgnI3RlbXBsYXRlMicpLmdldEF0dHJpYnV0ZSgnbmctY2xvYWsnKSkuXG4gICAgICAgICAgIHRvQmVOdWxsKCk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqXG4gKi9cbnZhciBuZ0Nsb2FrRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoe1xuICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyKSB7XG4gICAgYXR0ci4kc2V0KCduZ0Nsb2FrJywgdW5kZWZpbmVkKTtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKCduZy1jbG9haycpO1xuICB9XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0NvbnRyb2xsZXJcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdDb250cm9sbGVyYCBkaXJlY3RpdmUgYXR0YWNoZXMgYSBjb250cm9sbGVyIGNsYXNzIHRvIHRoZSB2aWV3LiBUaGlzIGlzIGEga2V5IGFzcGVjdCBvZiBob3cgYW5ndWxhclxuICogc3VwcG9ydHMgdGhlIHByaW5jaXBsZXMgYmVoaW5kIHRoZSBNb2RlbC1WaWV3LUNvbnRyb2xsZXIgZGVzaWduIHBhdHRlcm4uXG4gKlxuICogTVZDIGNvbXBvbmVudHMgaW4gYW5ndWxhcjpcbiAqXG4gKiAqIE1vZGVsIOKAlCBNb2RlbHMgYXJlIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2NvcGU7IHNjb3BlcyBhcmUgYXR0YWNoZWQgdG8gdGhlIERPTSB3aGVyZSBzY29wZSBwcm9wZXJ0aWVzXG4gKiAgIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIGJpbmRpbmdzLlxuICogKiBWaWV3IOKAlCBUaGUgdGVtcGxhdGUgKEhUTUwgd2l0aCBkYXRhIGJpbmRpbmdzKSB0aGF0IGlzIHJlbmRlcmVkIGludG8gdGhlIFZpZXcuXG4gKiAqIENvbnRyb2xsZXIg4oCUIFRoZSBgbmdDb250cm9sbGVyYCBkaXJlY3RpdmUgc3BlY2lmaWVzIGEgQ29udHJvbGxlciBjbGFzczsgdGhlIGNsYXNzIGNvbnRhaW5zIGJ1c2luZXNzXG4gKiAgIGxvZ2ljIGJlaGluZCB0aGUgYXBwbGljYXRpb24gdG8gZGVjb3JhdGUgdGhlIHNjb3BlIHdpdGggZnVuY3Rpb25zIGFuZCB2YWx1ZXNcbiAqXG4gKiBOb3RlIHRoYXQgeW91IGNhbiBhbHNvIGF0dGFjaCBjb250cm9sbGVycyB0byB0aGUgRE9NIGJ5IGRlY2xhcmluZyBpdCBpbiBhIHJvdXRlIGRlZmluaXRpb25cbiAqIHZpYSB0aGUge0BsaW5rIG5nUm91dGUuJHJvdXRlICRyb3V0ZX0gc2VydmljZS4gQSBjb21tb24gbWlzdGFrZSBpcyB0byBkZWNsYXJlIHRoZSBjb250cm9sbGVyXG4gKiBhZ2FpbiB1c2luZyBgbmctY29udHJvbGxlcmAgaW4gdGhlIHRlbXBsYXRlIGl0c2VsZi4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgY29udHJvbGxlciB0byBiZSBhdHRhY2hlZFxuICogYW5kIGV4ZWN1dGVkIHR3aWNlLlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHNjb3BlXG4gKiBAcHJpb3JpdHkgNTAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ29udHJvbGxlciBOYW1lIG9mIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBjdXJyZW50XG4gKiB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciAkY29udHJvbGxlclByb3ZpZGVyfSBvciBhbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBleHByZXNzaW9ufVxuICogdGhhdCBvbiB0aGUgY3VycmVudCBzY29wZSBldmFsdWF0ZXMgdG8gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgY29udHJvbGxlciBpbnN0YW5jZSBjYW4gYmUgcHVibGlzaGVkIGludG8gYSBzY29wZSBwcm9wZXJ0eSBieSBzcGVjaWZ5aW5nXG4gKiBgbmctY29udHJvbGxlcj1cImFzIHByb3BlcnR5TmFtZVwiYC5cbiAqXG4gKiBJZiB0aGUgY3VycmVudCBgJGNvbnRyb2xsZXJQcm92aWRlcmAgaXMgY29uZmlndXJlZCB0byB1c2UgZ2xvYmFscyAodmlhXG4gKiB7QGxpbmsgbmcuJGNvbnRyb2xsZXJQcm92aWRlciNhbGxvd0dsb2JhbHMgYCRjb250cm9sbGVyUHJvdmlkZXIuYWxsb3dHbG9iYWxzKClgIH0pLCB0aGlzIG1heVxuICogYWxzbyBiZSB0aGUgbmFtZSBvZiBhIGdsb2JhbGx5IGFjY2Vzc2libGUgY29uc3RydWN0b3IgZnVuY3Rpb24gKGRlcHJlY2F0ZWQsIG5vdCByZWNvbW1lbmRlZCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIEhlcmUgaXMgYSBzaW1wbGUgZm9ybSBmb3IgZWRpdGluZyB1c2VyIGNvbnRhY3QgaW5mb3JtYXRpb24uIEFkZGluZywgcmVtb3ZpbmcsIGNsZWFyaW5nLCBhbmRcbiAqIGdyZWV0aW5nIGFyZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZSBjb250cm9sbGVyIChzZWUgc291cmNlIHRhYikuIFRoZXNlIG1ldGhvZHMgY2FuXG4gKiBlYXNpbHkgYmUgY2FsbGVkIGZyb20gdGhlIGFuZ3VsYXIgbWFya3VwLiBBbnkgY2hhbmdlcyB0byB0aGUgZGF0YSBhcmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWRcbiAqIGluIHRoZSBWaWV3IHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgbWFudWFsIHVwZGF0ZS5cbiAqXG4gKiBUd28gZGlmZmVyZW50IGRlY2xhcmF0aW9uIHN0eWxlcyBhcmUgaW5jbHVkZWQgYmVsb3c6XG4gKlxuICogKiBvbmUgYmluZHMgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBkaXJlY3RseSBvbnRvIHRoZSBjb250cm9sbGVyIHVzaW5nIGB0aGlzYDpcbiAqIGBuZy1jb250cm9sbGVyPVwiU2V0dGluZ3NDb250cm9sbGVyMSBhcyBzZXR0aW5nc1wiYFxuICogKiBvbmUgaW5qZWN0cyBgJHNjb3BlYCBpbnRvIHRoZSBjb250cm9sbGVyOlxuICogYG5nLWNvbnRyb2xsZXI9XCJTZXR0aW5nc0NvbnRyb2xsZXIyXCJgXG4gKlxuICogVGhlIHNlY29uZCBvcHRpb24gaXMgbW9yZSBjb21tb24gaW4gdGhlIEFuZ3VsYXIgY29tbXVuaXR5LCBhbmQgaXMgZ2VuZXJhbGx5IHVzZWQgaW4gYm9pbGVycGxhdGVzXG4gKiBhbmQgaW4gdGhpcyBndWlkZS4gSG93ZXZlciwgdGhlcmUgYXJlIGFkdmFudGFnZXMgdG8gYmluZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5IHRvIHRoZSBjb250cm9sbGVyXG4gKiBhbmQgYXZvaWRpbmcgc2NvcGUuXG4gKlxuICogKiBVc2luZyBgY29udHJvbGxlciBhc2AgbWFrZXMgaXQgb2J2aW91cyB3aGljaCBjb250cm9sbGVyIHlvdSBhcmUgYWNjZXNzaW5nIGluIHRoZSB0ZW1wbGF0ZSB3aGVuXG4gKiBtdWx0aXBsZSBjb250cm9sbGVycyBhcHBseSB0byBhbiBlbGVtZW50LlxuICogKiBJZiB5b3UgYXJlIHdyaXRpbmcgeW91ciBjb250cm9sbGVycyBhcyBjbGFzc2VzIHlvdSBoYXZlIGVhc2llciBhY2Nlc3MgdG8gdGhlIHByb3BlcnRpZXMgYW5kXG4gKiBtZXRob2RzLCB3aGljaCB3aWxsIGFwcGVhciBvbiB0aGUgc2NvcGUsIGZyb20gaW5zaWRlIHRoZSBjb250cm9sbGVyIGNvZGUuXG4gKiAqIFNpbmNlIHRoZXJlIGlzIGFsd2F5cyBhIGAuYCBpbiB0aGUgYmluZGluZ3MsIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHByb3RvdHlwYWxcbiAqIGluaGVyaXRhbmNlIG1hc2tpbmcgcHJpbWl0aXZlcy5cbiAqXG4gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSBgY29udHJvbGxlciBhc2Agc3ludGF4LlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ0NvbnRyb2xsZXJBc1wiIG1vZHVsZT1cImNvbnRyb2xsZXJBc0V4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgIDxkaXYgaWQ9XCJjdHJsLWFzLWV4bXBsXCIgbmctY29udHJvbGxlcj1cIlNldHRpbmdzQ29udHJvbGxlcjEgYXMgc2V0dGluZ3NcIj5cbiAqICAgICAgPGxhYmVsPk5hbWU6IDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwic2V0dGluZ3MubmFtZVwiLz48L2xhYmVsPlxuICogICAgICA8YnV0dG9uIG5nLWNsaWNrPVwic2V0dGluZ3MuZ3JlZXQoKVwiPmdyZWV0PC9idXR0b24+PGJyLz5cbiAqICAgICAgQ29udGFjdDpcbiAqICAgICAgPHVsPlxuICogICAgICAgIDxsaSBuZy1yZXBlYXQ9XCJjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzXCI+XG4gKiAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPVwiY29udGFjdC50eXBlXCIgYXJpYS1sYWJlbD1cIkNvbnRhY3QgbWV0aG9kXCIgaWQ9XCJzZWxlY3Rfe3skaW5kZXh9fVwiPlxuICogICAgICAgICAgICAgPG9wdGlvbj5waG9uZTwvb3B0aW9uPlxuICogICAgICAgICAgICAgPG9wdGlvbj5lbWFpbDwvb3B0aW9uPlxuICogICAgICAgICAgPC9zZWxlY3Q+XG4gKiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cImNvbnRhY3QudmFsdWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJzZWxlY3Rfe3skaW5kZXh9fVwiIC8+XG4gKiAgICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwic2V0dGluZ3MuY2xlYXJDb250YWN0KGNvbnRhY3QpXCI+Y2xlYXI8L2J1dHRvbj5cbiAqICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJzZXR0aW5ncy5yZW1vdmVDb250YWN0KGNvbnRhY3QpXCIgYXJpYS1sYWJlbD1cIlJlbW92ZVwiPlg8L2J1dHRvbj5cbiAqICAgICAgICA8L2xpPlxuICogICAgICAgIDxsaT48YnV0dG9uIG5nLWNsaWNrPVwic2V0dGluZ3MuYWRkQ29udGFjdCgpXCI+YWRkPC9idXR0b24+PC9saT5cbiAqICAgICA8L3VsPlxuICogICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgYW5ndWxhci5tb2R1bGUoJ2NvbnRyb2xsZXJBc0V4YW1wbGUnLCBbXSlcbiAqICAgICAgLmNvbnRyb2xsZXIoJ1NldHRpbmdzQ29udHJvbGxlcjEnLCBTZXR0aW5nc0NvbnRyb2xsZXIxKTtcbiAqXG4gKiAgICBmdW5jdGlvbiBTZXR0aW5nc0NvbnRyb2xsZXIxKCkge1xuICogICAgICB0aGlzLm5hbWUgPSAnSm9obiBTbWl0aCc7XG4gKiAgICAgIHRoaXMuY29udGFjdHMgPSBbXG4gKiAgICAgICAge3R5cGU6ICdwaG9uZScsIHZhbHVlOiAnNDA4IDU1NSAxMjEyJ30sXG4gKiAgICAgICAge3R5cGU6ICdlbWFpbCcsIHZhbHVlOiAnam9obi5zbWl0aEBleGFtcGxlLm9yZyd9XG4gKiAgICAgIF07XG4gKiAgICB9XG4gKlxuICogICAgU2V0dGluZ3NDb250cm9sbGVyMS5wcm90b3R5cGUuZ3JlZXQgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgYWxlcnQodGhpcy5uYW1lKTtcbiAqICAgIH07XG4gKlxuICogICAgU2V0dGluZ3NDb250cm9sbGVyMS5wcm90b3R5cGUuYWRkQ29udGFjdCA9IGZ1bmN0aW9uKCkge1xuICogICAgICB0aGlzLmNvbnRhY3RzLnB1c2goe3R5cGU6ICdlbWFpbCcsIHZhbHVlOiAneW91cm5hbWVAZXhhbXBsZS5vcmcnfSk7XG4gKiAgICB9O1xuICpcbiAqICAgIFNldHRpbmdzQ29udHJvbGxlcjEucHJvdG90eXBlLnJlbW92ZUNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0VG9SZW1vdmUpIHtcbiAqICAgICB2YXIgaW5kZXggPSB0aGlzLmNvbnRhY3RzLmluZGV4T2YoY29udGFjdFRvUmVtb3ZlKTtcbiAqICAgICAgdGhpcy5jb250YWN0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICogICAgfTtcbiAqXG4gKiAgICBTZXR0aW5nc0NvbnRyb2xsZXIxLnByb3RvdHlwZS5jbGVhckNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0KSB7XG4gKiAgICAgIGNvbnRhY3QudHlwZSA9ICdwaG9uZSc7XG4gKiAgICAgIGNvbnRhY3QudmFsdWUgPSAnJztcbiAqICAgIH07XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgIGl0KCdzaG91bGQgY2hlY2sgY29udHJvbGxlciBhcycsIGZ1bmN0aW9uKCkge1xuICogICAgICAgdmFyIGNvbnRhaW5lciA9IGVsZW1lbnQoYnkuaWQoJ2N0cmwtYXMtZXhtcGwnKSk7XG4gKiAgICAgICAgIGV4cGVjdChjb250YWluZXIuZWxlbWVudChieS5tb2RlbCgnc2V0dGluZ3MubmFtZScpKVxuICogICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvQmUoJ0pvaG4gU21pdGgnKTtcbiAqXG4gKiAgICAgICB2YXIgZmlyc3RSZXBlYXQgPVxuICogICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzJykucm93KDApKTtcbiAqICAgICAgIHZhciBzZWNvbmRSZXBlYXQgPVxuICogICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIHNldHRpbmdzLmNvbnRhY3RzJykucm93KDEpKTtcbiAqXG4gKiAgICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gKiAgICAgICAgICAgLnRvQmUoJzQwOCA1NTUgMTIxMicpO1xuICpcbiAqICAgICAgIGV4cGVjdChzZWNvbmRSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gKiAgICAgICAgICAgLnRvQmUoJ2pvaG4uc21pdGhAZXhhbXBsZS5vcmcnKTtcbiAqXG4gKiAgICAgICBmaXJzdFJlcGVhdC5lbGVtZW50KGJ5LmJ1dHRvblRleHQoJ2NsZWFyJykpLmNsaWNrKCk7XG4gKlxuICogICAgICAgZXhwZWN0KGZpcnN0UmVwZWF0LmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKVxuICogICAgICAgICAgIC50b0JlKCcnKTtcbiAqXG4gKiAgICAgICBjb250YWluZXIuZWxlbWVudChieS5idXR0b25UZXh0KCdhZGQnKSkuY2xpY2soKTtcbiAqXG4gKiAgICAgICBleHBlY3QoY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gc2V0dGluZ3MuY29udGFjdHMnKS5yb3coMikpXG4gKiAgICAgICAgICAgLmVsZW1lbnQoYnkubW9kZWwoJ2NvbnRhY3QudmFsdWUnKSlcbiAqICAgICAgICAgICAuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKVxuICogICAgICAgICAgIC50b0JlKCd5b3VybmFtZUBleGFtcGxlLm9yZycpO1xuICogICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgXCJhdHRhY2ggdG8gYCRzY29wZWBcIiBzdHlsZSBvZiBjb250cm9sbGVyLlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ0NvbnRyb2xsZXJcIiBtb2R1bGU9XCJjb250cm9sbGVyRXhhbXBsZVwiPlxuICogIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgIDxkaXYgaWQ9XCJjdHJsLWV4bXBsXCIgbmctY29udHJvbGxlcj1cIlNldHRpbmdzQ29udHJvbGxlcjJcIj5cbiAqICAgICA8bGFiZWw+TmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJuYW1lXCIvPjwvbGFiZWw+XG4gKiAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImdyZWV0KClcIj5ncmVldDwvYnV0dG9uPjxici8+XG4gKiAgICAgQ29udGFjdDpcbiAqICAgICA8dWw+XG4gKiAgICAgICA8bGkgbmctcmVwZWF0PVwiY29udGFjdCBpbiBjb250YWN0c1wiPlxuICogICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPVwiY29udGFjdC50eXBlXCIgaWQ9XCJzZWxlY3Rfe3skaW5kZXh9fVwiPlxuICogICAgICAgICAgICA8b3B0aW9uPnBob25lPC9vcHRpb24+XG4gKiAgICAgICAgICAgIDxvcHRpb24+ZW1haWw8L29wdGlvbj5cbiAqICAgICAgICAgPC9zZWxlY3Q+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwiY29udGFjdC52YWx1ZVwiIGFyaWEtbGFiZWxsZWRieT1cInNlbGVjdF97eyRpbmRleH19XCIgLz5cbiAqICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImNsZWFyQ29udGFjdChjb250YWN0KVwiPmNsZWFyPC9idXR0b24+XG4gKiAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJyZW1vdmVDb250YWN0KGNvbnRhY3QpXCI+WDwvYnV0dG9uPlxuICogICAgICAgPC9saT5cbiAqICAgICAgIDxsaT5bIDxidXR0b24gbmctY2xpY2s9XCJhZGRDb250YWN0KClcIj5hZGQ8L2J1dHRvbj4gXTwvbGk+XG4gKiAgICA8L3VsPlxuICogICA8L2Rpdj5cbiAqICA8L2ZpbGU+XG4gKiAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICBhbmd1bGFyLm1vZHVsZSgnY29udHJvbGxlckV4YW1wbGUnLCBbXSlcbiAqICAgICAuY29udHJvbGxlcignU2V0dGluZ3NDb250cm9sbGVyMicsIFsnJHNjb3BlJywgU2V0dGluZ3NDb250cm9sbGVyMl0pO1xuICpcbiAqICAgZnVuY3Rpb24gU2V0dGluZ3NDb250cm9sbGVyMigkc2NvcGUpIHtcbiAqICAgICAkc2NvcGUubmFtZSA9ICdKb2huIFNtaXRoJztcbiAqICAgICAkc2NvcGUuY29udGFjdHMgPSBbXG4gKiAgICAgICB7dHlwZToncGhvbmUnLCB2YWx1ZTonNDA4IDU1NSAxMjEyJ30sXG4gKiAgICAgICB7dHlwZTonZW1haWwnLCB2YWx1ZTonam9obi5zbWl0aEBleGFtcGxlLm9yZyd9XG4gKiAgICAgXTtcbiAqXG4gKiAgICAgJHNjb3BlLmdyZWV0ID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgICBhbGVydCgkc2NvcGUubmFtZSk7XG4gKiAgICAgfTtcbiAqXG4gKiAgICAgJHNjb3BlLmFkZENvbnRhY3QgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgICRzY29wZS5jb250YWN0cy5wdXNoKHt0eXBlOidlbWFpbCcsIHZhbHVlOid5b3VybmFtZUBleGFtcGxlLm9yZyd9KTtcbiAqICAgICB9O1xuICpcbiAqICAgICAkc2NvcGUucmVtb3ZlQ29udGFjdCA9IGZ1bmN0aW9uKGNvbnRhY3RUb1JlbW92ZSkge1xuICogICAgICAgdmFyIGluZGV4ID0gJHNjb3BlLmNvbnRhY3RzLmluZGV4T2YoY29udGFjdFRvUmVtb3ZlKTtcbiAqICAgICAgICRzY29wZS5jb250YWN0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICogICAgIH07XG4gKlxuICogICAgICRzY29wZS5jbGVhckNvbnRhY3QgPSBmdW5jdGlvbihjb250YWN0KSB7XG4gKiAgICAgICBjb250YWN0LnR5cGUgPSAncGhvbmUnO1xuICogICAgICAgY29udGFjdC52YWx1ZSA9ICcnO1xuICogICAgIH07XG4gKiAgIH1cbiAqICA8L2ZpbGU+XG4gKiAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgaXQoJ3Nob3VsZCBjaGVjayBjb250cm9sbGVyJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgIHZhciBjb250YWluZXIgPSBlbGVtZW50KGJ5LmlkKCdjdHJsLWV4bXBsJykpO1xuICpcbiAqICAgICAgZXhwZWN0KGNvbnRhaW5lci5lbGVtZW50KGJ5Lm1vZGVsKCduYW1lJykpXG4gKiAgICAgICAgICAuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKS50b0JlKCdKb2huIFNtaXRoJyk7XG4gKlxuICogICAgICB2YXIgZmlyc3RSZXBlYXQgPVxuICogICAgICAgICAgY29udGFpbmVyLmVsZW1lbnQoYnkucmVwZWF0ZXIoJ2NvbnRhY3QgaW4gY29udGFjdHMnKS5yb3coMCkpO1xuICogICAgICB2YXIgc2Vjb25kUmVwZWF0ID1cbiAqICAgICAgICAgIGNvbnRhaW5lci5lbGVtZW50KGJ5LnJlcGVhdGVyKCdjb250YWN0IGluIGNvbnRhY3RzJykucm93KDEpKTtcbiAqXG4gKiAgICAgIGV4cGVjdChmaXJzdFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSlcbiAqICAgICAgICAgIC50b0JlKCc0MDggNTU1IDEyMTInKTtcbiAqICAgICAgZXhwZWN0KHNlY29uZFJlcGVhdC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSlcbiAqICAgICAgICAgIC50b0JlKCdqb2huLnNtaXRoQGV4YW1wbGUub3JnJyk7XG4gKlxuICogICAgICBmaXJzdFJlcGVhdC5lbGVtZW50KGJ5LmJ1dHRvblRleHQoJ2NsZWFyJykpLmNsaWNrKCk7XG4gKlxuICogICAgICBleHBlY3QoZmlyc3RSZXBlYXQuZWxlbWVudChieS5tb2RlbCgnY29udGFjdC52YWx1ZScpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpXG4gKiAgICAgICAgICAudG9CZSgnJyk7XG4gKlxuICogICAgICBjb250YWluZXIuZWxlbWVudChieS5idXR0b25UZXh0KCdhZGQnKSkuY2xpY2soKTtcbiAqXG4gKiAgICAgIGV4cGVjdChjb250YWluZXIuZWxlbWVudChieS5yZXBlYXRlcignY29udGFjdCBpbiBjb250YWN0cycpLnJvdygyKSlcbiAqICAgICAgICAgIC5lbGVtZW50KGJ5Lm1vZGVsKCdjb250YWN0LnZhbHVlJykpXG4gKiAgICAgICAgICAuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKVxuICogICAgICAgICAgLnRvQmUoJ3lvdXJuYW1lQGV4YW1wbGUub3JnJyk7XG4gKiAgICB9KTtcbiAqICA8L2ZpbGU+XG4gKjwvZXhhbXBsZT5cblxuICovXG52YXIgbmdDb250cm9sbGVyRGlyZWN0aXZlID0gW2Z1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgc2NvcGU6IHRydWUsXG4gICAgY29udHJvbGxlcjogJ0AnLFxuICAgIHByaW9yaXR5OiA1MDBcbiAgfTtcbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ3NwXG4gKlxuICogQHJlc3RyaWN0IEFcbiAqIEBlbGVtZW50IEFOWVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogQW5ndWxhciBoYXMgc29tZSBmZWF0dXJlcyB0aGF0IGNhbiBjb25mbGljdCB3aXRoIGNlcnRhaW4gcmVzdHJpY3Rpb25zIHRoYXQgYXJlIGFwcGxpZWQgd2hlbiB1c2luZ1xuICogW0NTUCAoQ29udGVudCBTZWN1cml0eSBQb2xpY3kpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1ApIHJ1bGVzLlxuICpcbiAqIElmIHlvdSBpbnRlbmQgdG8gaW1wbGVtZW50IENTUCB3aXRoIHRoZXNlIHJ1bGVzIHRoZW4geW91IG11c3QgdGVsbCBBbmd1bGFyIG5vdCB0byB1c2UgdGhlc2VcbiAqIGZlYXR1cmVzLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gZGV2ZWxvcGluZyB0aGluZ3MgbGlrZSBHb29nbGUgQ2hyb21lIEV4dGVuc2lvbnMgb3IgVW5pdmVyc2FsIFdpbmRvd3MgQXBwcy5cbiAqXG4gKlxuICogVGhlIGZvbGxvd2luZyBkZWZhdWx0IHJ1bGVzIGluIENTUCBhZmZlY3QgQW5ndWxhcjpcbiAqXG4gKiAqIFRoZSB1c2Ugb2YgYGV2YWwoKWAsIGBGdW5jdGlvbihzdHJpbmcpYCBhbmQgc2ltaWxhciBmdW5jdGlvbnMgdG8gZHluYW1pY2FsbHkgY3JlYXRlIGFuZCBleGVjdXRlXG4gKiBjb2RlIGZyb20gc3RyaW5ncyBpcyBmb3JiaWRkZW4uIEFuZ3VsYXIgbWFrZXMgdXNlIG9mIHRoaXMgaW4gdGhlIHtAbGluayAkcGFyc2V9IHNlcnZpY2UgdG9cbiAqIHByb3ZpZGUgYSAzMCUgaW5jcmVhc2UgaW4gdGhlIHNwZWVkIG9mIGV2YWx1YXRpbmcgQW5ndWxhciBleHByZXNzaW9ucy4gKFRoaXMgQ1NQIHJ1bGUgY2FuIGJlXG4gKiBkaXNhYmxlZCB3aXRoIHRoZSBDU1Aga2V5d29yZCBgdW5zYWZlLWV2YWxgLCBidXQgaXQgaXMgZ2VuZXJhbGx5IG5vdCByZWNvbW1lbmRlZCBhcyBpdCB3b3VsZFxuICogd2Vha2VuIHRoZSBwcm90ZWN0aW9ucyBvZmZlcmVkIGJ5IENTUC4pXG4gKlxuICogKiBUaGUgdXNlIG9mIGlubGluZSByZXNvdXJjZXMsIHN1Y2ggYXMgaW5saW5lIGA8c2NyaXB0PmAgYW5kIGA8c3R5bGU+YCBlbGVtZW50cywgYXJlIGZvcmJpZGRlbi5cbiAqIFRoaXMgcHJldmVudHMgYXBwcyBmcm9tIGluamVjdGluZyBjdXN0b20gc3R5bGVzIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50LiBBbmd1bGFyIG1ha2VzIHVzZSBvZlxuICogdGhpcyB0byBpbmNsdWRlIHNvbWUgQ1NTIHJ1bGVzIChlLmcuIHtAbGluayBuZ0Nsb2FrfSBhbmQge0BsaW5rIG5nSGlkZX0pLiBUbyBtYWtlIHRoZXNlXG4gKiBkaXJlY3RpdmVzIHdvcmsgd2hlbiBhIENTUCBydWxlIGlzIGJsb2NraW5nIGlubGluZSBzdHlsZXMsIHlvdSBtdXN0IGxpbmsgdG8gdGhlIGBhbmd1bGFyLWNzcC5jc3NgXG4gKiBpbiB5b3VyIEhUTUwgbWFudWFsbHkuIChUaGlzIENTUCBydWxlIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBDU1Aga2V5d29yZCBgdW5zYWZlLWlubGluZWAsIGJ1dFxuICogaXQgaXMgZ2VuZXJhbGx5IG5vdCByZWNvbW1lbmRlZCBhcyBpdCB3b3VsZCB3ZWFrZW4gdGhlIHByb3RlY3Rpb25zIG9mZmVyZWQgYnkgQ1NQLilcbiAqXG4gKiBJZiB5b3UgZG8gbm90IHByb3ZpZGUgYG5nQ3NwYCB0aGVuIEFuZ3VsYXIgdHJpZXMgdG8gYXV0b2RldGVjdCBpZiBDU1AgaXMgYmxvY2tpbmcgZHluYW1pYyBjb2RlXG4gKiBjcmVhdGlvbiBmcm9tIHN0cmluZ3MgKGUuZy4sIGB1bnNhZmUtZXZhbGAgbm90IHNwZWNpZmllZCBpbiBDU1AgaGVhZGVyKSBhbmQgYXV0b21hdGljYWxseVxuICogZGVhY3RpdmF0ZXMgdGhpcyBmZWF0dXJlIGluIHRoZSB7QGxpbmsgJHBhcnNlfSBzZXJ2aWNlLiBUaGlzIGF1dG9kZXRlY3Rpb24sIGhvd2V2ZXIsIHRyaWdnZXJzIGFcbiAqIENTUCBlcnJvciB0byBiZSBsb2dnZWQgaW4gdGhlIGNvbnNvbGU6XG4gKlxuICogYGBgXG4gKiBSZWZ1c2VkIHRvIGV2YWx1YXRlIGEgc3RyaW5nIGFzIEphdmFTY3JpcHQgYmVjYXVzZSAndW5zYWZlLWV2YWwnIGlzIG5vdCBhbiBhbGxvd2VkIHNvdXJjZSBvZlxuICogc2NyaXB0IGluIHRoZSBmb2xsb3dpbmcgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZGlyZWN0aXZlOiBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLiBOb3RlIHRoYXRcbiAqICdzY3JpcHQtc3JjJyB3YXMgbm90IGV4cGxpY2l0bHkgc2V0LCBzbyAnZGVmYXVsdC1zcmMnIGlzIHVzZWQgYXMgYSBmYWxsYmFjay5cbiAqIGBgYFxuICpcbiAqIFRoaXMgZXJyb3IgaXMgaGFybWxlc3MgYnV0IGFubm95aW5nLiBUbyBwcmV2ZW50IHRoZSBlcnJvciBmcm9tIHNob3dpbmcgdXAsIHB1dCB0aGUgYG5nQ3NwYFxuICogZGlyZWN0aXZlIG9uIGFuIGVsZW1lbnQgb2YgdGhlIEhUTUwgZG9jdW1lbnQgdGhhdCBhcHBlYXJzIGJlZm9yZSB0aGUgYDxzY3JpcHQ+YCB0YWcgdGhhdCBsb2Fkc1xuICogdGhlIGBhbmd1bGFyLmpzYCBmaWxlLlxuICpcbiAqICpOb3RlOiBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgYG5nLWNzcGAgYW5kIGBkYXRhLW5nLWNzcGAgYXR0cmlidXRlIGZvcm0uKlxuICpcbiAqIFlvdSBjYW4gc3BlY2lmeSB3aGljaCBvZiB0aGUgQ1NQIHJlbGF0ZWQgQW5ndWxhciBmZWF0dXJlcyBzaG91bGQgYmUgZGVhY3RpdmF0ZWQgYnkgcHJvdmlkaW5nXG4gKiBhIHZhbHVlIGZvciB0aGUgYG5nLWNzcGAgYXR0cmlidXRlLiBUaGUgb3B0aW9ucyBhcmUgYXMgZm9sbG93czpcbiAqXG4gKiAqIG5vLWlubGluZS1zdHlsZTogdGhpcyBzdG9wcyBBbmd1bGFyIGZyb20gaW5qZWN0aW5nIENTUyBzdHlsZXMgaW50byB0aGUgRE9NXG4gKlxuICogKiBuby11bnNhZmUtZXZhbDogdGhpcyBzdG9wcyBBbmd1bGFyIGZyb20gb3B0aW1pemluZyAkcGFyc2Ugd2l0aCB1bnNhZmUgZXZhbCBvZiBzdHJpbmdzXG4gKlxuICogWW91IGNhbiB1c2UgdGhlc2UgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOlxuICpcbiAqXG4gKiAqIE5vIGRlY2xhcmF0aW9uIG1lYW5zIHRoYXQgQW5ndWxhciB3aWxsIGFzc3VtZSB0aGF0IHlvdSBjYW4gZG8gaW5saW5lIHN0eWxlcywgYnV0IGl0IHdpbGwgZG9cbiAqIGEgcnVudGltZSBjaGVjayBmb3IgdW5zYWZlLWV2YWwuIEUuZy4gYDxib2R5PmAuIFRoaXMgaXMgYmFja3dhcmRseSBjb21wYXRpYmxlIHdpdGggcHJldmlvdXNcbiAqIHZlcnNpb25zIG9mIEFuZ3VsYXIuXG4gKlxuICogKiBBIHNpbXBsZSBgbmctY3NwYCAob3IgYGRhdGEtbmctY3NwYCkgYXR0cmlidXRlIHdpbGwgdGVsbCBBbmd1bGFyIHRvIGRlYWN0aXZhdGUgYm90aCBpbmxpbmVcbiAqIHN0eWxlcyBhbmQgdW5zYWZlIGV2YWwuIEUuZy4gYDxib2R5IG5nLWNzcD5gLiBUaGlzIGlzIGJhY2t3YXJkbHkgY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzXG4gKiB2ZXJzaW9ucyBvZiBBbmd1bGFyLlxuICpcbiAqICogU3BlY2lmeWluZyBvbmx5IGBuby11bnNhZmUtZXZhbGAgdGVsbHMgQW5ndWxhciB0aGF0IHdlIG11c3Qgbm90IHVzZSBldmFsLCBidXQgdGhhdCB3ZSBjYW5cbiAqIGluamVjdCBpbmxpbmUgc3R5bGVzLiBFLmcuIGA8Ym9keSBuZy1jc3A9XCJuby11bnNhZmUtZXZhbFwiPmAuXG4gKlxuICogKiBTcGVjaWZ5aW5nIG9ubHkgYG5vLWlubGluZS1zdHlsZWAgdGVsbHMgQW5ndWxhciB0aGF0IHdlIG11c3Qgbm90IGluamVjdCBzdHlsZXMsIGJ1dCB0aGF0IHdlIGNhblxuICogcnVuIGV2YWwgLSBubyBhdXRvbWF0aWMgY2hlY2sgZm9yIHVuc2FmZSBldmFsIHdpbGwgb2NjdXIuIEUuZy4gYDxib2R5IG5nLWNzcD1cIm5vLWlubGluZS1zdHlsZVwiPmBcbiAqXG4gKiAqIFNwZWNpZnlpbmcgYm90aCBgbm8tdW5zYWZlLWV2YWxgIGFuZCBgbm8taW5saW5lLXN0eWxlYCB0ZWxscyBBbmd1bGFyIHRoYXQgd2UgbXVzdCBub3QgaW5qZWN0XG4gKiBzdHlsZXMgbm9yIHVzZSBldmFsLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBhbiBlbXB0eTogbmctY3NwLlxuICogRS5nLmA8Ym9keSBuZy1jc3A9XCJuby1pbmxpbmUtc3R5bGU7bm8tdW5zYWZlLWV2YWxcIj5gXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gYXBwbHkgdGhlIGBuZ0NzcGAgZGlyZWN0aXZlIHRvIHRoZSBgaHRtbGAgdGFnLlxuICAgYGBgaHRtbFxuICAgICA8IWRvY3R5cGUgaHRtbD5cbiAgICAgPGh0bWwgbmctYXBwIG5nLWNzcD5cbiAgICAgLi4uXG4gICAgIC4uLlxuICAgICA8L2h0bWw+XG4gICBgYGBcbiAgKiBAZXhhbXBsZVxuICAgICAgPCEtLSBOb3RlOiB0aGUgYC5jc3BgIHN1ZmZpeCBpbiB0aGUgZXhhbXBsZSBuYW1lIHRyaWdnZXJzIENTUCBtb2RlIGluIG91ciBodHRwIHNlcnZlciEgLS0+XG4gICAgICA8ZXhhbXBsZSBuYW1lPVwiZXhhbXBsZS5jc3BcIiBtb2R1bGU9XCJjc3BFeGFtcGxlXCIgbmctY3NwPVwidHJ1ZVwiPlxuICAgICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICAgIDxkaXYgbmctY29udHJvbGxlcj1cIk1haW5Db250cm9sbGVyIGFzIGN0cmxcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJjdHJsLmluYygpXCIgaWQ9XCJpbmNcIj5JbmNyZW1lbnQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJjb3VudGVyXCI+XG4gICAgICAgICAgICAgICAge3tjdHJsLmNvdW50ZXJ9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImN0cmwuZXZpbCgpXCIgaWQ9XCJldmlsXCI+RXZpbDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImV2aWxFcnJvclwiPlxuICAgICAgICAgICAgICAgIHt7Y3RybC5ldmlsRXJyb3J9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWxlPlxuICAgICAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICAgICAgIGFuZ3VsYXIubW9kdWxlKCdjc3BFeGFtcGxlJywgW10pXG4gICAgICAgICAgICAgLmNvbnRyb2xsZXIoJ01haW5Db250cm9sbGVyJywgZnVuY3Rpb24gTWFpbkNvbnRyb2xsZXIoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyKys7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmV2aWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV2YWwoJzErMicpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmlsRXJyb3IgPSBlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgIDwvZmlsZT5cbiAgICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICAgIHZhciB1dGlsLCB3ZWJkcml2ZXI7XG5cbiAgICAgICAgICB2YXIgaW5jQnRuID0gZWxlbWVudChieS5pZCgnaW5jJykpO1xuICAgICAgICAgIHZhciBjb3VudGVyID0gZWxlbWVudChieS5pZCgnY291bnRlcicpKTtcbiAgICAgICAgICB2YXIgZXZpbEJ0biA9IGVsZW1lbnQoYnkuaWQoJ2V2aWwnKSk7XG4gICAgICAgICAgdmFyIGV2aWxFcnJvciA9IGVsZW1lbnQoYnkuaWQoJ2V2aWxFcnJvcicpKTtcblxuICAgICAgICAgIGZ1bmN0aW9uIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIubWFuYWdlKCkubG9ncygpLmdldCgnYnJvd3NlcicpLnRoZW4oZnVuY3Rpb24oYnJvd3NlckxvZykge1xuICAgICAgICAgICAgICByZXR1cm4gYnJvd3NlckxvZy5maWx0ZXIoZnVuY3Rpb24obG9nRW50cnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9nRW50cnkubGV2ZWwudmFsdWUgPiB3ZWJkcml2ZXIubG9nZ2luZy5MZXZlbC5XQVJOSU5HLnZhbHVlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyRXJyb3JzKCkge1xuICAgICAgICAgICAgZ2V0QW5kQ2xlYXJTZXZlcmVFcnJvcnMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBleHBlY3ROb0Vycm9ycygpIHtcbiAgICAgICAgICAgIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkudGhlbihmdW5jdGlvbihmaWx0ZXJlZExvZykge1xuICAgICAgICAgICAgICBleHBlY3QoZmlsdGVyZWRMb2cubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRMb2cubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Jyb3dzZXIgY29uc29sZSBlcnJvcnM6ICcgKyB1dGlsLmluc3BlY3QoZmlsdGVyZWRMb2cpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gZXhwZWN0RXJyb3IocmVnZXgpIHtcbiAgICAgICAgICAgIGdldEFuZENsZWFyU2V2ZXJlRXJyb3JzKCkudGhlbihmdW5jdGlvbihmaWx0ZXJlZExvZykge1xuICAgICAgICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZmlsdGVyZWRMb2cuZm9yRWFjaChmdW5jdGlvbihsb2cpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9nLm1lc3NhZ2UubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYW4gZXJyb3IgdGhhdCBtYXRjaGVzICcgKyByZWdleCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJlZm9yZUVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuICAgICAgICAgICAgd2ViZHJpdmVyID0gcmVxdWlyZSgnc2VsZW5pdW0td2ViZHJpdmVyJyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHRlc3Qgb24gQ2hyb21lLFxuICAgICAgICAgIC8vIGFzIFNhZmFyaSBkb2VzIG5vdCBsb2FkIHRoZSBwYWdlIHdpdGggUHJvdHJhY3RvcidzIGluamVjdGVkIHNjcmlwdHMsXG4gICAgICAgICAgLy8gYW5kIEZpcmVmb3ggd2ViZHJpdmVyIGFsd2F5cyBkaXNhYmxlcyBjb250ZW50IHNlY3VyaXR5IHBvbGljeSAoIzYzNTgpXG4gICAgICAgICAgaWYgKGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXQoJ3Nob3VsZCBub3QgcmVwb3J0IGVycm9ycyB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gY2xlYXIgZXJyb3JzIHNvIHdlIGFyZSBub3QgZGVwZW5kZW50IG9uIHByZXZpb3VzIHRlc3RzXG4gICAgICAgICAgICBjbGVhckVycm9ycygpO1xuICAgICAgICAgICAgLy8gTmVlZCB0byByZWxvYWQgdGhlIHBhZ2UgYXMgdGhlIHBhZ2UgaXMgYWxyZWFkeSBsb2FkZWQgd2hlblxuICAgICAgICAgICAgLy8gd2UgY29tZSBoZXJlXG4gICAgICAgICAgICBicm93c2VyLmRyaXZlci5nZXRDdXJyZW50VXJsKCkudGhlbihmdW5jdGlvbih1cmwpIHtcbiAgICAgICAgICAgICAgYnJvd3Nlci5nZXQodXJsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXhwZWN0Tm9FcnJvcnMoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgZXZhbHVhdGUgZXhwcmVzc2lvbnMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGV4cGVjdChjb3VudGVyLmdldFRleHQoKSkudG9FcXVhbCgnMCcpO1xuICAgICAgICAgICAgaW5jQnRuLmNsaWNrKCk7XG4gICAgICAgICAgICBleHBlY3QoY291bnRlci5nZXRUZXh0KCkpLnRvRXF1YWwoJzEnKTtcbiAgICAgICAgICAgIGV4cGVjdE5vRXJyb3JzKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIHRocm93IGFuZCByZXBvcnQgYW4gZXJyb3Igd2hlbiB1c2luZyBcImV2YWxcIicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZXZpbEJ0bi5jbGljaygpO1xuICAgICAgICAgICAgZXhwZWN0KGV2aWxFcnJvci5nZXRUZXh0KCkpLnRvTWF0Y2goL0NvbnRlbnQgU2VjdXJpdHkgUG9saWN5Lyk7XG4gICAgICAgICAgICBleHBlY3RFcnJvcigvQ29udGVudCBTZWN1cml0eSBQb2xpY3kvKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgPC9maWxlPlxuICAgICAgPC9leGFtcGxlPlxuICAqL1xuXG4vLyBgbmdDc3BgIGlzIG5vdCBpbXBsZW1lbnRlZCBhcyBhIHByb3BlciBkaXJlY3RpdmUgYW55IG1vcmUsIGJlY2F1c2Ugd2UgbmVlZCBpdCBiZSBwcm9jZXNzZWQgd2hpbGVcbi8vIHdlIGJvb3RzdHJhcCB0aGUgYXBwIChiZWZvcmUgYCRwYXJzZWAgaXMgaW5zdGFudGlhdGVkKS4gRm9yIHRoaXMgcmVhc29uLCB3ZSBqdXN0IGhhdmUgdGhlIGBjc3AoKWBcbi8vIGZuIHRoYXQgbG9va3MgZm9yIHRoZSBgbmctY3NwYCBhdHRyaWJ1dGUgYW55d2hlcmUgaW4gdGhlIGN1cnJlbnQgZG9jLlxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ2xpY2tcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBuZ0NsaWNrIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIHdoZW5cbiAqIGFuIGVsZW1lbnQgaXMgY2xpY2tlZC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nQ2xpY2sge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogY2xpY2suICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KVxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctY2xpY2tcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctY2xpY2s9XCJjb3VudCA9IGNvdW50ICsgMVwiIG5nLWluaXQ9XCJjb3VudD0wXCI+XG4gICAgICAgIEluY3JlbWVudFxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3Bhbj5cbiAgICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICAgPC9zcGFuPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICBpdCgnc2hvdWxkIGNoZWNrIG5nLWNsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCdjb3VudCcpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJzAnKTtcbiAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCdidXR0b24nKSkuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2NvdW50JykpLmdldFRleHQoKSkudG9NYXRjaCgnMScpO1xuICAgICAgIH0pO1xuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cbi8qXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGlyZWN0aXZlcyB0aGF0IGFsbG93cyBjcmVhdGlvbiBvZiBjdXN0b20gZXZlbnQgaGFuZGxlcnMgdGhhdCBhcmUgZGVmaW5lZCBhc1xuICogYW5ndWxhciBleHByZXNzaW9ucyBhbmQgYXJlIGNvbXBpbGVkIGFuZCBleGVjdXRlZCB3aXRoaW4gdGhlIGN1cnJlbnQgc2NvcGUuXG4gKi9cbnZhciBuZ0V2ZW50RGlyZWN0aXZlcyA9IHt9O1xuXG4vLyBGb3IgZXZlbnRzIHRoYXQgbWlnaHQgZmlyZSBzeW5jaHJvbm91c2x5IGR1cmluZyBET00gbWFuaXB1bGF0aW9uXG4vLyB3ZSBuZWVkIHRvIGV4ZWN1dGUgdGhlaXIgZXZlbnQgaGFuZGxlcnMgYXN5bmNocm9ub3VzbHkgdXNpbmcgJGV2YWxBc3luYyxcbi8vIHNvIHRoYXQgdGhleSBhcmUgbm90IGV4ZWN1dGVkIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbnZhciBmb3JjZUFzeW5jRXZlbnRzID0ge1xuICAnYmx1cic6IHRydWUsXG4gICdmb2N1cyc6IHRydWVcbn07XG5mb3JFYWNoKFxuICAnY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBtb3VzZWVudGVyIG1vdXNlbGVhdmUga2V5ZG93biBrZXl1cCBrZXlwcmVzcyBzdWJtaXQgZm9jdXMgYmx1ciBjb3B5IGN1dCBwYXN0ZScuc3BsaXQoJyAnKSxcbiAgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgdmFyIGRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOb3JtYWxpemUoJ25nLScgKyBldmVudE5hbWUpO1xuICAgIG5nRXZlbnREaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gWyckcGFyc2UnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRwYXJzZSwgJHJvb3RTY29wZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgY29tcGlsZTogZnVuY3Rpb24oJGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgICAvLyBXZSBleHBvc2UgdGhlIHBvd2VyZnVsICRldmVudCBvYmplY3Qgb24gdGhlIHNjb3BlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBXaW5kb3csXG4gICAgICAgICAgLy8gZXRjLiB0aGF0IGlzbid0IHByb3RlY3RlZCBieSB0aGUgZmFzdCBwYXRocyBpbiAkcGFyc2UuICBXZSBleHBsaWNpdGx5IHJlcXVlc3QgYmV0dGVyXG4gICAgICAgICAgLy8gY2hlY2tzIGF0IHRoZSBjb3N0IG9mIHNwZWVkIHNpbmNlIGV2ZW50IGhhbmRsZXIgZXhwcmVzc2lvbnMgYXJlIG5vdCBleGVjdXRlZCBhc1xuICAgICAgICAgIC8vIGZyZXF1ZW50bHkgYXMgcmVndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgICAgIHZhciBmbiA9ICRwYXJzZShhdHRyW2RpcmVjdGl2ZU5hbWVdLCAvKiBpbnRlcmNlcHRvckZuICovIG51bGwsIC8qIGV4cGVuc2l2ZUNoZWNrcyAqLyB0cnVlKTtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmdFdmVudEhhbmRsZXIoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQub24oZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBmbihzY29wZSwgeyRldmVudDpldmVudH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBpZiAoZm9yY2VBc3luY0V2ZW50c1tldmVudE5hbWVdICYmICRyb290U2NvcGUuJCRwaGFzZSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLiRldmFsQXN5bmMoY2FsbGJhY2spO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShjYWxsYmFjayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfV07XG4gIH1cbik7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdEYmxjbGlja1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ0RibGNsaWNrYCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBhIGRibGNsaWNrIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdEYmxjbGljayB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBhIGRibGNsaWNrLiAoVGhlIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGApXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1kYmxjbGlja1wiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGJ1dHRvbiBuZy1kYmxjbGljaz1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgICAgSW5jcmVtZW50IChvbiBkb3VibGUgY2xpY2spXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIGNvdW50OiB7e2NvdW50fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01vdXNlZG93blxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIG5nTW91c2Vkb3duIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlZG93biBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2Vkb3duIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIG1vdXNlZG93bi4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1tb3VzZWRvd25cIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctbW91c2Vkb3duPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAgICBJbmNyZW1lbnQgKG9uIG1vdXNlIGRvd24pXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIGNvdW50OiB7e2NvdW50fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01vdXNldXBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNldXAgZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNldXAge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogbW91c2V1cC4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1tb3VzZXVwXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8YnV0dG9uIG5nLW1vdXNldXA9XCJjb3VudCA9IGNvdW50ICsgMVwiIG5nLWluaXQ9XCJjb3VudD0wXCI+XG4gICAgICAgIEluY3JlbWVudCAob24gbW91c2UgdXApXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIGNvdW50OiB7e2NvdW50fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdNb3VzZW92ZXJcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIG1vdXNlb3ZlciBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VvdmVyIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIG1vdXNlb3Zlci4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1tb3VzZW92ZXJcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctbW91c2VvdmVyPVwiY291bnQgPSBjb3VudCArIDFcIiBuZy1pbml0PVwiY291bnQ9MFwiPlxuICAgICAgICBJbmNyZW1lbnQgKHdoZW4gbW91c2UgaXMgb3ZlcilcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTW91c2VlbnRlclxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2VlbnRlciBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VlbnRlciB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBtb3VzZWVudGVyLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLW1vdXNlZW50ZXJcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctbW91c2VlbnRlcj1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgICAgSW5jcmVtZW50ICh3aGVuIG1vdXNlIGVudGVycylcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTW91c2VsZWF2ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gbW91c2VsZWF2ZSBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nTW91c2VsZWF2ZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBtb3VzZWxlYXZlLiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLW1vdXNlbGVhdmVcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxidXR0b24gbmctbW91c2VsZWF2ZT1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgICAgSW5jcmVtZW50ICh3aGVuIG1vdXNlIGxlYXZlcylcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgY291bnQ6IHt7Y291bnR9fVxuICAgICA8L2ZpbGU+XG4gICA8L2V4YW1wbGU+XG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nTW91c2Vtb3ZlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBtb3VzZW1vdmUgZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ01vdXNlbW92ZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBtb3VzZW1vdmUuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KVxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmctbW91c2Vtb3ZlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8YnV0dG9uIG5nLW1vdXNlbW92ZT1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgICAgSW5jcmVtZW50ICh3aGVuIG1vdXNlIG1vdmVzKVxuICAgICAgPC9idXR0b24+XG4gICAgICBjb3VudDoge3tjb3VudH19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdLZXlkb3duXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBrZXlkb3duIGV2ZW50LlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdLZXlkb3duIHtAbGluayBndWlkZS9leHByZXNzaW9uIEV4cHJlc3Npb259IHRvIGV2YWx1YXRlIHVwb25cbiAqIGtleWRvd24uIChFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgIGFuZCBjYW4gYmUgaW50ZXJyb2dhdGVkIGZvciBrZXlDb2RlLCBhbHRLZXksIGV0Yy4pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1rZXlkb3duXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8aW5wdXQgbmcta2V5ZG93bj1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgIGtleSBkb3duIGNvdW50OiB7e2NvdW50fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0tleXVwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBrZXl1cCBldmVudC5cbiAqXG4gKiBAZWxlbWVudCBBTllcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nS2V5dXAge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICoga2V5dXAuIChFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgIGFuZCBjYW4gYmUgaW50ZXJyb2dhdGVkIGZvciBrZXlDb2RlLCBhbHRLZXksIGV0Yy4pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1rZXl1cFwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgIDxwPlR5cGluZyBpbiB0aGUgaW5wdXQgYm94IGJlbG93IHVwZGF0ZXMgdGhlIGtleSBjb3VudDwvcD5cbiAgICAgICA8aW5wdXQgbmcta2V5dXA9XCJjb3VudCA9IGNvdW50ICsgMVwiIG5nLWluaXQ9XCJjb3VudD0wXCI+IGtleSB1cCBjb3VudDoge3tjb3VudH19XG5cbiAgICAgICA8cD5UeXBpbmcgaW4gdGhlIGlucHV0IGJveCBiZWxvdyB1cGRhdGVzIHRoZSBrZXljb2RlPC9wPlxuICAgICAgIDxpbnB1dCBuZy1rZXl1cD1cImV2ZW50PSRldmVudFwiPlxuICAgICAgIDxwPmV2ZW50IGtleUNvZGU6IHt7IGV2ZW50LmtleUNvZGUgfX08L3A+XG4gICAgICAgPHA+ZXZlbnQgYWx0S2V5OiB7eyBldmVudC5hbHRLZXkgfX08L3A+XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdLZXlwcmVzc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24ga2V5cHJlc3MgZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nS2V5cHJlc3Mge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICoga2V5cHJlc3MuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9XG4gKiBhbmQgY2FuIGJlIGludGVycm9nYXRlZCBmb3Iga2V5Q29kZSwgYWx0S2V5LCBldGMuKVxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBuYW1lPVwibmcta2V5cHJlc3NcIj5cbiAgICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxpbnB1dCBuZy1rZXlwcmVzcz1cImNvdW50ID0gY291bnQgKyAxXCIgbmctaW5pdD1cImNvdW50PTBcIj5cbiAgICAgIGtleSBwcmVzcyBjb3VudDoge3tjb3VudH19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdTdWJtaXRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEVuYWJsZXMgYmluZGluZyBhbmd1bGFyIGV4cHJlc3Npb25zIHRvIG9uc3VibWl0IGV2ZW50cy5cbiAqXG4gKiBBZGRpdGlvbmFsbHkgaXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYWN0aW9uICh3aGljaCBmb3IgZm9ybSBtZWFucyBzZW5kaW5nIHRoZSByZXF1ZXN0IHRvIHRoZVxuICogc2VydmVyIGFuZCByZWxvYWRpbmcgdGhlIGN1cnJlbnQgcGFnZSksIGJ1dCBvbmx5IGlmIHRoZSBmb3JtIGRvZXMgbm90IGNvbnRhaW4gYGFjdGlvbmAsXG4gKiBgZGF0YS1hY3Rpb25gLCBvciBgeC1hY3Rpb25gIGF0dHJpYnV0ZXMuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqV2FybmluZzoqKiBCZSBjYXJlZnVsIG5vdCB0byBjYXVzZSBcImRvdWJsZS1zdWJtaXNzaW9uXCIgYnkgdXNpbmcgYm90aCB0aGUgYG5nQ2xpY2tgIGFuZFxuICogYG5nU3VibWl0YCBoYW5kbGVycyB0b2dldGhlci4gU2VlIHRoZVxuICoge0BsaW5rIGZvcm0jc3VibWl0dGluZy1hLWZvcm0tYW5kLXByZXZlbnRpbmctdGhlLWRlZmF1bHQtYWN0aW9uIGBmb3JtYCBkaXJlY3RpdmUgZG9jdW1lbnRhdGlvbn1cbiAqIGZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24gb2Ygd2hlbiBgbmdTdWJtaXRgIG1heSBiZSB0cmlnZ2VyZWQuXG4gKiA8L2Rpdj5cbiAqXG4gKiBAZWxlbWVudCBmb3JtXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ1N1Ym1pdCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLlxuICogKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG1vZHVsZT1cInN1Ym1pdEV4YW1wbGVcIiBuYW1lPVwibmctc3VibWl0XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8c2NyaXB0PlxuICAgICAgICBhbmd1bGFyLm1vZHVsZSgnc3VibWl0RXhhbXBsZScsIFtdKVxuICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAkc2NvcGUubGlzdCA9IFtdO1xuICAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnaGVsbG8nO1xuICAgICAgICAgICAgJHNjb3BlLnN1Ym1pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoJHNjb3BlLnRleHQpIHtcbiAgICAgICAgICAgICAgICAkc2NvcGUubGlzdC5wdXNoKHRoaXMudGV4dCk7XG4gICAgICAgICAgICAgICAgJHNjb3BlLnRleHQgPSAnJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XSk7XG4gICAgICA8L3NjcmlwdD5cbiAgICAgIDxmb3JtIG5nLXN1Ym1pdD1cInN1Ym1pdCgpXCIgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgIEVudGVyIHRleHQgYW5kIGhpdCBlbnRlcjpcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJ0ZXh0XCIgbmFtZT1cInRleHRcIiAvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIGlkPVwic3VibWl0XCIgdmFsdWU9XCJTdWJtaXRcIiAvPlxuICAgICAgICA8cHJlPmxpc3Q9e3tsaXN0fX08L3ByZT5cbiAgICAgIDwvZm9ybT5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zdWJtaXQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QnKSkuZ2V0VGV4dCgpKS50b0JlKCdsaXN0PVtdJyk7XG4gICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3N1Ym1pdCcpKS5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQ29udGFpbignaGVsbG8nKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5Lm1vZGVsKCd0ZXh0JykpLmdldEF0dHJpYnV0ZSgndmFsdWUnKSkudG9CZSgnJyk7XG4gICAgICAgfSk7XG4gICAgICAgaXQoJ3Nob3VsZCBpZ25vcmUgZW1wdHkgc3RyaW5ncycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3Q9W10nKTtcbiAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCcjc3VibWl0JykpLmNsaWNrKCk7XG4gICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3N1Ym1pdCcpKS5jbGljaygpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygnbGlzdCcpKS5nZXRUZXh0KCkpLnRvQ29udGFpbignaGVsbG8nKTtcbiAgICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nRm9jdXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGZvY3VzIGV2ZW50LlxuICpcbiAqIE5vdGU6IEFzIHRoZSBgZm9jdXNgIGV2ZW50IGlzIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHkgd2hlbiBjYWxsaW5nIGBpbnB1dC5mb2N1cygpYFxuICogQW5ndWxhckpTIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uIHVzaW5nIGBzY29wZS4kZXZhbEFzeW5jYCBpZiB0aGUgZXZlbnQgaXMgZmlyZWRcbiAqIGR1cmluZyBhbiBgJGFwcGx5YCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHN0YXRlLlxuICpcbiAqIEBlbGVtZW50IHdpbmRvdywgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGFcbiAqIEBwcmlvcml0eSAwXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nRm9jdXMge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogZm9jdXMuICh7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiMtZXZlbnQtIEV2ZW50IG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYCRldmVudGB9KVxuICpcbiAqIEBleGFtcGxlXG4gKiBTZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NsaWNrIG5nQ2xpY2t9XG4gKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ0JsdXJcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNwZWNpZnkgY3VzdG9tIGJlaGF2aW9yIG9uIGJsdXIgZXZlbnQuXG4gKlxuICogQSBbYmx1ciBldmVudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2JsdXIpIGZpcmVzIHdoZW5cbiAqIGFuIGVsZW1lbnQgaGFzIGxvc3QgZm9jdXMuXG4gKlxuICogTm90ZTogQXMgdGhlIGBibHVyYCBldmVudCBpcyBleGVjdXRlZCBzeW5jaHJvbm91c2x5IGFsc28gZHVyaW5nIERPTSBtYW5pcHVsYXRpb25zXG4gKiAoZS5nLiByZW1vdmluZyBhIGZvY3Vzc2VkIGlucHV0KSxcbiAqIEFuZ3VsYXJKUyBleGVjdXRlcyB0aGUgZXhwcmVzc2lvbiB1c2luZyBgc2NvcGUuJGV2YWxBc3luY2AgaWYgdGhlIGV2ZW50IGlzIGZpcmVkXG4gKiBkdXJpbmcgYW4gYCRhcHBseWAgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBzdGF0ZS5cbiAqXG4gKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0JsdXIge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogYmx1ci4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAqIFNlZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nQ2xpY2sgbmdDbGlja31cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ29weVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gY29weSBldmVudC5cbiAqXG4gKiBAZWxlbWVudCB3aW5kb3csIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBhXG4gKiBAcHJpb3JpdHkgMFxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0NvcHkge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogY29weS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1jb3B5XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8aW5wdXQgbmctY29weT1cImNvcGllZD10cnVlXCIgbmctaW5pdD1cImNvcGllZD1mYWxzZTsgdmFsdWU9J2NvcHkgbWUnXCIgbmctbW9kZWw9XCJ2YWx1ZVwiPlxuICAgICAgY29waWVkOiB7e2NvcGllZH19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nQ3V0XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTcGVjaWZ5IGN1c3RvbSBiZWhhdmlvciBvbiBjdXQgZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdDdXQge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gRXhwcmVzc2lvbn0gdG8gZXZhbHVhdGUgdXBvblxuICogY3V0LiAoe0BsaW5rIGd1aWRlL2V4cHJlc3Npb24jLWV2ZW50LSBFdmVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGAkZXZlbnRgfSlcbiAqXG4gKiBAZXhhbXBsZVxuICAgPGV4YW1wbGUgbmFtZT1cIm5nLWN1dFwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGlucHV0IG5nLWN1dD1cImN1dD10cnVlXCIgbmctaW5pdD1cImN1dD1mYWxzZTsgdmFsdWU9J2N1dCBtZSdcIiBuZy1tb2RlbD1cInZhbHVlXCI+XG4gICAgICBjdXQ6IHt7Y3V0fX1cbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdQYXN0ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3BlY2lmeSBjdXN0b20gYmVoYXZpb3Igb24gcGFzdGUgZXZlbnQuXG4gKlxuICogQGVsZW1lbnQgd2luZG93LCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYVxuICogQHByaW9yaXR5IDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdQYXN0ZSB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsdWF0ZSB1cG9uXG4gKiBwYXN0ZS4gKHtAbGluayBndWlkZS9leHByZXNzaW9uIy1ldmVudC0gRXZlbnQgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBgJGV2ZW50YH0pXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1wYXN0ZVwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGlucHV0IG5nLXBhc3RlPVwicGFzdGU9dHJ1ZVwiIG5nLWluaXQ9XCJwYXN0ZT1mYWxzZVwiIHBsYWNlaG9sZGVyPSdwYXN0ZSBoZXJlJz5cbiAgICAgIHBhc3RlZDoge3twYXN0ZX19XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nSWZcbiAqIEByZXN0cmljdCBBXG4gKiBAbXVsdGlFbGVtZW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nSWZgIGRpcmVjdGl2ZSByZW1vdmVzIG9yIHJlY3JlYXRlcyBhIHBvcnRpb24gb2YgdGhlIERPTSB0cmVlIGJhc2VkIG9uIGFuXG4gKiB7ZXhwcmVzc2lvbn0uIElmIHRoZSBleHByZXNzaW9uIGFzc2lnbmVkIHRvIGBuZ0lmYCBldmFsdWF0ZXMgdG8gYSBmYWxzZVxuICogdmFsdWUgdGhlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSwgb3RoZXJ3aXNlIGEgY2xvbmUgb2YgdGhlXG4gKiBlbGVtZW50IGlzIHJlaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICpcbiAqIGBuZ0lmYCBkaWZmZXJzIGZyb20gYG5nU2hvd2AgYW5kIGBuZ0hpZGVgIGluIHRoYXQgYG5nSWZgIGNvbXBsZXRlbHkgcmVtb3ZlcyBhbmQgcmVjcmVhdGVzIHRoZVxuICogZWxlbWVudCBpbiB0aGUgRE9NIHJhdGhlciB0aGFuIGNoYW5naW5nIGl0cyB2aXNpYmlsaXR5IHZpYSB0aGUgYGRpc3BsYXlgIGNzcyBwcm9wZXJ0eS4gIEEgY29tbW9uXG4gKiBjYXNlIHdoZW4gdGhpcyBkaWZmZXJlbmNlIGlzIHNpZ25pZmljYW50IGlzIHdoZW4gdXNpbmcgY3NzIHNlbGVjdG9ycyB0aGF0IHJlbHkgb24gYW4gZWxlbWVudCdzXG4gKiBwb3NpdGlvbiB3aXRoaW4gdGhlIERPTSwgc3VjaCBhcyB0aGUgYDpmaXJzdC1jaGlsZGAgb3IgYDpsYXN0LWNoaWxkYCBwc2V1ZG8tY2xhc3Nlcy5cbiAqXG4gKiBOb3RlIHRoYXQgd2hlbiBhbiBlbGVtZW50IGlzIHJlbW92ZWQgdXNpbmcgYG5nSWZgIGl0cyBzY29wZSBpcyBkZXN0cm95ZWQgYW5kIGEgbmV3IHNjb3BlXG4gKiBpcyBjcmVhdGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVzdG9yZWQuICBUaGUgc2NvcGUgY3JlYXRlZCB3aXRoaW4gYG5nSWZgIGluaGVyaXRzIGZyb21cbiAqIGl0cyBwYXJlbnQgc2NvcGUgdXNpbmdcbiAqIFtwcm90b3R5cGFsIGluaGVyaXRhbmNlXShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3dpa2kvVW5kZXJzdGFuZGluZy1TY29wZXMjamF2YXNjcmlwdC1wcm90b3R5cGFsLWluaGVyaXRhbmNlKS5cbiAqIEFuIGltcG9ydGFudCBpbXBsaWNhdGlvbiBvZiB0aGlzIGlzIGlmIGBuZ01vZGVsYCBpcyB1c2VkIHdpdGhpbiBgbmdJZmAgdG8gYmluZCB0b1xuICogYSBqYXZhc2NyaXB0IHByaW1pdGl2ZSBkZWZpbmVkIGluIHRoZSBwYXJlbnQgc2NvcGUuIEluIHRoaXMgY2FzZSBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZVxuICogdmFyaWFibGUgd2l0aGluIHRoZSBjaGlsZCBzY29wZSB3aWxsIG92ZXJyaWRlIChoaWRlKSB0aGUgdmFsdWUgaW4gdGhlIHBhcmVudCBzY29wZS5cbiAqXG4gKiBBbHNvLCBgbmdJZmAgcmVjcmVhdGVzIGVsZW1lbnRzIHVzaW5nIHRoZWlyIGNvbXBpbGVkIHN0YXRlLiBBbiBleGFtcGxlIG9mIHRoaXMgYmVoYXZpb3JcbiAqIGlzIGlmIGFuIGVsZW1lbnQncyBjbGFzcyBhdHRyaWJ1dGUgaXMgZGlyZWN0bHkgbW9kaWZpZWQgYWZ0ZXIgaXQncyBjb21waWxlZCwgdXNpbmcgc29tZXRoaW5nIGxpa2VcbiAqIGpRdWVyeSdzIGAuYWRkQ2xhc3MoKWAgbWV0aG9kLCBhbmQgdGhlIGVsZW1lbnQgaXMgbGF0ZXIgcmVtb3ZlZC4gV2hlbiBgbmdJZmAgcmVjcmVhdGVzIHRoZSBlbGVtZW50XG4gKiB0aGUgYWRkZWQgY2xhc3Mgd2lsbCBiZSBsb3N0IGJlY2F1c2UgdGhlIG9yaWdpbmFsIGNvbXBpbGVkIHN0YXRlIGlzIHVzZWQgdG8gcmVnZW5lcmF0ZSB0aGUgZWxlbWVudC5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gcHJvdmlkZSBhbmltYXRpb25zIHZpYSB0aGUgYG5nQW5pbWF0ZWAgbW9kdWxlIHRvIGFuaW1hdGUgdGhlIGBlbnRlcmBcbiAqIGFuZCBgbGVhdmVgIGVmZmVjdHMuXG4gKlxuICogQGFuaW1hdGlvbnNcbiAqIHwgQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfCBPY2N1cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2VudGVyIGVudGVyfSAgfCBqdXN0IGFmdGVyIHRoZSBgbmdJZmAgY29udGVudHMgY2hhbmdlIGFuZCBhIG5ldyBET00gZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpbmplY3RlZCBpbnRvIHRoZSBgbmdJZmAgY29udGFpbmVyIHxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2xlYXZlIGxlYXZlfSAgfCBqdXN0IGJlZm9yZSB0aGUgYG5nSWZgIGNvbnRlbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTSB8XG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAc2NvcGVcbiAqIEBwcmlvcml0eSA2MDBcbiAqIEBwYXJhbSB7ZXhwcmVzc2lvbn0gbmdJZiBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgZmFsc3kgdGhlblxuICogICAgIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NIHRyZWUuIElmIGl0IGlzIHRydXRoeSBhIGNvcHkgb2YgdGhlIGNvbXBpbGVkXG4gKiAgICAgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgRE9NIHRyZWUuXG4gKlxuICogQGV4YW1wbGVcbiAgPGV4YW1wbGUgbW9kdWxlPVwibmdBbmltYXRlXCIgZGVwcz1cImFuZ3VsYXItYW5pbWF0ZS5qc1wiIGFuaW1hdGlvbnM9XCJ0cnVlXCIgbmFtZT1cIm5nLWlmXCI+XG4gICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIDxsYWJlbD5DbGljayBtZTogPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwiY2hlY2tlZFwiIG5nLWluaXQ9XCJjaGVja2VkPXRydWVcIiAvPjwvbGFiZWw+PGJyLz5cbiAgICAgIFNob3cgd2hlbiBjaGVja2VkOlxuICAgICAgPHNwYW4gbmctaWY9XCJjaGVja2VkXCIgY2xhc3M9XCJhbmltYXRlLWlmXCI+XG4gICAgICAgIFRoaXMgaXMgcmVtb3ZlZCB3aGVuIHRoZSBjaGVja2JveCBpcyB1bmNoZWNrZWQuXG4gICAgICA8L3NwYW4+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJhbmltYXRpb25zLmNzc1wiPlxuICAgICAgLmFuaW1hdGUtaWYge1xuICAgICAgICBiYWNrZ3JvdW5kOndoaXRlO1xuICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBwYWRkaW5nOjEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5hbmltYXRlLWlmLm5nLWVudGVyLCAuYW5pbWF0ZS1pZi5uZy1sZWF2ZSB7XG4gICAgICAgIHRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMC41cztcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtaWYubmctZW50ZXIsXG4gICAgICAuYW5pbWF0ZS1pZi5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUge1xuICAgICAgICBvcGFjaXR5OjA7XG4gICAgICB9XG5cbiAgICAgIC5hbmltYXRlLWlmLm5nLWxlYXZlLFxuICAgICAgLmFuaW1hdGUtaWYubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHtcbiAgICAgICAgb3BhY2l0eToxO1xuICAgICAgfVxuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG52YXIgbmdJZkRpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCAnJGNvbXBpbGUnLCBmdW5jdGlvbigkYW5pbWF0ZSwgJGNvbXBpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBtdWx0aUVsZW1lbnQ6IHRydWUsXG4gICAgdHJhbnNjbHVkZTogJ2VsZW1lbnQnLFxuICAgIHByaW9yaXR5OiA2MDAsXG4gICAgdGVybWluYWw6IHRydWUsXG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAkJHRsYjogdHJ1ZSxcbiAgICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgdmFyIGJsb2NrLCBjaGlsZFNjb3BlLCBwcmV2aW91c0VsZW1lbnRzO1xuICAgICAgICAkc2NvcGUuJHdhdGNoKCRhdHRyLm5nSWYsIGZ1bmN0aW9uIG5nSWZXYXRjaEFjdGlvbih2YWx1ZSkge1xuXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIWNoaWxkU2NvcGUpIHtcbiAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24oY2xvbmUsIG5ld1Njb3BlKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRTY29wZSA9IG5ld1Njb3BlO1xuICAgICAgICAgICAgICAgIGNsb25lW2Nsb25lLmxlbmd0aCsrXSA9ICRjb21waWxlLiQkY3JlYXRlQ29tbWVudCgnZW5kIG5nSWYnLCAkYXR0ci5uZ0lmKTtcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBvbmx5IG5lZWQgdGhlIGZpcnN0L2xhc3Qgbm9kZSBvZiB0aGUgY2xvbmVkIG5vZGVzLlxuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdlIG5lZWQgdG8ga2VlcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBqcWxpdGUgd3JhcHBlciBhcyBpdCBtaWdodCBiZSBjaGFuZ2VkIGxhdGVyXG4gICAgICAgICAgICAgICAgLy8gYnkgYSBkaXJlY3RpdmUgd2l0aCB0ZW1wbGF0ZVVybCB3aGVuIGl0cyB0ZW1wbGF0ZSBhcnJpdmVzLlxuICAgICAgICAgICAgICAgIGJsb2NrID0ge1xuICAgICAgICAgICAgICAgICAgY2xvbmU6IGNsb25lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjbG9uZSwgJGVsZW1lbnQucGFyZW50KCksICRlbGVtZW50KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudHMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudHMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkU2NvcGUpIHtcbiAgICAgICAgICAgICAgY2hpbGRTY29wZS4kZGVzdHJveSgpO1xuICAgICAgICAgICAgICBjaGlsZFNjb3BlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRzID0gZ2V0QmxvY2tOb2RlcyhibG9jay5jbG9uZSk7XG4gICAgICAgICAgICAgICRhbmltYXRlLmxlYXZlKHByZXZpb3VzRWxlbWVudHMpLmRvbmUoZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IGZhbHNlKSBwcmV2aW91c0VsZW1lbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJsb2NrID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nSW5jbHVkZVxuICogQHJlc3RyaWN0IEVDQVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRmV0Y2hlcywgY29tcGlsZXMgYW5kIGluY2x1ZGVzIGFuIGV4dGVybmFsIEhUTUwgZnJhZ21lbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIFVSTCBpcyByZXN0cmljdGVkIHRvIHRoZSBzYW1lIGRvbWFpbiBhbmQgcHJvdG9jb2wgYXMgdGhlXG4gKiBhcHBsaWNhdGlvbiBkb2N1bWVudC4gVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcge0BsaW5rICRzY2UjZ2V0VHJ1c3RlZFJlc291cmNlVXJsXG4gKiAkc2NlLmdldFRydXN0ZWRSZXNvdXJjZVVybH0gb24gaXQuIFRvIGxvYWQgdGVtcGxhdGVzIGZyb20gb3RoZXIgZG9tYWlucyBvciBwcm90b2NvbHNcbiAqIHlvdSBtYXkgZWl0aGVyIHtAbGluayBuZy4kc2NlRGVsZWdhdGVQcm92aWRlciNyZXNvdXJjZVVybFdoaXRlbGlzdCB3aGl0ZWxpc3QgdGhlbX0gb3JcbiAqIHtAbGluayAkc2NlI3RydXN0QXNSZXNvdXJjZVVybCB3cmFwIHRoZW19IGFzIHRydXN0ZWQgdmFsdWVzLiBSZWZlciB0byBBbmd1bGFyJ3Mge0BsaW5rXG4gKiBuZy4kc2NlIFN0cmljdCBDb250ZXh0dWFsIEVzY2FwaW5nfS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgdGhlIGJyb3dzZXInc1xuICogW1NhbWUgT3JpZ2luIFBvbGljeV0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9icm93c2Vyc2VjL3dpa2kvUGFydDIjU2FtZS1vcmlnaW5fcG9saWN5X2Zvcl9YTUxIdHRwUmVxdWVzdClcbiAqIGFuZCBbQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpXShodHRwOi8vd3d3LnczLm9yZy9UUi9jb3JzLylcbiAqIHBvbGljeSBtYXkgZnVydGhlciByZXN0cmljdCB3aGV0aGVyIHRoZSB0ZW1wbGF0ZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLlxuICogRm9yIGV4YW1wbGUsIGBuZ0luY2x1ZGVgIHdvbid0IHdvcmsgZm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cyBvbiBhbGwgYnJvd3NlcnMgYW5kIGZvciBgZmlsZTovL2BcbiAqIGFjY2VzcyBvbiBzb21lIGJyb3dzZXJzLlxuICpcbiAqIEBhbmltYXRpb25zXG4gKiB8IEFuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHwgT2NjdXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2VudGVyIGVudGVyfSAgfCB3aGVuIHRoZSBleHByZXNzaW9uIGNoYW5nZXMsIG9uIHRoZSBuZXcgaW5jbHVkZSB8XG4gKiB8IHtAbGluayBuZy4kYW5pbWF0ZSNsZWF2ZSBsZWF2ZX0gIHwgd2hlbiB0aGUgZXhwcmVzc2lvbiBjaGFuZ2VzLCBvbiB0aGUgb2xkIGluY2x1ZGUgfFxuICpcbiAqIFRoZSBlbnRlciBhbmQgbGVhdmUgYW5pbWF0aW9uIG9jY3VyIGNvbmN1cnJlbnRseS5cbiAqXG4gKiBAc2NvcGVcbiAqIEBwcmlvcml0eSA0MDBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmdJbmNsdWRlfHNyYyBhbmd1bGFyIGV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBVUkwuIElmIHRoZSBzb3VyY2UgaXMgYSBzdHJpbmcgY29uc3RhbnQsXG4gKiAgICAgICAgICAgICAgICAgbWFrZSBzdXJlIHlvdSB3cmFwIGl0IGluICoqc2luZ2xlKiogcXVvdGVzLCBlLmcuIGBzcmM9XCInbXlQYXJ0aWFsVGVtcGxhdGUuaHRtbCdcImAuXG4gKiBAcGFyYW0ge3N0cmluZz19IG9ubG9hZCBFeHByZXNzaW9uIHRvIGV2YWx1YXRlIHdoZW4gYSBuZXcgcGFydGlhbCBpcyBsb2FkZWQuXG4gKiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC13YXJuaW5nXCI+XG4gKiAgICAgICAgICAgICAgICAgICoqTm90ZToqKiBXaGVuIHVzaW5nIG9ubG9hZCBvbiBTVkcgZWxlbWVudHMgaW4gSUUxMSwgdGhlIGJyb3dzZXIgd2lsbCB0cnkgdG8gY2FsbFxuICogICAgICAgICAgICAgICAgICBhIGZ1bmN0aW9uIHdpdGggdGhlIG5hbWUgb24gdGhlIHdpbmRvdyBlbGVtZW50LCB3aGljaCB3aWxsIHVzdWFsbHkgdGhyb3cgYVxuICogICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uIGlzIHVuZGVmaW5lZFwiIGVycm9yLiBUbyBmaXggdGhpcywgeW91IGNhbiBpbnN0ZWFkIHVzZSBgZGF0YS1vbmxvYWRgIG9yIGFcbiAqICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZvcm0gdGhhdCB7QGxpbmsgZ3VpZGUvZGlyZWN0aXZlI25vcm1hbGl6YXRpb24gbWF0Y2hlc30gYG9ubG9hZGAuXG4gKiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgKlxuICogQHBhcmFtIHtzdHJpbmc9fSBhdXRvc2Nyb2xsIFdoZXRoZXIgYG5nSW5jbHVkZWAgc2hvdWxkIGNhbGwge0BsaW5rIG5nLiRhbmNob3JTY3JvbGxcbiAqICAgICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbH0gdG8gc2Nyb2xsIHRoZSB2aWV3cG9ydCBhZnRlciB0aGUgY29udGVudCBpcyBsb2FkZWQuXG4gKlxuICogICAgICAgICAgICAgICAgICAtIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHNldCwgZGlzYWJsZSBzY3JvbGxpbmcuXG4gKiAgICAgICAgICAgICAgICAgIC0gSWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgd2l0aG91dCB2YWx1ZSwgZW5hYmxlIHNjcm9sbGluZy5cbiAqICAgICAgICAgICAgICAgICAgLSBPdGhlcndpc2UgZW5hYmxlIHNjcm9sbGluZyBvbmx5IGlmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnV0aHkgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAgPGV4YW1wbGUgbW9kdWxlPVwiaW5jbHVkZUV4YW1wbGVcIiBkZXBzPVwiYW5ndWxhci1hbmltYXRlLmpzXCIgYW5pbWF0aW9ucz1cInRydWVcIiBuYW1lPVwibmctaW5jbHVkZVwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgPHNlbGVjdCBuZy1tb2RlbD1cInRlbXBsYXRlXCIgbmctb3B0aW9ucz1cInQubmFtZSBmb3IgdCBpbiB0ZW1wbGF0ZXNcIj5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPihibGFuayk8L29wdGlvbj5cbiAgICAgICA8L3NlbGVjdD5cbiAgICAgICB1cmwgb2YgdGhlIHRlbXBsYXRlOiA8Y29kZT57e3RlbXBsYXRlLnVybH19PC9jb2RlPlxuICAgICAgIDxoci8+XG4gICAgICAgPGRpdiBjbGFzcz1cInNsaWRlLWFuaW1hdGUtY29udGFpbmVyXCI+XG4gICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGUtYW5pbWF0ZVwiIG5nLWluY2x1ZGU9XCJ0ZW1wbGF0ZS51cmxcIj48L2Rpdj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9kaXY+XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgIGFuZ3VsYXIubW9kdWxlKCdpbmNsdWRlRXhhbXBsZScsIFsnbmdBbmltYXRlJ10pXG4gICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgJHNjb3BlLnRlbXBsYXRlcyA9XG4gICAgICAgICAgICBbeyBuYW1lOiAndGVtcGxhdGUxLmh0bWwnLCB1cmw6ICd0ZW1wbGF0ZTEuaHRtbCd9LFxuICAgICAgICAgICAgIHsgbmFtZTogJ3RlbXBsYXRlMi5odG1sJywgdXJsOiAndGVtcGxhdGUyLmh0bWwnfV07XG4gICAgICAgICAgJHNjb3BlLnRlbXBsYXRlID0gJHNjb3BlLnRlbXBsYXRlc1swXTtcbiAgICAgICAgfV0pO1xuICAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInRlbXBsYXRlMS5odG1sXCI+XG4gICAgICBDb250ZW50IG9mIHRlbXBsYXRlMS5odG1sXG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJ0ZW1wbGF0ZTIuaHRtbFwiPlxuICAgICAgQ29udGVudCBvZiB0ZW1wbGF0ZTIuaHRtbFxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiYW5pbWF0aW9ucy5jc3NcIj5cbiAgICAgIC5zbGlkZS1hbmltYXRlLWNvbnRhaW5lciB7XG4gICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgICAgICBiYWNrZ3JvdW5kOndoaXRlO1xuICAgICAgICBib3JkZXI6MXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBoZWlnaHQ6NDBweDtcbiAgICAgICAgb3ZlcmZsb3c6aGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAuc2xpZGUtYW5pbWF0ZSB7XG4gICAgICAgIHBhZGRpbmc6MTBweDtcbiAgICAgIH1cblxuICAgICAgLnNsaWRlLWFuaW1hdGUubmctZW50ZXIsIC5zbGlkZS1hbmltYXRlLm5nLWxlYXZlIHtcbiAgICAgICAgdHJhbnNpdGlvbjphbGwgY3ViaWMtYmV6aWVyKDAuMjUwLCAwLjQ2MCwgMC40NTAsIDAuOTQwKSAwLjVzO1xuXG4gICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgICB0b3A6MDtcbiAgICAgICAgbGVmdDowO1xuICAgICAgICByaWdodDowO1xuICAgICAgICBib3R0b206MDtcbiAgICAgICAgZGlzcGxheTpibG9jaztcbiAgICAgICAgcGFkZGluZzoxMHB4O1xuICAgICAgfVxuXG4gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1lbnRlciB7XG4gICAgICAgIHRvcDotNTBweDtcbiAgICAgIH1cbiAgICAgIC5zbGlkZS1hbmltYXRlLm5nLWVudGVyLm5nLWVudGVyLWFjdGl2ZSB7XG4gICAgICAgIHRvcDowO1xuICAgICAgfVxuXG4gICAgICAuc2xpZGUtYW5pbWF0ZS5uZy1sZWF2ZSB7XG4gICAgICAgIHRvcDowO1xuICAgICAgfVxuICAgICAgLnNsaWRlLWFuaW1hdGUubmctbGVhdmUubmctbGVhdmUtYWN0aXZlIHtcbiAgICAgICAgdG9wOjUwcHg7XG4gICAgICB9XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIHZhciB0ZW1wbGF0ZVNlbGVjdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RlbXBsYXRlJykpO1xuICAgICAgdmFyIGluY2x1ZGVFbGVtID0gZWxlbWVudChieS5jc3MoJ1tuZy1pbmNsdWRlXScpKTtcblxuICAgICAgaXQoJ3Nob3VsZCBsb2FkIHRlbXBsYXRlMS5odG1sJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGV4cGVjdChpbmNsdWRlRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL0NvbnRlbnQgb2YgdGVtcGxhdGUxLmh0bWwvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGxvYWQgdGVtcGxhdGUyLmh0bWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgICAgIC8vIEZpcmVmb3ggY2FuJ3QgaGFuZGxlIHVzaW5nIHNlbGVjdHNcbiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvcHJvdHJhY3Rvci9pc3N1ZXMvNDgwXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlU2VsZWN0LmNsaWNrKCk7XG4gICAgICAgIHRlbXBsYXRlU2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMikuY2xpY2soKTtcbiAgICAgICAgZXhwZWN0KGluY2x1ZGVFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBvZiB0ZW1wbGF0ZTIuaHRtbC8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRvIGJsYW5rJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChicm93c2VyLnBhcmFtcy5icm93c2VyID09PSAnZmlyZWZveCcpIHtcbiAgICAgICAgICAvLyBGaXJlZm94IGNhbid0IGhhbmRsZSB1c2luZyBzZWxlY3RzXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlU2VsZWN0LmNsaWNrKCk7XG4gICAgICAgIHRlbXBsYXRlU2VsZWN0LmFsbChieS5jc3MoJ29wdGlvbicpKS5nZXQoMCkuY2xpY2soKTtcbiAgICAgICAgZXhwZWN0KGluY2x1ZGVFbGVtLmlzUHJlc2VudCgpKS50b0JlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG5cblxuLyoqXG4gKiBAbmdkb2MgZXZlbnRcbiAqIEBuYW1lIG5nSW5jbHVkZSMkaW5jbHVkZUNvbnRlbnRSZXF1ZXN0ZWRcbiAqIEBldmVudFR5cGUgZW1pdCBvbiB0aGUgc2NvcGUgbmdJbmNsdWRlIHdhcyBkZWNsYXJlZCBpblxuICogQGRlc2NyaXB0aW9uXG4gKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgdGhlIG5nSW5jbHVkZSBjb250ZW50IGlzIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3JjIFVSTCBvZiBjb250ZW50IHRvIGxvYWQuXG4gKi9cblxuXG4vKipcbiAqIEBuZ2RvYyBldmVudFxuICogQG5hbWUgbmdJbmNsdWRlIyRpbmNsdWRlQ29udGVudExvYWRlZFxuICogQGV2ZW50VHlwZSBlbWl0IG9uIHRoZSBjdXJyZW50IG5nSW5jbHVkZSBzY29wZVxuICogQGRlc2NyaXB0aW9uXG4gKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgdGhlIG5nSW5jbHVkZSBjb250ZW50IGlzIHJlbG9hZGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhbmd1bGFyRXZlbnQgU3ludGhldGljIGV2ZW50IG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVVJMIG9mIGNvbnRlbnQgdG8gbG9hZC5cbiAqL1xuXG5cbi8qKlxuICogQG5nZG9jIGV2ZW50XG4gKiBAbmFtZSBuZ0luY2x1ZGUjJGluY2x1ZGVDb250ZW50RXJyb3JcbiAqIEBldmVudFR5cGUgZW1pdCBvbiB0aGUgc2NvcGUgbmdJbmNsdWRlIHdhcyBkZWNsYXJlZCBpblxuICogQGRlc2NyaXB0aW9uXG4gKiBFbWl0dGVkIHdoZW4gYSB0ZW1wbGF0ZSBIVFRQIHJlcXVlc3QgeWllbGRzIGFuIGVycm9uZW91cyByZXNwb25zZSAoc3RhdHVzIDwgMjAwIHx8IHN0YXR1cyA+IDI5OSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYW5ndWxhckV2ZW50IFN5bnRoZXRpYyBldmVudCBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3JjIFVSTCBvZiBjb250ZW50IHRvIGxvYWQuXG4gKi9cbnZhciBuZ0luY2x1ZGVEaXJlY3RpdmUgPSBbJyR0ZW1wbGF0ZVJlcXVlc3QnLCAnJGFuY2hvclNjcm9sbCcsICckYW5pbWF0ZScsXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbigkdGVtcGxhdGVSZXF1ZXN0LCAgICRhbmNob3JTY3JvbGwsICAgJGFuaW1hdGUpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0VDQScsXG4gICAgcHJpb3JpdHk6IDQwMCxcbiAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsXG4gICAgY29udHJvbGxlcjogYW5ndWxhci5ub29wLFxuICAgIGNvbXBpbGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgIHZhciBzcmNFeHAgPSBhdHRyLm5nSW5jbHVkZSB8fCBhdHRyLnNyYyxcbiAgICAgICAgICBvbmxvYWRFeHAgPSBhdHRyLm9ubG9hZCB8fCAnJyxcbiAgICAgICAgICBhdXRvU2Nyb2xsRXhwID0gYXR0ci5hdXRvc2Nyb2xsO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgdmFyIGNoYW5nZUNvdW50ZXIgPSAwLFxuICAgICAgICAgICAgY3VycmVudFNjb3BlLFxuICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50LFxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQ7XG5cbiAgICAgICAgdmFyIGNsZWFudXBMYXN0SW5jbHVkZUNvbnRlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFNjb3BlKSB7XG4gICAgICAgICAgICBjdXJyZW50U2NvcGUuJGRlc3Ryb3koKTtcbiAgICAgICAgICAgIGN1cnJlbnRTY29wZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgJGFuaW1hdGUubGVhdmUoY3VycmVudEVsZW1lbnQpLmRvbmUoZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9PSBmYWxzZSkgcHJldmlvdXNFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNjb3BlLiR3YXRjaChzcmNFeHAsIGZ1bmN0aW9uIG5nSW5jbHVkZVdhdGNoQWN0aW9uKHNyYykge1xuICAgICAgICAgIHZhciBhZnRlckFuaW1hdGlvbiA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IGZhbHNlICYmIGlzRGVmaW5lZChhdXRvU2Nyb2xsRXhwKSAmJlxuICAgICAgICAgICAgICAoIWF1dG9TY3JvbGxFeHAgfHwgc2NvcGUuJGV2YWwoYXV0b1Njcm9sbEV4cCkpKSB7XG4gICAgICAgICAgICAgICAgJGFuY2hvclNjcm9sbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIHRoaXNDaGFuZ2VJZCA9ICsrY2hhbmdlQ291bnRlcjtcblxuICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgIC8vc2V0IHRoZSAybmQgcGFyYW0gdG8gdHJ1ZSB0byBpZ25vcmUgdGhlIHRlbXBsYXRlIHJlcXVlc3QgZXJyb3Igc28gdGhhdCB0aGUgaW5uZXJcbiAgICAgICAgICAgIC8vY29udGVudHMgYW5kIHNjb3BlIGNhbiBiZSBjbGVhbmVkIHVwLlxuICAgICAgICAgICAgJHRlbXBsYXRlUmVxdWVzdChzcmMsIHRydWUpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgaWYgKHNjb3BlLiQkZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXNDaGFuZ2VJZCAhPT0gY2hhbmdlQ291bnRlcikgcmV0dXJuO1xuICAgICAgICAgICAgICB2YXIgbmV3U2NvcGUgPSBzY29wZS4kbmV3KCk7XG4gICAgICAgICAgICAgIGN0cmwudGVtcGxhdGUgPSByZXNwb25zZTtcblxuICAgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBsaW5rIGFsbCBjaGlsZHJlbiBvZiBuZy1pbmNsdWRlIHRoYXQgd2VyZSBjb250YWluZWQgaW4gdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgIC8vIGh0bWwuIElmIHRoYXQgY29udGVudCBjb250YWlucyBjb250cm9sbGVycywgLi4uIHRoZXkgY291bGQgcG9sbHV0ZS9jaGFuZ2UgdGhlIHNjb3BlLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB1c2luZyBuZy1pbmNsdWRlIG9uIGFuIGVsZW1lbnQgd2l0aCBhZGRpdGlvbmFsIGNvbnRlbnQgZG9lcyBub3QgbWFrZSBzZW5zZS4uLlxuICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4ndCByZW1vdmUgdGhlbSBpbiB0aGUgY2xvbmVBdHRjaEZuIG9mICR0cmFuc2NsdWRlIGFzIHRoYXRcbiAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBsaW5raW5nIHRoZSBjb250ZW50LCB3aGljaCB3b3VsZCBhcHBseSBjaGlsZFxuICAgICAgICAgICAgICAvLyBkaXJlY3RpdmVzIHRvIG5vbiBleGlzdGluZyBlbGVtZW50cy5cbiAgICAgICAgICAgICAgdmFyIGNsb25lID0gJHRyYW5zY2x1ZGUobmV3U2NvcGUsIGZ1bmN0aW9uKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCgpO1xuICAgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCBudWxsLCAkZWxlbWVudCkuZG9uZShhZnRlckFuaW1hdGlvbik7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGN1cnJlbnRTY29wZSA9IG5ld1Njb3BlO1xuICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGNsb25lO1xuXG4gICAgICAgICAgICAgIGN1cnJlbnRTY29wZS4kZW1pdCgnJGluY2x1ZGVDb250ZW50TG9hZGVkJywgc3JjKTtcbiAgICAgICAgICAgICAgc2NvcGUuJGV2YWwob25sb2FkRXhwKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoc2NvcGUuJCRkZXN0cm95ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICBpZiAodGhpc0NoYW5nZUlkID09PSBjaGFuZ2VDb3VudGVyKSB7XG4gICAgICAgICAgICAgICAgY2xlYW51cExhc3RJbmNsdWRlQ29udGVudCgpO1xuICAgICAgICAgICAgICAgIHNjb3BlLiRlbWl0KCckaW5jbHVkZUNvbnRlbnRFcnJvcicsIHNyYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2NvcGUuJGVtaXQoJyRpbmNsdWRlQ29udGVudFJlcXVlc3RlZCcsIHNyYyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFudXBMYXN0SW5jbHVkZUNvbnRlbnQoKTtcbiAgICAgICAgICAgIGN0cmwudGVtcGxhdGUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1dO1xuXG4vLyBUaGlzIGRpcmVjdGl2ZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSAkdHJhbnNjbHVkZSBjYWxsIG9mIHRoZSBmaXJzdCBgbmdJbmNsdWRlYCBkaXJlY3RpdmUuXG4vLyBJdCB3aWxsIHJlcGxhY2UgYW5kIGNvbXBpbGUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgbG9hZGVkIHRlbXBsYXRlLlxuLy8gV2UgbmVlZCB0aGlzIGRpcmVjdGl2ZSBzbyB0aGF0IHRoZSBlbGVtZW50IGNvbnRlbnQgaXMgYWxyZWFkeSBmaWxsZWQgd2hlblxuLy8gdGhlIGxpbmsgZnVuY3Rpb24gb2YgYW5vdGhlciBkaXJlY3RpdmUgb24gdGhlIHNhbWUgZWxlbWVudCBhcyBuZ0luY2x1ZGVcbi8vIGlzIGNhbGxlZC5cbnZhciBuZ0luY2x1ZGVGaWxsQ29udGVudERpcmVjdGl2ZSA9IFsnJGNvbXBpbGUnLFxuICBmdW5jdGlvbigkY29tcGlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0VDQScsXG4gICAgICBwcmlvcml0eTogLTQwMCxcbiAgICAgIHJlcXVpcmU6ICduZ0luY2x1ZGUnLFxuICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCkge1xuICAgICAgICBpZiAodG9TdHJpbmcuY2FsbCgkZWxlbWVudFswXSkubWF0Y2goL1NWRy8pKSB7XG4gICAgICAgICAgLy8gV2ViS2l0OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM1Njk4IC0tLSBTVkcgZWxlbWVudHMgZG8gbm90XG4gICAgICAgICAgLy8gc3VwcG9ydCBpbm5lckhUTUwsIHNvIGRldGVjdCB0aGlzIGhlcmUgYW5kIHRyeSB0byBnZW5lcmF0ZSB0aGUgY29udGVudHNcbiAgICAgICAgICAvLyBzcGVjaWFsbHkuXG4gICAgICAgICAgJGVsZW1lbnQuZW1wdHkoKTtcbiAgICAgICAgICAkY29tcGlsZShqcUxpdGVCdWlsZEZyYWdtZW50KGN0cmwudGVtcGxhdGUsIHdpbmRvdy5kb2N1bWVudCkuY2hpbGROb2Rlcykoc2NvcGUsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzcGFjZUFkYXB0ZWRDbG9uZShjbG9uZSkge1xuICAgICAgICAgICAgJGVsZW1lbnQuYXBwZW5kKGNsb25lKTtcbiAgICAgICAgICB9LCB7ZnV0dXJlUGFyZW50RWxlbWVudDogJGVsZW1lbnR9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAkZWxlbWVudC5odG1sKGN0cmwudGVtcGxhdGUpO1xuICAgICAgICAkY29tcGlsZSgkZWxlbWVudC5jb250ZW50cygpKShzY29wZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfV07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdJbml0XG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdJbml0YCBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBldmFsdWF0ZSBhbiBleHByZXNzaW9uIGluIHRoZVxuICogY3VycmVudCBzY29wZS5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+XG4gKiBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgYWJ1c2VkIHRvIGFkZCB1bm5lY2Vzc2FyeSBhbW91bnRzIG9mIGxvZ2ljIGludG8geW91ciB0ZW1wbGF0ZXMuXG4gKiBUaGVyZSBhcmUgb25seSBhIGZldyBhcHByb3ByaWF0ZSB1c2VzIG9mIGBuZ0luaXRgLCBzdWNoIGFzIGZvciBhbGlhc2luZyBzcGVjaWFsIHByb3BlcnRpZXMgb2ZcbiAqIHtAbGluayBuZy5kaXJlY3RpdmU6bmdSZXBlYXQgYG5nUmVwZWF0YH0sIGFzIHNlZW4gaW4gdGhlIGRlbW8gYmVsb3c7IGFuZCBmb3IgaW5qZWN0aW5nIGRhdGEgdmlhXG4gKiBzZXJ2ZXIgc2lkZSBzY3JpcHRpbmcuIEJlc2lkZXMgdGhlc2UgZmV3IGNhc2VzLCB5b3Ugc2hvdWxkIHVzZSB7QGxpbmsgZ3VpZGUvY29udHJvbGxlciBjb250cm9sbGVyc31cbiAqIHJhdGhlciB0aGFuIGBuZ0luaXRgIHRvIGluaXRpYWxpemUgdmFsdWVzIG9uIGEgc2NvcGUuXG4gKiA8L2Rpdj5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogKipOb3RlKio6IElmIHlvdSBoYXZlIGFzc2lnbm1lbnQgaW4gYG5nSW5pdGAgYWxvbmcgd2l0aCBhIHtAbGluayBuZy4kZmlsdGVyIGBmaWx0ZXJgfSwgbWFrZVxuICogc3VyZSB5b3UgaGF2ZSBwYXJlbnRoZXNlcyB0byBlbnN1cmUgY29ycmVjdCBvcGVyYXRvciBwcmVjZWRlbmNlOlxuICogPHByZSBjbGFzcz1cInByZXR0eXByaW50XCI+XG4gKiBgPGRpdiBuZy1pbml0PVwidGVzdDEgPSAoJGluZGV4IHwgdG9TdHJpbmcpXCI+PC9kaXY+YFxuICogPC9wcmU+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAcHJpb3JpdHkgNDUwXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nSW5pdCB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB0byBldmFsLlxuICpcbiAqIEBleGFtcGxlXG4gICA8ZXhhbXBsZSBtb2R1bGU9XCJpbml0RXhhbXBsZVwiIG5hbWU9XCJuZy1pbml0XCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICA8c2NyaXB0PlxuICAgICBhbmd1bGFyLm1vZHVsZSgnaW5pdEV4YW1wbGUnLCBbXSlcbiAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgJHNjb3BlLmxpc3QgPSBbWydhJywgJ2InXSwgWydjJywgJ2QnXV07XG4gICAgICAgfV0pO1xuICAgPC9zY3JpcHQ+XG4gICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICA8ZGl2IG5nLXJlcGVhdD1cImlubmVyTGlzdCBpbiBsaXN0XCIgbmctaW5pdD1cIm91dGVySW5kZXggPSAkaW5kZXhcIj5cbiAgICAgICA8ZGl2IG5nLXJlcGVhdD1cInZhbHVlIGluIGlubmVyTGlzdFwiIG5nLWluaXQ9XCJpbm5lckluZGV4ID0gJGluZGV4XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJleGFtcGxlLWluaXRcIj5saXN0WyB7e291dGVySW5kZXh9fSBdWyB7e2lubmVySW5kZXh9fSBdID0ge3t2YWx1ZX19Ozwvc3Bhbj5cbiAgICAgICA8L2Rpdj5cbiAgICAgPC9kaXY+XG4gICA8L2Rpdj5cbiAgICAgPC9maWxlPlxuICAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgaXQoJ3Nob3VsZCBhbGlhcyBpbmRleCBwb3NpdGlvbnMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnQuYWxsKGJ5LmNzcygnLmV4YW1wbGUtaW5pdCcpKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50cy5nZXQoMCkuZ2V0VGV4dCgpKS50b0JlKCdsaXN0WyAwIF1bIDAgXSA9IGE7Jyk7XG4gICAgICAgICBleHBlY3QoZWxlbWVudHMuZ2V0KDEpLmdldFRleHQoKSkudG9CZSgnbGlzdFsgMCBdWyAxIF0gPSBiOycpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnRzLmdldCgyKS5nZXRUZXh0KCkpLnRvQmUoJ2xpc3RbIDEgXVsgMCBdID0gYzsnKTtcbiAgICAgICAgIGV4cGVjdChlbGVtZW50cy5nZXQoMykuZ2V0VGV4dCgpKS50b0JlKCdsaXN0WyAxIF1bIDEgXSA9IGQ7Jyk7XG4gICAgICAgfSk7XG4gICAgIDwvZmlsZT5cbiAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nSW5pdERpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKHtcbiAgcHJpb3JpdHk6IDQ1MCxcbiAgY29tcGlsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByZTogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgIHNjb3BlLiRldmFsKGF0dHJzLm5nSW5pdCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufSk7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdMaXN0XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUZXh0IGlucHV0IHRoYXQgY29udmVydHMgYmV0d2VlbiBhIGRlbGltaXRlZCBzdHJpbmcgYW5kIGFuIGFycmF5IG9mIHN0cmluZ3MuIFRoZSBkZWZhdWx0XG4gKiBkZWxpbWl0ZXIgaXMgYSBjb21tYSBmb2xsb3dlZCBieSBhIHNwYWNlIC0gZXF1aXZhbGVudCB0byBgbmctbGlzdD1cIiwgXCJgLiBZb3UgY2FuIHNwZWNpZnkgYSBjdXN0b21cbiAqIGRlbGltaXRlciBhcyB0aGUgdmFsdWUgb2YgdGhlIGBuZ0xpc3RgIGF0dHJpYnV0ZSAtIGZvciBleGFtcGxlLCBgbmctbGlzdD1cIiB8IFwiYC5cbiAqXG4gKiBUaGUgYmVoYXZpb3VyIG9mIHRoZSBkaXJlY3RpdmUgaXMgYWZmZWN0ZWQgYnkgdGhlIHVzZSBvZiB0aGUgYG5nVHJpbWAgYXR0cmlidXRlLlxuICogKiBJZiBgbmdUcmltYCBpcyBzZXQgdG8gYFwiZmFsc2VcImAgdGhlbiB3aGl0ZXNwYWNlIGFyb3VuZCBib3RoIHRoZSBzZXBhcmF0b3IgYW5kIGVhY2hcbiAqICAgbGlzdCBpdGVtIGlzIHJlc3BlY3RlZC4gVGhpcyBpbXBsaWVzIHRoYXQgdGhlIHVzZXIgb2YgdGhlIGRpcmVjdGl2ZSBpcyByZXNwb25zaWJsZSBmb3JcbiAqICAgZGVhbGluZyB3aXRoIHdoaXRlc3BhY2UgYnV0IGFsc28gYWxsb3dzIHlvdSB0byB1c2Ugd2hpdGVzcGFjZSBhcyBhIGRlbGltaXRlciwgc3VjaCBhcyBhXG4gKiAgIHRhYiBvciBuZXdsaW5lIGNoYXJhY3Rlci5cbiAqICogT3RoZXJ3aXNlIHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkZWxpbWl0ZXIgaXMgaWdub3JlZCB3aGVuIHNwbGl0dGluZyAoYWx0aG91Z2ggaXQgaXMgcmVzcGVjdGVkXG4gKiAgIHdoZW4gam9pbmluZyB0aGUgbGlzdCBpdGVtcyBiYWNrIHRvZ2V0aGVyKSBhbmQgd2hpdGVzcGFjZSBhcm91bmQgZWFjaCBsaXN0IGl0ZW0gaXMgc3RyaXBwZWRcbiAqICAgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC5cbiAqXG4gKiAjIyMgRXhhbXBsZSB3aXRoIFZhbGlkYXRpb25cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwibmdMaXN0LWRpcmVjdGl2ZVwiIG1vZHVsZT1cImxpc3RFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICAgICAgYW5ndWxhci5tb2R1bGUoJ2xpc3RFeGFtcGxlJywgW10pXG4gKiAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgICRzY29wZS5uYW1lcyA9IFsnbW9ycGhldXMnLCAnbmVvJywgJ3RyaW5pdHknXTtcbiAqICAgICAgICB9XSk7XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgICAgPGxhYmVsPkxpc3Q6IDxpbnB1dCBuYW1lPVwibmFtZXNJbnB1dFwiIG5nLW1vZGVsPVwibmFtZXNcIiBuZy1saXN0IHJlcXVpcmVkPjwvbGFiZWw+XG4gKiAgICAgIDxzcGFuIHJvbGU9XCJhbGVydFwiPlxuICogICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBuZy1zaG93PVwibXlGb3JtLm5hbWVzSW5wdXQuJGVycm9yLnJlcXVpcmVkXCI+XG4gKiAgICAgICAgUmVxdWlyZWQhPC9zcGFuPlxuICogICAgICA8L3NwYW4+XG4gKiAgICAgIDxicj5cbiAqICAgICAgPHR0Pm5hbWVzID0ge3tuYW1lc319PC90dD48YnIvPlxuICogICAgICA8dHQ+bXlGb3JtLm5hbWVzSW5wdXQuJHZhbGlkID0ge3tteUZvcm0ubmFtZXNJbnB1dC4kdmFsaWR9fTwvdHQ+PGJyLz5cbiAqICAgICAgPHR0Pm15Rm9ybS5uYW1lc0lucHV0LiRlcnJvciA9IHt7bXlGb3JtLm5hbWVzSW5wdXQuJGVycm9yfX08L3R0Pjxici8+XG4gKiAgICAgIDx0dD5teUZvcm0uJHZhbGlkID0ge3tteUZvcm0uJHZhbGlkfX08L3R0Pjxici8+XG4gKiAgICAgIDx0dD5teUZvcm0uJGVycm9yLnJlcXVpcmVkID0ge3shIW15Rm9ybS4kZXJyb3IucmVxdWlyZWR9fTwvdHQ+PGJyLz5cbiAqICAgICA8L2Zvcm0+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgIHZhciBsaXN0SW5wdXQgPSBlbGVtZW50KGJ5Lm1vZGVsKCduYW1lcycpKTtcbiAqICAgICB2YXIgbmFtZXMgPSBlbGVtZW50KGJ5LmV4YWN0QmluZGluZygnbmFtZXMnKSk7XG4gKiAgICAgdmFyIHZhbGlkID0gZWxlbWVudChieS5iaW5kaW5nKCdteUZvcm0ubmFtZXNJbnB1dC4kdmFsaWQnKSk7XG4gKiAgICAgdmFyIGVycm9yID0gZWxlbWVudChieS5jc3MoJ3NwYW4uZXJyb3InKSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB0byBtb2RlbCcsIGZ1bmN0aW9uKCkge1xuICogICAgICAgZXhwZWN0KG5hbWVzLmdldFRleHQoKSkudG9Db250YWluKCdbXCJtb3JwaGV1c1wiLFwibmVvXCIsXCJ0cmluaXR5XCJdJyk7XG4gKiAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ3RydWUnKTtcbiAqICAgICAgIGV4cGVjdChlcnJvci5nZXRDc3NWYWx1ZSgnZGlzcGxheScpKS50b0JlKCdub25lJyk7XG4gKiAgICAgfSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgYmUgaW52YWxpZCBpZiBlbXB0eScsIGZ1bmN0aW9uKCkge1xuICogICAgICAgbGlzdElucHV0LmNsZWFyKCk7XG4gKiAgICAgICBsaXN0SW5wdXQuc2VuZEtleXMoJycpO1xuICpcbiAqICAgICAgIGV4cGVjdChuYW1lcy5nZXRUZXh0KCkpLnRvQ29udGFpbignJyk7XG4gKiAgICAgICBleHBlY3QodmFsaWQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ2ZhbHNlJyk7XG4gKiAgICAgICBleHBlY3QoZXJyb3IuZ2V0Q3NzVmFsdWUoJ2Rpc3BsYXknKSkubm90LnRvQmUoJ25vbmUnKTtcbiAqICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqICMjIyBFeGFtcGxlIC0gc3BsaXR0aW5nIG9uIG5ld2xpbmVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ0xpc3QtZGlyZWN0aXZlLW5ld2xpbmVzXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICA8dGV4dGFyZWEgbmctbW9kZWw9XCJsaXN0XCIgbmctbGlzdD1cIiYjMTA7XCIgbmctdHJpbT1cImZhbHNlXCI+PC90ZXh0YXJlYT5cbiAqICAgIDxwcmU+e3sgbGlzdCB8IGpzb24gfX08L3ByZT5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICAgaXQoXCJzaG91bGQgc3BsaXQgdGhlIHRleHQgYnkgbmV3bGluZXNcIiwgZnVuY3Rpb24oKSB7XG4gKiAgICAgICB2YXIgbGlzdElucHV0ID0gZWxlbWVudChieS5tb2RlbCgnbGlzdCcpKTtcbiAqICAgICAgIHZhciBvdXRwdXQgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ2xpc3QgfCBqc29uJykpO1xuICogICAgICAgbGlzdElucHV0LnNlbmRLZXlzKCdhYmNcXG5kZWZcXG5naGknKTtcbiAqICAgICAgIGV4cGVjdChvdXRwdXQuZ2V0VGV4dCgpKS50b0NvbnRhaW4oJ1tcXG4gIFwiYWJjXCIsXFxuICBcImRlZlwiLFxcbiAgXCJnaGlcIlxcbl0nKTtcbiAqICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIEBlbGVtZW50IGlucHV0XG4gKiBAcGFyYW0ge3N0cmluZz19IG5nTGlzdCBvcHRpb25hbCBkZWxpbWl0ZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzcGxpdCB0aGUgdmFsdWUuXG4gKi9cbnZhciBuZ0xpc3REaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHByaW9yaXR5OiAxMDAsXG4gICAgcmVxdWlyZTogJ25nTW9kZWwnLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJsKSB7XG4gICAgICB2YXIgbmdMaXN0ID0gYXR0ci5uZ0xpc3QgfHwgJywgJztcbiAgICAgIHZhciB0cmltVmFsdWVzID0gYXR0ci5uZ1RyaW0gIT09ICdmYWxzZSc7XG4gICAgICB2YXIgc2VwYXJhdG9yID0gdHJpbVZhbHVlcyA/IHRyaW0obmdMaXN0KSA6IG5nTGlzdDtcblxuICAgICAgdmFyIHBhcnNlID0gZnVuY3Rpb24odmlld1ZhbHVlKSB7XG4gICAgICAgIC8vIElmIHRoZSB2aWV3VmFsdWUgaXMgaW52YWxpZCAoc2F5IHJlcXVpcmVkIGJ1dCBlbXB0eSkgaXQgd2lsbCBiZSBgdW5kZWZpbmVkYFxuICAgICAgICBpZiAoaXNVbmRlZmluZWQodmlld1ZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBsaXN0ID0gW107XG5cbiAgICAgICAgaWYgKHZpZXdWYWx1ZSkge1xuICAgICAgICAgIGZvckVhY2godmlld1ZhbHVlLnNwbGl0KHNlcGFyYXRvciksIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIGxpc3QucHVzaCh0cmltVmFsdWVzID8gdHJpbSh2YWx1ZSkgOiB2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH07XG5cbiAgICAgIGN0cmwuJHBhcnNlcnMucHVzaChwYXJzZSk7XG4gICAgICBjdHJsLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmpvaW4obmdMaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gT3ZlcnJpZGUgdGhlIHN0YW5kYXJkICRpc0VtcHR5IGJlY2F1c2UgYW4gZW1wdHkgYXJyYXkgbWVhbnMgdGhlIGlucHV0IGlzIGVtcHR5LlxuICAgICAgY3RybC4kaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUgfHwgIXZhbHVlLmxlbmd0aDtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyogZ2xvYmFsIFZBTElEX0NMQVNTOiB0cnVlLFxuICBJTlZBTElEX0NMQVNTOiB0cnVlLFxuICBQUklTVElORV9DTEFTUzogdHJ1ZSxcbiAgRElSVFlfQ0xBU1M6IHRydWUsXG4gIFVOVE9VQ0hFRF9DTEFTUzogdHJ1ZSxcbiAgVE9VQ0hFRF9DTEFTUzogdHJ1ZSxcbiAgUEVORElOR19DTEFTUzogdHJ1ZSxcbiAgYWRkU2V0VmFsaWRpdHlNZXRob2Q6IHRydWUsXG4gIHNldHVwVmFsaWRpdHk6IHRydWUsXG4gIGRlZmF1bHRNb2RlbE9wdGlvbnM6IGZhbHNlXG4qL1xuXG5cbnZhciBWQUxJRF9DTEFTUyA9ICduZy12YWxpZCcsXG4gICAgSU5WQUxJRF9DTEFTUyA9ICduZy1pbnZhbGlkJyxcbiAgICBQUklTVElORV9DTEFTUyA9ICduZy1wcmlzdGluZScsXG4gICAgRElSVFlfQ0xBU1MgPSAnbmctZGlydHknLFxuICAgIFVOVE9VQ0hFRF9DTEFTUyA9ICduZy11bnRvdWNoZWQnLFxuICAgIFRPVUNIRURfQ0xBU1MgPSAnbmctdG91Y2hlZCcsXG4gICAgRU1QVFlfQ0xBU1MgPSAnbmctZW1wdHknLFxuICAgIE5PVF9FTVBUWV9DTEFTUyA9ICduZy1ub3QtZW1wdHknO1xuXG52YXIgbmdNb2RlbE1pbkVyciA9IG1pbkVycignbmdNb2RlbCcpO1xuXG4vKipcbiAqIEBuZ2RvYyB0eXBlXG4gKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyXG4gKlxuICogQHByb3BlcnR5IHsqfSAkdmlld1ZhbHVlIFRoZSBhY3R1YWwgdmFsdWUgZnJvbSB0aGUgY29udHJvbCdzIHZpZXcuIEZvciBgaW5wdXRgIGVsZW1lbnRzLCB0aGlzIGlzIGFcbiAqIFN0cmluZy4gU2VlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRWaWV3VmFsdWV9IGZvciBpbmZvcm1hdGlvbiBhYm91dCB3aGVuIHRoZSAkdmlld1ZhbHVlXG4gKiBpcyBzZXQuXG4gKiBAcHJvcGVydHkgeyp9ICRtb2RlbFZhbHVlIFRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwgdGhhdCB0aGUgY29udHJvbCBpcyBib3VuZCB0by5cbiAqIEBwcm9wZXJ0eSB7QXJyYXkuPEZ1bmN0aW9uPn0gJHBhcnNlcnMgQXJyYXkgb2YgZnVuY3Rpb25zIHRvIGV4ZWN1dGUsIGFzIGEgcGlwZWxpbmUsIHdoZW5ldmVyXG4gICAgICAgdGhlIGNvbnRyb2wgcmVhZHMgdmFsdWUgZnJvbSB0aGUgRE9NLiBUaGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW4gYXJyYXkgb3JkZXIsIGVhY2ggcGFzc2luZ1xuICAgICAgIGl0cyByZXR1cm4gdmFsdWUgdGhyb3VnaCB0byB0aGUgbmV4dC4gVGhlIGxhc3QgcmV0dXJuIHZhbHVlIGlzIGZvcndhcmRlZCB0byB0aGVcbiAgICAgICB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgJHZhbGlkYXRvcnNgfSBjb2xsZWN0aW9uLlxuXG5QYXJzZXJzIGFyZSB1c2VkIHRvIHNhbml0aXplIC8gY29udmVydCB0aGUge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZVxuYCR2aWV3VmFsdWVgfS5cblxuUmV0dXJuaW5nIGB1bmRlZmluZWRgIGZyb20gYSBwYXJzZXIgbWVhbnMgYSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gSW4gdGhhdCBjYXNlLFxubm8ge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRvcnMgYCR2YWxpZGF0b3JzYH0gd2lsbCBydW4gYW5kIHRoZSBgbmdNb2RlbGBcbndpbGwgYmUgc2V0IHRvIGB1bmRlZmluZWRgIHVubGVzcyB7QGxpbmsgbmdNb2RlbE9wdGlvbnMgYG5nTW9kZWxPcHRpb25zLmFsbG93SW52YWxpZGB9XG5pcyBzZXQgdG8gYHRydWVgLiBUaGUgcGFyc2UgZXJyb3IgaXMgc3RvcmVkIGluIGBuZ01vZGVsLiRlcnJvci5wYXJzZWAuXG5cbiAqXG4gKiBAcHJvcGVydHkge0FycmF5LjxGdW5jdGlvbj59ICRmb3JtYXR0ZXJzIEFycmF5IG9mIGZ1bmN0aW9ucyB0byBleGVjdXRlLCBhcyBhIHBpcGVsaW5lLCB3aGVuZXZlclxuICAgICAgIHRoZSBtb2RlbCB2YWx1ZSBjaGFuZ2VzLiBUaGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBhcnJheSBvcmRlciwgZWFjaCBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIHRvIHRoZVxuICAgICAgIG5leHQuIFRoZSBsYXN0IHJldHVybiB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBhY3R1YWwgRE9NIHZhbHVlLlxuICAgICAgIFVzZWQgdG8gZm9ybWF0IC8gY29udmVydCB2YWx1ZXMgZm9yIGRpc3BsYXkgaW4gdGhlIGNvbnRyb2wuXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZm9ybWF0dGVyKHZhbHVlKSB7XG4gKiAgIGlmICh2YWx1ZSkge1xuICogICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICogICB9XG4gKiB9XG4gKiBuZ01vZGVsLiRmb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTtcbiAqIGBgYFxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPn0gJHZhbGlkYXRvcnMgQSBjb2xsZWN0aW9uIG9mIHZhbGlkYXRvcnMgdGhhdCBhcmUgYXBwbGllZFxuICogICAgICB3aGVuZXZlciB0aGUgbW9kZWwgdmFsdWUgY2hhbmdlcy4gVGhlIGtleSB2YWx1ZSB3aXRoaW4gdGhlIG9iamVjdCByZWZlcnMgdG8gdGhlIG5hbWUgb2YgdGhlXG4gKiAgICAgIHZhbGlkYXRvciB3aGlsZSB0aGUgZnVuY3Rpb24gcmVmZXJzIHRvIHRoZSB2YWxpZGF0aW9uIG9wZXJhdGlvbi4gVGhlIHZhbGlkYXRpb24gb3BlcmF0aW9uIGlzXG4gKiAgICAgIHByb3ZpZGVkIHdpdGggdGhlIG1vZGVsIHZhbHVlIGFzIGFuIGFyZ3VtZW50IGFuZCBtdXN0IHJldHVybiBhIHRydWUgb3IgZmFsc2UgdmFsdWUgZGVwZW5kaW5nXG4gKiAgICAgIG9uIHRoZSByZXNwb25zZSBvZiB0aGF0IHZhbGlkYXRpb24uXG4gKlxuICogYGBganNcbiAqIG5nTW9kZWwuJHZhbGlkYXRvcnMudmFsaWRDaGFyYWN0ZXJzID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gKiAgIHZhciB2YWx1ZSA9IG1vZGVsVmFsdWUgfHwgdmlld1ZhbHVlO1xuICogICByZXR1cm4gL1swLTldKy8udGVzdCh2YWx1ZSkgJiZcbiAqICAgICAgICAgIC9bYS16XSsvLnRlc3QodmFsdWUpICYmXG4gKiAgICAgICAgICAvW0EtWl0rLy50ZXN0KHZhbHVlKSAmJlxuICogICAgICAgICAgL1xcVysvLnRlc3QodmFsdWUpO1xuICogfTtcbiAqIGBgYFxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uPn0gJGFzeW5jVmFsaWRhdG9ycyBBIGNvbGxlY3Rpb24gb2YgdmFsaWRhdGlvbnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG9cbiAqICAgICAgcGVyZm9ybSBhbiBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiAoZS5nLiBhIEhUVFAgcmVxdWVzdCkuIFRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgaXMgcHJvdmlkZWRcbiAqICAgICAgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgcHJvbWlzZSB3aGVuIGl0IGlzIHJ1biBkdXJpbmcgdGhlIG1vZGVsIHZhbGlkYXRpb24gcHJvY2Vzcy4gT25jZSB0aGUgcHJvbWlzZVxuICogICAgICBpcyBkZWxpdmVyZWQgdGhlbiB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIGZ1bGZpbGxlZCBhbmQgZmFsc2Ugd2hlbiByZWplY3RlZC5cbiAqICAgICAgV2hlbiB0aGUgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgYXJlIHRyaWdnZXJlZCwgZWFjaCBvZiB0aGUgdmFsaWRhdG9ycyB3aWxsIHJ1biBpbiBwYXJhbGxlbCBhbmQgdGhlIG1vZGVsXG4gKiAgICAgIHZhbHVlIHdpbGwgb25seSBiZSB1cGRhdGVkIG9uY2UgYWxsIHZhbGlkYXRvcnMgaGF2ZSBiZWVuIGZ1bGZpbGxlZC4gQXMgbG9uZyBhcyBhbiBhc3luY2hyb25vdXMgdmFsaWRhdG9yXG4gKiAgICAgIGlzIHVuZnVsZmlsbGVkLCBpdHMga2V5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyb2xsZXJzIGAkcGVuZGluZ2AgcHJvcGVydHkuIEFsc28sIGFsbCBhc3luY2hyb25vdXMgdmFsaWRhdG9yc1xuICogICAgICB3aWxsIG9ubHkgcnVuIG9uY2UgYWxsIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgaGF2ZSBwYXNzZWQuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBpZiAkaHR0cCBpcyB1c2VkIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHNlcnZlciByZXR1cm5zIGEgc3VjY2VzcyBIVFRQIHJlc3BvbnNlIGNvZGVcbiAqIGluIG9yZGVyIHRvIGZ1bGZpbGwgdGhlIHZhbGlkYXRpb24gYW5kIGEgc3RhdHVzIGxldmVsIG9mIGA0eHhgIGluIG9yZGVyIHRvIHJlamVjdCB0aGUgdmFsaWRhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogbmdNb2RlbC4kYXN5bmNWYWxpZGF0b3JzLnVuaXF1ZVVzZXJuYW1lID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gKiAgIHZhciB2YWx1ZSA9IG1vZGVsVmFsdWUgfHwgdmlld1ZhbHVlO1xuICpcbiAqICAgLy8gTG9va3VwIHVzZXIgYnkgdXNlcm5hbWVcbiAqICAgcmV0dXJuICRodHRwLmdldCgnL2FwaS91c2Vycy8nICsgdmFsdWUpLlxuICogICAgICB0aGVuKGZ1bmN0aW9uIHJlc29sdmVkKCkge1xuICogICAgICAgIC8vdXNlcm5hbWUgZXhpc3RzLCB0aGlzIG1lYW5zIHZhbGlkYXRpb24gZmFpbHNcbiAqICAgICAgICByZXR1cm4gJHEucmVqZWN0KCdleGlzdHMnKTtcbiAqICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0ZWQoKSB7XG4gKiAgICAgICAgLy91c2VybmFtZSBkb2VzIG5vdCBleGlzdCwgdGhlcmVmb3JlIHRoaXMgdmFsaWRhdGlvbiBwYXNzZXNcbiAqICAgICAgICByZXR1cm4gdHJ1ZTtcbiAqICAgICAgfSk7XG4gKiB9O1xuICogYGBgXG4gKlxuICogQHByb3BlcnR5IHtBcnJheS48RnVuY3Rpb24+fSAkdmlld0NoYW5nZUxpc3RlbmVycyBBcnJheSBvZiBmdW5jdGlvbnMgdG8gZXhlY3V0ZSB3aGVuZXZlciB0aGVcbiAqICAgICB2aWV3IHZhbHVlIGhhcyBjaGFuZ2VkLiBJdCBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuXG4gKiAgICAgVGhpcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhZGRpdGlvbmFsICR3YXRjaGVzIGFnYWluc3QgdGhlIG1vZGVsIHZhbHVlLlxuICpcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSAkZXJyb3IgQW4gb2JqZWN0IGhhc2ggd2l0aCBhbGwgZmFpbGluZyB2YWxpZGF0b3IgaWRzIGFzIGtleXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gJHBlbmRpbmcgQW4gb2JqZWN0IGhhc2ggd2l0aCBhbGwgcGVuZGluZyB2YWxpZGF0b3IgaWRzIGFzIGtleXMuXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSAkdW50b3VjaGVkIFRydWUgaWYgY29udHJvbCBoYXMgbm90IGxvc3QgZm9jdXMgeWV0LlxuICogQHByb3BlcnR5IHtib29sZWFufSAkdG91Y2hlZCBUcnVlIGlmIGNvbnRyb2wgaGFzIGxvc3QgZm9jdXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRwcmlzdGluZSBUcnVlIGlmIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggdGhlIGNvbnRyb2wgeWV0LlxuICogQHByb3BlcnR5IHtib29sZWFufSAkZGlydHkgVHJ1ZSBpZiB1c2VyIGhhcyBhbHJlYWR5IGludGVyYWN0ZWQgd2l0aCB0aGUgY29udHJvbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gJHZhbGlkIFRydWUgaWYgdGhlcmUgaXMgbm8gZXJyb3IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59ICRpbnZhbGlkIFRydWUgaWYgYXQgbGVhc3Qgb25lIGVycm9yIG9uIHRoZSBjb250cm9sLlxuICogQHByb3BlcnR5IHtzdHJpbmd9ICRuYW1lIFRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgY29udHJvbC5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBgTmdNb2RlbENvbnRyb2xsZXJgIHByb3ZpZGVzIEFQSSBmb3IgdGhlIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0gZGlyZWN0aXZlLlxuICogVGhlIGNvbnRyb2xsZXIgY29udGFpbnMgc2VydmljZXMgZm9yIGRhdGEtYmluZGluZywgdmFsaWRhdGlvbiwgQ1NTIHVwZGF0ZXMsIGFuZCB2YWx1ZSBmb3JtYXR0aW5nXG4gKiBhbmQgcGFyc2luZy4gSXQgcHVycG9zZWZ1bGx5IGRvZXMgbm90IGNvbnRhaW4gYW55IGxvZ2ljIHdoaWNoIGRlYWxzIHdpdGggRE9NIHJlbmRlcmluZyBvclxuICogbGlzdGVuaW5nIHRvIERPTSBldmVudHMuXG4gKiBTdWNoIERPTSByZWxhdGVkIGxvZ2ljIHNob3VsZCBiZSBwcm92aWRlZCBieSBvdGhlciBkaXJlY3RpdmVzIHdoaWNoIG1ha2UgdXNlIG9mXG4gKiBgTmdNb2RlbENvbnRyb2xsZXJgIGZvciBkYXRhLWJpbmRpbmcgdG8gY29udHJvbCBlbGVtZW50cy5cbiAqIEFuZ3VsYXIgcHJvdmlkZXMgdGhpcyBET00gbG9naWMgZm9yIG1vc3Qge0BsaW5rIGlucHV0IGBpbnB1dGB9IGVsZW1lbnRzLlxuICogQXQgdGhlIGVuZCBvZiB0aGlzIHBhZ2UgeW91IGNhbiBmaW5kIGEge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjY3VzdG9tLWNvbnRyb2wtZXhhbXBsZVxuICogY3VzdG9tIGNvbnRyb2wgZXhhbXBsZX0gdGhhdCB1c2VzIGBuZ01vZGVsQ29udHJvbGxlcmAgdG8gYmluZCB0byBgY29udGVudGVkaXRhYmxlYCBlbGVtZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIEN1c3RvbSBDb250cm9sIEV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBOZ01vZGVsQ29udHJvbGxlcmAgd2l0aCBhIGN1c3RvbSBjb250cm9sIHRvIGFjaGlldmVcbiAqIGRhdGEtYmluZGluZy4gTm90aWNlIGhvdyBkaWZmZXJlbnQgZGlyZWN0aXZlcyAoYGNvbnRlbnRlZGl0YWJsZWAsIGBuZy1tb2RlbGAsIGFuZCBgcmVxdWlyZWRgKVxuICogY29sbGFib3JhdGUgdG9nZXRoZXIgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCByZXN1bHQuXG4gKlxuICogYGNvbnRlbnRlZGl0YWJsZWAgaXMgYW4gSFRNTDUgYXR0cmlidXRlLCB3aGljaCB0ZWxscyB0aGUgYnJvd3NlciB0byBsZXQgdGhlIGVsZW1lbnRcbiAqIGNvbnRlbnRzIGJlIGVkaXRlZCBpbiBwbGFjZSBieSB0aGUgdXNlci5cbiAqXG4gKiBXZSBhcmUgdXNpbmcgdGhlIHtAbGluayBuZy5zZXJ2aWNlOiRzY2UgJHNjZX0gc2VydmljZSBoZXJlIGFuZCBpbmNsdWRlIHRoZSB7QGxpbmsgbmdTYW5pdGl6ZSAkc2FuaXRpemV9XG4gKiBtb2R1bGUgdG8gYXV0b21hdGljYWxseSByZW1vdmUgXCJiYWRcIiBjb250ZW50IGxpa2UgaW5saW5lIGV2ZW50IGxpc3RlbmVyIChlLmcuIGA8c3BhbiBvbmNsaWNrPVwiLi4uXCI+YCkuXG4gKiBIb3dldmVyLCBhcyB3ZSBhcmUgdXNpbmcgYCRzY2VgIHRoZSBtb2RlbCBjYW4gc3RpbGwgZGVjaWRlIHRvIHByb3ZpZGUgdW5zYWZlIGNvbnRlbnQgaWYgaXQgbWFya3NcbiAqIHRoYXQgY29udGVudCB1c2luZyB0aGUgYCRzY2VgIHNlcnZpY2UuXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cIk5nTW9kZWxDb250cm9sbGVyXCIgbW9kdWxlPVwiY3VzdG9tQ29udHJvbFwiIGRlcHM9XCJhbmd1bGFyLXNhbml0aXplLmpzXCI+XG4gICAgPGZpbGUgbmFtZT1cInN0eWxlLmNzc1wiPlxuICAgICAgW2NvbnRlbnRlZGl0YWJsZV0ge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7XG4gICAgICB9XG5cbiAgICAgIC5uZy1pbnZhbGlkIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmVkO1xuICAgICAgfVxuXG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJzY3JpcHQuanNcIj5cbiAgICAgIGFuZ3VsYXIubW9kdWxlKCdjdXN0b21Db250cm9sJywgWyduZ1Nhbml0aXplJ10pLlxuICAgICAgICBkaXJlY3RpdmUoJ2NvbnRlbnRlZGl0YWJsZScsIFsnJHNjZScsIGZ1bmN0aW9uKCRzY2UpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzdHJpY3Q6ICdBJywgLy8gb25seSBhY3RpdmF0ZSBvbiBlbGVtZW50IGF0dHJpYnV0ZVxuICAgICAgICAgICAgcmVxdWlyZTogJz9uZ01vZGVsJywgLy8gZ2V0IGEgaG9sZCBvZiBOZ01vZGVsQ29udHJvbGxlclxuICAgICAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBuZ01vZGVsKSB7XG4gICAgICAgICAgICAgIGlmICghbmdNb2RlbCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nIGlmIG5vIG5nLW1vZGVsXG5cbiAgICAgICAgICAgICAgLy8gU3BlY2lmeSBob3cgVUkgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICAgICAgICAgICAgbmdNb2RlbC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5odG1sKCRzY2UuZ2V0VHJ1c3RlZEh0bWwobmdNb2RlbC4kdmlld1ZhbHVlIHx8ICcnKSk7XG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBjaGFuZ2UgZXZlbnRzIHRvIGVuYWJsZSBiaW5kaW5nXG4gICAgICAgICAgICAgIGVsZW1lbnQub24oJ2JsdXIga2V5dXAgY2hhbmdlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGV2YWxBc3luYyhyZWFkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJlYWQoKTsgLy8gaW5pdGlhbGl6ZVxuXG4gICAgICAgICAgICAgIC8vIFdyaXRlIGRhdGEgdG8gdGhlIG1vZGVsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGh0bWwgPSBlbGVtZW50Lmh0bWwoKTtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGNsZWFyIHRoZSBjb250ZW50IGVkaXRhYmxlIHRoZSBicm93c2VyIGxlYXZlcyBhIDxicj4gYmVoaW5kXG4gICAgICAgICAgICAgICAgLy8gSWYgc3RyaXAtYnIgYXR0cmlidXRlIGlzIHByb3ZpZGVkIHRoZW4gd2Ugc3RyaXAgdGhpcyBvdXRcbiAgICAgICAgICAgICAgICBpZiAoYXR0cnMuc3RyaXBCciAmJiBodG1sID09PSAnPGJyPicpIHtcbiAgICAgICAgICAgICAgICAgIGh0bWwgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGh0bWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfV0pO1xuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICAgICAgIDxkaXYgY29udGVudGVkaXRhYmxlXG4gICAgICAgICAgICBuYW1lPVwibXlXaWRnZXRcIiBuZy1tb2RlbD1cInVzZXJDb250ZW50XCJcbiAgICAgICAgICAgIHN0cmlwLWJyPVwidHJ1ZVwiXG4gICAgICAgICAgICByZXF1aXJlZD5DaGFuZ2UgbWUhPC9kaXY+XG4gICAgICAgIDxzcGFuIG5nLXNob3c9XCJteUZvcm0ubXlXaWRnZXQuJGVycm9yLnJlcXVpcmVkXCI+UmVxdWlyZWQhPC9zcGFuPlxuICAgICAgIDxocj5cbiAgICAgICA8dGV4dGFyZWEgbmctbW9kZWw9XCJ1c2VyQ29udGVudFwiIGFyaWEtbGFiZWw9XCJEeW5hbWljIHRleHRhcmVhXCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgIGl0KCdzaG91bGQgZGF0YS1iaW5kIGFuZCBiZWNvbWUgaW52YWxpZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT09ICdzYWZhcmknIHx8IGJyb3dzZXIucGFyYW1zLmJyb3dzZXIgPT09ICdmaXJlZm94Jykge1xuICAgICAgICAvLyBTYWZhcmlEcml2ZXIgY2FuJ3QgaGFuZGxlIGNvbnRlbnRlZGl0YWJsZVxuICAgICAgICAvLyBhbmQgRmlyZWZveCBkcml2ZXIgY2FuJ3QgY2xlYXIgY29udGVudGVkaXRhYmxlcyB2ZXJ5IHdlbGxcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGNvbnRlbnRFZGl0YWJsZSA9IGVsZW1lbnQoYnkuY3NzKCdbY29udGVudGVkaXRhYmxlXScpKTtcbiAgICAgIHZhciBjb250ZW50ID0gJ0NoYW5nZSBtZSEnO1xuXG4gICAgICBleHBlY3QoY29udGVudEVkaXRhYmxlLmdldFRleHQoKSkudG9FcXVhbChjb250ZW50KTtcblxuICAgICAgY29udGVudEVkaXRhYmxlLmNsZWFyKCk7XG4gICAgICBjb250ZW50RWRpdGFibGUuc2VuZEtleXMocHJvdHJhY3Rvci5LZXkuQkFDS19TUEFDRSk7XG4gICAgICBleHBlY3QoY29udGVudEVkaXRhYmxlLmdldFRleHQoKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoY29udGVudEVkaXRhYmxlLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkudG9NYXRjaCgvbmctaW52YWxpZC1yZXF1aXJlZC8pO1xuICAgIH0pO1xuICAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKlxuICovXG5OZ01vZGVsQ29udHJvbGxlci4kaW5qZWN0ID0gWyckc2NvcGUnLCAnJGV4Y2VwdGlvbkhhbmRsZXInLCAnJGF0dHJzJywgJyRlbGVtZW50JywgJyRwYXJzZScsICckYW5pbWF0ZScsICckdGltZW91dCcsICckcScsICckaW50ZXJwb2xhdGUnXTtcbmZ1bmN0aW9uIE5nTW9kZWxDb250cm9sbGVyKCRzY29wZSwgJGV4Y2VwdGlvbkhhbmRsZXIsICRhdHRyLCAkZWxlbWVudCwgJHBhcnNlLCAkYW5pbWF0ZSwgJHRpbWVvdXQsICRxLCAkaW50ZXJwb2xhdGUpIHtcbiAgdGhpcy4kdmlld1ZhbHVlID0gTnVtYmVyLk5hTjtcbiAgdGhpcy4kbW9kZWxWYWx1ZSA9IE51bWJlci5OYU47XG4gIHRoaXMuJCRyYXdNb2RlbFZhbHVlID0gdW5kZWZpbmVkOyAvLyBzdG9yZXMgdGhlIHBhcnNlZCBtb2RlbFZhbHVlIC8gbW9kZWwgc2V0IGZyb20gc2NvcGUgcmVnYXJkbGVzcyBvZiB2YWxpZGl0eS5cbiAgdGhpcy4kdmFsaWRhdG9ycyA9IHt9O1xuICB0aGlzLiRhc3luY1ZhbGlkYXRvcnMgPSB7fTtcbiAgdGhpcy4kcGFyc2VycyA9IFtdO1xuICB0aGlzLiRmb3JtYXR0ZXJzID0gW107XG4gIHRoaXMuJHZpZXdDaGFuZ2VMaXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy4kdW50b3VjaGVkID0gdHJ1ZTtcbiAgdGhpcy4kdG91Y2hlZCA9IGZhbHNlO1xuICB0aGlzLiRwcmlzdGluZSA9IHRydWU7XG4gIHRoaXMuJGRpcnR5ID0gZmFsc2U7XG4gIHRoaXMuJHZhbGlkID0gdHJ1ZTtcbiAgdGhpcy4kaW52YWxpZCA9IGZhbHNlO1xuICB0aGlzLiRlcnJvciA9IHt9OyAvLyBrZWVwIGludmFsaWQga2V5cyBoZXJlXG4gIHRoaXMuJCRzdWNjZXNzID0ge307IC8vIGtlZXAgdmFsaWQga2V5cyBoZXJlXG4gIHRoaXMuJHBlbmRpbmcgPSB1bmRlZmluZWQ7IC8vIGtlZXAgcGVuZGluZyBrZXlzIGhlcmVcbiAgdGhpcy4kbmFtZSA9ICRpbnRlcnBvbGF0ZSgkYXR0ci5uYW1lIHx8ICcnLCBmYWxzZSkoJHNjb3BlKTtcbiAgdGhpcy4kJHBhcmVudEZvcm0gPSBudWxsRm9ybUN0cmw7XG4gIHRoaXMuJG9wdGlvbnMgPSBkZWZhdWx0TW9kZWxPcHRpb25zO1xuXG4gIHRoaXMuJCRwYXJzZWROZ01vZGVsID0gJHBhcnNlKCRhdHRyLm5nTW9kZWwpO1xuICB0aGlzLiQkcGFyc2VkTmdNb2RlbEFzc2lnbiA9IHRoaXMuJCRwYXJzZWROZ01vZGVsLmFzc2lnbjtcbiAgdGhpcy4kJG5nTW9kZWxHZXQgPSB0aGlzLiQkcGFyc2VkTmdNb2RlbDtcbiAgdGhpcy4kJG5nTW9kZWxTZXQgPSB0aGlzLiQkcGFyc2VkTmdNb2RlbEFzc2lnbjtcbiAgdGhpcy4kJHBlbmRpbmdEZWJvdW5jZSA9IG51bGw7XG4gIHRoaXMuJCRwYXJzZXJWYWxpZCA9IHVuZGVmaW5lZDtcblxuICB0aGlzLiQkY3VycmVudFZhbGlkYXRpb25SdW5JZCA9IDA7XG5cbiAgdGhpcy4kJHNjb3BlID0gJHNjb3BlO1xuICB0aGlzLiQkYXR0ciA9ICRhdHRyO1xuICB0aGlzLiQkZWxlbWVudCA9ICRlbGVtZW50O1xuICB0aGlzLiQkYW5pbWF0ZSA9ICRhbmltYXRlO1xuICB0aGlzLiQkdGltZW91dCA9ICR0aW1lb3V0O1xuICB0aGlzLiQkcGFyc2UgPSAkcGFyc2U7XG4gIHRoaXMuJCRxID0gJHE7XG4gIHRoaXMuJCRleGNlcHRpb25IYW5kbGVyID0gJGV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgc2V0dXBWYWxpZGl0eSh0aGlzKTtcbiAgc2V0dXBNb2RlbFdhdGNoZXIodGhpcyk7XG59XG5cbk5nTW9kZWxDb250cm9sbGVyLnByb3RvdHlwZSA9IHtcbiAgJCRpbml0R2V0dGVyU2V0dGVyczogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuZ2V0T3B0aW9uKCdnZXR0ZXJTZXR0ZXInKSkge1xuICAgICAgdmFyIGludm9rZU1vZGVsR2V0dGVyID0gdGhpcy4kJHBhcnNlKHRoaXMuJCRhdHRyLm5nTW9kZWwgKyAnKCknKSxcbiAgICAgICAgICBpbnZva2VNb2RlbFNldHRlciA9IHRoaXMuJCRwYXJzZSh0aGlzLiQkYXR0ci5uZ01vZGVsICsgJygkJCRwKScpO1xuXG4gICAgICB0aGlzLiQkbmdNb2RlbEdldCA9IGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICB2YXIgbW9kZWxWYWx1ZSA9IHRoaXMuJCRwYXJzZWROZ01vZGVsKCRzY29wZSk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKG1vZGVsVmFsdWUpKSB7XG4gICAgICAgICAgbW9kZWxWYWx1ZSA9IGludm9rZU1vZGVsR2V0dGVyKCRzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZGVsVmFsdWU7XG4gICAgICB9O1xuICAgICAgdGhpcy4kJG5nTW9kZWxTZXQgPSBmdW5jdGlvbigkc2NvcGUsIG5ld1ZhbHVlKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMuJCRwYXJzZWROZ01vZGVsKCRzY29wZSkpKSB7XG4gICAgICAgICAgaW52b2tlTW9kZWxTZXR0ZXIoJHNjb3BlLCB7JCQkcDogbmV3VmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiQkcGFyc2VkTmdNb2RlbEFzc2lnbigkc2NvcGUsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLiQkcGFyc2VkTmdNb2RlbC5hc3NpZ24pIHtcbiAgICAgIHRocm93IG5nTW9kZWxNaW5FcnIoJ25vbmFzc2lnbicsICdFeHByZXNzaW9uIFxcJ3swfVxcJyBpcyBub24tYXNzaWduYWJsZS4gRWxlbWVudDogezF9JyxcbiAgICAgICAgICB0aGlzLiQkYXR0ci5uZ01vZGVsLCBzdGFydGluZ1RhZyh0aGlzLiQkZWxlbWVudCkpO1xuICAgIH1cbiAgfSxcblxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHJlbmRlclxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZXcgbmVlZHMgdG8gYmUgdXBkYXRlZC4gSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgdXNlciBvZiB0aGUgbmctbW9kZWxcbiAgICogZGlyZWN0aXZlIHdpbGwgaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBUaGUgYCRyZW5kZXIoKWAgbWV0aG9kIGlzIGludm9rZWQgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOlxuICAgKlxuICAgKiAqIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgaXMgY2FsbGVkLiAgSWYgd2UgYXJlIHJvbGxpbmcgYmFjayB0aGUgdmlldyB2YWx1ZSB0byB0aGUgbGFzdFxuICAgKiAgIGNvbW1pdHRlZCB2YWx1ZSB0aGVuIGAkcmVuZGVyKClgIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIGlucHV0IGNvbnRyb2wuXG4gICAqICogVGhlIHZhbHVlIHJlZmVyZW5jZWQgYnkgYG5nLW1vZGVsYCBpcyBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHkgYW5kIGJvdGggdGhlIGAkbW9kZWxWYWx1ZWAgYW5kXG4gICAqICAgdGhlIGAkdmlld1ZhbHVlYCBhcmUgZGlmZmVyZW50IGZyb20gbGFzdCB0aW1lLlxuICAgKlxuICAgKiBTaW5jZSBgbmctbW9kZWxgIGRvZXMgbm90IGRvIGEgZGVlcCB3YXRjaCwgYCRyZW5kZXIoKWAgaXMgb25seSBpbnZva2VkIGlmIHRoZSB2YWx1ZXMgb2ZcbiAgICogYCRtb2RlbFZhbHVlYCBhbmQgYCR2aWV3VmFsdWVgIGFyZSBhY3R1YWxseSBkaWZmZXJlbnQgZnJvbSB0aGVpciBwcmV2aW91cyB2YWx1ZXMuIElmIGAkbW9kZWxWYWx1ZWBcbiAgICogb3IgYCR2aWV3VmFsdWVgIGFyZSBvYmplY3RzIChyYXRoZXIgdGhhbiBhIHN0cmluZyBvciBudW1iZXIpIHRoZW4gYCRyZW5kZXIoKWAgd2lsbCBub3QgYmVcbiAgICogaW52b2tlZCBpZiB5b3Ugb25seSBjaGFuZ2UgYSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0cy5cbiAgICovXG4gICRyZW5kZXI6IG5vb3AsXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkaXNFbXB0eVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgaXMgZW1wdHkuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgdGhlIHJlcXVpcmVkIGRpcmVjdGl2ZSBkb2VzIHRoaXMgdG8gd29yayBvdXQgaWYgdGhlIGlucHV0IGhhcyBkYXRhIG9yIG5vdC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgYCRpc0VtcHR5YCBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIGAnJ2AsIGBudWxsYCBvciBgTmFOYC5cbiAgICpcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIGZvciBpbnB1dCBkaXJlY3RpdmVzIHdob3NlIGNvbmNlcHQgb2YgYmVpbmcgZW1wdHkgaXMgZGlmZmVyZW50IGZyb20gdGhlXG4gICAqIGRlZmF1bHQuIFRoZSBgY2hlY2tib3hJbnB1dFR5cGVgIGRpcmVjdGl2ZSBkb2VzIHRoaXMgYmVjYXVzZSBpbiBpdHMgY2FzZSBhIHZhbHVlIG9mIGBmYWxzZWBcbiAgICogaW1wbGllcyBlbXB0eS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGlucHV0IHRvIGNoZWNrIGZvciBlbXB0aW5lc3MuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGB2YWx1ZWAgaXMgXCJlbXB0eVwiLlxuICAgKi9cbiAgJGlzRW1wdHk6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZTtcbiAgfSxcblxuICAkJHVwZGF0ZUVtcHR5Q2xhc3NlczogZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAodGhpcy4kaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuJCRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCBOT1RfRU1QVFlfQ0xBU1MpO1xuICAgICAgdGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsIEVNUFRZX0NMQVNTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4kJGFuaW1hdGUucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsIEVNUFRZX0NMQVNTKTtcbiAgICAgIHRoaXMuJCRhbmltYXRlLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LCBOT1RfRU1QVFlfQ0xBU1MpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRQcmlzdGluZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyB0aGUgY29udHJvbCB0byBpdHMgcHJpc3RpbmUgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBgbmctZGlydHlgIGNsYXNzIGFuZCBzZXQgdGhlIGNvbnRyb2wgdG8gaXRzIHByaXN0aW5lXG4gICAqIHN0YXRlIChgbmctcHJpc3RpbmVgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIHByaXN0aW5lIHdoZW4gdGhlIGNvbnRyb2xcbiAgICogaGFzIG5vdCBiZWVuIGNoYW5nZWQgZnJvbSB3aGVuIGZpcnN0IGNvbXBpbGVkLlxuICAgKi9cbiAgJHNldFByaXN0aW5lOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiRkaXJ0eSA9IGZhbHNlO1xuICAgIHRoaXMuJHByaXN0aW5lID0gdHJ1ZTtcbiAgICB0aGlzLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCwgRElSVFlfQ0xBU1MpO1xuICAgIHRoaXMuJCRhbmltYXRlLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LCBQUklTVElORV9DTEFTUyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0RGlydHlcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIGNvbnRyb2wgdG8gaXRzIGRpcnR5IHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLXByaXN0aW5lYCBjbGFzcyBhbmQgc2V0IHRoZSBjb250cm9sIHRvIGl0cyBkaXJ0eVxuICAgKiBzdGF0ZSAoYG5nLWRpcnR5YCBjbGFzcykuIEEgbW9kZWwgaXMgY29uc2lkZXJlZCB0byBiZSBkaXJ0eSB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIGNoYW5nZWRcbiAgICogZnJvbSB3aGVuIGZpcnN0IGNvbXBpbGVkLlxuICAgKi9cbiAgJHNldERpcnR5OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiRkaXJ0eSA9IHRydWU7XG4gICAgdGhpcy4kcHJpc3RpbmUgPSBmYWxzZTtcbiAgICB0aGlzLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCwgUFJJU1RJTkVfQ0xBU1MpO1xuICAgIHRoaXMuJCRhbmltYXRlLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LCBESVJUWV9DTEFTUyk7XG4gICAgdGhpcy4kJHBhcmVudEZvcm0uJHNldERpcnR5KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0VW50b3VjaGVkXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyB1bnRvdWNoZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBgbmctdG91Y2hlZGAgY2xhc3MgYW5kIHNldCB0aGUgY29udHJvbCB0byBpdHNcbiAgICogdW50b3VjaGVkIHN0YXRlIChgbmctdW50b3VjaGVkYCBjbGFzcykuIFVwb24gY29tcGlsYXRpb24sIGEgbW9kZWwgaXMgc2V0IGFzIHVudG91Y2hlZFxuICAgKiBieSBkZWZhdWx0LCBob3dldmVyIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdG9yZSB0aGF0IHN0YXRlIGlmIHRoZSBtb2RlbCBoYXNcbiAgICogYWxyZWFkeSBiZWVuIHRvdWNoZWQgYnkgdGhlIHVzZXIuXG4gICAqL1xuICAkc2V0VW50b3VjaGVkOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiR0b3VjaGVkID0gZmFsc2U7XG4gICAgdGhpcy4kdW50b3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLiQkYW5pbWF0ZS5zZXRDbGFzcyh0aGlzLiQkZWxlbWVudCwgVU5UT1VDSEVEX0NMQVNTLCBUT1VDSEVEX0NMQVNTKTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRzZXRUb3VjaGVkXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBjb250cm9sIHRvIGl0cyB0b3VjaGVkIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgYG5nLXVudG91Y2hlZGAgY2xhc3MgYW5kIHNldCB0aGUgY29udHJvbCB0byBpdHNcbiAgICogdG91Y2hlZCBzdGF0ZSAoYG5nLXRvdWNoZWRgIGNsYXNzKS4gQSBtb2RlbCBpcyBjb25zaWRlcmVkIHRvIGJlIHRvdWNoZWQgd2hlbiB0aGUgdXNlciBoYXNcbiAgICogZmlyc3QgZm9jdXNlZCB0aGUgY29udHJvbCBlbGVtZW50IGFuZCB0aGVuIHNoaWZ0ZWQgZm9jdXMgYXdheSBmcm9tIHRoZSBjb250cm9sIChibHVyIGV2ZW50KS5cbiAgICovXG4gICRzZXRUb3VjaGVkOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiR0b3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLiR1bnRvdWNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLiQkYW5pbWF0ZS5zZXRDbGFzcyh0aGlzLiQkZWxlbWVudCwgVE9VQ0hFRF9DTEFTUywgVU5UT1VDSEVEX0NMQVNTKTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRyb2xsYmFja1ZpZXdWYWx1ZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQ2FuY2VsIGFuIHVwZGF0ZSBhbmQgcmVzZXQgdGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZSB0byBwcmV2ZW50IGFuIHVwZGF0ZSB0byB0aGUgYCRtb2RlbFZhbHVlYCxcbiAgICogd2hpY2ggbWF5IGJlIGNhdXNlZCBieSBhIHBlbmRpbmcgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIHNvbWVcbiAgICogZnV0dXJlIGV2ZW50LlxuICAgKlxuICAgKiBJZiB5b3UgaGF2ZSBhbiBpbnB1dCB0aGF0IHVzZXMgYG5nLW1vZGVsLW9wdGlvbnNgIHRvIHNldCB1cCBkZWJvdW5jZWQgdXBkYXRlcyBvciB1cGRhdGVzIHRoYXRcbiAgICogZGVwZW5kIG9uIHNwZWNpYWwgZXZlbnRzIHN1Y2ggYXMgYGJsdXJgLCB0aGVyZSBjYW4gYmUgYSBwZXJpb2Qgd2hlbiB0aGUgYCR2aWV3VmFsdWVgIGlzIG91dCBvZlxuICAgKiBzeW5jIHdpdGggdGhlIG5nTW9kZWwncyBgJG1vZGVsVmFsdWVgLlxuICAgKlxuICAgKiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdXNlIGAkcm9sbGJhY2tWaWV3VmFsdWUoKWAgdG8gbWFudWFsbHkgY2FuY2VsIHRoZSBkZWJvdW5jZWQgLyBmdXR1cmUgdXBkYXRlXG4gICAqIGFuZCByZXNldCB0aGUgaW5wdXQgdG8gdGhlIGxhc3QgY29tbWl0dGVkIHZpZXcgdmFsdWUuXG4gICAqXG4gICAqIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB5b3UgcnVuIGludG8gZGlmZmljdWx0aWVzIGlmIHlvdSB0cnkgdG8gdXBkYXRlIHRoZSBuZ01vZGVsJ3MgYCRtb2RlbFZhbHVlYFxuICAgKiBwcm9ncmFtbWF0aWNhbGx5IGJlZm9yZSB0aGVzZSBkZWJvdW5jZWQvZnV0dXJlIGV2ZW50cyBoYXZlIHJlc29sdmVkL29jY3VycmVkLCBiZWNhdXNlIEFuZ3VsYXInc1xuICAgKiBkaXJ0eSBjaGVja2luZyBtZWNoYW5pc20gaXMgbm90IGFibGUgdG8gdGVsbCB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYWN0dWFsbHkgY2hhbmdlZCBvciBub3QuXG4gICAqXG4gICAqIFRoZSBgJHJvbGxiYWNrVmlld1ZhbHVlKClgIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBwcm9ncmFtbWF0aWNhbGx5IGNoYW5naW5nIHRoZSBtb2RlbCBvZiBhblxuICAgKiBpbnB1dCB3aGljaCBtYXkgaGF2ZSBzdWNoIGV2ZW50cyBwZW5kaW5nLiBUaGlzIGlzIGltcG9ydGFudCBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCB0aGVcbiAgICogaW5wdXQgZmllbGQgd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIG5ldyBtb2RlbCB2YWx1ZSBhbmQgYW55IHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgY2FuY2VsbGVkLlxuICAgKlxuICAgKiA8ZXhhbXBsZSBuYW1lPVwibmctbW9kZWwtY2FuY2VsLXVwZGF0ZVwiIG1vZHVsZT1cImNhbmNlbC11cGRhdGUtZXhhbXBsZVwiPlxuICAgKiAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAgICogICAgIGFuZ3VsYXIubW9kdWxlKCdjYW5jZWwtdXBkYXRlLWV4YW1wbGUnLCBbXSlcbiAgICpcbiAgICogICAgIC5jb250cm9sbGVyKCdDYW5jZWxVcGRhdGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICogICAgICAgJHNjb3BlLm1vZGVsID0ge3ZhbHVlMTogJycsIHZhbHVlMjogJyd9O1xuICAgKlxuICAgKiAgICAgICAkc2NvcGUuc2V0RW1wdHkgPSBmdW5jdGlvbihlLCB2YWx1ZSwgcm9sbGJhY2spIHtcbiAgICogICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgKiAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgKiAgICAgICAgICAgaWYgKHJvbGxiYWNrKSB7XG4gICAqICAgICAgICAgICAgICRzY29wZS5teUZvcm1bdmFsdWVdLiRyb2xsYmFja1ZpZXdWYWx1ZSgpO1xuICAgKiAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgJHNjb3BlLm1vZGVsW3ZhbHVlXSA9ICcnO1xuICAgKiAgICAgICAgIH1cbiAgICogICAgICAgfTtcbiAgICogICAgIH1dKTtcbiAgICogICA8L2ZpbGU+XG4gICAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkNhbmNlbFVwZGF0ZUNvbnRyb2xsZXJcIj5cbiAgICogICAgICAgPHA+Qm90aCBvZiB0aGVzZSBpbnB1dHMgYXJlIG9ubHkgdXBkYXRlZCBpZiB0aGV5IGFyZSBibHVycmVkLiBIaXR0aW5nIGVzY2FwZSBzaG91bGRcbiAgICogICAgICAgZW1wdHkgdGhlbS4gRm9sbG93IHRoZXNlIHN0ZXBzIGFuZCBvYnNlcnZlIHRoZSBkaWZmZXJlbmNlOjwvcD5cbiAgICogICAgICAgPG9sPlxuICAgKiAgICAgICAgIDxsaT5UeXBlIHNvbWV0aGluZyBpbiB0aGUgaW5wdXQuIFlvdSB3aWxsIHNlZSB0aGF0IHRoZSBtb2RlbCBpcyBub3QgeWV0IHVwZGF0ZWQ8L2xpPlxuICAgKiAgICAgICAgIDxsaT5QcmVzcyB0aGUgRXNjYXBlIGtleS5cbiAgICogICAgICAgICAgIDxvbD5cbiAgICogICAgICAgICAgICAgPGxpPiBJbiB0aGUgZmlyc3QgZXhhbXBsZSwgbm90aGluZyBoYXBwZW5zLCBiZWNhdXNlIHRoZSBtb2RlbCBpcyBhbHJlYWR5ICcnLCBhbmQgbm9cbiAgICogICAgICAgICAgICAgdXBkYXRlIGlzIGRldGVjdGVkLiBJZiB5b3UgYmx1ciB0aGUgaW5wdXQsIHRoZSBtb2RlbCB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCB2aWV3LlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgICA8bGk+IEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgdGhlIHBlbmRpbmcgdXBkYXRlIGlzIGNhbmNlbGxlZCwgYW5kIHRoZSBpbnB1dCBpcyBzZXQgYmFja1xuICAgKiAgICAgICAgICAgICB0byB0aGUgbGFzdCBjb21taXR0ZWQgdmlldyB2YWx1ZSAoJycpLiBCbHVycmluZyB0aGUgaW5wdXQgZG9lcyBub3RoaW5nLlxuICAgKiAgICAgICAgICAgICA8L2xpPlxuICAgKiAgICAgICAgICAgPC9vbD5cbiAgICogICAgICAgICA8L2xpPlxuICAgKiAgICAgICA8L29sPlxuICAgKlxuICAgKiAgICAgICA8Zm9ybSBuYW1lPVwibXlGb3JtXCIgbmctbW9kZWwtb3B0aW9ucz1cInsgdXBkYXRlT246ICdibHVyJyB9XCI+XG4gICAqICAgICAgICAgPGRpdj5cbiAgICogICAgICAgICAgIDxwIGlkPVwiaW5wdXREZXNjcmlwdGlvbjFcIj5XaXRob3V0ICRyb2xsYmFja1ZpZXdWYWx1ZSgpOjwvcD5cbiAgICogICAgICAgICAgIDxpbnB1dCBuYW1lPVwidmFsdWUxXCIgYXJpYS1kZXNjcmliZWRieT1cImlucHV0RGVzY3JpcHRpb24xXCIgbmctbW9kZWw9XCJtb2RlbC52YWx1ZTFcIlxuICAgKiAgICAgICAgICAgICAgICAgIG5nLWtleWRvd249XCJzZXRFbXB0eSgkZXZlbnQsICd2YWx1ZTEnKVwiPlxuICAgKiAgICAgICAgICAgdmFsdWUxOiBcInt7IG1vZGVsLnZhbHVlMSB9fVwiXG4gICAqICAgICAgICAgPC9kaXY+XG4gICAqXG4gICAqICAgICAgICAgPGRpdj5cbiAgICogICAgICAgICAgIDxwIGlkPVwiaW5wdXREZXNjcmlwdGlvbjJcIj5XaXRoICRyb2xsYmFja1ZpZXdWYWx1ZSgpOjwvcD5cbiAgICogICAgICAgICAgIDxpbnB1dCBuYW1lPVwidmFsdWUyXCIgYXJpYS1kZXNjcmliZWRieT1cImlucHV0RGVzY3JpcHRpb24yXCIgbmctbW9kZWw9XCJtb2RlbC52YWx1ZTJcIlxuICAgKiAgICAgICAgICAgICAgICAgIG5nLWtleWRvd249XCJzZXRFbXB0eSgkZXZlbnQsICd2YWx1ZTInLCB0cnVlKVwiPlxuICAgKiAgICAgICAgICAgdmFsdWUyOiBcInt7IG1vZGVsLnZhbHVlMiB9fVwiXG4gICAqICAgICAgICAgPC9kaXY+XG4gICAqICAgICAgIDwvZm9ybT5cbiAgICogICAgIDwvZGl2PlxuICAgKiAgIDwvZmlsZT5cbiAgICAgICA8ZmlsZSBuYW1lPVwic3R5bGUuY3NzXCI+XG4gICAgICAgICAgZGl2IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpdjpudGgtY2hpbGQoMSkge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMzBweDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgPC9maWxlPlxuICAgKiA8L2V4YW1wbGU+XG4gICAqL1xuICAkcm9sbGJhY2tWaWV3VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuJCR0aW1lb3V0LmNhbmNlbCh0aGlzLiQkcGVuZGluZ0RlYm91bmNlKTtcbiAgICB0aGlzLiR2aWV3VmFsdWUgPSB0aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTtcbiAgICB0aGlzLiRyZW5kZXIoKTtcbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0ZVxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUnVucyBlYWNoIG9mIHRoZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMgKGZpcnN0IHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgYW5kIHRoZW5cbiAgICogYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMpLlxuICAgKiBJZiB0aGUgdmFsaWRpdHkgY2hhbmdlcyB0byBpbnZhbGlkLCB0aGUgbW9kZWwgd2lsbCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAsXG4gICAqIHVubGVzcyB7QGxpbmsgbmdNb2RlbE9wdGlvbnMgYG5nTW9kZWxPcHRpb25zLmFsbG93SW52YWxpZGB9IGlzIGB0cnVlYC5cbiAgICogSWYgdGhlIHZhbGlkaXR5IGNoYW5nZXMgdG8gdmFsaWQsIGl0IHdpbGwgc2V0IHRoZSBtb2RlbCB0byB0aGUgbGFzdCBhdmFpbGFibGUgdmFsaWRcbiAgICogYCRtb2RlbFZhbHVlYCwgaS5lLiBlaXRoZXIgdGhlIGxhc3QgcGFyc2VkIHZhbHVlIG9yIHRoZSBsYXN0IHZhbHVlIHNldCBmcm9tIHRoZSBzY29wZS5cbiAgICovXG4gICR2YWxpZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgLy8gaWdub3JlICR2YWxpZGF0ZSBiZWZvcmUgbW9kZWwgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAoaXNOdW1iZXJOYU4odGhpcy4kbW9kZWxWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdmlld1ZhbHVlID0gdGhpcy4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU7XG4gICAgLy8gTm90ZTogd2UgdXNlIHRoZSAkJHJhd01vZGVsVmFsdWUgYXMgJG1vZGVsVmFsdWUgbWlnaHQgaGF2ZSBiZWVuXG4gICAgLy8gc2V0IHRvIHVuZGVmaW5lZCBkdXJpbmcgYSB2aWV3IC0+IG1vZGVsIHVwZGF0ZSB0aGF0IGZvdW5kIHZhbGlkYXRpb25cbiAgICAvLyBlcnJvcnMuIFdlIGNhbid0IHBhcnNlIHRoZSB2aWV3IGhlcmUsIHNpbmNlIHRoYXQgY291bGQgY2hhbmdlXG4gICAgLy8gdGhlIG1vZGVsIGFsdGhvdWdoIG5laXRoZXIgdmlld1ZhbHVlIG5vciB0aGUgbW9kZWwgb24gdGhlIHNjb3BlIGNoYW5nZWRcbiAgICB2YXIgbW9kZWxWYWx1ZSA9IHRoaXMuJCRyYXdNb2RlbFZhbHVlO1xuXG4gICAgdmFyIHByZXZWYWxpZCA9IHRoaXMuJHZhbGlkO1xuICAgIHZhciBwcmV2TW9kZWxWYWx1ZSA9IHRoaXMuJG1vZGVsVmFsdWU7XG5cbiAgICB2YXIgYWxsb3dJbnZhbGlkID0gdGhpcy4kb3B0aW9ucy5nZXRPcHRpb24oJ2FsbG93SW52YWxpZCcpO1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuJCRydW5WYWxpZGF0b3JzKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgZnVuY3Rpb24oYWxsVmFsaWQpIHtcbiAgICAgIC8vIElmIHRoZXJlIHdhcyBubyBjaGFuZ2UgaW4gdmFsaWRpdHksIGRvbid0IHVwZGF0ZSB0aGUgbW9kZWxcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgY2hhbmdpbmcgYW4gaW52YWxpZCBtb2RlbFZhbHVlIHRvIHVuZGVmaW5lZFxuICAgICAgaWYgKCFhbGxvd0ludmFsaWQgJiYgcHJldlZhbGlkICE9PSBhbGxWYWxpZCkge1xuICAgICAgICAvLyBOb3RlOiBEb24ndCBjaGVjayB0aGlzLiR2YWxpZCBoZXJlLCBhcyB3ZSBjb3VsZCBoYXZlXG4gICAgICAgIC8vIGV4dGVybmFsIHZhbGlkYXRvcnMgKGUuZy4gY2FsY3VsYXRlZCBvbiB0aGUgc2VydmVyKSxcbiAgICAgICAgLy8gdGhhdCBqdXN0IGNhbGwgJHNldFZhbGlkaXR5IGFuZCBuZWVkIHRoZSBtb2RlbCB2YWx1ZVxuICAgICAgICAvLyB0byBjYWxjdWxhdGUgdGhlaXIgdmFsaWRpdHkuXG4gICAgICAgIHRoYXQuJG1vZGVsVmFsdWUgPSBhbGxWYWxpZCA/IG1vZGVsVmFsdWUgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHRoYXQuJG1vZGVsVmFsdWUgIT09IHByZXZNb2RlbFZhbHVlKSB7XG4gICAgICAgICAgdGhhdC4kJHdyaXRlTW9kZWxUb1Njb3BlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICAkJHJ1blZhbGlkYXRvcnM6IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSwgZG9uZUNhbGxiYWNrKSB7XG4gICAgdGhpcy4kJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQrKztcbiAgICB2YXIgbG9jYWxWYWxpZGF0aW9uUnVuSWQgPSB0aGlzLiQkY3VycmVudFZhbGlkYXRpb25SdW5JZDtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG5cbiAgICAvLyBjaGVjayBwYXJzZXIgZXJyb3JcbiAgICBpZiAoIXByb2Nlc3NQYXJzZUVycm9ycygpKSB7XG4gICAgICB2YWxpZGF0aW9uRG9uZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcHJvY2Vzc1N5bmNWYWxpZGF0b3JzKCkpIHtcbiAgICAgIHZhbGlkYXRpb25Eb25lKGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzc0FzeW5jVmFsaWRhdG9ycygpO1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1BhcnNlRXJyb3JzKCkge1xuICAgICAgdmFyIGVycm9yS2V5ID0gdGhhdC4kJHBhcnNlck5hbWUgfHwgJ3BhcnNlJztcbiAgICAgIGlmIChpc1VuZGVmaW5lZCh0aGF0LiQkcGFyc2VyVmFsaWQpKSB7XG4gICAgICAgIHNldFZhbGlkaXR5KGVycm9yS2V5LCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhhdC4kJHBhcnNlclZhbGlkKSB7XG4gICAgICAgICAgZm9yRWFjaCh0aGF0LiR2YWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7XG4gICAgICAgICAgICBzZXRWYWxpZGl0eShuYW1lLCBudWxsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3JFYWNoKHRoYXQuJGFzeW5jVmFsaWRhdG9ycywgZnVuY3Rpb24odiwgbmFtZSkge1xuICAgICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgbnVsbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHRoZSBwYXJzZSBlcnJvciBsYXN0LCB0byBwcmV2ZW50IHVuc2V0dGluZyBpdCwgc2hvdWxkIGEgJHZhbGlkYXRvcnMga2V5ID09IHBhcnNlck5hbWVcbiAgICAgICAgc2V0VmFsaWRpdHkoZXJyb3JLZXksIHRoYXQuJCRwYXJzZXJWYWxpZCk7XG4gICAgICAgIHJldHVybiB0aGF0LiQkcGFyc2VyVmFsaWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzU3luY1ZhbGlkYXRvcnMoKSB7XG4gICAgICB2YXIgc3luY1ZhbGlkYXRvcnNWYWxpZCA9IHRydWU7XG4gICAgICBmb3JFYWNoKHRoYXQuJHZhbGlkYXRvcnMsIGZ1bmN0aW9uKHZhbGlkYXRvciwgbmFtZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gQm9vbGVhbih2YWxpZGF0b3IobW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSk7XG4gICAgICAgIHN5bmNWYWxpZGF0b3JzVmFsaWQgPSBzeW5jVmFsaWRhdG9yc1ZhbGlkICYmIHJlc3VsdDtcbiAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFzeW5jVmFsaWRhdG9yc1ZhbGlkKSB7XG4gICAgICAgIGZvckVhY2godGhhdC4kYXN5bmNWYWxpZGF0b3JzLCBmdW5jdGlvbih2LCBuYW1lKSB7XG4gICAgICAgICAgc2V0VmFsaWRpdHkobmFtZSwgbnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzQXN5bmNWYWxpZGF0b3JzKCkge1xuICAgICAgdmFyIHZhbGlkYXRvclByb21pc2VzID0gW107XG4gICAgICB2YXIgYWxsVmFsaWQgPSB0cnVlO1xuICAgICAgZm9yRWFjaCh0aGF0LiRhc3luY1ZhbGlkYXRvcnMsIGZ1bmN0aW9uKHZhbGlkYXRvciwgbmFtZSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IHZhbGlkYXRvcihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpO1xuICAgICAgICBpZiAoIWlzUHJvbWlzZUxpa2UocHJvbWlzZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZ01vZGVsTWluRXJyKCdub3Byb21pc2UnLFxuICAgICAgICAgICAgJ0V4cGVjdGVkIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgdG8gcmV0dXJuIGEgcHJvbWlzZSBidXQgZ290IFxcJ3swfVxcJyBpbnN0ZWFkLicsIHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIHVuZGVmaW5lZCk7XG4gICAgICAgIHZhbGlkYXRvclByb21pc2VzLnB1c2gocHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIHRydWUpO1xuICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBhbGxWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgIHNldFZhbGlkaXR5KG5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIXZhbGlkYXRvclByb21pc2VzLmxlbmd0aCkge1xuICAgICAgICB2YWxpZGF0aW9uRG9uZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuJCRxLmFsbCh2YWxpZGF0b3JQcm9taXNlcykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uRG9uZShhbGxWYWxpZCk7XG4gICAgICAgIH0sIG5vb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFZhbGlkaXR5KG5hbWUsIGlzVmFsaWQpIHtcbiAgICAgIGlmIChsb2NhbFZhbGlkYXRpb25SdW5JZCA9PT0gdGhhdC4kJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQpIHtcbiAgICAgICAgdGhhdC4kc2V0VmFsaWRpdHkobmFtZSwgaXNWYWxpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGlvbkRvbmUoYWxsVmFsaWQpIHtcbiAgICAgIGlmIChsb2NhbFZhbGlkYXRpb25SdW5JZCA9PT0gdGhhdC4kJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQpIHtcblxuICAgICAgICBkb25lQ2FsbGJhY2soYWxsVmFsaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQG5nZG9jIG1ldGhvZFxuICAgKiBAbmFtZSBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRjb21taXRWaWV3VmFsdWVcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbW1pdCBhIHBlbmRpbmcgdXBkYXRlIHRvIHRoZSBgJG1vZGVsVmFsdWVgLlxuICAgKlxuICAgKiBVcGRhdGVzIG1heSBiZSBwZW5kaW5nIGJ5IGEgZGVib3VuY2VkIGV2ZW50IG9yIGJlY2F1c2UgdGhlIGlucHV0IGlzIHdhaXRpbmcgZm9yIGEgc29tZSBmdXR1cmVcbiAgICogZXZlbnQgZGVmaW5lZCBpbiBgbmctbW9kZWwtb3B0aW9uc2AuIHRoaXMgbWV0aG9kIGlzIHJhcmVseSBuZWVkZWQgYXMgYE5nTW9kZWxDb250cm9sbGVyYFxuICAgKiB1c3VhbGx5IGhhbmRsZXMgY2FsbGluZyB0aGlzIGluIHJlc3BvbnNlIHRvIGlucHV0IGV2ZW50cy5cbiAgICovXG4gICRjb21taXRWaWV3VmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2aWV3VmFsdWUgPSB0aGlzLiR2aWV3VmFsdWU7XG5cbiAgICB0aGlzLiQkdGltZW91dC5jYW5jZWwodGhpcy4kJHBlbmRpbmdEZWJvdW5jZSk7XG5cbiAgICAvLyBJZiB0aGUgdmlldyB2YWx1ZSBoYXMgbm90IGNoYW5nZWQgdGhlbiB3ZSBzaG91bGQganVzdCBleGl0LCBleGNlcHQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXNcbiAgICAvLyBhIG5hdGl2ZSB2YWxpZGF0b3Igb24gdGhlIGVsZW1lbnQuIEluIHRoaXMgY2FzZSB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkIGV2ZW4gdGhvdWdoXG4gICAgLy8gdGhlIHZpZXdWYWx1ZSBoYXMgc3RheWVkIGVtcHR5LlxuICAgIGlmICh0aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSA9PT0gdmlld1ZhbHVlICYmICh2aWV3VmFsdWUgIT09ICcnIHx8ICF0aGlzLiQkaGFzTmF0aXZlVmFsaWRhdG9ycykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4kJHVwZGF0ZUVtcHR5Q2xhc3Nlcyh2aWV3VmFsdWUpO1xuICAgIHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID0gdmlld1ZhbHVlO1xuXG4gICAgLy8gY2hhbmdlIHRvIGRpcnR5XG4gICAgaWYgKHRoaXMuJHByaXN0aW5lKSB7XG4gICAgICB0aGlzLiRzZXREaXJ0eSgpO1xuICAgIH1cbiAgICB0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZSgpO1xuICB9LFxuXG4gICQkcGFyc2VBbmRWYWxpZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZpZXdWYWx1ZSA9IHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlO1xuICAgIHZhciBtb2RlbFZhbHVlID0gdmlld1ZhbHVlO1xuICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgIHRoaXMuJCRwYXJzZXJWYWxpZCA9IGlzVW5kZWZpbmVkKG1vZGVsVmFsdWUpID8gdW5kZWZpbmVkIDogdHJ1ZTtcblxuICAgIGlmICh0aGlzLiQkcGFyc2VyVmFsaWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy4kcGFyc2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb2RlbFZhbHVlID0gdGhpcy4kcGFyc2Vyc1tpXShtb2RlbFZhbHVlKTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKG1vZGVsVmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy4kJHBhcnNlclZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTnVtYmVyTmFOKHRoaXMuJG1vZGVsVmFsdWUpKSB7XG4gICAgICAvLyB0aGlzLiRtb2RlbFZhbHVlIGhhcyBub3QgYmVlbiB0b3VjaGVkIHlldC4uLlxuICAgICAgdGhpcy4kbW9kZWxWYWx1ZSA9IHRoaXMuJCRuZ01vZGVsR2V0KHRoaXMuJCRzY29wZSk7XG4gICAgfVxuICAgIHZhciBwcmV2TW9kZWxWYWx1ZSA9IHRoaXMuJG1vZGVsVmFsdWU7XG4gICAgdmFyIGFsbG93SW52YWxpZCA9IHRoaXMuJG9wdGlvbnMuZ2V0T3B0aW9uKCdhbGxvd0ludmFsaWQnKTtcbiAgICB0aGlzLiQkcmF3TW9kZWxWYWx1ZSA9IG1vZGVsVmFsdWU7XG5cbiAgICBpZiAoYWxsb3dJbnZhbGlkKSB7XG4gICAgICB0aGlzLiRtb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTtcbiAgICAgIHdyaXRlVG9Nb2RlbElmTmVlZGVkKCk7XG4gICAgfVxuXG4gICAgLy8gUGFzcyB0aGUgJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlIGhlcmUsIGJlY2F1c2UgdGhlIGNhY2hlZCB2aWV3VmFsdWUgbWlnaHQgYmUgb3V0IG9mIGRhdGUuXG4gICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGUuZy4gJHNldFZpZXdWYWx1ZSBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBwYXJzZXJcbiAgICB0aGlzLiQkcnVuVmFsaWRhdG9ycyhtb2RlbFZhbHVlLCB0aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZSwgZnVuY3Rpb24oYWxsVmFsaWQpIHtcbiAgICAgIGlmICghYWxsb3dJbnZhbGlkKSB7XG4gICAgICAgIC8vIE5vdGU6IERvbid0IGNoZWNrIHRoaXMuJHZhbGlkIGhlcmUsIGFzIHdlIGNvdWxkIGhhdmVcbiAgICAgICAgLy8gZXh0ZXJuYWwgdmFsaWRhdG9ycyAoZS5nLiBjYWxjdWxhdGVkIG9uIHRoZSBzZXJ2ZXIpLFxuICAgICAgICAvLyB0aGF0IGp1c3QgY2FsbCAkc2V0VmFsaWRpdHkgYW5kIG5lZWQgdGhlIG1vZGVsIHZhbHVlXG4gICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGVpciB2YWxpZGl0eS5cbiAgICAgICAgdGhhdC4kbW9kZWxWYWx1ZSA9IGFsbFZhbGlkID8gbW9kZWxWYWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgd3JpdGVUb01vZGVsSWZOZWVkZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHdyaXRlVG9Nb2RlbElmTmVlZGVkKCkge1xuICAgICAgaWYgKHRoYXQuJG1vZGVsVmFsdWUgIT09IHByZXZNb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoYXQuJCR3cml0ZU1vZGVsVG9TY29wZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAkJHdyaXRlTW9kZWxUb1Njb3BlOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiQkbmdNb2RlbFNldCh0aGlzLiQkc2NvcGUsIHRoaXMuJG1vZGVsVmFsdWUpO1xuICAgIGZvckVhY2godGhpcy4kdmlld0NoYW5nZUxpc3RlbmVycywgZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgdGhpcy4kJGV4Y2VwdGlvbkhhbmRsZXIoZSk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0Vmlld1ZhbHVlXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBVcGRhdGUgdGhlIHZpZXcgdmFsdWUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGNvbnRyb2wgd2FudHMgdG8gY2hhbmdlIHRoZSB2aWV3IHZhbHVlOyB0eXBpY2FsbHksXG4gICAqIHRoaXMgaXMgZG9uZSBmcm9tIHdpdGhpbiBhIERPTSBldmVudCBoYW5kbGVyLiBGb3IgZXhhbXBsZSwgdGhlIHtAbGluayBuZy5kaXJlY3RpdmU6aW5wdXQgaW5wdXR9XG4gICAqIGRpcmVjdGl2ZSBjYWxscyBpdCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgY2hhbmdlcyBhbmQge0BsaW5rIG5nLmRpcmVjdGl2ZTpzZWxlY3Qgc2VsZWN0fVxuICAgKiBjYWxscyBpdCB3aGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogV2hlbiBgJHNldFZpZXdWYWx1ZWAgaXMgY2FsbGVkLCB0aGUgbmV3IGB2YWx1ZWAgd2lsbCBiZSBzdGFnZWQgZm9yIGNvbW1pdHRpbmcgdGhyb3VnaCB0aGUgYCRwYXJzZXJzYFxuICAgKiBhbmQgYCR2YWxpZGF0b3JzYCBwaXBlbGluZXMuIElmIHRoZXJlIGFyZSBubyBzcGVjaWFsIHtAbGluayBuZ01vZGVsT3B0aW9uc30gc3BlY2lmaWVkIHRoZW4gdGhlIHN0YWdlZFxuICAgKiB2YWx1ZSBzZW50IGRpcmVjdGx5IGZvciBwcm9jZXNzaW5nLCBmaW5hbGx5IHRvIGJlIGFwcGxpZWQgdG8gYCRtb2RlbFZhbHVlYCBhbmQgdGhlbiB0aGVcbiAgICogKipleHByZXNzaW9uKiogc3BlY2lmaWVkIGluIHRoZSBgbmctbW9kZWxgIGF0dHJpYnV0ZS4gTGFzdGx5LCBhbGwgdGhlIHJlZ2lzdGVyZWQgY2hhbmdlIGxpc3RlbmVycyxcbiAgICogaW4gdGhlIGAkdmlld0NoYW5nZUxpc3RlbmVyc2AgbGlzdCwgYXJlIGNhbGxlZC5cbiAgICpcbiAgICogSW4gY2FzZSB0aGUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBuZ01vZGVsT3B0aW9uc30gZGlyZWN0aXZlIGlzIHVzZWQgd2l0aCBgdXBkYXRlT25gXG4gICAqIGFuZCB0aGUgYGRlZmF1bHRgIHRyaWdnZXIgaXMgbm90IGxpc3RlZCwgYWxsIHRob3NlIGFjdGlvbnMgd2lsbCByZW1haW4gcGVuZGluZyB1bnRpbCBvbmUgb2YgdGhlXG4gICAqIGB1cGRhdGVPbmAgZXZlbnRzIGlzIHRyaWdnZXJlZCBvbiB0aGUgRE9NIGVsZW1lbnQuXG4gICAqIEFsbCB0aGVzZSBhY3Rpb25zIHdpbGwgYmUgZGVib3VuY2VkIGlmIHRoZSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nTW9kZWxPcHRpb25zIG5nTW9kZWxPcHRpb25zfVxuICAgKiBkaXJlY3RpdmUgaXMgdXNlZCB3aXRoIGEgY3VzdG9tIGRlYm91bmNlIGZvciB0aGlzIHBhcnRpY3VsYXIgZXZlbnQuXG4gICAqIE5vdGUgdGhhdCBhIGAkZGlnZXN0YCBpcyBvbmx5IHRyaWdnZXJlZCBvbmNlIHRoZSBgdXBkYXRlT25gIGV2ZW50cyBhcmUgZmlyZWQsIG9yIGlmIGBkZWJvdW5jZWBcbiAgICogaXMgc3BlY2lmaWVkLCBvbmNlIHRoZSB0aW1lciBydW5zIG91dC5cbiAgICpcbiAgICogV2hlbiB1c2VkIHdpdGggc3RhbmRhcmQgaW5wdXRzLCB0aGUgdmlldyB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBhIHN0cmluZyAod2hpY2ggaXMgaW4gc29tZSBjYXNlc1xuICAgKiBwYXJzZWQgaW50byBhbm90aGVyIHR5cGUsIHN1Y2ggYXMgYSBgRGF0ZWAgb2JqZWN0IGZvciBgaW5wdXRbZGF0ZV1gLilcbiAgICogSG93ZXZlciwgY3VzdG9tIGNvbnRyb2xzIG1pZ2h0IGFsc28gcGFzcyBvYmplY3RzIHRvIHRoaXMgbWV0aG9kLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBtYWtlXG4gICAqIGEgY29weSBvZiB0aGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIGAkc2V0Vmlld1ZhbHVlYC4gVGhpcyBpcyBiZWNhdXNlIGBuZ01vZGVsYCBkb2VzIG5vdFxuICAgKiBwZXJmb3JtIGEgZGVlcCB3YXRjaCBvZiBvYmplY3RzLCBpdCBvbmx5IGxvb2tzIGZvciBhIGNoYW5nZSBvZiBpZGVudGl0eS4gSWYgeW91IG9ubHkgY2hhbmdlXG4gICAqIHRoZSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IHRoZW4gbmdNb2RlbCB3aWxsIG5vdCByZWFsaXplIHRoYXQgdGhlIG9iamVjdCBoYXMgY2hhbmdlZCBhbmRcbiAgICogd2lsbCBub3QgaW52b2tlIHRoZSBgJHBhcnNlcnNgIGFuZCBgJHZhbGlkYXRvcnNgIHBpcGVsaW5lcy4gRm9yIHRoaXMgcmVhc29uLCB5b3Ugc2hvdWxkXG4gICAqIG5vdCBjaGFuZ2UgcHJvcGVydGllcyBvZiB0aGUgY29weSBvbmNlIGl0IGhhcyBiZWVuIHBhc3NlZCB0byBgJHNldFZpZXdWYWx1ZWAuXG4gICAqIE90aGVyd2lzZSB5b3UgbWF5IGNhdXNlIHRoZSBtb2RlbCB2YWx1ZSBvbiB0aGUgc2NvcGUgdG8gY2hhbmdlIGluY29ycmVjdGx5LlxuICAgKlxuICAgKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICAgKiBJbiBhbnkgY2FzZSwgdGhlIHZhbHVlIHBhc3NlZCB0byB0aGUgbWV0aG9kIHNob3VsZCBhbHdheXMgcmVmbGVjdCB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBvZiB0aGUgY29udHJvbC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgY2FsbGluZyBgJHNldFZpZXdWYWx1ZWAgZm9yIGFuIGlucHV0IGVsZW1lbnQsXG4gICAqIHlvdSBzaG91bGQgcGFzcyB0aGUgaW5wdXQgRE9NIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBjb250cm9sIGFuZCB0aGUgc2NvcGUgbW9kZWwgYmVjb21lXG4gICAqIG91dCBvZiBzeW5jLiBJdCdzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBgJHNldFZpZXdWYWx1ZWAgZG9lcyBub3QgY2FsbCBgJHJlbmRlcmAgb3IgY2hhbmdlXG4gICAqIHRoZSBjb250cm9sJ3MgRE9NIHZhbHVlIGluIGFueSB3YXkuIElmIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSBjb250cm9sJ3MgRE9NIHZhbHVlXG4gICAqIHByb2dyYW1tYXRpY2FsbHksIHdlIHNob3VsZCB1cGRhdGUgdGhlIGBuZ01vZGVsYCBzY29wZSBleHByZXNzaW9uLiBJdHMgbmV3IHZhbHVlIHdpbGwgYmVcbiAgICogcGlja2VkIHVwIGJ5IHRoZSBtb2RlbCBjb250cm9sbGVyLCB3aGljaCB3aWxsIHJ1biBpdCB0aHJvdWdoIHRoZSBgJGZvcm1hdHRlcnNgLCBgJHJlbmRlcmAgaXRcbiAgICogdG8gdXBkYXRlIHRoZSBET00sIGFuZCBmaW5hbGx5IGNhbGwgYCR2YWxpZGF0ZWAgb24gaXQuXG4gICAqIDwvZGl2PlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIGZyb20gdGhlIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyIEV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB1cGRhdGUuXG4gICAqL1xuICAkc2V0Vmlld1ZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgdHJpZ2dlcikge1xuICAgIHRoaXMuJHZpZXdWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLiRvcHRpb25zLmdldE9wdGlvbigndXBkYXRlT25EZWZhdWx0JykpIHtcbiAgICAgIHRoaXMuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdCh0cmlnZ2VyKTtcbiAgICB9XG4gIH0sXG5cbiAgJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdDogZnVuY3Rpb24odHJpZ2dlcikge1xuICAgIHZhciBkZWJvdW5jZURlbGF5ID0gdGhpcy4kb3B0aW9ucy5nZXRPcHRpb24oJ2RlYm91bmNlJyk7XG5cbiAgICBpZiAoaXNOdW1iZXIoZGVib3VuY2VEZWxheVt0cmlnZ2VyXSkpIHtcbiAgICAgIGRlYm91bmNlRGVsYXkgPSBkZWJvdW5jZURlbGF5W3RyaWdnZXJdO1xuICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoZGVib3VuY2VEZWxheVsnZGVmYXVsdCddKSkge1xuICAgICAgZGVib3VuY2VEZWxheSA9IGRlYm91bmNlRGVsYXlbJ2RlZmF1bHQnXTtcbiAgICB9XG5cbiAgICB0aGlzLiQkdGltZW91dC5jYW5jZWwodGhpcy4kJHBlbmRpbmdEZWJvdW5jZSk7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIGlmIChkZWJvdW5jZURlbGF5ID4gMCkgeyAvLyB0aGlzIGZhaWxzIGlmIGRlYm91bmNlRGVsYXkgaXMgYW4gb2JqZWN0XG4gICAgICB0aGlzLiQkcGVuZGluZ0RlYm91bmNlID0gdGhpcy4kJHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoYXQuJGNvbW1pdFZpZXdWYWx1ZSgpO1xuICAgICAgfSwgZGVib3VuY2VEZWxheSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiQkc2NvcGUuJHJvb3QuJCRwaGFzZSkge1xuICAgICAgdGhpcy4kY29tbWl0Vmlld1ZhbHVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuJCRzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoYXQuJGNvbW1pdFZpZXdWYWx1ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBzZXR1cE1vZGVsV2F0Y2hlcihjdHJsKSB7XG4gIC8vIG1vZGVsIC0+IHZhbHVlXG4gIC8vIE5vdGU6IHdlIGNhbm5vdCB1c2UgYSBub3JtYWwgc2NvcGUuJHdhdGNoIGFzIHdlIHdhbnQgdG8gZGV0ZWN0IHRoZSBmb2xsb3dpbmc6XG4gIC8vIDEuIHNjb3BlIHZhbHVlIGlzICdhJ1xuICAvLyAyLiB1c2VyIGVudGVycyAnYidcbiAgLy8gMy4gbmctY2hhbmdlIGtpY2tzIGluIGFuZCByZXZlcnRzIHNjb3BlIHZhbHVlIHRvICdhJ1xuICAvLyAgICAtPiBzY29wZSB2YWx1ZSBkaWQgbm90IGNoYW5nZSBzaW5jZSB0aGUgbGFzdCBkaWdlc3QgYXNcbiAgLy8gICAgICAgbmctY2hhbmdlIGV4ZWN1dGVzIGluIGFwcGx5IHBoYXNlXG4gIC8vIDQuIHZpZXcgc2hvdWxkIGJlIGNoYW5nZWQgYmFjayB0byAnYSdcbiAgY3RybC4kJHNjb3BlLiR3YXRjaChmdW5jdGlvbiBuZ01vZGVsV2F0Y2goKSB7XG4gICAgdmFyIG1vZGVsVmFsdWUgPSBjdHJsLiQkbmdNb2RlbEdldChjdHJsLiQkc2NvcGUpO1xuXG4gICAgLy8gaWYgc2NvcGUgbW9kZWwgdmFsdWUgYW5kIG5nTW9kZWwgdmFsdWUgYXJlIG91dCBvZiBzeW5jXG4gICAgLy8gVE9ETyhwZXJmKTogd2h5IG5vdCBtb3ZlIHRoaXMgdG8gdGhlIGFjdGlvbiBmbj9cbiAgICBpZiAobW9kZWxWYWx1ZSAhPT0gY3RybC4kbW9kZWxWYWx1ZSAmJlxuICAgICAgIC8vIGNoZWNrcyBmb3IgTmFOIGlzIG5lZWRlZCB0byBhbGxvdyBzZXR0aW5nIHRoZSBtb2RlbCB0byBOYU4gd2hlbiB0aGVyZSdzIGFuIGFzeW5jVmFsaWRhdG9yXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgICAoY3RybC4kbW9kZWxWYWx1ZSA9PT0gY3RybC4kbW9kZWxWYWx1ZSB8fCBtb2RlbFZhbHVlID09PSBtb2RlbFZhbHVlKVxuICAgICkge1xuICAgICAgY3RybC4kbW9kZWxWYWx1ZSA9IGN0cmwuJCRyYXdNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTtcbiAgICAgIGN0cmwuJCRwYXJzZXJWYWxpZCA9IHVuZGVmaW5lZDtcblxuICAgICAgdmFyIGZvcm1hdHRlcnMgPSBjdHJsLiRmb3JtYXR0ZXJzLFxuICAgICAgICAgIGlkeCA9IGZvcm1hdHRlcnMubGVuZ3RoO1xuXG4gICAgICB2YXIgdmlld1ZhbHVlID0gbW9kZWxWYWx1ZTtcbiAgICAgIHdoaWxlIChpZHgtLSkge1xuICAgICAgICB2aWV3VmFsdWUgPSBmb3JtYXR0ZXJzW2lkeF0odmlld1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHJsLiR2aWV3VmFsdWUgIT09IHZpZXdWYWx1ZSkge1xuICAgICAgICBjdHJsLiQkdXBkYXRlRW1wdHlDbGFzc2VzKHZpZXdWYWx1ZSk7XG4gICAgICAgIGN0cmwuJHZpZXdWYWx1ZSA9IGN0cmwuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlID0gdmlld1ZhbHVlO1xuICAgICAgICBjdHJsLiRyZW5kZXIoKTtcblxuICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IG1vZGVsIGFuZCB2aWV3IHZhbHVlIGhhdmUgYmVlbiB1cGRhdGVkIGR1cmluZyByZW5kZXJcbiAgICAgICAgY3RybC4kJHJ1blZhbGlkYXRvcnMoY3RybC4kbW9kZWxWYWx1ZSwgY3RybC4kdmlld1ZhbHVlLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxWYWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogQG5nZG9jIG1ldGhvZFxuICogQG5hbWUgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkc2V0VmFsaWRpdHlcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENoYW5nZSB0aGUgdmFsaWRpdHkgc3RhdGUsIGFuZCBub3RpZnkgdGhlIGZvcm0uXG4gKlxuICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRoaW4gJHBhcnNlcnMvJGZvcm1hdHRlcnMgb3IgYSBjdXN0b20gdmFsaWRhdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAqIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgaXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gdXNlIHRoZSBgbmdNb2RlbC4kdmFsaWRhdG9yc2AgYW5kXG4gKiBgbmdNb2RlbC4kYXN5bmNWYWxpZGF0b3JzYCBjb2xsZWN0aW9ucyB3aGljaCB3aWxsIGNhbGwgYCRzZXRWYWxpZGl0eWAgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdGlvbkVycm9yS2V5IE5hbWUgb2YgdGhlIHZhbGlkYXRvci4gVGhlIGB2YWxpZGF0aW9uRXJyb3JLZXlgIHdpbGwgYmUgYXNzaWduZWRcbiAqICAgICAgICB0byBlaXRoZXIgYCRlcnJvclt2YWxpZGF0aW9uRXJyb3JLZXldYCBvciBgJHBlbmRpbmdbdmFsaWRhdGlvbkVycm9yS2V5XWBcbiAqICAgICAgICAoZm9yIHVuZnVsZmlsbGVkIGAkYXN5bmNWYWxpZGF0b3JzYCksIHNvIHRoYXQgaXQgaXMgYXZhaWxhYmxlIGZvciBkYXRhLWJpbmRpbmcuXG4gKiAgICAgICAgVGhlIGB2YWxpZGF0aW9uRXJyb3JLZXlgIHNob3VsZCBiZSBpbiBjYW1lbENhc2UgYW5kIHdpbGwgZ2V0IGNvbnZlcnRlZCBpbnRvIGRhc2gtY2FzZVxuICogICAgICAgIGZvciBjbGFzcyBuYW1lLiBFeGFtcGxlOiBgbXlFcnJvcmAgd2lsbCByZXN1bHQgaW4gYG5nLXZhbGlkLW15LWVycm9yYCBhbmQgYG5nLWludmFsaWQtbXktZXJyb3JgXG4gKiAgICAgICAgY2xhc3MgYW5kIGNhbiBiZSBib3VuZCB0byBhcyAgYHt7c29tZUZvcm0uc29tZUNvbnRyb2wuJGVycm9yLm15RXJyb3J9fWAgLlxuICogQHBhcmFtIHtib29sZWFufSBpc1ZhbGlkIFdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdmFsaWQgKHRydWUpLCBpbnZhbGlkIChmYWxzZSksIHBlbmRpbmcgKHVuZGVmaW5lZCksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2tpcHBlZCAobnVsbCkuIFBlbmRpbmcgaXMgdXNlZCBmb3IgdW5mdWxmaWxsZWQgYCRhc3luY1ZhbGlkYXRvcnNgLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBwZWQgaXMgdXNlZCBieSBBbmd1bGFyIHdoZW4gdmFsaWRhdG9ycyBkbyBub3QgcnVuIGJlY2F1c2Ugb2YgcGFyc2UgZXJyb3JzIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYCRhc3luY1ZhbGlkYXRvcnNgIGRvIG5vdCBydW4gYmVjYXVzZSBhbnkgb2YgdGhlIGAkdmFsaWRhdG9yc2AgZmFpbGVkLlxuICovXG5hZGRTZXRWYWxpZGl0eU1ldGhvZCh7XG4gIGNsYXp6OiBOZ01vZGVsQ29udHJvbGxlcixcbiAgc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgb2JqZWN0W3Byb3BlcnR5XSA9IHRydWU7XG4gIH0sXG4gIHVuc2V0OiBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgZGVsZXRlIG9iamVjdFtwcm9wZXJ0eV07XG4gIH1cbn0pO1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdNb2RlbFxuICpcbiAqIEBlbGVtZW50IGlucHV0XG4gKiBAcHJpb3JpdHkgMVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ01vZGVsYCBkaXJlY3RpdmUgYmluZHMgYW4gYGlucHV0YCxgc2VsZWN0YCwgYHRleHRhcmVhYCAob3IgY3VzdG9tIGZvcm0gY29udHJvbCkgdG8gYVxuICogcHJvcGVydHkgb24gdGhlIHNjb3BlIHVzaW5nIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIE5nTW9kZWxDb250cm9sbGVyfSxcbiAqIHdoaWNoIGlzIGNyZWF0ZWQgYW5kIGV4cG9zZWQgYnkgdGhpcyBkaXJlY3RpdmUuXG4gKlxuICogYG5nTW9kZWxgIGlzIHJlc3BvbnNpYmxlIGZvcjpcbiAqXG4gKiAtIEJpbmRpbmcgdGhlIHZpZXcgaW50byB0aGUgbW9kZWwsIHdoaWNoIG90aGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyBgaW5wdXRgLCBgdGV4dGFyZWFgIG9yIGBzZWxlY3RgXG4gKiAgIHJlcXVpcmUuXG4gKiAtIFByb3ZpZGluZyB2YWxpZGF0aW9uIGJlaGF2aW9yIChpLmUuIHJlcXVpcmVkLCBudW1iZXIsIGVtYWlsLCB1cmwpLlxuICogLSBLZWVwaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29udHJvbCAodmFsaWQvaW52YWxpZCwgZGlydHkvcHJpc3RpbmUsIHRvdWNoZWQvdW50b3VjaGVkLCB2YWxpZGF0aW9uIGVycm9ycykuXG4gKiAtIFNldHRpbmcgcmVsYXRlZCBjc3MgY2xhc3NlcyBvbiB0aGUgZWxlbWVudCAoYG5nLXZhbGlkYCwgYG5nLWludmFsaWRgLCBgbmctZGlydHlgLCBgbmctcHJpc3RpbmVgLCBgbmctdG91Y2hlZGAsXG4gKiAgIGBuZy11bnRvdWNoZWRgLCBgbmctZW1wdHlgLCBgbmctbm90LWVtcHR5YCkgaW5jbHVkaW5nIGFuaW1hdGlvbnMuXG4gKiAtIFJlZ2lzdGVyaW5nIHRoZSBjb250cm9sIHdpdGggaXRzIHBhcmVudCB7QGxpbmsgbmcuZGlyZWN0aXZlOmZvcm0gZm9ybX0uXG4gKlxuICogTm90ZTogYG5nTW9kZWxgIHdpbGwgdHJ5IHRvIGJpbmQgdG8gdGhlIHByb3BlcnR5IGdpdmVuIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gb24gdGhlXG4gKiBjdXJyZW50IHNjb3BlLiBJZiB0aGUgcHJvcGVydHkgZG9lc24ndCBhbHJlYWR5IGV4aXN0IG9uIHRoaXMgc2NvcGUsIGl0IHdpbGwgYmUgY3JlYXRlZFxuICogaW1wbGljaXRseSBhbmQgYWRkZWQgdG8gdGhlIHNjb3BlLlxuICpcbiAqIEZvciBiZXN0IHByYWN0aWNlcyBvbiB1c2luZyBgbmdNb2RlbGAsIHNlZTpcbiAqXG4gKiAgLSBbVW5kZXJzdGFuZGluZyBTY29wZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvd2lraS9VbmRlcnN0YW5kaW5nLVNjb3BlcylcbiAqXG4gKiBGb3IgYmFzaWMgZXhhbXBsZXMsIGhvdyB0byB1c2UgYG5nTW9kZWxgLCBzZWU6XG4gKlxuICogIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTppbnB1dCBpbnB1dH1cbiAqICAgIC0ge0BsaW5rIGlucHV0W3RleHRdIHRleHR9XG4gKiAgICAtIHtAbGluayBpbnB1dFtjaGVja2JveF0gY2hlY2tib3h9XG4gKiAgICAtIHtAbGluayBpbnB1dFtyYWRpb10gcmFkaW99XG4gKiAgICAtIHtAbGluayBpbnB1dFtudW1iZXJdIG51bWJlcn1cbiAqICAgIC0ge0BsaW5rIGlucHV0W2VtYWlsXSBlbWFpbH1cbiAqICAgIC0ge0BsaW5rIGlucHV0W3VybF0gdXJsfVxuICogICAgLSB7QGxpbmsgaW5wdXRbZGF0ZV0gZGF0ZX1cbiAqICAgIC0ge0BsaW5rIGlucHV0W2RhdGV0aW1lLWxvY2FsXSBkYXRldGltZS1sb2NhbH1cbiAqICAgIC0ge0BsaW5rIGlucHV0W3RpbWVdIHRpbWV9XG4gKiAgICAtIHtAbGluayBpbnB1dFttb250aF0gbW9udGh9XG4gKiAgICAtIHtAbGluayBpbnB1dFt3ZWVrXSB3ZWVrfVxuICogIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTpzZWxlY3Qgc2VsZWN0fVxuICogIC0ge0BsaW5rIG5nLmRpcmVjdGl2ZTp0ZXh0YXJlYSB0ZXh0YXJlYX1cbiAqXG4gKiAjIENvbXBsZXggTW9kZWxzIChvYmplY3RzIG9yIGNvbGxlY3Rpb25zKVxuICpcbiAqIEJ5IGRlZmF1bHQsIGBuZ01vZGVsYCB3YXRjaGVzIHRoZSBtb2RlbCBieSByZWZlcmVuY2UsIG5vdCB2YWx1ZS4gVGhpcyBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGVuXG4gKiBiaW5kaW5nIGlucHV0cyB0byBtb2RlbHMgdGhhdCBhcmUgb2JqZWN0cyAoZS5nLiBgRGF0ZWApIG9yIGNvbGxlY3Rpb25zIChlLmcuIGFycmF5cykuIElmIG9ubHkgcHJvcGVydGllcyBvZiB0aGVcbiAqIG9iamVjdCBvciBjb2xsZWN0aW9uIGNoYW5nZSwgYG5nTW9kZWxgIHdpbGwgbm90IGJlIG5vdGlmaWVkIGFuZCBzbyB0aGUgaW5wdXQgd2lsbCBub3QgYmUgIHJlLXJlbmRlcmVkLlxuICpcbiAqIFRoZSBtb2RlbCBtdXN0IGJlIGFzc2lnbmVkIGFuIGVudGlyZWx5IG5ldyBvYmplY3Qgb3IgY29sbGVjdGlvbiBiZWZvcmUgYSByZS1yZW5kZXJpbmcgd2lsbCBvY2N1ci5cbiAqXG4gKiBTb21lIGRpcmVjdGl2ZXMgaGF2ZSBvcHRpb25zIHRoYXQgd2lsbCBjYXVzZSB0aGVtIHRvIHVzZSBhIGN1c3RvbSBgJHdhdGNoQ29sbGVjdGlvbmAgb24gdGhlIG1vZGVsIGV4cHJlc3Npb25cbiAqIC0gZm9yIGV4YW1wbGUsIGBuZ09wdGlvbnNgIHdpbGwgZG8gc28gd2hlbiBhIGB0cmFjayBieWAgY2xhdXNlIGlzIGluY2x1ZGVkIGluIHRoZSBjb21wcmVoZW5zaW9uIGV4cHJlc3Npb24gb3JcbiAqIGlmIHRoZSBzZWxlY3QgaXMgZ2l2ZW4gdGhlIGBtdWx0aXBsZWAgYXR0cmlidXRlLlxuICpcbiAqIFRoZSBgJHdhdGNoQ29sbGVjdGlvbigpYCBtZXRob2Qgb25seSBkb2VzIGEgc2hhbGxvdyBjb21wYXJpc29uLCBtZWFuaW5nIHRoYXQgY2hhbmdpbmcgcHJvcGVydGllcyBkZWVwZXIgdGhhbiB0aGVcbiAqIGZpcnN0IGxldmVsIG9mIHRoZSBvYmplY3QgKG9yIG9ubHkgY2hhbmdpbmcgdGhlIHByb3BlcnRpZXMgb2YgYW4gaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpZiBpdCdzIGFuIGFycmF5KSB3aWxsIHN0aWxsXG4gKiBub3QgdHJpZ2dlciBhIHJlLXJlbmRlcmluZyBvZiB0aGUgbW9kZWwuXG4gKlxuICogIyBDU1MgY2xhc3Nlc1xuICogVGhlIGZvbGxvd2luZyBDU1MgY2xhc3NlcyBhcmUgYWRkZWQgYW5kIHJlbW92ZWQgb24gdGhlIGFzc29jaWF0ZWQgaW5wdXQvc2VsZWN0L3RleHRhcmVhIGVsZW1lbnRcbiAqIGRlcGVuZGluZyBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIG1vZGVsLlxuICpcbiAqICAtIGBuZy12YWxpZGA6IHRoZSBtb2RlbCBpcyB2YWxpZFxuICogIC0gYG5nLWludmFsaWRgOiB0aGUgbW9kZWwgaXMgaW52YWxpZFxuICogIC0gYG5nLXZhbGlkLVtrZXldYDogZm9yIGVhY2ggdmFsaWQga2V5IGFkZGVkIGJ5IGAkc2V0VmFsaWRpdHlgXG4gKiAgLSBgbmctaW52YWxpZC1ba2V5XWA6IGZvciBlYWNoIGludmFsaWQga2V5IGFkZGVkIGJ5IGAkc2V0VmFsaWRpdHlgXG4gKiAgLSBgbmctcHJpc3RpbmVgOiB0aGUgY29udHJvbCBoYXNuJ3QgYmVlbiBpbnRlcmFjdGVkIHdpdGggeWV0XG4gKiAgLSBgbmctZGlydHlgOiB0aGUgY29udHJvbCBoYXMgYmVlbiBpbnRlcmFjdGVkIHdpdGhcbiAqICAtIGBuZy10b3VjaGVkYDogdGhlIGNvbnRyb2wgaGFzIGJlZW4gYmx1cnJlZFxuICogIC0gYG5nLXVudG91Y2hlZGA6IHRoZSBjb250cm9sIGhhc24ndCBiZWVuIGJsdXJyZWRcbiAqICAtIGBuZy1wZW5kaW5nYDogYW55IGAkYXN5bmNWYWxpZGF0b3JzYCBhcmUgdW5mdWxmaWxsZWRcbiAqICAtIGBuZy1lbXB0eWA6IHRoZSB2aWV3IGRvZXMgbm90IGNvbnRhaW4gYSB2YWx1ZSBvciB0aGUgdmFsdWUgaXMgZGVlbWVkIFwiZW1wdHlcIiwgYXMgZGVmaW5lZFxuICogICAgIGJ5IHRoZSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkaXNFbXB0eX0gbWV0aG9kXG4gKiAgLSBgbmctbm90LWVtcHR5YDogdGhlIHZpZXcgY29udGFpbnMgYSBub24tZW1wdHkgdmFsdWVcbiAqXG4gKiBLZWVwIGluIG1pbmQgdGhhdCBuZ0FuaW1hdGUgY2FuIGRldGVjdCBlYWNoIG9mIHRoZXNlIGNsYXNzZXMgd2hlbiBhZGRlZCBhbmQgcmVtb3ZlZC5cbiAqXG4gKiAjIyBBbmltYXRpb24gSG9va3NcbiAqXG4gKiBBbmltYXRpb25zIHdpdGhpbiBtb2RlbHMgYXJlIHRyaWdnZXJlZCB3aGVuIGFueSBvZiB0aGUgYXNzb2NpYXRlZCBDU1MgY2xhc3NlcyBhcmUgYWRkZWQgYW5kIHJlbW92ZWRcbiAqIG9uIHRoZSBpbnB1dCBlbGVtZW50IHdoaWNoIGlzIGF0dGFjaGVkIHRvIHRoZSBtb2RlbC4gVGhlc2UgY2xhc3NlcyBpbmNsdWRlOiBgLm5nLXByaXN0aW5lYCwgYC5uZy1kaXJ0eWAsXG4gKiBgLm5nLWludmFsaWRgIGFuZCBgLm5nLXZhbGlkYCBhcyB3ZWxsIGFzIGFueSBvdGhlciB2YWxpZGF0aW9ucyB0aGF0IGFyZSBwZXJmb3JtZWQgb24gdGhlIG1vZGVsIGl0c2VsZi5cbiAqIFRoZSBhbmltYXRpb25zIHRoYXQgYXJlIHRyaWdnZXJlZCB3aXRoaW4gbmdNb2RlbCBhcmUgc2ltaWxhciB0byBob3cgdGhleSB3b3JrIGluIG5nQ2xhc3MgYW5kXG4gKiBhbmltYXRpb25zIGNhbiBiZSBob29rZWQgaW50byB1c2luZyBDU1MgdHJhbnNpdGlvbnMsIGtleWZyYW1lcyBhcyB3ZWxsIGFzIEpTIGFuaW1hdGlvbnMuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIHdheSB0byB1dGlsaXplIENTUyB0cmFuc2l0aW9ucyB0byBzdHlsZSBhbiBpbnB1dCBlbGVtZW50XG4gKiB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkIGFzIGludmFsaWQgYWZ0ZXIgaXQgaGFzIGJlZW4gdmFsaWRhdGVkOlxuICpcbiAqIDxwcmU+XG4gKiAvL2JlIHN1cmUgdG8gaW5jbHVkZSBuZ0FuaW1hdGUgYXMgYSBtb2R1bGUgdG8gaG9vayBpbnRvIG1vcmVcbiAqIC8vYWR2YW5jZWQgYW5pbWF0aW9uc1xuICogLm15LWlucHV0IHtcbiAqICAgdHJhbnNpdGlvbjowLjVzIGxpbmVhciBhbGw7XG4gKiAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICogfVxuICogLm15LWlucHV0Lm5nLWludmFsaWQge1xuICogICBiYWNrZ3JvdW5kOiByZWQ7XG4gKiAgIGNvbG9yOndoaXRlO1xuICogfVxuICogPC9wcmU+XG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIGZpeEJhc2U9XCJ0cnVlXCIgbW9kdWxlPVwiaW5wdXRFeGFtcGxlXCIgbmFtZT1cIm5nLW1vZGVsXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPHNjcmlwdD5cbiAgICAgICAgYW5ndWxhci5tb2R1bGUoJ2lucHV0RXhhbXBsZScsIFtdKVxuICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAkc2NvcGUudmFsID0gJzEnO1xuICAgICAgICAgIH1dKTtcbiAgICAgICA8L3NjcmlwdD5cbiAgICAgICA8c3R5bGU+XG4gICAgICAgICAubXktaW5wdXQge1xuICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCBsaW5lYXIgMC41cztcbiAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICB9XG4gICAgICAgICAubXktaW5wdXQubmctaW52YWxpZCB7XG4gICAgICAgICAgIGNvbG9yOndoaXRlO1xuICAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICAgICB9XG4gICAgICAgPC9zdHlsZT5cbiAgICAgICA8cCBpZD1cImlucHV0RGVzY3JpcHRpb25cIj5cbiAgICAgICAgVXBkYXRlIGlucHV0IHRvIHNlZSB0cmFuc2l0aW9ucyB3aGVuIHZhbGlkL2ludmFsaWQuXG4gICAgICAgIEludGVnZXIgaXMgYSB2YWxpZCB2YWx1ZS5cbiAgICAgICA8L3A+XG4gICAgICAgPGZvcm0gbmFtZT1cInRlc3RGb3JtXCIgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gICAgICAgICA8aW5wdXQgbmctbW9kZWw9XCJ2YWxcIiBuZy1wYXR0ZXJuPVwiL15cXGQrJC9cIiBuYW1lPVwiYW5pbVwiIGNsYXNzPVwibXktaW5wdXRcIlxuICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbnB1dERlc2NyaXB0aW9uXCIgLz5cbiAgICAgICA8L2Zvcm0+XG4gICAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiAjIyBCaW5kaW5nIHRvIGEgZ2V0dGVyL3NldHRlclxuICpcbiAqIFNvbWV0aW1lcyBpdCdzIGhlbHBmdWwgdG8gYmluZCBgbmdNb2RlbGAgdG8gYSBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uLiAgQSBnZXR0ZXIvc2V0dGVyIGlzIGFcbiAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCB3aGVuIGNhbGxlZCB3aXRoIHplcm8gYXJndW1lbnRzLCBhbmQgc2V0c1xuICogdGhlIGludGVybmFsIHN0YXRlIG9mIGEgbW9kZWwgd2hlbiBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudC4gSXQncyBzb21ldGltZXMgdXNlZnVsIHRvIHVzZSB0aGlzXG4gKiBmb3IgbW9kZWxzIHRoYXQgaGF2ZSBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0aGF0J3MgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgbW9kZWwgZXhwb3Nlc1xuICogdG8gdGhlIHZpZXcuXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAqICoqQmVzdCBQcmFjdGljZToqKiBJdCdzIGJlc3QgdG8ga2VlcCBnZXR0ZXJzIGZhc3QgYmVjYXVzZSBBbmd1bGFyIGlzIGxpa2VseSB0byBjYWxsIHRoZW0gbW9yZVxuICogZnJlcXVlbnRseSB0aGFuIG90aGVyIHBhcnRzIG9mIHlvdXIgY29kZS5cbiAqIDwvZGl2PlxuICpcbiAqIFlvdSB1c2UgdGhpcyBiZWhhdmlvciBieSBhZGRpbmcgYG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGdldHRlclNldHRlcjogdHJ1ZSB9XCJgIHRvIGFuIGVsZW1lbnQgdGhhdFxuICogaGFzIGBuZy1tb2RlbGAgYXR0YWNoZWQgdG8gaXQuIFlvdSBjYW4gYWxzbyBhZGQgYG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGdldHRlclNldHRlcjogdHJ1ZSB9XCJgIHRvXG4gKiBhIGA8Zm9ybT5gLCB3aGljaCB3aWxsIGVuYWJsZSB0aGlzIGJlaGF2aW9yIGZvciBhbGwgYDxpbnB1dD5gcyB3aXRoaW4gaXQuIFNlZVxuICoge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ01vZGVsT3B0aW9ucyBgbmdNb2RlbE9wdGlvbnNgfSBmb3IgbW9yZS5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBgbmdNb2RlbGAgd2l0aCBhIGdldHRlci9zZXR0ZXI6XG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ01vZGVsLWdldHRlci1zZXR0ZXJcIiBtb2R1bGU9XCJnZXR0ZXJTZXR0ZXJFeGFtcGxlXCI+XG4gICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgIDxmb3JtIG5hbWU9XCJ1c2VyRm9ybVwiPlxuICAgICAgICAgICA8bGFiZWw+TmFtZTpcbiAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlck5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBuZy1tb2RlbD1cInVzZXIubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGdldHRlclNldHRlcjogdHJ1ZSB9XCIgLz5cbiAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgIDxwcmU+dXNlci5uYW1lID0gPHNwYW4gbmctYmluZD1cInVzZXIubmFtZSgpXCI+PC9zcGFuPjwvcHJlPlxuICAgICAgIDwvZGl2PlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAgICAgICBhbmd1bGFyLm1vZHVsZSgnZ2V0dGVyU2V0dGVyRXhhbXBsZScsIFtdKVxuICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgICAgdmFyIF9uYW1lID0gJ0JyaWFuJztcbiAgICAgICAgICAgJHNjb3BlLnVzZXIgPSB7XG4gICAgICAgICAgICAgbmFtZTogZnVuY3Rpb24obmV3TmFtZSkge1xuICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgbmV3TmFtZSBjYW4gYmUgdW5kZWZpbmVkIGZvciB0d28gcmVhc29uczpcbiAgICAgICAgICAgICAgLy8gMS4gQmVjYXVzZSBpdCBpcyBjYWxsZWQgYXMgYSBnZXR0ZXIgYW5kIHRodXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzXG4gICAgICAgICAgICAgIC8vIDIuIEJlY2F1c2UgdGhlIHByb3BlcnR5IHNob3VsZCBhY3R1YWxseSBiZSBzZXQgdG8gdW5kZWZpbmVkLiBUaGlzIGhhcHBlbnMgZS5nLiBpZiB0aGVcbiAgICAgICAgICAgICAgLy8gICAgaW5wdXQgaXMgaW52YWxpZFxuICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfbmFtZSA9IG5ld05hbWUpIDogX25hbWU7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICB9O1xuICAgICAgICAgfV0pO1xuICAgICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ01vZGVsRGlyZWN0aXZlID0gWyckcm9vdFNjb3BlJywgZnVuY3Rpb24oJHJvb3RTY29wZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcmVxdWlyZTogWyduZ01vZGVsJywgJ14/Zm9ybScsICdeP25nTW9kZWxPcHRpb25zJ10sXG4gICAgY29udHJvbGxlcjogTmdNb2RlbENvbnRyb2xsZXIsXG4gICAgLy8gUHJlbGluayBuZWVkcyB0byBydW4gYmVmb3JlIGFueSBpbnB1dCBkaXJlY3RpdmVcbiAgICAvLyBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIE5nTW9kZWxPcHRpb25zIGluIE5nTW9kZWxDb250cm9sbGVyXG4gICAgLy8gYmVmb3JlIGFueW9uZSBlbHNlIHVzZXMgaXQuXG4gICAgcHJpb3JpdHk6IDEsXG4gICAgY29tcGlsZTogZnVuY3Rpb24gbmdNb2RlbENvbXBpbGUoZWxlbWVudCkge1xuICAgICAgLy8gU2V0dXAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29udHJvbFxuICAgICAgZWxlbWVudC5hZGRDbGFzcyhQUklTVElORV9DTEFTUykuYWRkQ2xhc3MoVU5UT1VDSEVEX0NMQVNTKS5hZGRDbGFzcyhWQUxJRF9DTEFTUyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZTogZnVuY3Rpb24gbmdNb2RlbFByZUxpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7XG4gICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdLFxuICAgICAgICAgICAgICBmb3JtQ3RybCA9IGN0cmxzWzFdIHx8IG1vZGVsQ3RybC4kJHBhcmVudEZvcm0sXG4gICAgICAgICAgICAgIG9wdGlvbnNDdHJsID0gY3RybHNbMl07XG5cbiAgICAgICAgICBpZiAob3B0aW9uc0N0cmwpIHtcbiAgICAgICAgICAgIG1vZGVsQ3RybC4kb3B0aW9ucyA9IG9wdGlvbnNDdHJsLiRvcHRpb25zO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1vZGVsQ3RybC4kJGluaXRHZXR0ZXJTZXR0ZXJzKCk7XG5cbiAgICAgICAgICAvLyBub3RpZnkgb3RoZXJzLCBlc3BlY2lhbGx5IHBhcmVudCBmb3Jtc1xuICAgICAgICAgIGZvcm1DdHJsLiRhZGRDb250cm9sKG1vZGVsQ3RybCk7XG5cbiAgICAgICAgICBhdHRyLiRvYnNlcnZlKCduYW1lJywgZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbEN0cmwuJG5hbWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgIG1vZGVsQ3RybC4kJHBhcmVudEZvcm0uJCRyZW5hbWVDb250cm9sKG1vZGVsQ3RybCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgbW9kZWxDdHJsLiQkcGFyZW50Rm9ybS4kcmVtb3ZlQ29udHJvbChtb2RlbEN0cmwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0OiBmdW5jdGlvbiBuZ01vZGVsUG9zdExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHIsIGN0cmxzKSB7XG4gICAgICAgICAgdmFyIG1vZGVsQ3RybCA9IGN0cmxzWzBdO1xuICAgICAgICAgIGlmIChtb2RlbEN0cmwuJG9wdGlvbnMuZ2V0T3B0aW9uKCd1cGRhdGVPbicpKSB7XG4gICAgICAgICAgICBlbGVtZW50Lm9uKG1vZGVsQ3RybC4kb3B0aW9ucy5nZXRPcHRpb24oJ3VwZGF0ZU9uJyksIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgICAgICAgIG1vZGVsQ3RybC4kJGRlYm91bmNlVmlld1ZhbHVlQ29tbWl0KGV2ICYmIGV2LnR5cGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gc2V0VG91Y2hlZCgpIHtcbiAgICAgICAgICAgIG1vZGVsQ3RybC4kc2V0VG91Y2hlZCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZW1lbnQub24oJ2JsdXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbEN0cmwuJHRvdWNoZWQpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKCRyb290U2NvcGUuJCRwaGFzZSkge1xuICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKHNldFRvdWNoZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KHNldFRvdWNoZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1dO1xuXG4vKiBleHBvcnRlZCBkZWZhdWx0TW9kZWxPcHRpb25zICovXG52YXIgZGVmYXVsdE1vZGVsT3B0aW9ucztcbnZhciBERUZBVUxUX1JFR0VYUCA9IC8oXFxzK3xeKWRlZmF1bHQoXFxzK3wkKS87XG5cbi8qKlxuICogQG5nZG9jIHR5cGVcbiAqIEBuYW1lIE1vZGVsT3B0aW9uc1xuICogQGRlc2NyaXB0aW9uXG4gKiBBIGNvbnRhaW5lciBmb3IgdGhlIG9wdGlvbnMgc2V0IGJ5IHRoZSB7QGxpbmsgbmdNb2RlbE9wdGlvbnN9IGRpcmVjdGl2ZVxuICovXG5mdW5jdGlvbiBNb2RlbE9wdGlvbnMob3B0aW9ucykge1xuICB0aGlzLiQkb3B0aW9ucyA9IG9wdGlvbnM7XG59XG5cbk1vZGVsT3B0aW9ucy5wcm90b3R5cGUgPSB7XG5cbiAgLyoqXG4gICAqIEBuZ2RvYyBtZXRob2RcbiAgICogQG5hbWUgTW9kZWxPcHRpb25zI2dldE9wdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIHsqfSB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIG9wdGlvblxuICAgKi9cbiAgZ2V0T3B0aW9uOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuJCRvcHRpb25zW25hbWVdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbmdkb2MgbWV0aG9kXG4gICAqIEBuYW1lIE1vZGVsT3B0aW9ucyNjcmVhdGVDaGlsZFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBhIGhhc2ggb2Ygb3B0aW9ucyBmb3IgdGhlIG5ldyBjaGlsZCB0aGF0IHdpbGwgb3ZlcnJpZGUgdGhlIHBhcmVudCdzIG9wdGlvbnNcbiAgICogQHJldHVybiB7TW9kZWxPcHRpb25zfSBhIG5ldyBgTW9kZWxPcHRpb25zYCBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAgICovXG4gIGNyZWF0ZUNoaWxkOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIGluaGVyaXRBbGwgPSBmYWxzZTtcblxuICAgIC8vIG1ha2UgYSBzaGFsbG93IGNvcHlcbiAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcblxuICAgIC8vIEluaGVyaXQgb3B0aW9ucyBmcm9tIHRoZSBwYXJlbnQgaWYgc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZSBgXCIkaW5oZXJpdFwiYFxuICAgIGZvckVhY2gob3B0aW9ucywgLyogQHRoaXMgKi8gZnVuY3Rpb24ob3B0aW9uLCBrZXkpIHtcbiAgICAgIGlmIChvcHRpb24gPT09ICckaW5oZXJpdCcpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XG4gICAgICAgICAgaW5oZXJpdEFsbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdGhpcy4kJG9wdGlvbnNba2V5XTtcbiAgICAgICAgICAvLyBgdXBkYXRlT25gIGlzIHNwZWNpYWwgc28gd2UgbXVzdCBhbHNvIGluaGVyaXQgdGhlIGB1cGRhdGVPbkRlZmF1bHRgIG9wdGlvblxuICAgICAgICAgIGlmIChrZXkgPT09ICd1cGRhdGVPbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMudXBkYXRlT25EZWZhdWx0ID0gdGhpcy4kJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZU9uJykge1xuICAgICAgICAgIC8vIElmIHRoZSBgdXBkYXRlT25gIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBgZGVmYXVsdGAgZXZlbnQgdGhlbiB3ZSBoYXZlIHRvIHJlbW92ZVxuICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGV2ZW50IGxpc3QgYW5kIHNldCB0aGUgYHVwZGF0ZU9uRGVmYXVsdGAgZmxhZy5cbiAgICAgICAgICBvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHRyaW0ob3B0aW9uLnJlcGxhY2UoREVGQVVMVF9SRUdFWFAsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuICcgJztcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIGlmIChpbmhlcml0QWxsKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgcHJvcGVydHkgb2YgdGhlIGZvcm06IGBcIipcIjogXCIkaW5oZXJpdFwiYFxuICAgICAgZGVsZXRlIG9wdGlvbnNbJyonXTtcbiAgICAgIGRlZmF1bHRzKG9wdGlvbnMsIHRoaXMuJCRvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBGaW5hbGx5IGFkZCBpbiBhbnkgbWlzc2luZyBkZWZhdWx0c1xuICAgIGRlZmF1bHRzKG9wdGlvbnMsIGRlZmF1bHRNb2RlbE9wdGlvbnMuJCRvcHRpb25zKTtcblxuICAgIHJldHVybiBuZXcgTW9kZWxPcHRpb25zKG9wdGlvbnMpO1xuICB9XG59O1xuXG5cbmRlZmF1bHRNb2RlbE9wdGlvbnMgPSBuZXcgTW9kZWxPcHRpb25zKHtcbiAgdXBkYXRlT246ICcnLFxuICB1cGRhdGVPbkRlZmF1bHQ6IHRydWUsXG4gIGRlYm91bmNlOiAwLFxuICBnZXR0ZXJTZXR0ZXI6IGZhbHNlLFxuICBhbGxvd0ludmFsaWQ6IGZhbHNlLFxuICB0aW1lem9uZTogbnVsbFxufSk7XG5cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01vZGVsT3B0aW9uc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB7QGxpbmsgbmdNb2RlbH0gZGlyZWN0aXZlcyB3aXRoaW4geW91clxuICogYXBwbGljYXRpb24uIFlvdSBjYW4gc3BlY2lmeSBhbiBgbmdNb2RlbE9wdGlvbnNgIGRpcmVjdGl2ZSBvbiBhbnkgZWxlbWVudC4gQWxsIHtAbGluayBuZ01vZGVsfVxuICogZGlyZWN0aXZlcyB3aWxsIHVzZSB0aGUgb3B0aW9ucyBvZiB0aGVpciBuZWFyZXN0IGBuZ01vZGVsT3B0aW9uc2AgYW5jZXN0b3IuXG4gKlxuICogVGhlIGBuZ01vZGVsT3B0aW9uc2Agc2V0dGluZ3MgYXJlIGZvdW5kIGJ5IGV2YWx1YXRpbmcgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgZGlyZWN0aXZlIGFzXG4gKiBhbiBBbmd1bGFyIGV4cHJlc3Npb24uIFRoaXMgZXhwcmVzc2lvbiBzaG91bGQgZXZhbHVhdGUgdG8gYW4gb2JqZWN0LCB3aG9zZSBwcm9wZXJ0aWVzIGNvbnRhaW5cbiAqIHRoZSBzZXR0aW5ncy4gRm9yIGV4YW1wbGU6IGA8ZGl2IFwibmctbW9kZWwtb3B0aW9uc1wiPVwieyBkZWJvdW5jZTogMTAwIH1cImAuXG4gKlxuICogIyMgSW5oZXJpdGluZyBPcHRpb25zXG4gKlxuICogWW91IGNhbiBzcGVjaWZ5IHRoYXQgYW4gYG5nTW9kZWxPcHRpb25zYCBzZXR0aW5nIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBgbmdNb2RlbE9wdGlvbnNgXG4gKiBkaXJlY3RpdmUgYnkgZ2l2aW5nIGl0IHRoZSB2YWx1ZSBvZiBgXCIkaW5oZXJpdFwiYC5cbiAqIFRoZW4gaXQgd2lsbCBpbmhlcml0IHRoYXQgc2V0dGluZyBmcm9tIHRoZSBmaXJzdCBgbmdNb2RlbE9wdGlvbnNgIGRpcmVjdGl2ZSBmb3VuZCBieSB0cmF2ZXJzaW5nIHVwIHRoZVxuICogRE9NIHRyZWUuIElmIHRoZXJlIGlzIG5vIGFuY2VzdG9yIGVsZW1lbnQgY29udGFpbmluZyBhbiBgbmdNb2RlbE9wdGlvbnNgIGRpcmVjdGl2ZSB0aGVuIGRlZmF1bHQgc2V0dGluZ3NcbiAqIHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBGb3IgZXhhbXBsZSBnaXZlbiB0aGUgZm9sbG93aW5nIGZyYWdtZW50IG9mIEhUTUxcbiAqXG4gKlxuICogYGBgaHRtbFxuICogPGRpdiBuZy1tb2RlbC1vcHRpb25zPVwieyBhbGxvd0ludmFsaWQ6IHRydWUsIGRlYm91bmNlOiAyMDAgfVwiPlxuICogICA8Zm9ybSBuZy1tb2RlbC1vcHRpb25zPVwieyB1cGRhdGVPbjogJ2JsdXInLCBhbGxvd0ludmFsaWQ6ICckaW5oZXJpdCcgfVwiPlxuICogICAgIDxpbnB1dCBuZy1tb2RlbC1vcHRpb25zPVwieyB1cGRhdGVPbjogJ2RlZmF1bHQnLCBhbGxvd0ludmFsaWQ6ICckaW5oZXJpdCcgfVwiIC8+XG4gKiAgIDwvZm9ybT5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogdGhlIGBpbnB1dGAgZWxlbWVudCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBzZXR0aW5nc1xuICpcbiAqIGBgYGpzXG4gKiB7IGFsbG93SW52YWxpZDogdHJ1ZSwgdXBkYXRlT246ICdkZWZhdWx0JywgZGVib3VuY2U6IDAgfVxuICogYGBgXG4gKlxuICogTm90aWNlIHRoYXQgdGhlIGBkZWJvdW5jZWAgc2V0dGluZyB3YXMgbm90IGluaGVyaXRlZCBhbmQgdXNlZCB0aGUgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLlxuICpcbiAqIFlvdSBjYW4gc3BlY2lmeSB0aGF0IGFsbCB1bmRlZmluZWQgc2V0dGluZ3MgYXJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGZyb20gYW4gYW5jZXN0b3IgYnlcbiAqIGluY2x1ZGluZyBhIHByb3BlcnR5IHdpdGgga2V5IG9mIGBcIipcImAgYW5kIHZhbHVlIG9mIGBcIiRpbmhlcml0XCJgLlxuICpcbiAqIEZvciBleGFtcGxlIGdpdmVuIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgb2YgSFRNTFxuICpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGFsbG93SW52YWxpZDogdHJ1ZSwgZGVib3VuY2U6IDIwMCB9XCI+XG4gKiAgIDxmb3JtIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IHVwZGF0ZU9uOiAnYmx1cicsIFwiKlwiOiAnJGluaGVyaXQnIH1cIj5cbiAqICAgICA8aW5wdXQgbmctbW9kZWwtb3B0aW9ucz1cInsgdXBkYXRlT246ICdkZWZhdWx0JywgXCIqXCI6ICckaW5oZXJpdCcgfVwiIC8+XG4gKiAgIDwvZm9ybT5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogdGhlIGBpbnB1dGAgZWxlbWVudCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBzZXR0aW5nc1xuICpcbiAqIGBgYGpzXG4gKiB7IGFsbG93SW52YWxpZDogdHJ1ZSwgdXBkYXRlT246ICdkZWZhdWx0JywgZGVib3VuY2U6IDIwMCB9XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCB0aGUgYGRlYm91bmNlYCBzZXR0aW5nIG5vdyBpbmhlcml0cyB0aGUgdmFsdWUgZnJvbSB0aGUgb3V0ZXIgYDxkaXY+YCBlbGVtZW50LlxuICpcbiAqIElmIHlvdSBhcmUgY3JlYXRpbmcgYSByZXVzYWJsZSBjb21wb25lbnQgdGhlbiB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgd2hlbiB1c2luZyBgXCIqXCI6IFwiJGluaGVyaXRcImBcbiAqIHNpbmNlIHlvdSBtYXkgaW5hZHZlcnRlbnRseSBpbmhlcml0IGEgc2V0dGluZyBpbiB0aGUgZnV0dXJlIHRoYXQgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgeW91ciBjb21wb25lbnQuXG4gKlxuICpcbiAqICMjIFRyaWdnZXJpbmcgYW5kIGRlYm91bmNpbmcgbW9kZWwgdXBkYXRlc1xuICpcbiAqIFRoZSBgdXBkYXRlT25gIGFuZCBgZGVib3VuY2VgIHByb3BlcnRpZXMgYWxsb3cgeW91IHRvIHNwZWNpZnkgYSBjdXN0b20gbGlzdCBvZiBldmVudHMgdGhhdCB3aWxsXG4gKiB0cmlnZ2VyIGEgbW9kZWwgdXBkYXRlIGFuZC9vciBhIGRlYm91bmNpbmcgZGVsYXkgc28gdGhhdCB0aGUgYWN0dWFsIHVwZGF0ZSBvbmx5IHRha2VzIHBsYWNlIHdoZW5cbiAqIGEgdGltZXIgZXhwaXJlczsgdGhpcyB0aW1lciB3aWxsIGJlIHJlc2V0IGFmdGVyIGFub3RoZXIgY2hhbmdlIHRha2VzIHBsYWNlLlxuICpcbiAqIEdpdmVuIHRoZSBuYXR1cmUgb2YgYG5nTW9kZWxPcHRpb25zYCwgdGhlIHZhbHVlIGRpc3BsYXllZCBpbnNpZGUgaW5wdXQgZmllbGRzIGluIHRoZSB2aWV3IG1pZ2h0XG4gKiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgaW4gdGhlIGFjdHVhbCBtb2RlbC4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSB1cGRhdGUgdGhlIG1vZGVsIHlvdVxuICogc2hvdWxkIGFsc28gaW52b2tlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyRyb2xsYmFja1ZpZXdWYWx1ZX0gb24gdGhlIHJlbGV2YW50IGlucHV0IGZpZWxkIGluXG4gKiBvcmRlciB0byBtYWtlIHN1cmUgaXQgaXMgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGFuZCB0aGF0IGFueSBkZWJvdW5jZWQgYWN0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIFRoZSBlYXNpZXN0IHdheSB0byByZWZlcmVuY2UgdGhlIGNvbnRyb2wncyB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkcm9sbGJhY2tWaWV3VmFsdWV9XG4gKiBtZXRob2QgaXMgYnkgbWFraW5nIHN1cmUgdGhlIGlucHV0IGlzIHBsYWNlZCBpbnNpZGUgYSBmb3JtIHRoYXQgaGFzIGEgYG5hbWVgIGF0dHJpYnV0ZS4gVGhpcyBpc1xuICogaW1wb3J0YW50IGJlY2F1c2UgYGZvcm1gIGNvbnRyb2xsZXJzIGFyZSBwdWJsaXNoZWQgdG8gdGhlIHJlbGF0ZWQgc2NvcGUgdW5kZXIgdGhlIG5hbWUgaW4gdGhlaXJcbiAqIGBuYW1lYCBhdHRyaWJ1dGUuXG4gKlxuICogQW55IHBlbmRpbmcgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2UgaW1tZWRpYXRlbHkgd2hlbiBhbiBlbmNsb3NpbmcgZm9ybSBpcyBzdWJtaXR0ZWQgdmlhIHRoZVxuICogYHN1Ym1pdGAgZXZlbnQuIE5vdGUgdGhhdCBgbmdDbGlja2AgZXZlbnRzIHdpbGwgb2NjdXIgYmVmb3JlIHRoZSBtb2RlbCBpcyB1cGRhdGVkLiBVc2UgYG5nU3VibWl0YFxuICogdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHVwZGF0ZWQgbW9kZWwuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBvdmVycmlkZSBpbW1lZGlhdGUgdXBkYXRlcy4gQ2hhbmdlcyBvbiB0aGUgaW5wdXRzIHdpdGhpbiB0aGVcbiAqIGZvcm0gd2lsbCB1cGRhdGUgdGhlIG1vZGVsIG9ubHkgd2hlbiB0aGUgY29udHJvbCBsb3NlcyBmb2N1cyAoYmx1ciBldmVudCkuIElmIGBlc2NhcGVgIGtleSBpc1xuICogcHJlc3NlZCB3aGlsZSB0aGUgaW5wdXQgZmllbGQgaXMgZm9jdXNlZCwgdGhlIHZhbHVlIGlzIHJlc2V0IHRvIHRoZSB2YWx1ZSBpbiB0aGUgY3VycmVudCBtb2RlbC5cbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwibmdNb2RlbE9wdGlvbnMtZGlyZWN0aXZlLWJsdXJcIiBtb2R1bGU9XCJvcHRpb25zRXhhbXBsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8Zm9ybSBuYW1lPVwidXNlckZvcm1cIj5cbiAqICAgICAgICAgPGxhYmVsPlxuICogICAgICAgICAgIE5hbWU6XG4gKiAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJOYW1lXCJcbiAqICAgICAgICAgICAgICAgICAgbmctbW9kZWw9XCJ1c2VyLm5hbWVcIlxuICogICAgICAgICAgICAgICAgICBuZy1tb2RlbC1vcHRpb25zPVwieyB1cGRhdGVPbjogJ2JsdXInIH1cIlxuICogICAgICAgICAgICAgICAgICBuZy1rZXl1cD1cImNhbmNlbCgkZXZlbnQpXCIgLz5cbiAqICAgICAgICAgPC9sYWJlbD48YnIgLz5cbiAqICAgICAgICAgPGxhYmVsPlxuICogICAgICAgICAgIE90aGVyIGRhdGE6XG4gKiAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJ1c2VyLmRhdGFcIiAvPlxuICogICAgICAgICA8L2xhYmVsPjxiciAvPlxuICogICAgICAgPC9mb3JtPlxuICogICAgICAgPHByZT51c2VyLm5hbWUgPSA8c3BhbiBuZy1iaW5kPVwidXNlci5uYW1lXCI+PC9zcGFuPjwvcHJlPlxuICogICAgIDwvZGl2PlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICAgICBhbmd1bGFyLm1vZHVsZSgnb3B0aW9uc0V4YW1wbGUnLCBbXSlcbiAqICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICRzY29wZS51c2VyID0geyBuYW1lOiAnc2F5JywgZGF0YTogJycgfTtcbiAqXG4gKiAgICAgICAgICRzY29wZS5jYW5jZWwgPSBmdW5jdGlvbihlKSB7XG4gKiAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHtcbiAqICAgICAgICAgICAgICRzY29wZS51c2VyRm9ybS51c2VyTmFtZS4kcm9sbGJhY2tWaWV3VmFsdWUoKTtcbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIH07XG4gKiAgICAgICB9XSk7XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogICAgIHZhciBtb2RlbCA9IGVsZW1lbnQoYnkuYmluZGluZygndXNlci5uYW1lJykpO1xuICogICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3VzZXIubmFtZScpKTtcbiAqICAgICB2YXIgb3RoZXIgPSBlbGVtZW50KGJ5Lm1vZGVsKCd1c2VyLmRhdGEnKSk7XG4gKlxuICogICAgIGl0KCdzaG91bGQgYWxsb3cgY3VzdG9tIGV2ZW50cycsIGZ1bmN0aW9uKCkge1xuICogICAgICAgaW5wdXQuc2VuZEtleXMoJyBoZWxsbycpO1xuICogICAgICAgaW5wdXQuY2xpY2soKTtcbiAqICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheScpO1xuICogICAgICAgb3RoZXIuY2xpY2soKTtcbiAqICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheSBoZWxsbycpO1xuICogICAgIH0pO1xuICpcbiAqICAgICBpdCgnc2hvdWxkICRyb2xsYmFja1ZpZXdWYWx1ZSB3aGVuIG1vZGVsIGNoYW5nZXMnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgIGlucHV0LnNlbmRLZXlzKCcgaGVsbG8nKTtcbiAqICAgICAgIGV4cGVjdChpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJ3NheSBoZWxsbycpO1xuICogICAgICAgaW5wdXQuc2VuZEtleXMocHJvdHJhY3Rvci5LZXkuRVNDQVBFKTtcbiAqICAgICAgIGV4cGVjdChpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykpLnRvRXF1YWwoJ3NheScpO1xuICogICAgICAgb3RoZXIuY2xpY2soKTtcbiAqICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvRXF1YWwoJ3NheScpO1xuICogICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogVGhlIG5leHQgZXhhbXBsZSBzaG93cyBob3cgdG8gZGVib3VuY2UgbW9kZWwgY2hhbmdlcy4gTW9kZWwgd2lsbCBiZSB1cGRhdGVkIG9ubHkgMSBzZWMgYWZ0ZXIgbGFzdCBjaGFuZ2UuXG4gKiBJZiB0aGUgYENsZWFyYCBidXR0b24gaXMgcHJlc3NlZCwgYW55IGRlYm91bmNlZCBhY3Rpb24gaXMgY2FuY2VsZWQgYW5kIHRoZSB2YWx1ZSBiZWNvbWVzIGVtcHR5LlxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ01vZGVsT3B0aW9ucy1kaXJlY3RpdmUtZGVib3VuY2VcIiBtb2R1bGU9XCJvcHRpb25zRXhhbXBsZVwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8Zm9ybSBuYW1lPVwidXNlckZvcm1cIj5cbiAqICAgICAgICAgTmFtZTpcbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJOYW1lXCJcbiAqICAgICAgICAgICAgICAgIG5nLW1vZGVsPVwidXNlci5uYW1lXCJcbiAqICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGRlYm91bmNlOiAxMDAwIH1cIiAvPlxuICogICAgICAgICA8YnV0dG9uIG5nLWNsaWNrPVwidXNlckZvcm0udXNlck5hbWUuJHJvbGxiYWNrVmlld1ZhbHVlKCk7IHVzZXIubmFtZT0nJ1wiPkNsZWFyPC9idXR0b24+PGJyIC8+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgICA8cHJlPnVzZXIubmFtZSA9IDxzcGFuIG5nLWJpbmQ9XCJ1c2VyLm5hbWVcIj48L3NwYW4+PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogICAgIGFuZ3VsYXIubW9kdWxlKCdvcHRpb25zRXhhbXBsZScsIFtdKVxuICogICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgJHNjb3BlLnVzZXIgPSB7IG5hbWU6ICdzYXknIH07XG4gKiAgICAgICB9XSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiAjIyBNb2RlbCB1cGRhdGVzIGFuZCB2YWxpZGF0aW9uXG4gKlxuICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGluIGBuZ01vZGVsYCBpcyB0aGF0IHRoZSBtb2RlbCB2YWx1ZSBpcyBzZXQgdG8gYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIHZhbGlkYXRpb24gZGV0ZXJtaW5lcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkLiBCeSBzZXR0aW5nIHRoZSBgYWxsb3dJbnZhbGlkYCBwcm9wZXJ0eSB0byB0cnVlLFxuICogdGhlIG1vZGVsIHdpbGwgc3RpbGwgYmUgdXBkYXRlZCBldmVuIGlmIHRoZSB2YWx1ZSBpcyBpbnZhbGlkLlxuICpcbiAqXG4gKiAjIyBDb25uZWN0aW5nIHRvIHRoZSBzY29wZVxuICpcbiAqIEJ5IHNldHRpbmcgdGhlIGBnZXR0ZXJTZXR0ZXJgIHByb3BlcnR5IHRvIHRydWUgeW91IGFyZSB0ZWxsaW5nIG5nTW9kZWwgdGhhdCB0aGUgYG5nTW9kZWxgIGV4cHJlc3Npb25cbiAqIG9uIHRoZSBzY29wZSByZWZlcnMgdG8gYSBcImdldHRlci9zZXR0ZXJcIiBmdW5jdGlvbiByYXRoZXIgdGhhbiB0aGUgdmFsdWUgaXRzZWxmLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYmluZCB0byBnZXR0ZXIvc2V0dGVyczpcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwibmdNb2RlbE9wdGlvbnMtZGlyZWN0aXZlLWdldHRlci1zZXR0ZXJcIiBtb2R1bGU9XCJnZXR0ZXJTZXR0ZXJFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgICAgIDxmb3JtIG5hbWU9XCJ1c2VyRm9ybVwiPlxuICogICAgICAgICA8bGFiZWw+XG4gKiAgICAgICAgICAgTmFtZTpcbiAqICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlck5hbWVcIlxuICogICAgICAgICAgICAgICAgICBuZy1tb2RlbD1cInVzZXIubmFtZVwiXG4gKiAgICAgICAgICAgICAgICAgIG5nLW1vZGVsLW9wdGlvbnM9XCJ7IGdldHRlclNldHRlcjogdHJ1ZSB9XCIgLz5cbiAqICAgICAgICAgPC9sYWJlbD5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICAgIDxwcmU+dXNlci5uYW1lID0gPHNwYW4gbmctYmluZD1cInVzZXIubmFtZSgpXCI+PC9zcGFuPjwvcHJlPlxuICogICAgIDwvZGl2PlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICAgICBhbmd1bGFyLm1vZHVsZSgnZ2V0dGVyU2V0dGVyRXhhbXBsZScsIFtdKVxuICogICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgdmFyIF9uYW1lID0gJ0JyaWFuJztcbiAqICAgICAgICAgJHNjb3BlLnVzZXIgPSB7XG4gKiAgICAgICAgICAgbmFtZTogZnVuY3Rpb24obmV3TmFtZSkge1xuICogICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNEZWZpbmVkKG5ld05hbWUpID8gKF9uYW1lID0gbmV3TmFtZSkgOiBfbmFtZTtcbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIH07XG4gKiAgICAgICB9XSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKlxuICogIyMgU3BlY2lmeWluZyB0aW1lem9uZXNcbiAqXG4gKiBZb3UgY2FuIHNwZWNpZnkgdGhlIHRpbWV6b25lIHRoYXQgZGF0ZS90aW1lIGlucHV0IGRpcmVjdGl2ZXMgZXhwZWN0IGJ5IHByb3ZpZGluZyBpdHMgbmFtZSBpbiB0aGVcbiAqIGB0aW1lem9uZWAgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5nTW9kZWxPcHRpb25zIG9wdGlvbnMgdG8gYXBwbHkgdG8ge0BsaW5rIG5nTW9kZWx9IGRpcmVjdGl2ZXMgb24gdGhpcyBlbGVtZW50IGFuZFxuICogICBhbmQgaXRzIGRlc2NlbmRlbnRzLiBWYWxpZCBrZXlzIGFyZTpcbiAqICAgLSBgdXBkYXRlT25gOiBzdHJpbmcgc3BlY2lmeWluZyB3aGljaCBldmVudCBzaG91bGQgdGhlIGlucHV0IGJlIGJvdW5kIHRvLiBZb3UgY2FuIHNldCBzZXZlcmFsXG4gKiAgICAgZXZlbnRzIHVzaW5nIGFuIHNwYWNlIGRlbGltaXRlZCBsaXN0LiBUaGVyZSBpcyBhIHNwZWNpYWwgZXZlbnQgY2FsbGVkIGBkZWZhdWx0YCB0aGF0XG4gKiAgICAgbWF0Y2hlcyB0aGUgZGVmYXVsdCBldmVudHMgYmVsb25naW5nIHRvIHRoZSBjb250cm9sLlxuICogICAtIGBkZWJvdW5jZWA6IGludGVnZXIgdmFsdWUgd2hpY2ggY29udGFpbnMgdGhlIGRlYm91bmNlIG1vZGVsIHVwZGF0ZSB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuIEFcbiAqICAgICB2YWx1ZSBvZiAwIHRyaWdnZXJzIGFuIGltbWVkaWF0ZSB1cGRhdGUuIElmIGFuIG9iamVjdCBpcyBzdXBwbGllZCBpbnN0ZWFkLCB5b3UgY2FuIHNwZWNpZnkgYVxuICogICAgIGN1c3RvbSB2YWx1ZSBmb3IgZWFjaCBldmVudC4gRm9yIGV4YW1wbGU6XG4gKiAgICAgYGBgXG4gKiAgICAgbmctbW9kZWwtb3B0aW9ucz1cIntcbiAqICAgICAgIHVwZGF0ZU9uOiAnZGVmYXVsdCBibHVyJyxcbiAqICAgICAgIGRlYm91bmNlOiB7ICdkZWZhdWx0JzogNTAwLCAnYmx1cic6IDAgfVxuICogICAgIH1cIlxuICogICAgIGBgYFxuICogICAtIGBhbGxvd0ludmFsaWRgOiBib29sZWFuIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBjYW4gYmUgc2V0IHdpdGggdmFsdWVzIHRoYXQgZGlkXG4gKiAgICAgbm90IHZhbGlkYXRlIGNvcnJlY3RseSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHNldHRpbmcgdGhlIG1vZGVsIHRvIHVuZGVmaW5lZC5cbiAqICAgLSBgZ2V0dGVyU2V0dGVyYDogYm9vbGVhbiB2YWx1ZSB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIHRyZWF0IGZ1bmN0aW9ucyBib3VuZCB0b1xuICogICAgIGBuZ01vZGVsYCBhcyBnZXR0ZXJzL3NldHRlcnMuXG4gKiAgIC0gYHRpbWV6b25lYDogRGVmaW5lcyB0aGUgdGltZXpvbmUgdG8gYmUgdXNlZCB0byByZWFkL3dyaXRlIHRoZSBgRGF0ZWAgaW5zdGFuY2UgaW4gdGhlIG1vZGVsIGZvclxuICogICAgIGA8aW5wdXQgdHlwZT1cImRhdGVcIiAvPmAsIGA8aW5wdXQgdHlwZT1cInRpbWVcIiAvPmAsIC4uLiAuIEl0IHVuZGVyc3RhbmRzIFVUQy9HTVQgYW5kIHRoZVxuICogICAgIGNvbnRpbmVudGFsIFVTIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zLCBidXQgZm9yIGdlbmVyYWwgdXNlLCB1c2UgYSB0aW1lIHpvbmUgb2Zmc2V0LCBmb3JcbiAqICAgICBleGFtcGxlLCBgJyswNDMwJ2AgKDQgaG91cnMsIDMwIG1pbnV0ZXMgZWFzdCBvZiB0aGUgR3JlZW53aWNoIG1lcmlkaWFuKVxuICogICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0aW1lem9uZSBvZiB0aGUgYnJvd3NlciB3aWxsIGJlIHVzZWQuXG4gKlxuICovXG52YXIgbmdNb2RlbE9wdGlvbnNEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIC8vIG5nTW9kZWxPcHRpb25zIG5lZWRzIHRvIHJ1biBiZWZvcmUgbmdNb2RlbCBhbmQgaW5wdXQgZGlyZWN0aXZlc1xuICAgIHByaW9yaXR5OiAxMCxcbiAgICByZXF1aXJlOiBbJ25nTW9kZWxPcHRpb25zJywgJz9eXm5nTW9kZWxPcHRpb25zJ10sXG4gICAgY29udHJvbGxlcjogZnVuY3Rpb24gTmdNb2RlbE9wdGlvbnNDb250cm9sbGVyKCkge30sXG4gICAgbGluazoge1xuICAgICAgcHJlOiBmdW5jdGlvbiBuZ01vZGVsT3B0aW9uc1ByZUxpbmtGbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIGN0cmxzKSB7XG4gICAgICAgIHZhciBvcHRpb25zQ3RybCA9IGN0cmxzWzBdO1xuICAgICAgICB2YXIgcGFyZW50T3B0aW9ucyA9IGN0cmxzWzFdID8gY3RybHNbMV0uJG9wdGlvbnMgOiBkZWZhdWx0TW9kZWxPcHRpb25zO1xuICAgICAgICBvcHRpb25zQ3RybC4kb3B0aW9ucyA9IHBhcmVudE9wdGlvbnMuY3JlYXRlQ2hpbGQoc2NvcGUuJGV2YWwoYXR0cnMubmdNb2RlbE9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5cbi8vIHNoYWxsb3cgY29weSBvdmVyIHZhbHVlcyBmcm9tIGBzcmNgIHRoYXQgYXJlIG5vdCBhbHJlYWR5IHNwZWNpZmllZCBvbiBgZHN0YFxuZnVuY3Rpb24gZGVmYXVsdHMoZHN0LCBzcmMpIHtcbiAgZm9yRWFjaChzcmMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoIWlzRGVmaW5lZChkc3Rba2V5XSkpIHtcbiAgICAgIGRzdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ05vbkJpbmRhYmxlXG4gKiBAcmVzdHJpY3QgQUNcbiAqIEBwcmlvcml0eSAxMDAwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nTm9uQmluZGFibGVgIGRpcmVjdGl2ZSB0ZWxscyBBbmd1bGFyIG5vdCB0byBjb21waWxlIG9yIGJpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50XG4gKiBET00gZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgd2hhdCBhcHBlYXJzIHRvIGJlIEFuZ3VsYXIgZGlyZWN0aXZlcyBhbmRcbiAqIGJpbmRpbmdzIGJ1dCB3aGljaCBzaG91bGQgYmUgaWdub3JlZCBieSBBbmd1bGFyLiBUaGlzIGNvdWxkIGJlIHRoZSBjYXNlIGlmIHlvdSBoYXZlIGEgc2l0ZSB0aGF0XG4gKiBkaXNwbGF5cyBzbmlwcGV0cyBvZiBjb2RlLCBmb3IgaW5zdGFuY2UuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKlxuICogQGV4YW1wbGVcbiAqIEluIHRoaXMgZXhhbXBsZSB0aGVyZSBhcmUgdHdvIGxvY2F0aW9ucyB3aGVyZSBhIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgKGB7e319YCkgaXMgcHJlc2VudCxcbiAqIGJ1dCB0aGUgb25lIHdyYXBwZWQgaW4gYG5nTm9uQmluZGFibGVgIGlzIGxlZnQgYWxvbmUuXG4gKlxuICogQGV4YW1wbGVcbiAgICA8ZXhhbXBsZSBuYW1lPVwibmctbm9uLWJpbmRhYmxlXCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8ZGl2Pk5vcm1hbDoge3sxICsgMn19PC9kaXY+XG4gICAgICAgIDxkaXYgbmctbm9uLWJpbmRhYmxlPklnbm9yZWQ6IHt7MSArIDJ9fTwvZGl2PlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctbm9uLWJpbmRhYmxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCcxICsgMicpKS5nZXRUZXh0KCkpLnRvQ29udGFpbignMycpO1xuICAgICAgICAgZXhwZWN0KGVsZW1lbnQuYWxsKGJ5LmNzcygnZGl2JykpLmxhc3QoKS5nZXRUZXh0KCkpLnRvTWF0Y2goLzEgXFwrIDIvKTtcbiAgICAgICB9KTtcbiAgICAgIDwvZmlsZT5cbiAgICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ05vbkJpbmRhYmxlRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoeyB0ZXJtaW5hbDogdHJ1ZSwgcHJpb3JpdHk6IDEwMDAgfSk7XG5cbi8qIGV4cG9ydGVkIG5nT3B0aW9uc0RpcmVjdGl2ZSAqL1xuXG4vKiBnbG9iYWwganFMaXRlUmVtb3ZlICovXG5cbnZhciBuZ09wdGlvbnNNaW5FcnIgPSBtaW5FcnIoJ25nT3B0aW9ucycpO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIG5nT3B0aW9uc1xuICogQHJlc3RyaWN0IEFcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBUaGUgYG5nT3B0aW9uc2AgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgbGlzdCBvZiBgPG9wdGlvbj5gXG4gKiBlbGVtZW50cyBmb3IgdGhlIGA8c2VsZWN0PmAgZWxlbWVudCB1c2luZyB0aGUgYXJyYXkgb3Igb2JqZWN0IG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhlXG4gKiBgbmdPcHRpb25zYCBjb21wcmVoZW5zaW9uIGV4cHJlc3Npb24uXG4gKlxuICogSW4gbWFueSBjYXNlcywge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ1JlcGVhdCBuZ1JlcGVhdH0gY2FuIGJlIHVzZWQgb24gYDxvcHRpb24+YCBlbGVtZW50cyBpbnN0ZWFkIG9mXG4gKiBgbmdPcHRpb25zYCB0byBhY2hpZXZlIGEgc2ltaWxhciByZXN1bHQuIEhvd2V2ZXIsIGBuZ09wdGlvbnNgIHByb3ZpZGVzIHNvbWUgYmVuZWZpdHM6XG4gKiAtIG1vcmUgZmxleGliaWxpdHkgaW4gaG93IHRoZSBgPHNlbGVjdD5gJ3MgbW9kZWwgaXMgYXNzaWduZWQgdmlhIHRoZSBgc2VsZWN0YCAqKmBhc2AqKiBwYXJ0IG9mIHRoZVxuICogY29tcHJlaGVuc2lvbiBleHByZXNzaW9uXG4gKiAtIHJlZHVjZWQgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IG5vdCBjcmVhdGluZyBhIG5ldyBzY29wZSBmb3IgZWFjaCByZXBlYXRlZCBpbnN0YW5jZVxuICogLSBpbmNyZWFzZWQgcmVuZGVyIHNwZWVkIGJ5IGNyZWF0aW5nIHRoZSBvcHRpb25zIGluIGEgZG9jdW1lbnRGcmFnbWVudCBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseVxuICpcbiAqIFdoZW4gYW4gaXRlbSBpbiB0aGUgYDxzZWxlY3Q+YCBtZW51IGlzIHNlbGVjdGVkLCB0aGUgYXJyYXkgZWxlbWVudCBvciBvYmplY3QgcHJvcGVydHlcbiAqIHJlcHJlc2VudGVkIGJ5IHRoZSBzZWxlY3RlZCBvcHRpb24gd2lsbCBiZSBib3VuZCB0byB0aGUgbW9kZWwgaWRlbnRpZmllZCBieSB0aGUgYG5nTW9kZWxgXG4gKiBkaXJlY3RpdmUuXG4gKlxuICogT3B0aW9uYWxseSwgYSBzaW5nbGUgaGFyZC1jb2RlZCBgPG9wdGlvbj5gIGVsZW1lbnQsIHdpdGggdGhlIHZhbHVlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcsIGNhblxuICogYmUgbmVzdGVkIGludG8gdGhlIGA8c2VsZWN0PmAgZWxlbWVudC4gVGhpcyBlbGVtZW50IHdpbGwgdGhlbiByZXByZXNlbnQgdGhlIGBudWxsYCBvciBcIm5vdCBzZWxlY3RlZFwiXG4gKiBvcHRpb24uIFNlZSBleGFtcGxlIGJlbG93IGZvciBkZW1vbnN0cmF0aW9uLlxuICpcbiAqICMjIENvbXBsZXggTW9kZWxzIChvYmplY3RzIG9yIGNvbGxlY3Rpb25zKVxuICpcbiAqIEJ5IGRlZmF1bHQsIGBuZ01vZGVsYCB3YXRjaGVzIHRoZSBtb2RlbCBieSByZWZlcmVuY2UsIG5vdCB2YWx1ZS4gVGhpcyBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGVuXG4gKiBiaW5kaW5nIHRoZSBzZWxlY3QgdG8gYSBtb2RlbCB0aGF0IGlzIGFuIG9iamVjdCBvciBhIGNvbGxlY3Rpb24uXG4gKlxuICogT25lIGlzc3VlIG9jY3VycyBpZiB5b3Ugd2FudCB0byBwcmVzZWxlY3QgYW4gb3B0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IHNldFxuICogdGhlIG1vZGVsIHRvIGFuIG9iamVjdCB0aGF0IGlzIGVxdWFsIHRvIGFuIG9iamVjdCBpbiB5b3VyIGNvbGxlY3Rpb24sIGBuZ09wdGlvbnNgIHdvbid0IGJlIGFibGUgdG8gc2V0IHRoZSBzZWxlY3Rpb24sXG4gKiBiZWNhdXNlIHRoZSBvYmplY3RzIGFyZSBub3QgaWRlbnRpY2FsLiBTbyBieSBkZWZhdWx0LCB5b3Ugc2hvdWxkIGFsd2F5cyByZWZlcmVuY2UgdGhlIGl0ZW0gaW4geW91ciBjb2xsZWN0aW9uXG4gKiBmb3IgcHJlc2VsZWN0aW9ucywgZS5nLjogYCRzY29wZS5zZWxlY3RlZCA9ICRzY29wZS5jb2xsZWN0aW9uWzNdYC5cbiAqXG4gKiBBbm90aGVyIHNvbHV0aW9uIGlzIHRvIHVzZSBhIGB0cmFjayBieWAgY2xhdXNlLCBiZWNhdXNlIHRoZW4gYG5nT3B0aW9uc2Agd2lsbCB0cmFjayB0aGUgaWRlbnRpdHlcbiAqIG9mIHRoZSBpdGVtIG5vdCBieSByZWZlcmVuY2UsIGJ1dCBieSB0aGUgcmVzdWx0IG9mIHRoZSBgdHJhY2sgYnlgIGV4cHJlc3Npb24uIEZvciBleGFtcGxlLCBpZiB5b3VyXG4gKiBjb2xsZWN0aW9uIGl0ZW1zIGhhdmUgYW4gaWQgcHJvcGVydHksIHlvdSB3b3VsZCBgdHJhY2sgYnkgaXRlbS5pZGAuXG4gKlxuICogQSBkaWZmZXJlbnQgaXNzdWUgd2l0aCBvYmplY3RzIG9yIGNvbGxlY3Rpb25zIGlzIHRoYXQgbmdNb2RlbCB3b24ndCBkZXRlY3QgaWYgYW4gb2JqZWN0IHByb3BlcnR5IG9yXG4gKiBhIGNvbGxlY3Rpb24gaXRlbSBjaGFuZ2VzLiBGb3IgdGhhdCByZWFzb24sIGBuZ09wdGlvbnNgIGFkZGl0aW9uYWxseSB3YXRjaGVzIHRoZSBtb2RlbCB1c2luZ1xuICogYCR3YXRjaENvbGxlY3Rpb25gLCB3aGVuIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGEgYHRyYWNrIGJ5YCBjbGF1c2Ugb3IgdGhlIHRoZSBzZWxlY3QgaGFzIHRoZSBgbXVsdGlwbGVgIGF0dHJpYnV0ZS5cbiAqIFRoaXMgYWxsb3dzIG5nT3B0aW9ucyB0byB0cmlnZ2VyIGEgcmUtcmVuZGVyaW5nIG9mIHRoZSBvcHRpb25zIGV2ZW4gaWYgdGhlIGFjdHVhbCBvYmplY3QvY29sbGVjdGlvblxuICogaGFzIG5vdCBjaGFuZ2VkIGlkZW50aXR5LCBidXQgb25seSBhIHByb3BlcnR5IG9uIHRoZSBvYmplY3Qgb3IgYW4gaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBjaGFuZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCBgJHdhdGNoQ29sbGVjdGlvbmAgZG9lcyBhIHNoYWxsb3cgY29tcGFyaXNvbiBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IChvciB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25cbiAqIGlmIHRoZSBtb2RlbCBpcyBhbiBhcnJheSkuIFRoaXMgbWVhbnMgdGhhdCBjaGFuZ2luZyBhIHByb3BlcnR5IGRlZXBlciB0aGFuIHRoZSBmaXJzdCBsZXZlbCBpbnNpZGUgdGhlXG4gKiBvYmplY3QvY29sbGVjdGlvbiB3aWxsIG5vdCB0cmlnZ2VyIGEgcmUtcmVuZGVyaW5nLlxuICpcbiAqICMjIGBzZWxlY3RgICoqYGFzYCoqXG4gKlxuICogVXNpbmcgYHNlbGVjdGAgKipgYXNgKiogd2lsbCBiaW5kIHRoZSByZXN1bHQgb2YgdGhlIGBzZWxlY3RgIGV4cHJlc3Npb24gdG8gdGhlIG1vZGVsLCBidXRcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYDxzZWxlY3Q+YCBhbmQgYDxvcHRpb24+YCBodG1sIGVsZW1lbnRzIHdpbGwgYmUgZWl0aGVyIHRoZSBpbmRleCAoZm9yIGFycmF5IGRhdGEgc291cmNlcylcbiAqIG9yIHByb3BlcnR5IG5hbWUgKGZvciBvYmplY3QgZGF0YSBzb3VyY2VzKSBvZiB0aGUgdmFsdWUgd2l0aGluIHRoZSBjb2xsZWN0aW9uLiBJZiBhICoqYHRyYWNrIGJ5YCoqIGV4cHJlc3Npb25cbiAqIGlzIHVzZWQsIHRoZSByZXN1bHQgb2YgdGhhdCBleHByZXNzaW9uIHdpbGwgYmUgc2V0IGFzIHRoZSB2YWx1ZSBvZiB0aGUgYG9wdGlvbmAgYW5kIGBzZWxlY3RgIGVsZW1lbnRzLlxuICpcbiAqXG4gKiAjIyMgYHNlbGVjdGAgKipgYXNgKiogYW5kICoqYHRyYWNrIGJ5YCoqXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBgc2VsZWN0YCAqKmBhc2AqKiBhbmQgKipgdHJhY2sgYnlgKiogaW4gdGhlIHNhbWUgZXhwcmVzc2lvbi5cbiAqIDwvZGl2PlxuICpcbiAqIEdpdmVuIHRoaXMgYXJyYXkgb2YgaXRlbXMgb24gdGhlICRzY29wZTpcbiAqXG4gKiBgYGBqc1xuICogJHNjb3BlLml0ZW1zID0gW3tcbiAqICAgaWQ6IDEsXG4gKiAgIGxhYmVsOiAnYUxhYmVsJyxcbiAqICAgc3ViSXRlbTogeyBuYW1lOiAnYVN1Ykl0ZW0nIH1cbiAqIH0sIHtcbiAqICAgaWQ6IDIsXG4gKiAgIGxhYmVsOiAnYkxhYmVsJyxcbiAqICAgc3ViSXRlbTogeyBuYW1lOiAnYlN1Ykl0ZW0nIH1cbiAqIH1dO1xuICogYGBgXG4gKlxuICogVGhpcyB3aWxsIHdvcms6XG4gKlxuICogYGBgaHRtbFxuICogPHNlbGVjdCBuZy1vcHRpb25zPVwiaXRlbSBhcyBpdGVtLmxhYmVsIGZvciBpdGVtIGluIGl0ZW1zIHRyYWNrIGJ5IGl0ZW0uaWRcIiBuZy1tb2RlbD1cInNlbGVjdGVkXCI+PC9zZWxlY3Q+XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAkc2NvcGUuc2VsZWN0ZWQgPSAkc2NvcGUuaXRlbXNbMF07XG4gKiBgYGBcbiAqXG4gKiBidXQgdGhpcyB3aWxsIG5vdCB3b3JrOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxzZWxlY3Qgbmctb3B0aW9ucz1cIml0ZW0uc3ViSXRlbSBhcyBpdGVtLmxhYmVsIGZvciBpdGVtIGluIGl0ZW1zIHRyYWNrIGJ5IGl0ZW0uaWRcIiBuZy1tb2RlbD1cInNlbGVjdGVkXCI+PC9zZWxlY3Q+XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAkc2NvcGUuc2VsZWN0ZWQgPSAkc2NvcGUuaXRlbXNbMF0uc3ViSXRlbTtcbiAqIGBgYFxuICpcbiAqIEluIGJvdGggZXhhbXBsZXMsIHRoZSAqKmB0cmFjayBieWAqKiBleHByZXNzaW9uIGlzIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5IHRvIGVhY2ggYGl0ZW1gIGluIHRoZVxuICogYGl0ZW1zYCBhcnJheS4gQmVjYXVzZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGhhcyBiZWVuIHNldCBwcm9ncmFtbWF0aWNhbGx5IGluIHRoZSBjb250cm9sbGVyLCB0aGVcbiAqICoqYHRyYWNrIGJ5YCoqIGV4cHJlc3Npb24gaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBgbmdNb2RlbGAgdmFsdWUuIEluIHRoZSBmaXJzdCBleGFtcGxlLCB0aGVcbiAqIGBuZ01vZGVsYCB2YWx1ZSBpcyBgaXRlbXNbMF1gIGFuZCB0aGUgKipgdHJhY2sgYnlgKiogZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYGl0ZW1zWzBdLmlkYCB3aXRoXG4gKiBubyBpc3N1ZS4gSW4gdGhlIHNlY29uZCBleGFtcGxlLCB0aGUgYG5nTW9kZWxgIHZhbHVlIGlzIGBpdGVtc1swXS5zdWJJdGVtYCBhbmQgdGhlICoqYHRyYWNrIGJ5YCoqXG4gKiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBgaXRlbXNbMF0uc3ViSXRlbS5pZGAgKHdoaWNoIGlzIHVuZGVmaW5lZCkuIEFzIGEgcmVzdWx0LCB0aGUgbW9kZWwgdmFsdWVcbiAqIGlzIG5vdCBtYXRjaGVkIGFnYWluc3QgYW55IGA8b3B0aW9uPmAgYW5kIHRoZSBgPHNlbGVjdD5gIGFwcGVhcnMgYXMgaGF2aW5nIG5vIHNlbGVjdGVkIHZhbHVlLlxuICpcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFRoZSBjb250cm9sIGlzIGNvbnNpZGVyZWQgdmFsaWQgb25seSBpZiB2YWx1ZSBpcyBlbnRlcmVkLlxuICogQHBhcmFtIHtzdHJpbmc9fSBuZ1JlcXVpcmVkIEFkZHMgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgYW5kIGByZXF1aXJlZGAgdmFsaWRhdGlvbiBjb25zdHJhaW50IHRvXG4gKiAgICB0aGUgZWxlbWVudCB3aGVuIHRoZSBuZ1JlcXVpcmVkIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIFVzZSBgbmdSZXF1aXJlZGAgaW5zdGVhZCBvZlxuICogICAgYHJlcXVpcmVkYCB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge2NvbXByZWhlbnNpb25fZXhwcmVzc2lvbj19IG5nT3B0aW9ucyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczpcbiAqXG4gKiAgICogZm9yIGFycmF5IGRhdGEgc291cmNlczpcbiAqICAgICAqIGBsYWJlbGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YFxuICogICAgICogYHNlbGVjdGAgKipgYXNgKiogYGxhYmVsYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgXG4gKiAgICAgKiBgbGFiZWxgICoqYGdyb3VwIGJ5YCoqIGBncm91cGAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YFxuICogICAgICogYGxhYmVsYCAqKmBkaXNhYmxlIHdoZW5gKiogYGRpc2FibGVgICoqYGZvcmAqKiBgdmFsdWVgICoqYGluYCoqIGBhcnJheWBcbiAqICAgICAqIGBsYWJlbGAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgICoqYHRyYWNrIGJ5YCoqIGB0cmFja2V4cHJgXG4gKiAgICAgKiBgbGFiZWxgICoqYGRpc2FibGUgd2hlbmAqKiBgZGlzYWJsZWAgKipgZm9yYCoqIGB2YWx1ZWAgKipgaW5gKiogYGFycmF5YCAqKmB0cmFjayBieWAqKiBgdHJhY2tleHByYFxuICogICAgICogYGxhYmVsYCAqKmBmb3JgKiogYHZhbHVlYCAqKmBpbmAqKiBgYXJyYXlgIHwgb3JkZXJCeTpgb3JkZXJleHByYCAqKmB0cmFjayBieWAqKiBgdHJhY2tleHByYFxuICogICAgICAgIChmb3IgaW5jbHVkaW5nIGEgZmlsdGVyIHdpdGggYHRyYWNrIGJ5YClcbiAqICAgKiBmb3Igb2JqZWN0IGRhdGEgc291cmNlczpcbiAqICAgICAqIGBsYWJlbGAgKipgZm9yIChgKipga2V5YCAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgXG4gKiAgICAgKiBgc2VsZWN0YCAqKmBhc2AqKiBgbGFiZWxgICoqYGZvciAoYCoqYGtleWAgKipgLGAqKiBgdmFsdWVgKipgKSBpbmAqKiBgb2JqZWN0YFxuICogICAgICogYGxhYmVsYCAqKmBncm91cCBieWAqKiBgZ3JvdXBgICoqYGZvciAoYCoqYGtleWAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgXG4gKiAgICAgKiBgbGFiZWxgICoqYGRpc2FibGUgd2hlbmAqKiBgZGlzYWJsZWAgKipgZm9yIChgKipga2V5YCoqYCxgKiogYHZhbHVlYCoqYCkgaW5gKiogYG9iamVjdGBcbiAqICAgICAqIGBzZWxlY3RgICoqYGFzYCoqIGBsYWJlbGAgKipgZ3JvdXAgYnlgKiogYGdyb3VwYFxuICogICAgICAgICAqKmBmb3JgIGAoYCoqYGtleWAqKmAsYCoqIGB2YWx1ZWAqKmApIGluYCoqIGBvYmplY3RgXG4gKiAgICAgKiBgc2VsZWN0YCAqKmBhc2AqKiBgbGFiZWxgICoqYGRpc2FibGUgd2hlbmAqKiBgZGlzYWJsZWBcbiAqICAgICAgICAgKipgZm9yYCBgKGAqKmBrZXlgKipgLGAqKiBgdmFsdWVgKipgKSBpbmAqKiBgb2JqZWN0YFxuICpcbiAqIFdoZXJlOlxuICpcbiAqICAgKiBgYXJyYXlgIC8gYG9iamVjdGA6IGFuIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvIGFuIGFycmF5IC8gb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqICAgKiBgdmFsdWVgOiBsb2NhbCB2YXJpYWJsZSB3aGljaCB3aWxsIHJlZmVyIHRvIGVhY2ggaXRlbSBpbiB0aGUgYGFycmF5YCBvciBlYWNoIHByb3BlcnR5IHZhbHVlXG4gKiAgICAgIG9mIGBvYmplY3RgIGR1cmluZyBpdGVyYXRpb24uXG4gKiAgICogYGtleWA6IGxvY2FsIHZhcmlhYmxlIHdoaWNoIHdpbGwgcmVmZXIgdG8gYSBwcm9wZXJ0eSBuYW1lIGluIGBvYmplY3RgIGR1cmluZyBpdGVyYXRpb24uXG4gKiAgICogYGxhYmVsYDogVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZSB0aGUgbGFiZWwgZm9yIGA8b3B0aW9uPmAgZWxlbWVudC4gVGhlXG4gKiAgICAgYGV4cHJlc3Npb25gIHdpbGwgbW9zdCBsaWtlbHkgcmVmZXIgdG8gdGhlIGB2YWx1ZWAgdmFyaWFibGUgKGUuZy4gYHZhbHVlLnByb3BlcnR5TmFtZWApLlxuICogICAqIGBzZWxlY3RgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGJvdW5kIHRvIHRoZSBtb2RlbCBvZiB0aGUgcGFyZW50IGA8c2VsZWN0PmBcbiAqICAgICAgZWxlbWVudC4gSWYgbm90IHNwZWNpZmllZCwgYHNlbGVjdGAgZXhwcmVzc2lvbiB3aWxsIGRlZmF1bHQgdG8gYHZhbHVlYC5cbiAqICAgKiBgZ3JvdXBgOiBUaGUgcmVzdWx0IG9mIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIHVzZWQgdG8gZ3JvdXAgb3B0aW9ucyB1c2luZyB0aGUgYDxvcHRncm91cD5gXG4gKiAgICAgIERPTSBlbGVtZW50LlxuICogICAqIGBkaXNhYmxlYDogVGhlIHJlc3VsdCBvZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBiZSB1c2VkIHRvIGRpc2FibGUgdGhlIHJlbmRlcmVkIGA8b3B0aW9uPmBcbiAqICAgICAgZWxlbWVudC4gUmV0dXJuIGB0cnVlYCB0byBkaXNhYmxlLlxuICogICAqIGB0cmFja2V4cHJgOiBVc2VkIHdoZW4gd29ya2luZyB3aXRoIGFuIGFycmF5IG9mIG9iamVjdHMuIFRoZSByZXN1bHQgb2YgdGhpcyBleHByZXNzaW9uIHdpbGwgYmVcbiAqICAgICAgdXNlZCB0byBpZGVudGlmeSB0aGUgb2JqZWN0cyBpbiB0aGUgYXJyYXkuIFRoZSBgdHJhY2tleHByYCB3aWxsIG1vc3QgbGlrZWx5IHJlZmVyIHRvIHRoZVxuICogICAgIGB2YWx1ZWAgdmFyaWFibGUgKGUuZy4gYHZhbHVlLnByb3BlcnR5TmFtZWApLiBXaXRoIHRoaXMgdGhlIHNlbGVjdGlvbiBpcyBwcmVzZXJ2ZWRcbiAqICAgICAgZXZlbiB3aGVuIHRoZSBvcHRpb25zIGFyZSByZWNyZWF0ZWQgKGUuZy4gcmVsb2FkZWQgZnJvbSB0aGUgc2VydmVyKS5cbiAqXG4gKiBAZXhhbXBsZVxuICAgIDxleGFtcGxlIG1vZHVsZT1cInNlbGVjdEV4YW1wbGVcIiBuYW1lPVwic2VsZWN0XCI+XG4gICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8c2NyaXB0PlxuICAgICAgICBhbmd1bGFyLm1vZHVsZSgnc2VsZWN0RXhhbXBsZScsIFtdKVxuICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAkc2NvcGUuY29sb3JzID0gW1xuICAgICAgICAgICAgICB7bmFtZTonYmxhY2snLCBzaGFkZTonZGFyayd9LFxuICAgICAgICAgICAgICB7bmFtZTond2hpdGUnLCBzaGFkZTonbGlnaHQnLCBub3RBbk9wdGlvbjogdHJ1ZX0sXG4gICAgICAgICAgICAgIHtuYW1lOidyZWQnLCBzaGFkZTonZGFyayd9LFxuICAgICAgICAgICAgICB7bmFtZTonYmx1ZScsIHNoYWRlOidkYXJrJywgbm90QW5PcHRpb246IHRydWV9LFxuICAgICAgICAgICAgICB7bmFtZToneWVsbG93Jywgc2hhZGU6J2xpZ2h0Jywgbm90QW5PcHRpb246IGZhbHNlfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICRzY29wZS5teUNvbG9yID0gJHNjb3BlLmNvbG9yc1syXTsgLy8gcmVkXG4gICAgICAgICAgfV0pO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bGkgbmctcmVwZWF0PVwiY29sb3IgaW4gY29sb3JzXCI+XG4gICAgICAgICAgICAgIDxsYWJlbD5OYW1lOiA8aW5wdXQgbmctbW9kZWw9XCJjb2xvci5uYW1lXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZy1tb2RlbD1cImNvbG9yLm5vdEFuT3B0aW9uXCI+IERpc2FibGVkPzwvbGFiZWw+XG4gICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XCJjb2xvcnMuc3BsaWNlKCRpbmRleCwgMSlcIiBhcmlhLWxhYmVsPVwiUmVtb3ZlXCI+WDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImNvbG9ycy5wdXNoKHt9KVwiPmFkZDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDxoci8+XG4gICAgICAgICAgPGxhYmVsPkNvbG9yIChudWxsIG5vdCBhbGxvd2VkKTpcbiAgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9XCJteUNvbG9yXCIgbmctb3B0aW9ucz1cImNvbG9yLm5hbWUgZm9yIGNvbG9yIGluIGNvbG9yc1wiPjwvc2VsZWN0PlxuICAgICAgICAgIDwvbGFiZWw+PGJyLz5cbiAgICAgICAgICA8bGFiZWw+Q29sb3IgKG51bGwgYWxsb3dlZCk6XG4gICAgICAgICAgPHNwYW4gIGNsYXNzPVwibnVsbGFibGVcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgbmctbW9kZWw9XCJteUNvbG9yXCIgbmctb3B0aW9ucz1cImNvbG9yLm5hbWUgZm9yIGNvbG9yIGluIGNvbG9yc1wiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gY2hvb3NlIGNvbG9yIC0tPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L3NwYW4+PC9sYWJlbD48YnIvPlxuXG4gICAgICAgICAgPGxhYmVsPkNvbG9yIGdyb3VwZWQgYnkgc2hhZGU6XG4gICAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPVwibXlDb2xvclwiIG5nLW9wdGlvbnM9XCJjb2xvci5uYW1lIGdyb3VwIGJ5IGNvbG9yLnNoYWRlIGZvciBjb2xvciBpbiBjb2xvcnNcIj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvbGFiZWw+PGJyLz5cblxuICAgICAgICAgIDxsYWJlbD5Db2xvciBncm91cGVkIGJ5IHNoYWRlLCB3aXRoIHNvbWUgZGlzYWJsZWQ6XG4gICAgICAgICAgICA8c2VsZWN0IG5nLW1vZGVsPVwibXlDb2xvclwiXG4gICAgICAgICAgICAgICAgICBuZy1vcHRpb25zPVwiY29sb3IubmFtZSBncm91cCBieSBjb2xvci5zaGFkZSBkaXNhYmxlIHdoZW4gY29sb3Iubm90QW5PcHRpb24gZm9yIGNvbG9yIGluIGNvbG9yc1wiPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9sYWJlbD48YnIvPlxuXG5cblxuICAgICAgICAgIFNlbGVjdCA8YnV0dG9uIG5nLWNsaWNrPVwibXlDb2xvciA9IHsgbmFtZTonbm90IGluIGxpc3QnLCBzaGFkZTogJ290aGVyJyB9XCI+Ym9ndXM8L2J1dHRvbj4uXG4gICAgICAgICAgPGJyLz5cbiAgICAgICAgICA8aHIvPlxuICAgICAgICAgIEN1cnJlbnRseSBzZWxlY3RlZDoge3sge3NlbGVjdGVkX2NvbG9yOm15Q29sb3J9IH19XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImJvcmRlcjpzb2xpZCAxcHggYmxhY2s7IGhlaWdodDoyMHB4XCJcbiAgICAgICAgICAgICAgIG5nLXN0eWxlPVwieydiYWNrZ3JvdW5kLWNvbG9yJzpteUNvbG9yLm5hbWV9XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9maWxlPlxuICAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1vcHRpb25zJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3tzZWxlY3RlZF9jb2xvcjpteUNvbG9yfScpKS5nZXRUZXh0KCkpLnRvTWF0Y2goJ3JlZCcpO1xuICAgICAgICAgICBlbGVtZW50LmFsbChieS5tb2RlbCgnbXlDb2xvcicpKS5maXJzdCgpLmNsaWNrKCk7XG4gICAgICAgICAgIGVsZW1lbnQuYWxsKGJ5LmNzcygnc2VsZWN0W25nLW1vZGVsPVwibXlDb2xvclwiXSBvcHRpb24nKSkuZmlyc3QoKS5jbGljaygpO1xuICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0nKSkuZ2V0VGV4dCgpKS50b01hdGNoKCdibGFjaycpO1xuICAgICAgICAgICBlbGVtZW50KGJ5LmNzcygnLm51bGxhYmxlIHNlbGVjdFtuZy1tb2RlbD1cIm15Q29sb3JcIl0nKSkuY2xpY2soKTtcbiAgICAgICAgICAgZWxlbWVudC5hbGwoYnkuY3NzKCcubnVsbGFibGUgc2VsZWN0W25nLW1vZGVsPVwibXlDb2xvclwiXSBvcHRpb24nKSkuZmlyc3QoKS5jbGljaygpO1xuICAgICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd7c2VsZWN0ZWRfY29sb3I6bXlDb2xvcn0nKSkuZ2V0VGV4dCgpKS50b01hdGNoKCdudWxsJyk7XG4gICAgICAgICB9KTtcbiAgICAgIDwvZmlsZT5cbiAgICA8L2V4YW1wbGU+XG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLy8gICAgICAgICAgICAgICAgICAgICAvLzAwMDAxMTExMTExMTExMDAwMDAwMDAwMDAyMjIyMjIyMjIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzMzMzMzMzMzMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NDQ0NDQ0NDQ0NDAwMDAwMDAwMDAwMDA1NTU1NTU1NTU1NTU1MDAwMDAwMDAwNjY2NjY2NjY2NjY2NjAwMDAwMDA3Nzc3Nzc3Nzc3Nzc3MDAwMDAwMDAwMDAwMDAwODg4ODg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDA5OTk5OTk5OTk5XG52YXIgTkdfT1BUSU9OU19SRUdFWFAgPSAvXlxccyooW1xcc1xcU10rPykoPzpcXHMrYXNcXHMrKFtcXHNcXFNdKz8pKT8oPzpcXHMrZ3JvdXBcXHMrYnlcXHMrKFtcXHNcXFNdKz8pKT8oPzpcXHMrZGlzYWJsZVxccyt3aGVuXFxzKyhbXFxzXFxTXSs/KSk/XFxzK2ZvclxccysoPzooWyRcXHddWyRcXHddKil8KD86XFwoXFxzKihbJFxcd11bJFxcd10qKVxccyosXFxzKihbJFxcd11bJFxcd10qKVxccypcXCkpKVxccytpblxccysoW1xcc1xcU10rPykoPzpcXHMrdHJhY2tcXHMrYnlcXHMrKFtcXHNcXFNdKz8pKT8kLztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhbHVlIGV4cHJlc3Npb24gKHZhbHVlRm4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiBsYWJlbCBleHByZXNzaW9uIChkaXNwbGF5Rm4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzOiBncm91cCBieSBleHByZXNzaW9uIChncm91cEJ5Rm4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBkaXNhYmxlIHdoZW4gZXhwcmVzc2lvbiAoZGlzYWJsZVdoZW5GbilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDU6IGFycmF5IGl0ZW0gdmFyaWFibGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNjogb2JqZWN0IGl0ZW0ga2V5IHZhcmlhYmxlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDc6IG9iamVjdCBpdGVtIHZhbHVlIHZhcmlhYmxlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDg6IGNvbGxlY3Rpb24gZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gOTogdHJhY2sgYnkgZXhwcmVzc2lvblxuLyogZXNsaW50LWVuYWJsZSAqL1xuXG5cbnZhciBuZ09wdGlvbnNEaXJlY3RpdmUgPSBbJyRjb21waWxlJywgJyRkb2N1bWVudCcsICckcGFyc2UnLCBmdW5jdGlvbigkY29tcGlsZSwgJGRvY3VtZW50LCAkcGFyc2UpIHtcblxuICBmdW5jdGlvbiBwYXJzZU9wdGlvbnNFeHByZXNzaW9uKG9wdGlvbnNFeHAsIHNlbGVjdEVsZW1lbnQsIHNjb3BlKSB7XG5cbiAgICB2YXIgbWF0Y2ggPSBvcHRpb25zRXhwLm1hdGNoKE5HX09QVElPTlNfUkVHRVhQKTtcbiAgICBpZiAoIShtYXRjaCkpIHtcbiAgICAgIHRocm93IG5nT3B0aW9uc01pbkVycignaWV4cCcsXG4gICAgICAgICdFeHBlY3RlZCBleHByZXNzaW9uIGluIGZvcm0gb2YgJyArXG4gICAgICAgICdcXCdfc2VsZWN0XyAoYXMgX2xhYmVsXyk/IGZvciAoX2tleV8sKT9fdmFsdWVfIGluIF9jb2xsZWN0aW9uX1xcJycgK1xuICAgICAgICAnIGJ1dCBnb3QgXFwnezB9XFwnLiBFbGVtZW50OiB7MX0nLFxuICAgICAgICBvcHRpb25zRXhwLCBzdGFydGluZ1RhZyhzZWxlY3RFbGVtZW50KSk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgcGFydHMgZnJvbSB0aGUgbmdPcHRpb25zIGV4cHJlc3Npb25cblxuICAgIC8vIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGUgdmFsdWUgb2YgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cbiAgICB2YXIgdmFsdWVOYW1lID0gbWF0Y2hbNV0gfHwgbWF0Y2hbN107XG4gICAgLy8gVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoZSBrZXkgb2YgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cbiAgICB2YXIga2V5TmFtZSA9IG1hdGNoWzZdO1xuXG4gICAgLy8gQW4gZXhwcmVzc2lvbiB0aGF0IGdlbmVyYXRlcyB0aGUgdmlld1ZhbHVlIGZvciBhbiBvcHRpb24gaWYgdGhlcmUgaXMgYSBsYWJlbCBleHByZXNzaW9uXG4gICAgdmFyIHNlbGVjdEFzID0gLyBhcyAvLnRlc3QobWF0Y2hbMF0pICYmIG1hdGNoWzFdO1xuICAgIC8vIEFuIGV4cHJlc3Npb24gdGhhdCBpcyB1c2VkIHRvIHRyYWNrIHRoZSBpZCBvZiBlYWNoIG9iamVjdCBpbiB0aGUgb3B0aW9ucyBjb2xsZWN0aW9uXG4gICAgdmFyIHRyYWNrQnkgPSBtYXRjaFs5XTtcbiAgICAvLyBBbiBleHByZXNzaW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSB2aWV3VmFsdWUgZm9yIGFuIG9wdGlvbiBpZiB0aGVyZSBpcyBubyBsYWJlbCBleHByZXNzaW9uXG4gICAgdmFyIHZhbHVlRm4gPSAkcGFyc2UobWF0Y2hbMl0gPyBtYXRjaFsxXSA6IHZhbHVlTmFtZSk7XG4gICAgdmFyIHNlbGVjdEFzRm4gPSBzZWxlY3RBcyAmJiAkcGFyc2Uoc2VsZWN0QXMpO1xuICAgIHZhciB2aWV3VmFsdWVGbiA9IHNlbGVjdEFzRm4gfHwgdmFsdWVGbjtcbiAgICB2YXIgdHJhY2tCeUZuID0gdHJhY2tCeSAmJiAkcGFyc2UodHJhY2tCeSk7XG5cbiAgICAvLyBHZXQgdGhlIHZhbHVlIGJ5IHdoaWNoIHdlIGFyZSBnb2luZyB0byB0cmFjayB0aGUgb3B0aW9uXG4gICAgLy8gaWYgd2UgaGF2ZSBhIHRyYWNrRm4gdGhlbiB1c2UgdGhhdCAocGFzc2luZyBzY29wZSBhbmQgbG9jYWxzKVxuICAgIC8vIG90aGVyd2lzZSBqdXN0IGhhc2ggdGhlIGdpdmVuIHZpZXdWYWx1ZVxuICAgIHZhciBnZXRUcmFja0J5VmFsdWVGbiA9IHRyYWNrQnkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odmFsdWUsIGxvY2FscykgeyByZXR1cm4gdHJhY2tCeUZuKHNjb3BlLCBsb2NhbHMpOyB9IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldEhhc2hPZlZhbHVlKHZhbHVlKSB7IHJldHVybiBoYXNoS2V5KHZhbHVlKTsgfTtcbiAgICB2YXIgZ2V0VHJhY2tCeVZhbHVlID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuIGdldFRyYWNrQnlWYWx1ZUZuKHZhbHVlLCBnZXRMb2NhbHModmFsdWUsIGtleSkpO1xuICAgIH07XG5cbiAgICB2YXIgZGlzcGxheUZuID0gJHBhcnNlKG1hdGNoWzJdIHx8IG1hdGNoWzFdKTtcbiAgICB2YXIgZ3JvdXBCeUZuID0gJHBhcnNlKG1hdGNoWzNdIHx8ICcnKTtcbiAgICB2YXIgZGlzYWJsZVdoZW5GbiA9ICRwYXJzZShtYXRjaFs0XSB8fCAnJyk7XG4gICAgdmFyIHZhbHVlc0ZuID0gJHBhcnNlKG1hdGNoWzhdKTtcblxuICAgIHZhciBsb2NhbHMgPSB7fTtcbiAgICB2YXIgZ2V0TG9jYWxzID0ga2V5TmFtZSA/IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIGxvY2Fsc1trZXlOYW1lXSA9IGtleTtcbiAgICAgIGxvY2Fsc1t2YWx1ZU5hbWVdID0gdmFsdWU7XG4gICAgICByZXR1cm4gbG9jYWxzO1xuICAgIH0gOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgbG9jYWxzW3ZhbHVlTmFtZV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBsb2NhbHM7XG4gICAgfTtcblxuXG4gICAgZnVuY3Rpb24gT3B0aW9uKHNlbGVjdFZhbHVlLCB2aWV3VmFsdWUsIGxhYmVsLCBncm91cCwgZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0VmFsdWUgPSBzZWxlY3RWYWx1ZTtcbiAgICAgIHRoaXMudmlld1ZhbHVlID0gdmlld1ZhbHVlO1xuICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICAgICAgdGhpcy5ncm91cCA9IGdyb3VwO1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE9wdGlvblZhbHVlc0tleXMob3B0aW9uVmFsdWVzKSB7XG4gICAgICB2YXIgb3B0aW9uVmFsdWVzS2V5cztcblxuICAgICAgaWYgKCFrZXlOYW1lICYmIGlzQXJyYXlMaWtlKG9wdGlvblZhbHVlcykpIHtcbiAgICAgICAgb3B0aW9uVmFsdWVzS2V5cyA9IG9wdGlvblZhbHVlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIG9iamVjdCwgZXh0cmFjdCBrZXlzLCBpbiBlbnVtZXJhdGlvbiBvcmRlciwgdW5zb3J0ZWRcbiAgICAgICAgb3B0aW9uVmFsdWVzS2V5cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpdGVtS2V5IGluIG9wdGlvblZhbHVlcykge1xuICAgICAgICAgIGlmIChvcHRpb25WYWx1ZXMuaGFzT3duUHJvcGVydHkoaXRlbUtleSkgJiYgaXRlbUtleS5jaGFyQXQoMCkgIT09ICckJykge1xuICAgICAgICAgICAgb3B0aW9uVmFsdWVzS2V5cy5wdXNoKGl0ZW1LZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvblZhbHVlc0tleXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrQnk6IHRyYWNrQnksXG4gICAgICBnZXRUcmFja0J5VmFsdWU6IGdldFRyYWNrQnlWYWx1ZSxcbiAgICAgIGdldFdhdGNoYWJsZXM6ICRwYXJzZSh2YWx1ZXNGbiwgZnVuY3Rpb24ob3B0aW9uVmFsdWVzKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHRoYXQgd2Ugd291bGQgbGlrZSB0byB3YXRjaCAod2F0Y2hlZEFycmF5KVxuICAgICAgICAvLyBzbyB0aGF0IHRoZXkgY2FuIGFsbCBiZSB3YXRjaGVkIHVzaW5nIGEgc2luZ2xlICR3YXRjaENvbGxlY3Rpb25cbiAgICAgICAgLy8gdGhhdCBvbmx5IHJ1bnMgdGhlIGhhbmRsZXIgb25jZSBpZiBhbnl0aGluZyBjaGFuZ2VzXG4gICAgICAgIHZhciB3YXRjaGVkQXJyYXkgPSBbXTtcbiAgICAgICAgb3B0aW9uVmFsdWVzID0gb3B0aW9uVmFsdWVzIHx8IFtdO1xuXG4gICAgICAgIHZhciBvcHRpb25WYWx1ZXNLZXlzID0gZ2V0T3B0aW9uVmFsdWVzS2V5cyhvcHRpb25WYWx1ZXMpO1xuICAgICAgICB2YXIgb3B0aW9uVmFsdWVzTGVuZ3RoID0gb3B0aW9uVmFsdWVzS2V5cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBvcHRpb25WYWx1ZXNMZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICB2YXIga2V5ID0gKG9wdGlvblZhbHVlcyA9PT0gb3B0aW9uVmFsdWVzS2V5cykgPyBpbmRleCA6IG9wdGlvblZhbHVlc0tleXNbaW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9wdGlvblZhbHVlc1trZXldO1xuXG4gICAgICAgICAgdmFyIGxvY2FscyA9IGdldExvY2Fscyh2YWx1ZSwga2V5KTtcbiAgICAgICAgICB2YXIgc2VsZWN0VmFsdWUgPSBnZXRUcmFja0J5VmFsdWVGbih2YWx1ZSwgbG9jYWxzKTtcbiAgICAgICAgICB3YXRjaGVkQXJyYXkucHVzaChzZWxlY3RWYWx1ZSk7XG5cbiAgICAgICAgICAvLyBPbmx5IG5lZWQgdG8gd2F0Y2ggdGhlIGRpc3BsYXlGbiBpZiB0aGVyZSBpcyBhIHNwZWNpZmljIGxhYmVsIGV4cHJlc3Npb25cbiAgICAgICAgICBpZiAobWF0Y2hbMl0gfHwgbWF0Y2hbMV0pIHtcbiAgICAgICAgICAgIHZhciBsYWJlbCA9IGRpc3BsYXlGbihzY29wZSwgbG9jYWxzKTtcbiAgICAgICAgICAgIHdhdGNoZWRBcnJheS5wdXNoKGxhYmVsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPbmx5IG5lZWQgdG8gd2F0Y2ggdGhlIGRpc2FibGVXaGVuRm4gaWYgdGhlcmUgaXMgYSBzcGVjaWZpYyBkaXNhYmxlIGV4cHJlc3Npb25cbiAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgIHZhciBkaXNhYmxlV2hlbiA9IGRpc2FibGVXaGVuRm4oc2NvcGUsIGxvY2Fscyk7XG4gICAgICAgICAgICB3YXRjaGVkQXJyYXkucHVzaChkaXNhYmxlV2hlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXRjaGVkQXJyYXk7XG4gICAgICB9KSxcblxuICAgICAgZ2V0T3B0aW9uczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIG9wdGlvbkl0ZW1zID0gW107XG4gICAgICAgIHZhciBzZWxlY3RWYWx1ZU1hcCA9IHt9O1xuXG4gICAgICAgIC8vIFRoZSBvcHRpb24gdmFsdWVzIHdlcmUgYWxyZWFkeSBjb21wdXRlZCBpbiB0aGUgYGdldFdhdGNoYWJsZXNgIGZuLFxuICAgICAgICAvLyB3aGljaCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgdG8gdHJpZ2dlciBgZ2V0T3B0aW9uc2BcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlcyA9IHZhbHVlc0ZuKHNjb3BlKSB8fCBbXTtcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlc0tleXMgPSBnZXRPcHRpb25WYWx1ZXNLZXlzKG9wdGlvblZhbHVlcyk7XG4gICAgICAgIHZhciBvcHRpb25WYWx1ZXNMZW5ndGggPSBvcHRpb25WYWx1ZXNLZXlzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgb3B0aW9uVmFsdWVzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgdmFyIGtleSA9IChvcHRpb25WYWx1ZXMgPT09IG9wdGlvblZhbHVlc0tleXMpID8gaW5kZXggOiBvcHRpb25WYWx1ZXNLZXlzW2luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvcHRpb25WYWx1ZXNba2V5XTtcbiAgICAgICAgICB2YXIgbG9jYWxzID0gZ2V0TG9jYWxzKHZhbHVlLCBrZXkpO1xuICAgICAgICAgIHZhciB2aWV3VmFsdWUgPSB2aWV3VmFsdWVGbihzY29wZSwgbG9jYWxzKTtcbiAgICAgICAgICB2YXIgc2VsZWN0VmFsdWUgPSBnZXRUcmFja0J5VmFsdWVGbih2aWV3VmFsdWUsIGxvY2Fscyk7XG4gICAgICAgICAgdmFyIGxhYmVsID0gZGlzcGxheUZuKHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAgIHZhciBncm91cCA9IGdyb3VwQnlGbihzY29wZSwgbG9jYWxzKTtcbiAgICAgICAgICB2YXIgZGlzYWJsZWQgPSBkaXNhYmxlV2hlbkZuKHNjb3BlLCBsb2NhbHMpO1xuICAgICAgICAgIHZhciBvcHRpb25JdGVtID0gbmV3IE9wdGlvbihzZWxlY3RWYWx1ZSwgdmlld1ZhbHVlLCBsYWJlbCwgZ3JvdXAsIGRpc2FibGVkKTtcblxuICAgICAgICAgIG9wdGlvbkl0ZW1zLnB1c2gob3B0aW9uSXRlbSk7XG4gICAgICAgICAgc2VsZWN0VmFsdWVNYXBbc2VsZWN0VmFsdWVdID0gb3B0aW9uSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXRlbXM6IG9wdGlvbkl0ZW1zLFxuICAgICAgICAgIHNlbGVjdFZhbHVlTWFwOiBzZWxlY3RWYWx1ZU1hcCxcbiAgICAgICAgICBnZXRPcHRpb25Gcm9tVmlld1ZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdFZhbHVlTWFwW2dldFRyYWNrQnlWYWx1ZSh2YWx1ZSldO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbjogZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmlld1ZhbHVlIGNvdWxkIGJlIGFuIG9iamVjdCB0aGF0IG1heSBiZSBtdXRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbixcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgYW5kIG5vdCByZXR1cm4gdGhlIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUgb24gdGhlIG9wdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB0cmFja0J5ID8gY29weShvcHRpb24udmlld1ZhbHVlKSA6IG9wdGlvbi52aWV3VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuXG4gIC8vIHdlIGNhbid0IGp1c3QganFMaXRlKCc8b3B0aW9uPicpIHNpbmNlIGpxTGl0ZSBpcyBub3Qgc21hcnQgZW5vdWdoXG4gIC8vIHRvIGNyZWF0ZSBpdCBpbiA8c2VsZWN0PiBhbmQgSUUgYmFyZnMgb3RoZXJ3aXNlLlxuICB2YXIgb3B0aW9uVGVtcGxhdGUgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyksXG4gICAgICBvcHRHcm91cFRlbXBsYXRlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJyk7XG5cbiAgICBmdW5jdGlvbiBuZ09wdGlvbnNQb3N0TGluayhzY29wZSwgc2VsZWN0RWxlbWVudCwgYXR0ciwgY3RybHMpIHtcblxuICAgICAgdmFyIHNlbGVjdEN0cmwgPSBjdHJsc1swXTtcbiAgICAgIHZhciBuZ01vZGVsQ3RybCA9IGN0cmxzWzFdO1xuICAgICAgdmFyIG11bHRpcGxlID0gYXR0ci5tdWx0aXBsZTtcblxuICAgICAgLy8gVGhlIGVtcHR5T3B0aW9uIGFsbG93cyB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIHByb3ZpZGUgdGhlaXIgb3duIGN1c3RvbSBcImVtcHR5XCJcbiAgICAgIC8vIG9wdGlvbiB3aGVuIHRoZSB2aWV3VmFsdWUgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBvcHRpb24gdmFsdWVzLlxuICAgICAgZm9yICh2YXIgaSA9IDAsIGNoaWxkcmVuID0gc2VsZWN0RWxlbWVudC5jaGlsZHJlbigpLCBpaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnZhbHVlID09PSAnJykge1xuICAgICAgICAgIHNlbGVjdEN0cmwuaGFzRW1wdHlPcHRpb24gPSB0cnVlO1xuICAgICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24gPSBjaGlsZHJlbi5lcShpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcHJvdmlkZWRFbXB0eU9wdGlvbiA9ICEhc2VsZWN0Q3RybC5lbXB0eU9wdGlvbjtcblxuICAgICAgdmFyIHVua25vd25PcHRpb24gPSBqcUxpdGUob3B0aW9uVGVtcGxhdGUuY2xvbmVOb2RlKGZhbHNlKSk7XG4gICAgICB1bmtub3duT3B0aW9uLnZhbCgnPycpO1xuXG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHZhciBuZ09wdGlvbnMgPSBwYXJzZU9wdGlvbnNFeHByZXNzaW9uKGF0dHIubmdPcHRpb25zLCBzZWxlY3RFbGVtZW50LCBzY29wZSk7XG4gICAgICAvLyBUaGlzIHN0b3JlcyB0aGUgbmV3bHkgY3JlYXRlZCBvcHRpb25zIGJlZm9yZSB0aGV5IGFyZSBhcHBlbmRlZCB0byB0aGUgc2VsZWN0LlxuICAgICAgLy8gU2luY2UgdGhlIGNvbnRlbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZyYWdtZW50IHdoZW4gaXQgaXMgYXBwZW5kZWQsXG4gICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gY3JlYXRlIGl0IG9uY2UuXG4gICAgICB2YXIgbGlzdEZyYWdtZW50ID0gJGRvY3VtZW50WzBdLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcblxuICAgICAgLy8gT3ZlcndyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbi4gbmdPcHRpb25zIGRvZXNuJ3QgdXNlIGhhc2hlc1xuICAgICAgc2VsZWN0Q3RybC5nZW5lcmF0ZVVua25vd25PcHRpb25WYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICByZXR1cm4gJz8nO1xuICAgICAgfTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBjb250cm9sbGVyIG1ldGhvZHMgZm9yIG11bHRpcGxlIHNlbGVjdGFibGUgb3B0aW9uc1xuICAgICAgaWYgKCFtdWx0aXBsZSkge1xuXG4gICAgICAgIHNlbGVjdEN0cmwud3JpdGVWYWx1ZSA9IGZ1bmN0aW9uIHdyaXRlTmdPcHRpb25zVmFsdWUodmFsdWUpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ZWRPcHRpb24gPSBvcHRpb25zLnNlbGVjdFZhbHVlTWFwW3NlbGVjdEVsZW1lbnQudmFsKCldO1xuICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zLmdldE9wdGlvbkZyb21WaWV3VmFsdWUodmFsdWUpO1xuXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlbW92ZSB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIGZyb20gdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgb3B0aW9uXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzY3JlZW4gcmVhZGVycyBtaWdodCBnZXQgY29uZnVzZWRcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHNlbGVjdGVkT3B0aW9uLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzZWxlY3RlZCcpO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIHRoZSBvcHRpb24gd2hlbiBpdCBpcyBhbHJlYWR5IHNlbGVjdGVkLlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHRoZSBicm93c2VyIHdpbGwgc2VsZWN0IHRoZSBmaXJzdCBvcHRpb24gYnkgZGVmYXVsdC4gSW4gdGhhdCBjYXNlLFxuICAgICAgICAgICAgLy8gbW9zdCBwcm9wZXJ0aWVzIGFyZSBzZXQgYXV0b21hdGljYWxseSAtIGV4Y2VwdCB0aGUgYHNlbGVjdGVkYCBhdHRyaWJ1dGUsIHdoaWNoIHdlXG4gICAgICAgICAgICAvLyBzZXQgYWx3YXlzXG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RFbGVtZW50WzBdLnZhbHVlICE9PSBvcHRpb24uc2VsZWN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVVbmtub3duT3B0aW9uKCk7XG4gICAgICAgICAgICAgIHNlbGVjdEN0cmwudW5zZWxlY3RFbXB0eU9wdGlvbigpO1xuXG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnRbMF0udmFsdWUgPSBvcHRpb24uc2VsZWN0VmFsdWU7XG4gICAgICAgICAgICAgIG9wdGlvbi5lbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3B0aW9uLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIGlmIChwcm92aWRlZEVtcHR5T3B0aW9uKSB7XG4gICAgICAgICAgICAgIHNlbGVjdEN0cmwuc2VsZWN0RW1wdHlPcHRpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0Q3RybC51bmtub3duT3B0aW9uLnBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICBzZWxlY3RDdHJsLnVwZGF0ZVVua25vd25PcHRpb24odmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5yZW5kZXJVbmtub3duT3B0aW9uKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc2VsZWN0Q3RybC5yZWFkVmFsdWUgPSBmdW5jdGlvbiByZWFkTmdPcHRpb25zVmFsdWUoKSB7XG5cbiAgICAgICAgICB2YXIgc2VsZWN0ZWRPcHRpb24gPSBvcHRpb25zLnNlbGVjdFZhbHVlTWFwW3NlbGVjdEVsZW1lbnQudmFsKCldO1xuXG4gICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uICYmICFzZWxlY3RlZE9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgc2VsZWN0Q3RybC51bnNlbGVjdEVtcHR5T3B0aW9uKCk7XG4gICAgICAgICAgICBzZWxlY3RDdHJsLnJlbW92ZVVua25vd25PcHRpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmdldFZpZXdWYWx1ZUZyb21PcHRpb24oc2VsZWN0ZWRPcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgYHRyYWNrIGJ5YCB0aGVuIHdlIG11c3Qgd2F0Y2ggdGhlIHRyYWNrZWQgdmFsdWUgb24gdGhlIG1vZGVsXG4gICAgICAgIC8vIHNpbmNlIG5nTW9kZWwgb25seSB3YXRjaGVzIGZvciBvYmplY3QgaWRlbnRpdHkgY2hhbmdlXG4gICAgICAgIC8vIEZJWE1FOiBXaGVuIGEgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiwgdGhpcyB3YXRjaCB3aWxsIGZpcmUgbmVlZGxlc3NseVxuICAgICAgICBpZiAobmdPcHRpb25zLnRyYWNrQnkpIHtcbiAgICAgICAgICBzY29wZS4kd2F0Y2goXG4gICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIG5nT3B0aW9ucy5nZXRUcmFja0J5VmFsdWUobmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSk7IH0sXG4gICAgICAgICAgICBmdW5jdGlvbigpIHsgbmdNb2RlbEN0cmwuJHJlbmRlcigpOyB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHNlbGVjdEN0cmwud3JpdGVWYWx1ZSA9IGZ1bmN0aW9uIHdyaXRlTmdPcHRpb25zTXVsdGlwbGUodmFsdWUpIHtcbiAgICAgICAgICBvcHRpb25zLml0ZW1zLmZvckVhY2goZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgICAgICBvcHRpb24uZWxlbWVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnMuZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZShpdGVtKTtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbikgb3B0aW9uLmVsZW1lbnQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgc2VsZWN0Q3RybC5yZWFkVmFsdWUgPSBmdW5jdGlvbiByZWFkTmdPcHRpb25zTXVsdGlwbGUoKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gc2VsZWN0RWxlbWVudC52YWwoKSB8fCBbXSxcbiAgICAgICAgICAgICAgc2VsZWN0aW9ucyA9IFtdO1xuXG4gICAgICAgICAgZm9yRWFjaChzZWxlY3RlZFZhbHVlcywgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zLnNlbGVjdFZhbHVlTWFwW3ZhbHVlXTtcbiAgICAgICAgICAgIGlmIChvcHRpb24gJiYgIW9wdGlvbi5kaXNhYmxlZCkgc2VsZWN0aW9ucy5wdXNoKG9wdGlvbnMuZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbihvcHRpb24pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25zO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyBgdHJhY2sgYnlgIHRoZW4gd2UgbXVzdCB3YXRjaCB0aGVzZSB0cmFja2VkIHZhbHVlcyBvbiB0aGUgbW9kZWxcbiAgICAgICAgLy8gc2luY2UgbmdNb2RlbCBvbmx5IHdhdGNoZXMgZm9yIG9iamVjdCBpZGVudGl0eSBjaGFuZ2VcbiAgICAgICAgaWYgKG5nT3B0aW9ucy50cmFja0J5KSB7XG5cbiAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkobmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5nTW9kZWxDdHJsLiR2aWV3VmFsdWUubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5nT3B0aW9ucy5nZXRUcmFja0J5VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm92aWRlZEVtcHR5T3B0aW9uKSB7XG5cbiAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgaXQgYmVmb3JlIGNhbGxpbmcgc2VsZWN0RWxlbWVudC5lbXB0eSgpIGJlY2F1c2Ugb3RoZXJ3aXNlIElFIHdpbGxcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50LiB3dGY/XG4gICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24ucmVtb3ZlKCk7XG5cbiAgICAgICAgLy8gY29tcGlsZSB0aGUgZWxlbWVudCBzaW5jZSB0aGVyZSBtaWdodCBiZSBiaW5kaW5ncyBpbiBpdFxuICAgICAgICAkY29tcGlsZShzZWxlY3RDdHJsLmVtcHR5T3B0aW9uKShzY29wZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdEN0cmwuZW1wdHlPcHRpb25bMF0ubm9kZVR5cGUgPT09IE5PREVfVFlQRV9DT01NRU5UKSB7XG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgZW1wdHkgb3B0aW9uIGhhcyBjdXJyZW50bHkgbm8gYWN0dWFsIERPTSBub2RlLCBwcm9iYWJseSBiZWNhdXNlXG4gICAgICAgICAgLy8gaXQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgYSB0cmFuc2NsdXNpb24gZGlyZWN0aXZlLlxuICAgICAgICAgIHNlbGVjdEN0cmwuaGFzRW1wdHlPcHRpb24gPSBmYWxzZTtcblxuICAgICAgICAgIC8vIFJlZGVmaW5lIHRoZSByZWdpc3Rlck9wdGlvbiBmdW5jdGlvbiwgd2hpY2ggd2lsbCBjYXRjaFxuICAgICAgICAgIC8vIG9wdGlvbnMgdGhhdCBhcmUgYWRkZWQgYnkgbmdJZiBldGMuIChyZW5kZXJpbmcgb2YgdGhlIG5vZGUgaXMgYXN5bmMgYmVjYXVzZSBvZlxuICAgICAgICAgIC8vIGxhenkgdHJhbnNjbHVzaW9uKVxuICAgICAgICAgIHNlbGVjdEN0cmwucmVnaXN0ZXJPcHRpb24gPSBmdW5jdGlvbihvcHRpb25TY29wZSwgb3B0aW9uRWwpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25FbC52YWwoKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5oYXNFbXB0eU9wdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24gPSBvcHRpb25FbDtcbiAgICAgICAgICAgICAgc2VsZWN0Q3RybC5lbXB0eU9wdGlvbi5yZW1vdmVDbGFzcygnbmctc2NvcGUnKTtcbiAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBuZXcgZW1wdHkgb3B0aW9uIGlzIHNlbGVjdGVkIGlmIHByZXZpb3VzbHkgbm8gb3B0aW9uIHdhcyBzZWxlY3RlZFxuICAgICAgICAgICAgICBuZ01vZGVsQ3RybC4kcmVuZGVyKCk7XG5cbiAgICAgICAgICAgICAgb3B0aW9uRWwub24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0Q3RybC5oYXNFbXB0eU9wdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNlbGVjdEN0cmwuZW1wdHlPcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGNsYXNzLCB3aGljaCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2Ugd2UgcmVjb21waWxlIHRoZSBlbGVtZW50IGFuZCBpdFxuICAgICAgICAgIC8vIGJlY29tZXMgdGhlIGNvbXBpbGF0aW9uIHJvb3RcbiAgICAgICAgICBzZWxlY3RDdHJsLmVtcHR5T3B0aW9uLnJlbW92ZUNsYXNzKCduZy1zY29wZScpO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgc2VsZWN0RWxlbWVudC5lbXB0eSgpO1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgb3B0aW9ucyBvYmplY3QgaXMgZGVmaW5lZFxuICAgICAgLy8gd2hlbiB3ZSBmaXJzdCBoaXQgaXQgaW4gd3JpdGVOZ09wdGlvbnNWYWx1ZVxuICAgICAgdXBkYXRlT3B0aW9ucygpO1xuXG4gICAgICAvLyBXZSB3aWxsIHJlLXJlbmRlciB0aGUgb3B0aW9uIGVsZW1lbnRzIGlmIHRoZSBvcHRpb24gdmFsdWVzIG9yIGxhYmVscyBjaGFuZ2VcbiAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24obmdPcHRpb25zLmdldFdhdGNoYWJsZXMsIHVwZGF0ZU9wdGlvbnMpO1xuXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAgICAgZnVuY3Rpb24gYWRkT3B0aW9uRWxlbWVudChvcHRpb24sIHBhcmVudCkge1xuICAgICAgICB2YXIgb3B0aW9uRWxlbWVudCA9IG9wdGlvblRlbXBsYXRlLmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgdXBkYXRlT3B0aW9uRWxlbWVudChvcHRpb24sIG9wdGlvbkVsZW1lbnQpO1xuICAgICAgfVxuXG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZU9wdGlvbkVsZW1lbnQob3B0aW9uLCBlbGVtZW50KSB7XG4gICAgICAgIG9wdGlvbi5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgZWxlbWVudC5kaXNhYmxlZCA9IG9wdGlvbi5kaXNhYmxlZDtcbiAgICAgICAgLy8gTk9URTogVGhlIGxhYmVsIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgdmFsdWUsIG90aGVyd2lzZSBJRTEwLzExL0VER0UgY3JlYXRlIHVucmVzcG9uc2l2ZVxuICAgICAgICAvLyBzZWxlY3RzIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyB3aGVuIG11bHRpcGxlIHNlbGVjdHMgYXJlIG5leHQgdG8gZWFjaCBvdGhlciBhbmQgZGlzcGxheVxuICAgICAgICAvLyB0aGUgb3B0aW9uIGxpc3QgaW4gbGlzdGJveCBzdHlsZSwgaS5lLiB0aGUgc2VsZWN0IGlzIFttdWx0aXBsZV0sIG9yIHNwZWNpZmllcyBhIFtzaXplXS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzExMzE0IGZvciBtb3JlIGluZm8uXG4gICAgICAgIC8vIFRoaXMgaXMgdW5mb3J0dW5hdGVseSB1bnRlc3RhYmxlIHdpdGggdW5pdCAvIGUyZSB0ZXN0c1xuICAgICAgICBpZiAob3B0aW9uLmxhYmVsICE9PSBlbGVtZW50LmxhYmVsKSB7XG4gICAgICAgICAgZWxlbWVudC5sYWJlbCA9IG9wdGlvbi5sYWJlbDtcbiAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uLmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSBvcHRpb24uc2VsZWN0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoKSB7XG4gICAgICAgIHZhciBwcmV2aW91c1ZhbHVlID0gb3B0aW9ucyAmJiBzZWxlY3RDdHJsLnJlYWRWYWx1ZSgpO1xuXG4gICAgICAgIC8vIFdlIG11c3QgcmVtb3ZlIGFsbCBjdXJyZW50IG9wdGlvbnMsIGJ1dCBjYW5ub3Qgc2ltcGx5IHNldCBpbm5lckhUTUwgPSBudWxsXG4gICAgICAgIC8vIHNpbmNlIHRoZSBwcm92aWRlZEVtcHR5T3B0aW9uIG1pZ2h0IGhhdmUgYW4gbmdJZiBvbiBpdCB0aGF0IGluc2VydHMgY29tbWVudHMgd2hpY2ggd2VcbiAgICAgICAgLy8gbXVzdCBwcmVzZXJ2ZS5cbiAgICAgICAgLy8gSW5zdGVhZCwgaXRlcmF0ZSBvdmVyIHRoZSBjdXJyZW50IG9wdGlvbiBlbGVtZW50cyBhbmQgcmVtb3ZlIHRoZW0gb3IgdGhlaXIgb3B0Z3JvdXBcbiAgICAgICAgLy8gcGFyZW50c1xuICAgICAgICBpZiAob3B0aW9ucykge1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IG9wdGlvbnMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBvcHRpb24gPSBvcHRpb25zLml0ZW1zW2ldO1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChvcHRpb24uZ3JvdXApKSB7XG4gICAgICAgICAgICAgIGpxTGl0ZVJlbW92ZShvcHRpb24uZWxlbWVudC5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGpxTGl0ZVJlbW92ZShvcHRpb24uZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA9IG5nT3B0aW9ucy5nZXRPcHRpb25zKCk7XG5cbiAgICAgICAgdmFyIGdyb3VwRWxlbWVudE1hcCA9IHt9O1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBlbXB0eSBvcHRpb24gaXMgYWx3YXlzIHRoZXJlIGlmIGl0IHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gICAgICAgIGlmIChwcm92aWRlZEVtcHR5T3B0aW9uKSB7XG4gICAgICAgICAgc2VsZWN0RWxlbWVudC5wcmVwZW5kKHNlbGVjdEN0cmwuZW1wdHlPcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIGFkZE9wdGlvbihvcHRpb24pIHtcbiAgICAgICAgICB2YXIgZ3JvdXBFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKGlzRGVmaW5lZChvcHRpb24uZ3JvdXApKSB7XG5cbiAgICAgICAgICAgIC8vIFRoaXMgb3B0aW9uIGlzIHRvIGxpdmUgaW4gYSBncm91cFxuICAgICAgICAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkIHRoaXMgZ3JvdXBcbiAgICAgICAgICAgIGdyb3VwRWxlbWVudCA9IGdyb3VwRWxlbWVudE1hcFtvcHRpb24uZ3JvdXBdO1xuXG4gICAgICAgICAgICBpZiAoIWdyb3VwRWxlbWVudCkge1xuXG4gICAgICAgICAgICAgIGdyb3VwRWxlbWVudCA9IG9wdEdyb3VwVGVtcGxhdGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgICAgbGlzdEZyYWdtZW50LmFwcGVuZENoaWxkKGdyb3VwRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsYWJlbCBvbiB0aGUgZ3JvdXAgZWxlbWVudFxuICAgICAgICAgICAgICAvLyBcIm51bGxcIiBpcyBzcGVjaWFsIGNhc2VkIGJlY2F1c2Ugb2YgU2FmYXJpXG4gICAgICAgICAgICAgIGdyb3VwRWxlbWVudC5sYWJlbCA9IG9wdGlvbi5ncm91cCA9PT0gbnVsbCA/ICdudWxsJyA6IG9wdGlvbi5ncm91cDtcblxuICAgICAgICAgICAgICAvLyBTdG9yZSBpdCBmb3IgdXNlIGxhdGVyXG4gICAgICAgICAgICAgIGdyb3VwRWxlbWVudE1hcFtvcHRpb24uZ3JvdXBdID0gZ3JvdXBFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRPcHRpb25FbGVtZW50KG9wdGlvbiwgZ3JvdXBFbGVtZW50KTtcblxuICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIC8vIFRoaXMgb3B0aW9uIGlzIG5vdCBpbiBhIGdyb3VwXG4gICAgICAgICAgICBhZGRPcHRpb25FbGVtZW50KG9wdGlvbiwgbGlzdEZyYWdtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlbGVjdEVsZW1lbnRbMF0uYXBwZW5kQ2hpbGQobGlzdEZyYWdtZW50KTtcblxuICAgICAgICBuZ01vZGVsQ3RybC4kcmVuZGVyKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCBkdWUgdG8gdGhlIHVwZGF0ZSB0byB0aGUgb3B0aW9uc1xuICAgICAgICBpZiAoIW5nTW9kZWxDdHJsLiRpc0VtcHR5KHByZXZpb3VzVmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5leHRWYWx1ZSA9IHNlbGVjdEN0cmwucmVhZFZhbHVlKCk7XG4gICAgICAgICAgdmFyIGlzTm90UHJpbWl0aXZlID0gbmdPcHRpb25zLnRyYWNrQnkgfHwgbXVsdGlwbGU7XG4gICAgICAgICAgaWYgKGlzTm90UHJpbWl0aXZlID8gIWVxdWFscyhwcmV2aW91c1ZhbHVlLCBuZXh0VmFsdWUpIDogcHJldmlvdXNWYWx1ZSAhPT0gbmV4dFZhbHVlKSB7XG4gICAgICAgICAgICBuZ01vZGVsQ3RybC4kc2V0Vmlld1ZhbHVlKG5leHRWYWx1ZSk7XG4gICAgICAgICAgICBuZ01vZGVsQ3RybC4kcmVuZGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICByZXF1aXJlOiBbJ3NlbGVjdCcsICduZ01vZGVsJ10sXG4gICAgbGluazoge1xuICAgICAgcHJlOiBmdW5jdGlvbiBuZ09wdGlvbnNQcmVMaW5rKHNjb3BlLCBzZWxlY3RFbGVtZW50LCBhdHRyLCBjdHJscykge1xuICAgICAgICAvLyBEZWFjdGl2YXRlIHRoZSBTZWxlY3RDb250cm9sbGVyLnJlZ2lzdGVyIG1ldGhvZCB0byBwcmV2ZW50XG4gICAgICAgIC8vIG9wdGlvbiBkaXJlY3RpdmVzIGZyb20gYWNjaWRlbnRhbGx5IHJlZ2lzdGVyaW5nIHRoZW1zZWx2ZXNcbiAgICAgICAgLy8gKGFuZCB1bndhbnRlZCAkZGVzdHJveSBoYW5kbGVycyBldGMuKVxuICAgICAgICBjdHJsc1swXS5yZWdpc3Rlck9wdGlvbiA9IG5vb3A7XG4gICAgICB9LFxuICAgICAgcG9zdDogbmdPcHRpb25zUG9zdExpbmtcbiAgICB9XG4gIH07XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1BsdXJhbGl6ZVxuICogQHJlc3RyaWN0IEVBXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBgbmdQbHVyYWxpemVgIGlzIGEgZGlyZWN0aXZlIHRoYXQgZGlzcGxheXMgbWVzc2FnZXMgYWNjb3JkaW5nIHRvIGVuLVVTIGxvY2FsaXphdGlvbiBydWxlcy5cbiAqIFRoZXNlIHJ1bGVzIGFyZSBidW5kbGVkIHdpdGggYW5ndWxhci5qcywgYnV0IGNhbiBiZSBvdmVycmlkZGVuXG4gKiAoc2VlIHtAbGluayBndWlkZS9pMThuIEFuZ3VsYXIgaTE4bn0gZGV2IGd1aWRlKS4gWW91IGNvbmZpZ3VyZSBuZ1BsdXJhbGl6ZSBkaXJlY3RpdmVcbiAqIGJ5IHNwZWNpZnlpbmcgdGhlIG1hcHBpbmdzIGJldHdlZW5cbiAqIFtwbHVyYWwgY2F0ZWdvcmllc10oaHR0cDovL3VuaWNvZGUub3JnL3JlcG9zL2NsZHItdG1wL3RydW5rL2RpZmYvc3VwcGxlbWVudGFsL2xhbmd1YWdlX3BsdXJhbF9ydWxlcy5odG1sKVxuICogYW5kIHRoZSBzdHJpbmdzIHRvIGJlIGRpc3BsYXllZC5cbiAqXG4gKiAjIFBsdXJhbCBjYXRlZ29yaWVzIGFuZCBleHBsaWNpdCBudW1iZXIgcnVsZXNcbiAqIFRoZXJlIGFyZSB0d29cbiAqIFtwbHVyYWwgY2F0ZWdvcmllc10oaHR0cDovL3VuaWNvZGUub3JnL3JlcG9zL2NsZHItdG1wL3RydW5rL2RpZmYvc3VwcGxlbWVudGFsL2xhbmd1YWdlX3BsdXJhbF9ydWxlcy5odG1sKVxuICogaW4gQW5ndWxhcidzIGRlZmF1bHQgZW4tVVMgbG9jYWxlOiBcIm9uZVwiIGFuZCBcIm90aGVyXCIuXG4gKlxuICogV2hpbGUgYSBwbHVyYWwgY2F0ZWdvcnkgbWF5IG1hdGNoIG1hbnkgbnVtYmVycyAoZm9yIGV4YW1wbGUsIGluIGVuLVVTIGxvY2FsZSwgXCJvdGhlclwiIGNhbiBtYXRjaFxuICogYW55IG51bWJlciB0aGF0IGlzIG5vdCAxKSwgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUgY2FuIG9ubHkgbWF0Y2ggb25lIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoZVxuICogZXhwbGljaXQgbnVtYmVyIHJ1bGUgZm9yIFwiM1wiIG1hdGNoZXMgdGhlIG51bWJlciAzLiBUaGVyZSBhcmUgZXhhbXBsZXMgb2YgcGx1cmFsIGNhdGVnb3JpZXNcbiAqIGFuZCBleHBsaWNpdCBudW1iZXIgcnVsZXMgdGhyb3VnaG91dCB0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50YXRpb24uXG4gKlxuICogIyBDb25maWd1cmluZyBuZ1BsdXJhbGl6ZVxuICogWW91IGNvbmZpZ3VyZSBuZ1BsdXJhbGl6ZSBieSBwcm92aWRpbmcgMiBhdHRyaWJ1dGVzOiBgY291bnRgIGFuZCBgd2hlbmAuXG4gKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhbiBvcHRpb25hbCBhdHRyaWJ1dGUsIGBvZmZzZXRgLlxuICpcbiAqIFRoZSB2YWx1ZSBvZiB0aGUgYGNvdW50YCBhdHRyaWJ1dGUgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvblxuICogQW5ndWxhciBleHByZXNzaW9ufTsgdGhlc2UgYXJlIGV2YWx1YXRlZCBvbiB0aGUgY3VycmVudCBzY29wZSBmb3IgaXRzIGJvdW5kIHZhbHVlLlxuICpcbiAqIFRoZSBgd2hlbmAgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgbWFwcGluZ3MgYmV0d2VlbiBwbHVyYWwgY2F0ZWdvcmllcyBhbmQgdGhlIGFjdHVhbFxuICogc3RyaW5nIHRvIGJlIGRpc3BsYXllZC4gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGEgSlNPTiBvYmplY3QuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjb25maWd1cmUgbmdQbHVyYWxpemU6XG4gKlxuICogYGBgaHRtbFxuICogPG5nLXBsdXJhbGl6ZSBjb3VudD1cInBlcnNvbkNvdW50XCJcbiAgICAgICAgICAgICAgICAgd2hlbj1cInsnMCc6ICdOb2JvZHkgaXMgdmlld2luZy4nLFxuICogICAgICAgICAgICAgICAgICAgICAgJ29uZSc6ICcxIHBlcnNvbiBpcyB2aWV3aW5nLicsXG4gKiAgICAgICAgICAgICAgICAgICAgICAnb3RoZXInOiAne30gcGVvcGxlIGFyZSB2aWV3aW5nLid9XCI+XG4gKiA8L25nLXBsdXJhbGl6ZT5cbiAqYGBgXG4gKlxuICogSW4gdGhlIGV4YW1wbGUsIGBcIjA6IE5vYm9keSBpcyB2aWV3aW5nLlwiYCBpcyBhbiBleHBsaWNpdCBudW1iZXIgcnVsZS4gSWYgeW91IGRpZCBub3RcbiAqIHNwZWNpZnkgdGhpcyBydWxlLCAwIHdvdWxkIGJlIG1hdGNoZWQgdG8gdGhlIFwib3RoZXJcIiBjYXRlZ29yeSBhbmQgXCIwIHBlb3BsZSBhcmUgdmlld2luZ1wiXG4gKiB3b3VsZCBiZSBzaG93biBpbnN0ZWFkIG9mIFwiTm9ib2R5IGlzIHZpZXdpbmdcIi4gWW91IGNhbiBzcGVjaWZ5IGFuIGV4cGxpY2l0IG51bWJlciBydWxlIGZvclxuICogb3RoZXIgbnVtYmVycywgZm9yIGV4YW1wbGUgMTIsIHNvIHRoYXQgaW5zdGVhZCBvZiBzaG93aW5nIFwiMTIgcGVvcGxlIGFyZSB2aWV3aW5nXCIsIHlvdSBjYW5cbiAqIHNob3cgXCJhIGRvemVuIHBlb3BsZSBhcmUgdmlld2luZ1wiLlxuICpcbiAqIFlvdSBjYW4gdXNlIGEgc2V0IG9mIGNsb3NlZCBicmFjZXMgKGB7fWApIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBudW1iZXIgdGhhdCB5b3Ugd2FudCBzdWJzdGl0dXRlZFxuICogaW50byBwbHVyYWxpemVkIHN0cmluZ3MuIEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCBBbmd1bGFyIHdpbGwgcmVwbGFjZSBge31gIHdpdGhcbiAqIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT5ge3twZXJzb25Db3VudH19YDwvc3Bhbj4uIFRoZSBjbG9zZWQgYnJhY2VzIGB7fWAgaXMgYSBwbGFjZWhvbGRlclxuICogZm9yIDxzcGFuIG5nLW5vbi1iaW5kYWJsZT57e251bWJlckV4cHJlc3Npb259fTwvc3Bhbj4uXG4gKlxuICogSWYgbm8gcnVsZSBpcyBkZWZpbmVkIGZvciBhIGNhdGVnb3J5LCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyBkaXNwbGF5ZWQgYW5kIGEgd2FybmluZyBpcyBnZW5lcmF0ZWQuXG4gKiBOb3RlIHRoYXQgc29tZSBsb2NhbGVzIGRlZmluZSBtb3JlIGNhdGVnb3JpZXMgdGhhbiBgb25lYCBhbmQgYG90aGVyYC4gRm9yIGV4YW1wbGUsIGZyLWZyIGRlZmluZXMgYGZld2AgYW5kIGBtYW55YC5cbiAqXG4gKiAjIENvbmZpZ3VyaW5nIG5nUGx1cmFsaXplIHdpdGggb2Zmc2V0XG4gKiBUaGUgYG9mZnNldGAgYXR0cmlidXRlIGFsbG93cyBmdXJ0aGVyIGN1c3RvbWl6YXRpb24gb2YgcGx1cmFsaXplZCB0ZXh0LCB3aGljaCBjYW4gcmVzdWx0IGluXG4gKiBhIGJldHRlciB1c2VyIGV4cGVyaWVuY2UuIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIHRoZSBtZXNzYWdlIFwiNCBwZW9wbGUgYXJlIHZpZXdpbmcgdGhpcyBkb2N1bWVudFwiLFxuICogeW91IG1pZ2h0IGRpc3BsYXkgXCJKb2huLCBLYXRlIGFuZCAyIG90aGVycyBhcmUgdmlld2luZyB0aGlzIGRvY3VtZW50XCIuXG4gKiBUaGUgb2Zmc2V0IGF0dHJpYnV0ZSBhbGxvd3MgeW91IHRvIG9mZnNldCBhIG51bWJlciBieSBhbnkgZGVzaXJlZCB2YWx1ZS5cbiAqIExldCdzIHRha2UgYSBsb29rIGF0IGFuIGV4YW1wbGU6XG4gKlxuICogYGBgaHRtbFxuICogPG5nLXBsdXJhbGl6ZSBjb3VudD1cInBlcnNvbkNvdW50XCIgb2Zmc2V0PTJcbiAqICAgICAgICAgICAgICAgd2hlbj1cInsnMCc6ICdOb2JvZHkgaXMgdmlld2luZy4nLFxuICogICAgICAgICAgICAgICAgICAgICAgJzEnOiAne3twZXJzb24xfX0gaXMgdmlld2luZy4nLFxuICogICAgICAgICAgICAgICAgICAgICAgJzInOiAne3twZXJzb24xfX0gYW5kIHt7cGVyc29uMn19IGFyZSB2aWV3aW5nLicsXG4gKiAgICAgICAgICAgICAgICAgICAgICAnb25lJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQgb25lIG90aGVyIHBlcnNvbiBhcmUgdmlld2luZy4nLFxuICogICAgICAgICAgICAgICAgICAgICAgJ290aGVyJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQge30gb3RoZXIgcGVvcGxlIGFyZSB2aWV3aW5nLid9XCI+XG4gKiA8L25nLXBsdXJhbGl6ZT5cbiAqIGBgYFxuICpcbiAqIE5vdGljZSB0aGF0IHdlIGFyZSBzdGlsbCB1c2luZyB0d28gcGx1cmFsIGNhdGVnb3JpZXMob25lLCBvdGhlciksIGJ1dCB3ZSBhZGRlZFxuICogdGhyZWUgZXhwbGljaXQgbnVtYmVyIHJ1bGVzIDAsIDEgYW5kIDIuXG4gKiBXaGVuIG9uZSBwZXJzb24sIHBlcmhhcHMgSm9obiwgdmlld3MgdGhlIGRvY3VtZW50LCBcIkpvaG4gaXMgdmlld2luZ1wiIHdpbGwgYmUgc2hvd24uXG4gKiBXaGVuIHRocmVlIHBlb3BsZSB2aWV3IHRoZSBkb2N1bWVudCwgbm8gZXhwbGljaXQgbnVtYmVyIHJ1bGUgaXMgZm91bmQsIHNvXG4gKiBhbiBvZmZzZXQgb2YgMiBpcyB0YWtlbiBvZmYgMywgYW5kIEFuZ3VsYXIgdXNlcyAxIHRvIGRlY2lkZSB0aGUgcGx1cmFsIGNhdGVnb3J5LlxuICogSW4gdGhpcyBjYXNlLCBwbHVyYWwgY2F0ZWdvcnkgJ29uZScgaXMgbWF0Y2hlZCBhbmQgXCJKb2huLCBNYXJ5IGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nXCJcbiAqIGlzIHNob3duLlxuICpcbiAqIE5vdGUgdGhhdCB3aGVuIHlvdSBzcGVjaWZ5IG9mZnNldHMsIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgbnVtYmVyIHJ1bGVzIGZvclxuICogbnVtYmVycyBmcm9tIDAgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgb2Zmc2V0LiBJZiB5b3UgdXNlIGFuIG9mZnNldCBvZiAzLCBmb3IgZXhhbXBsZSxcbiAqIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgbnVtYmVyIHJ1bGVzIGZvciAwLCAxLCAyIGFuZCAzLiBZb3UgbXVzdCBhbHNvIHByb3ZpZGUgcGx1cmFsIHN0cmluZ3MgZm9yXG4gKiBwbHVyYWwgY2F0ZWdvcmllcyBcIm9uZVwiIGFuZCBcIm90aGVyXCIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8ZXhwcmVzc2lvbn0gY291bnQgVGhlIHZhcmlhYmxlIHRvIGJlIGJvdW5kIHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHdoZW4gVGhlIG1hcHBpbmcgYmV0d2VlbiBwbHVyYWwgY2F0ZWdvcnkgdG8gaXRzIGNvcnJlc3BvbmRpbmcgc3RyaW5ncy5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gb2Zmc2V0IE9mZnNldCB0byBkZWR1Y3QgZnJvbSB0aGUgdG90YWwgbnVtYmVyLlxuICpcbiAqIEBleGFtcGxlXG4gICAgPGV4YW1wbGUgbW9kdWxlPVwicGx1cmFsaXplRXhhbXBsZVwiIG5hbWU9XCJuZy1wbHVyYWxpemVcIj5cbiAgICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgYW5ndWxhci5tb2R1bGUoJ3BsdXJhbGl6ZUV4YW1wbGUnLCBbXSlcbiAgICAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICAgICAgICRzY29wZS5wZXJzb24xID0gJ0lnb3InO1xuICAgICAgICAgICAgICAkc2NvcGUucGVyc29uMiA9ICdNaXNrbyc7XG4gICAgICAgICAgICAgICRzY29wZS5wZXJzb25Db3VudCA9IDE7XG4gICAgICAgICAgICB9XSk7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICAgICAgICAgIDxsYWJlbD5QZXJzb24gMTo8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cInBlcnNvbjFcIiB2YWx1ZT1cIklnb3JcIiAvPjwvbGFiZWw+PGJyLz5cbiAgICAgICAgICA8bGFiZWw+UGVyc29uIDI6PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJwZXJzb24yXCIgdmFsdWU9XCJNaXNrb1wiIC8+PC9sYWJlbD48YnIvPlxuICAgICAgICAgIDxsYWJlbD5OdW1iZXIgb2YgUGVvcGxlOjxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwicGVyc29uQ291bnRcIiB2YWx1ZT1cIjFcIiAvPjwvbGFiZWw+PGJyLz5cblxuICAgICAgICAgIDwhLS0tIEV4YW1wbGUgd2l0aCBzaW1wbGUgcGx1cmFsaXphdGlvbiBydWxlcyBmb3IgZW4gbG9jYWxlIC0tLT5cbiAgICAgICAgICBXaXRob3V0IE9mZnNldDpcbiAgICAgICAgICA8bmctcGx1cmFsaXplIGNvdW50PVwicGVyc29uQ291bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlbj1cInsnMCc6ICdOb2JvZHkgaXMgdmlld2luZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmUnOiAnMSBwZXJzb24gaXMgdmlld2luZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7fSBwZW9wbGUgYXJlIHZpZXdpbmcuJ31cIj5cbiAgICAgICAgICA8L25nLXBsdXJhbGl6ZT48YnI+XG5cbiAgICAgICAgICA8IS0tLSBFeGFtcGxlIHdpdGggb2Zmc2V0IC0tLT5cbiAgICAgICAgICBXaXRoIE9mZnNldCgyKTpcbiAgICAgICAgICA8bmctcGx1cmFsaXplIGNvdW50PVwicGVyc29uQ291bnRcIiBvZmZzZXQ9MlxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlbj1cInsnMCc6ICdOb2JvZHkgaXMgdmlld2luZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxJzogJ3t7cGVyc29uMX19IGlzIHZpZXdpbmcuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMic6ICd7e3BlcnNvbjF9fSBhbmQge3twZXJzb24yfX0gYXJlIHZpZXdpbmcuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25lJzogJ3t7cGVyc29uMX19LCB7e3BlcnNvbjJ9fSBhbmQgb25lIG90aGVyIHBlcnNvbiBhcmUgdmlld2luZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcic6ICd7e3BlcnNvbjF9fSwge3twZXJzb24yfX0gYW5kIHt9IG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nfVwiPlxuICAgICAgICAgIDwvbmctcGx1cmFsaXplPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZmlsZT5cbiAgICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICAgaXQoJ3Nob3VsZCBzaG93IGNvcnJlY3QgcGx1cmFsaXplZCBzdHJpbmcnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgd2l0aG91dE9mZnNldCA9IGVsZW1lbnQuYWxsKGJ5LmNzcygnbmctcGx1cmFsaXplJykpLmdldCgwKTtcbiAgICAgICAgICB2YXIgd2l0aE9mZnNldCA9IGVsZW1lbnQuYWxsKGJ5LmNzcygnbmctcGx1cmFsaXplJykpLmdldCgxKTtcbiAgICAgICAgICB2YXIgY291bnRJbnB1dCA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbkNvdW50JykpO1xuXG4gICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCcxIHBlcnNvbiBpcyB2aWV3aW5nLicpO1xuICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciBpcyB2aWV3aW5nLicpO1xuXG4gICAgICAgICAgY291bnRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzAnKTtcblxuICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnTm9ib2R5IGlzIHZpZXdpbmcuJyk7XG4gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdOb2JvZHkgaXMgdmlld2luZy4nKTtcblxuICAgICAgICAgIGNvdW50SW5wdXQuY2xlYXIoKTtcbiAgICAgICAgICBjb3VudElucHV0LnNlbmRLZXlzKCcyJyk7XG5cbiAgICAgICAgICBleHBlY3Qod2l0aG91dE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJzIgcGVvcGxlIGFyZSB2aWV3aW5nLicpO1xuICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnSWdvciBhbmQgTWlza28gYXJlIHZpZXdpbmcuJyk7XG5cbiAgICAgICAgICBjb3VudElucHV0LmNsZWFyKCk7XG4gICAgICAgICAgY291bnRJbnB1dC5zZW5kS2V5cygnMycpO1xuXG4gICAgICAgICAgZXhwZWN0KHdpdGhvdXRPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCczIHBlb3BsZSBhcmUgdmlld2luZy4nKTtcbiAgICAgICAgICBleHBlY3Qod2l0aE9mZnNldC5nZXRUZXh0KCkpLnRvRXF1YWwoJ0lnb3IsIE1pc2tvIGFuZCBvbmUgb3RoZXIgcGVyc29uIGFyZSB2aWV3aW5nLicpO1xuXG4gICAgICAgICAgY291bnRJbnB1dC5jbGVhcigpO1xuICAgICAgICAgIGNvdW50SW5wdXQuc2VuZEtleXMoJzQnKTtcblxuICAgICAgICAgIGV4cGVjdCh3aXRob3V0T2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnNCBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7XG4gICAgICAgICAgZXhwZWN0KHdpdGhPZmZzZXQuZ2V0VGV4dCgpKS50b0VxdWFsKCdJZ29yLCBNaXNrbyBhbmQgMiBvdGhlciBwZW9wbGUgYXJlIHZpZXdpbmcuJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHNob3cgZGF0YS1ib3VuZCBuYW1lcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB3aXRoT2Zmc2V0ID0gZWxlbWVudC5hbGwoYnkuY3NzKCduZy1wbHVyYWxpemUnKSkuZ2V0KDEpO1xuICAgICAgICAgIHZhciBwZXJzb25Db3VudCA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbkNvdW50JykpO1xuICAgICAgICAgIHZhciBwZXJzb24xID0gZWxlbWVudChieS5tb2RlbCgncGVyc29uMScpKTtcbiAgICAgICAgICB2YXIgcGVyc29uMiA9IGVsZW1lbnQoYnkubW9kZWwoJ3BlcnNvbjInKSk7XG4gICAgICAgICAgcGVyc29uQ291bnQuY2xlYXIoKTtcbiAgICAgICAgICBwZXJzb25Db3VudC5zZW5kS2V5cygnNCcpO1xuICAgICAgICAgIHBlcnNvbjEuY2xlYXIoKTtcbiAgICAgICAgICBwZXJzb24xLnNlbmRLZXlzKCdEaScpO1xuICAgICAgICAgIHBlcnNvbjIuY2xlYXIoKTtcbiAgICAgICAgICBwZXJzb24yLnNlbmRLZXlzKCdWb2p0YScpO1xuICAgICAgICAgIGV4cGVjdCh3aXRoT2Zmc2V0LmdldFRleHQoKSkudG9FcXVhbCgnRGksIFZvanRhIGFuZCAyIG90aGVyIHBlb3BsZSBhcmUgdmlld2luZy4nKTtcbiAgICAgICAgfSk7XG4gICAgICA8L2ZpbGU+XG4gICAgPC9leGFtcGxlPlxuICovXG52YXIgbmdQbHVyYWxpemVEaXJlY3RpdmUgPSBbJyRsb2NhbGUnLCAnJGludGVycG9sYXRlJywgJyRsb2cnLCBmdW5jdGlvbigkbG9jYWxlLCAkaW50ZXJwb2xhdGUsICRsb2cpIHtcbiAgdmFyIEJSQUNFID0gL3t9L2csXG4gICAgICBJU19XSEVOID0gL153aGVuKE1pbnVzKT8oLispJC87XG5cbiAgcmV0dXJuIHtcbiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cikge1xuICAgICAgdmFyIG51bWJlckV4cCA9IGF0dHIuY291bnQsXG4gICAgICAgICAgd2hlbkV4cCA9IGF0dHIuJGF0dHIud2hlbiAmJiBlbGVtZW50LmF0dHIoYXR0ci4kYXR0ci53aGVuKSwgLy8gd2UgaGF2ZSB7e319IGluIGF0dHJzXG4gICAgICAgICAgb2Zmc2V0ID0gYXR0ci5vZmZzZXQgfHwgMCxcbiAgICAgICAgICB3aGVucyA9IHNjb3BlLiRldmFsKHdoZW5FeHApIHx8IHt9LFxuICAgICAgICAgIHdoZW5zRXhwRm5zID0ge30sXG4gICAgICAgICAgc3RhcnRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuc3RhcnRTeW1ib2woKSxcbiAgICAgICAgICBlbmRTeW1ib2wgPSAkaW50ZXJwb2xhdGUuZW5kU3ltYm9sKCksXG4gICAgICAgICAgYnJhY2VSZXBsYWNlbWVudCA9IHN0YXJ0U3ltYm9sICsgbnVtYmVyRXhwICsgJy0nICsgb2Zmc2V0ICsgZW5kU3ltYm9sLFxuICAgICAgICAgIHdhdGNoUmVtb3ZlciA9IGFuZ3VsYXIubm9vcCxcbiAgICAgICAgICBsYXN0Q291bnQ7XG5cbiAgICAgIGZvckVhY2goYXR0ciwgZnVuY3Rpb24oZXhwcmVzc2lvbiwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICB2YXIgdG1wTWF0Y2ggPSBJU19XSEVOLmV4ZWMoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIGlmICh0bXBNYXRjaCkge1xuICAgICAgICAgIHZhciB3aGVuS2V5ID0gKHRtcE1hdGNoWzFdID8gJy0nIDogJycpICsgbG93ZXJjYXNlKHRtcE1hdGNoWzJdKTtcbiAgICAgICAgICB3aGVuc1t3aGVuS2V5XSA9IGVsZW1lbnQuYXR0cihhdHRyLiRhdHRyW2F0dHJpYnV0ZU5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmb3JFYWNoKHdoZW5zLCBmdW5jdGlvbihleHByZXNzaW9uLCBrZXkpIHtcbiAgICAgICAgd2hlbnNFeHBGbnNba2V5XSA9ICRpbnRlcnBvbGF0ZShleHByZXNzaW9uLnJlcGxhY2UoQlJBQ0UsIGJyYWNlUmVwbGFjZW1lbnQpKTtcblxuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLiR3YXRjaChudW1iZXJFeHAsIGZ1bmN0aW9uIG5nUGx1cmFsaXplV2F0Y2hBY3Rpb24obmV3VmFsKSB7XG4gICAgICAgIHZhciBjb3VudCA9IHBhcnNlRmxvYXQobmV3VmFsKTtcbiAgICAgICAgdmFyIGNvdW50SXNOYU4gPSBpc051bWJlck5hTihjb3VudCk7XG5cbiAgICAgICAgaWYgKCFjb3VudElzTmFOICYmICEoY291bnQgaW4gd2hlbnMpKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhwbGljaXQgbnVtYmVyIHJ1bGUgc3VjaCBhcyAxLCAyLCAzLi4uIGlzIGRlZmluZWQsIGp1c3QgdXNlIGl0LlxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaXQgYWdhaW5zdCBwbHVyYWxpemF0aW9uIHJ1bGVzIGluICRsb2NhbGUgc2VydmljZS5cbiAgICAgICAgICBjb3VudCA9ICRsb2NhbGUucGx1cmFsQ2F0KGNvdW50IC0gb2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGJvdGggYGNvdW50YCBhbmQgYGxhc3RDb3VudGAgYXJlIE5hTiwgd2UgZG9uJ3QgbmVlZCB0byByZS1yZWdpc3RlciBhIHdhdGNoLlxuICAgICAgICAvLyBJbiBKUyBgTmFOICE9PSBOYU5gLCBzbyB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgY2hlY2suXG4gICAgICAgIGlmICgoY291bnQgIT09IGxhc3RDb3VudCkgJiYgIShjb3VudElzTmFOICYmIGlzTnVtYmVyTmFOKGxhc3RDb3VudCkpKSB7XG4gICAgICAgICAgd2F0Y2hSZW1vdmVyKCk7XG4gICAgICAgICAgdmFyIHdoZW5FeHBGbiA9IHdoZW5zRXhwRm5zW2NvdW50XTtcbiAgICAgICAgICBpZiAoaXNVbmRlZmluZWQod2hlbkV4cEZuKSkge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICRsb2cuZGVidWcoJ25nUGx1cmFsaXplOiBubyBydWxlIGRlZmluZWQgZm9yIFxcJycgKyBjb3VudCArICdcXCcgaW4gJyArIHdoZW5FeHApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2F0Y2hSZW1vdmVyID0gbm9vcDtcbiAgICAgICAgICAgIHVwZGF0ZUVsZW1lbnRUZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhdGNoUmVtb3ZlciA9IHNjb3BlLiR3YXRjaCh3aGVuRXhwRm4sIHVwZGF0ZUVsZW1lbnRUZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdENvdW50ID0gY291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50VGV4dChuZXdUZXh0KSB7XG4gICAgICAgIGVsZW1lbnQudGV4dChuZXdUZXh0IHx8ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XTtcblxuLyogZXhwb3J0ZWQgbmdSZXBlYXREaXJlY3RpdmUgKi9cblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1JlcGVhdFxuICogQG11bHRpRWxlbWVudFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBuZ1JlcGVhdGAgZGlyZWN0aXZlIGluc3RhbnRpYXRlcyBhIHRlbXBsYXRlIG9uY2UgcGVyIGl0ZW0gZnJvbSBhIGNvbGxlY3Rpb24uIEVhY2ggdGVtcGxhdGVcbiAqIGluc3RhbmNlIGdldHMgaXRzIG93biBzY29wZSwgd2hlcmUgdGhlIGdpdmVuIGxvb3AgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gaXRlbSxcbiAqIGFuZCBgJGluZGV4YCBpcyBzZXQgdG8gdGhlIGl0ZW0gaW5kZXggb3Iga2V5LlxuICpcbiAqIFNwZWNpYWwgcHJvcGVydGllcyBhcmUgZXhwb3NlZCBvbiB0aGUgbG9jYWwgc2NvcGUgb2YgZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZSwgaW5jbHVkaW5nOlxuICpcbiAqIHwgVmFyaWFibGUgIHwgVHlwZSAgICAgICAgICAgIHwgRGV0YWlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgYCRpbmRleGAgIHwge0B0eXBlIG51bWJlcn0gIHwgaXRlcmF0b3Igb2Zmc2V0IG9mIHRoZSByZXBlYXRlZCBlbGVtZW50ICgwLi5sZW5ndGgtMSkgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgYCRmaXJzdGAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBmaXJzdCBpbiB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgYCRtaWRkbGVgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBpbiB0aGUgaXRlcmF0b3IuIHxcbiAqIHwgYCRsYXN0YCAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgcmVwZWF0ZWQgZWxlbWVudCBpcyBsYXN0IGluIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgYCRldmVuYCAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgcG9zaXRpb24gYCRpbmRleGAgaXMgZXZlbiAob3RoZXJ3aXNlIGZhbHNlKS4gICAgICAgICAgIHxcbiAqIHwgYCRvZGRgICAgIHwge0B0eXBlIGJvb2xlYW59IHwgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgcG9zaXRpb24gYCRpbmRleGAgaXMgb2RkIChvdGhlcndpc2UgZmFsc2UpLiAgICAgICAgICAgIHxcbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICogICBDcmVhdGluZyBhbGlhc2VzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGlzIHBvc3NpYmxlIHdpdGgge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0luaXQgYG5nSW5pdGB9LlxuICogICBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiwgZm9yIGluc3RhbmNlLCBuZXN0aW5nIG5nUmVwZWF0cy5cbiAqIDwvZGl2PlxuICpcbiAqXG4gKiAjIEl0ZXJhdGluZyBvdmVyIG9iamVjdCBwcm9wZXJ0aWVzXG4gKlxuICogSXQgaXMgcG9zc2libGUgdG8gZ2V0IGBuZ1JlcGVhdGAgdG8gaXRlcmF0ZSBvdmVyIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCB1c2luZyB0aGUgZm9sbG93aW5nXG4gKiBzeW50YXg6XG4gKlxuICogYGBganNcbiAqIDxkaXYgbmctcmVwZWF0PVwiKGtleSwgdmFsdWUpIGluIG15T2JqXCI+IC4uLiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIGZldyBsaW1pdGF0aW9ucyBjb21wYXJlZCB0byBhcnJheSBpdGVyYXRpb246XG4gKlxuICogLSBUaGUgSmF2YVNjcmlwdCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGRlZmluZSB0aGUgb3JkZXIgb2Yga2V5c1xuICogICByZXR1cm5lZCBmb3IgYW4gb2JqZWN0LCBzbyBBbmd1bGFyIHJlbGllcyBvbiB0aGUgb3JkZXIgcmV0dXJuZWQgYnkgdGhlIGJyb3dzZXJcbiAqICAgd2hlbiBydW5uaW5nIGBmb3Iga2V5IGluIG15T2JqYC4gQnJvd3NlcnMgZ2VuZXJhbGx5IGZvbGxvdyB0aGUgc3RyYXRlZ3kgb2YgcHJvdmlkaW5nXG4gKiAgIGtleXMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkLCBhbHRob3VnaCB0aGVyZSBhcmUgZXhjZXB0aW9ucyB3aGVuIGtleXMgYXJlIGRlbGV0ZWRcbiAqICAgYW5kIHJlaW5zdGF0ZWQuIFNlZSB0aGVcbiAqICAgW01ETiBwYWdlIG9uIGBkZWxldGVgIGZvciBtb3JlIGluZm9dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9kZWxldGUjQ3Jvc3MtYnJvd3Nlcl9ub3RlcykuXG4gKlxuICogLSBgbmdSZXBlYXRgIHdpbGwgc2lsZW50bHkgKmlnbm9yZSogb2JqZWN0IGtleXMgc3RhcnRpbmcgd2l0aCBgJGAsIGJlY2F1c2VcbiAqICAgaXQncyBhIHByZWZpeCB1c2VkIGJ5IEFuZ3VsYXIgZm9yIHB1YmxpYyAoYCRgKSBhbmQgcHJpdmF0ZSAoYCQkYCkgcHJvcGVydGllcy5cbiAqXG4gKiAtIFRoZSBidWlsdC1pbiBmaWx0ZXJzIHtAbGluayBuZy5vcmRlckJ5IG9yZGVyQnl9IGFuZCB7QGxpbmsgbmcuZmlsdGVyIGZpbHRlcn0gZG8gbm90IHdvcmsgd2l0aFxuICogICBvYmplY3RzLCBhbmQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB1c2VkIHdpdGggb25lLlxuICpcbiAqIElmIHlvdSBhcmUgaGl0dGluZyBhbnkgb2YgdGhlc2UgbGltaXRhdGlvbnMsIHRoZSByZWNvbW1lbmRlZCB3b3JrYXJvdW5kIGlzIHRvIGNvbnZlcnQgeW91ciBvYmplY3QgaW50byBhbiBhcnJheVxuICogdGhhdCBpcyBzb3J0ZWQgaW50byB0aGUgb3JkZXIgdGhhdCB5b3UgcHJlZmVyIGJlZm9yZSBwcm92aWRpbmcgaXQgdG8gYG5nUmVwZWF0YC4gWW91IGNvdWxkXG4gKiBkbyB0aGlzIHdpdGggYSBmaWx0ZXIgc3VjaCBhcyBbdG9BcnJheUZpbHRlcl0oaHR0cDovL25nbW9kdWxlcy5vcmcvbW9kdWxlcy9hbmd1bGFyLXRvQXJyYXlGaWx0ZXIpXG4gKiBvciBpbXBsZW1lbnQgYSBgJHdhdGNoYCBvbiB0aGUgb2JqZWN0IHlvdXJzZWxmLlxuICpcbiAqXG4gKiAjIFRyYWNraW5nIGFuZCBEdXBsaWNhdGVzXG4gKlxuICogYG5nUmVwZWF0YCB1c2VzIHtAbGluayAkcm9vdFNjb3BlLlNjb3BlIyR3YXRjaENvbGxlY3Rpb24gJHdhdGNoQ29sbGVjdGlvbn0gdG8gZGV0ZWN0IGNoYW5nZXMgaW5cbiAqIHRoZSBjb2xsZWN0aW9uLiBXaGVuIGEgY2hhbmdlIGhhcHBlbnMsIGBuZ1JlcGVhdGAgdGhlbiBtYWtlcyB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvIHRoZSBET006XG4gKlxuICogKiBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQsIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpcyBhZGRlZCB0byB0aGUgRE9NLlxuICogKiBXaGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCwgaXRzIHRlbXBsYXRlIGluc3RhbmNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICogKiBXaGVuIGl0ZW1zIGFyZSByZW9yZGVyZWQsIHRoZWlyIHJlc3BlY3RpdmUgdGVtcGxhdGVzIGFyZSByZW9yZGVyZWQgaW4gdGhlIERPTS5cbiAqXG4gKiBUbyBtaW5pbWl6ZSBjcmVhdGlvbiBvZiBET00gZWxlbWVudHMsIGBuZ1JlcGVhdGAgdXNlcyBhIGZ1bmN0aW9uXG4gKiB0byBcImtlZXAgdHJhY2tcIiBvZiBhbGwgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgRE9NIGVsZW1lbnRzLlxuICogRm9yIGV4YW1wbGUsIGlmIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24sIGBuZ1JlcGVhdGAgd2lsbCBrbm93IHRoYXQgYWxsIG90aGVyIGl0ZW1zXG4gKiBhbHJlYWR5IGhhdmUgRE9NIGVsZW1lbnRzLCBhbmQgd2lsbCBub3QgcmUtcmVuZGVyIHRoZW0uXG4gKlxuICogVGhlIGRlZmF1bHQgdHJhY2tpbmcgZnVuY3Rpb24gKHdoaWNoIHRyYWNrcyBpdGVtcyBieSB0aGVpciBpZGVudGl0eSkgZG9lcyBub3QgYWxsb3dcbiAqIGR1cGxpY2F0ZSBpdGVtcyBpbiBhcnJheXMuIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHRoZXJlIGFyZSBkdXBsaWNhdGVzLCBpdCBpcyBub3QgcG9zc2libGVcbiAqIHRvIG1haW50YWluIGEgb25lLXRvLW9uZSBtYXBwaW5nIGJldHdlZW4gY29sbGVjdGlvbiBpdGVtcyBhbmQgRE9NIGVsZW1lbnRzLlxuICpcbiAqIElmIHlvdSBkbyBuZWVkIHRvIHJlcGVhdCBkdXBsaWNhdGUgaXRlbXMsIHlvdSBjYW4gc3Vic3RpdHV0ZSB0aGUgZGVmYXVsdCB0cmFja2luZyBiZWhhdmlvclxuICogd2l0aCB5b3VyIG93biB1c2luZyB0aGUgYHRyYWNrIGJ5YCBleHByZXNzaW9uLlxuICpcbiAqIEZvciBleGFtcGxlLCB5b3UgbWF5IHRyYWNrIGl0ZW1zIGJ5IHRoZSBpbmRleCBvZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24sIHVzaW5nIHRoZVxuICogc3BlY2lhbCBzY29wZSBwcm9wZXJ0eSBgJGluZGV4YDpcbiAqIGBgYGh0bWxcbiAqICAgIDxkaXYgbmctcmVwZWF0PVwibiBpbiBbNDIsIDQyLCA0MywgNDNdIHRyYWNrIGJ5ICRpbmRleFwiPlxuICogICAgICB7e259fVxuICogICAgPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBZb3UgbWF5IGFsc28gdXNlIGFyYml0cmFyeSBleHByZXNzaW9ucyBpbiBgdHJhY2sgYnlgLCBpbmNsdWRpbmcgcmVmZXJlbmNlcyB0byBjdXN0b20gZnVuY3Rpb25zXG4gKiBvbiB0aGUgc2NvcGU6XG4gKiBgYGBodG1sXG4gKiAgICA8ZGl2IG5nLXJlcGVhdD1cIm4gaW4gWzQyLCA0MiwgNDMsIDQzXSB0cmFjayBieSBteVRyYWNraW5nRnVuY3Rpb24obilcIj5cbiAqICAgICAge3tufX1cbiAqICAgIDwvZGl2PlxuICogYGBgXG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAqIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIG9iamVjdHMgdGhhdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIgcHJvcGVydHksIHlvdSBzaG91bGQgdHJhY2tcbiAqIGJ5IHRoaXMgaWRlbnRpZmllciBpbnN0ZWFkIG9mIHRoZSBvYmplY3QgaW5zdGFuY2UuIFNob3VsZCB5b3UgcmVsb2FkIHlvdXIgZGF0YSBsYXRlciwgYG5nUmVwZWF0YFxuICogd2lsbCBub3QgaGF2ZSB0byByZWJ1aWxkIHRoZSBET00gZWxlbWVudHMgZm9yIGl0ZW1zIGl0IGhhcyBhbHJlYWR5IHJlbmRlcmVkLCBldmVuIGlmIHRoZVxuICogSmF2YVNjcmlwdCBvYmplY3RzIGluIHRoZSBjb2xsZWN0aW9uIGhhdmUgYmVlbiBzdWJzdGl0dXRlZCBmb3IgbmV3IG9uZXMuIEZvciBsYXJnZSBjb2xsZWN0aW9ucyxcbiAqIHRoaXMgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyByZW5kZXJpbmcgcGVyZm9ybWFuY2UuIElmIHlvdSBkb24ndCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIsXG4gKiBgdHJhY2sgYnkgJGluZGV4YCBjYW4gYWxzbyBwcm92aWRlIGEgcGVyZm9ybWFuY2UgYm9vc3QuXG4gKiA8L2Rpdj5cbiAqXG4gKiBgYGBodG1sXG4gKiAgICA8ZGl2IG5nLXJlcGVhdD1cIm1vZGVsIGluIGNvbGxlY3Rpb24gdHJhY2sgYnkgbW9kZWwuaWRcIj5cbiAqICAgICAge3ttb2RlbC5uYW1lfX1cbiAqICAgIDwvZGl2PlxuICogYGBgXG4gKlxuICogPGJyIC8+XG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICogQXZvaWQgdXNpbmcgYHRyYWNrIGJ5ICRpbmRleGAgd2hlbiB0aGUgcmVwZWF0ZWQgdGVtcGxhdGUgY29udGFpbnNcbiAqIHtAbGluayBndWlkZS9leHByZXNzaW9uI29uZS10aW1lLWJpbmRpbmcgb25lLXRpbWUgYmluZGluZ3N9LiBJbiBzdWNoIGNhc2VzLCB0aGUgYG50aGAgRE9NXG4gKiBlbGVtZW50IHdpbGwgYWx3YXlzIGJlIG1hdGNoZWQgd2l0aCB0aGUgYG50aGAgaXRlbSBvZiB0aGUgYXJyYXksIHNvIHRoZSBiaW5kaW5ncyBvbiB0aGF0IGVsZW1lbnRcbiAqIHdpbGwgbm90IGJlIHVwZGF0ZWQgZXZlbiB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0gY2hhbmdlcywgZXNzZW50aWFsbHkgY2F1c2luZyB0aGUgdmlldyB0byBnZXRcbiAqIG91dC1vZi1zeW5jIHdpdGggdGhlIHVuZGVybHlpbmcgZGF0YS5cbiAqIDwvZGl2PlxuICpcbiAqIFdoZW4gbm8gYHRyYWNrIGJ5YCBleHByZXNzaW9uIGlzIHByb3ZpZGVkLCBpdCBpcyBlcXVpdmFsZW50IHRvIHRyYWNraW5nIGJ5IHRoZSBidWlsdC1pblxuICogYCRpZGAgZnVuY3Rpb24sIHdoaWNoIHRyYWNrcyBpdGVtcyBieSB0aGVpciBpZGVudGl0eTpcbiAqIGBgYGh0bWxcbiAqICAgIDxkaXYgbmctcmVwZWF0PVwib2JqIGluIGNvbGxlY3Rpb24gdHJhY2sgYnkgJGlkKG9iailcIj5cbiAqICAgICAge3tvYmoucHJvcH19XG4gKiAgICA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIDxiciAvPlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmdcIj5cbiAqICoqTm90ZToqKiBgdHJhY2sgYnlgIG11c3QgYWx3YXlzIGJlIHRoZSBsYXN0IGV4cHJlc3Npb246XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICogICAgPGRpdiBuZy1yZXBlYXQ9XCJtb2RlbCBpbiBjb2xsZWN0aW9uIHwgb3JkZXJCeTogJ2lkJyBhcyBmaWx0ZXJlZF9yZXN1bHQgdHJhY2sgYnkgbW9kZWwuaWRcIj5cbiAqICAgICAge3ttb2RlbC5uYW1lfX1cbiAqICAgIDwvZGl2PlxuICogYGBgXG4gKlxuICpcbiAqICMgU3BlY2lhbCByZXBlYXQgc3RhcnQgYW5kIGVuZCBwb2ludHNcbiAqIFRvIHJlcGVhdCBhIHNlcmllcyBvZiBlbGVtZW50cyBpbnN0ZWFkIG9mIGp1c3Qgb25lIHBhcmVudCBlbGVtZW50LCBuZ1JlcGVhdCAoYXMgd2VsbCBhcyBvdGhlciBuZyBkaXJlY3RpdmVzKSBzdXBwb3J0cyBleHRlbmRpbmdcbiAqIHRoZSByYW5nZSBvZiB0aGUgcmVwZWF0ZXIgYnkgZGVmaW5pbmcgZXhwbGljaXQgc3RhcnQgYW5kIGVuZCBwb2ludHMgYnkgdXNpbmcgKipuZy1yZXBlYXQtc3RhcnQqKiBhbmQgKipuZy1yZXBlYXQtZW5kKiogcmVzcGVjdGl2ZWx5LlxuICogVGhlICoqbmctcmVwZWF0LXN0YXJ0KiogZGlyZWN0aXZlIHdvcmtzIHRoZSBzYW1lIGFzICoqbmctcmVwZWF0KiosIGJ1dCB3aWxsIHJlcGVhdCBhbGwgdGhlIEhUTUwgY29kZSAoaW5jbHVkaW5nIHRoZSB0YWcgaXQncyBkZWZpbmVkIG9uKVxuICogdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZW5kaW5nIEhUTUwgdGFnIHdoZXJlICoqbmctcmVwZWF0LWVuZCoqIGlzIHBsYWNlZC5cbiAqXG4gKiBUaGUgZXhhbXBsZSBiZWxvdyBtYWtlcyB1c2Ugb2YgdGhpcyBmZWF0dXJlOlxuICogYGBgaHRtbFxuICogICA8aGVhZGVyIG5nLXJlcGVhdC1zdGFydD1cIml0ZW0gaW4gaXRlbXNcIj5cbiAqICAgICBIZWFkZXIge3sgaXRlbSB9fVxuICogICA8L2hlYWRlcj5cbiAqICAgPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAqICAgICBCb2R5IHt7IGl0ZW0gfX1cbiAqICAgPC9kaXY+XG4gKiAgIDxmb290ZXIgbmctcmVwZWF0LWVuZD5cbiAqICAgICBGb290ZXIge3sgaXRlbSB9fVxuICogICA8L2Zvb3Rlcj5cbiAqIGBgYFxuICpcbiAqIEFuZCB3aXRoIGFuIGlucHV0IG9mIHtAdHlwZSBbJ0EnLCdCJ119IGZvciB0aGUgaXRlbXMgdmFyaWFibGUgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBvdXRwdXQgd2lsbCBldmFsdWF0ZSB0bzpcbiAqIGBgYGh0bWxcbiAqICAgPGhlYWRlcj5cbiAqICAgICBIZWFkZXIgQVxuICogICA8L2hlYWRlcj5cbiAqICAgPGRpdiBjbGFzcz1cImJvZHlcIj5cbiAqICAgICBCb2R5IEFcbiAqICAgPC9kaXY+XG4gKiAgIDxmb290ZXI+XG4gKiAgICAgRm9vdGVyIEFcbiAqICAgPC9mb290ZXI+XG4gKiAgIDxoZWFkZXI+XG4gKiAgICAgSGVhZGVyIEJcbiAqICAgPC9oZWFkZXI+XG4gKiAgIDxkaXYgY2xhc3M9XCJib2R5XCI+XG4gKiAgICAgQm9keSBCXG4gKiAgIDwvZGl2PlxuICogICA8Zm9vdGVyPlxuICogICAgIEZvb3RlciBCXG4gKiAgIDwvZm9vdGVyPlxuICogYGBgXG4gKlxuICogVGhlIGN1c3RvbSBzdGFydCBhbmQgZW5kIHBvaW50cyBmb3IgbmdSZXBlYXQgYWxzbyBzdXBwb3J0IGFsbCBvdGhlciBIVE1MIGRpcmVjdGl2ZSBzeW50YXggZmxhdm9ycyBwcm92aWRlZCBpbiBBbmd1bGFySlMgKHN1Y2hcbiAqIGFzICoqZGF0YS1uZy1yZXBlYXQtc3RhcnQqKiwgKip4LW5nLXJlcGVhdC1zdGFydCoqIGFuZCAqKm5nOnJlcGVhdC1zdGFydCoqKS5cbiAqXG4gKiBAYW5pbWF0aW9uc1xuICogfCBBbmltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IE9jY3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHtAbGluayBuZy4kYW5pbWF0ZSNlbnRlciBlbnRlcn0gfCB3aGVuIGEgbmV3IGl0ZW0gaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb3Igd2hlbiBhbiBpdGVtIGlzIHJldmVhbGVkIGFmdGVyIGEgZmlsdGVyIHxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2xlYXZlIGxlYXZlfSB8IHdoZW4gYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb3Igd2hlbiBhbiBpdGVtIGlzIGZpbHRlcmVkIG91dCB8XG4gKiB8IHtAbGluayBuZy4kYW5pbWF0ZSNtb3ZlIG1vdmUgfSB8IHdoZW4gYW4gYWRqYWNlbnQgaXRlbSBpcyBmaWx0ZXJlZCBvdXQgY2F1c2luZyBhIHJlb3JkZXIgb3Igd2hlbiB0aGUgaXRlbSBjb250ZW50cyBhcmUgcmVvcmRlcmVkIHxcbiAqXG4gKiBTZWUgdGhlIGV4YW1wbGUgYmVsb3cgZm9yIGRlZmluaW5nIENTUyBhbmltYXRpb25zIHdpdGggbmdSZXBlYXQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAc2NvcGVcbiAqIEBwcmlvcml0eSAxMDAwXG4gKiBAcGFyYW0ge3JlcGVhdF9leHByZXNzaW9ufSBuZ1JlcGVhdCBUaGUgZXhwcmVzc2lvbiBpbmRpY2F0aW5nIGhvdyB0byBlbnVtZXJhdGUgYSBjb2xsZWN0aW9uLiBUaGVzZVxuICogICBmb3JtYXRzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOlxuICpcbiAqICAgKiBgdmFyaWFibGUgaW4gZXhwcmVzc2lvbmAg4oCTIHdoZXJlIHZhcmlhYmxlIGlzIHRoZSB1c2VyIGRlZmluZWQgbG9vcCB2YXJpYWJsZSBhbmQgYGV4cHJlc3Npb25gXG4gKiAgICAgaXMgYSBzY29wZSBleHByZXNzaW9uIGdpdmluZyB0aGUgY29sbGVjdGlvbiB0byBlbnVtZXJhdGUuXG4gKlxuICogICAgIEZvciBleGFtcGxlOiBgYWxidW0gaW4gYXJ0aXN0LmFsYnVtc2AuXG4gKlxuICogICAqIGAoa2V5LCB2YWx1ZSkgaW4gZXhwcmVzc2lvbmAg4oCTIHdoZXJlIGBrZXlgIGFuZCBgdmFsdWVgIGNhbiBiZSBhbnkgdXNlciBkZWZpbmVkIGlkZW50aWZpZXJzLFxuICogICAgIGFuZCBgZXhwcmVzc2lvbmAgaXMgdGhlIHNjb3BlIGV4cHJlc3Npb24gZ2l2aW5nIHRoZSBjb2xsZWN0aW9uIHRvIGVudW1lcmF0ZS5cbiAqXG4gKiAgICAgRm9yIGV4YW1wbGU6IGAobmFtZSwgYWdlKSBpbiB7J2FkYW0nOjEwLCAnYW1hbGllJzoxMn1gLlxuICpcbiAqICAgKiBgdmFyaWFibGUgaW4gZXhwcmVzc2lvbiB0cmFjayBieSB0cmFja2luZ19leHByZXNzaW9uYCDigJMgWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb3B0aW9uYWwgdHJhY2tpbmcgZXhwcmVzc2lvblxuICogICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgb2JqZWN0cyBpbiB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBET00gZWxlbWVudHMuIElmIG5vIHRyYWNraW5nIGV4cHJlc3Npb25cbiAqICAgICBpcyBzcGVjaWZpZWQsIG5nLXJlcGVhdCBhc3NvY2lhdGVzIGVsZW1lbnRzIGJ5IGlkZW50aXR5LiBJdCBpcyBhbiBlcnJvciB0byBoYXZlXG4gKiAgICAgbW9yZSB0aGFuIG9uZSB0cmFja2luZyBleHByZXNzaW9uIHZhbHVlIHJlc29sdmUgdG8gdGhlIHNhbWUga2V5LiAoVGhpcyB3b3VsZCBtZWFuIHRoYXQgdHdvIGRpc3RpbmN0IG9iamVjdHMgYXJlXG4gKiAgICAgbWFwcGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB3aGljaCBpcyBub3QgcG9zc2libGUuKVxuICpcbiAqICAgICBOb3RlIHRoYXQgdGhlIHRyYWNraW5nIGV4cHJlc3Npb24gbXVzdCBjb21lIGxhc3QsIGFmdGVyIGFueSBmaWx0ZXJzLCBhbmQgdGhlIGFsaWFzIGV4cHJlc3Npb24uXG4gKlxuICogICAgIEZvciBleGFtcGxlOiBgaXRlbSBpbiBpdGVtc2AgaXMgZXF1aXZhbGVudCB0byBgaXRlbSBpbiBpdGVtcyB0cmFjayBieSAkaWQoaXRlbSlgLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgRE9NIGVsZW1lbnRzXG4gKiAgICAgd2lsbCBiZSBhc3NvY2lhdGVkIGJ5IGl0ZW0gaWRlbnRpdHkgaW4gdGhlIGFycmF5LlxuICpcbiAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgdHJhY2sgYnkgJGlkKGl0ZW0pYC4gQSBidWlsdCBpbiBgJGlkKClgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBhIHVuaXF1ZVxuICogICAgIGAkJGhhc2hLZXlgIHByb3BlcnR5IHRvIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuIFRoaXMgcHJvcGVydHkgaXMgdGhlbiB1c2VkIGFzIGEga2V5IHRvIGFzc29jaWF0ZWQgRE9NIGVsZW1lbnRzXG4gKiAgICAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpdGVtIGluIHRoZSBhcnJheSBieSBpZGVudGl0eS4gTW92aW5nIHRoZSBzYW1lIG9iamVjdCBpbiBhcnJheSB3b3VsZCBtb3ZlIHRoZSBET01cbiAqICAgICBlbGVtZW50IGluIHRoZSBzYW1lIHdheSBpbiB0aGUgRE9NLlxuICpcbiAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgdHJhY2sgYnkgaXRlbS5pZGAgaXMgYSB0eXBpY2FsIHBhdHRlcm4gd2hlbiB0aGUgaXRlbXMgY29tZSBmcm9tIHRoZSBkYXRhYmFzZS4gSW4gdGhpc1xuICogICAgIGNhc2UgdGhlIG9iamVjdCBpZGVudGl0eSBkb2VzIG5vdCBtYXR0ZXIuIFR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgYXMgbG9uZyBhcyB0aGVpciBgaWRgXG4gKiAgICAgcHJvcGVydHkgaXMgc2FtZS5cbiAqXG4gKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zIHwgZmlsdGVyOnNlYXJjaFRleHQgdHJhY2sgYnkgaXRlbS5pZGAgaXMgYSBwYXR0ZXJuIHRoYXQgbWlnaHQgYmUgdXNlZCB0byBhcHBseSBhIGZpbHRlclxuICogICAgIHRvIGl0ZW1zIGluIGNvbmp1bmN0aW9uIHdpdGggYSB0cmFja2luZyBleHByZXNzaW9uLlxuICpcbiAqICAgKiBgdmFyaWFibGUgaW4gZXhwcmVzc2lvbiBhcyBhbGlhc19leHByZXNzaW9uYCDigJMgWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb3B0aW9uYWwgYWxpYXMgZXhwcmVzc2lvbiB3aGljaCB3aWxsIHRoZW4gc3RvcmUgdGhlXG4gKiAgICAgaW50ZXJtZWRpYXRlIHJlc3VsdHMgb2YgdGhlIHJlcGVhdGVyIGFmdGVyIHRoZSBmaWx0ZXJzIGhhdmUgYmVlbiBhcHBsaWVkLiBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIHJlbmRlciBhIHNwZWNpYWwgbWVzc2FnZVxuICogICAgIHdoZW4gYSBmaWx0ZXIgaXMgYWN0aXZlIG9uIHRoZSByZXBlYXRlciwgYnV0IHRoZSBmaWx0ZXJlZCByZXN1bHQgc2V0IGlzIGVtcHR5LlxuICpcbiAqICAgICBGb3IgZXhhbXBsZTogYGl0ZW0gaW4gaXRlbXMgfCBmaWx0ZXI6eCBhcyByZXN1bHRzYCB3aWxsIHN0b3JlIHRoZSBmcmFnbWVudCBvZiB0aGUgcmVwZWF0ZWQgaXRlbXMgYXMgYHJlc3VsdHNgLCBidXQgb25seSBhZnRlclxuICogICAgIHRoZSBpdGVtcyBoYXZlIGJlZW4gcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGZpbHRlci5cbiAqXG4gKiAgICAgUGxlYXNlIG5vdGUgdGhhdCBgYXMgW3ZhcmlhYmxlIG5hbWVdIGlzIG5vdCBhbiBvcGVyYXRvciBidXQgcmF0aGVyIGEgcGFydCBvZiBuZ1JlcGVhdCBtaWNyby1zeW50YXggc28gaXQgY2FuIGJlIHVzZWQgb25seSBhdCB0aGUgZW5kXG4gKiAgICAgKGFuZCBub3QgYXMgb3BlcmF0b3IsIGluc2lkZSBhbiBleHByZXNzaW9uKS5cbiAqXG4gKiAgICAgRm9yIGV4YW1wbGU6IGBpdGVtIGluIGl0ZW1zIHwgZmlsdGVyIDogeCB8IG9yZGVyQnkgOiBvcmRlciB8IGxpbWl0VG8gOiBsaW1pdCBhcyByZXN1bHRzYCAuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSB1c2VzIGBuZ1JlcGVhdGAgdG8gZGlzcGxheSBhIGxpc3Qgb2YgcGVvcGxlLiBBIGZpbHRlciBpcyB1c2VkIHRvIHJlc3RyaWN0IHRoZSBkaXNwbGF5ZWRcbiAqIHJlc3VsdHMgYnkgbmFtZSBvciBieSBhZ2UuIE5ldyAoZW50ZXJpbmcpIGFuZCByZW1vdmVkIChsZWF2aW5nKSBpdGVtcyBhcmUgYW5pbWF0ZWQuXG4gIDxleGFtcGxlIG1vZHVsZT1cIm5nUmVwZWF0XCIgbmFtZT1cIm5nUmVwZWF0XCIgZGVwcz1cImFuZ3VsYXItYW5pbWF0ZS5qc1wiIGFuaW1hdGlvbnM9XCJ0cnVlXCIgbmFtZT1cIm5nLXJlcGVhdFwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJyZXBlYXRDb250cm9sbGVyXCI+XG4gICAgICAgIEkgaGF2ZSB7e2ZyaWVuZHMubGVuZ3RofX0gZnJpZW5kcy4gVGhleSBhcmU6XG4gICAgICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgbmctbW9kZWw9XCJxXCIgcGxhY2Vob2xkZXI9XCJmaWx0ZXIgZnJpZW5kcy4uLlwiIGFyaWEtbGFiZWw9XCJmaWx0ZXIgZnJpZW5kc1wiIC8+XG4gICAgICAgIDx1bCBjbGFzcz1cImV4YW1wbGUtYW5pbWF0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJhbmltYXRlLXJlcGVhdFwiIG5nLXJlcGVhdD1cImZyaWVuZCBpbiBmcmllbmRzIHwgZmlsdGVyOnEgYXMgcmVzdWx0c1wiPlxuICAgICAgICAgICAgW3t7JGluZGV4ICsgMX19XSB7e2ZyaWVuZC5uYW1lfX0gd2hvIGlzIHt7ZnJpZW5kLmFnZX19IHllYXJzIG9sZC5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxsaSBjbGFzcz1cImFuaW1hdGUtcmVwZWF0XCIgbmctaWY9XCJyZXN1bHRzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgPHN0cm9uZz5ObyByZXN1bHRzIGZvdW5kLi4uPC9zdHJvbmc+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwic2NyaXB0LmpzXCI+XG4gICAgICBhbmd1bGFyLm1vZHVsZSgnbmdSZXBlYXQnLCBbJ25nQW5pbWF0ZSddKS5jb250cm9sbGVyKCdyZXBlYXRDb250cm9sbGVyJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gICAgICAgICRzY29wZS5mcmllbmRzID0gW1xuICAgICAgICAgIHtuYW1lOidKb2huJywgYWdlOjI1LCBnZW5kZXI6J2JveSd9LFxuICAgICAgICAgIHtuYW1lOidKZXNzaWUnLCBhZ2U6MzAsIGdlbmRlcjonZ2lybCd9LFxuICAgICAgICAgIHtuYW1lOidKb2hhbm5hJywgYWdlOjI4LCBnZW5kZXI6J2dpcmwnfSxcbiAgICAgICAgICB7bmFtZTonSm95JywgYWdlOjE1LCBnZW5kZXI6J2dpcmwnfSxcbiAgICAgICAgICB7bmFtZTonTWFyeScsIGFnZToyOCwgZ2VuZGVyOidnaXJsJ30sXG4gICAgICAgICAge25hbWU6J1BldGVyJywgYWdlOjk1LCBnZW5kZXI6J2JveSd9LFxuICAgICAgICAgIHtuYW1lOidTZWJhc3RpYW4nLCBhZ2U6NTAsIGdlbmRlcjonYm95J30sXG4gICAgICAgICAge25hbWU6J0VyaWthJywgYWdlOjI3LCBnZW5kZXI6J2dpcmwnfSxcbiAgICAgICAgICB7bmFtZTonUGF0cmljaycsIGFnZTo0MCwgZ2VuZGVyOidib3knfSxcbiAgICAgICAgICB7bmFtZTonU2FtYW50aGEnLCBhZ2U6NjAsIGdlbmRlcjonZ2lybCd9XG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cImFuaW1hdGlvbnMuY3NzXCI+XG4gICAgICAuZXhhbXBsZS1hbmltYXRlLWNvbnRhaW5lciB7XG4gICAgICAgIGJhY2tncm91bmQ6d2hpdGU7XG4gICAgICAgIGJvcmRlcjoxcHggc29saWQgYmxhY2s7XG4gICAgICAgIGxpc3Qtc3R5bGU6bm9uZTtcbiAgICAgICAgbWFyZ2luOjA7XG4gICAgICAgIHBhZGRpbmc6MCAxMHB4O1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQge1xuICAgICAgICBsaW5lLWhlaWdodDozMHB4O1xuICAgICAgICBsaXN0LXN0eWxlOm5vbmU7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLW1vdmUsXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQubmctZW50ZXIsXG4gICAgICAuYW5pbWF0ZS1yZXBlYXQubmctbGVhdmUge1xuICAgICAgICB0cmFuc2l0aW9uOmFsbCBsaW5lYXIgMC41cztcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWxlYXZlLm5nLWxlYXZlLWFjdGl2ZSxcbiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1tb3ZlLFxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWVudGVyIHtcbiAgICAgICAgb3BhY2l0eTowO1xuICAgICAgICBtYXgtaGVpZ2h0OjA7XG4gICAgICB9XG5cbiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1sZWF2ZSxcbiAgICAgIC5hbmltYXRlLXJlcGVhdC5uZy1tb3ZlLm5nLW1vdmUtYWN0aXZlLFxuICAgICAgLmFuaW1hdGUtcmVwZWF0Lm5nLWVudGVyLm5nLWVudGVyLWFjdGl2ZSB7XG4gICAgICAgIG9wYWNpdHk6MTtcbiAgICAgICAgbWF4LWhlaWdodDozMHB4O1xuICAgICAgfVxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICB2YXIgZnJpZW5kcyA9IGVsZW1lbnQuYWxsKGJ5LnJlcGVhdGVyKCdmcmllbmQgaW4gZnJpZW5kcycpKTtcblxuICAgICAgaXQoJ3Nob3VsZCByZW5kZXIgaW5pdGlhbCBkYXRhIHNldCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBleHBlY3QoZnJpZW5kcy5jb3VudCgpKS50b0JlKDEwKTtcbiAgICAgICAgZXhwZWN0KGZyaWVuZHMuZ2V0KDApLmdldFRleHQoKSkudG9FcXVhbCgnWzFdIEpvaG4gd2hvIGlzIDI1IHllYXJzIG9sZC4nKTtcbiAgICAgICAgZXhwZWN0KGZyaWVuZHMuZ2V0KDEpLmdldFRleHQoKSkudG9FcXVhbCgnWzJdIEplc3NpZSB3aG8gaXMgMzAgeWVhcnMgb2xkLicpO1xuICAgICAgICBleHBlY3QoZnJpZW5kcy5sYXN0KCkuZ2V0VGV4dCgpKS50b0VxdWFsKCdbMTBdIFNhbWFudGhhIHdobyBpcyA2MCB5ZWFycyBvbGQuJyk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ2ZyaWVuZHMubGVuZ3RoJykpLmdldFRleHQoKSlcbiAgICAgICAgICAgIC50b01hdGNoKFwiSSBoYXZlIDEwIGZyaWVuZHMuIFRoZXkgYXJlOlwiKTtcbiAgICAgIH0pO1xuXG4gICAgICAgaXQoJ3Nob3VsZCB1cGRhdGUgcmVwZWF0ZXIgd2hlbiBmaWx0ZXIgcHJlZGljYXRlIGNoYW5nZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChmcmllbmRzLmNvdW50KCkpLnRvQmUoMTApO1xuXG4gICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdxJykpLnNlbmRLZXlzKCdtYScpO1xuXG4gICAgICAgICBleHBlY3QoZnJpZW5kcy5jb3VudCgpKS50b0JlKDIpO1xuICAgICAgICAgZXhwZWN0KGZyaWVuZHMuZ2V0KDApLmdldFRleHQoKSkudG9FcXVhbCgnWzFdIE1hcnkgd2hvIGlzIDI4IHllYXJzIG9sZC4nKTtcbiAgICAgICAgIGV4cGVjdChmcmllbmRzLmxhc3QoKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1syXSBTYW1hbnRoYSB3aG8gaXMgNjAgeWVhcnMgb2xkLicpO1xuICAgICAgIH0pO1xuICAgICAgPC9maWxlPlxuICAgIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nUmVwZWF0RGlyZWN0aXZlID0gWyckcGFyc2UnLCAnJGFuaW1hdGUnLCAnJGNvbXBpbGUnLCBmdW5jdGlvbigkcGFyc2UsICRhbmltYXRlLCAkY29tcGlsZSkge1xuICB2YXIgTkdfUkVNT1ZFRCA9ICckJE5HX1JFTU9WRUQnO1xuICB2YXIgbmdSZXBlYXRNaW5FcnIgPSBtaW5FcnIoJ25nUmVwZWF0Jyk7XG5cbiAgdmFyIHVwZGF0ZVNjb3BlID0gZnVuY3Rpb24oc2NvcGUsIGluZGV4LCB2YWx1ZUlkZW50aWZpZXIsIHZhbHVlLCBrZXlJZGVudGlmaWVyLCBrZXksIGFycmF5TGVuZ3RoKSB7XG4gICAgLy8gVE9ETyhwZXJmKTogZ2VuZXJhdGUgc2V0dGVycyB0byBzaGF2ZSBvZmYgfjQwbXMgb3IgMS0xLjUlXG4gICAgc2NvcGVbdmFsdWVJZGVudGlmaWVyXSA9IHZhbHVlO1xuICAgIGlmIChrZXlJZGVudGlmaWVyKSBzY29wZVtrZXlJZGVudGlmaWVyXSA9IGtleTtcbiAgICBzY29wZS4kaW5kZXggPSBpbmRleDtcbiAgICBzY29wZS4kZmlyc3QgPSAoaW5kZXggPT09IDApO1xuICAgIHNjb3BlLiRsYXN0ID0gKGluZGV4ID09PSAoYXJyYXlMZW5ndGggLSAxKSk7XG4gICAgc2NvcGUuJG1pZGRsZSA9ICEoc2NvcGUuJGZpcnN0IHx8IHNjb3BlLiRsYXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIHNjb3BlLiRvZGQgPSAhKHNjb3BlLiRldmVuID0gKGluZGV4ICYgMSkgPT09IDApO1xuICB9O1xuXG4gIHZhciBnZXRCbG9ja1N0YXJ0ID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICByZXR1cm4gYmxvY2suY2xvbmVbMF07XG4gIH07XG5cbiAgdmFyIGdldEJsb2NrRW5kID0gZnVuY3Rpb24oYmxvY2spIHtcbiAgICByZXR1cm4gYmxvY2suY2xvbmVbYmxvY2suY2xvbmUubGVuZ3RoIC0gMV07XG4gIH07XG5cblxuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgbXVsdGlFbGVtZW50OiB0cnVlLFxuICAgIHRyYW5zY2x1ZGU6ICdlbGVtZW50JyxcbiAgICBwcmlvcml0eTogMTAwMCxcbiAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICAkJHRsYjogdHJ1ZSxcbiAgICBjb21waWxlOiBmdW5jdGlvbiBuZ1JlcGVhdENvbXBpbGUoJGVsZW1lbnQsICRhdHRyKSB7XG4gICAgICB2YXIgZXhwcmVzc2lvbiA9ICRhdHRyLm5nUmVwZWF0O1xuICAgICAgdmFyIG5nUmVwZWF0RW5kQ29tbWVudCA9ICRjb21waWxlLiQkY3JlYXRlQ29tbWVudCgnZW5kIG5nUmVwZWF0JywgZXhwcmVzc2lvbik7XG5cbiAgICAgIHZhciBtYXRjaCA9IGV4cHJlc3Npb24ubWF0Y2goL15cXHMqKFtcXHNcXFNdKz8pXFxzK2luXFxzKyhbXFxzXFxTXSs/KSg/Olxccythc1xccysoW1xcc1xcU10rPykpPyg/Olxccyt0cmFja1xccytieVxccysoW1xcc1xcU10rPykpP1xccyokLyk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2lleHAnLCAnRXhwZWN0ZWQgZXhwcmVzc2lvbiBpbiBmb3JtIG9mIFxcJ19pdGVtXyBpbiBfY29sbGVjdGlvbl9bIHRyYWNrIGJ5IF9pZF9dXFwnIGJ1dCBnb3QgXFwnezB9XFwnLicsXG4gICAgICAgICAgICBleHByZXNzaW9uKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxocyA9IG1hdGNoWzFdO1xuICAgICAgdmFyIHJocyA9IG1hdGNoWzJdO1xuICAgICAgdmFyIGFsaWFzQXMgPSBtYXRjaFszXTtcbiAgICAgIHZhciB0cmFja0J5RXhwID0gbWF0Y2hbNF07XG5cbiAgICAgIG1hdGNoID0gbGhzLm1hdGNoKC9eKD86KFxccypbJFxcd10rKXxcXChcXHMqKFskXFx3XSspXFxzKixcXHMqKFskXFx3XSspXFxzKlxcKSkkLyk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmdSZXBlYXRNaW5FcnIoJ2lpZGV4cCcsICdcXCdfaXRlbV9cXCcgaW4gXFwnX2l0ZW1fIGluIF9jb2xsZWN0aW9uX1xcJyBzaG91bGQgYmUgYW4gaWRlbnRpZmllciBvciBcXCcoX2tleV8sIF92YWx1ZV8pXFwnIGV4cHJlc3Npb24sIGJ1dCBnb3QgXFwnezB9XFwnLicsXG4gICAgICAgICAgICBsaHMpO1xuICAgICAgfVxuICAgICAgdmFyIHZhbHVlSWRlbnRpZmllciA9IG1hdGNoWzNdIHx8IG1hdGNoWzFdO1xuICAgICAgdmFyIGtleUlkZW50aWZpZXIgPSBtYXRjaFsyXTtcblxuICAgICAgaWYgKGFsaWFzQXMgJiYgKCEvXlskYS16QS1aX11bJGEtekEtWjAtOV9dKiQvLnRlc3QoYWxpYXNBcykgfHxcbiAgICAgICAgICAvXihudWxsfHVuZGVmaW5lZHx0aGlzfFxcJGluZGV4fFxcJGZpcnN0fFxcJG1pZGRsZXxcXCRsYXN0fFxcJGV2ZW58XFwkb2RkfFxcJHBhcmVudHxcXCRyb290fFxcJGlkKSQvLnRlc3QoYWxpYXNBcykpKSB7XG4gICAgICAgIHRocm93IG5nUmVwZWF0TWluRXJyKCdiYWRpZGVudCcsICdhbGlhcyBcXCd7MH1cXCcgaXMgaW52YWxpZCAtLS0gbXVzdCBiZSBhIHZhbGlkIEpTIGlkZW50aWZpZXIgd2hpY2ggaXMgbm90IGEgcmVzZXJ2ZWQgbmFtZS4nLFxuICAgICAgICAgIGFsaWFzQXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhY2tCeUV4cEdldHRlciwgdHJhY2tCeUlkRXhwRm4sIHRyYWNrQnlJZEFycmF5Rm4sIHRyYWNrQnlJZE9iakZuO1xuICAgICAgdmFyIGhhc2hGbkxvY2FscyA9IHskaWQ6IGhhc2hLZXl9O1xuXG4gICAgICBpZiAodHJhY2tCeUV4cCkge1xuICAgICAgICB0cmFja0J5RXhwR2V0dGVyID0gJHBhcnNlKHRyYWNrQnlFeHApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2tCeUlkQXJyYXlGbiA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gaGFzaEtleSh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRyYWNrQnlJZE9iakZuID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5nUmVwZWF0TGluaygkc2NvcGUsICRlbGVtZW50LCAkYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHtcblxuICAgICAgICBpZiAodHJhY2tCeUV4cEdldHRlcikge1xuICAgICAgICAgIHRyYWNrQnlJZEV4cEZuID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGFzc2lnbiBrZXksIHZhbHVlLCBhbmQgJGluZGV4IHRvIHRoZSBsb2NhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGluIGhhc2ggZnVuY3Rpb25zXG4gICAgICAgICAgICBpZiAoa2V5SWRlbnRpZmllcikgaGFzaEZuTG9jYWxzW2tleUlkZW50aWZpZXJdID0ga2V5O1xuICAgICAgICAgICAgaGFzaEZuTG9jYWxzW3ZhbHVlSWRlbnRpZmllcl0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc2hGbkxvY2Fscy4kaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHJldHVybiB0cmFja0J5RXhwR2V0dGVyKCRzY29wZSwgaGFzaEZuTG9jYWxzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgYSBsaXN0IG9mIGVsZW1lbnRzIGZyb20gcHJldmlvdXMgcnVuLiBUaGlzIGlzIGEgaGFzaCB3aGVyZSBrZXkgaXMgdGhlIGl0ZW0gZnJvbSB0aGVcbiAgICAgICAgLy8gaXRlcmF0b3IsIGFuZCB0aGUgdmFsdWUgaXMgb2JqZWN0cyB3aXRoIGZvbGxvd2luZyBwcm9wZXJ0aWVzLlxuICAgICAgICAvLyAgIC0gc2NvcGU6IGJvdW5kIHNjb3BlXG4gICAgICAgIC8vICAgLSBlbGVtZW50OiBwcmV2aW91cyBlbGVtZW50LlxuICAgICAgICAvLyAgIC0gaW5kZXg6IHBvc2l0aW9uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIGFyZSB1c2luZyBuby1wcm90byBvYmplY3Qgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaW5oZXJpdGVkIHByb3BzIHZpYVxuICAgICAgICAvLyBoYXNPd25Qcm9wZXJ0eS5cbiAgICAgICAgdmFyIGxhc3RCbG9ja01hcCA9IGNyZWF0ZU1hcCgpO1xuXG4gICAgICAgIC8vd2F0Y2ggcHJvcHNcbiAgICAgICAgJHNjb3BlLiR3YXRjaENvbGxlY3Rpb24ocmhzLCBmdW5jdGlvbiBuZ1JlcGVhdEFjdGlvbihjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgdmFyIGluZGV4LCBsZW5ndGgsXG4gICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9ICRlbGVtZW50WzBdLCAgICAgLy8gbm9kZSB0aGF0IGNsb25lZCBub2RlcyBzaG91bGQgYmUgaW5zZXJ0ZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCB0byB0aGUgY29tbWVudCBub2RlIGFuY2hvclxuICAgICAgICAgICAgICBuZXh0Tm9kZSxcbiAgICAgICAgICAgICAgLy8gU2FtZSBhcyBsYXN0QmxvY2tNYXAgYnV0IGl0IGhhcyB0aGUgY3VycmVudCBzdGF0ZS4gSXQgd2lsbCBiZWNvbWUgdGhlXG4gICAgICAgICAgICAgIC8vIGxhc3RCbG9ja01hcCBvbiB0aGUgbmV4dCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgIG5leHRCbG9ja01hcCA9IGNyZWF0ZU1hcCgpLFxuICAgICAgICAgICAgICBjb2xsZWN0aW9uTGVuZ3RoLFxuICAgICAgICAgICAgICBrZXksIHZhbHVlLCAvLyBrZXkvdmFsdWUgb2YgaXRlcmF0aW9uXG4gICAgICAgICAgICAgIHRyYWNrQnlJZCxcbiAgICAgICAgICAgICAgdHJhY2tCeUlkRm4sXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLFxuICAgICAgICAgICAgICBibG9jaywgICAgICAgLy8gbGFzdCBvYmplY3QgaW5mb3JtYXRpb24ge3Njb3BlLCBlbGVtZW50LCBpZH1cbiAgICAgICAgICAgICAgbmV4dEJsb2NrT3JkZXIsXG4gICAgICAgICAgICAgIGVsZW1lbnRzVG9SZW1vdmU7XG5cbiAgICAgICAgICBpZiAoYWxpYXNBcykge1xuICAgICAgICAgICAgJHNjb3BlW2FsaWFzQXNdID0gY29sbGVjdGlvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzID0gY29sbGVjdGlvbjtcbiAgICAgICAgICAgIHRyYWNrQnlJZEZuID0gdHJhY2tCeUlkRXhwRm4gfHwgdHJhY2tCeUlkQXJyYXlGbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhY2tCeUlkRm4gPSB0cmFja0J5SWRFeHBGbiB8fCB0cmFja0J5SWRPYmpGbjtcbiAgICAgICAgICAgIC8vIGlmIG9iamVjdCwgZXh0cmFjdCBrZXlzLCBpbiBlbnVtZXJhdGlvbiBvcmRlciwgdW5zb3J0ZWRcbiAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpdGVtS2V5IGluIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29sbGVjdGlvbiwgaXRlbUtleSkgJiYgaXRlbUtleS5jaGFyQXQoMCkgIT09ICckJykge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXlzLnB1c2goaXRlbUtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb2xsZWN0aW9uTGVuZ3RoID0gY29sbGVjdGlvbktleXMubGVuZ3RoO1xuICAgICAgICAgIG5leHRCbG9ja09yZGVyID0gbmV3IEFycmF5KGNvbGxlY3Rpb25MZW5ndGgpO1xuXG4gICAgICAgICAgLy8gbG9jYXRlIGV4aXN0aW5nIGl0ZW1zXG4gICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29sbGVjdGlvbkxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAga2V5ID0gKGNvbGxlY3Rpb24gPT09IGNvbGxlY3Rpb25LZXlzKSA/IGluZGV4IDogY29sbGVjdGlvbktleXNbaW5kZXhdO1xuICAgICAgICAgICAgdmFsdWUgPSBjb2xsZWN0aW9uW2tleV07XG4gICAgICAgICAgICB0cmFja0J5SWQgPSB0cmFja0J5SWRGbihrZXksIHZhbHVlLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAobGFzdEJsb2NrTWFwW3RyYWNrQnlJZF0pIHtcbiAgICAgICAgICAgICAgLy8gZm91bmQgcHJldmlvdXNseSBzZWVuIGJsb2NrXG4gICAgICAgICAgICAgIGJsb2NrID0gbGFzdEJsb2NrTWFwW3RyYWNrQnlJZF07XG4gICAgICAgICAgICAgIGRlbGV0ZSBsYXN0QmxvY2tNYXBbdHJhY2tCeUlkXTtcbiAgICAgICAgICAgICAgbmV4dEJsb2NrTWFwW3RyYWNrQnlJZF0gPSBibG9jaztcbiAgICAgICAgICAgICAgbmV4dEJsb2NrT3JkZXJbaW5kZXhdID0gYmxvY2s7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRCbG9ja01hcFt0cmFja0J5SWRdKSB7XG4gICAgICAgICAgICAgIC8vIGlmIGNvbGxpc2lvbiBkZXRlY3RlZC4gcmVzdG9yZSBsYXN0QmxvY2tNYXAgYW5kIHRocm93IGFuIGVycm9yXG4gICAgICAgICAgICAgIGZvckVhY2gobmV4dEJsb2NrT3JkZXIsIGZ1bmN0aW9uKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrICYmIGJsb2NrLnNjb3BlKSBsYXN0QmxvY2tNYXBbYmxvY2suaWRdID0gYmxvY2s7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBuZ1JlcGVhdE1pbkVycignZHVwZXMnLFxuICAgICAgICAgICAgICAgICAgJ0R1cGxpY2F0ZXMgaW4gYSByZXBlYXRlciBhcmUgbm90IGFsbG93ZWQuIFVzZSBcXCd0cmFjayBieVxcJyBleHByZXNzaW9uIHRvIHNwZWNpZnkgdW5pcXVlIGtleXMuIFJlcGVhdGVyOiB7MH0sIER1cGxpY2F0ZSBrZXk6IHsxfSwgRHVwbGljYXRlIHZhbHVlOiB7Mn0nLFxuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgdHJhY2tCeUlkLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBuZXcgbmV2ZXIgYmVmb3JlIHNlZW4gYmxvY2tcbiAgICAgICAgICAgICAgbmV4dEJsb2NrT3JkZXJbaW5kZXhdID0ge2lkOiB0cmFja0J5SWQsIHNjb3BlOiB1bmRlZmluZWQsIGNsb25lOiB1bmRlZmluZWR9O1xuICAgICAgICAgICAgICBuZXh0QmxvY2tNYXBbdHJhY2tCeUlkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gcmVtb3ZlIGxlZnRvdmVyIGl0ZW1zXG4gICAgICAgICAgZm9yICh2YXIgYmxvY2tLZXkgaW4gbGFzdEJsb2NrTWFwKSB7XG4gICAgICAgICAgICBibG9jayA9IGxhc3RCbG9ja01hcFtibG9ja0tleV07XG4gICAgICAgICAgICBlbGVtZW50c1RvUmVtb3ZlID0gZ2V0QmxvY2tOb2RlcyhibG9jay5jbG9uZSk7XG4gICAgICAgICAgICAkYW5pbWF0ZS5sZWF2ZShlbGVtZW50c1RvUmVtb3ZlKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1RvUmVtb3ZlWzBdLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCByZW1vdmVkIHlldCBiZWNhdXNlIG9mIHBlbmRpbmcgYW5pbWF0aW9uLCBtYXJrIGl0IGFzIGRlbGV0ZWRcbiAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gaWdub3JlIGl0IGxhdGVyXG4gICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBlbGVtZW50c1RvUmVtb3ZlLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvUmVtb3ZlW2luZGV4XVtOR19SRU1PVkVEXSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLnNjb3BlLiRkZXN0cm95KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gd2UgYXJlIG5vdCB1c2luZyBmb3JFYWNoIGZvciBwZXJmIHJlYXNvbnMgKHRyeWluZyB0byBhdm9pZCAjY2FsbClcbiAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb2xsZWN0aW9uTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBrZXkgPSAoY29sbGVjdGlvbiA9PT0gY29sbGVjdGlvbktleXMpID8gaW5kZXggOiBjb2xsZWN0aW9uS2V5c1tpbmRleF07XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbGxlY3Rpb25ba2V5XTtcbiAgICAgICAgICAgIGJsb2NrID0gbmV4dEJsb2NrT3JkZXJbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoYmxvY2suc2NvcGUpIHtcbiAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBvYmplY3QsIHRoZW4gd2UgbmVlZCB0byByZXVzZSB0aGVcbiAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBzY29wZS9lbGVtZW50XG5cbiAgICAgICAgICAgICAgbmV4dE5vZGUgPSBwcmV2aW91c05vZGU7XG5cbiAgICAgICAgICAgICAgLy8gc2tpcCBub2RlcyB0aGF0IGFyZSBhbHJlYWR5IHBlbmRpbmcgcmVtb3ZhbCB2aWEgbGVhdmUgYW5pbWF0aW9uXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZVtOR19SRU1PVkVEXSk7XG5cbiAgICAgICAgICAgICAgaWYgKGdldEJsb2NrU3RhcnQoYmxvY2spICE9PSBuZXh0Tm9kZSkge1xuICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGl0ZW0gd2hpY2ggZ290IG1vdmVkXG4gICAgICAgICAgICAgICAgJGFuaW1hdGUubW92ZShnZXRCbG9ja05vZGVzKGJsb2NrLmNsb25lKSwgbnVsbCwgcHJldmlvdXNOb2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwcmV2aW91c05vZGUgPSBnZXRCbG9ja0VuZChibG9jayk7XG4gICAgICAgICAgICAgIHVwZGF0ZVNjb3BlKGJsb2NrLnNjb3BlLCBpbmRleCwgdmFsdWVJZGVudGlmaWVyLCB2YWx1ZSwga2V5SWRlbnRpZmllciwga2V5LCBjb2xsZWN0aW9uTGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIG5ldyBpdGVtIHdoaWNoIHdlIGRvbid0IGtub3cgYWJvdXRcbiAgICAgICAgICAgICAgJHRyYW5zY2x1ZGUoZnVuY3Rpb24gbmdSZXBlYXRUcmFuc2NsdWRlKGNsb25lLCBzY29wZSkge1xuICAgICAgICAgICAgICAgIGJsb2NrLnNjb3BlID0gc2NvcGU7XG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL2pzcGVyZi5jb20vY2xvbmUtdnMtY3JlYXRlY29tbWVudFxuICAgICAgICAgICAgICAgIHZhciBlbmROb2RlID0gbmdSZXBlYXRFbmRDb21tZW50LmNsb25lTm9kZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgY2xvbmVbY2xvbmUubGVuZ3RoKytdID0gZW5kTm9kZTtcblxuICAgICAgICAgICAgICAgICRhbmltYXRlLmVudGVyKGNsb25lLCBudWxsLCBwcmV2aW91c05vZGUpO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzTm9kZSA9IGVuZE5vZGU7XG4gICAgICAgICAgICAgICAgLy8gTm90ZTogV2Ugb25seSBuZWVkIHRoZSBmaXJzdC9sYXN0IG5vZGUgb2YgdGhlIGNsb25lZCBub2Rlcy5cbiAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIHJlZmVyZW5jZSB0byB0aGUganFsaXRlIHdyYXBwZXIgYXMgaXQgbWlnaHQgYmUgY2hhbmdlZCBsYXRlclxuICAgICAgICAgICAgICAgIC8vIGJ5IGEgZGlyZWN0aXZlIHdpdGggdGVtcGxhdGVVcmwgd2hlbiBpdHMgdGVtcGxhdGUgYXJyaXZlcy5cbiAgICAgICAgICAgICAgICBibG9jay5jbG9uZSA9IGNsb25lO1xuICAgICAgICAgICAgICAgIG5leHRCbG9ja01hcFtibG9jay5pZF0gPSBibG9jaztcbiAgICAgICAgICAgICAgICB1cGRhdGVTY29wZShibG9jay5zY29wZSwgaW5kZXgsIHZhbHVlSWRlbnRpZmllciwgdmFsdWUsIGtleUlkZW50aWZpZXIsIGtleSwgY29sbGVjdGlvbkxlbmd0aCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsYXN0QmxvY2tNYXAgPSBuZXh0QmxvY2tNYXA7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XTtcblxudmFyIE5HX0hJREVfQ0xBU1MgPSAnbmctaGlkZSc7XG52YXIgTkdfSElERV9JTl9QUk9HUkVTU19DTEFTUyA9ICduZy1oaWRlLWFuaW1hdGUnO1xuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1Nob3dcbiAqIEBtdWx0aUVsZW1lbnRcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdTaG93YCBkaXJlY3RpdmUgc2hvd3Mgb3IgaGlkZXMgdGhlIGdpdmVuIEhUTUwgZWxlbWVudCBiYXNlZCBvbiB0aGUgZXhwcmVzc2lvblxuICogcHJvdmlkZWQgdG8gdGhlIGBuZ1Nob3dgIGF0dHJpYnV0ZS4gVGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIGJ5IHJlbW92aW5nIG9yIGFkZGluZ1xuICogdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIG9udG8gdGhlIGVsZW1lbnQuIFRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyBwcmVkZWZpbmVkXG4gKiBpbiBBbmd1bGFySlMgYW5kIHNldHMgdGhlIGRpc3BsYXkgc3R5bGUgdG8gbm9uZSAodXNpbmcgYW4gIWltcG9ydGFudCBmbGFnKS5cbiAqIEZvciBDU1AgbW9kZSBwbGVhc2UgYWRkIGBhbmd1bGFyLWNzcC5jc3NgIHRvIHlvdXIgaHRtbCBmaWxlIChzZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NzcCBuZ0NzcH0pLlxuICpcbiAqIGBgYGh0bWxcbiAqIDwhLS0gd2hlbiAkc2NvcGUubXlWYWx1ZSBpcyB0cnV0aHkgKGVsZW1lbnQgaXMgdmlzaWJsZSkgLS0+XG4gKiA8ZGl2IG5nLXNob3c9XCJteVZhbHVlXCI+PC9kaXY+XG4gKlxuICogPCEtLSB3aGVuICRzY29wZS5teVZhbHVlIGlzIGZhbHN5IChlbGVtZW50IGlzIGhpZGRlbikgLS0+XG4gKiA8ZGl2IG5nLXNob3c9XCJteVZhbHVlXCIgY2xhc3M9XCJuZy1oaWRlXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBXaGVuIHRoZSBgbmdTaG93YCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIGZhbHN5IHZhbHVlIHRoZW4gdGhlIGAubmctaGlkZWAgQ1NTIGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBjbGFzc1xuICogYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGNhdXNpbmcgaXQgdG8gYmVjb21lIGhpZGRlbi4gV2hlbiB0cnV0aHksIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyByZW1vdmVkXG4gKiBmcm9tIHRoZSBlbGVtZW50IGNhdXNpbmcgdGhlIGVsZW1lbnQgbm90IHRvIGFwcGVhciBoaWRkZW4uXG4gKlxuICogIyMgV2h5IGlzICFpbXBvcnRhbnQgdXNlZD9cbiAqXG4gKiBZb3UgbWF5IGJlIHdvbmRlcmluZyB3aHkgIWltcG9ydGFudCBpcyB1c2VkIGZvciB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MuIFRoaXMgaXMgYmVjYXVzZSB0aGUgYC5uZy1oaWRlYCBzZWxlY3RvclxuICogY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuIGJ5IGhlYXZpZXIgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIGFzIHNpbXBsZVxuICogYXMgY2hhbmdpbmcgdGhlIGRpc3BsYXkgc3R5bGUgb24gYSBIVE1MIGxpc3QgaXRlbSB3b3VsZCBtYWtlIGhpZGRlbiBlbGVtZW50cyBhcHBlYXIgdmlzaWJsZS5cbiAqIFRoaXMgYWxzbyBiZWNvbWVzIGEgYmlnZ2VyIGlzc3VlIHdoZW4gZGVhbGluZyB3aXRoIENTUyBmcmFtZXdvcmtzLlxuICpcbiAqIEJ5IHVzaW5nICFpbXBvcnRhbnQsIHRoZSBzaG93IGFuZCBoaWRlIGJlaGF2aW9yIHdpbGwgd29yayBhcyBleHBlY3RlZCBkZXNwaXRlIGFueSBjbGFzaCBiZXR3ZWVuIENTUyBzZWxlY3RvclxuICogc3BlY2lmaWNpdHkgKHdoZW4gIWltcG9ydGFudCBpc24ndCB1c2VkIHdpdGggYW55IGNvbmZsaWN0aW5nIHN0eWxlcykuIElmIGEgZGV2ZWxvcGVyIGNob29zZXMgdG8gb3ZlcnJpZGUgdGhlXG4gKiBzdHlsaW5nIHRvIGNoYW5nZSBob3cgdG8gaGlkZSBhbiBlbGVtZW50IHRoZW4gaXQgaXMganVzdCBhIG1hdHRlciBvZiB1c2luZyAhaW1wb3J0YW50IGluIHRoZWlyIG93biBDU1MgY29kZS5cbiAqXG4gKiAjIyMgT3ZlcnJpZGluZyBgLm5nLWhpZGVgXG4gKlxuICogQnkgZGVmYXVsdCwgdGhlIGAubmctaGlkZWAgY2xhc3Mgd2lsbCBzdHlsZSB0aGUgZWxlbWVudCB3aXRoIGBkaXNwbGF5OiBub25lIWltcG9ydGFudGAuIElmIHlvdSB3aXNoIHRvIGNoYW5nZVxuICogdGhlIGhpZGUgYmVoYXZpb3Igd2l0aCBuZ1Nob3cvbmdIaWRlIHRoZW4gdGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmVzdGF0aW5nIHRoZSBzdHlsZXMgZm9yIHRoZSBgLm5nLWhpZGVgXG4gKiBjbGFzcyBDU1MuIE5vdGUgdGhhdCB0aGUgc2VsZWN0b3IgdGhhdCBuZWVkcyB0byBiZSB1c2VkIGlzIGFjdHVhbGx5IGAubmctaGlkZTpub3QoLm5nLWhpZGUtYW5pbWF0ZSlgIHRvIGNvcGVcbiAqIHdpdGggZXh0cmEgYW5pbWF0aW9uIGNsYXNzZXMgdGhhdCBjYW4gYmUgYWRkZWQuXG4gKlxuICogYGBgY3NzXG4gKiAubmctaGlkZTpub3QoLm5nLWhpZGUtYW5pbWF0ZSkge1xuICogICAvJiM0MjsgdGhpcyBpcyBqdXN0IGFub3RoZXIgZm9ybSBvZiBoaWRpbmcgYW4gZWxlbWVudCAmIzQyOy9cbiAqICAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50O1xuICogICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gKiAgIHRvcDogLTk5OTlweDtcbiAqICAgbGVmdDogLTk5OTlweDtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEJ5IGRlZmF1bHQgeW91IGRvbid0IG5lZWQgdG8gb3ZlcnJpZGUgaW4gQ1NTIGFueXRoaW5nIGFuZCB0aGUgYW5pbWF0aW9ucyB3aWxsIHdvcmsgYXJvdW5kIHRoZSBkaXNwbGF5IHN0eWxlLlxuICpcbiAqICMjIEEgbm90ZSBhYm91dCBhbmltYXRpb25zIHdpdGggYG5nU2hvd2BcbiAqXG4gKiBBbmltYXRpb25zIGluIG5nU2hvdy9uZ0hpZGUgd29yayB3aXRoIHRoZSBzaG93IGFuZCBoaWRlIGV2ZW50cyB0aGF0IGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGV4cHJlc3Npb25cbiAqIGlzIHRydWUgYW5kIGZhbHNlLiBUaGlzIHN5c3RlbSB3b3JrcyBsaWtlIHRoZSBhbmltYXRpb24gc3lzdGVtIHByZXNlbnQgd2l0aCBuZ0NsYXNzIGV4Y2VwdCB0aGF0XG4gKiB5b3UgbXVzdCBhbHNvIGluY2x1ZGUgdGhlICFpbXBvcnRhbnQgZmxhZyB0byBvdmVycmlkZSB0aGUgZGlzcGxheSBwcm9wZXJ0eVxuICogc28gdGhhdCB5b3UgY2FuIHBlcmZvcm0gYW4gYW5pbWF0aW9uIHdoZW4gdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGR1cmluZyB0aGUgdGltZSBvZiB0aGUgYW5pbWF0aW9uLlxuICpcbiAqIGBgYGNzc1xuICogLy9cbiAqIC8vYSB3b3JraW5nIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBwYWdlXG4gKiAvL1xuICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQsIC5teS1lbGVtZW50Lm5nLWhpZGUtcmVtb3ZlIHtcbiAqICAgLyYjNDI7IHRoaXMgaXMgcmVxdWlyZWQgYXMgb2YgMS4zeCB0byBwcm9wZXJseVxuICogICAgICBhcHBseSBhbGwgc3R5bGluZyBpbiBhIHNob3cvaGlkZSBhbmltYXRpb24gJiM0MjsvXG4gKiAgIHRyYW5zaXRpb246IDBzIGxpbmVhciBhbGw7XG4gKiB9XG4gKlxuICogLm15LWVsZW1lbnQubmctaGlkZS1hZGQtYWN0aXZlLFxuICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUtYWN0aXZlIHtcbiAqICAgLyYjNDI7IHRoZSB0cmFuc2l0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGFjdGl2ZSBjbGFzcyAmIzQyOy9cbiAqICAgdHJhbnNpdGlvbjogMXMgbGluZWFyIGFsbDtcbiAqIH1cbiAqXG4gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZCB7IC4uLiB9XG4gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZC5uZy1oaWRlLWFkZC1hY3RpdmUgeyAuLi4gfVxuICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUgeyAuLi4gfVxuICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUubmctaGlkZS1yZW1vdmUtYWN0aXZlIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEtlZXAgaW4gbWluZCB0aGF0LCBhcyBvZiBBbmd1bGFySlMgdmVyc2lvbiAxLjMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlIHRoZSBkaXNwbGF5XG4gKiBwcm9wZXJ0eSB0byBibG9jayBkdXJpbmcgYW5pbWF0aW9uIHN0YXRlcy0tbmdBbmltYXRlIHdpbGwgaGFuZGxlIHRoZSBzdHlsZSB0b2dnbGluZyBhdXRvbWF0aWNhbGx5IGZvciB5b3UuXG4gKlxuICogQGFuaW1hdGlvbnNcbiAqIHwgQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfCBPY2N1cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCB7QGxpbmsgJGFuaW1hdGUjYWRkQ2xhc3MgYWRkQ2xhc3N9IGAubmctaGlkZWAgIHwgYWZ0ZXIgdGhlIGBuZ1Nob3dgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgbm9uIHRydXRoeSB2YWx1ZSBhbmQganVzdCBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgdG8gaGlkZGVuIHxcbiAqIHwge0BsaW5rICRhbmltYXRlI3JlbW92ZUNsYXNzIHJlbW92ZUNsYXNzfSAgYC5uZy1oaWRlYCAgfCBhZnRlciB0aGUgYG5nU2hvd2AgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUgYW5kIGp1c3QgYmVmb3JlIGNvbnRlbnRzIGFyZSBzZXQgdG8gdmlzaWJsZSB8XG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU2hvdyBJZiB0aGUge0BsaW5rIGd1aWRlL2V4cHJlc3Npb24gZXhwcmVzc2lvbn0gaXMgdHJ1dGh5XG4gKiAgICAgdGhlbiB0aGUgZWxlbWVudCBpcyBzaG93biBvciBoaWRkZW4gcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEBleGFtcGxlXG4gIDxleGFtcGxlIG1vZHVsZT1cIm5nQW5pbWF0ZVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIG5hbWU9XCJuZy1zaG93XCI+XG4gICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAgICAgIENsaWNrIG1lOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJjaGVja2VkXCIgYXJpYS1sYWJlbD1cIlRvZ2dsZSBuZ0hpZGVcIj48YnIvPlxuICAgICAgPGRpdj5cbiAgICAgICAgU2hvdzpcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1zaG93XCIgbmctc2hvdz1cImNoZWNrZWRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLXVwXCI+PC9zcGFuPiBJIHNob3cgdXAgd2hlbiB5b3VyIGNoZWNrYm94IGlzIGNoZWNrZWQuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICBIaWRlOlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2stZWxlbWVudCBhbmltYXRlLXNob3dcIiBuZy1oaWRlPVwiY2hlY2tlZFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi10aHVtYnMtZG93blwiPjwvc3Bhbj4gSSBoaWRlIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiZ2x5cGhpY29ucy5jc3NcIj5cbiAgICAgIEBpbXBvcnQgdXJsKC4uLy4uL2NvbXBvbmVudHMvYm9vdHN0cmFwLTMuMS4xL2Nzcy9ib290c3RyYXAuY3NzKTtcbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cImFuaW1hdGlvbnMuY3NzXCI+XG4gICAgICAuYW5pbWF0ZS1zaG93IHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtc2hvdy5uZy1oaWRlLWFkZCwgLmFuaW1hdGUtc2hvdy5uZy1oaWRlLXJlbW92ZSB7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41cztcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtc2hvdy5uZy1oaWRlIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDA7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgLmNoZWNrLWVsZW1lbnQge1xuICAgICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICB9XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIHZhciB0aHVtYnNVcCA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtdXAnKSk7XG4gICAgICB2YXIgdGh1bWJzRG93biA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtZG93bicpKTtcblxuICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zaG93IC8gbmctaGlkZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIGV4cGVjdCh0aHVtYnNEb3duLmlzRGlzcGxheWVkKCkpLnRvQmVUcnV0aHkoKTtcblxuICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7XG5cbiAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7XG4gICAgICB9KTtcbiAgICA8L2ZpbGU+XG4gIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nU2hvd0RpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgbXVsdGlFbGVtZW50OiB0cnVlLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZ1Nob3csIGZ1bmN0aW9uIG5nU2hvd1dhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIHdlJ3JlIGFkZGluZyBhIHRlbXBvcmFyeSwgYW5pbWF0aW9uLXNwZWNpZmljIGNsYXNzIGZvciBuZy1oaWRlIHNpbmNlIHRoaXMgd2F5XG4gICAgICAgIC8vIHdlIGNhbiBjb250cm9sIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgZGlzcGxheWVkIG9uIHNjcmVlbiB3aXRob3V0IGhhdmluZ1xuICAgICAgICAvLyB0byBoYXZlIGEgZ2xvYmFsL2dyZWVkeSBDU1Mgc2VsZWN0b3IgdGhhdCBicmVha3Mgd2hlbiBvdGhlciBhbmltYXRpb25zIGFyZSBydW4uXG4gICAgICAgIC8vIFJlYWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvaXNzdWVzLzkxMDMjaXNzdWVjb21tZW50LTU4MzM1ODQ1XG4gICAgICAgICRhbmltYXRlW3ZhbHVlID8gJ3JlbW92ZUNsYXNzJyA6ICdhZGRDbGFzcyddKGVsZW1lbnQsIE5HX0hJREVfQ0xBU1MsIHtcbiAgICAgICAgICB0ZW1wQ2xhc3NlczogTkdfSElERV9JTl9QUk9HUkVTU19DTEFTU1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1dO1xuXG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdIaWRlXG4gKiBAbXVsdGlFbGVtZW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nSGlkZWAgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIHRoZSBnaXZlbiBIVE1MIGVsZW1lbnQgYmFzZWQgb24gdGhlIGV4cHJlc3Npb25cbiAqIHByb3ZpZGVkIHRvIHRoZSBgbmdIaWRlYCBhdHRyaWJ1dGUuIFRoZSBlbGVtZW50IGlzIHNob3duIG9yIGhpZGRlbiBieSByZW1vdmluZyBvciBhZGRpbmdcbiAqIHRoZSBgbmctaGlkZWAgQ1NTIGNsYXNzIG9udG8gdGhlIGVsZW1lbnQuIFRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyBwcmVkZWZpbmVkXG4gKiBpbiBBbmd1bGFySlMgYW5kIHNldHMgdGhlIGRpc3BsYXkgc3R5bGUgdG8gbm9uZSAodXNpbmcgYW4gIWltcG9ydGFudCBmbGFnKS5cbiAqIEZvciBDU1AgbW9kZSBwbGVhc2UgYWRkIGBhbmd1bGFyLWNzcC5jc3NgIHRvIHlvdXIgaHRtbCBmaWxlIChzZWUge0BsaW5rIG5nLmRpcmVjdGl2ZTpuZ0NzcCBuZ0NzcH0pLlxuICpcbiAqIGBgYGh0bWxcbiAqIDwhLS0gd2hlbiAkc2NvcGUubXlWYWx1ZSBpcyB0cnV0aHkgKGVsZW1lbnQgaXMgaGlkZGVuKSAtLT5cbiAqIDxkaXYgbmctaGlkZT1cIm15VmFsdWVcIiBjbGFzcz1cIm5nLWhpZGVcIj48L2Rpdj5cbiAqXG4gKiA8IS0tIHdoZW4gJHNjb3BlLm15VmFsdWUgaXMgZmFsc3kgKGVsZW1lbnQgaXMgdmlzaWJsZSkgLS0+XG4gKiA8ZGl2IG5nLWhpZGU9XCJteVZhbHVlXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBXaGVuIHRoZSBgbmdIaWRlYCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSB0aGVuIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyBhZGRlZCB0byB0aGUgY2xhc3NcbiAqIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBjYXVzaW5nIGl0IHRvIGJlY29tZSBoaWRkZW4uIFdoZW4gZmFsc3ksIHRoZSBgLm5nLWhpZGVgIENTUyBjbGFzcyBpcyByZW1vdmVkXG4gKiBmcm9tIHRoZSBlbGVtZW50IGNhdXNpbmcgdGhlIGVsZW1lbnQgbm90IHRvIGFwcGVhciBoaWRkZW4uXG4gKlxuICogIyMgV2h5IGlzICFpbXBvcnRhbnQgdXNlZD9cbiAqXG4gKiBZb3UgbWF5IGJlIHdvbmRlcmluZyB3aHkgIWltcG9ydGFudCBpcyB1c2VkIGZvciB0aGUgYC5uZy1oaWRlYCBDU1MgY2xhc3MuIFRoaXMgaXMgYmVjYXVzZSB0aGUgYC5uZy1oaWRlYCBzZWxlY3RvclxuICogY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuIGJ5IGhlYXZpZXIgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgc29tZXRoaW5nIGFzIHNpbXBsZVxuICogYXMgY2hhbmdpbmcgdGhlIGRpc3BsYXkgc3R5bGUgb24gYSBIVE1MIGxpc3QgaXRlbSB3b3VsZCBtYWtlIGhpZGRlbiBlbGVtZW50cyBhcHBlYXIgdmlzaWJsZS5cbiAqIFRoaXMgYWxzbyBiZWNvbWVzIGEgYmlnZ2VyIGlzc3VlIHdoZW4gZGVhbGluZyB3aXRoIENTUyBmcmFtZXdvcmtzLlxuICpcbiAqIEJ5IHVzaW5nICFpbXBvcnRhbnQsIHRoZSBzaG93IGFuZCBoaWRlIGJlaGF2aW9yIHdpbGwgd29yayBhcyBleHBlY3RlZCBkZXNwaXRlIGFueSBjbGFzaCBiZXR3ZWVuIENTUyBzZWxlY3RvclxuICogc3BlY2lmaWNpdHkgKHdoZW4gIWltcG9ydGFudCBpc24ndCB1c2VkIHdpdGggYW55IGNvbmZsaWN0aW5nIHN0eWxlcykuIElmIGEgZGV2ZWxvcGVyIGNob29zZXMgdG8gb3ZlcnJpZGUgdGhlXG4gKiBzdHlsaW5nIHRvIGNoYW5nZSBob3cgdG8gaGlkZSBhbiBlbGVtZW50IHRoZW4gaXQgaXMganVzdCBhIG1hdHRlciBvZiB1c2luZyAhaW1wb3J0YW50IGluIHRoZWlyIG93biBDU1MgY29kZS5cbiAqXG4gKiAjIyMgT3ZlcnJpZGluZyBgLm5nLWhpZGVgXG4gKlxuICogQnkgZGVmYXVsdCwgdGhlIGAubmctaGlkZWAgY2xhc3Mgd2lsbCBzdHlsZSB0aGUgZWxlbWVudCB3aXRoIGBkaXNwbGF5OiBub25lIWltcG9ydGFudGAuIElmIHlvdSB3aXNoIHRvIGNoYW5nZVxuICogdGhlIGhpZGUgYmVoYXZpb3Igd2l0aCBuZ1Nob3cvbmdIaWRlIHRoZW4gdGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmVzdGF0aW5nIHRoZSBzdHlsZXMgZm9yIHRoZSBgLm5nLWhpZGVgXG4gKiBjbGFzcyBpbiBDU1M6XG4gKlxuICogYGBgY3NzXG4gKiAubmctaGlkZSB7XG4gKiAgIC8mIzQyOyB0aGlzIGlzIGp1c3QgYW5vdGhlciBmb3JtIG9mIGhpZGluZyBhbiBlbGVtZW50ICYjNDI7L1xuICogICBkaXNwbGF5OiBibG9jayFpbXBvcnRhbnQ7XG4gKiAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAqICAgdG9wOiAtOTk5OXB4O1xuICogICBsZWZ0OiAtOTk5OXB4O1xuICogfVxuICogYGBgXG4gKlxuICogQnkgZGVmYXVsdCB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBpbiBDU1MgYW55dGhpbmcgYW5kIHRoZSBhbmltYXRpb25zIHdpbGwgd29yayBhcm91bmQgdGhlIGRpc3BsYXkgc3R5bGUuXG4gKlxuICogIyMgQSBub3RlIGFib3V0IGFuaW1hdGlvbnMgd2l0aCBgbmdIaWRlYFxuICpcbiAqIEFuaW1hdGlvbnMgaW4gbmdTaG93L25nSGlkZSB3b3JrIHdpdGggdGhlIHNob3cgYW5kIGhpZGUgZXZlbnRzIHRoYXQgYXJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkaXJlY3RpdmUgZXhwcmVzc2lvblxuICogaXMgdHJ1ZSBhbmQgZmFsc2UuIFRoaXMgc3lzdGVtIHdvcmtzIGxpa2UgdGhlIGFuaW1hdGlvbiBzeXN0ZW0gcHJlc2VudCB3aXRoIG5nQ2xhc3MsIGV4Y2VwdCB0aGF0IHRoZSBgLm5nLWhpZGVgXG4gKiBDU1MgY2xhc3MgaXMgYWRkZWQgYW5kIHJlbW92ZWQgZm9yIHlvdSBpbnN0ZWFkIG9mIHlvdXIgb3duIENTUyBjbGFzcy5cbiAqXG4gKiBgYGBjc3NcbiAqIC8vXG4gKiAvL2Egd29ya2luZyBleGFtcGxlIGNhbiBiZSBmb3VuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcGFnZVxuICogLy9cbiAqIC5teS1lbGVtZW50Lm5nLWhpZGUtYWRkLCAubXktZWxlbWVudC5uZy1oaWRlLXJlbW92ZSB7XG4gKiAgIHRyYW5zaXRpb246IDAuNXMgbGluZWFyIGFsbDtcbiAqIH1cbiAqXG4gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZCB7IC4uLiB9XG4gKiAubXktZWxlbWVudC5uZy1oaWRlLWFkZC5uZy1oaWRlLWFkZC1hY3RpdmUgeyAuLi4gfVxuICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUgeyAuLi4gfVxuICogLm15LWVsZW1lbnQubmctaGlkZS1yZW1vdmUubmctaGlkZS1yZW1vdmUtYWN0aXZlIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIEtlZXAgaW4gbWluZCB0aGF0LCBhcyBvZiBBbmd1bGFySlMgdmVyc2lvbiAxLjMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hhbmdlIHRoZSBkaXNwbGF5XG4gKiBwcm9wZXJ0eSB0byBibG9jayBkdXJpbmcgYW5pbWF0aW9uIHN0YXRlcy0tbmdBbmltYXRlIHdpbGwgaGFuZGxlIHRoZSBzdHlsZSB0b2dnbGluZyBhdXRvbWF0aWNhbGx5IGZvciB5b3UuXG4gKlxuICogQGFuaW1hdGlvbnNcbiAqIHwgQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfCBPY2N1cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCB7QGxpbmsgJGFuaW1hdGUjYWRkQ2xhc3MgYWRkQ2xhc3N9IGAubmctaGlkZWAgIHwgYWZ0ZXIgdGhlIGBuZ0hpZGVgIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlIGFuZCBqdXN0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCB0byBoaWRkZW4gfFxuICogfCB7QGxpbmsgJGFuaW1hdGUjcmVtb3ZlQ2xhc3MgcmVtb3ZlQ2xhc3N9ICBgLm5nLWhpZGVgICB8IGFmdGVyIHRoZSBgbmdIaWRlYCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIG5vbiB0cnV0aHkgdmFsdWUgYW5kIGp1c3QgYmVmb3JlIGNvbnRlbnRzIGFyZSBzZXQgdG8gdmlzaWJsZSB8XG4gKlxuICpcbiAqIEBlbGVtZW50IEFOWVxuICogQHBhcmFtIHtleHByZXNzaW9ufSBuZ0hpZGUgSWYgdGhlIHtAbGluayBndWlkZS9leHByZXNzaW9uIGV4cHJlc3Npb259IGlzIHRydXRoeSB0aGVuXG4gKiAgICAgdGhlIGVsZW1lbnQgaXMgc2hvd24gb3IgaGlkZGVuIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBAZXhhbXBsZVxuICA8ZXhhbXBsZSBtb2R1bGU9XCJuZ0FuaW1hdGVcIiBkZXBzPVwiYW5ndWxhci1hbmltYXRlLmpzXCIgYW5pbWF0aW9ucz1cInRydWVcIiBuYW1lPVwibmctaGlkZVwiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICBDbGljayBtZTogPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nLW1vZGVsPVwiY2hlY2tlZFwiIGFyaWEtbGFiZWw9XCJUb2dnbGUgbmdTaG93XCI+PGJyLz5cbiAgICAgIDxkaXY+XG4gICAgICAgIFNob3c6XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGVjay1lbGVtZW50IGFuaW1hdGUtaGlkZVwiIG5nLXNob3c9XCJjaGVja2VkXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXRodW1icy11cFwiPjwvc3Bhbj4gSSBzaG93IHVwIHdoZW4geW91ciBjaGVja2JveCBpcyBjaGVja2VkLlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgSGlkZTpcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrLWVsZW1lbnQgYW5pbWF0ZS1oaWRlXCIgbmctaGlkZT1cImNoZWNrZWRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tdGh1bWJzLWRvd25cIj48L3NwYW4+IEkgaGlkZSB3aGVuIHlvdXIgY2hlY2tib3ggaXMgY2hlY2tlZC5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cImdseXBoaWNvbnMuY3NzXCI+XG4gICAgICBAaW1wb3J0IHVybCguLi8uLi9jb21wb25lbnRzL2Jvb3RzdHJhcC0zLjEuMS9jc3MvYm9vdHN0cmFwLmNzcyk7XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJhbmltYXRpb25zLmNzc1wiPlxuICAgICAgLmFuaW1hdGUtaGlkZSB7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCBsaW5lYXIgMC41cztcbiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtaGlkZS5uZy1oaWRlIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDA7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgLmNoZWNrLWVsZW1lbnQge1xuICAgICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICB9XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIHZhciB0aHVtYnNVcCA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtdXAnKSk7XG4gICAgICB2YXIgdGh1bWJzRG93biA9IGVsZW1lbnQoYnkuY3NzKCdzcGFuLmdseXBoaWNvbi10aHVtYnMtZG93bicpKTtcblxuICAgICAgaXQoJ3Nob3VsZCBjaGVjayBuZy1zaG93IC8gbmctaGlkZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBleHBlY3QodGh1bWJzVXAuaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIGV4cGVjdCh0aHVtYnNEb3duLmlzRGlzcGxheWVkKCkpLnRvQmVUcnV0aHkoKTtcblxuICAgICAgICBlbGVtZW50KGJ5Lm1vZGVsKCdjaGVja2VkJykpLmNsaWNrKCk7XG5cbiAgICAgICAgZXhwZWN0KHRodW1ic1VwLmlzRGlzcGxheWVkKCkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHRodW1ic0Rvd24uaXNEaXNwbGF5ZWQoKSkudG9CZUZhbHN5KCk7XG4gICAgICB9KTtcbiAgICA8L2ZpbGU+XG4gIDwvZXhhbXBsZT5cbiAqL1xudmFyIG5nSGlkZURpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCBmdW5jdGlvbigkYW5pbWF0ZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgbXVsdGlFbGVtZW50OiB0cnVlLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZ0hpZGUsIGZ1bmN0aW9uIG5nSGlkZVdhdGNoQWN0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIFRoZSBjb21tZW50IGluc2lkZSBvZiB0aGUgbmdTaG93RGlyZWN0aXZlIGV4cGxhaW5zIHdoeSB3ZSBhZGQgYW5kXG4gICAgICAgIC8vIHJlbW92ZSBhIHRlbXBvcmFyeSBjbGFzcyBmb3IgdGhlIHNob3cvaGlkZSBhbmltYXRpb25cbiAgICAgICAgJGFuaW1hdGVbdmFsdWUgPyAnYWRkQ2xhc3MnIDogJ3JlbW92ZUNsYXNzJ10oZWxlbWVudCxOR19ISURFX0NMQVNTLCB7XG4gICAgICAgICAgdGVtcENsYXNzZXM6IE5HX0hJREVfSU5fUFJPR1JFU1NfQ0xBU1NcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1N0eWxlXG4gKiBAcmVzdHJpY3QgQUNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgbmdTdHlsZWAgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gc2V0IENTUyBzdHlsZSBvbiBhbiBIVE1MIGVsZW1lbnQgY29uZGl0aW9uYWxseS5cbiAqXG4gKiBAa25vd25Jc3N1ZVxuICogWW91IHNob3VsZCBub3QgdXNlIHtAbGluayBndWlkZS9pbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb259IGluIHRoZSB2YWx1ZSBvZiB0aGUgYHN0eWxlYFxuICogYXR0cmlidXRlLCB3aGVuIHVzaW5nIHRoZSBgbmdTdHlsZWAgZGlyZWN0aXZlIG9uIHRoZSBzYW1lIGVsZW1lbnQuXG4gKiBTZWUge0BsaW5rIGd1aWRlL2ludGVycG9sYXRpb24ja25vd24taXNzdWVzIGhlcmV9IGZvciBtb3JlIGluZm8uXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKiBAcGFyYW0ge2V4cHJlc3Npb259IG5nU3R5bGVcbiAqXG4gKiB7QGxpbmsgZ3VpZGUvZXhwcmVzc2lvbiBFeHByZXNzaW9ufSB3aGljaCBldmFscyB0byBhblxuICogb2JqZWN0IHdob3NlIGtleXMgYXJlIENTUyBzdHlsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhvc2UgQ1NTXG4gKiBrZXlzLlxuICpcbiAqIFNpbmNlIHNvbWUgQ1NTIHN0eWxlIG5hbWVzIGFyZSBub3QgdmFsaWQga2V5cyBmb3IgYW4gb2JqZWN0LCB0aGV5IG11c3QgYmUgcXVvdGVkLlxuICogU2VlIHRoZSAnYmFja2dyb3VuZC1jb2xvcicgc3R5bGUgaW4gdGhlIGV4YW1wbGUgYmVsb3cuXG4gKlxuICogQGV4YW1wbGVcbiAgIDxleGFtcGxlIG5hbWU9XCJuZy1zdHlsZVwiPlxuICAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwic2V0IGNvbG9yXCIgbmctY2xpY2s9XCJteVN0eWxlPXtjb2xvcjoncmVkJ31cIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cInNldCBiYWNrZ3JvdW5kXCIgbmctY2xpY2s9XCJteVN0eWxlPXsnYmFja2dyb3VuZC1jb2xvcic6J2JsdWUnfVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiY2xlYXJcIiBuZy1jbGljaz1cIm15U3R5bGU9e31cIj5cbiAgICAgICAgPGJyLz5cbiAgICAgICAgPHNwYW4gbmctc3R5bGU9XCJteVN0eWxlXCI+U2FtcGxlIFRleHQ8L3NwYW4+XG4gICAgICAgIDxwcmU+bXlTdHlsZT17e215U3R5bGV9fTwvcHJlPlxuICAgICA8L2ZpbGU+XG4gICAgIDxmaWxlIG5hbWU9XCJzdHlsZS5jc3NcIj5cbiAgICAgICBzcGFuIHtcbiAgICAgICAgIGNvbG9yOiBibGFjaztcbiAgICAgICB9XG4gICAgIDwvZmlsZT5cbiAgICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIHZhciBjb2xvclNwYW4gPSBlbGVtZW50KGJ5LmNzcygnc3BhbicpKTtcblxuICAgICAgIGl0KCdzaG91bGQgY2hlY2sgbmctc3R5bGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMCwgMCwgMCwgMSknKTtcbiAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCdpbnB1dFt2YWx1ZT1cXCdzZXQgY29sb3JcXCddJykpLmNsaWNrKCk7XG4gICAgICAgICBleHBlY3QoY29sb3JTcGFuLmdldENzc1ZhbHVlKCdjb2xvcicpKS50b0JlKCdyZ2JhKDI1NSwgMCwgMCwgMSknKTtcbiAgICAgICAgIGVsZW1lbnQoYnkuY3NzKCdpbnB1dFt2YWx1ZT1jbGVhcl0nKSkuY2xpY2soKTtcbiAgICAgICAgIGV4cGVjdChjb2xvclNwYW4uZ2V0Q3NzVmFsdWUoJ2NvbG9yJykpLnRvQmUoJ3JnYmEoMCwgMCwgMCwgMSknKTtcbiAgICAgICB9KTtcbiAgICAgPC9maWxlPlxuICAgPC9leGFtcGxlPlxuICovXG52YXIgbmdTdHlsZURpcmVjdGl2ZSA9IG5nRGlyZWN0aXZlKGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyKSB7XG4gIHNjb3BlLiR3YXRjaChhdHRyLm5nU3R5bGUsIGZ1bmN0aW9uIG5nU3R5bGVXYXRjaEFjdGlvbihuZXdTdHlsZXMsIG9sZFN0eWxlcykge1xuICAgIGlmIChvbGRTdHlsZXMgJiYgKG5ld1N0eWxlcyAhPT0gb2xkU3R5bGVzKSkge1xuICAgICAgZm9yRWFjaChvbGRTdHlsZXMsIGZ1bmN0aW9uKHZhbCwgc3R5bGUpIHsgZWxlbWVudC5jc3Moc3R5bGUsICcnKTt9KTtcbiAgICB9XG4gICAgaWYgKG5ld1N0eWxlcykgZWxlbWVudC5jc3MobmV3U3R5bGVzKTtcbiAgfSwgdHJ1ZSk7XG59KTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ1N3aXRjaFxuICogQHJlc3RyaWN0IEVBXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYG5nU3dpdGNoYCBkaXJlY3RpdmUgaXMgdXNlZCB0byBjb25kaXRpb25hbGx5IHN3YXAgRE9NIHN0cnVjdHVyZSBvbiB5b3VyIHRlbXBsYXRlIGJhc2VkIG9uIGEgc2NvcGUgZXhwcmVzc2lvbi5cbiAqIEVsZW1lbnRzIHdpdGhpbiBgbmdTd2l0Y2hgIGJ1dCB3aXRob3V0IGBuZ1N3aXRjaFdoZW5gIG9yIGBuZ1N3aXRjaERlZmF1bHRgIGRpcmVjdGl2ZXMgd2lsbCBiZSBwcmVzZXJ2ZWQgYXQgdGhlIGxvY2F0aW9uXG4gKiBhcyBzcGVjaWZpZWQgaW4gdGhlIHRlbXBsYXRlLlxuICpcbiAqIFRoZSBkaXJlY3RpdmUgaXRzZWxmIHdvcmtzIHNpbWlsYXIgdG8gbmdJbmNsdWRlLCBob3dldmVyLCBpbnN0ZWFkIG9mIGRvd25sb2FkaW5nIHRlbXBsYXRlIGNvZGUgKG9yIGxvYWRpbmcgaXRcbiAqIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlKSwgYG5nU3dpdGNoYCBzaW1wbHkgY2hvb3NlcyBvbmUgb2YgdGhlIG5lc3RlZCBlbGVtZW50cyBhbmQgbWFrZXMgaXQgdmlzaWJsZSBiYXNlZCBvbiB3aGljaCBlbGVtZW50XG4gKiBtYXRjaGVzIHRoZSB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBldmFsdWF0ZWQgZXhwcmVzc2lvbi4gSW4gb3RoZXIgd29yZHMsIHlvdSBkZWZpbmUgYSBjb250YWluZXIgZWxlbWVudFxuICogKHdoZXJlIHlvdSBwbGFjZSB0aGUgZGlyZWN0aXZlKSwgcGxhY2UgYW4gZXhwcmVzc2lvbiBvbiB0aGUgKipgb249XCIuLi5cImAgYXR0cmlidXRlKipcbiAqIChvciB0aGUgKipgbmctc3dpdGNoPVwiLi4uXCJgIGF0dHJpYnV0ZSoqKSwgZGVmaW5lIGFueSBpbm5lciBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGRpcmVjdGl2ZSBhbmQgcGxhY2VcbiAqIGEgd2hlbiBhdHRyaWJ1dGUgcGVyIGVsZW1lbnQuIFRoZSB3aGVuIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGluZm9ybSBuZ1N3aXRjaCB3aGljaCBlbGVtZW50IHRvIGRpc3BsYXkgd2hlbiB0aGUgb25cbiAqIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLiBJZiBhIG1hdGNoaW5nIGV4cHJlc3Npb24gaXMgbm90IGZvdW5kIHZpYSBhIHdoZW4gYXR0cmlidXRlIHRoZW4gYW4gZWxlbWVudCB3aXRoIHRoZSBkZWZhdWx0XG4gKiBhdHRyaWJ1dGUgaXMgZGlzcGxheWVkLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiBCZSBhd2FyZSB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1hdGNoIGFnYWluc3QgY2Fubm90IGJlIGV4cHJlc3Npb25zLiBUaGV5IGFyZSBpbnRlcnByZXRlZFxuICogYXMgbGl0ZXJhbCBzdHJpbmcgdmFsdWVzIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBGb3IgZXhhbXBsZSwgKipgbmctc3dpdGNoLXdoZW49XCJzb21lVmFsXCJgKiogd2lsbCBtYXRjaCBhZ2FpbnN0IHRoZSBzdHJpbmcgYFwic29tZVZhbFwiYCBub3QgYWdhaW5zdCB0aGVcbiAqIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGAkc2NvcGUuc29tZVZhbGAuXG4gKiA8L2Rpdj5cblxuICogQGFuaW1hdGlvbnNcbiAqIHwgQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgfCBPY2N1cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCB7QGxpbmsgbmcuJGFuaW1hdGUjZW50ZXIgZW50ZXJ9ICB8IGFmdGVyIHRoZSBuZ1N3aXRjaCBjb250ZW50cyBjaGFuZ2UgYW5kIHRoZSBtYXRjaGVkIGNoaWxkIGVsZW1lbnQgaXMgcGxhY2VkIGluc2lkZSB0aGUgY29udGFpbmVyIHxcbiAqIHwge0BsaW5rIG5nLiRhbmltYXRlI2xlYXZlIGxlYXZlfSAgfCBhZnRlciB0aGUgbmdTd2l0Y2ggY29udGVudHMgY2hhbmdlIGFuZCBqdXN0IGJlZm9yZSB0aGUgZm9ybWVyIGNvbnRlbnRzIGFyZSByZW1vdmVkIGZyb20gdGhlIERPTSB8XG4gKlxuICogQHVzYWdlXG4gKlxuICogYGBgXG4gKiA8QU5ZIG5nLXN3aXRjaD1cImV4cHJlc3Npb25cIj5cbiAqICAgPEFOWSBuZy1zd2l0Y2gtd2hlbj1cIm1hdGNoVmFsdWUxXCI+Li4uPC9BTlk+XG4gKiAgIDxBTlkgbmctc3dpdGNoLXdoZW49XCJtYXRjaFZhbHVlMlwiPi4uLjwvQU5ZPlxuICogICA8QU5ZIG5nLXN3aXRjaC1kZWZhdWx0Pi4uLjwvQU5ZPlxuICogPC9BTlk+XG4gKiBgYGBcbiAqXG4gKlxuICogQHNjb3BlXG4gKiBAcHJpb3JpdHkgMTIwMFxuICogQHBhcmFtIHsqfSBuZ1N3aXRjaHxvbiBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QgPGNvZGU+bmctc3dpdGNoLXdoZW48L2NvZGU+LlxuICogT24gY2hpbGQgZWxlbWVudHMgYWRkOlxuICpcbiAqICogYG5nU3dpdGNoV2hlbmA6IHRoZSBjYXNlIHN0YXRlbWVudCB0byBtYXRjaCBhZ2FpbnN0LiBJZiBtYXRjaCB0aGVuIHRoaXNcbiAqICAgY2FzZSB3aWxsIGJlIGRpc3BsYXllZC4gSWYgdGhlIHNhbWUgbWF0Y2ggYXBwZWFycyBtdWx0aXBsZSB0aW1lcywgYWxsIHRoZVxuICogICBlbGVtZW50cyB3aWxsIGJlIGRpc3BsYXllZC4gSXQgaXMgcG9zc2libGUgdG8gYXNzb2NpYXRlIG11bHRpcGxlIHZhbHVlcyB0b1xuICogICB0aGUgc2FtZSBgbmdTd2l0Y2hXaGVuYCBieSBkZWZpbmluZyB0aGUgb3B0aW9uYWwgYXR0cmlidXRlXG4gKiAgIGBuZ1N3aXRjaFdoZW5TZXBhcmF0b3JgLiBUaGUgc2VwYXJhdG9yIHdpbGwgYmUgdXNlZCB0byBzcGxpdCB0aGUgdmFsdWUgb2ZcbiAqICAgdGhlIGBuZ1N3aXRjaFdoZW5gIGF0dHJpYnV0ZSBpbnRvIG11bHRpcGxlIHRva2VucywgYW5kIHRoZSBlbGVtZW50IHdpbGwgc2hvd1xuICogICBpZiBhbnkgb2YgdGhlIGBuZ1N3aXRjaGAgZXZhbHVhdGVzIHRvIGFueSBvZiB0aGVzZSB0b2tlbnMuXG4gKiAqIGBuZ1N3aXRjaERlZmF1bHRgOiB0aGUgZGVmYXVsdCBjYXNlIHdoZW4gbm8gb3RoZXIgY2FzZSBtYXRjaC4gSWYgdGhlcmVcbiAqICAgYXJlIG11bHRpcGxlIGRlZmF1bHQgY2FzZXMsIGFsbCBvZiB0aGVtIHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gbm8gb3RoZXJcbiAqICAgY2FzZSBtYXRjaC5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAgPGV4YW1wbGUgbW9kdWxlPVwic3dpdGNoRXhhbXBsZVwiIGRlcHM9XCJhbmd1bGFyLWFuaW1hdGUuanNcIiBhbmltYXRpb25zPVwidHJ1ZVwiIG5hbWU9XCJuZy1zd2l0Y2hcIj5cbiAgICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAgICAgICAgPHNlbGVjdCBuZy1tb2RlbD1cInNlbGVjdGlvblwiIG5nLW9wdGlvbnM9XCJpdGVtIGZvciBpdGVtIGluIGl0ZW1zXCI+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8Y29kZT5zZWxlY3Rpb249e3tzZWxlY3Rpb259fTwvY29kZT5cbiAgICAgICAgPGhyLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFuaW1hdGUtc3dpdGNoLWNvbnRhaW5lclwiXG4gICAgICAgICAgbmctc3dpdGNoIG9uPVwic2VsZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5pbWF0ZS1zd2l0Y2hcIiBuZy1zd2l0Y2gtd2hlbj1cInNldHRpbmdzfG9wdGlvbnNcIiBuZy1zd2l0Y2gtd2hlbi1zZXBhcmF0b3I9XCJ8XCI+U2V0dGluZ3MgRGl2PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5pbWF0ZS1zd2l0Y2hcIiBuZy1zd2l0Y2gtd2hlbj1cImhvbWVcIj5Ib21lIFNwYW48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmltYXRlLXN3aXRjaFwiIG5nLXN3aXRjaC1kZWZhdWx0PmRlZmF1bHQ8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpbGU+XG4gICAgPGZpbGUgbmFtZT1cInNjcmlwdC5qc1wiPlxuICAgICAgYW5ndWxhci5tb2R1bGUoJ3N3aXRjaEV4YW1wbGUnLCBbJ25nQW5pbWF0ZSddKVxuICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgICAgICRzY29wZS5pdGVtcyA9IFsnc2V0dGluZ3MnLCAnaG9tZScsICdvcHRpb25zJywgJ290aGVyJ107XG4gICAgICAgICAgJHNjb3BlLnNlbGVjdGlvbiA9ICRzY29wZS5pdGVtc1swXTtcbiAgICAgICAgfV0pO1xuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwiYW5pbWF0aW9ucy5jc3NcIj5cbiAgICAgIC5hbmltYXRlLXN3aXRjaC1jb250YWluZXIge1xuICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgICAgICAgYmFja2dyb3VuZDp3aGl0ZTtcbiAgICAgICAgYm9yZGVyOjFweCBzb2xpZCBibGFjaztcbiAgICAgICAgaGVpZ2h0OjQwcHg7XG4gICAgICAgIG92ZXJmbG93OmhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLmFuaW1hdGUtc3dpdGNoIHtcbiAgICAgICAgcGFkZGluZzoxMHB4O1xuICAgICAgfVxuXG4gICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctYW5pbWF0ZSB7XG4gICAgICAgIHRyYW5zaXRpb246YWxsIGN1YmljLWJlemllcigwLjI1MCwgMC40NjAsIDAuNDUwLCAwLjk0MCkgMC41cztcblxuICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICAgICAgdG9wOjA7XG4gICAgICAgIGxlZnQ6MDtcbiAgICAgICAgcmlnaHQ6MDtcbiAgICAgICAgYm90dG9tOjA7XG4gICAgICB9XG5cbiAgICAgIC5hbmltYXRlLXN3aXRjaC5uZy1sZWF2ZS5uZy1sZWF2ZS1hY3RpdmUsXG4gICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctZW50ZXIge1xuICAgICAgICB0b3A6LTUwcHg7XG4gICAgICB9XG4gICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctbGVhdmUsXG4gICAgICAuYW5pbWF0ZS1zd2l0Y2gubmctZW50ZXIubmctZW50ZXItYWN0aXZlIHtcbiAgICAgICAgdG9wOjA7XG4gICAgICB9XG4gICAgPC9maWxlPlxuICAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgIHZhciBzd2l0Y2hFbGVtID0gZWxlbWVudChieS5jc3MoJ1tuZy1zd2l0Y2hdJykpO1xuICAgICAgdmFyIHNlbGVjdCA9IGVsZW1lbnQoYnkubW9kZWwoJ3NlbGVjdGlvbicpKTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdGFydCBpbiBzZXR0aW5ncycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL1NldHRpbmdzIERpdi8pO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGNoYW5nZSB0byBob21lJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDEpLmNsaWNrKCk7XG4gICAgICAgIGV4cGVjdChzd2l0Y2hFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvSG9tZSBTcGFuLyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgY2hhbmdlIHRvIHNldHRpbmdzIHZpYSBcIm9wdGlvbnNcIicsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxlY3QuYWxsKGJ5LmNzcygnb3B0aW9uJykpLmdldCgyKS5jbGljaygpO1xuICAgICAgICBleHBlY3Qoc3dpdGNoRWxlbS5nZXRUZXh0KCkpLnRvTWF0Y2goL1NldHRpbmdzIERpdi8pO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHNlbGVjdCBkZWZhdWx0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGVjdC5hbGwoYnkuY3NzKCdvcHRpb24nKSkuZ2V0KDMpLmNsaWNrKCk7XG4gICAgICAgIGV4cGVjdChzd2l0Y2hFbGVtLmdldFRleHQoKSkudG9NYXRjaCgvZGVmYXVsdC8pO1xuICAgICAgfSk7XG4gICAgPC9maWxlPlxuICA8L2V4YW1wbGU+XG4gKi9cbnZhciBuZ1N3aXRjaERpcmVjdGl2ZSA9IFsnJGFuaW1hdGUnLCAnJGNvbXBpbGUnLCBmdW5jdGlvbigkYW5pbWF0ZSwgJGNvbXBpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlOiAnbmdTd2l0Y2gnLFxuXG4gICAgLy8gYXNrcyBmb3IgJHNjb3BlIHRvIGZvb2wgdGhlIEJDIGNvbnRyb2xsZXIgbW9kdWxlXG4gICAgY29udHJvbGxlcjogWyckc2NvcGUnLCBmdW5jdGlvbiBOZ1N3aXRjaENvbnRyb2xsZXIoKSB7XG4gICAgIHRoaXMuY2FzZXMgPSB7fTtcbiAgICB9XSxcbiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgbmdTd2l0Y2hDb250cm9sbGVyKSB7XG4gICAgICB2YXIgd2F0Y2hFeHByID0gYXR0ci5uZ1N3aXRjaCB8fCBhdHRyLm9uLFxuICAgICAgICAgIHNlbGVjdGVkVHJhbnNjbHVkZXMgPSBbXSxcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzID0gW10sXG4gICAgICAgICAgcHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMgPSBbXSxcbiAgICAgICAgICBzZWxlY3RlZFNjb3BlcyA9IFtdO1xuXG4gICAgICB2YXIgc3BsaWNlRmFjdG9yeSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9PSBmYWxzZSkgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgc2NvcGUuJHdhdGNoKHdhdGNoRXhwciwgZnVuY3Rpb24gbmdTd2l0Y2hXYXRjaEFjdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgaSwgaWk7XG5cbiAgICAgICAgLy8gU3RhcnQgd2l0aCB0aGUgbGFzdCwgaW4gY2FzZSB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgZHVyaW5nIHRoZSBsb29wXG4gICAgICAgIHdoaWxlIChwcmV2aW91c0xlYXZlQW5pbWF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAkYW5pbWF0ZS5jYW5jZWwocHJldmlvdXNMZWF2ZUFuaW1hdGlvbnMucG9wKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBzZWxlY3RlZFNjb3Blcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkID0gZ2V0QmxvY2tOb2RlcyhzZWxlY3RlZEVsZW1lbnRzW2ldLmNsb25lKTtcbiAgICAgICAgICBzZWxlY3RlZFNjb3Blc1tpXS4kZGVzdHJveSgpO1xuICAgICAgICAgIHZhciBydW5uZXIgPSBwcmV2aW91c0xlYXZlQW5pbWF0aW9uc1tpXSA9ICRhbmltYXRlLmxlYXZlKHNlbGVjdGVkKTtcbiAgICAgICAgICBydW5uZXIuZG9uZShzcGxpY2VGYWN0b3J5KHByZXZpb3VzTGVhdmVBbmltYXRpb25zLCBpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNlbGVjdGVkU2NvcGVzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgaWYgKChzZWxlY3RlZFRyYW5zY2x1ZGVzID0gbmdTd2l0Y2hDb250cm9sbGVyLmNhc2VzWychJyArIHZhbHVlXSB8fCBuZ1N3aXRjaENvbnRyb2xsZXIuY2FzZXNbJz8nXSkpIHtcbiAgICAgICAgICBmb3JFYWNoKHNlbGVjdGVkVHJhbnNjbHVkZXMsIGZ1bmN0aW9uKHNlbGVjdGVkVHJhbnNjbHVkZSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRUcmFuc2NsdWRlLnRyYW5zY2x1ZGUoZnVuY3Rpb24oY2FzZUVsZW1lbnQsIHNlbGVjdGVkU2NvcGUpIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRTY29wZXMucHVzaChzZWxlY3RlZFNjb3BlKTtcbiAgICAgICAgICAgICAgdmFyIGFuY2hvciA9IHNlbGVjdGVkVHJhbnNjbHVkZS5lbGVtZW50O1xuICAgICAgICAgICAgICBjYXNlRWxlbWVudFtjYXNlRWxlbWVudC5sZW5ndGgrK10gPSAkY29tcGlsZS4kJGNyZWF0ZUNvbW1lbnQoJ2VuZCBuZ1N3aXRjaFdoZW4nKTtcbiAgICAgICAgICAgICAgdmFyIGJsb2NrID0geyBjbG9uZTogY2FzZUVsZW1lbnQgfTtcblxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgICAkYW5pbWF0ZS5lbnRlcihjYXNlRWxlbWVudCwgYW5jaG9yLnBhcmVudCgpLCBhbmNob3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1dO1xuXG52YXIgbmdTd2l0Y2hXaGVuRGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoe1xuICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsXG4gIHByaW9yaXR5OiAxMjAwLFxuICByZXF1aXJlOiAnXm5nU3dpdGNoJyxcbiAgbXVsdGlFbGVtZW50OiB0cnVlLFxuICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIGN0cmwsICR0cmFuc2NsdWRlKSB7XG5cbiAgICB2YXIgY2FzZXMgPSBhdHRycy5uZ1N3aXRjaFdoZW4uc3BsaXQoYXR0cnMubmdTd2l0Y2hXaGVuU2VwYXJhdG9yKS5zb3J0KCkuZmlsdGVyKFxuICAgICAgLy8gRmlsdGVyIGR1cGxpY2F0ZSBjYXNlc1xuICAgICAgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgsIGFycmF5KSB7IHJldHVybiBhcnJheVtpbmRleCAtIDFdICE9PSBlbGVtZW50OyB9XG4gICAgKTtcblxuICAgIGZvckVhY2goY2FzZXMsIGZ1bmN0aW9uKHdoZW5DYXNlKSB7XG4gICAgICBjdHJsLmNhc2VzWychJyArIHdoZW5DYXNlXSA9IChjdHJsLmNhc2VzWychJyArIHdoZW5DYXNlXSB8fCBbXSk7XG4gICAgICBjdHJsLmNhc2VzWychJyArIHdoZW5DYXNlXS5wdXNoKHsgdHJhbnNjbHVkZTogJHRyYW5zY2x1ZGUsIGVsZW1lbnQ6IGVsZW1lbnQgfSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG52YXIgbmdTd2l0Y2hEZWZhdWx0RGlyZWN0aXZlID0gbmdEaXJlY3RpdmUoe1xuICB0cmFuc2NsdWRlOiAnZWxlbWVudCcsXG4gIHByaW9yaXR5OiAxMjAwLFxuICByZXF1aXJlOiAnXm5nU3dpdGNoJyxcbiAgbXVsdGlFbGVtZW50OiB0cnVlLFxuICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgY3RybCwgJHRyYW5zY2x1ZGUpIHtcbiAgICBjdHJsLmNhc2VzWyc/J10gPSAoY3RybC5jYXNlc1snPyddIHx8IFtdKTtcbiAgICBjdHJsLmNhc2VzWyc/J10ucHVzaCh7IHRyYW5zY2x1ZGU6ICR0cmFuc2NsdWRlLCBlbGVtZW50OiBlbGVtZW50IH0pO1xuICAgfVxufSk7XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdUcmFuc2NsdWRlXG4gKiBAcmVzdHJpY3QgRUFDXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEaXJlY3RpdmUgdGhhdCBtYXJrcyB0aGUgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgdHJhbnNjbHVkZWQgRE9NIG9mIHRoZSBuZWFyZXN0IHBhcmVudCBkaXJlY3RpdmUgdGhhdCB1c2VzIHRyYW5zY2x1c2lvbi5cbiAqXG4gKiBZb3UgY2FuIHNwZWNpZnkgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQgYSBuYW1lZCB0cmFuc2NsdXNpb24gc2xvdCwgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBzbG90LCBieSBwcm92aWRpbmcgdGhlIHNsb3QgbmFtZVxuICogYXMgdGhlIHZhbHVlIG9mIHRoZSBgbmctdHJhbnNjbHVkZWAgb3IgYG5nLXRyYW5zY2x1ZGUtc2xvdGAgYXR0cmlidXRlLlxuICpcbiAqIElmIHRoZSB0cmFuc2NsdWRlZCBjb250ZW50IGlzIG5vdCBlbXB0eSAoaS5lLiBjb250YWlucyBvbmUgb3IgbW9yZSBET00gbm9kZXMsIGluY2x1ZGluZyB3aGl0ZXNwYWNlIHRleHQgbm9kZXMpLCBhbnkgZXhpc3RpbmdcbiAqIGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaXMgaW5zZXJ0ZWQuXG4gKiBJZiB0aGUgdHJhbnNjbHVkZWQgY29udGVudCBpcyBlbXB0eSAob3Igb25seSB3aGl0ZXNwYWNlKSwgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbGVmdCBpbnRhY3QuIFRoaXMgbGV0cyB5b3UgcHJvdmlkZSBmYWxsYmFja1xuICogY29udGVudCBpbiB0aGUgY2FzZSB0aGF0IG5vIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaXMgcHJvdmlkZWQuXG4gKlxuICogQGVsZW1lbnQgQU5ZXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5nVHJhbnNjbHVkZXxuZ1RyYW5zY2x1ZGVTbG90IHRoZSBuYW1lIG9mIHRoZSBzbG90IHRvIGluc2VydCBhdCB0aGlzIHBvaW50LiBJZiB0aGlzIGlzIG5vdCBwcm92aWRlZCwgaXMgZW1wdHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpdHMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGVuIHRoZSBkZWZhdWx0IHNsb3QgaXMgdXNlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIEJhc2ljIHRyYW5zY2x1c2lvblxuICogVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBiYXNpYyB0cmFuc2NsdXNpb24gb2YgY29udGVudCBpbnRvIGEgY29tcG9uZW50IGRpcmVjdGl2ZS5cbiAqIDxleGFtcGxlIG5hbWU9XCJzaW1wbGVUcmFuc2NsdWRlRXhhbXBsZVwiIG1vZHVsZT1cInRyYW5zY2x1ZGVFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNjcmlwdD5cbiAqICAgICAgIGFuZ3VsYXIubW9kdWxlKCd0cmFuc2NsdWRlRXhhbXBsZScsIFtdKVxuICogICAgICAgIC5kaXJlY3RpdmUoJ3BhbmUnLCBmdW5jdGlvbigpe1xuICogICAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAgICByZXN0cmljdDogJ0UnLFxuICogICAgICAgICAgICAgdHJhbnNjbHVkZTogdHJ1ZSxcbiAqICAgICAgICAgICAgIHNjb3BlOiB7IHRpdGxlOidAJyB9LFxuICogICAgICAgICAgICAgdGVtcGxhdGU6ICc8ZGl2IHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCI+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IGdyYXlcIj57e3RpdGxlfX08L2Rpdj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICc8bmctdHJhbnNjbHVkZT48L25nLXRyYW5zY2x1ZGU+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PidcbiAqICAgICAgICAgICB9O1xuICogICAgICAgfSlcbiAqICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICRzY29wZS50aXRsZSA9ICdMb3JlbSBJcHN1bSc7XG4gKiAgICAgICAgICRzY29wZS50ZXh0ID0gJ05lcXVlIHBvcnJvIHF1aXNxdWFtIGVzdCBxdWkgZG9sb3JlbSBpcHN1bSBxdWlhIGRvbG9yLi4uJztcbiAqICAgICAgIH1dKTtcbiAqICAgICA8L3NjcmlwdD5cbiAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICAgPGlucHV0IG5nLW1vZGVsPVwidGl0bGVcIiBhcmlhLWxhYmVsPVwidGl0bGVcIj4gPGJyLz5cbiAqICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD1cInRleHRcIiBhcmlhLWxhYmVsPVwidGV4dFwiPjwvdGV4dGFyZWE+IDxici8+XG4gKiAgICAgICA8cGFuZSB0aXRsZT1cInt7dGl0bGV9fVwiPjxzcGFuPnt7dGV4dH19PC9zcGFuPjwvcGFuZT5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICAgIGl0KCdzaG91bGQgaGF2ZSB0cmFuc2NsdWRlZCcsIGZ1bmN0aW9uKCkge1xuICogICAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBlbGVtZW50KGJ5Lm1vZGVsKCd0aXRsZScpKTtcbiAqICAgICAgICB0aXRsZUVsZW1lbnQuY2xlYXIoKTtcbiAqICAgICAgICB0aXRsZUVsZW1lbnQuc2VuZEtleXMoJ1RJVExFJyk7XG4gKiAgICAgICAgdmFyIHRleHRFbGVtZW50ID0gZWxlbWVudChieS5tb2RlbCgndGV4dCcpKTtcbiAqICAgICAgICB0ZXh0RWxlbWVudC5jbGVhcigpO1xuICogICAgICAgIHRleHRFbGVtZW50LnNlbmRLZXlzKCdURVhUJyk7XG4gKiAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuYmluZGluZygndGl0bGUnKSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdUSVRMRScpO1xuICogICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmJpbmRpbmcoJ3RleHQnKSkuZ2V0VGV4dCgpKS50b0VxdWFsKCdURVhUJyk7XG4gKiAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICogQGV4YW1wbGVcbiAqICMjIyBUcmFuc2NsdWRlIGZhbGxiYWNrIGNvbnRlbnRcbiAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGBOZ1RyYW5zY2x1ZGVgIHdpdGggZmFsbGJhY2sgY29udGVudCwgdGhhdFxuICogaXMgZGlzcGxheWVkIGlmIG5vIHRyYW5zY2x1ZGVkIGNvbnRlbnQgaXMgcHJvdmlkZWQuXG4gKlxuICogPGV4YW1wbGUgbW9kdWxlPVwidHJhbnNjbHVkZUZhbGxiYWNrQ29udGVudEV4YW1wbGVcIiBuYW1lPVwibmctdHJhbnNjbHVkZVwiPlxuICogPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqIDxzY3JpcHQ+XG4gKiBhbmd1bGFyLm1vZHVsZSgndHJhbnNjbHVkZUZhbGxiYWNrQ29udGVudEV4YW1wbGUnLCBbXSlcbiAqIC5kaXJlY3RpdmUoJ215QnV0dG9uJywgZnVuY3Rpb24oKXtcbiAqICAgICAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAgICAgIHJlc3RyaWN0OiAnRScsXG4gKiAgICAgICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXG4gKiAgICAgICAgICAgICAgIHNjb3BlOiB0cnVlLFxuICogICAgICAgICAgICAgICB0ZW1wbGF0ZTogJzxidXR0b24gc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bmctdHJhbnNjbHVkZT4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGIgc3R5bGU9XCJjb2xvcjogcmVkO1wiPkJ1dHRvbjE8L2I+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L25nLXRyYW5zY2x1ZGU+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+J1xuICogICAgICAgICAgICAgfTtcbiAqICAgICAgICAgfSk7XG4gKiA8L3NjcmlwdD5cbiAqIDwhLS0gZmFsbGJhY2sgYnV0dG9uIGNvbnRlbnQgLS0+XG4gKiA8bXktYnV0dG9uIGlkPVwiZmFsbGJhY2tcIj48L215LWJ1dHRvbj5cbiAqIDwhLS0gbW9kaWZpZWQgYnV0dG9uIGNvbnRlbnQgLS0+XG4gKiA8bXktYnV0dG9uIGlkPVwibW9kaWZpZWRcIj5cbiAqICAgPGkgc3R5bGU9XCJjb2xvcjogZ3JlZW47XCI+QnV0dG9uMjwvaT5cbiAqIDwvbXktYnV0dG9uPlxuICogPC9maWxlPlxuICogPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICogaXQoJ3Nob3VsZCBoYXZlIGRpZmZlcmVudCB0cmFuc2NsdWRlIGVsZW1lbnQgY29udGVudCcsIGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ2ZhbGxiYWNrJykpLmdldFRleHQoKSkudG9CZSgnQnV0dG9uMScpO1xuICogICAgICAgICAgZXhwZWN0KGVsZW1lbnQoYnkuaWQoJ21vZGlmaWVkJykpLmdldFRleHQoKSkudG9CZSgnQnV0dG9uMicpO1xuICogICAgICAgIH0pO1xuICogPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgTXVsdGktc2xvdCB0cmFuc2NsdXNpb25cbiAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdXNpbmcgbXVsdGktc2xvdCB0cmFuc2NsdXNpb24gaW4gYSBjb21wb25lbnQgZGlyZWN0aXZlLlxuICogPGV4YW1wbGUgbmFtZT1cIm11bHRpU2xvdFRyYW5zY2x1ZGVFeGFtcGxlXCIgbW9kdWxlPVwibXVsdGlTbG90VHJhbnNjbHVkZUV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgIDxzdHlsZT5cbiAqICAgICAgLnRpdGxlLCAuZm9vdGVyIHtcbiAqICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5XG4gKiAgICAgIH1cbiAqICAgIDwvc3R5bGU+XG4gKiAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICA8aW5wdXQgbmctbW9kZWw9XCJ0aXRsZVwiIGFyaWEtbGFiZWw9XCJ0aXRsZVwiPiA8YnIvPlxuICogICAgICA8dGV4dGFyZWEgbmctbW9kZWw9XCJ0ZXh0XCIgYXJpYS1sYWJlbD1cInRleHRcIj48L3RleHRhcmVhPiA8YnIvPlxuICogICAgICA8cGFuZT5cbiAqICAgICAgICA8cGFuZS10aXRsZT48YSBuZy1ocmVmPVwie3tsaW5rfX1cIj57e3RpdGxlfX08L2E+PC9wYW5lLXRpdGxlPlxuICogICAgICAgIDxwYW5lLWJvZHk+PHA+e3t0ZXh0fX08L3A+PC9wYW5lLWJvZHk+XG4gKiAgICAgIDwvcGFuZT5cbiAqICAgIDwvZGl2PlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICAgIGFuZ3VsYXIubW9kdWxlKCdtdWx0aVNsb3RUcmFuc2NsdWRlRXhhbXBsZScsIFtdKVxuICogICAgIC5kaXJlY3RpdmUoJ3BhbmUnLCBmdW5jdGlvbigpIHtcbiAqICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAqICAgICAgICAgIHRyYW5zY2x1ZGU6IHtcbiAqICAgICAgICAgICAgJ3RpdGxlJzogJz9wYW5lVGl0bGUnLFxuICogICAgICAgICAgICAnYm9keSc6ICdwYW5lQm9keScsXG4gKiAgICAgICAgICAgICdmb290ZXInOiAnP3BhbmVGb290ZXInXG4gKiAgICAgICAgICB9LFxuICogICAgICAgICAgdGVtcGxhdGU6ICc8ZGl2IHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCI+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cInRpdGxlXCIgbmctdHJhbnNjbHVkZT1cInRpdGxlXCI+RmFsbGJhY2sgVGl0bGU8L2Rpdj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IG5nLXRyYW5zY2x1ZGU9XCJib2R5XCI+PC9kaXY+JyArXG4gKiAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImZvb3RlclwiIG5nLXRyYW5zY2x1ZGU9XCJmb290ZXJcIj5GYWxsYmFjayBGb290ZXI8L2Rpdj4nICtcbiAqICAgICAgICAgICAgICAgICAgICAnPC9kaXY+J1xuICogICAgICAgIH07XG4gKiAgICB9KVxuICogICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgJHNjb3BlLnRpdGxlID0gJ0xvcmVtIElwc3VtJztcbiAqICAgICAgJHNjb3BlLmxpbmsgPSAnaHR0cHM6Ly9nb29nbGUuY29tJztcbiAqICAgICAgJHNjb3BlLnRleHQgPSAnTmVxdWUgcG9ycm8gcXVpc3F1YW0gZXN0IHF1aSBkb2xvcmVtIGlwc3VtIHF1aWEgZG9sb3IuLi4nO1xuICogICAgfV0pO1xuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAqICAgICAgaXQoJ3Nob3VsZCBoYXZlIHRyYW5zY2x1ZGVkIHRoZSB0aXRsZSBhbmQgdGhlIGJvZHknLCBmdW5jdGlvbigpIHtcbiAqICAgICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZWxlbWVudChieS5tb2RlbCgndGl0bGUnKSk7XG4gKiAgICAgICAgdGl0bGVFbGVtZW50LmNsZWFyKCk7XG4gKiAgICAgICAgdGl0bGVFbGVtZW50LnNlbmRLZXlzKCdUSVRMRScpO1xuICogICAgICAgIHZhciB0ZXh0RWxlbWVudCA9IGVsZW1lbnQoYnkubW9kZWwoJ3RleHQnKSk7XG4gKiAgICAgICAgdGV4dEVsZW1lbnQuY2xlYXIoKTtcbiAqICAgICAgICB0ZXh0RWxlbWVudC5zZW5kS2V5cygnVEVYVCcpO1xuICogICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLnRpdGxlJykpLmdldFRleHQoKSkudG9FcXVhbCgnVElUTEUnKTtcbiAqICAgICAgICBleHBlY3QoZWxlbWVudChieS5iaW5kaW5nKCd0ZXh0JykpLmdldFRleHQoKSkudG9FcXVhbCgnVEVYVCcpO1xuICogICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnLmZvb3RlcicpKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ0ZhbGxiYWNrIEZvb3RlcicpO1xuICogICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICovXG52YXIgbmdUcmFuc2NsdWRlTWluRXJyID0gbWluRXJyKCduZ1RyYW5zY2x1ZGUnKTtcbnZhciBuZ1RyYW5zY2x1ZGVEaXJlY3RpdmUgPSBbJyRjb21waWxlJywgZnVuY3Rpb24oJGNvbXBpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0VBQycsXG4gICAgdGVybWluYWw6IHRydWUsXG4gICAgY29tcGlsZTogZnVuY3Rpb24gbmdUcmFuc2NsdWRlQ29tcGlsZSh0RWxlbWVudCkge1xuXG4gICAgICAvLyBSZW1vdmUgYW5kIGNhY2hlIGFueSBvcmlnaW5hbCBjb250ZW50IHRvIGFjdCBhcyBhIGZhbGxiYWNrXG4gICAgICB2YXIgZmFsbGJhY2tMaW5rRm4gPSAkY29tcGlsZSh0RWxlbWVudC5jb250ZW50cygpKTtcbiAgICAgIHRFbGVtZW50LmVtcHR5KCk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiBuZ1RyYW5zY2x1ZGVQb3N0TGluaygkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMsIGNvbnRyb2xsZXIsICR0cmFuc2NsdWRlKSB7XG5cbiAgICAgICAgaWYgKCEkdHJhbnNjbHVkZSkge1xuICAgICAgICAgIHRocm93IG5nVHJhbnNjbHVkZU1pbkVycignb3JwaGFuJyxcbiAgICAgICAgICAnSWxsZWdhbCB1c2Ugb2YgbmdUcmFuc2NsdWRlIGRpcmVjdGl2ZSBpbiB0aGUgdGVtcGxhdGUhICcgK1xuICAgICAgICAgICdObyBwYXJlbnQgZGlyZWN0aXZlIHRoYXQgcmVxdWlyZXMgYSB0cmFuc2NsdXNpb24gZm91bmQuICcgK1xuICAgICAgICAgICdFbGVtZW50OiB7MH0nLFxuICAgICAgICAgIHN0YXJ0aW5nVGFnKCRlbGVtZW50KSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgaXMgb2YgdGhlIGZvcm06IGBuZy10cmFuc2NsdWRlPVwibmctdHJhbnNjbHVkZVwiYCB0aGVuIHRyZWF0IGl0IGxpa2UgdGhlIGRlZmF1bHRcbiAgICAgICAgaWYgKCRhdHRycy5uZ1RyYW5zY2x1ZGUgPT09ICRhdHRycy4kYXR0ci5uZ1RyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAkYXR0cnMubmdUcmFuc2NsdWRlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNsb3ROYW1lID0gJGF0dHJzLm5nVHJhbnNjbHVkZSB8fCAkYXR0cnMubmdUcmFuc2NsdWRlU2xvdDtcblxuICAgICAgICAvLyBJZiB0aGUgc2xvdCBpcyByZXF1aXJlZCBhbmQgbm8gdHJhbnNjbHVzaW9uIGNvbnRlbnQgaXMgcHJvdmlkZWQgdGhlbiB0aGlzIGNhbGwgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgICAgICAkdHJhbnNjbHVkZShuZ1RyYW5zY2x1ZGVDbG9uZUF0dGFjaEZuLCBudWxsLCBzbG90TmFtZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHNsb3QgaXMgb3B0aW9uYWwgYW5kIG5vIHRyYW5zY2x1c2lvbiBjb250ZW50IGlzIHByb3ZpZGVkIHRoZW4gdXNlIHRoZSBmYWxsYmFjayBjb250ZW50XG4gICAgICAgIGlmIChzbG90TmFtZSAmJiAhJHRyYW5zY2x1ZGUuaXNTbG90RmlsbGVkKHNsb3ROYW1lKSkge1xuICAgICAgICAgIHVzZUZhbGxiYWNrQ29udGVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbmdUcmFuc2NsdWRlQ2xvbmVBdHRhY2hGbihjbG9uZSwgdHJhbnNjbHVkZWRTY29wZSkge1xuICAgICAgICAgIGlmIChjbG9uZS5sZW5ndGggJiYgbm90V2hpdGVzcGFjZShjbG9uZSkpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmFwcGVuZChjbG9uZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVzZUZhbGxiYWNrQ29udGVudCgpO1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm90aGluZyBsaW5rZWQgYWdhaW5zdCB0aGUgdHJhbnNjbHVkZWQgc2NvcGUgc2luY2Ugbm8gY29udGVudCB3YXMgYXZhaWxhYmxlLFxuICAgICAgICAgICAgLy8gc28gaXQgc2hvdWxkIGJlIHNhZmUgdG8gY2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBzY29wZS5cbiAgICAgICAgICAgIHRyYW5zY2x1ZGVkU2NvcGUuJGRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB1c2VGYWxsYmFja0NvbnRlbnQoKSB7XG4gICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyB0aGUgZmFsbGJhY2sgY29udGVudCByYXRoZXIgdGhhbiB0aGUgdHJhbnNjbHVkZWQgY29udGVudCxcbiAgICAgICAgICAvLyB3ZSBsaW5rIGFnYWluc3QgdGhlIHNjb3BlIG9mIHRoaXMgZGlyZWN0aXZlIHJhdGhlciB0aGFuIHRoZSB0cmFuc2NsdWRlZCBzY29wZVxuICAgICAgICAgIGZhbGxiYWNrTGlua0ZuKCRzY29wZSwgZnVuY3Rpb24oY2xvbmUpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmFwcGVuZChjbG9uZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBub3RXaGl0ZXNwYWNlKG5vZGVzKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gbm9kZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOT0RFX1RZUEVfVEVYVCB8fCBub2RlLm5vZGVWYWx1ZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1dO1xuXG4vKipcbiAqIEBuZ2RvYyBkaXJlY3RpdmVcbiAqIEBuYW1lIHNjcmlwdFxuICogQHJlc3RyaWN0IEVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIExvYWQgdGhlIGNvbnRlbnQgb2YgYSBgPHNjcmlwdD5gIGVsZW1lbnQgaW50byB7QGxpbmsgbmcuJHRlbXBsYXRlQ2FjaGUgYCR0ZW1wbGF0ZUNhY2hlYH0sIHNvIHRoYXQgdGhlXG4gKiB0ZW1wbGF0ZSBjYW4gYmUgdXNlZCBieSB7QGxpbmsgbmcuZGlyZWN0aXZlOm5nSW5jbHVkZSBgbmdJbmNsdWRlYH0sXG4gKiB7QGxpbmsgbmdSb3V0ZS5kaXJlY3RpdmU6bmdWaWV3IGBuZ1ZpZXdgfSwgb3Ige0BsaW5rIGd1aWRlL2RpcmVjdGl2ZSBkaXJlY3RpdmVzfS4gVGhlIHR5cGUgb2YgdGhlXG4gKiBgPHNjcmlwdD5gIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYHRleHQvbmctdGVtcGxhdGVgLCBhbmQgYSBjYWNoZSBuYW1lIGZvciB0aGUgdGVtcGxhdGUgbXVzdCBiZVxuICogYXNzaWduZWQgdGhyb3VnaCB0aGUgZWxlbWVudCdzIGBpZGAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgYXMgYSBkaXJlY3RpdmUncyBgdGVtcGxhdGVVcmxgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE11c3QgYmUgc2V0IHRvIGAndGV4dC9uZy10ZW1wbGF0ZSdgLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIENhY2hlIG5hbWUgb2YgdGhlIHRlbXBsYXRlLlxuICpcbiAqIEBleGFtcGxlXG4gIDxleGFtcGxlICBuYW1lPVwic2NyaXB0LXRhZ1wiPlxuICAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L25nLXRlbXBsYXRlXCIgaWQ9XCIvdHBsLmh0bWxcIj5cbiAgICAgICAgQ29udGVudCBvZiB0aGUgdGVtcGxhdGUuXG4gICAgICA8L3NjcmlwdD5cblxuICAgICAgPGEgbmctY2xpY2s9XCJjdXJyZW50VHBsPScvdHBsLmh0bWwnXCIgaWQ9XCJ0cGwtbGlua1wiPkxvYWQgaW5saW5lZCB0ZW1wbGF0ZTwvYT5cbiAgICAgIDxkaXYgaWQ9XCJ0cGwtY29udGVudFwiIG5nLWluY2x1ZGUgc3JjPVwiY3VycmVudFRwbFwiPjwvZGl2PlxuICAgIDwvZmlsZT5cbiAgICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICBpdCgnc2hvdWxkIGxvYWQgdGVtcGxhdGUgZGVmaW5lZCBpbnNpZGUgc2NyaXB0IHRhZycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBlbGVtZW50KGJ5LmNzcygnI3RwbC1saW5rJykpLmNsaWNrKCk7XG4gICAgICAgIGV4cGVjdChlbGVtZW50KGJ5LmNzcygnI3RwbC1jb250ZW50JykpLmdldFRleHQoKSkudG9NYXRjaCgvQ29udGVudCBvZiB0aGUgdGVtcGxhdGUvKTtcbiAgICAgIH0pO1xuICAgIDwvZmlsZT5cbiAgPC9leGFtcGxlPlxuICovXG52YXIgc2NyaXB0RGlyZWN0aXZlID0gWyckdGVtcGxhdGVDYWNoZScsIGZ1bmN0aW9uKCR0ZW1wbGF0ZUNhY2hlKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdFJyxcbiAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyKSB7XG4gICAgICBpZiAoYXR0ci50eXBlID09PSAndGV4dC9uZy10ZW1wbGF0ZScpIHtcbiAgICAgICAgdmFyIHRlbXBsYXRlVXJsID0gYXR0ci5pZCxcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50WzBdLnRleHQ7XG5cbiAgICAgICAgJHRlbXBsYXRlQ2FjaGUucHV0KHRlbXBsYXRlVXJsLCB0ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XTtcblxuLyogZXhwb3J0ZWQgc2VsZWN0RGlyZWN0aXZlLCBvcHRpb25EaXJlY3RpdmUgKi9cblxudmFyIG5vb3BOZ01vZGVsQ29udHJvbGxlciA9IHsgJHNldFZpZXdWYWx1ZTogbm9vcCwgJHJlbmRlcjogbm9vcCB9O1xuXG4vKipcbiAqIEBuZ2RvYyB0eXBlXG4gKiBAbmFtZSAgc2VsZWN0LlNlbGVjdENvbnRyb2xsZXJcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBgPHNlbGVjdD5gIGRpcmVjdGl2ZS4gVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciByZWFkaW5nXG4gKiBhbmQgd3JpdGluZyB0aGUgc2VsZWN0ZWQgdmFsdWUocykgb2YgdGhlIGNvbnRyb2wgYW5kIGFsc28gY29vcmRpbmF0ZXMgZHluYW1pY2FsbHlcbiAqIGFkZGVkIGA8b3B0aW9uPmAgZWxlbWVudHMsIHBlcmhhcHMgYnkgYW4gYG5nUmVwZWF0YCBkaXJlY3RpdmUuXG4gKi9cbnZhciBTZWxlY3RDb250cm9sbGVyID1cbiAgICAgICAgWyckZWxlbWVudCcsICckc2NvcGUnLCAvKiogQHRoaXMgKi8gZnVuY3Rpb24oJGVsZW1lbnQsICRzY29wZSkge1xuXG4gIHZhciBzZWxmID0gdGhpcyxcbiAgICAgIG9wdGlvbnNNYXAgPSBuZXcgSGFzaE1hcCgpO1xuXG4gIHNlbGYuc2VsZWN0VmFsdWVNYXAgPSB7fTsgLy8gS2V5cyBhcmUgdGhlIGhhc2hlZCB2YWx1ZXMsIHZhbHVlcyB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cbiAgLy8gSWYgdGhlIG5nTW9kZWwgZG9lc24ndCBnZXQgcHJvdmlkZWQgdGhlbiBwcm92aWRlIGEgZHVtbXkgbm9vcCB2ZXJzaW9uIHRvIHByZXZlbnQgZXJyb3JzXG4gIHNlbGYubmdNb2RlbEN0cmwgPSBub29wTmdNb2RlbENvbnRyb2xsZXI7XG4gIHNlbGYubXVsdGlwbGUgPSBmYWxzZTtcblxuICAvLyBUaGUgXCJ1bmtub3duXCIgb3B0aW9uIGlzIG9uZSB0aGF0IGlzIHByZXBlbmRlZCB0byB0aGUgbGlzdCBpZiB0aGUgdmlld1ZhbHVlXG4gIC8vIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgb3B0aW9ucy4gV2hlbiBpdCBpcyByZW5kZXJlZCB0aGUgdmFsdWUgb2YgdGhlIHVua25vd25cbiAgLy8gb3B0aW9uIGlzICc/IFhYWCA/JyB3aGVyZSBYWFggaXMgdGhlIGhhc2hLZXkgb2YgdGhlIHZhbHVlIHRoYXQgaXMgbm90IGtub3duLlxuICAvL1xuICAvLyBXZSBjYW4ndCBqdXN0IGpxTGl0ZSgnPG9wdGlvbj4nKSBzaW5jZSBqcUxpdGUgaXMgbm90IHNtYXJ0IGVub3VnaFxuICAvLyB0byBjcmVhdGUgaXQgaW4gPHNlbGVjdD4gYW5kIElFIGJhcmZzIG90aGVyd2lzZS5cbiAgc2VsZi51bmtub3duT3B0aW9uID0ganFMaXRlKHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKSk7XG5cbiAgLy8gVGhlIGVtcHR5IG9wdGlvbiBpcyBhbiBvcHRpb24gd2l0aCB0aGUgdmFsdWUgJycgdGhhdCB0ZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgY2FuXG4gIC8vIHByb3ZpZGUgaW5zaWRlIHRoZSBzZWxlY3QuIFdoZW4gdGhlIG1vZGVsIGNoYW5nZXMgdG8gYSB2YWx1ZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggYW4gb3B0aW9uLFxuICAvLyBpdCBpcyBzZWxlY3RlZCAtIHNvIGlmIGFuIGVtcHR5IG9wdGlvbiBpcyBwcm92aWRlZCwgbm8gdW5rbm93biBvcHRpb24gaXMgZ2VuZXJhdGVkLlxuICAvLyBIb3dldmVyLCB0aGUgZW1wdHkgb3B0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIG1vZGVsIG1hdGNoZXMgYW4gb3B0aW9uLiBJdCBpcyBhbHdheXMgc2VsZWN0YWJsZVxuICAvLyBhbmQgaW5kaWNhdGVzIHRoYXQgYSBcIm51bGxcIiBzZWxlY3Rpb24gaGFzIGJlZW4gbWFkZS5cbiAgc2VsZi5oYXNFbXB0eU9wdGlvbiA9IGZhbHNlO1xuICBzZWxmLmVtcHR5T3B0aW9uID0gdW5kZWZpbmVkO1xuXG4gIHNlbGYucmVuZGVyVW5rbm93bk9wdGlvbiA9IGZ1bmN0aW9uKHZhbCkge1xuICAgIHZhciB1bmtub3duVmFsID0gc2VsZi5nZW5lcmF0ZVVua25vd25PcHRpb25WYWx1ZSh2YWwpO1xuICAgIHNlbGYudW5rbm93bk9wdGlvbi52YWwodW5rbm93blZhbCk7XG4gICAgJGVsZW1lbnQucHJlcGVuZChzZWxmLnVua25vd25PcHRpb24pO1xuICAgIHNldE9wdGlvbkFzU2VsZWN0ZWQoc2VsZi51bmtub3duT3B0aW9uKTtcbiAgICAkZWxlbWVudC52YWwodW5rbm93blZhbCk7XG4gIH07XG5cbiAgc2VsZi51cGRhdGVVbmtub3duT3B0aW9uID0gZnVuY3Rpb24odmFsKSB7XG4gICAgdmFyIHVua25vd25WYWwgPSBzZWxmLmdlbmVyYXRlVW5rbm93bk9wdGlvblZhbHVlKHZhbCk7XG4gICAgc2VsZi51bmtub3duT3B0aW9uLnZhbCh1bmtub3duVmFsKTtcbiAgICBzZXRPcHRpb25Bc1NlbGVjdGVkKHNlbGYudW5rbm93bk9wdGlvbik7XG4gICAgJGVsZW1lbnQudmFsKHVua25vd25WYWwpO1xuICB9O1xuXG4gIHNlbGYuZ2VuZXJhdGVVbmtub3duT3B0aW9uVmFsdWUgPSBmdW5jdGlvbih2YWwpIHtcbiAgICByZXR1cm4gJz8gJyArIGhhc2hLZXkodmFsKSArICcgPyc7XG4gIH07XG5cbiAgc2VsZi5yZW1vdmVVbmtub3duT3B0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHNlbGYudW5rbm93bk9wdGlvbi5wYXJlbnQoKSkgc2VsZi51bmtub3duT3B0aW9uLnJlbW92ZSgpO1xuICB9O1xuXG4gIHNlbGYuc2VsZWN0RW1wdHlPcHRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoc2VsZi5lbXB0eU9wdGlvbikge1xuICAgICAgJGVsZW1lbnQudmFsKCcnKTtcbiAgICAgIHNldE9wdGlvbkFzU2VsZWN0ZWQoc2VsZi5lbXB0eU9wdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHNlbGYudW5zZWxlY3RFbXB0eU9wdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChzZWxmLmhhc0VtcHR5T3B0aW9uKSB7XG4gICAgICBzZWxmLmVtcHR5T3B0aW9uLnJlbW92ZUF0dHIoJ3NlbGVjdGVkJyk7XG4gICAgfVxuICB9O1xuXG4gICRzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgLy8gZGlzYWJsZSB1bmtub3duIG9wdGlvbiBzbyB0aGF0IHdlIGRvbid0IGRvIHdvcmsgd2hlbiB0aGUgd2hvbGUgc2VsZWN0IGlzIGJlaW5nIGRlc3Ryb3llZFxuICAgIHNlbGYucmVuZGVyVW5rbm93bk9wdGlvbiA9IG5vb3A7XG4gIH0pO1xuXG4gIC8vIFJlYWQgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3QgY29udHJvbCwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2hhbmdlcyBkZXBlbmRpbmdcbiAgLy8gdXBvbiB3aGV0aGVyIHRoZSBzZWxlY3QgY2FuIGhhdmUgbXVsdGlwbGUgdmFsdWVzIGFuZCB3aGV0aGVyIG5nT3B0aW9ucyBpcyBhdCB3b3JrLlxuICBzZWxmLnJlYWRWYWx1ZSA9IGZ1bmN0aW9uIHJlYWRTaW5nbGVWYWx1ZSgpIHtcbiAgICB2YXIgdmFsID0gJGVsZW1lbnQudmFsKCk7XG4gICAgLy8gbmdWYWx1ZSBhZGRlZCBvcHRpb24gdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHNlbGVjdFZhbHVlTWFwLCBub3JtYWwgaW50ZXJwb2xhdGlvbnMgYXJlIG5vdFxuICAgIHZhciByZWFsVmFsID0gdmFsIGluIHNlbGYuc2VsZWN0VmFsdWVNYXAgPyBzZWxmLnNlbGVjdFZhbHVlTWFwW3ZhbF0gOiB2YWw7XG5cbiAgICBpZiAoc2VsZi5oYXNPcHRpb24ocmVhbFZhbCkpIHtcbiAgICAgIHJldHVybiByZWFsVmFsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG5cbiAgLy8gV3JpdGUgdGhlIHZhbHVlIHRvIHRoZSBzZWxlY3QgY29udHJvbCwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2hhbmdlcyBkZXBlbmRpbmdcbiAgLy8gdXBvbiB3aGV0aGVyIHRoZSBzZWxlY3QgY2FuIGhhdmUgbXVsdGlwbGUgdmFsdWVzIGFuZCB3aGV0aGVyIG5nT3B0aW9ucyBpcyBhdCB3b3JrLlxuICBzZWxmLndyaXRlVmFsdWUgPSBmdW5jdGlvbiB3cml0ZVNpbmdsZVZhbHVlKHZhbHVlKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIHJlbW92ZSB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIGZyb20gdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgb3B0aW9uXG4gICAgLy8gT3RoZXJ3aXNlLCBzY3JlZW4gcmVhZGVycyBtaWdodCBnZXQgY29uZnVzZWRcbiAgICB2YXIgY3VycmVudGx5U2VsZWN0ZWRPcHRpb24gPSAkZWxlbWVudFswXS5vcHRpb25zWyRlbGVtZW50WzBdLnNlbGVjdGVkSW5kZXhdO1xuICAgIGlmIChjdXJyZW50bHlTZWxlY3RlZE9wdGlvbikgY3VycmVudGx5U2VsZWN0ZWRPcHRpb24ucmVtb3ZlQXR0cmlidXRlKCdzZWxlY3RlZCcpO1xuXG4gICAgaWYgKHNlbGYuaGFzT3B0aW9uKHZhbHVlKSkge1xuICAgICAgc2VsZi5yZW1vdmVVbmtub3duT3B0aW9uKCk7XG5cbiAgICAgIHZhciBoYXNoZWRWYWwgPSBoYXNoS2V5KHZhbHVlKTtcbiAgICAgICRlbGVtZW50LnZhbChoYXNoZWRWYWwgaW4gc2VsZi5zZWxlY3RWYWx1ZU1hcCA/IGhhc2hlZFZhbCA6IHZhbHVlKTtcblxuICAgICAgLy8gU2V0IHNlbGVjdGVkIGF0dHJpYnV0ZSBhbmQgcHJvcGVydHkgb24gc2VsZWN0ZWQgb3B0aW9uIGZvciBzY3JlZW4gcmVhZGVyc1xuICAgICAgdmFyIHNlbGVjdGVkT3B0aW9uID0gJGVsZW1lbnRbMF0ub3B0aW9uc1skZWxlbWVudFswXS5zZWxlY3RlZEluZGV4XTtcbiAgICAgIHNldE9wdGlvbkFzU2VsZWN0ZWQoanFMaXRlKHNlbGVjdGVkT3B0aW9uKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIHNlbGYuZW1wdHlPcHRpb24pIHtcbiAgICAgICAgc2VsZi5yZW1vdmVVbmtub3duT3B0aW9uKCk7XG4gICAgICAgIHNlbGYuc2VsZWN0RW1wdHlPcHRpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi51bmtub3duT3B0aW9uLnBhcmVudCgpLmxlbmd0aCkge1xuICAgICAgICBzZWxmLnVwZGF0ZVVua25vd25PcHRpb24odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5yZW5kZXJVbmtub3duT3B0aW9uKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cblxuICAvLyBUZWxsIHRoZSBzZWxlY3QgY29udHJvbCB0aGF0IGFuIG9wdGlvbiwgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGhhcyBiZWVuIGFkZGVkXG4gIHNlbGYuYWRkT3B0aW9uID0gZnVuY3Rpb24odmFsdWUsIGVsZW1lbnQpIHtcbiAgICAvLyBTa2lwIGNvbW1lbnQgbm9kZXMsIGFzIHRoZXkgb25seSBwb2xsdXRlIHRoZSBgb3B0aW9uc01hcGBcbiAgICBpZiAoZWxlbWVudFswXS5ub2RlVHlwZSA9PT0gTk9ERV9UWVBFX0NPTU1FTlQpIHJldHVybjtcblxuICAgIGFzc2VydE5vdEhhc093blByb3BlcnR5KHZhbHVlLCAnXCJvcHRpb24gdmFsdWVcIicpO1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHNlbGYuaGFzRW1wdHlPcHRpb24gPSB0cnVlO1xuICAgICAgc2VsZi5lbXB0eU9wdGlvbiA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIHZhciBjb3VudCA9IG9wdGlvbnNNYXAuZ2V0KHZhbHVlKSB8fCAwO1xuICAgIG9wdGlvbnNNYXAucHV0KHZhbHVlLCBjb3VudCArIDEpO1xuICAgIC8vIE9ubHkgcmVuZGVyIGF0IHRoZSBlbmQgb2YgYSBkaWdlc3QuIFRoaXMgaW1wcm92ZXMgcmVuZGVyIHBlcmZvcm1hbmNlIHdoZW4gbWFueSBvcHRpb25zXG4gICAgLy8gYXJlIGFkZGVkIGR1cmluZyBhIGRpZ2VzdCBhbmQgZW5zdXJlcyBhbGwgcmVsZXZhbnQgb3B0aW9ucyBhcmUgY29ycmVjdGx5IG1hcmtlZCBhcyBzZWxlY3RlZFxuICAgIHNjaGVkdWxlUmVuZGVyKCk7XG4gIH07XG5cbiAgLy8gVGVsbCB0aGUgc2VsZWN0IGNvbnRyb2wgdGhhdCBhbiBvcHRpb24sIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBoYXMgYmVlbiByZW1vdmVkXG4gIHNlbGYucmVtb3ZlT3B0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgY291bnQgPSBvcHRpb25zTWFwLmdldCh2YWx1ZSk7XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgb3B0aW9uc01hcC5yZW1vdmUodmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgc2VsZi5oYXNFbXB0eU9wdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIHNlbGYuZW1wdHlPcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNNYXAucHV0KHZhbHVlLCBjb3VudCAtIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWxlY3QgY29udHJvbCBoYXMgYW4gb3B0aW9uIG1hdGNoaW5nIHRoZSBnaXZlbiB2YWx1ZVxuICBzZWxmLmhhc09wdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhb3B0aW9uc01hcC5nZXQodmFsdWUpO1xuICB9O1xuXG5cbiAgdmFyIHJlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBzY2hlZHVsZVJlbmRlcigpIHtcbiAgICBpZiAocmVuZGVyU2NoZWR1bGVkKSByZXR1cm47XG4gICAgcmVuZGVyU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAkc2NvcGUuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCkge1xuICAgICAgcmVuZGVyU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICBzZWxmLm5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciB1cGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gc2NoZWR1bGVWaWV3VmFsdWVVcGRhdGUocmVuZGVyQWZ0ZXIpIHtcbiAgICBpZiAodXBkYXRlU2NoZWR1bGVkKSByZXR1cm47XG5cbiAgICB1cGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuXG4gICAgJHNjb3BlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpIHtcbiAgICAgIGlmICgkc2NvcGUuJCRkZXN0cm95ZWQpIHJldHVybjtcblxuICAgICAgdXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICBzZWxmLm5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUoc2VsZi5yZWFkVmFsdWUoKSk7XG4gICAgICBpZiAocmVuZGVyQWZ0ZXIpIHNlbGYubmdNb2RlbEN0cmwuJHJlbmRlcigpO1xuICAgIH0pO1xuICB9XG5cblxuICBzZWxmLnJlZ2lzdGVyT3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uU2NvcGUsIG9wdGlvbkVsZW1lbnQsIG9wdGlvbkF0dHJzLCBpbnRlcnBvbGF0ZVZhbHVlRm4sIGludGVycG9sYXRlVGV4dEZuKSB7XG5cbiAgICBpZiAob3B0aW9uQXR0cnMuJGF0dHIubmdWYWx1ZSkge1xuICAgICAgLy8gVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBzZXQgYnkgbmdWYWx1ZVxuICAgICAgdmFyIG9sZFZhbCwgaGFzaGVkVmFsID0gTmFOO1xuICAgICAgb3B0aW9uQXR0cnMuJG9ic2VydmUoJ3ZhbHVlJywgZnVuY3Rpb24gdmFsdWVBdHRyaWJ1dGVPYnNlcnZlQWN0aW9uKG5ld1ZhbCkge1xuXG4gICAgICAgIHZhciByZW1vdmFsO1xuICAgICAgICB2YXIgcHJldmlvdXNseVNlbGVjdGVkID0gb3B0aW9uRWxlbWVudC5wcm9wKCdzZWxlY3RlZCcpO1xuXG4gICAgICAgIGlmIChpc0RlZmluZWQoaGFzaGVkVmFsKSkge1xuICAgICAgICAgIHNlbGYucmVtb3ZlT3B0aW9uKG9sZFZhbCk7XG4gICAgICAgICAgZGVsZXRlIHNlbGYuc2VsZWN0VmFsdWVNYXBbaGFzaGVkVmFsXTtcbiAgICAgICAgICByZW1vdmFsID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhhc2hlZFZhbCA9IGhhc2hLZXkobmV3VmFsKTtcbiAgICAgICAgb2xkVmFsID0gbmV3VmFsO1xuICAgICAgICBzZWxmLnNlbGVjdFZhbHVlTWFwW2hhc2hlZFZhbF0gPSBuZXdWYWw7XG4gICAgICAgIHNlbGYuYWRkT3B0aW9uKG5ld1ZhbCwgb3B0aW9uRWxlbWVudCk7XG4gICAgICAgIC8vIFNldCB0aGUgYXR0cmlidXRlIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgb3B0aW9uQXR0cnMuJHNldCAtIHRoaXMgc3RvcHMgdGhlIG9ic2VydmVyXG4gICAgICAgIC8vIGZyb20gZmlyaW5nIGEgc2Vjb25kIHRpbWUuIE90aGVyICRvYnNlcnZlcnMgb24gdmFsdWUgd2lsbCBhbHNvIGdldCB0aGUgcmVzdWx0IG9mIHRoZVxuICAgICAgICAvLyBuZ1ZhbHVlIGV4cHJlc3Npb24sIG5vdCB0aGUgaGFzaGVkIHZhbHVlXG4gICAgICAgIG9wdGlvbkVsZW1lbnQuYXR0cigndmFsdWUnLCBoYXNoZWRWYWwpO1xuXG4gICAgICAgIGlmIChyZW1vdmFsICYmIHByZXZpb3VzbHlTZWxlY3RlZCkge1xuICAgICAgICAgIHNjaGVkdWxlVmlld1ZhbHVlVXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0ZVZhbHVlRm4pIHtcbiAgICAgIC8vIFRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgaW50ZXJwb2xhdGVkXG4gICAgICBvcHRpb25BdHRycy4kb2JzZXJ2ZSgndmFsdWUnLCBmdW5jdGlvbiB2YWx1ZUF0dHJpYnV0ZU9ic2VydmVBY3Rpb24obmV3VmFsKSB7XG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG92ZXJ3cml0dGVuIGluIG5nT3B0aW9ucyBhbmQgaGFzIHNpZGUtZWZmZWN0cyFcbiAgICAgICAgc2VsZi5yZWFkVmFsdWUoKTtcblxuICAgICAgICB2YXIgcmVtb3ZhbDtcbiAgICAgICAgdmFyIHByZXZpb3VzbHlTZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnKTtcblxuICAgICAgICBpZiAoaXNEZWZpbmVkKG9sZFZhbCkpIHtcbiAgICAgICAgICBzZWxmLnJlbW92ZU9wdGlvbihvbGRWYWwpO1xuICAgICAgICAgIHJlbW92YWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZFZhbCA9IG5ld1ZhbDtcbiAgICAgICAgc2VsZi5hZGRPcHRpb24obmV3VmFsLCBvcHRpb25FbGVtZW50KTtcblxuICAgICAgICBpZiAocmVtb3ZhbCAmJiBwcmV2aW91c2x5U2VsZWN0ZWQpIHtcbiAgICAgICAgICBzY2hlZHVsZVZpZXdWYWx1ZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGludGVycG9sYXRlVGV4dEZuKSB7XG4gICAgICAvLyBUaGUgdGV4dCBjb250ZW50IGlzIGludGVycG9sYXRlZFxuICAgICAgb3B0aW9uU2NvcGUuJHdhdGNoKGludGVycG9sYXRlVGV4dEZuLCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVdhdGNoQWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgICAgIG9wdGlvbkF0dHJzLiRzZXQoJ3ZhbHVlJywgbmV3VmFsKTtcbiAgICAgICAgdmFyIHByZXZpb3VzbHlTZWxlY3RlZCA9IG9wdGlvbkVsZW1lbnQucHJvcCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgaWYgKG9sZFZhbCAhPT0gbmV3VmFsKSB7XG4gICAgICAgICAgc2VsZi5yZW1vdmVPcHRpb24ob2xkVmFsKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmFkZE9wdGlvbihuZXdWYWwsIG9wdGlvbkVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChvbGRWYWwgJiYgcHJldmlvdXNseVNlbGVjdGVkKSB7XG4gICAgICAgICAgc2NoZWR1bGVWaWV3VmFsdWVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3RhdGljXG4gICAgICBzZWxmLmFkZE9wdGlvbihvcHRpb25BdHRycy52YWx1ZSwgb3B0aW9uRWxlbWVudCk7XG4gICAgfVxuXG5cbiAgICBvcHRpb25BdHRycy4kb2JzZXJ2ZSgnZGlzYWJsZWQnLCBmdW5jdGlvbihuZXdWYWwpIHtcblxuICAgICAgLy8gU2luY2UgbW9kZWwgdXBkYXRlcyB3aWxsIGFsc28gc2VsZWN0IGRpc2FibGVkIG9wdGlvbnMgKGxpa2UgbmdPcHRpb25zKSxcbiAgICAgIC8vIHdlIG9ubHkgaGF2ZSB0byBoYW5kbGUgb3B0aW9ucyBiZWNvbWluZyBkaXNhYmxlZCwgbm90IGVuYWJsZWRcblxuICAgICAgaWYgKG5ld1ZhbCA9PT0gJ3RydWUnIHx8IG5ld1ZhbCAmJiBvcHRpb25FbGVtZW50LnByb3AoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgaWYgKHNlbGYubXVsdGlwbGUpIHtcbiAgICAgICAgICBzY2hlZHVsZVZpZXdWYWx1ZVVwZGF0ZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLm5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUobnVsbCk7XG4gICAgICAgICAgc2VsZi5uZ01vZGVsQ3RybC4kcmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG9wdGlvbkVsZW1lbnQub24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VycmVudFZhbHVlID0gc2VsZi5yZWFkVmFsdWUoKTtcbiAgICAgIHZhciByZW1vdmVWYWx1ZSA9IG9wdGlvbkF0dHJzLnZhbHVlO1xuXG4gICAgICBzZWxmLnJlbW92ZU9wdGlvbihyZW1vdmVWYWx1ZSk7XG4gICAgICBzZWxmLm5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcblxuICAgICAgaWYgKHNlbGYubXVsdGlwbGUgJiYgY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pbmRleE9mKHJlbW92ZVZhbHVlKSAhPT0gLTEgfHxcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPT09IHJlbW92ZVZhbHVlXG4gICAgICApIHtcbiAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSAoc2VsZWN0ZWQpIG9wdGlvbnMgYXJlIGRlc3Ryb3llZCBhdCB0aGUgc2FtZSB0aW1lLCB3ZSBkb24ndCB3YW50XG4gICAgICAgIC8vIHRvIHJ1biBhIG1vZGVsIHVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLiBJbnN0ZWFkLCBydW4gYSBzaW5nbGUgdXBkYXRlIGluIHRoZSAkJHBvc3REaWdlc3RcbiAgICAgICAgc2NoZWR1bGVWaWV3VmFsdWVVcGRhdGUodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0T3B0aW9uQXNTZWxlY3RlZChvcHRpb25FbCkge1xuICAgIG9wdGlvbkVsLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7IC8vIG5lZWRlZCBmb3IgSUVcbiAgICBvcHRpb25FbC5hdHRyKCdzZWxlY3RlZCcsIHRydWUpO1xuICB9XG59XTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBzZWxlY3RcbiAqIEByZXN0cmljdCBFXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIVE1MIGBzZWxlY3RgIGVsZW1lbnQgd2l0aCBhbmd1bGFyIGRhdGEtYmluZGluZy5cbiAqXG4gKiBUaGUgYHNlbGVjdGAgZGlyZWN0aXZlIGlzIHVzZWQgdG9nZXRoZXIgd2l0aCB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9IHRvIHByb3ZpZGUgZGF0YS1iaW5kaW5nXG4gKiBiZXR3ZWVuIHRoZSBzY29wZSBhbmQgdGhlIGA8c2VsZWN0PmAgY29udHJvbCAoaW5jbHVkaW5nIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMpLlxuICogSXQgYWxzbyBoYW5kbGVzIGR5bmFtaWMgYDxvcHRpb24+YCBlbGVtZW50cywgd2hpY2ggY2FuIGJlIGFkZGVkIHVzaW5nIHRoZSB7QGxpbmsgbmdSZXBlYXQgYG5nUmVwZWF0fWAgb3JcbiAqIHtAbGluayBuZ09wdGlvbnMgYG5nT3B0aW9uc2B9IGRpcmVjdGl2ZXMuXG4gKlxuICogV2hlbiBhbiBpdGVtIGluIHRoZSBgPHNlbGVjdD5gIG1lbnUgaXMgc2VsZWN0ZWQsIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHdpbGwgYmUgYm91bmRcbiAqIHRvIHRoZSBtb2RlbCBpZGVudGlmaWVkIGJ5IHRoZSBgbmdNb2RlbGAgZGlyZWN0aXZlLiBXaXRoIHN0YXRpYyBvciByZXBlYXRlZCBvcHRpb25zLCB0aGlzIGlzXG4gKiB0aGUgY29udGVudCBvZiB0aGUgYHZhbHVlYCBhdHRyaWJ1dGUgb3IgdGhlIHRleHRDb250ZW50IG9mIHRoZSBgPG9wdGlvbj5gLCBpZiB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIG1pc3NpbmcuXG4gKiBWYWx1ZSBhbmQgdGV4dENvbnRlbnQgY2FuIGJlIGludGVycG9sYXRlZC5cbiAqXG4gKiAjIyBNYXRjaGluZyBtb2RlbCBhbmQgb3B0aW9uIHZhbHVlc1xuICpcbiAqIEluIGdlbmVyYWwsIHRoZSBtYXRjaCBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgYW4gb3B0aW9uIGlzIGV2YWx1YXRlZCBieSBzdHJpY3RseSBjb21wYXJpbmcgdGhlIG1vZGVsXG4gKiB2YWx1ZSBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKlxuICogSWYgeW91IGFyZSBzZXR0aW5nIHRoZSBvcHRpb24gdmFsdWUgd2l0aCB0aGUgb3B0aW9uJ3MgYHZhbHVlYCBhdHRyaWJ1dGUsIG9yIHRleHRDb250ZW50LCB0aGVcbiAqIHZhbHVlIHdpbGwgYWx3YXlzIGJlIGEgYHN0cmluZ2Agd2hpY2ggbWVhbnMgdGhhdCB0aGUgbW9kZWwgdmFsdWUgbXVzdCBhbHNvIGJlIGEgc3RyaW5nLlxuICogT3RoZXJ3aXNlIHRoZSBgc2VsZWN0YCBkaXJlY3RpdmUgY2Fubm90IG1hdGNoIHRoZW0gY29ycmVjdGx5LlxuICpcbiAqIFRvIGJpbmQgdGhlIG1vZGVsIHRvIGEgbm9uLXN0cmluZyB2YWx1ZSwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llczpcbiAqIC0gdGhlIHtAbGluayBuZy5uZ09wdGlvbnMgYG5nT3B0aW9uc2B9IGRpcmVjdGl2ZVxuICogICAoe0BsaW5rIG5nLnNlbGVjdCN1c2luZy1zZWxlY3Qtd2l0aC1uZ29wdGlvbnMtYW5kLXNldHRpbmctYS1kZWZhdWx0LXZhbHVlfSlcbiAqIC0gdGhlIHtAbGluayBuZy5uZ1ZhbHVlIGBuZ1ZhbHVlYH0gZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIHRvIGJlXG4gKiAgIG9wdGlvbiB2YWx1ZXMgKHtAbGluayBuZy5zZWxlY3QjdXNpbmctbmd2YWx1ZS10by1iaW5kLXRoZS1tb2RlbC10by1hbi1hcnJheS1vZi1vYmplY3RzIEV4YW1wbGV9KVxuICogLSBtb2RlbCAkcGFyc2VycyAvICRmb3JtYXR0ZXJzIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZVxuICogICAoe0BsaW5rIG5nLnNlbGVjdCNiaW5kaW5nLXNlbGVjdC10by1hLW5vbi1zdHJpbmctdmFsdWUtdmlhLW5nbW9kZWwtcGFyc2luZy1mb3JtYXR0aW5nIEV4YW1wbGV9KVxuICpcbiAqIElmIHRoZSB2aWV3VmFsdWUgb2YgYG5nTW9kZWxgIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgb3B0aW9ucywgdGhlbiB0aGUgY29udHJvbFxuICogd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCBhbiBcInVua25vd25cIiBvcHRpb24sIHdoaWNoIGl0IHRoZW4gcmVtb3ZlcyB3aGVuIHRoZSBtaXNtYXRjaCBpcyByZXNvbHZlZC5cbiAqXG4gKiBPcHRpb25hbGx5LCBhIHNpbmdsZSBoYXJkLWNvZGVkIGA8b3B0aW9uPmAgZWxlbWVudCwgd2l0aCB0aGUgdmFsdWUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgY2FuXG4gKiBiZSBuZXN0ZWQgaW50byB0aGUgYDxzZWxlY3Q+YCBlbGVtZW50LiBUaGlzIGVsZW1lbnQgd2lsbCB0aGVuIHJlcHJlc2VudCB0aGUgYG51bGxgIG9yIFwibm90IHNlbGVjdGVkXCJcbiAqIG9wdGlvbi4gU2VlIGV4YW1wbGUgYmVsb3cgZm9yIGRlbW9uc3RyYXRpb24uXG4gKlxuICogIyMgQ2hvb3NpbmcgYmV0d2VlbiBgbmdSZXBlYXRgIGFuZCBgbmdPcHRpb25zYFxuICpcbiAqIEluIG1hbnkgY2FzZXMsIGBuZ1JlcGVhdGAgY2FuIGJlIHVzZWQgb24gYDxvcHRpb24+YCBlbGVtZW50cyBpbnN0ZWFkIG9mIHtAbGluayBuZy5kaXJlY3RpdmU6bmdPcHRpb25zXG4gKiBuZ09wdGlvbnN9IHRvIGFjaGlldmUgYSBzaW1pbGFyIHJlc3VsdC4gSG93ZXZlciwgYG5nT3B0aW9uc2AgcHJvdmlkZXMgc29tZSBiZW5lZml0czpcbiAqIC0gbW9yZSBmbGV4aWJpbGl0eSBpbiBob3cgdGhlIGA8c2VsZWN0PmAncyBtb2RlbCBpcyBhc3NpZ25lZCB2aWEgdGhlIGBzZWxlY3RgICoqYGFzYCoqIHBhcnQgb2YgdGhlXG4gKiBjb21wcmVoZW5zaW9uIGV4cHJlc3Npb25cbiAqIC0gcmVkdWNlZCBtZW1vcnkgY29uc3VtcHRpb24gYnkgbm90IGNyZWF0aW5nIGEgbmV3IHNjb3BlIGZvciBlYWNoIHJlcGVhdGVkIGluc3RhbmNlXG4gKiAtIGluY3JlYXNlZCByZW5kZXIgc3BlZWQgYnkgY3JlYXRpbmcgdGhlIG9wdGlvbnMgaW4gYSBkb2N1bWVudEZyYWdtZW50IGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5XG4gKlxuICogU3BlY2lmaWNhbGx5LCBzZWxlY3Qgd2l0aCByZXBlYXRlZCBvcHRpb25zIHNsb3dzIGRvd24gc2lnbmlmaWNhbnRseSBzdGFydGluZyBhdCAyMDAwIG9wdGlvbnMgaW5cbiAqIENocm9tZSBhbmQgSW50ZXJuZXQgRXhwbG9yZXIgLyBFZGdlLlxuICpcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmdNb2RlbCBBc3NpZ25hYmxlIGFuZ3VsYXIgZXhwcmVzc2lvbiB0byBkYXRhLWJpbmQgdG8uXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgUHJvcGVydHkgbmFtZSBvZiB0aGUgZm9ybSB1bmRlciB3aGljaCB0aGUgY29udHJvbCBpcyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG11bHRpcGxlIEFsbG93cyBtdWx0aXBsZSBvcHRpb25zIHRvIGJlIHNlbGVjdGVkLiBUaGUgc2VsZWN0ZWQgdmFsdWVzIHdpbGwgYmVcbiAqICAgICBib3VuZCB0byB0aGUgbW9kZWwgYXMgYW4gYXJyYXkuXG4gKiBAcGFyYW0ge3N0cmluZz19IHJlcXVpcmVkIFNldHMgYHJlcXVpcmVkYCB2YWxpZGF0aW9uIGVycm9yIGtleSBpZiB0aGUgdmFsdWUgaXMgbm90IGVudGVyZWQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nUmVxdWlyZWQgQWRkcyByZXF1aXJlZCBhdHRyaWJ1dGUgYW5kIHJlcXVpcmVkIHZhbGlkYXRpb24gY29uc3RyYWludCB0b1xuICogdGhlIGVsZW1lbnQgd2hlbiB0aGUgbmdSZXF1aXJlZCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBVc2UgbmdSZXF1aXJlZCBpbnN0ZWFkIG9mIHJlcXVpcmVkXG4gKiB3aGVuIHlvdSB3YW50IHRvIGRhdGEtYmluZCB0byB0aGUgcmVxdWlyZWQgYXR0cmlidXRlLlxuICogQHBhcmFtIHtzdHJpbmc9fSBuZ0NoYW5nZSBBbmd1bGFyIGV4cHJlc3Npb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiBzZWxlY3RlZCBvcHRpb24ocykgY2hhbmdlcyBkdWUgdG8gdXNlclxuICogICAgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc2VsZWN0IGVsZW1lbnQuXG4gKiBAcGFyYW0ge3N0cmluZz19IG5nT3B0aW9ucyBzZXRzIHRoZSBvcHRpb25zIHRoYXQgdGhlIHNlbGVjdCBpcyBwb3B1bGF0ZWQgd2l0aCBhbmQgZGVmaW5lcyB3aGF0IGlzXG4gKiBzZXQgb24gdGhlIG1vZGVsIG9uIHNlbGVjdGlvbi4gU2VlIHtAbGluayBuZ09wdGlvbnMgYG5nT3B0aW9uc2B9LlxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgU2ltcGxlIGBzZWxlY3RgIGVsZW1lbnRzIHdpdGggc3RhdGljIG9wdGlvbnNcbiAqXG4gKiA8ZXhhbXBsZSBuYW1lPVwic3RhdGljLXNlbGVjdFwiIG1vZHVsZT1cInN0YXRpY1NlbGVjdFwiPlxuICogPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIj5cbiAqICAgICA8bGFiZWwgZm9yPVwic2luZ2xlU2VsZWN0XCI+IFNpbmdsZSBzZWxlY3Q6IDwvbGFiZWw+PGJyPlxuICogICAgIDxzZWxlY3QgbmFtZT1cInNpbmdsZVNlbGVjdFwiIG5nLW1vZGVsPVwiZGF0YS5zaW5nbGVTZWxlY3RcIj5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcHRpb24tMVwiPk9wdGlvbiAxPC9vcHRpb24+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwib3B0aW9uLTJcIj5PcHRpb24gMjwvb3B0aW9uPlxuICogICAgIDwvc2VsZWN0Pjxicj5cbiAqXG4gKiAgICAgPGxhYmVsIGZvcj1cInNpbmdsZVNlbGVjdFwiPiBTaW5nbGUgc2VsZWN0IHdpdGggXCJub3Qgc2VsZWN0ZWRcIiBvcHRpb24gYW5kIGR5bmFtaWMgb3B0aW9uIHZhbHVlczogPC9sYWJlbD48YnI+XG4gKiAgICAgPHNlbGVjdCBuYW1lPVwic2luZ2xlU2VsZWN0XCIgaWQ9XCJzaW5nbGVTZWxlY3RcIiBuZy1tb2RlbD1cImRhdGEuc2luZ2xlU2VsZWN0XCI+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0tUGxlYXNlIHNlbGVjdC0tLTwvb3B0aW9uPiA8IS0tIG5vdCBzZWxlY3RlZCAvIGJsYW5rIG9wdGlvbiAtLT5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCJ7e2RhdGEub3B0aW9uMX19XCI+T3B0aW9uIDE8L29wdGlvbj4gPCEtLSBpbnRlcnBvbGF0aW9uIC0tPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9wdGlvbi0yXCI+T3B0aW9uIDI8L29wdGlvbj5cbiAqICAgICA8L3NlbGVjdD48YnI+XG4gKiAgICAgPGJ1dHRvbiBuZy1jbGljaz1cImZvcmNlVW5rbm93bk9wdGlvbigpXCI+Rm9yY2UgdW5rbm93biBvcHRpb248L2J1dHRvbj48YnI+XG4gKiAgICAgPHR0PnNpbmdsZVNlbGVjdCA9IHt7ZGF0YS5zaW5nbGVTZWxlY3R9fTwvdHQ+XG4gKlxuICogICAgIDxocj5cbiAqICAgICA8bGFiZWwgZm9yPVwibXVsdGlwbGVTZWxlY3RcIj4gTXVsdGlwbGUgc2VsZWN0OiA8L2xhYmVsPjxicj5cbiAqICAgICA8c2VsZWN0IG5hbWU9XCJtdWx0aXBsZVNlbGVjdFwiIGlkPVwibXVsdGlwbGVTZWxlY3RcIiBuZy1tb2RlbD1cImRhdGEubXVsdGlwbGVTZWxlY3RcIiBtdWx0aXBsZT5cbiAqICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcHRpb24tMVwiPk9wdGlvbiAxPC9vcHRpb24+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwib3B0aW9uLTJcIj5PcHRpb24gMjwvb3B0aW9uPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9wdGlvbi0zXCI+T3B0aW9uIDM8L29wdGlvbj5cbiAqICAgICA8L3NlbGVjdD48YnI+XG4gKiAgICAgPHR0Pm11bHRpcGxlU2VsZWN0ID0ge3tkYXRhLm11bHRpcGxlU2VsZWN0fX08L3R0Pjxici8+XG4gKiAgIDwvZm9ybT5cbiAqIDwvZGl2PlxuICogPC9maWxlPlxuICogPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogIGFuZ3VsYXIubW9kdWxlKCdzdGF0aWNTZWxlY3QnLCBbXSlcbiAqICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICRzY29wZS5kYXRhID0ge1xuICogICAgICAgc2luZ2xlU2VsZWN0OiBudWxsLFxuICogICAgICAgbXVsdGlwbGVTZWxlY3Q6IFtdLFxuICogICAgICAgb3B0aW9uMTogJ29wdGlvbi0xJ1xuICogICAgICB9O1xuICpcbiAqICAgICAgJHNjb3BlLmZvcmNlVW5rbm93bk9wdGlvbiA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgICRzY29wZS5kYXRhLnNpbmdsZVNlbGVjdCA9ICdub25zZW5zZSc7XG4gKiAgICAgIH07XG4gKiAgIH1dKTtcbiAqIDwvZmlsZT5cbiAqPC9leGFtcGxlPlxuICpcbiAqICMjIyBVc2luZyBgbmdSZXBlYXRgIHRvIGdlbmVyYXRlIGBzZWxlY3RgIG9wdGlvbnNcbiAqIDxleGFtcGxlIG5hbWU9XCJzZWxlY3QtbmdyZXBlYXRcIiBtb2R1bGU9XCJuZ3JlcGVhdFNlbGVjdFwiPlxuICogPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgIDxmb3JtIG5hbWU9XCJteUZvcm1cIj5cbiAqICAgICA8bGFiZWwgZm9yPVwicmVwZWF0U2VsZWN0XCI+IFJlcGVhdCBzZWxlY3Q6IDwvbGFiZWw+XG4gKiAgICAgPHNlbGVjdCBuYW1lPVwicmVwZWF0U2VsZWN0XCIgaWQ9XCJyZXBlYXRTZWxlY3RcIiBuZy1tb2RlbD1cImRhdGEubW9kZWxcIj5cbiAqICAgICAgIDxvcHRpb24gbmctcmVwZWF0PVwib3B0aW9uIGluIGRhdGEuYXZhaWxhYmxlT3B0aW9uc1wiIHZhbHVlPVwie3tvcHRpb24uaWR9fVwiPnt7b3B0aW9uLm5hbWV9fTwvb3B0aW9uPlxuICogICAgIDwvc2VsZWN0PlxuICogICA8L2Zvcm0+XG4gKiAgIDxocj5cbiAqICAgPHR0Pm1vZGVsID0ge3tkYXRhLm1vZGVsfX08L3R0Pjxici8+XG4gKiA8L2Rpdj5cbiAqIDwvZmlsZT5cbiAqIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICBhbmd1bGFyLm1vZHVsZSgnbmdyZXBlYXRTZWxlY3QnLCBbXSlcbiAqICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICRzY29wZS5kYXRhID0ge1xuICogICAgICAgbW9kZWw6IG51bGwsXG4gKiAgICAgICBhdmFpbGFibGVPcHRpb25zOiBbXG4gKiAgICAgICAgIHtpZDogJzEnLCBuYW1lOiAnT3B0aW9uIEEnfSxcbiAqICAgICAgICAge2lkOiAnMicsIG5hbWU6ICdPcHRpb24gQid9LFxuICogICAgICAgICB7aWQ6ICczJywgbmFtZTogJ09wdGlvbiBDJ31cbiAqICAgICAgIF1cbiAqICAgICAgfTtcbiAqICAgfV0pO1xuICogPC9maWxlPlxuICo8L2V4YW1wbGU+XG4gKlxuICogIyMjIFVzaW5nIGBuZ1ZhbHVlYCB0byBiaW5kIHRoZSBtb2RlbCB0byBhbiBhcnJheSBvZiBvYmplY3RzXG4gKiA8ZXhhbXBsZSBuYW1lPVwic2VsZWN0LW5ndmFsdWVcIiBtb2R1bGU9XCJuZ3ZhbHVlU2VsZWN0XCI+XG4gKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICogICAgIDxsYWJlbCBmb3I9XCJuZ3ZhbHVlc2VsZWN0XCI+IG5ndmFsdWUgc2VsZWN0OiA8L2xhYmVsPlxuICogICAgIDxzZWxlY3Qgc2l6ZT1cIjZcIiBuYW1lPVwibmd2YWx1ZXNlbGVjdFwiIG5nLW1vZGVsPVwiZGF0YS5tb2RlbFwiIG11bHRpcGxlPlxuICogICAgICAgPG9wdGlvbiBuZy1yZXBlYXQ9XCJvcHRpb24gaW4gZGF0YS5hdmFpbGFibGVPcHRpb25zXCIgbmctdmFsdWU9XCJvcHRpb24udmFsdWVcIj57e29wdGlvbi5uYW1lfX08L29wdGlvbj5cbiAqICAgICA8L3NlbGVjdD5cbiAqICAgPC9mb3JtPlxuICogICA8aHI+XG4gKiAgIDxwcmU+bW9kZWwgPSB7e2RhdGEubW9kZWwgfCBqc29ufX08L3ByZT48YnIvPlxuICogPC9kaXY+XG4gKiA8L2ZpbGU+XG4gKiA8ZmlsZSBuYW1lPVwiYXBwLmpzXCI+XG4gKiAgYW5ndWxhci5tb2R1bGUoJ25ndmFsdWVTZWxlY3QnLCBbXSlcbiAqICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICRzY29wZS5kYXRhID0ge1xuICogICAgICAgbW9kZWw6IG51bGwsXG4gKiAgICAgICBhdmFpbGFibGVPcHRpb25zOiBbXG4gICAgICAgICAgIHt2YWx1ZTogJ215U3RyaW5nJywgbmFtZTogJ3N0cmluZyd9LFxuICAgICAgICAgICB7dmFsdWU6IDEsIG5hbWU6ICdpbnRlZ2VyJ30sXG4gICAgICAgICAgIHt2YWx1ZTogdHJ1ZSwgbmFtZTogJ2Jvb2xlYW4nfSxcbiAgICAgICAgICAge3ZhbHVlOiBudWxsLCBuYW1lOiAnbnVsbCd9LFxuICAgICAgICAgICB7dmFsdWU6IHtwcm9wOiAndmFsdWUnfSwgbmFtZTogJ29iamVjdCd9LFxuICAgICAgICAgICB7dmFsdWU6IFsnYSddLCBuYW1lOiAnYXJyYXknfVxuICogICAgICAgXVxuICogICAgICB9O1xuICogICB9XSk7XG4gKiA8L2ZpbGU+XG4gKjwvZXhhbXBsZT5cbiAqXG4gKiAjIyMgVXNpbmcgYHNlbGVjdGAgd2l0aCBgbmdPcHRpb25zYCBhbmQgc2V0dGluZyBhIGRlZmF1bHQgdmFsdWVcbiAqIFNlZSB0aGUge0BsaW5rIG5nT3B0aW9ucyBuZ09wdGlvbnMgZG9jdW1lbnRhdGlvbn0gZm9yIG1vcmUgYG5nT3B0aW9uc2AgdXNhZ2UgZXhhbXBsZXMuXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInNlbGVjdC13aXRoLWRlZmF1bHQtdmFsdWVzXCIgbW9kdWxlPVwiZGVmYXVsdFZhbHVlU2VsZWN0XCI+XG4gKiA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgPGZvcm0gbmFtZT1cIm15Rm9ybVwiPlxuICogICAgIDxsYWJlbCBmb3I9XCJteVNlbGVjdFwiPk1ha2UgYSBjaG9pY2U6PC9sYWJlbD5cbiAqICAgICA8c2VsZWN0IG5hbWU9XCJteVNlbGVjdFwiIGlkPVwibXlTZWxlY3RcIlxuICogICAgICAgbmctb3B0aW9ucz1cIm9wdGlvbi5uYW1lIGZvciBvcHRpb24gaW4gZGF0YS5hdmFpbGFibGVPcHRpb25zIHRyYWNrIGJ5IG9wdGlvbi5pZFwiXG4gKiAgICAgICBuZy1tb2RlbD1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIj48L3NlbGVjdD5cbiAqICAgPC9mb3JtPlxuICogICA8aHI+XG4gKiAgIDx0dD5vcHRpb24gPSB7e2RhdGEuc2VsZWN0ZWRPcHRpb259fTwvdHQ+PGJyLz5cbiAqIDwvZGl2PlxuICogPC9maWxlPlxuICogPGZpbGUgbmFtZT1cImFwcC5qc1wiPlxuICogIGFuZ3VsYXIubW9kdWxlKCdkZWZhdWx0VmFsdWVTZWxlY3QnLCBbXSlcbiAqICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICRzY29wZS5kYXRhID0ge1xuICogICAgICAgYXZhaWxhYmxlT3B0aW9uczogW1xuICogICAgICAgICB7aWQ6ICcxJywgbmFtZTogJ09wdGlvbiBBJ30sXG4gKiAgICAgICAgIHtpZDogJzInLCBuYW1lOiAnT3B0aW9uIEInfSxcbiAqICAgICAgICAge2lkOiAnMycsIG5hbWU6ICdPcHRpb24gQyd9XG4gKiAgICAgICBdLFxuICogICAgICAgc2VsZWN0ZWRPcHRpb246IHtpZDogJzMnLCBuYW1lOiAnT3B0aW9uIEMnfSAvL1RoaXMgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc2VsZWN0IGluIHRoZSB1aVxuICogICAgICAgfTtcbiAqICAgfV0pO1xuICogPC9maWxlPlxuICo8L2V4YW1wbGU+XG4gKlxuICpcbiAqICMjIyBCaW5kaW5nIGBzZWxlY3RgIHRvIGEgbm9uLXN0cmluZyB2YWx1ZSB2aWEgYG5nTW9kZWxgIHBhcnNpbmcgLyBmb3JtYXR0aW5nXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInNlbGVjdC13aXRoLW5vbi1zdHJpbmctb3B0aW9uc1wiIG1vZHVsZT1cIm5vblN0cmluZ1NlbGVjdFwiPlxuICogICA8ZmlsZSBuYW1lPVwiaW5kZXguaHRtbFwiPlxuICogICAgIDxzZWxlY3QgbmctbW9kZWw9XCJtb2RlbC5pZFwiIGNvbnZlcnQtdG8tbnVtYmVyPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cIjBcIj5aZXJvPC9vcHRpb24+XG4gKiAgICAgICA8b3B0aW9uIHZhbHVlPVwiMVwiPk9uZTwvb3B0aW9uPlxuICogICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj5Ud288L29wdGlvbj5cbiAqICAgICA8L3NlbGVjdD5cbiAqICAgICB7eyBtb2RlbCB9fVxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJhcHAuanNcIj5cbiAqICAgICBhbmd1bGFyLm1vZHVsZSgnbm9uU3RyaW5nU2VsZWN0JywgW10pXG4gKiAgICAgICAucnVuKGZ1bmN0aW9uKCRyb290U2NvcGUpIHtcbiAqICAgICAgICAgJHJvb3RTY29wZS5tb2RlbCA9IHsgaWQ6IDIgfTtcbiAqICAgICAgIH0pXG4gKiAgICAgICAuZGlyZWN0aXZlKCdjb252ZXJ0VG9OdW1iZXInLCBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICByZXF1aXJlOiAnbmdNb2RlbCcsXG4gKiAgICAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBuZ01vZGVsKSB7XG4gKiAgICAgICAgICAgICBuZ01vZGVsLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24odmFsKSB7XG4gKiAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh2YWwsIDEwKTtcbiAqICAgICAgICAgICAgIH0pO1xuICogICAgICAgICAgICAgbmdNb2RlbC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKHZhbCkge1xuICogICAgICAgICAgICAgICByZXR1cm4gJycgKyB2YWw7XG4gKiAgICAgICAgICAgICB9KTtcbiAqICAgICAgICAgICB9XG4gKiAgICAgICAgIH07XG4gKiAgICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gKiAgICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHRvIG1vZGVsJywgZnVuY3Rpb24oKSB7XG4gKiAgICAgICBleHBlY3QoZWxlbWVudChieS5tb2RlbCgnbW9kZWwuaWQnKSkuJCgnb3B0aW9uOmNoZWNrZWQnKS5nZXRUZXh0KCkpLnRvRXF1YWwoJ1R3bycpO1xuICogICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKlxuICovXG52YXIgc2VsZWN0RGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7XG5cbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0UnLFxuICAgIHJlcXVpcmU6IFsnc2VsZWN0JywgJz9uZ01vZGVsJ10sXG4gICAgY29udHJvbGxlcjogU2VsZWN0Q29udHJvbGxlcixcbiAgICBwcmlvcml0eTogMSxcbiAgICBsaW5rOiB7XG4gICAgICBwcmU6IHNlbGVjdFByZUxpbmssXG4gICAgICBwb3N0OiBzZWxlY3RQb3N0TGlua1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBzZWxlY3RQcmVMaW5rKHNjb3BlLCBlbGVtZW50LCBhdHRyLCBjdHJscykge1xuXG4gICAgICB2YXIgc2VsZWN0Q3RybCA9IGN0cmxzWzBdO1xuICAgICAgdmFyIG5nTW9kZWxDdHJsID0gY3RybHNbMV07XG5cbiAgICAgIC8vIGlmIG5nTW9kZWwgaXMgbm90IGRlZmluZWQsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYnV0IHNldCB0aGUgcmVnaXN0ZXJPcHRpb25cbiAgICAgIC8vIGZ1bmN0aW9uIHRvIG5vb3AsIHNvIG9wdGlvbnMgZG9uJ3QgZ2V0IGFkZGVkIGludGVybmFsbHlcbiAgICAgIGlmICghbmdNb2RlbEN0cmwpIHtcbiAgICAgICAgc2VsZWN0Q3RybC5yZWdpc3Rlck9wdGlvbiA9IG5vb3A7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuXG4gICAgICBzZWxlY3RDdHJsLm5nTW9kZWxDdHJsID0gbmdNb2RlbEN0cmw7XG5cbiAgICAgIC8vIFdoZW4gdGhlIHNlbGVjdGVkIGl0ZW0ocykgY2hhbmdlcyB3ZSBkZWxlZ2F0ZSBnZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0IGNvbnRyb2xcbiAgICAgIC8vIHRvIHRoZSBgcmVhZFZhbHVlYCBtZXRob2QsIHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGlmIHRoZSBzZWxlY3QgY2FuIGhhdmUgbXVsdGlwbGVcbiAgICAgIC8vIHNlbGVjdGVkIHZhbHVlcyBvciBpZiB0aGUgb3B0aW9ucyBhcmUgYmVpbmcgZ2VuZXJhdGVkIGJ5IGBuZ09wdGlvbnNgXG4gICAgICBlbGVtZW50Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZWN0Q3RybC5yZW1vdmVVbmtub3duT3B0aW9uKCk7XG4gICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHtcbiAgICAgICAgICBuZ01vZGVsQ3RybC4kc2V0Vmlld1ZhbHVlKHNlbGVjdEN0cmwucmVhZFZhbHVlKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGUgc2VsZWN0IGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMgdGhlbiB3ZSBuZWVkIHRvIG1vZGlmeSBob3cgd2UgcmVhZCBhbmQgd3JpdGVcbiAgICAgIC8vIHZhbHVlcyBmcm9tIGFuZCB0byB0aGUgY29udHJvbDsgYWxzbyB3aGF0IGl0IG1lYW5zIGZvciB0aGUgdmFsdWUgdG8gYmUgZW1wdHkgYW5kXG4gICAgICAvLyB3ZSBoYXZlIHRvIGFkZCBhbiBleHRyYSB3YXRjaCBzaW5jZSBuZ01vZGVsIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggYXJyYXlzIC0gaXRcbiAgICAgIC8vIGRvZXNuJ3QgdHJpZ2dlciByZW5kZXJpbmcgaWYgb25seSBhbiBpdGVtIGluIHRoZSBhcnJheSBjaGFuZ2VzLlxuICAgICAgaWYgKGF0dHIubXVsdGlwbGUpIHtcbiAgICAgICAgc2VsZWN0Q3RybC5tdWx0aXBsZSA9IHRydWU7XG5cbiAgICAgICAgLy8gUmVhZCB2YWx1ZSBub3cgbmVlZHMgdG8gY2hlY2sgZWFjaCBvcHRpb24gdG8gc2VlIGlmIGl0IGlzIHNlbGVjdGVkXG4gICAgICAgIHNlbGVjdEN0cmwucmVhZFZhbHVlID0gZnVuY3Rpb24gcmVhZE11bHRpcGxlVmFsdWUoKSB7XG4gICAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgICAgZm9yRWFjaChlbGVtZW50LmZpbmQoJ29wdGlvbicpLCBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uc2VsZWN0ZWQgJiYgIW9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICB2YXIgdmFsID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbCBpbiBzZWxlY3RDdHJsLnNlbGVjdFZhbHVlTWFwID8gc2VsZWN0Q3RybC5zZWxlY3RWYWx1ZU1hcFt2YWxdIDogdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JpdGUgdmFsdWUgbm93IG5lZWRzIHRvIHNldCB0aGUgc2VsZWN0ZWQgcHJvcGVydHkgb2YgZWFjaCBtYXRjaGluZyBvcHRpb25cbiAgICAgICAgc2VsZWN0Q3RybC53cml0ZVZhbHVlID0gZnVuY3Rpb24gd3JpdGVNdWx0aXBsZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIGl0ZW1zID0gbmV3IEhhc2hNYXAodmFsdWUpO1xuICAgICAgICAgIGZvckVhY2goZWxlbWVudC5maW5kKCdvcHRpb24nKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBpc0RlZmluZWQoaXRlbXMuZ2V0KG9wdGlvbi52YWx1ZSkpIHx8IGlzRGVmaW5lZChpdGVtcy5nZXQoc2VsZWN0Q3RybC5zZWxlY3RWYWx1ZU1hcFtvcHRpb24udmFsdWVdKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBpdCBvbiBlYWNoIHdhdGNoIHNpbmNlIG5nTW9kZWwgd2F0Y2hlcyByZWZlcmVuY2UsIGJ1dFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdvcmsgb2YgYW4gYXJyYXksIHNvIHdlIG5lZWQgdG8gc2VlIGlmIGFueXRoaW5nIHdhcyBpbnNlcnRlZC9yZW1vdmVkXG4gICAgICAgIHZhciBsYXN0VmlldywgbGFzdFZpZXdSZWYgPSBOYU47XG4gICAgICAgIHNjb3BlLiR3YXRjaChmdW5jdGlvbiBzZWxlY3RNdWx0aXBsZVdhdGNoKCkge1xuICAgICAgICAgIGlmIChsYXN0Vmlld1JlZiA9PT0gbmdNb2RlbEN0cmwuJHZpZXdWYWx1ZSAmJiAhZXF1YWxzKGxhc3RWaWV3LCBuZ01vZGVsQ3RybC4kdmlld1ZhbHVlKSkge1xuICAgICAgICAgICAgbGFzdFZpZXcgPSBzaGFsbG93Q29weShuZ01vZGVsQ3RybC4kdmlld1ZhbHVlKTtcbiAgICAgICAgICAgIG5nTW9kZWxDdHJsLiRyZW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdFZpZXdSZWYgPSBuZ01vZGVsQ3RybC4kdmlld1ZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB3ZSBhcmUgYSBtdWx0aXBsZSBzZWxlY3QgdGhlbiB2YWx1ZSBpcyBub3cgYSBjb2xsZWN0aW9uXG4gICAgICAgIC8vIHNvIHRoZSBtZWFuaW5nIG9mICRpc0VtcHR5IGNoYW5nZXNcbiAgICAgICAgbmdNb2RlbEN0cmwuJGlzRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiAhdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwO1xuICAgICAgICB9O1xuXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2VsZWN0UG9zdExpbmsoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjdHJscykge1xuICAgICAgLy8gaWYgbmdNb2RlbCBpcyBub3QgZGVmaW5lZCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZ1xuICAgICAgdmFyIG5nTW9kZWxDdHJsID0gY3RybHNbMV07XG4gICAgICBpZiAoIW5nTW9kZWxDdHJsKSByZXR1cm47XG5cbiAgICAgIHZhciBzZWxlY3RDdHJsID0gY3RybHNbMF07XG5cbiAgICAgIC8vIFdlIGRlbGVnYXRlIHJlbmRlcmluZyB0byB0aGUgYHdyaXRlVmFsdWVgIG1ldGhvZCwgd2hpY2ggY2FuIGJlIGNoYW5nZWRcbiAgICAgIC8vIGlmIHRoZSBzZWxlY3QgY2FuIGhhdmUgbXVsdGlwbGUgc2VsZWN0ZWQgdmFsdWVzIG9yIGlmIHRoZSBvcHRpb25zIGFyZSBiZWluZ1xuICAgICAgLy8gZ2VuZXJhdGVkIGJ5IGBuZ09wdGlvbnNgLlxuICAgICAgLy8gVGhpcyBtdXN0IGJlIGRvbmUgaW4gdGhlIHBvc3RMaW5rIGZuIHRvIHByZXZlbnQgJHJlbmRlciB0byBiZSBjYWxsZWQgYmVmb3JlXG4gICAgICAvLyBhbGwgbm9kZXMgaGF2ZSBiZWVuIGxpbmtlZCBjb3JyZWN0bHkuXG4gICAgICBuZ01vZGVsQ3RybC4kcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGVjdEN0cmwud3JpdGVWYWx1ZShuZ01vZGVsQ3RybC4kdmlld1ZhbHVlKTtcbiAgICAgIH07XG4gICAgfVxufTtcblxuXG4vLyBUaGUgb3B0aW9uIGRpcmVjdGl2ZSBpcyBwdXJlbHkgZGVzaWduZWQgdG8gY29tbXVuaWNhdGUgdGhlIGV4aXN0ZW5jZSAob3IgbGFjayBvZilcbi8vIG9mIGR5bmFtaWNhbGx5IGNyZWF0ZWQgKGFuZCBkZXN0cm95ZWQpIG9wdGlvbiBlbGVtZW50cyB0byB0aGVpciBjb250YWluaW5nIHNlbGVjdFxuLy8gZGlyZWN0aXZlIHZpYSBpdHMgY29udHJvbGxlci5cbnZhciBvcHRpb25EaXJlY3RpdmUgPSBbJyRpbnRlcnBvbGF0ZScsIGZ1bmN0aW9uKCRpbnRlcnBvbGF0ZSkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRScsXG4gICAgcHJpb3JpdHk6IDEwMCxcbiAgICBjb21waWxlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyKSB7XG4gICAgICB2YXIgaW50ZXJwb2xhdGVWYWx1ZUZuLCBpbnRlcnBvbGF0ZVRleHRGbjtcblxuICAgICAgaWYgKGlzRGVmaW5lZChhdHRyLm5nVmFsdWUpKSB7XG4gICAgICAgIC8vIFdpbGwgYmUgaGFuZGxlZCBieSByZWdpc3Rlck9wdGlvblxuICAgICAgfSBlbHNlIGlmIChpc0RlZmluZWQoYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBjaGVjayBpZiBpdCBjb250YWlucyBhbiBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGludGVycG9sYXRlVmFsdWVGbiA9ICRpbnRlcnBvbGF0ZShhdHRyLnZhbHVlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQgdGhlbiB3ZSBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAgIC8vIHRleHQgY29udGVudCBvZiB0aGUgb3B0aW9uIGVsZW1lbnQsIHdoaWNoIG1heSBiZSBpbnRlcnBvbGF0ZWRcbiAgICAgICAgaW50ZXJwb2xhdGVUZXh0Rm4gPSAkaW50ZXJwb2xhdGUoZWxlbWVudC50ZXh0KCksIHRydWUpO1xuICAgICAgICBpZiAoIWludGVycG9sYXRlVGV4dEZuKSB7XG4gICAgICAgICAgYXR0ci4kc2V0KCd2YWx1ZScsIGVsZW1lbnQudGV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gb3ZlciB1c2luZyBeXiBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGhhdmUgdG8gc2VhcmNoXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IG9mIHRoZSBET00gZm9yIGV2ZXJ5IHNpbmdsZSBvcHRpb24gZWxlbWVudFxuICAgICAgICB2YXIgc2VsZWN0Q3RybE5hbWUgPSAnJHNlbGVjdENvbnRyb2xsZXInLFxuICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudC5wYXJlbnQoKSxcbiAgICAgICAgICAgIHNlbGVjdEN0cmwgPSBwYXJlbnQuZGF0YShzZWxlY3RDdHJsTmFtZSkgfHxcbiAgICAgICAgICAgICAgcGFyZW50LnBhcmVudCgpLmRhdGEoc2VsZWN0Q3RybE5hbWUpOyAvLyBpbiBjYXNlIHdlIGFyZSBpbiBvcHRncm91cFxuXG4gICAgICAgIGlmIChzZWxlY3RDdHJsKSB7XG4gICAgICAgICAgc2VsZWN0Q3RybC5yZWdpc3Rlck9wdGlvbihzY29wZSwgZWxlbWVudCwgYXR0ciwgaW50ZXJwb2xhdGVWYWx1ZUZuLCBpbnRlcnBvbGF0ZVRleHRGbik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufV07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdSZXF1aXJlZFxuICogQHJlc3RyaWN0IEFcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBuZ1JlcXVpcmVkIGFkZHMgdGhlIHJlcXVpcmVkIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2YWxpZGF0b3JzIGB2YWxpZGF0b3JgfSB0byB7QGxpbmsgbmdNb2RlbCBgbmdNb2RlbGB9LlxuICogSXQgaXMgbW9zdCBvZnRlbiB1c2VkIGZvciB7QGxpbmsgaW5wdXQgYGlucHV0YH0gYW5kIHtAbGluayBzZWxlY3QgYHNlbGVjdGB9IGNvbnRyb2xzLCBidXQgY2FuIGFsc28gYmVcbiAqIGFwcGxpZWQgdG8gY3VzdG9tIGNvbnRyb2xzLlxuICpcbiAqIFRoZSBkaXJlY3RpdmUgc2V0cyB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQgaWYgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBpbnNpZGVcbiAqIGBuZ1JlcXVpcmVkYCBldmFsdWF0ZXMgdG8gdHJ1ZS4gQSBzcGVjaWFsIGRpcmVjdGl2ZSBmb3Igc2V0dGluZyBgcmVxdWlyZWRgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlXG4gKiBjYW5ub3QgdXNlIGludGVycG9sYXRpb24gaW5zaWRlIGByZXF1aXJlZGAuIFNlZSB0aGUge0BsaW5rIGd1aWRlL2ludGVycG9sYXRpb24gaW50ZXJwb2xhdGlvbiBndWlkZX1cbiAqIGZvciBtb3JlIGluZm8uXG4gKlxuICogVGhlIHZhbGlkYXRvciB3aWxsIHNldCB0aGUgYHJlcXVpcmVkYCBlcnJvciBrZXkgdG8gdHJ1ZSBpZiB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgaXMgc2V0IGFuZFxuICogY2FsbGluZyB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkaXNFbXB0eSBgTmdNb2RlbENvbnRyb2xsZXIuJGlzRW1wdHlgfSB3aXRoIHRoZVxuICoge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZSBgbmdNb2RlbC4kdmlld1ZhbHVlYH0gcmV0dXJucyBgdHJ1ZWAuIEZvciBleGFtcGxlLCB0aGVcbiAqIGAkaXNFbXB0eSgpYCBpbXBsZW1lbnRhdGlvbiBmb3IgYGlucHV0W3RleHRdYCBjaGVja3MgdGhlIGxlbmd0aCBvZiB0aGUgYCR2aWV3VmFsdWVgLiBXaGVuIGRldmVsb3BpbmdcbiAqIGN1c3RvbSBjb250cm9scywgYCRpc0VtcHR5KClgIGNhbiBiZSBvdmVyd3JpdHRlbiB0byBhY2NvdW50IGZvciBhICR2aWV3VmFsdWUgdGhhdCBpcyBub3Qgc3RyaW5nLWJhc2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZXhhbXBsZSBuYW1lPVwibmdSZXF1aXJlZERpcmVjdGl2ZVwiIG1vZHVsZT1cIm5nUmVxdWlyZWRFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNjcmlwdD5cbiAqICAgICAgIGFuZ3VsYXIubW9kdWxlKCduZ1JlcXVpcmVkRXhhbXBsZScsIFtdKVxuICogICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAgICAgICRzY29wZS5yZXF1aXJlZCA9IHRydWU7XG4gKiAgICAgICAgIH1dKTtcbiAqICAgICA8L3NjcmlwdD5cbiAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICAgPGZvcm0gbmFtZT1cImZvcm1cIj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cInJlcXVpcmVkXCI+VG9nZ2xlIHJlcXVpcmVkOiA8L2xhYmVsPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmctbW9kZWw9XCJyZXF1aXJlZFwiIGlkPVwicmVxdWlyZWRcIiAvPlxuICogICAgICAgICA8YnI+XG4gKiAgICAgICAgIDxsYWJlbCBmb3I9XCJpbnB1dFwiPlRoaXMgaW5wdXQgbXVzdCBiZSBmaWxsZWQgaWYgYHJlcXVpcmVkYCBpcyB0cnVlOiA8L2xhYmVsPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm1vZGVsXCIgaWQ9XCJpbnB1dFwiIG5hbWU9XCJpbnB1dFwiIG5nLXJlcXVpcmVkPVwicmVxdWlyZWRcIiAvPjxicj5cbiAqICAgICAgICAgPGhyPlxuICogICAgICAgICByZXF1aXJlZCBlcnJvciBzZXQ/ID0gPGNvZGU+e3tmb3JtLmlucHV0LiRlcnJvci5yZXF1aXJlZH19PC9jb2RlPjxicj5cbiAqICAgICAgICAgbW9kZWwgPSA8Y29kZT57e21vZGVsfX08L2NvZGU+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIHZhciByZXF1aXJlZCA9IGVsZW1lbnQoYnkuYmluZGluZygnZm9ybS5pbnB1dC4kZXJyb3IucmVxdWlyZWQnKSk7XG4gICAgICAgdmFyIG1vZGVsID0gZWxlbWVudChieS5iaW5kaW5nKCdtb2RlbCcpKTtcbiAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5LmlkKCdpbnB1dCcpKTtcblxuICAgICAgIGl0KCdzaG91bGQgc2V0IHRoZSByZXF1aXJlZCBlcnJvcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgZXhwZWN0KHJlcXVpcmVkLmdldFRleHQoKSkudG9Db250YWluKCd0cnVlJyk7XG5cbiAgICAgICAgIGlucHV0LnNlbmRLZXlzKCcxMjMnKTtcbiAgICAgICAgIGV4cGVjdChyZXF1aXJlZC5nZXRUZXh0KCkpLm5vdC50b0NvbnRhaW4oJ3RydWUnKTtcbiAgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvQ29udGFpbignMTIzJyk7XG4gICAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqL1xudmFyIHJlcXVpcmVkRGlyZWN0aXZlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICByZXF1aXJlOiAnP25nTW9kZWwnLFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbG0sIGF0dHIsIGN0cmwpIHtcbiAgICAgIGlmICghY3RybCkgcmV0dXJuO1xuICAgICAgYXR0ci5yZXF1aXJlZCA9IHRydWU7IC8vIGZvcmNlIHRydXRoeSBpbiBjYXNlIHdlIGFyZSBvbiBub24gaW5wdXQgZWxlbWVudFxuXG4gICAgICBjdHJsLiR2YWxpZGF0b3JzLnJlcXVpcmVkID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgdmlld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhYXR0ci5yZXF1aXJlZCB8fCAhY3RybC4kaXNFbXB0eSh2aWV3VmFsdWUpO1xuICAgICAgfTtcblxuICAgICAgYXR0ci4kb2JzZXJ2ZSgncmVxdWlyZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdQYXR0ZXJuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogbmdQYXR0ZXJuIGFkZHMgdGhlIHBhdHRlcm4ge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRvcnMgYHZhbGlkYXRvcmB9IHRvIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0uXG4gKiBJdCBpcyBtb3N0IG9mdGVuIHVzZWQgZm9yIHRleHQtYmFzZWQge0BsaW5rIGlucHV0IGBpbnB1dGB9IGNvbnRyb2xzLCBidXQgY2FuIGFsc28gYmUgYXBwbGllZCB0byBjdXN0b20gdGV4dC1iYXNlZCBjb250cm9scy5cbiAqXG4gKiBUaGUgdmFsaWRhdG9yIHNldHMgdGhlIGBwYXR0ZXJuYCBlcnJvciBrZXkgaWYgdGhlIHtAbGluayBuZ01vZGVsLk5nTW9kZWxDb250cm9sbGVyIyR2aWV3VmFsdWUgYG5nTW9kZWwuJHZpZXdWYWx1ZWB9XG4gKiBkb2VzIG5vdCBtYXRjaCBhIFJlZ0V4cCB3aGljaCBpcyBvYnRhaW5lZCBieSBldmFsdWF0aW5nIHRoZSBBbmd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlXG4gKiBgbmdQYXR0ZXJuYCBhdHRyaWJ1dGUgdmFsdWU6XG4gKiAqIElmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBhIFJlZ0V4cCBvYmplY3QsIHRoZW4gdGhpcyBpcyB1c2VkIGRpcmVjdGx5LlxuICogKiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBzdHJpbmcsIHRoZW4gaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBSZWdFeHAgYWZ0ZXIgd3JhcHBpbmcgaXRcbiAqIGluIGBeYCBhbmQgYCRgIGNoYXJhY3RlcnMuIEZvciBpbnN0YW5jZSwgYFwiYWJjXCJgIHdpbGwgYmUgY29udmVydGVkIHRvIGBuZXcgUmVnRXhwKCdeYWJjJCcpYC5cbiAqXG4gKiA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICogKipOb3RlOioqIEF2b2lkIHVzaW5nIHRoZSBgZ2AgZmxhZyBvbiB0aGUgUmVnRXhwLCBhcyBpdCB3aWxsIGNhdXNlIGVhY2ggc3VjY2Vzc2l2ZSBzZWFyY2ggdG9cbiAqIHN0YXJ0IGF0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZWFyY2gncyBtYXRjaCwgdGh1cyBub3QgdGFraW5nIHRoZSB3aG9sZSBpbnB1dCB2YWx1ZSBpbnRvXG4gKiBhY2NvdW50LlxuICogPC9kaXY+XG4gKlxuICogPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cbiAqICoqTm90ZToqKiBUaGlzIGRpcmVjdGl2ZSBpcyBhbHNvIGFkZGVkIHdoZW4gdGhlIHBsYWluIGBwYXR0ZXJuYCBhdHRyaWJ1dGUgaXMgdXNlZCwgd2l0aCB0d29cbiAqIGRpZmZlcmVuY2VzOlxuICogPG9sPlxuICogICA8bGk+XG4gKiAgICAgYG5nUGF0dGVybmAgZG9lcyBub3Qgc2V0IHRoZSBgcGF0dGVybmAgYXR0cmlidXRlIGFuZCB0aGVyZWZvcmUgSFRNTDUgY29uc3RyYWludCB2YWxpZGF0aW9uIGlzXG4gKiAgICAgbm90IGF2YWlsYWJsZS5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIFRoZSBgbmdQYXR0ZXJuYCBhdHRyaWJ1dGUgbXVzdCBiZSBhbiBleHByZXNzaW9uLCB3aGlsZSB0aGUgYHBhdHRlcm5gIHZhbHVlIG11c3QgYmVcbiAqICAgICBpbnRlcnBvbGF0ZWQuXG4gKiAgIDwvbGk+XG4gKiA8L29sPlxuICogPC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAqIDxleGFtcGxlIG5hbWU9XCJuZ1BhdHRlcm5EaXJlY3RpdmVcIiBtb2R1bGU9XCJuZ1BhdHRlcm5FeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNjcmlwdD5cbiAqICAgICAgIGFuZ3VsYXIubW9kdWxlKCduZ1BhdHRlcm5FeGFtcGxlJywgW10pXG4gKiAgICAgICAgIC5jb250cm9sbGVyKCdFeGFtcGxlQ29udHJvbGxlcicsIFsnJHNjb3BlJywgZnVuY3Rpb24oJHNjb3BlKSB7XG4gKiAgICAgICAgICAgJHNjb3BlLnJlZ2V4ID0gJ1xcXFxkKyc7XG4gKiAgICAgICAgIH1dKTtcbiAqICAgICA8L3NjcmlwdD5cbiAqICAgICA8ZGl2IG5nLWNvbnRyb2xsZXI9XCJFeGFtcGxlQ29udHJvbGxlclwiPlxuICogICAgICAgPGZvcm0gbmFtZT1cImZvcm1cIj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cInJlZ2V4XCI+U2V0IGEgcGF0dGVybiAocmVnZXggc3RyaW5nKTogPC9sYWJlbD5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJyZWdleFwiIGlkPVwicmVnZXhcIiAvPlxuICogICAgICAgICA8YnI+XG4gKiAgICAgICAgIDxsYWJlbCBmb3I9XCJpbnB1dFwiPlRoaXMgaW5wdXQgaXMgcmVzdHJpY3RlZCBieSB0aGUgY3VycmVudCBwYXR0ZXJuOiA8L2xhYmVsPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBuZy1tb2RlbD1cIm1vZGVsXCIgaWQ9XCJpbnB1dFwiIG5hbWU9XCJpbnB1dFwiIG5nLXBhdHRlcm49XCJyZWdleFwiIC8+PGJyPlxuICogICAgICAgICA8aHI+XG4gKiAgICAgICAgIGlucHV0IHZhbGlkPyA9IDxjb2RlPnt7Zm9ybS5pbnB1dC4kdmFsaWR9fTwvY29kZT48YnI+XG4gKiAgICAgICAgIG1vZGVsID0gPGNvZGU+e3ttb2RlbH19PC9jb2RlPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvZGl2PlxuICogICA8L2ZpbGU+XG4gKiAgIDxmaWxlIG5hbWU9XCJwcm90cmFjdG9yLmpzXCIgdHlwZT1cInByb3RyYWN0b3JcIj5cbiAgICAgICB2YXIgbW9kZWwgPSBlbGVtZW50KGJ5LmJpbmRpbmcoJ21vZGVsJykpO1xuICAgICAgIHZhciBpbnB1dCA9IGVsZW1lbnQoYnkuaWQoJ2lucHV0JykpO1xuXG4gICAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0aGUgaW5wdXQgd2l0aCB0aGUgZGVmYXVsdCBwYXR0ZXJuJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBpbnB1dC5zZW5kS2V5cygnYWFhJyk7XG4gICAgICAgICBleHBlY3QobW9kZWwuZ2V0VGV4dCgpKS5ub3QudG9Db250YWluKCdhYWEnKTtcblxuICAgICAgICAgaW5wdXQuY2xlYXIoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICBpbnB1dC5zZW5kS2V5cygnMTIzJyk7XG4gICAgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvQ29udGFpbignMTIzJyk7XG4gICAgICAgICB9KTtcbiAgICAgICB9KTtcbiAqICAgPC9maWxlPlxuICogPC9leGFtcGxlPlxuICovXG52YXIgcGF0dGVybkRpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcmVxdWlyZTogJz9uZ01vZGVsJyxcbiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7XG4gICAgICBpZiAoIWN0cmwpIHJldHVybjtcblxuICAgICAgdmFyIHJlZ2V4cCwgcGF0dGVybkV4cCA9IGF0dHIubmdQYXR0ZXJuIHx8IGF0dHIucGF0dGVybjtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ3BhdHRlcm4nLCBmdW5jdGlvbihyZWdleCkge1xuICAgICAgICBpZiAoaXNTdHJpbmcocmVnZXgpICYmIHJlZ2V4Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcmVnZXggKyAnJCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZ2V4ICYmICFyZWdleC50ZXN0KSB7XG4gICAgICAgICAgdGhyb3cgbWluRXJyKCduZ1BhdHRlcm4nKSgnbm9yZWdleHAnLFxuICAgICAgICAgICAgJ0V4cGVjdGVkIHswfSB0byBiZSBhIFJlZ0V4cCBidXQgd2FzIHsxfS4gRWxlbWVudDogezJ9JywgcGF0dGVybkV4cCxcbiAgICAgICAgICAgIHJlZ2V4LCBzdGFydGluZ1RhZyhlbG0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2V4cCA9IHJlZ2V4IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjdHJsLiR2YWxpZGF0b3JzLnBhdHRlcm4gPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgICAgLy8gSFRNTDUgcGF0dGVybiBjb25zdHJhaW50IHZhbGlkYXRlcyB0aGUgaW5wdXQgdmFsdWUsIHNvIHdlIHZhbGlkYXRlIHRoZSB2aWV3VmFsdWVcbiAgICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKSB8fCBpc1VuZGVmaW5lZChyZWdleHApIHx8IHJlZ2V4cC50ZXN0KHZpZXdWYWx1ZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQG5nZG9jIGRpcmVjdGl2ZVxuICogQG5hbWUgbmdNYXhsZW5ndGhcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBuZ01heGxlbmd0aCBhZGRzIHRoZSBtYXhsZW5ndGgge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZhbGlkYXRvcnMgYHZhbGlkYXRvcmB9IHRvIHtAbGluayBuZ01vZGVsIGBuZ01vZGVsYH0uXG4gKiBJdCBpcyBtb3N0IG9mdGVuIHVzZWQgZm9yIHRleHQtYmFzZWQge0BsaW5rIGlucHV0IGBpbnB1dGB9IGNvbnRyb2xzLCBidXQgY2FuIGFsc28gYmUgYXBwbGllZCB0byBjdXN0b20gdGV4dC1iYXNlZCBjb250cm9scy5cbiAqXG4gKiBUaGUgdmFsaWRhdG9yIHNldHMgdGhlIGBtYXhsZW5ndGhgIGVycm9yIGtleSBpZiB0aGUge0BsaW5rIG5nTW9kZWwuTmdNb2RlbENvbnRyb2xsZXIjJHZpZXdWYWx1ZSBgbmdNb2RlbC4kdmlld1ZhbHVlYH1cbiAqIGlzIGxvbmdlciB0aGFuIHRoZSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGVcbiAqIGBuZ01heGxlbmd0aGAgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiAqKk5vdGU6KiogVGhpcyBkaXJlY3RpdmUgaXMgYWxzbyBhZGRlZCB3aGVuIHRoZSBwbGFpbiBgbWF4bGVuZ3RoYCBhdHRyaWJ1dGUgaXMgdXNlZCwgd2l0aCB0d29cbiAqIGRpZmZlcmVuY2VzOlxuICogPG9sPlxuICogICA8bGk+XG4gKiAgICAgYG5nTWF4bGVuZ3RoYCBkb2VzIG5vdCBzZXQgdGhlIGBtYXhsZW5ndGhgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIEhUTUw1IGNvbnN0cmFpbnRcbiAqICAgICB2YWxpZGF0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKiAgIDwvbGk+XG4gKiAgIDxsaT5cbiAqICAgICBUaGUgYG5nTWF4bGVuZ3RoYCBhdHRyaWJ1dGUgbXVzdCBiZSBhbiBleHByZXNzaW9uLCB3aGlsZSB0aGUgYG1heGxlbmd0aGAgdmFsdWUgbXVzdCBiZVxuICogICAgIGludGVycG9sYXRlZC5cbiAqICAgPC9saT5cbiAqIDwvb2w+XG4gKiA8L2Rpdj5cbiAqXG4gKiBAZXhhbXBsZVxuICogPGV4YW1wbGUgbmFtZT1cIm5nTWF4bGVuZ3RoRGlyZWN0aXZlXCIgbW9kdWxlPVwibmdNYXhsZW5ndGhFeGFtcGxlXCI+XG4gKiAgIDxmaWxlIG5hbWU9XCJpbmRleC5odG1sXCI+XG4gKiAgICAgPHNjcmlwdD5cbiAqICAgICAgIGFuZ3VsYXIubW9kdWxlKCduZ01heGxlbmd0aEV4YW1wbGUnLCBbXSlcbiAqICAgICAgICAgLmNvbnRyb2xsZXIoJ0V4YW1wbGVDb250cm9sbGVyJywgWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcbiAqICAgICAgICAgICAkc2NvcGUubWF4bGVuZ3RoID0gNTtcbiAqICAgICAgICAgfV0pO1xuICogICAgIDwvc2NyaXB0PlxuICogICAgIDxkaXYgbmctY29udHJvbGxlcj1cIkV4YW1wbGVDb250cm9sbGVyXCI+XG4gKiAgICAgICA8Zm9ybSBuYW1lPVwiZm9ybVwiPlxuICogICAgICAgICA8bGFiZWwgZm9yPVwibWF4bGVuZ3RoXCI+U2V0IGEgbWF4bGVuZ3RoOiA8L2xhYmVsPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG5nLW1vZGVsPVwibWF4bGVuZ3RoXCIgaWQ9XCJtYXhsZW5ndGhcIiAvPlxuICogICAgICAgICA8YnI+XG4gKiAgICAgICAgIDxsYWJlbCBmb3I9XCJpbnB1dFwiPlRoaXMgaW5wdXQgaXMgcmVzdHJpY3RlZCBieSB0aGUgY3VycmVudCBtYXhsZW5ndGg6IDwvbGFiZWw+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nLW1vZGVsPVwibW9kZWxcIiBpZD1cImlucHV0XCIgbmFtZT1cImlucHV0XCIgbmctbWF4bGVuZ3RoPVwibWF4bGVuZ3RoXCIgLz48YnI+XG4gKiAgICAgICAgIDxocj5cbiAqICAgICAgICAgaW5wdXQgdmFsaWQ/ID0gPGNvZGU+e3tmb3JtLmlucHV0LiR2YWxpZH19PC9jb2RlPjxicj5cbiAqICAgICAgICAgbW9kZWwgPSA8Y29kZT57e21vZGVsfX08L2NvZGU+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZmlsZT5cbiAqICAgPGZpbGUgbmFtZT1cInByb3RyYWN0b3IuanNcIiB0eXBlPVwicHJvdHJhY3RvclwiPlxuICAgICAgIHZhciBtb2RlbCA9IGVsZW1lbnQoYnkuYmluZGluZygnbW9kZWwnKSk7XG4gICAgICAgdmFyIGlucHV0ID0gZWxlbWVudChieS5pZCgnaW5wdXQnKSk7XG5cbiAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHRoZSBpbnB1dCB3aXRoIHRoZSBkZWZhdWx0IG1heGxlbmd0aCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ2FiY2RlZicpO1xuICAgICAgICAgZXhwZWN0KG1vZGVsLmdldFRleHQoKSkubm90LnRvQ29udGFpbignYWJjZGVmJyk7XG5cbiAgICAgICAgIGlucHV0LmNsZWFyKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgaW5wdXQuc2VuZEtleXMoJ2FiY2RlJyk7XG4gICAgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvQ29udGFpbignYWJjZGUnKTtcbiAgICAgICAgIH0pO1xuICAgICAgIH0pO1xuICogICA8L2ZpbGU+XG4gKiA8L2V4YW1wbGU+XG4gKi9cbnZhciBtYXhsZW5ndGhEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHJlcXVpcmU6ICc/bmdNb2RlbCcsXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsbSwgYXR0ciwgY3RybCkge1xuICAgICAgaWYgKCFjdHJsKSByZXR1cm47XG5cbiAgICAgIHZhciBtYXhsZW5ndGggPSAtMTtcbiAgICAgIGF0dHIuJG9ic2VydmUoJ21heGxlbmd0aCcsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciBpbnRWYWwgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgIG1heGxlbmd0aCA9IGlzTnVtYmVyTmFOKGludFZhbCkgPyAtMSA6IGludFZhbDtcbiAgICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICAgIH0pO1xuICAgICAgY3RybC4kdmFsaWRhdG9ycy5tYXhsZW5ndGggPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChtYXhsZW5ndGggPCAwKSB8fCBjdHJsLiRpc0VtcHR5KHZpZXdWYWx1ZSkgfHwgKHZpZXdWYWx1ZS5sZW5ndGggPD0gbWF4bGVuZ3RoKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAbmdkb2MgZGlyZWN0aXZlXG4gKiBAbmFtZSBuZ01pbmxlbmd0aFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIG5nTWlubGVuZ3RoIGFkZHMgdGhlIG1pbmxlbmd0aCB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmFsaWRhdG9ycyBgdmFsaWRhdG9yYH0gdG8ge0BsaW5rIG5nTW9kZWwgYG5nTW9kZWxgfS5cbiAqIEl0IGlzIG1vc3Qgb2Z0ZW4gdXNlZCBmb3IgdGV4dC1iYXNlZCB7QGxpbmsgaW5wdXQgYGlucHV0YH0gY29udHJvbHMsIGJ1dCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGN1c3RvbSB0ZXh0LWJhc2VkIGNvbnRyb2xzLlxuICpcbiAqIFRoZSB2YWxpZGF0b3Igc2V0cyB0aGUgYG1pbmxlbmd0aGAgZXJyb3Iga2V5IGlmIHRoZSB7QGxpbmsgbmdNb2RlbC5OZ01vZGVsQ29udHJvbGxlciMkdmlld1ZhbHVlIGBuZ01vZGVsLiR2aWV3VmFsdWVgfVxuICogaXMgc2hvcnRlciB0aGFuIHRoZSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGV2YWx1YXRpbmcgdGhlIEFuZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGVcbiAqIGBuZ01pbmxlbmd0aGAgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XG4gKiAqKk5vdGU6KiogVGhpcyBkaXJlY3RpdmUgaXMgYWxzbyBhZGRlZCB3aGVuIHRoZSBwbGFpbiBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUgaXMgdXNlZCwgd2l0aCB0d29cbiAqIGRpZmZlcmVuY2VzOlxuICogPG9sPlxuICogICA8bGk+XG4gKiAgICAgYG5nTWlubGVuZ3RoYCBkb2VzIG5vdCBzZXQgdGhlIGBtaW5sZW5ndGhgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIEhUTUw1IGNvbnN0cmFpbnRcbiAqICAgICB2YWxpZGF0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKiAgIDwvbGk+XG4gKiAgIDxsaT5cbiAqICAgICBUaGUgYG5nTWlubGVuZ3RoYCB2YWx1ZSBtdXN0IGJlIGFuIGV4cHJlc3Npb24sIHdoaWxlIHRoZSBgbWlubGVuZ3RoYCB2YWx1ZSBtdXN0IGJlXG4gKiAgICAgaW50ZXJwb2xhdGVkLlxuICogICA8L2xpPlxuICogPC9vbD5cbiAqIDwvZGl2PlxuICpcbiAqIEBleGFtcGxlXG4gKiA8ZXhhbXBsZSBuYW1lPVwibmdNaW5sZW5ndGhEaXJlY3RpdmVcIiBtb2R1bGU9XCJuZ01pbmxlbmd0aEV4YW1wbGVcIj5cbiAqICAgPGZpbGUgbmFtZT1cImluZGV4Lmh0bWxcIj5cbiAqICAgICA8c2NyaXB0PlxuICogICAgICAgYW5ndWxhci5tb2R1bGUoJ25nTWlubGVuZ3RoRXhhbXBsZScsIFtdKVxuICogICAgICAgICAuY29udHJvbGxlcignRXhhbXBsZUNvbnRyb2xsZXInLCBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuICogICAgICAgICAgICRzY29wZS5taW5sZW5ndGggPSAzO1xuICogICAgICAgICB9XSk7XG4gKiAgICAgPC9zY3JpcHQ+XG4gKiAgICAgPGRpdiBuZy1jb250cm9sbGVyPVwiRXhhbXBsZUNvbnRyb2xsZXJcIj5cbiAqICAgICAgIDxmb3JtIG5hbWU9XCJmb3JtXCI+XG4gKiAgICAgICAgIDxsYWJlbCBmb3I9XCJtaW5sZW5ndGhcIj5TZXQgYSBtaW5sZW5ndGg6IDwvbGFiZWw+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbmctbW9kZWw9XCJtaW5sZW5ndGhcIiBpZD1cIm1pbmxlbmd0aFwiIC8+XG4gKiAgICAgICAgIDxicj5cbiAqICAgICAgICAgPGxhYmVsIGZvcj1cImlucHV0XCI+VGhpcyBpbnB1dCBpcyByZXN0cmljdGVkIGJ5IHRoZSBjdXJyZW50IG1pbmxlbmd0aDogPC9sYWJlbD5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmctbW9kZWw9XCJtb2RlbFwiIGlkPVwiaW5wdXRcIiBuYW1lPVwiaW5wdXRcIiBuZy1taW5sZW5ndGg9XCJtaW5sZW5ndGhcIiAvPjxicj5cbiAqICAgICAgICAgPGhyPlxuICogICAgICAgICBpbnB1dCB2YWxpZD8gPSA8Y29kZT57e2Zvcm0uaW5wdXQuJHZhbGlkfX08L2NvZGU+PGJyPlxuICogICAgICAgICBtb2RlbCA9IDxjb2RlPnt7bW9kZWx9fTwvY29kZT5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9maWxlPlxuICogICA8ZmlsZSBuYW1lPVwicHJvdHJhY3Rvci5qc1wiIHR5cGU9XCJwcm90cmFjdG9yXCI+XG4gICAgICAgdmFyIG1vZGVsID0gZWxlbWVudChieS5iaW5kaW5nKCdtb2RlbCcpKTtcbiAgICAgICB2YXIgaW5wdXQgPSBlbGVtZW50KGJ5LmlkKCdpbnB1dCcpKTtcblxuICAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdGhlIGlucHV0IHdpdGggdGhlIGRlZmF1bHQgbWlubGVuZ3RoJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICBpbnB1dC5zZW5kS2V5cygnYWInKTtcbiAgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLm5vdC50b0NvbnRhaW4oJ2FiJyk7XG5cbiAgICAgICAgIGlucHV0LnNlbmRLZXlzKCdhYmMnKTtcbiAgICAgICAgIGV4cGVjdChtb2RlbC5nZXRUZXh0KCkpLnRvQ29udGFpbignYWJjJyk7XG4gICAgICAgfSk7XG4gKiAgIDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqL1xudmFyIG1pbmxlbmd0aERpcmVjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgcmVxdWlyZTogJz9uZ01vZGVsJyxcbiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxtLCBhdHRyLCBjdHJsKSB7XG4gICAgICBpZiAoIWN0cmwpIHJldHVybjtcblxuICAgICAgdmFyIG1pbmxlbmd0aCA9IDA7XG4gICAgICBhdHRyLiRvYnNlcnZlKCdtaW5sZW5ndGgnLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBtaW5sZW5ndGggPSB0b0ludCh2YWx1ZSkgfHwgMDtcbiAgICAgICAgY3RybC4kdmFsaWRhdGUoKTtcbiAgICAgIH0pO1xuICAgICAgY3RybC4kdmFsaWRhdG9ycy5taW5sZW5ndGggPSBmdW5jdGlvbihtb2RlbFZhbHVlLCB2aWV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGN0cmwuJGlzRW1wdHkodmlld1ZhbHVlKSB8fCB2aWV3VmFsdWUubGVuZ3RoID49IG1pbmxlbmd0aDtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuaWYgKHdpbmRvdy5hbmd1bGFyLmJvb3RzdHJhcCkge1xuICAvLyBBbmd1bGFySlMgaXMgYWxyZWFkeSBsb2FkZWQsIHNvIHdlIGNhbiByZXR1cm4gaGVyZS4uLlxuICBpZiAod2luZG93LmNvbnNvbGUpIHtcbiAgICBjb25zb2xlLmxvZygnV0FSTklORzogVHJpZWQgdG8gbG9hZCBhbmd1bGFyIG1vcmUgdGhhbiBvbmNlLicpO1xuICB9XG4gIHJldHVybjtcbn1cblxuLy8gdHJ5IHRvIGJpbmQgdG8ganF1ZXJ5IG5vdyBzbyB0aGF0IG9uZSBjYW4gd3JpdGUganFMaXRlKGZuKVxuLy8gYnV0IHdlIHdpbGwgcmViaW5kIG9uIGJvb3RzdHJhcCBhZ2Fpbi5cbmJpbmRKUXVlcnkoKTtcblxucHVibGlzaEV4dGVybmFsQVBJKGFuZ3VsYXIpO1xuXG5hbmd1bGFyLm1vZHVsZShcIm5nTG9jYWxlXCIsIFtdLCBbXCIkcHJvdmlkZVwiLCBmdW5jdGlvbigkcHJvdmlkZSkge1xudmFyIFBMVVJBTF9DQVRFR09SWSA9IHtaRVJPOiBcInplcm9cIiwgT05FOiBcIm9uZVwiLCBUV086IFwidHdvXCIsIEZFVzogXCJmZXdcIiwgTUFOWTogXCJtYW55XCIsIE9USEVSOiBcIm90aGVyXCJ9O1xuZnVuY3Rpb24gZ2V0RGVjaW1hbHMobikge1xuICBuID0gbiArICcnO1xuICB2YXIgaSA9IG4uaW5kZXhPZignLicpO1xuICByZXR1cm4gKGkgPT0gLTEpID8gMCA6IG4ubGVuZ3RoIC0gaSAtIDE7XG59XG5cbmZ1bmN0aW9uIGdldFZGKG4sIG9wdF9wcmVjaXNpb24pIHtcbiAgdmFyIHYgPSBvcHRfcHJlY2lzaW9uO1xuXG4gIGlmICh1bmRlZmluZWQgPT09IHYpIHtcbiAgICB2ID0gTWF0aC5taW4oZ2V0RGVjaW1hbHMobiksIDMpO1xuICB9XG5cbiAgdmFyIGJhc2UgPSBNYXRoLnBvdygxMCwgdik7XG4gIHZhciBmID0gKChuICogYmFzZSkgfCAwKSAlIGJhc2U7XG4gIHJldHVybiB7djogdiwgZjogZn07XG59XG5cbiRwcm92aWRlLnZhbHVlKFwiJGxvY2FsZVwiLCB7XG4gIFwiREFURVRJTUVfRk9STUFUU1wiOiB7XG4gICAgXCJBTVBNU1wiOiBbXG4gICAgICBcIkFNXCIsXG4gICAgICBcIlBNXCJcbiAgICBdLFxuICAgIFwiREFZXCI6IFtcbiAgICAgIFwiU3VuZGF5XCIsXG4gICAgICBcIk1vbmRheVwiLFxuICAgICAgXCJUdWVzZGF5XCIsXG4gICAgICBcIldlZG5lc2RheVwiLFxuICAgICAgXCJUaHVyc2RheVwiLFxuICAgICAgXCJGcmlkYXlcIixcbiAgICAgIFwiU2F0dXJkYXlcIlxuICAgIF0sXG4gICAgXCJFUkFOQU1FU1wiOiBbXG4gICAgICBcIkJlZm9yZSBDaHJpc3RcIixcbiAgICAgIFwiQW5ubyBEb21pbmlcIlxuICAgIF0sXG4gICAgXCJFUkFTXCI6IFtcbiAgICAgIFwiQkNcIixcbiAgICAgIFwiQURcIlxuICAgIF0sXG4gICAgXCJGSVJTVERBWU9GV0VFS1wiOiA2LFxuICAgIFwiTU9OVEhcIjogW1xuICAgICAgXCJKYW51YXJ5XCIsXG4gICAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgICBcIk1hcmNoXCIsXG4gICAgICBcIkFwcmlsXCIsXG4gICAgICBcIk1heVwiLFxuICAgICAgXCJKdW5lXCIsXG4gICAgICBcIkp1bHlcIixcbiAgICAgIFwiQXVndXN0XCIsXG4gICAgICBcIlNlcHRlbWJlclwiLFxuICAgICAgXCJPY3RvYmVyXCIsXG4gICAgICBcIk5vdmVtYmVyXCIsXG4gICAgICBcIkRlY2VtYmVyXCJcbiAgICBdLFxuICAgIFwiU0hPUlREQVlcIjogW1xuICAgICAgXCJTdW5cIixcbiAgICAgIFwiTW9uXCIsXG4gICAgICBcIlR1ZVwiLFxuICAgICAgXCJXZWRcIixcbiAgICAgIFwiVGh1XCIsXG4gICAgICBcIkZyaVwiLFxuICAgICAgXCJTYXRcIlxuICAgIF0sXG4gICAgXCJTSE9SVE1PTlRIXCI6IFtcbiAgICAgIFwiSmFuXCIsXG4gICAgICBcIkZlYlwiLFxuICAgICAgXCJNYXJcIixcbiAgICAgIFwiQXByXCIsXG4gICAgICBcIk1heVwiLFxuICAgICAgXCJKdW5cIixcbiAgICAgIFwiSnVsXCIsXG4gICAgICBcIkF1Z1wiLFxuICAgICAgXCJTZXBcIixcbiAgICAgIFwiT2N0XCIsXG4gICAgICBcIk5vdlwiLFxuICAgICAgXCJEZWNcIlxuICAgIF0sXG4gICAgXCJTVEFOREFMT05FTU9OVEhcIjogW1xuICAgICAgXCJKYW51YXJ5XCIsXG4gICAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgICBcIk1hcmNoXCIsXG4gICAgICBcIkFwcmlsXCIsXG4gICAgICBcIk1heVwiLFxuICAgICAgXCJKdW5lXCIsXG4gICAgICBcIkp1bHlcIixcbiAgICAgIFwiQXVndXN0XCIsXG4gICAgICBcIlNlcHRlbWJlclwiLFxuICAgICAgXCJPY3RvYmVyXCIsXG4gICAgICBcIk5vdmVtYmVyXCIsXG4gICAgICBcIkRlY2VtYmVyXCJcbiAgICBdLFxuICAgIFwiV0VFS0VORFJBTkdFXCI6IFtcbiAgICAgIDUsXG4gICAgICA2XG4gICAgXSxcbiAgICBcImZ1bGxEYXRlXCI6IFwiRUVFRSwgTU1NTSBkLCB5XCIsXG4gICAgXCJsb25nRGF0ZVwiOiBcIk1NTU0gZCwgeVwiLFxuICAgIFwibWVkaXVtXCI6IFwiTU1NIGQsIHkgaDptbTpzcyBhXCIsXG4gICAgXCJtZWRpdW1EYXRlXCI6IFwiTU1NIGQsIHlcIixcbiAgICBcIm1lZGl1bVRpbWVcIjogXCJoOm1tOnNzIGFcIixcbiAgICBcInNob3J0XCI6IFwiTS9kL3l5IGg6bW0gYVwiLFxuICAgIFwic2hvcnREYXRlXCI6IFwiTS9kL3l5XCIsXG4gICAgXCJzaG9ydFRpbWVcIjogXCJoOm1tIGFcIlxuICB9LFxuICBcIk5VTUJFUl9GT1JNQVRTXCI6IHtcbiAgICBcIkNVUlJFTkNZX1NZTVwiOiBcIiRcIixcbiAgICBcIkRFQ0lNQUxfU0VQXCI6IFwiLlwiLFxuICAgIFwiR1JPVVBfU0VQXCI6IFwiLFwiLFxuICAgIFwiUEFUVEVSTlNcIjogW1xuICAgICAge1xuICAgICAgICBcImdTaXplXCI6IDMsXG4gICAgICAgIFwibGdTaXplXCI6IDMsXG4gICAgICAgIFwibWF4RnJhY1wiOiAzLFxuICAgICAgICBcIm1pbkZyYWNcIjogMCxcbiAgICAgICAgXCJtaW5JbnRcIjogMSxcbiAgICAgICAgXCJuZWdQcmVcIjogXCItXCIsXG4gICAgICAgIFwibmVnU3VmXCI6IFwiXCIsXG4gICAgICAgIFwicG9zUHJlXCI6IFwiXCIsXG4gICAgICAgIFwicG9zU3VmXCI6IFwiXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZ1NpemVcIjogMyxcbiAgICAgICAgXCJsZ1NpemVcIjogMyxcbiAgICAgICAgXCJtYXhGcmFjXCI6IDIsXG4gICAgICAgIFwibWluRnJhY1wiOiAyLFxuICAgICAgICBcIm1pbkludFwiOiAxLFxuICAgICAgICBcIm5lZ1ByZVwiOiBcIi1cXHUwMGE0XCIsXG4gICAgICAgIFwibmVnU3VmXCI6IFwiXCIsXG4gICAgICAgIFwicG9zUHJlXCI6IFwiXFx1MDBhNFwiLFxuICAgICAgICBcInBvc1N1ZlwiOiBcIlwiXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBcImlkXCI6IFwiZW4tdXNcIixcbiAgXCJsb2NhbGVJRFwiOiBcImVuX1VTXCIsXG4gIFwicGx1cmFsQ2F0XCI6IGZ1bmN0aW9uKG4sIG9wdF9wcmVjaXNpb24pIHsgIHZhciBpID0gbiB8IDA7ICB2YXIgdmYgPSBnZXRWRihuLCBvcHRfcHJlY2lzaW9uKTsgIGlmIChpID09IDEgJiYgdmYudiA9PSAwKSB7ICAgIHJldHVybiBQTFVSQUxfQ0FURUdPUlkuT05FOyAgfSAgcmV0dXJuIFBMVVJBTF9DQVRFR09SWS5PVEhFUjt9XG59KTtcbn1dKTtcblxuICBqcUxpdGUoZnVuY3Rpb24oKSB7XG4gICAgYW5ndWxhckluaXQod2luZG93LmRvY3VtZW50LCBib290c3RyYXApO1xuICB9KTtcblxufSkod2luZG93KTtcblxuIXdpbmRvdy5hbmd1bGFyLiQkY3NwKCkubm9JbmxpbmVTdHlsZSAmJiB3aW5kb3cuYW5ndWxhci5lbGVtZW50KGRvY3VtZW50LmhlYWQpLnByZXBlbmQoJzxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj5AY2hhcnNldCBcIlVURi04XCI7W25nXFxcXDpjbG9ha10sW25nLWNsb2FrXSxbZGF0YS1uZy1jbG9ha10sW3gtbmctY2xvYWtdLC5uZy1jbG9haywueC1uZy1jbG9haywubmctaGlkZTpub3QoLm5nLWhpZGUtYW5pbWF0ZSl7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fW5nXFxcXDpmb3Jte2Rpc3BsYXk6YmxvY2s7fS5uZy1hbmltYXRlLXNoaW17dmlzaWJpbGl0eTpoaWRkZW47fS5uZy1hbmNob3J7cG9zaXRpb246YWJzb2x1dGU7fTwvc3R5bGU+Jyk7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/angular/angular.js\n"
);
/***/
},
/***/ "./node_modules/angular/index.js":
/*!***************************************!*\
!*** ./node_modules/angular/index.js ***!
\***************************************/
/*! no static exports found */
/***/ function(module, exports, __webpack_require__) {
eval(
'__webpack_require__(/*! ./angular */ "./node_modules/angular/angular.js");\nmodule.exports = angular;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYW5ndWxhci9pbmRleC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hbmd1bGFyL2luZGV4LmpzPzI4N2MiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9hbmd1bGFyJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGFuZ3VsYXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/angular/index.js\n'
);
/***/
},
/***/ "./node_modules/jquery/dist/jquery.js":
/*!********************************************!*\
!*** ./node_modules/jquery/dist/jquery.js ***!
\********************************************/
/*! no static exports found */
/***/ function(module, exports, __webpack_require__) {
eval(
'var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * jQuery JavaScript Library v2.2.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-05-20T17:23Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === "object" && typeof module.exports === "object" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require("jquery")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( "jQuery requires a window with a document" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can\'t be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through "use strict" call chains. (#13335)\n//"use strict";\nvar arr = [];\n\nvar document = window.document;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = "2.2.4",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor \'enhanced\'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: "",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array\'s method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === "boolean" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== "object" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we\'re merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don\'t bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: "jQuery" + ( version + Math.random() ).replace( /\\D/g, "" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === "function";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|"")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals ("0x...")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\tvar realStringObj = obj && obj.toString();\n\t\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not "[object Object]"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Not own constructor property must be Object\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj, "constructor" ) &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + "";\n\t\t}\n\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === "object" || typeof obj === "function" ?\n\t\t\tclass2type[ toString.call( obj ) ] || "object" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf( "use strict" ) === 1 ) {\n\t\t\t\tscript = document.createElement( "script" );\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\n\t\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t\t// and removal by using an indirect global eval\n\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t"" :\n\t\t\t( text + "" ).replace( rtrim, "" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === "string" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === "string" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\n// JSHint would error on this code due to the Symbol not being defined in ES5.\n// Defining this global in .jshintrc would create a danger of using the global\n// unguarded in another place, it seems safer to just disable JSHint for these\n// three lines.\n/* jshint ignore: start */\nif ( typeof Symbol === "function" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n/* jshint ignore: end */\n\n// Populate the class2type map\njQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),\nfunction( i, name ) {\n\tclass2type[ "[object " + name + "]" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn\'t used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && "length" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === "function" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === "array" || length === 0 ||\n\t\ttypeof length === "number" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.1\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-10-17\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = "sizzle" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it\'s faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = "[\\\\x20\\\\t\\\\r\\\\n\\\\f]",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = "(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = "\\\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +\n\t\t// Operator (capture 2)\n\t\t"*([*^$|!~]?=)" + whitespace +\n\t\t// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"\n\t\t"*(?:\'((?:\\\\\\\\.|[^\\\\\\\\\'])*)\'|\\"((?:\\\\\\\\.|[^\\\\\\\\\\"])*)\\"|(" + identifier + "))|)" + whitespace +\n\t\t"*\\\\]",\n\n\tpseudos = ":(" + identifier + ")(?:\\\\((" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t"(\'((?:\\\\\\\\.|[^\\\\\\\\\'])*)\'|\\"((?:\\\\\\\\.|[^\\\\\\\\\\"])*)\\")|" +\n\t\t// 2. simple (capture 6)\n\t\t"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|" + attributes + ")*)|" +\n\t\t// 3. anything else (capture 2)\n\t\t".*" +\n\t\t")\\\\)|)",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + "+", "g" ),\n\trtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)" + whitespace + "+$", "g" ),\n\n\trcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\n\trcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),\n\n\trattributeQuotes = new RegExp( "=" + whitespace + "*([^\\\\]\'\\"]*?)" + whitespace + "*\\\\]", "g" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( "^" + identifier + "$" ),\n\n\tmatchExpr = {\n\t\t"ID": new RegExp( "^#(" + identifier + ")" ),\n\t\t"CLASS": new RegExp( "^\\\\.(" + identifier + ")" ),\n\t\t"TAG": new RegExp( "^(" + identifier + "|[*])" ),\n\t\t"ATTR": new RegExp( "^" + attributes ),\n\t\t"PSEUDO": new RegExp( "^" + pseudos ),\n\t\t"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(" + whitespace +\n\t\t\t"*(even|odd|(([+-]|)(\\\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\n\t\t\t"*(\\\\d+)|))" + whitespace + "*\\\\)|)", "i" ),\n\t\t"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(" +\n\t\t\twhitespace + "*((?:-\\\\d)?\\\\d*)" + whitespace + "*\\\\)|)(?=[^-]|$)", "i" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /\'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( "\\\\\\\\([\\\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = "0x" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +"0x"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a "Permission Denied"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can\'t trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== "string" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a "get*By*" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don\'t exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + " " ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== "object" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( "id" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, "\\\\$&" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( "id", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\tnidselect = ridentifier.test( nid ) ? "#" + nid : "[id=\'" + nid + "\']";\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nidselect + " " + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( "," );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( "id" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, "$1" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + " " ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + " " ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement("div");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split("|"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === "input" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === "input" || name === "button") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== "undefined" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn\'t yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== "HTML" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)\n\tif ( (parent = document.defaultView) && parent.top !== parent ) {\n\t\t// Support: IE 11\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( "unload", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( "onunload", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = "i";\n\t\treturn !div.getAttribute("className");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName("*") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment("") );\n\t\treturn !div.getElementsByTagName("*").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don\'t pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find["ID"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== "undefined" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\treturn m ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter["ID"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute("id") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find["ID"];\n\n\t\tExpr.filter["ID"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== "undefined" &&\n\t\t\t\t\telem.getAttributeNode("id");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find["TAG"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== "undefined" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don\'t have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === "*" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE\'s treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = " " +\n\t\t\t\t"" +\n\t\t\t\t" ";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but "safe" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll("[msallowcapture^=\'\']").length ) {\n\t\t\t\trbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\'\'|\\"\\")" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and "value" are not treated correctly\n\t\t\tif ( !div.querySelectorAll("[selected]").length ) {\n\t\t\t\trbuggyQSA.push( "\\\\[" + whitespace + "*(?:value|" + booleans + ")" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {\n\t\t\t\trbuggyQSA.push("~=");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(":checked").length ) {\n\t\t\t\trbuggyQSA.push(":checked");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {\n\t\t\t\trbuggyQSA.push(".#.+[+~]");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement("input");\n\t\t\tinput.setAttribute( "type", "hidden" );\n\t\t\tdiv.appendChild( input ).setAttribute( "name", "D" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll("[name=d]").length ) {\n\t\t\t\trbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(":enabled").length ) {\n\t\t\t\trbuggyQSA.push( ":enabled", ":disabled" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll("*,:x");\n\t\t\trbuggyQSA.push(",.*:");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it\'s possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, "div" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, "[s!=\'\']:x" );\n\t\t\trbuggyMatches.push( "!=", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, "=\'$1\']" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + " " ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9\'s matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don\'t get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( "Syntax error, unrecognized expression: " + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = "",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === "string" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t">": { dir: "parentNode", first: true },\n\t\t" ": { dir: "parentNode" },\n\t\t"+": { dir: "previousSibling", first: true },\n\t\t"~": { dir: "previousSibling" }\n\t},\n\n\tpreFilter: {\n\t\t"ATTR": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === "~=" ) {\n\t\t\t\tmatch[3] = " " + match[3] + " ";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t"CHILD": function( match ) {\n\t\t\t/* matches from matchExpr["CHILD"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === "nth" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t"PSEUDO": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr["CHILD"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || "";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t"TAG": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === "*" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t"CLASS": function( className ) {\n\t\t\tvar pattern = classCache[ className + " " ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );\n\t\t\t\t});\n\t\t},\n\n\t\t"ATTR": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === "!=";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += "";\n\n\t\t\t\treturn operator === "=" ? result === check :\n\t\t\t\t\toperator === "!=" ? result !== check :\n\t\t\t\t\toperator === "^=" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === "*=" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === "$=" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t"CHILD": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== "nth",\n\t\t\t\tforward = type.slice( -4 ) !== "last",\n\t\t\t\tofType = what === "of-type";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? "nextSibling" : "previousSibling",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven\'t yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === "only" && !start && "nextSibling";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t"PSEUDO": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( "unsupported pseudo: " + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, "", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t"not": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, "$1" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don\'t keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t"has": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t"contains": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// "Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element\'s language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by "-".\n\t\t// The matching of C against the element\'s language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name."\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t"lang": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || "") ) {\n\t\t\t\tSizzle.error( "unsupported lang: " + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t"target": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t"root": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t"focus": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t"enabled": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t"disabled": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t"checked": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\n\t\t},\n\n\t\t"selected": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t"empty": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t"parent": function( elem ) {\n\t\t\treturn !Expr.pseudos["empty"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t"header": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t"input": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t"button": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === "input" && elem.type === "button" || name === "button";\n\t\t},\n\n\t\t"text": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === "input" &&\n\t\t\t\telem.type === "text" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"\n\t\t\t\t( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t"first": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t"last": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t"even": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t"odd": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos["nth"] = Expr.pseudos["eq"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + " " ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don\'t consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, " " )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we\'re just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = "";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === "parentNode",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can\'t set arbitrary data on XML nodes, so they don\'t benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( (oldCache = uniqueCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we\'re done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn 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}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[" "],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })\n\t\t\t\t\t).replace( rtrim, "$1" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = "0",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find["TAG"]( "*", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn\'t visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a "00" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + " " ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle\'s compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === "function" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split("").sort( sortOrder ).join("") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren\'t passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement("div") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property "interpolation"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = " ";\n\treturn div.firstChild.getAttribute("href") === "#" ;\n}) ) {\n\taddHandle( "type|href|height|width", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute("value")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = " ";\n\tdiv.firstChild.setAttribute( "value", "" );\n\treturn div.firstChild.getAttribute( "value" ) === "";\n}) ) {\n\taddHandle( "value", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === "input" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute("disabled") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[ ":" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( typeof qualifier === "string" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = ":not(" + expr + ")";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== "string" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + " " + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $("p:first").is("p:last") won\'t return true for a doc with two "p".\n\t\t\ttypeof selector === "string" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(""), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === "string" ) {\n\t\t\tif ( selector[ 0 ] === "<" &&\n\t\t\t\tselector[ selector.length - 1 ] === ">" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && ( pos ?\n\t\t\t\t\tpos.index( cur ) > -1 :\n\n\t\t\t\t\t// Don\'t pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === "string" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, "parentNode" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, "parentNode", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, "nextSibling" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, "previousSibling" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, "nextSibling" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, "previousSibling" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, "nextSibling", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, "previousSibling", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== "Until" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === "string" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnotwhite = ( /\\S+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * "fired" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest "memorized"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === "string" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn\'t re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we\'re done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we\'re done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = "";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = "";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tlist = memory = "";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],\n\t\t\t\t[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],\n\t\t\t\t[ "notify", "progress", jQuery.Callbacks( "memory" ) ]\n\t\t\t],\n\t\t\tstate = "pending",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + "With" ](\n\t\t\t\t\t\t\t\t\t\tthis === promise ? newDefer.promise() : this,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\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\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add( function() {\n\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[ 0 ] + "With" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 ||\n\t\t\t\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred.\n\t\t\t// If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) )\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we\'re not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n} );\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we\'re already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( "ready" );\n\t\t\tjQuery( document ).off( "ready" );\n\t\t}\n\t}\n} );\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( "DOMContentLoaded", completed );\n\twindow.removeEventListener( "load", completed );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called\n\t\t// after the browser event has already occurred.\n\t\t// Support: IE9-10 only\n\t\t// Older IE sometimes signals "interactive" too soon\n\t\tif ( document.readyState === "complete" ||\n\t\t\t( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {\n\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\twindow.setTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( "DOMContentLoaded", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( "load", completed );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it\'s a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === "object" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tregister: function( owner, initial ) {\n\t\tvar value = initial || {};\n\n\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t// use plain assignment\n\t\tif ( owner.nodeType ) {\n\t\t\towner[ this.expando ] = value;\n\n\t\t// Otherwise secure it in a non-enumerable, non-writable property\n\t\t// configurability must be true to allow the property to be\n\t\t// deleted with the delete operator\n\t\t} else {\n\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\tvalue: value,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true\n\t\t\t} );\n\t\t}\n\t\treturn owner[ this.expando ];\n\t},\n\tcache: function( owner ) {\n\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return an empty object.\n\t\tif ( !acceptData( owner ) ) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === "string" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\t\t\towner[ this.expando ] && owner[ this.expando ][ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the "read" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === "string" ) && value === undefined ) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase( key ) );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the "set" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.register( owner );\n\n\t\t} else {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\n\t\t\t\t// If "name" is an array of keys...\n\t\t\t\t// When data is initially created, via ("key", "val") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there\'s no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <= 35-45+\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://code.google.com/p/chromium/issues/detail?id=378607\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module\'s maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support "private" and "user" data.\n//\t4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === "string" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === "true" ? true :\n\t\t\t\t\tdata === "false" ? false :\n\t\t\t\t\tdata === "null" ? null :\n\n\t\t\t\t\t// Only convert to a number if it doesn\'t change the string\n\t\t\t\t\t+data + "" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn\'t changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( "data-" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\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\tdataPriv.set( elem, "hasDataAttrs", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === "object" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data, camelKey;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = dataUser.get( elem, key ) ||\n\n\t\t\t\t\t// Try to find dashed key if it exists (gh-2779)\n\t\t\t\t\t// This is for 2.2.x only\n\t\t\t\t\tdataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );\n\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = dataUser.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to "discover" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn\'t exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tcamelKey = jQuery.camelCase( key );\n\t\t\tthis.each( function() {\n\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might\'ve been store with a camelCased key.\n\t\t\t\tvar data = dataUser.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdataUser.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf( "-" ) > -1 && data !== undefined ) {\n\t\t\t\t\tdataUser.set( this, key, value );\n\t\t\t\t}\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || "fx" ) + "queue";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || "fx";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === "inprogress" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === "fx" ) {\n\t\t\t\tqueue.unshift( "inprogress" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + "queueHooks";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( "once memory" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + "queue", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== "string" ) {\n\t\t\tdata = type;\n\t\t\ttype = "fx";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === "fx" && queue[ 0 ] !== "inprogress" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || "fx", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== "string" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || "fx";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + "queueHooks" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );\n\n\nvar cssExpand = [ "Top", "Right", "Bottom", "Left" ];\n\nvar isHidden = function( elem, el ) {\n\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, "display" ) === "none" ||\n\t\t\t!jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() { return tween.cur(); } :\n\t\t\tfunction() { return jQuery.css( elem, prop, "" ); },\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don\'t accidentally see scale as unchanged below\n\t\t\tscale = scale || ".5";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we\'ve just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([\\w:-]+)/ );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE9\n\toption: [ 1, "", " " ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, "" ],\n\tcol: [ 2, "" ],\n\ttr: [ 2, "" ],\n\ttd: [ 3, "" ],\n\n\t_default: [ 0, "", "" ]\n};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE9-11+\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret = typeof context.getElementsByTagName !== "undefined" ?\n\t\t\tcontext.getElementsByTagName( tag || "*" ) :\n\t\t\ttypeof context.querySelectorAll !== "undefined" ?\n\t\t\t\tcontext.querySelectorAll( tag || "*" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t"globalEval",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], "globalEval" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === "object" ) {\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( "div" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = "";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = "";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), "script" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || "" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( "div" ) ),\n\t\tinput = document.createElement( "input" );\n\n\t// Support: Android 4.0-4.3, Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( "type", "radio" );\n\tinput.setAttribute( "checked", "checked" );\n\tinput.setAttribute( "name", "t" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn\'t clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = "";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE9\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === "object" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== "string" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === "string" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards\' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don\'t attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element\'s event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || "" ).match( rnotwhite ) || [ "" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( "." )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we\'re the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element\'s handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || "" ).match( rnotwhite ) || [ "" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( "(^|\\\\.)" + namespaces.join( "\\\\.(?:.*\\\\.|)" ) + "(\\\\.|$)" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === "**" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it\'s no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, "handle events" );\n\t\t}\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Support (at least): Chrome, IE9\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG instance trees (#13180)\n\t\t//\n\t\t// Support: Firefox<=42+\n\t\t// Avoid non-left-click in FF but don\'t block IE radio events (#3861, gh-2343)\n\t\tif ( delegateCount && cur.nodeType &&\n\t\t\t( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don\'t check non-elements (#13208)\n\t\t\t\t// Don\'t process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don\'t conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + " ";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matches } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +\n\t\t"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: "char charCode key keyCode".split( " " ),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +\n\t\t\t"screenX screenY toElement" ).split( " " ),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX +\n\t\t\t\t\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\n\t\t\t\t\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY +\n\t\t\t\t\t( doc && doc.scrollTop || body && body.scrollTop || 0 ) -\n\t\t\t\t\t( doc && doc.clientTop || body && body.clientTop || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don\'t use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn\'t\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: "focusin"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: "focusout"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don\'t fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, "a" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn\'t alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This "if" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the \'new\' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn\'t have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://code.google.com/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: "mouseover",\n\tmouseleave: "mouseout",\n\tpointerenter: "pointerover",\n\tpointerleave: "pointerout"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + "." + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === "object" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === "function" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\n\n\t// Support: IE 10-11, Edge 10240+\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\' after \'\'\n// 4. To add Language to changeLanguage button, see "{{ \'Language\' | translate }}" in index.html.\n// flag-icon usage:\n// https://github.com/lipis/flag-icon-css\n// 5. Browser determining preferred language automatically.\n// http://angular-translate.github.io/docs/en/#/guide/07_multi-language\n\nif (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.es_ES = {\n // replace en_US to ll_CC, examples: zh_CN, de_AT.\n // header\n Search: "Buscar",\n // Nav menu\n Add: "Añadir",\n "By URIs": "URIs",\n "By Torrents": "Torrents",\n "By Metalinks": "Metalinks",\n Manage: "Administrar",\n "Pause All": "Pausar Todos",\n "Resume Paused": "Reanudar Pausados",\n "Purge Completed": "Purgar Completados",\n "Shutdown Server": "Desactivar servidor",\n Settings: "Ajustes",\n "Connection Settings": "Ajustes de Conexión",\n "Global Settings": "Ajustes Globales",\n "Server info": "Info de Servidor",\n "About and contribute": "Acerca y Colaborar",\n "Toggle navigation": "Conmutar Navegación",\n // body\n // nav side bar\n Miscellaneous: "Otros",\n "Global Statistics": "Estadísticas Globales",\n About: "Acerca de",\n Displaying: "Mostrando",\n of: "de",\n downloads: "descargas",\n Language: "Idioma",\n // download filters\n "Download Filters": "Filtros de Descargas",\n Running: "Procesando",\n Active: "Activo",\n Waiting: "Esperando",\n Complete: "Completo",\n Error: "Error",\n Paused: "En Pausa",\n Removed: "Eliminado",\n "Hide linked meta-data": "Ocultar metadatos adjuntos",\n Toggle: "Conmutar",\n "Reset filters": "Restablecer Filtros",\n // download status\n Verifing: "Verificando",\n "Verify Pending": "Pendiente de verificación",\n // starred properties\n "Quick Access Settings": "Ajustes Rápidos",\n Save: "Guardar",\n "Save settings": "Guardar Ajustes",\n "Currently no download in line to display, use the":\n "En este momento no hay descargas para mostrar. ¡Use la opción",\n "download button to start downloading files!": "para empezar a descargar sus archivos!",\n Peers: "Pares",\n "More Info": "Mas Info",\n Remove: "Eliminar",\n "# of": "# de",\n Length: "Longitud",\n // modals\n "Add Downloads By URIs": "Añadir descargas por URIs",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "Añada varias descargas colocando la URI de cada descarga en una línea separada.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "Puede añadir URIs de espejo para *el mismo* archivo. Separe cada URI con un espacio.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "Una URI puede ser HTTP(S), FTP, BitTorrent o Magnet.",\n "Download settings": "Ajustes de Descargas",\n "Advanced settings": "Ajustes Avanzados",\n Cancel: "Cancelar",\n Start: "Iniciar",\n Choose: "Escoja",\n "Quick Access (shown on the main page)": "Acceso Rápido (Se muestra en la pág principal)",\n // add torrent modal\n "Add Downloads By Torrents": "Añadir descargas Torrent",\n "- Select the torrent from the local filesystem to start the download.":\n "Seleccione el archivo Torrent de su equipo para iniciar la descarga",\n "- You can select multiple torrents to start multiple downloads.":\n "Puede seleccionar varios torrents",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "Para los enlaces Magnet, salga de este cuadro y use la opción Añadir URI",\n "Select Torrents": "Escoja los Torrents",\n "Select a Torrent": "Escoja el Torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Añadir descargas Metalink",\n "Select Metalinks": "Seleccione el Metalink",\n "- Select the Metalink from the local filesystem to start the download.":\n "Escoja el archivo Metalink de su equipo para iniciar la descarga",\n "- You can select multiple Metalinks to start multiple downloads.":\n "Puede escoger varios archivos Metalink",\n "Select a Metalink": "Escoja el archivo Metalink",\n // select file modal\n "Choose files to start download for": "Escoja los archivos que desea descargar",\n "Select to download": "Escoja que descargar",\n // settings modal\n "Aria2 RPC host and port": "Servidor Aria2 y puerto",\n "Enter the host": "Escriba la dirección",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Escriba la dirección o nombre DNS del servidor Aria2 (por defecto: localhost)",\n "Enter the port": "Escriba el puerto",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Escriba el número del puerto del servidor Aria2 (por defecto: 6800)",\n "Enter the RPC path": "Escriba la ruta RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Escriba la ruta de acceso RPC de Aria2 (por defecto: /jsonrpc)",\n "SSL/TLS encryption": "Cifrado SSL/TLS",\n "Enable SSL/TLS encryption": "Habilitar Cifrado SSL/TLS",\n "Enter the secret token (optional)": "Escriba la frase Token (opcional)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Escriba la frase Token secreta (vacío si la autenticación está deshabilitada)",\n "Enter the username (optional)": "Usuario (opcional)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Escriba el nombre de usuario (vacío si la autenticación está deshabilitada)",\n "Enter the password (optional)": "Escriba la contraseña",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Escriba la contraseña RPC (vacío si la autenticación está deshabilitada)",\n "Enter base URL (optional)": "Escriba la URL base (opcional)",\n "Direct Download": "Descarga Directa",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Esto permite crear enlaces de descarga de los archivos desde el servidor Aria2",\n "(Requires appropriate webserver to be configured.)":\n "(Requiere configuración apropiada del servidor web)",\n "Save Connection configuration": "Guardar Configuración",\n Filter: "Filrar",\n // server info modal\n "Aria2 server info": "Información de servidor Aria2",\n "Aria2 Version": "Aria2 versión",\n "Features Enabled": "Funcionalidad disponible",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Para obtener la última versión del proyecto, reportar problemas o colaborar, vaya a",\n "Or you can open the latest version in the browser through":\n "Puede abrir la última versión en su navegador, directamente",\n Close: "Cerrar",\n // labels\n "Download status": "Estado de descarga",\n "Download Speed": "Velocidad de descarga",\n "Upload Speed": "Vel. Subida",\n "Estimated time": "Tiempo estimado",\n "Download Size": "Tamaño de descarga",\n Downloaded: "Descargado",\n Progress: "Progreso",\n "Download Path": "Carpeta de descarga",\n Uploaded: "Subido",\n "Download GID": "GID de Descarga",\n "Number of Pieces": "N° de Piezas",\n "Piece Length": "Tamaño de pieza",\n //alerts\n "The last connection attempt was unsuccessful. Trying another configuration":\n "El último intento de conexión falló. Probando otra configuración",\n "Oh Snap!": "Rayos…",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "No se pudo establecer una conexión al servidor Aria2. Reintentando en 10 segundos. Pruebe revisando la configuración en Ajustes > Ajustes de Conexión",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "Autenticación fallida con el servior Aria2 RPC. Reintentando en 10 segundos. Puede que sea necesario revisar su info de autenticación en Ajustes > Ajustes de Conexión",\n "Successfully connected to Aria2 through its remote RPC …":\n "Conexión exitosa con el servidor Aria2 mediante la interfaz RPC",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Conexión exitosa con el servidor Aria2 mediante la interfaz RPC, sin embargo la conexión no es segura. Para mejorar la seguridad, añada un token de autorización al iniciar Aria2 (con la opción --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Intentando conectar con el servidor Aria2 usando los nuevos Ajustes de Conexión"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL2VzX0VTLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9lc19FUy5qcz8xNzNiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgdGV4dCBpcyBhIHRlbXBsYXRlIG9mIHRyYW5zbGF0aW9uIGxpc3QuXG5cbi8vIHByZTogbGxfQ0MsIGxvY2FsZSBuYW1lLCBleGFtcGxlczogZW5fVVMsIHpoX0NOXG4vLyAxLiBDb3B5IGFuZCByZW5hbWUgdG8gbGxfQ0MuanMsIHRyYW5zbGF0ZSB0aGVzZSB3b3Jkcy5cbi8vIDIuIGluIGpzL2luaXQuanM6XG4vLyAgICBBZGQgJy50cmFuc2xhdGlvbnMoJ2xsX0NDJywgdHJhbnNsYXRpb25zLmxsX0NDKScgYmVmb3JlICcuZGV0ZXJtaW5lUHJlZmVycmVkTGFuZ3VhZ2UoKTsnXG4vLyAzLiBpbiBpbmRleC5odG1sXG4vLyAgICBBZGQgJzxzY3JpcHQgc3JjPVwianMvdHJhbnNsYXRlL2xsX0NDLmpzXCI+PC9zY3JpcHQ+JyBhZnRlciAnPHNjcmlwdCBzcmM9XCJqcy9saWJzL2FuZ3VsYXItdHJhbnNsYXRlLmpzXCI+PC9zY3JpcHQ+J1xuLy8gNC4gVG8gYWRkIExhbmd1YWdlIHRvIGNoYW5nZUxhbmd1YWdlIGJ1dHRvbiwgc2VlIFwie3sgJ0xhbmd1YWdlJyB8IHRyYW5zbGF0ZSB9fVwiIGluIGluZGV4Lmh0bWwuXG4vLyAgICBmbGFnLWljb24gdXNhZ2U6XG4vLyAgICBodHRwczovL2dpdGh1Yi5jb20vbGlwaXMvZmxhZy1pY29uLWNzc1xuLy8gNS4gQnJvd3NlciBkZXRlcm1pbmluZyBwcmVmZXJyZWQgbGFuZ3VhZ2UgYXV0b21hdGljYWxseS5cbi8vICAgIGh0dHA6Ly9hbmd1bGFyLXRyYW5zbGF0ZS5naXRodWIuaW8vZG9jcy9lbi8jL2d1aWRlLzA3X211bHRpLWxhbmd1YWdlXG5cbmlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5lc19FUyA9IHtcbiAgLy8gcmVwbGFjZSBlbl9VUyB0byBsbF9DQywgZXhhbXBsZXM6IHpoX0NOLCBkZV9BVC5cbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJCdXNjYXJcIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIkHDsWFkaXJcIixcbiAgXCJCeSBVUklzXCI6IFwiVVJJc1wiLFxuICBcIkJ5IFRvcnJlbnRzXCI6IFwiVG9ycmVudHNcIixcbiAgXCJCeSBNZXRhbGlua3NcIjogXCJNZXRhbGlua3NcIixcbiAgTWFuYWdlOiBcIkFkbWluaXN0cmFyXCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwiUGF1c2FyIFRvZG9zXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIlJlYW51ZGFyIFBhdXNhZG9zXCIsXG4gIFwiUHVyZ2UgQ29tcGxldGVkXCI6IFwiUHVyZ2FyIENvbXBsZXRhZG9zXCIsXG4gIFwiU2h1dGRvd24gU2VydmVyXCI6IFwiRGVzYWN0aXZhciBzZXJ2aWRvclwiLFxuICBTZXR0aW5nczogXCJBanVzdGVzXCIsXG4gIFwiQ29ubmVjdGlvbiBTZXR0aW5nc1wiOiBcIkFqdXN0ZXMgZGUgQ29uZXhpw7NuXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwiQWp1c3RlcyBHbG9iYWxlc1wiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiSW5mbyBkZSBTZXJ2aWRvclwiLFxuICBcIkFib3V0IGFuZCBjb250cmlidXRlXCI6IFwiQWNlcmNhIHkgQ29sYWJvcmFyXCIsXG4gIFwiVG9nZ2xlIG5hdmlnYXRpb25cIjogXCJDb25tdXRhciBOYXZlZ2FjacOzblwiLFxuICAvLyBib2R5XG4gIC8vIG5hdiBzaWRlIGJhclxuICBNaXNjZWxsYW5lb3VzOiBcIk90cm9zXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCJFc3RhZMOtc3RpY2FzIEdsb2JhbGVzXCIsXG4gIEFib3V0OiBcIkFjZXJjYSBkZVwiLFxuICBEaXNwbGF5aW5nOiBcIk1vc3RyYW5kb1wiLFxuICBvZjogXCJkZVwiLFxuICBkb3dubG9hZHM6IFwiZGVzY2FyZ2FzXCIsXG4gIExhbmd1YWdlOiBcIklkaW9tYVwiLFxuICAvLyBkb3dubG9hZCBmaWx0ZXJzXG4gIFwiRG93bmxvYWQgRmlsdGVyc1wiOiBcIkZpbHRyb3MgZGUgRGVzY2FyZ2FzXCIsXG4gIFJ1bm5pbmc6IFwiUHJvY2VzYW5kb1wiLFxuICBBY3RpdmU6IFwiQWN0aXZvXCIsXG4gIFdhaXRpbmc6IFwiRXNwZXJhbmRvXCIsXG4gIENvbXBsZXRlOiBcIkNvbXBsZXRvXCIsXG4gIEVycm9yOiBcIkVycm9yXCIsXG4gIFBhdXNlZDogXCJFbiBQYXVzYVwiLFxuICBSZW1vdmVkOiBcIkVsaW1pbmFkb1wiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcIk9jdWx0YXIgbWV0YWRhdG9zIGFkanVudG9zXCIsXG4gIFRvZ2dsZTogXCJDb25tdXRhclwiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCJSZXN0YWJsZWNlciBGaWx0cm9zXCIsXG4gIC8vIGRvd25sb2FkIHN0YXR1c1xuICBWZXJpZmluZzogXCJWZXJpZmljYW5kb1wiLFxuICBcIlZlcmlmeSBQZW5kaW5nXCI6IFwiUGVuZGllbnRlIGRlIHZlcmlmaWNhY2nDs25cIixcbiAgLy8gc3RhcnJlZCBwcm9wZXJ0aWVzXG4gIFwiUXVpY2sgQWNjZXNzIFNldHRpbmdzXCI6IFwiQWp1c3RlcyBSw6FwaWRvc1wiLFxuICBTYXZlOiBcIkd1YXJkYXJcIixcbiAgXCJTYXZlIHNldHRpbmdzXCI6IFwiR3VhcmRhciBBanVzdGVzXCIsXG4gIFwiQ3VycmVudGx5IG5vIGRvd25sb2FkIGluIGxpbmUgdG8gZGlzcGxheSwgdXNlIHRoZVwiOlxuICAgIFwiRW4gZXN0ZSBtb21lbnRvIG5vIGhheSBkZXNjYXJnYXMgcGFyYSBtb3N0cmFyLiDCoVVzZSBsYSBvcGNpw7NuXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcInBhcmEgZW1wZXphciBhIGRlc2NhcmdhciBzdXMgYXJjaGl2b3MhXCIsXG4gIFBlZXJzOiBcIlBhcmVzXCIsXG4gIFwiTW9yZSBJbmZvXCI6IFwiTWFzIEluZm9cIixcbiAgUmVtb3ZlOiBcIkVsaW1pbmFyXCIsXG4gIFwiIyBvZlwiOiBcIiMgZGVcIixcbiAgTGVuZ3RoOiBcIkxvbmdpdHVkXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIkHDsWFkaXIgZGVzY2FyZ2FzIHBvciBVUklzXCIsXG4gIFwiLSBZb3UgY2FuIGFkZCBtdWx0aXBsZSBkb3dubG9hZHMgKGZpbGVzKSBhdCB0aGUgc2FtZSB0aW1lIGJ5IHB1dHRpbmcgVVJJcyBmb3IgZWFjaCBmaWxlIG9uIGEgc2VwYXJhdGUgbGluZS5cIjpcbiAgICBcIkHDsWFkYSB2YXJpYXMgZGVzY2FyZ2FzIGNvbG9jYW5kbyBsYSBVUkkgZGUgY2FkYSBkZXNjYXJnYSBlbiB1bmEgbMOtbmVhIHNlcGFyYWRhLlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiUHVlZGUgYcOxYWRpciBVUklzIGRlIGVzcGVqbyBwYXJhICplbCBtaXNtbyogYXJjaGl2by4gU2VwYXJlIGNhZGEgVVJJIGNvbiB1biBlc3BhY2lvLlwiLFxuICBcIi0gQSBVUkkgY2FuIGJlIEhUVFAoUykvRlRQL0JpdFRvcnJlbnQtTWFnbmV0LlwiOlxuICAgIFwiVW5hIFVSSSBwdWVkZSBzZXIgSFRUUChTKSwgRlRQLCBCaXRUb3JyZW50IG8gTWFnbmV0LlwiLFxuICBcIkRvd25sb2FkIHNldHRpbmdzXCI6IFwiQWp1c3RlcyBkZSBEZXNjYXJnYXNcIixcbiAgXCJBZHZhbmNlZCBzZXR0aW5nc1wiOiBcIkFqdXN0ZXMgQXZhbnphZG9zXCIsXG4gIENhbmNlbDogXCJDYW5jZWxhclwiLFxuICBTdGFydDogXCJJbmljaWFyXCIsXG4gIENob29zZTogXCJFc2NvamFcIixcbiAgXCJRdWljayBBY2Nlc3MgKHNob3duIG9uIHRoZSBtYWluIHBhZ2UpXCI6IFwiQWNjZXNvIFLDoXBpZG8gKFNlIG11ZXN0cmEgZW4gbGEgcMOhZyBwcmluY2lwYWwpXCIsXG4gIC8vIGFkZCB0b3JyZW50IG1vZGFsXG4gIFwiQWRkIERvd25sb2FkcyBCeSBUb3JyZW50c1wiOiBcIkHDsWFkaXIgZGVzY2FyZ2FzIFRvcnJlbnRcIixcbiAgXCItIFNlbGVjdCB0aGUgdG9ycmVudCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIlNlbGVjY2lvbmUgZWwgYXJjaGl2byBUb3JyZW50IGRlIHN1IGVxdWlwbyBwYXJhIGluaWNpYXIgbGEgZGVzY2FyZ2FcIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIlB1ZWRlIHNlbGVjY2lvbmFyIHZhcmlvcyB0b3JyZW50c1wiLFxuICBcIi0gVG8gYWRkIGEgQml0VG9ycmVudC1NYWduZXQgVVJMLCB1c2UgdGhlIEFkZCBCeSBVUkkgb3B0aW9uIGFuZCBhZGQgaXQgdGhlcmUuXCI6XG4gICAgXCJQYXJhIGxvcyBlbmxhY2VzIE1hZ25ldCwgc2FsZ2EgZGUgZXN0ZSBjdWFkcm8geSB1c2UgbGEgb3BjacOzbiBBw7FhZGlyICBVUklcIixcbiAgXCJTZWxlY3QgVG9ycmVudHNcIjogXCJFc2NvamEgbG9zIFRvcnJlbnRzXCIsXG4gIFwiU2VsZWN0IGEgVG9ycmVudFwiOiBcIkVzY29qYSBlbCBUb3JyZW50XCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwiQcOxYWRpciBkZXNjYXJnYXMgTWV0YWxpbmtcIixcbiAgXCJTZWxlY3QgTWV0YWxpbmtzXCI6IFwiU2VsZWNjaW9uZSBlbCBNZXRhbGlua1wiLFxuICBcIi0gU2VsZWN0IHRoZSBNZXRhbGluayBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIkVzY29qYSBlbCBhcmNoaXZvIE1ldGFsaW5rIGRlIHN1IGVxdWlwbyBwYXJhIGluaWNpYXIgbGEgZGVzY2FyZ2FcIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCJQdWVkZSBlc2NvZ2VyIHZhcmlvcyBhcmNoaXZvcyBNZXRhbGlua1wiLFxuICBcIlNlbGVjdCBhIE1ldGFsaW5rXCI6IFwiRXNjb2phIGVsIGFyY2hpdm8gTWV0YWxpbmtcIixcbiAgLy8gc2VsZWN0IGZpbGUgbW9kYWxcbiAgXCJDaG9vc2UgZmlsZXMgdG8gc3RhcnQgZG93bmxvYWQgZm9yXCI6IFwiRXNjb2phIGxvcyBhcmNoaXZvcyBxdWUgZGVzZWEgZGVzY2FyZ2FyXCIsXG4gIFwiU2VsZWN0IHRvIGRvd25sb2FkXCI6IFwiRXNjb2phIHF1ZSBkZXNjYXJnYXJcIixcbiAgLy8gc2V0dGluZ3MgbW9kYWxcbiAgXCJBcmlhMiBSUEMgaG9zdCBhbmQgcG9ydFwiOiBcIlNlcnZpZG9yIEFyaWEyIHkgcHVlcnRvXCIsXG4gIFwiRW50ZXIgdGhlIGhvc3RcIjogXCJFc2NyaWJhIGxhIGRpcmVjY2nDs25cIixcbiAgXCJFbnRlciB0aGUgSVAgb3IgRE5TIG5hbWUgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiBsb2NhbGhvc3QpXCI6XG4gICAgXCJFc2NyaWJhIGxhIGRpcmVjY2nDs24gbyBub21icmUgRE5TIGRlbCBzZXJ2aWRvciBBcmlhMiAocG9yIGRlZmVjdG86IGxvY2FsaG9zdClcIixcbiAgXCJFbnRlciB0aGUgcG9ydFwiOiBcIkVzY3JpYmEgZWwgcHVlcnRvXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnQgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiA2ODAwKVwiOlxuICAgIFwiRXNjcmliYSBlbCBuw7ptZXJvIGRlbCBwdWVydG8gZGVsIHNlcnZpZG9yIEFyaWEyIChwb3IgZGVmZWN0bzogNjgwMClcIixcbiAgXCJFbnRlciB0aGUgUlBDIHBhdGhcIjogXCJFc2NyaWJhIGxhIHJ1dGEgUlBDXCIsXG4gIFwiRW50ZXIgdGhlIHBhdGggZm9yIHRoZSBBcmlhMiBSUEMgZW5kcG9pbnQgKGRlZmF1bHQ6IC9qc29ucnBjKVwiOlxuICAgIFwiRXNjcmliYSBsYSBydXRhIGRlIGFjY2VzbyBSUEMgZGUgQXJpYTIgKHBvciBkZWZlY3RvOiAvanNvbnJwYylcIixcbiAgXCJTU0wvVExTIGVuY3J5cHRpb25cIjogXCJDaWZyYWRvIFNTTC9UTFNcIixcbiAgXCJFbmFibGUgU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiSGFiaWxpdGFyIENpZnJhZG8gU1NML1RMU1wiLFxuICBcIkVudGVyIHRoZSBzZWNyZXQgdG9rZW4gKG9wdGlvbmFsKVwiOiBcIkVzY3JpYmEgbGEgZnJhc2UgVG9rZW4gKG9wY2lvbmFsKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcIkVzY3JpYmEgbGEgZnJhc2UgVG9rZW4gc2VjcmV0YSAodmFjw61vIHNpIGxhIGF1dGVudGljYWNpw7NuIGVzdMOhIGRlc2hhYmlsaXRhZGEpXCIsXG4gIFwiRW50ZXIgdGhlIHVzZXJuYW1lIChvcHRpb25hbClcIjogXCJVc3VhcmlvIChvcGNpb25hbClcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHVzZXJuYW1lIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIkVzY3JpYmEgZWwgbm9tYnJlIGRlIHVzdWFyaW8gKHZhY8OtbyBzaSBsYSBhdXRlbnRpY2FjacOzbiBlc3TDoSBkZXNoYWJpbGl0YWRhKVwiLFxuICBcIkVudGVyIHRoZSBwYXNzd29yZCAob3B0aW9uYWwpXCI6IFwiRXNjcmliYSBsYSBjb250cmFzZcOxYVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgcGFzc3dvcmQgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiRXNjcmliYSBsYSBjb250cmFzZcOxYSBSUEMgKHZhY8OtbyBzaSBsYSBhdXRlbnRpY2FjacOzbiBlc3TDoSBkZXNoYWJpbGl0YWRhKVwiLFxuICBcIkVudGVyIGJhc2UgVVJMIChvcHRpb25hbClcIjogXCJFc2NyaWJhIGxhIFVSTCBiYXNlIChvcGNpb25hbClcIixcbiAgXCJEaXJlY3QgRG93bmxvYWRcIjogXCJEZXNjYXJnYSBEaXJlY3RhXCIsXG4gIFwiSWYgc3VwcGxpZWQsIGxpbmtzIHdpbGwgYmUgY3JlYXRlZCB0byBlbmFibGUgZGlyZWN0IGRvd25sb2FkIGZyb20gdGhlIEFyaWEyIHNlcnZlci5cIjpcbiAgICBcIkVzdG8gcGVybWl0ZSBjcmVhciBlbmxhY2VzIGRlIGRlc2NhcmdhIGRlIGxvcyBhcmNoaXZvcyBkZXNkZSBlbCBzZXJ2aWRvciBBcmlhMlwiLFxuICBcIihSZXF1aXJlcyBhcHByb3ByaWF0ZSB3ZWJzZXJ2ZXIgdG8gYmUgY29uZmlndXJlZC4pXCI6XG4gICAgXCIoUmVxdWllcmUgY29uZmlndXJhY2nDs24gYXByb3BpYWRhIGRlbCBzZXJ2aWRvciB3ZWIpXCIsXG4gIFwiU2F2ZSBDb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIjogXCJHdWFyZGFyIENvbmZpZ3VyYWNpw7NuXCIsXG4gIEZpbHRlcjogXCJGaWxyYXJcIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcIkluZm9ybWFjacOzbiBkZSBzZXJ2aWRvciBBcmlhMlwiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCJBcmlhMiB2ZXJzacOzblwiLFxuICBcIkZlYXR1cmVzIEVuYWJsZWRcIjogXCJGdW5jaW9uYWxpZGFkIGRpc3BvbmlibGVcIixcbiAgLy8gYWJvdXQgbW9kYWxcbiAgXCJUbyBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHByb2plY3QsIGFkZCBpc3N1ZXMgb3IgdG8gY29udHJpYnV0ZSBiYWNrLCBoZWFkIG9uIHRvXCI6XG4gICAgXCJQYXJhIG9idGVuZXIgbGEgw7psdGltYSB2ZXJzacOzbiBkZWwgcHJveWVjdG8sIHJlcG9ydGFyIHByb2JsZW1hcyBvIGNvbGFib3JhciwgdmF5YSBhXCIsXG4gIFwiT3IgeW91IGNhbiBvcGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiB0aGUgYnJvd3NlciB0aHJvdWdoXCI6XG4gICAgXCJQdWVkZSBhYnJpciBsYSDDumx0aW1hIHZlcnNpw7NuIGVuIHN1IG5hdmVnYWRvciwgZGlyZWN0YW1lbnRlXCIsXG4gIENsb3NlOiBcIkNlcnJhclwiLFxuICAvLyBsYWJlbHNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCJFc3RhZG8gZGUgZGVzY2FyZ2FcIixcbiAgXCJEb3dubG9hZCBTcGVlZFwiOiBcIlZlbG9jaWRhZCBkZSBkZXNjYXJnYVwiLFxuICBcIlVwbG9hZCBTcGVlZFwiOiBcIlZlbC4gU3ViaWRhXCIsXG4gIFwiRXN0aW1hdGVkIHRpbWVcIjogXCJUaWVtcG8gZXN0aW1hZG9cIixcbiAgXCJEb3dubG9hZCBTaXplXCI6IFwiVGFtYcOxbyBkZSBkZXNjYXJnYVwiLFxuICBEb3dubG9hZGVkOiBcIkRlc2NhcmdhZG9cIixcbiAgUHJvZ3Jlc3M6IFwiUHJvZ3Jlc29cIixcbiAgXCJEb3dubG9hZCBQYXRoXCI6IFwiQ2FycGV0YSBkZSBkZXNjYXJnYVwiLFxuICBVcGxvYWRlZDogXCJTdWJpZG9cIixcbiAgXCJEb3dubG9hZCBHSURcIjogXCJHSUQgZGUgRGVzY2FyZ2FcIixcbiAgXCJOdW1iZXIgb2YgUGllY2VzXCI6IFwiTsKwIGRlIFBpZXphc1wiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcIlRhbWHDsW8gZGUgcGllemFcIixcbiAgLy9hbGVydHNcbiAgXCJUaGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIHVuc3VjY2Vzc2Z1bC4gVHJ5aW5nIGFub3RoZXIgY29uZmlndXJhdGlvblwiOlxuICAgIFwiRWwgw7psdGltbyBpbnRlbnRvIGRlIGNvbmV4acOzbiBmYWxsw7MuIFByb2JhbmRvIG90cmEgY29uZmlndXJhY2nDs25cIixcbiAgXCJPaCBTbmFwIVwiOiBcIlJheW9z4oCmXCIsXG4gIFwiQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIGFyaWEyIFJQQyBzZXJ2ZXIuIFdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4gWW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhlIGNvbm5lY3Rpb24gc2V0dGluZ3MgYnkgZ29pbmcgdG8gU2V0dGluZ3MgPiBDb25uZWN0aW9uIFNldHRpbmdzXCI6XG4gICAgXCJObyBzZSBwdWRvIGVzdGFibGVjZXIgdW5hIGNvbmV4acOzbiBhbCBzZXJ2aWRvciBBcmlhMi4gUmVpbnRlbnRhbmRvIGVuIDEwIHNlZ3VuZG9zLiBQcnVlYmUgcmV2aXNhbmRvIGxhIGNvbmZpZ3VyYWNpw7NuIGVuIEFqdXN0ZXMgPiBBanVzdGVzIGRlIENvbmV4acOzblwiLFxuICBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aGlsZSBjb25uZWN0aW5nIHRvIEFyaWEyIFJQQyBzZXJ2ZXIuIFdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4gWW91IG1pZ2h0IHdhbnQgdG8gY29uZmlybSB5b3VyIGF1dGhlbnRpY2F0aW9uIGRldGFpbHMgYnkgZ29pbmcgdG8gU2V0dGluZ3MgPiBDb25uZWN0aW9uIFNldHRpbmdzXCI6XG4gICAgXCJBdXRlbnRpY2FjacOzbiBmYWxsaWRhIGNvbiBlbCBzZXJ2aW9yIEFyaWEyIFJQQy4gUmVpbnRlbnRhbmRvIGVuIDEwIHNlZ3VuZG9zLiBQdWVkZSBxdWUgc2VhIG5lY2VzYXJpbyByZXZpc2FyIHN1IGluZm8gZGUgYXV0ZW50aWNhY2nDs24gZW4gQWp1c3RlcyA+IEFqdXN0ZXMgZGUgQ29uZXhpw7NuXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIGl0cyByZW1vdGUgUlBDIOKAplwiOlxuICAgIFwiQ29uZXhpw7NuIGV4aXRvc2EgY29uIGVsIHNlcnZpZG9yIEFyaWEyIG1lZGlhbnRlIGxhIGludGVyZmF6IFJQQ1wiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCByZW1vdGUgUlBDLCBob3dldmVyIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGluc2VjdXJlLiBGb3IgY29tcGxldGUgc2VjdXJpdHkgdHJ5IGFkZGluZyBhbiBhdXRob3JpemF0aW9uIHNlY3JldCB0b2tlbiB3aGlsZSBzdGFydGluZyBBcmlhMiAodGhyb3VnaCB0aGUgZmxhZyAtLXJwYy1zZWNyZXQpXCI6XG4gICAgXCJDb25leGnDs24gZXhpdG9zYSBjb24gZWwgc2Vydmlkb3IgQXJpYTIgbWVkaWFudGUgbGEgaW50ZXJmYXogUlBDLCBzaW4gZW1iYXJnbyBsYSBjb25leGnDs24gbm8gZXMgc2VndXJhLiBQYXJhIG1lam9yYXIgbGEgc2VndXJpZGFkLCBhw7FhZGEgdW4gdG9rZW4gZGUgYXV0b3JpemFjacOzbiBhbCBpbmljaWFyIEFyaWEyIChjb24gbGEgb3BjacOzbiAtLXJwYy1zZWNyZXQpXCIsXG4gIFwiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gYXJpYTIgdXNpbmcgdGhlIG5ldyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIjpcbiAgICBcIkludGVudGFuZG8gY29uZWN0YXIgY29uIGVsIHNlcnZpZG9yIEFyaWEyIHVzYW5kbyBsb3MgbnVldm9zIEFqdXN0ZXMgZGUgQ29uZXhpw7NuXCJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/translate/es_ES.js\n'
);
/***/
},
/***/ "./src/js/translate/fa_IR.js":
/*!***********************************!*\
!*** ./src/js/translate/fa_IR.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.fa_IR = {\n // header\n Search: "جستجو",\n // Nav menu\n Add: "اضافه کردن",\n "By URIs": "بر اساس مسیر سایت",\n "By Torrents": "بر اساس تورنت",\n "By Metalinks": "بر اساس متا لینک",\n Manage: "مدیریت",\n "Pause All": "توقف همه",\n "Resume Paused": "ادامه متوقف شده ها",\n "Purge Completed": "حذف تکمیل شده ها",\n "Shutdown Server": "خاموش کردن سرور",\n Settings: "تنظیمات",\n "Connection Settings": "تنظیمات ارتباط",\n "Global Settings": "تنظیمات سراسری",\n "Server info": "اطلاعات سرور",\n "About and contribute": "درباره و مشارکت",\n "Toggle navigation": "تغییر ناوبری",\n // body\n // nav side bar\n Miscellaneous: "متفرقه",\n "Global Statistics": "آمار سراسری",\n About: "درباره",\n Displaying: "نمایش",\n of: "از",\n downloads: "دانلودها",\n Language: "زبان",\n // download filters\n "Download Filters": "دانلود فیلترها",\n Running: "در حال اجرا",\n Active: "فعال",\n Waiting: "در انتظار",\n Complete: "تمام شده",\n Error: "خطا",\n Paused: "متوقف شده",\n Removed: "حذف شده",\n "Hide linked meta-data": "مخفی کردن متا داده مرتبط",\n Toggle: "تغییر وضعیت",\n "Reset filters": "حذف فیلترها",\n // download status\n Verifing: "تأیید کردن",\n "Verify Pending": "تأیید کردن در انتظارها",\n // starred properties\n "Quick Access Settings": "تنظیمات دسترسی سریع",\n Save: "ذخیره",\n "Save settings": "ذخیره تنظیمات",\n "Currently no download in line to display, use the":\n "در حال حاضر هیچ دانلودی برای نمایش وجود ندارد، استفاده از",\n "download button to start downloading files!": "دکمه دانلود برای شروع دانلود فایل ها!",\n Peers: "همتایان",\n "More Info": "اطلاعات بیشتر",\n Remove: "حذف",\n "# of": "از #",\n Length: "طول",\n // modals\n "Add Downloads By URIs": "اضافه کردن دانلود توسط لینک ها",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- شما می توانید چند بار دانلود (فایل ها) را همزمان با قرار دادن URI ها برای هر فایل در یک خط جداگانه اضافه کنید.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- شما همچنین می توانید URI های متعدد (آینه ها) را برای فایل *همان* اضافه کنید. برای انجام این کار، URI ها را با یک فضای جداگانه جدا کنید.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- یک URI می تواند HTTP (S) / FTP / BitTorrent-Magnet باشد.",\n "Download settings": "تنظیمات دانلود",\n "Advanced settings": "تنظیمات پیشرفته",\n Cancel: "لغو",\n Start: "شروع",\n Choose: "انتخاب",\n "Quick Access (shown on the main page)": "دسترسی سریع (نشان داده شده در صفحه اصلی)",\n // add torrent modal\n "Add Downloads By Torrents": "اضافه کردن دانلود توسط تورنت",\n "- Select the torrent from the local filesystem to start the download.":\n "- تورنت را از سیستم فایل محلی انتخاب کنید تا دانلود را شروع کنید.",\n "- You can select multiple torrents to start multiple downloads.":\n "- شما می توانید چندین تورنت را برای شروع بارگیری چندگانه انتخاب کنید.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- برای اضافه کردن URL BitTorrent-Magnet، از گزینه بر اساس مسیر سایت استفاده کنید و آن را در آنجا اضافه کنید.",\n "Select Torrents": "تورنت ها را انتخاب کنید",\n "Select a Torrent": "تورنتی را انتخاب کنید",\n // add metalink modal\n "Add Downloads By Metalinks": "متالینک ها را انتخاب کنید",\n "Select Metalinks": "Metalinks را انتخاب کنید",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Metalink را از سیستم فایل محلی انتخاب کنید تا دانلود را شروع کنید.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- شما می توانید چندین Metalinks را برای شروع چندین بار انتخاب کنید.",\n "Select a Metalink": "Metalink را انتخاب کنید",\n // select file modal\n "Choose files to start download for": "فایل را برای شروع دانلود انتخاب کنید",\n "Select to download": "برای دانلود انتخاب کنید",\n // settings modal\n "Aria2 RPC host and port": "میزبان و پورت Aria2 RPC",\n "Enter the host": "میزبان را وارد کنید",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "نام IP یا DNS سرور که RPC برای Aria2 در حال اجرا است را وارد کنید (به طور پیش فرض: localhost)",\n "Enter the port": "پورت را وارد کنید",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "پورت سرور که RPC برای Aria2 اجرا می شود را وارد کنید (به طور پیش فرض: 6800)",\n "Enter the RPC path": "مسیر RPC را وارد کنید",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "مسیر نقطه پایانی Aria2 RPC را وارد کنید (default: / jsonrpc)",\n "SSL/TLS encryption": "SSL / TLS رمزگذاری",\n "Enable SSL/TLS encryption": "SSL / TLS رمزگذاری را فعال کنید",\n "Enter the secret token (optional)": "رمز نشانه (اختیاری) را وارد کنید",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "کد مخفی Aria2 RPC را وارد کنید (اگر احراز هویت فعال نمی شود خالی بگذارید)",\n "Enter the username (optional)": "نام کاربری (اختیاری) را وارد کنید",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "نام کاربری Aria2 RPC را وارد کنید (خالی اگر احراز هویت غیر فعال شود)",\n "Enter the password (optional)": "رمز عبور را وارد کنید (اختیاری)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "گذرواژه Aria2 RPC را وارد کنید (اگر احراز هویت فعال نمی شود خالی بگذارید)",\n "Enter base URL (optional)": "URL پایه را وارد کنید (اختیاری)",\n "Direct Download": "دانلود مستقیم",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "در صورت عرضه، لینک برای ایجاد مستقیم دانلود از سرور Aria2 ایجاد خواهد شد.",\n "(Requires appropriate webserver to be configured.)": "(نیاز به وب سرور مناسب برای پیکربندی.)",\n "Save Connection configuration": "ذخیره پیکربندی اتصال",\n Filter: "فیلتر",\n // server info modal\n "Aria2 server info": "مشخصات سرور Aria2",\n "Aria2 Version": "نسخه Aria2",\n "Features Enabled": "ویژگی های فعال",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "برای دانلود آخرين نسخه پروژه، مسائل را اضافه کنيد يا به پشتيبانی بپردازيد بروید به",\n "Or you can open the latest version in the browser through":\n "یا شما می توانید آخرین نسخه را از طریق مرورگر باز کنید",\n Close: "بستن",\n // labels\n "Download status": "وضعیت دانلود",\n "Download Speed": "سرعت دانلود",\n "Upload Speed": "سرعت آپلود",\n "Estimated time": "زمان تخمین زده شده",\n "Download Size": "اندازه دانلود",\n Downloaded: "دانلود شده",\n Progress: "پیشرفت",\n "Download Path": "مسیر دانلود",\n Uploaded: "آپلود شده",\n "Download GID": "دانلود GID",\n "Number of Pieces": "تعداد قطعات",\n "Piece Length": "طول قطعه",\n\n //alerts\n "The last connection attempt was unsuccessful. Trying another configuration":\n "آخرین تلاش اتصال ناموفق بود. تلاش برای تنظیم دیگر",\n "Oh Snap!": "اوه نه!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "نمی توان به سرور aria2 RPC متصل شد. در 10 ثانیه دوباره تلاش خواهیم کرد ممکن است بخواهید تنظیمات اتصال را با رفتن به تنظیمات > تنظیمات اتصال بررسی کنید",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "در هنگام اتصال به سرور Aria2 RPC تأییدیه شکست خورد. در 10 ثانیه دوباره تلاش خواهیم کرد ممکن است بخواهید جزئیات احراز هویت خود را با رفتن به تنظیمات > تنظیمات اتصال تایید کنید",\n "Successfully connected to Aria2 through its remote RPC …":\n "با موفقیت از طریق RPC از راه دور به Aria2 متصل شد ...",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "با موفقیت به Aria2 از طریق RPC راه دور متصل شد، اما اتصال هنوز ناامن است. برای امنیت کامل سعی کنید مجوز نشانه مجوز را در هنگام شروع Aria2 (از طریق پرچم --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "تلاش برای اتصال به aria2 با استفاده از پیکربندی اتصال جدید",\n "Remove {{name}} and associated meta-data?": "حذف {{name}} و متا داده های مرتبط"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL2ZhX0lSLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9mYV9JUi5qcz9kODBiIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5mYV9JUiA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCLYrNiz2KrYrNmIXCIsXG4gIC8vIE5hdiBtZW51XG4gIEFkZDogXCLYp9i22KfZgdmHINqp2LHYr9mGXCIsXG4gIFwiQnkgVVJJc1wiOiBcItio2LEg2KfYs9in2LMg2YXYs9uM2LEg2LPYp9uM2KpcIixcbiAgXCJCeSBUb3JyZW50c1wiOiBcItio2LEg2KfYs9in2LMg2KrZiNix2YbYqlwiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcItio2LEg2KfYs9in2LMg2YXYqtinINmE24zZhtqpXCIsXG4gIE1hbmFnZTogXCLZhdiv24zYsduM2KpcIixcbiAgXCJQYXVzZSBBbGxcIjogXCLYqtmI2YLZgSDZh9mF2YdcIixcbiAgXCJSZXN1bWUgUGF1c2VkXCI6IFwi2KfYr9in2YXZhyDZhdiq2YjZgtmBINi02K/ZhyDZh9inXCIsXG4gIFwiUHVyZ2UgQ29tcGxldGVkXCI6IFwi2K3YsNmBINiq2qnZhduM2YQg2LTYr9mHINmH2KdcIixcbiAgXCJTaHV0ZG93biBTZXJ2ZXJcIjogXCLYrtin2YXZiNi0INqp2LHYr9mGINiz2LHZiNixXCIsXG4gIFNldHRpbmdzOiBcItiq2YbYuNuM2YXYp9iqXCIsXG4gIFwiQ29ubmVjdGlvbiBTZXR0aW5nc1wiOiBcItiq2YbYuNuM2YXYp9iqINin2LHYqtio2KfYt1wiLFxuICBcIkdsb2JhbCBTZXR0aW5nc1wiOiBcItiq2YbYuNuM2YXYp9iqINiz2LHYp9iz2LHbjFwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwi2KfYt9mE2KfYudin2Kog2LPYsdmI2LFcIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcItiv2LHYqNin2LHZhyDZiCDZhdi02KfYsdqp2KpcIixcbiAgXCJUb2dnbGUgbmF2aWdhdGlvblwiOiBcItiq2LrbjNuM2LEg2YbYp9mI2KjYsduMXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwi2YXYqtmB2LHZgtmHXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCLYotmF2KfYsSDYs9ix2KfYs9ix24xcIixcbiAgQWJvdXQ6IFwi2K/Ysdio2KfYsdmHXCIsXG4gIERpc3BsYXlpbmc6IFwi2YbZhdin24zYtFwiLFxuICBvZjogXCLYp9iyXCIsXG4gIGRvd25sb2FkczogXCLYr9in2YbZhNmI2K/Zh9inXCIsXG4gIExhbmd1YWdlOiBcItiy2KjYp9mGXCIsXG4gIC8vIGRvd25sb2FkIGZpbHRlcnNcbiAgXCJEb3dubG9hZCBGaWx0ZXJzXCI6IFwi2K/Yp9mG2YTZiNivINmB24zZhNiq2LHZh9inXCIsXG4gIFJ1bm5pbmc6IFwi2K/YsSDYrdin2YQg2KfYrNix2KdcIixcbiAgQWN0aXZlOiBcItmB2LnYp9mEXCIsXG4gIFdhaXRpbmc6IFwi2K/YsSDYp9mG2KrYuNin2LFcIixcbiAgQ29tcGxldGU6IFwi2KrZhdin2YUg2LTYr9mHXCIsXG4gIEVycm9yOiBcItiu2LfYp1wiLFxuICBQYXVzZWQ6IFwi2YXYqtmI2YLZgSDYtNiv2YdcIixcbiAgUmVtb3ZlZDogXCLYrdiw2YEg2LTYr9mHXCIsXG4gIFwiSGlkZSBsaW5rZWQgbWV0YS1kYXRhXCI6IFwi2YXYrtmB24wg2qnYsdiv2YYg2YXYqtinINiv2KfYr9mHINmF2LHYqtio2LdcIixcbiAgVG9nZ2xlOiBcItiq2LrbjNuM2LEg2YjYtti524zYqlwiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCLYrdiw2YEg2YHbjNmE2KrYsdmH2KdcIixcbiAgLy8gZG93bmxvYWQgc3RhdHVzXG4gIFZlcmlmaW5nOiBcItiq2KPbjNuM2K8g2qnYsdiv2YZcIixcbiAgXCJWZXJpZnkgUGVuZGluZ1wiOiBcItiq2KPbjNuM2K8g2qnYsdiv2YYg2K/YsSDYp9mG2KrYuNin2LHZh9inXCIsXG4gIC8vIHN0YXJyZWQgcHJvcGVydGllc1xuICBcIlF1aWNrIEFjY2VzcyBTZXR0aW5nc1wiOiBcItiq2YbYuNuM2YXYp9iqINiv2LPYqtix2LPbjCDYs9ix24zYuVwiLFxuICBTYXZlOiBcItiw2K7bjNix2YdcIixcbiAgXCJTYXZlIHNldHRpbmdzXCI6IFwi2LDYrtuM2LHZhyDYqtmG2LjbjNmF2KfYqlwiLFxuICBcIkN1cnJlbnRseSBubyBkb3dubG9hZCBpbiBsaW5lIHRvIGRpc3BsYXksIHVzZSB0aGVcIjpcbiAgICBcItiv2LEg2K3Yp9mEINit2KfYttixINmH24zahiDYr9in2YbZhNmI2K/bjCDYqNix2KfbjCDZhtmF2KfbjNi0INmI2KzZiNivINmG2K/Yp9ix2K/YjCDYp9iz2KrZgdin2K/ZhyDYp9iyXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcItiv2qnZhdmHINiv2KfZhtmE2YjYryDYqNix2KfbjCDYtNix2YjYuSDYr9in2YbZhNmI2K8g2YHYp9uM2YQg2YfYpyFcIixcbiAgUGVlcnM6IFwi2YfZhdiq2KfbjNin2YZcIixcbiAgXCJNb3JlIEluZm9cIjogXCLYp9i32YTYp9i52KfYqiDYqNuM2LTYqtixXCIsXG4gIFJlbW92ZTogXCLYrdiw2YFcIixcbiAgXCIjIG9mXCI6IFwi2KfYsiAjXCIsXG4gIExlbmd0aDogXCLYt9mI2YRcIixcbiAgLy8gbW9kYWxzXG4gIFwiQWRkIERvd25sb2FkcyBCeSBVUklzXCI6IFwi2KfYttin2YHZhyDaqdix2K/ZhiDYr9in2YbZhNmI2K8g2KrZiNiz2Lcg2YTbjNmG2qkg2YfYp1wiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCItINi02YXYpyDZhduMINiq2YjYp9mG24zYryDahtmG2K8g2KjYp9ixINiv2KfZhtmE2YjYryAo2YHYp9uM2YQg2YfYpykg2LHYpyDZh9mF2LLZhdin2YYg2KjYpyDZgtix2KfYsSDYr9in2K/ZhiBVUkkg2YfYpyDYqNix2KfbjCDZh9ixINmB2KfbjNmEINiv2LEg24zaqSDYrti3INis2K/Yp9qv2KfZhtmHINin2LbYp9mB2Ycg2qnZhtuM2K8uXCIsXG4gIFwiLSBZb3UgY2FuIGFsc28gYWRkIG11bHRpcGxlIFVSSXMgKG1pcnJvcnMpIGZvciB0aGUgKnNhbWUqIGZpbGUuIFRvIGRvIHRoaXMsIHNlcGFyYXRlIHRoZSBVUklzIGJ5IGEgc3BhY2UuXCI6XG4gICAgXCItINi02YXYpyDZh9mF2obZhtuM2YYg2YXbjCDYqtmI2KfZhtuM2K8gVVJJINmH2KfbjCDZhdiq2LnYr9ivICjYotuM2YbZhyDZh9inKSDYsdinINio2LHYp9uMINmB2KfbjNmEICrZh9mF2KfZhiog2KfYttin2YHZhyDaqdmG24zYry4g2KjYsdin24wg2KfZhtis2KfZhSDYp9uM2YYg2qnYp9ix2IwgVVJJINmH2Kcg2LHYpyDYqNinINuM2qkg2YHYttin24wg2KzYr9in2q/Yp9mG2Ycg2KzYr9inINqp2YbbjNivLlwiLFxuICBcIi0gQSBVUkkgY2FuIGJlIEhUVFAoUykvRlRQL0JpdFRvcnJlbnQtTWFnbmV0LlwiOlxuICAgIFwiLSDbjNqpIFVSSSDZhduMINiq2YjYp9mG2K8gSFRUUCAoUykgLyBGVFAgLyBCaXRUb3JyZW50LU1hZ25ldCDYqNin2LTYry5cIixcbiAgXCJEb3dubG9hZCBzZXR0aW5nc1wiOiBcItiq2YbYuNuM2YXYp9iqINiv2KfZhtmE2YjYr1wiLFxuICBcIkFkdmFuY2VkIHNldHRpbmdzXCI6IFwi2KrZhti424zZhdin2Kog2b7bjNi02LHZgdiq2YdcIixcbiAgQ2FuY2VsOiBcItmE2LrZiFwiLFxuICBTdGFydDogXCLYtNix2YjYuVwiLFxuICBDaG9vc2U6IFwi2KfZhtiq2K7Yp9ioXCIsXG4gIFwiUXVpY2sgQWNjZXNzIChzaG93biBvbiB0aGUgbWFpbiBwYWdlKVwiOiBcItiv2LPYqtix2LPbjCDYs9ix24zYuSAo2YbYtNin2YYg2K/Yp9iv2Ycg2LTYr9mHINiv2LEg2LXZgdit2Ycg2KfYtdmE24wpXCIsXG4gIC8vIGFkZCB0b3JyZW50IG1vZGFsXG4gIFwiQWRkIERvd25sb2FkcyBCeSBUb3JyZW50c1wiOiBcItin2LbYp9mB2Ycg2qnYsdiv2YYg2K/Yp9mG2YTZiNivINiq2YjYs9i3INiq2YjYsdmG2KpcIixcbiAgXCItIFNlbGVjdCB0aGUgdG9ycmVudCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIi0g2KrZiNix2YbYqiDYsdinINin2LIg2LPbjNiz2KrZhSDZgdin24zZhCDZhdit2YTbjCDYp9mG2KrYrtin2Kgg2qnZhtuM2K8g2KrYpyDYr9in2YbZhNmI2K8g2LHYpyDYtNix2YjYuSDaqdmG24zYry5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIi0g2LTZhdinINmF24wg2KrZiNin2YbbjNivINqG2YbYr9uM2YYg2KrZiNix2YbYqiDYsdinINio2LHYp9uMINi02LHZiNi5INio2KfYsdqv24zYsduMINqG2YbYr9qv2KfZhtmHINin2YbYqtiu2KfYqCDaqdmG24zYry5cIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOlxuICAgIFwiLSDYqNix2KfbjCDYp9i22KfZgdmHINqp2LHYr9mGIFVSTCBCaXRUb3JyZW50LU1hZ25ldNiMINin2LIg2q/YstuM2YbZhyDYqNixINin2LPYp9izINmF2LPbjNixINiz2KfbjNiqINin2LPYqtmB2KfYr9mHINqp2YbbjNivINmIINii2YYg2LHYpyDYr9ixINii2YbYrNinINin2LbYp9mB2Ycg2qnZhtuM2K8uXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwi2KrZiNix2YbYqiDZh9inINix2Kcg2KfZhtiq2K7Yp9ioINqp2YbbjNivXCIsXG4gIFwiU2VsZWN0IGEgVG9ycmVudFwiOiBcItiq2YjYsdmG2KrbjCDYsdinINin2YbYqtiu2KfYqCDaqdmG24zYr1wiLFxuICAvLyBhZGQgbWV0YWxpbmsgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IE1ldGFsaW5rc1wiOiBcItmF2KrYp9mE24zZhtqpINmH2Kcg2LHYpyDYp9mG2KrYrtin2Kgg2qnZhtuM2K9cIixcbiAgXCJTZWxlY3QgTWV0YWxpbmtzXCI6IFwiTWV0YWxpbmtzINix2Kcg2KfZhtiq2K7Yp9ioINqp2YbbjNivXCIsXG4gIFwiLSBTZWxlY3QgdGhlIE1ldGFsaW5rIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiLSBNZXRhbGluayDYsdinINin2LIg2LPbjNiz2KrZhSDZgdin24zZhCDZhdit2YTbjCDYp9mG2KrYrtin2Kgg2qnZhtuM2K8g2KrYpyDYr9in2YbZhNmI2K8g2LHYpyDYtNix2YjYuSDaqdmG24zYry5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItINi02YXYpyDZhduMINiq2YjYp9mG24zYryDahtmG2K/bjNmGIE1ldGFsaW5rcyDYsdinINio2LHYp9uMINi02LHZiNi5INqG2YbYr9uM2YYg2KjYp9ixINin2YbYqtiu2KfYqCDaqdmG24zYry5cIixcbiAgXCJTZWxlY3QgYSBNZXRhbGlua1wiOiBcIk1ldGFsaW5rINix2Kcg2KfZhtiq2K7Yp9ioINqp2YbbjNivXCIsXG4gIC8vIHNlbGVjdCBmaWxlIG1vZGFsXG4gIFwiQ2hvb3NlIGZpbGVzIHRvIHN0YXJ0IGRvd25sb2FkIGZvclwiOiBcItmB2KfbjNmEINix2Kcg2KjYsdin24wg2LTYsdmI2Lkg2K/Yp9mG2YTZiNivINin2YbYqtiu2KfYqCDaqdmG24zYr1wiLFxuICBcIlNlbGVjdCB0byBkb3dubG9hZFwiOiBcItio2LHYp9uMINiv2KfZhtmE2YjYryDYp9mG2KrYrtin2Kgg2qnZhtuM2K9cIixcbiAgLy8gc2V0dGluZ3MgbW9kYWxcbiAgXCJBcmlhMiBSUEMgaG9zdCBhbmQgcG9ydFwiOiBcItmF24zYstio2KfZhiDZiCDZvtmI2LHYqiBBcmlhMiBSUENcIixcbiAgXCJFbnRlciB0aGUgaG9zdFwiOiBcItmF24zYstio2KfZhiDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gIFwiRW50ZXIgdGhlIElQIG9yIEROUyBuYW1lIG9mIHRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhlIFJQQyBmb3IgQXJpYTIgaXMgcnVubmluZyAoZGVmYXVsdDogbG9jYWxob3N0KVwiOlxuICAgIFwi2YbYp9mFIElQINuM2KcgRE5TINiz2LHZiNixINqp2YcgUlBDINio2LHYp9uMIEFyaWEyINiv2LEg2K3Yp9mEINin2KzYsdinINin2LPYqiDYsdinINmI2KfYsdivINqp2YbbjNivICjYqNmHINi32YjYsSDZvtuM2LQg2YHYsdi2OiBsb2NhbGhvc3QpXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnRcIjogXCLZvtmI2LHYqiDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnQgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiA2ODAwKVwiOlxuICAgIFwi2b7ZiNix2Kog2LPYsdmI2LEg2qnZhyBSUEMg2KjYsdin24wgQXJpYTIg2KfYrNix2Kcg2YXbjCDYtNmI2K8g2LHYpyDZiNin2LHYryDaqdmG24zYryAo2KjZhyDYt9mI2LEg2b7bjNi0INmB2LHYtjogNjgwMClcIixcbiAgXCJFbnRlciB0aGUgUlBDIHBhdGhcIjogXCLZhdiz24zYsSBSUEMg2LHYpyDZiNin2LHYryDaqdmG24zYr1wiLFxuICBcIkVudGVyIHRoZSBwYXRoIGZvciB0aGUgQXJpYTIgUlBDIGVuZHBvaW50IChkZWZhdWx0OiAvanNvbnJwYylcIjpcbiAgICBcItmF2LPbjNixINmG2YLYt9mHINm+2KfbjNin2YbbjCBBcmlhMiBSUEMg2LHYpyDZiNin2LHYryDaqdmG24zYryAoZGVmYXVsdDogLyBqc29ucnBjKVwiLFxuICBcIlNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIlNTTCAvIFRMUyDYsdmF2LLar9iw2KfYsduMXCIsXG4gIFwiRW5hYmxlIFNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIlNTTCAvIFRMUyDYsdmF2LLar9iw2KfYsduMINix2Kcg2YHYudin2YQg2qnZhtuM2K9cIixcbiAgXCJFbnRlciB0aGUgc2VjcmV0IHRva2VuIChvcHRpb25hbClcIjogXCLYsdmF2LIg2YbYtNin2YbZhyAo2KfYrtiq24zYp9ix24wpINix2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHNlY3JldCB0b2tlbiAobGVhdmUgZW1wdHkgaWYgYXV0aGVudGljYXRpb24gaXMgbm90IGVuYWJsZWQpXCI6XG4gICAgXCLaqdivINmF2K7ZgduMIEFyaWEyIFJQQyDYsdinINmI2KfYsdivINqp2YbbjNivICjYp9qv2LEg2KfYrdix2KfYsiDZh9mI24zYqiDZgdi52KfZhCDZhtmF24wg2LTZiNivINiu2KfZhNuMINio2q/YsNin2LHbjNivKVwiLFxuICBcIkVudGVyIHRoZSB1c2VybmFtZSAob3B0aW9uYWwpXCI6IFwi2YbYp9mFINqp2KfYsdio2LHbjCAo2KfYrtiq24zYp9ix24wpINix2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHVzZXJuYW1lIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcItmG2KfZhSDaqdin2LHYqNix24wgQXJpYTIgUlBDINix2Kcg2YjYp9ix2K8g2qnZhtuM2K8gKNiu2KfZhNuMINin2q/YsSDYp9it2LHYp9iyINmH2YjbjNiqINi624zYsSDZgdi52KfZhCDYtNmI2K8pXCIsXG4gIFwiRW50ZXIgdGhlIHBhc3N3b3JkIChvcHRpb25hbClcIjogXCLYsdmF2LIg2LnYqNmI2LEg2LHYpyDZiNin2LHYryDaqdmG24zYryAo2KfYrtiq24zYp9ix24wpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBwYXNzd29yZCAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCLar9iw2LHZiNin2pjZhyBBcmlhMiBSUEMg2LHYpyDZiNin2LHYryDaqdmG24zYryAo2Kfar9ixINin2K3Ysdin2LIg2YfZiNuM2Kog2YHYudin2YQg2YbZhduMINi02YjYryDYrtin2YTbjCDYqNqv2LDYp9ix24zYrylcIixcbiAgXCJFbnRlciBiYXNlIFVSTCAob3B0aW9uYWwpXCI6IFwiVVJMINm+2KfbjNmHINix2Kcg2YjYp9ix2K8g2qnZhtuM2K8gKNin2K7YqtuM2KfYsduMKVwiLFxuICBcIkRpcmVjdCBEb3dubG9hZFwiOiBcItiv2KfZhtmE2YjYryDZhdiz2KrZgtuM2YVcIixcbiAgXCJJZiBzdXBwbGllZCwgbGlua3Mgd2lsbCBiZSBjcmVhdGVkIHRvIGVuYWJsZSBkaXJlY3QgZG93bmxvYWQgZnJvbSB0aGUgQXJpYTIgc2VydmVyLlwiOlxuICAgIFwi2K/YsSDYtdmI2LHYqiDYudix2LbZh9iMINmE24zZhtqpINio2LHYp9uMINin24zYrNin2K8g2YXYs9iq2YLbjNmFINiv2KfZhtmE2YjYryDYp9iyINiz2LHZiNixIEFyaWEyINin24zYrNin2K8g2K7ZiNin2YfYryDYtNivLlwiLFxuICBcIihSZXF1aXJlcyBhcHByb3ByaWF0ZSB3ZWJzZXJ2ZXIgdG8gYmUgY29uZmlndXJlZC4pXCI6IFwiKNmG24zYp9iyINio2Ycg2YjYqCDYs9ix2YjYsSDZhdmG2KfYs9ioINio2LHYp9uMINm+24zaqdix2KjZhtiv24wuKVwiLFxuICBcIlNhdmUgQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6IFwi2LDYrtuM2LHZhyDZvtuM2qnYsdio2YbYr9uMINin2KrYtdin2YRcIixcbiAgRmlsdGVyOiBcItmB24zZhNiq2LFcIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcItmF2LTYrti12KfYqiDYs9ix2YjYsSBBcmlhMlwiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCLZhtiz2K7ZhyBBcmlhMlwiLFxuICBcIkZlYXR1cmVzIEVuYWJsZWRcIjogXCLZiNuM2pjar9uMINmH2KfbjCDZgdi52KfZhFwiLFxuICAvLyBhYm91dCBtb2RhbFxuICBcIlRvIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCwgYWRkIGlzc3VlcyBvciB0byBjb250cmlidXRlIGJhY2ssIGhlYWQgb24gdG9cIjpcbiAgICBcItio2LHYp9uMINiv2KfZhtmE2YjYryDYotiu2LHZitmGINmG2LPYrtmHINm+2LHZiNqY2YfYjCDZhdiz2KfYptmEINix2Kcg2KfYttin2YHZhyDaqdmG2YrYryDZitinINio2Ycg2b7YtNiq2YrYqNin2YbbjCDYqNm+2LHYr9in2LLZitivINio2LHZiNuM2K8g2KjZh1wiLFxuICBcIk9yIHlvdSBjYW4gb3BlbiB0aGUgbGF0ZXN0IHZlcnNpb24gaW4gdGhlIGJyb3dzZXIgdGhyb3VnaFwiOlxuICAgIFwi24zYpyDYtNmF2Kcg2YXbjCDYqtmI2KfZhtuM2K8g2KLYrtix24zZhiDZhtiz2K7ZhyDYsdinINin2LIg2LfYsduM2YIg2YXYsdmI2LHar9ixINio2KfYsiDaqdmG24zYr1wiLFxuICBDbG9zZTogXCLYqNiz2KrZhlwiLFxuICAvLyBsYWJlbHNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCLZiNi22LnbjNiqINiv2KfZhtmE2YjYr1wiLFxuICBcIkRvd25sb2FkIFNwZWVkXCI6IFwi2LPYsdi52Kog2K/Yp9mG2YTZiNivXCIsXG4gIFwiVXBsb2FkIFNwZWVkXCI6IFwi2LPYsdi52Kog2KLZvtmE2YjYr1wiLFxuICBcIkVzdGltYXRlZCB0aW1lXCI6IFwi2LLZhdin2YYg2KrYrtmF24zZhiDYstiv2Ycg2LTYr9mHXCIsXG4gIFwiRG93bmxvYWQgU2l6ZVwiOiBcItin2YbYr9in2LLZhyDYr9in2YbZhNmI2K9cIixcbiAgRG93bmxvYWRlZDogXCLYr9in2YbZhNmI2K8g2LTYr9mHXCIsXG4gIFByb2dyZXNzOiBcItm+24zYtNix2YHYqlwiLFxuICBcIkRvd25sb2FkIFBhdGhcIjogXCLZhdiz24zYsSDYr9in2YbZhNmI2K9cIixcbiAgVXBsb2FkZWQ6IFwi2KLZvtmE2YjYryDYtNiv2YdcIixcbiAgXCJEb3dubG9hZCBHSURcIjogXCLYr9in2YbZhNmI2K8gR0lEXCIsXG4gIFwiTnVtYmVyIG9mIFBpZWNlc1wiOiBcItiq2LnYr9in2K8g2YLYt9i52KfYqlwiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcIti32YjZhCDZgti32LnZh1wiLFxuXG4gIC8vYWxlcnRzXG4gIFwiVGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0IHdhcyB1bnN1Y2Nlc3NmdWwuIFRyeWluZyBhbm90aGVyIGNvbmZpZ3VyYXRpb25cIjpcbiAgICBcItii2K7YsduM2YYg2KrZhNin2LQg2KfYqti12KfZhCDZhtin2YXZiNmB2YIg2KjZiNivLiDYqtmE2KfYtCDYqNix2KfbjCDYqtmG2LjbjNmFINiv24zar9ixXCIsXG4gIFwiT2ggU25hcCFcIjogXCLYp9mI2Ycg2YbZhyFcIixcbiAgXCJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgYXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcItmG2YXbjCDYqtmI2KfZhiDYqNmHINiz2LHZiNixIGFyaWEyIFJQQyDZhdiq2LXZhCDYtNivLiDYr9ixIDEwINir2KfZhtuM2Ycg2K/ZiNio2KfYsdmHINiq2YTYp9i0INiu2YjYp9mH24zZhSDaqdix2K8g2YXZhdqp2YYg2KfYs9iqINio2K7ZiNin2YfbjNivINiq2YbYuNuM2YXYp9iqINin2KrYtdin2YQg2LHYpyDYqNinINix2YHYqtmGINio2Ycg2KrZhti424zZhdin2KogPiDYqtmG2LjbjNmF2KfYqiDYp9iq2LXYp9mEINio2LHYsdiz24wg2qnZhtuM2K9cIixcbiAgXCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgd2hpbGUgY29ubmVjdGluZyB0byBBcmlhMiBSUEMgc2VydmVyLiBXaWxsIHJldHJ5IGluIDEwIHNlY3MuIFlvdSBtaWdodCB3YW50IHRvIGNvbmZpcm0geW91ciBhdXRoZW50aWNhdGlvbiBkZXRhaWxzIGJ5IGdvaW5nIHRvIFNldHRpbmdzID4gQ29ubmVjdGlvbiBTZXR0aW5nc1wiOlxuICAgIFwi2K/YsSDZh9mG2q/Yp9mFINin2KrYtdin2YQg2KjZhyDYs9ix2YjYsSBBcmlhMiBSUEMg2KrYo9uM24zYr9uM2Ycg2LTaqdiz2Kog2K7ZiNix2K8uINiv2LEgMTAg2KvYp9mG24zZhyDYr9mI2KjYp9ix2Ycg2KrZhNin2LQg2K7ZiNin2YfbjNmFINqp2LHYryDZhdmF2qnZhiDYp9iz2Kog2KjYrtmI2KfZh9uM2K8g2KzYstim24zYp9iqINin2K3Ysdin2LIg2YfZiNuM2Kog2K7ZiNivINix2Kcg2KjYpyDYsdmB2KrZhiDYqNmHINiq2YbYuNuM2YXYp9iqID4g2KrZhti424zZhdin2Kog2KfYqti12KfZhCDYqtin24zbjNivINqp2YbbjNivXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIGl0cyByZW1vdGUgUlBDIOKAplwiOlxuICAgIFwi2KjYpyDZhdmI2YHZgtuM2Kog2KfYsiDYt9ix24zZgiBSUEMg2KfYsiDYsdin2Ycg2K/ZiNixINio2YcgQXJpYTIg2YXYqti12YQg2LTYryAuLi5cIixcbiAgXCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIEFyaWEyIHRocm91Z2ggcmVtb3RlIFJQQywgaG93ZXZlciB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBpbnNlY3VyZS4gRm9yIGNvbXBsZXRlIHNlY3VyaXR5IHRyeSBhZGRpbmcgYW4gYXV0aG9yaXphdGlvbiBzZWNyZXQgdG9rZW4gd2hpbGUgc3RhcnRpbmcgQXJpYTIgKHRocm91Z2ggdGhlIGZsYWcgLS1ycGMtc2VjcmV0KVwiOlxuICAgIFwi2KjYpyDZhdmI2YHZgtuM2Kog2KjZhyBBcmlhMiDYp9iyINi32LHbjNmCIFJQQyDYsdin2Ycg2K/ZiNixINmF2KrYtdmEINi02K/YjCDYp9mF2Kcg2KfYqti12KfZhCDZh9mG2YjYsiDZhtin2KfZhdmGINin2LPYqi4g2KjYsdin24wg2KfZhdmG24zYqiDaqdin2YXZhCDYs9i524wg2qnZhtuM2K8g2YXYrNmI2LIg2YbYtNin2YbZhyDZhdis2YjYsiDYsdinINiv2LEg2YfZhtqv2KfZhSDYtNix2YjYuSBBcmlhMiAo2KfYsiDYt9ix24zZgiDZvtix2obZhSAtLXJwYy1zZWNyZXQpXCIsXG4gIFwiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gYXJpYTIgdXNpbmcgdGhlIG5ldyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIjpcbiAgICBcItiq2YTYp9i0INio2LHYp9uMINin2KrYtdin2YQg2KjZhyBhcmlhMiDYqNinINin2LPYqtmB2KfYr9mHINin2LIg2b7bjNqp2LHYqNmG2K/bjCDYp9iq2LXYp9mEINis2K/bjNivXCIsXG4gIFwiUmVtb3ZlIHt7bmFtZX19IGFuZCBhc3NvY2lhdGVkIG1ldGEtZGF0YT9cIjogXCLYrdiw2YEge3tuYW1lfX0g2Ygg2YXYqtinINiv2KfYr9mHINmH2KfbjCDZhdix2KrYqNi3XCJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/js/translate/fa_IR.js\n'
);
/***/
},
/***/ "./src/js/translate/fr_FR.js":
/*!***********************************!*\
!*** ./src/js/translate/fr_FR.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.fr_FR = {\n // header\n Search: "Rechercher",\n // Nav menu\n Add: "Ajouter",\n "By URIs": "Par URIs",\n "By Torrents": "Par Torrents",\n "By Metalinks": "Par Metaliens",\n Manage: "Gérer",\n "Pause All": "Tout suspendre",\n "Resume Paused": "Reprendre",\n "Purge Completed": "Nettoyer les fichiers complétés",\n Settings: "Paramètres",\n "Connection Settings": "Paramètres de connexion",\n "Global Settings": "Paramètres globaux",\n "Server info": "Informations serveur",\n "About and contribute": "À propos et contribuer",\n "Toggle navigation": "Basculer la navigation",\n // body\n // nav side bar\n Miscellaneous: "Autres",\n "Global Statistics": "Statistiques globales",\n About: "À propos",\n Displaying: "Affichage de",\n of: "parmi",\n downloads: "téléchargements",\n Language: "Langue",\n // download filters\n "Download Filters": "Filtres de téléchargement",\n Running: "En cours",\n Active: "Actifs",\n Waiting: "En attente",\n Complete: "Complétés",\n Error: "Erreurs",\n Paused: "En pause",\n Removed: "Supprimés",\n "Hide linked meta-data": "Cacher les métadonnées liées",\n Toggle: "Basculer",\n "Reset filters": "Réinitialiser les filtres",\n // download status\n Verifing: "Vérification",\n "Verify Pending": "Vérification en attente",\n // starred properties\n "Quick Access Settings": "Paramètres d\'accès rapide",\n Save: "Sauvegarder",\n "Save settings": "Sauvegarder les paramètres",\n "Currently no download in line to display, use the":\n "Aucun téléchargement dans la file d\'attente, utilisez le bouton de téléchargement",\n "download button to start downloading files!": "pour commencer à télécharger des fichiers !",\n Peers: "Pairs",\n "More Info": "Plus d\'infos",\n Remove: "Supprimer",\n "# of": "# parmi",\n Length: "Longueur",\n // modals\n "Add Downloads By URIs": "Ajouter des téléchargements depuis des URIs",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "Vous pouvez ajouter plusieurs téléchargements (fichiers) en même temps, en mettant une URI pour chaque fichier sur une nouvelle ligne",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "Vous pouvez aussi ajouter plusieurs URIs (mirroirs) pour le *même* fichier. Pour ce faire, séparez les URIs par un espace.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "Une URI peut être HTTP(S)/FTP/BitTorrent-Magnet.",\n "Download settings": "Paramètres de téléchargement",\n "Advanced settings": "Paramètres avancés",\n Cancel: "Annuler",\n Start: "Démarrer",\n Choose: "Choisir",\n "Quick Access (shown on the main page)": "Accès rapide (affiché sur la page principale",\n // add torrent modal\n "Add Downloads By Torrents": "Ajouter des téléchargements à partir de fichiers Torrent",\n "- Select the torrent from the local filesystem to start the download.":\n "- Sélectionnez le torrent depuis votre système de fichier local pour commencer le téléchargement.",\n "- You can select multiple torrents to start multiple downloads.":\n "Vous pouvez sélectionner plusieurs torrents pour commencer plusieurs téléchargements.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "Pour ajouter une URL BitTorrent-Magnet, utilisez l\'option Ajouter par URIs et ajoutez-la à ce niveau.",\n "Select Torrents": "Sélectionner des Torrents",\n "Select a Torrent": "Sélectionner un Torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Ajouter des téléchargements par Metaliens",\n "Select Metalinks": "Sélectionner des Métaliens",\n "- Select the Metalink from the local filesystem to start the download.":\n "Sélectionner le Métalien depuis votre système de fichier local pour commencer le téléchargement.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "Vous pouvez sélectionner plusieurs Métaliens pour commencer plusieurs téléchargements.",\n "Select a Metalink": "Sélectionner un Métalien",\n // select file modal\n "Choose files to start download for":\n "Sélectionner les fichiers pour lesquels commencer le téléchargement.",\n "Select to download": "Sélectionner pour télécharger",\n // settings modal\n "Aria2 RPC host and port": "Hôte et ports Aria2 RPC",\n "Enter the host": "Entrer l\'hôte",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Entrer l\'IP ou le nom DNS du serveur sur lequel est lancé le RPC pour Aria2 (défaut : localhost)",\n "Enter the port": "Entrer le port",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Entrer le port du serveur sur lequel tourne le RPC pour Aria2 (défaut : 6800)",\n "Enter the RPC path": "Entrer le chemin vers le RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Entrer le chemin final pour le RPC Aria2 (défaut : /jsonrpc)",\n "SSL/TLS encryption": "Chiffrage SSL/TLS",\n "Enable SSL/TLS encryption": "Activer le chiffrage SSL/TLS",\n "Enter the secret token (optional)": "Entrer le token secret (optionnel)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Entrer le token secret pour le RPC Aria2 (laisser vide si l\'authentification n\'est pas activée)",\n "Enter the username (optional)": "Entrer le nom d\'utilisateur (optionnel)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Entrer le nom d\'utilisateur RPC Aria2 (laisser vide si l\'authentification n\'est pas activée)",\n "Enter the password (optional)": "Entrer le mot de passe (optionnel)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Entrer le mot de passe RPC Aria2 (laisser vide si l\'authentification n\'est pas activée)",\n "Enter base URL (optional)": "Entrez l\'URL de base",\n "Direct Download": "Téléchargement direct",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "S\'ils sont fournis, les liens seront créés pour activer le téléchargement direct depuis le serveur Aria2",\n "(Requires appropriate webserver to be configured.)":\n "(Nécessite un serveur web approprié pour être configuré)",\n "Save Connection configuration": "Sauvegarder la configuration de connexion",\n Filter: "Filtre",\n // server info modal\n "Aria2 server info": "Infos serveur Aria2",\n "Aria2 Version": "Version Aria2",\n "Features Enabled": "Fonctionnalités activées",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Pour télécharger la dernière version du projet, signaler des problèmes ou pour contribuer, aller à l\'adresse",\n "Or you can open the latest version in the browser through":\n "Ou vous pouvez ouvrir la dernière version dans le navigateur depuis",\n Close: "Fermer",\n // lables\n "Download status": "Statut de téléchargement",\n "Download Speed": "Vitesse de téléchargement",\n "Upload Speed": "Vitesse d\'envoi",\n "Estimated time": "Temps estimé",\n "Download Size": "Taille du téléchargement",\n Downloaded: "Téléchargé",\n Progress: "Avancement",\n "Download Path": "Chemin de téléchargement",\n Uploaded: "Envoyé",\n "Download GID": "GID du téléchargement",\n "Number of Pieces": "Nombre de pièces",\n "Piece Length": "Taille de la pièce",\n "Shutdown Server": "Arrêter le serveur",\n\n "The last connection attempt was unsuccessful. Trying another configuration":\n "La dernière tentative de connexion a échoué. Essai d\'une autre configuration",\n "Oh Snap!": "Oh non !",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Impossible de se connecter au serveur RPC d\'aria2. Nouvel essai dans 10 secondes. Vous voudrez peut-être vérifier les paramètres de connexion en allant dans Paramètres > Paramètres de connexion",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "Erreur d\'authentification lors de la connexion au serveur RPC d\'aria2. Nouvel essai dans 10 secondes. Vous voudrez peut-être confirmer les renseignements d\'authentification en allant dans Paramètres > Paramètres de connexion",\n "Successfully connected to Aria2 through its remote RPC …":\n "Connexion réussie à aria2 via son interface RPC …",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Connexion réussie à aria2 via l\'interface RPC, cependant la connexion n\'est toujours pas sécurisée. Pour une sécurité complète, essayez d\'ajouter un token secret d\'autorisation en lançant aria2 (à l\'aide de l\'option --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Tentative de connexion à aria2 avec la nouvelle configuration",\n "Remove {{name}} and associated meta-data?": "Supprimer {{name}} et les métadonnées associées"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL2ZyX0ZSLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9mcl9GUi5qcz85OTc0Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5mcl9GUiA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJSZWNoZXJjaGVyXCIsXG4gIC8vIE5hdiBtZW51XG4gIEFkZDogXCJBam91dGVyXCIsXG4gIFwiQnkgVVJJc1wiOiBcIlBhciBVUklzXCIsXG4gIFwiQnkgVG9ycmVudHNcIjogXCJQYXIgVG9ycmVudHNcIixcbiAgXCJCeSBNZXRhbGlua3NcIjogXCJQYXIgTWV0YWxpZW5zXCIsXG4gIE1hbmFnZTogXCJHw6lyZXJcIixcbiAgXCJQYXVzZSBBbGxcIjogXCJUb3V0IHN1c3BlbmRyZVwiLFxuICBcIlJlc3VtZSBQYXVzZWRcIjogXCJSZXByZW5kcmVcIixcbiAgXCJQdXJnZSBDb21wbGV0ZWRcIjogXCJOZXR0b3llciBsZXMgZmljaGllcnMgY29tcGzDqXTDqXNcIixcbiAgU2V0dGluZ3M6IFwiUGFyYW3DqHRyZXNcIixcbiAgXCJDb25uZWN0aW9uIFNldHRpbmdzXCI6IFwiUGFyYW3DqHRyZXMgZGUgY29ubmV4aW9uXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwiUGFyYW3DqHRyZXMgZ2xvYmF1eFwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiSW5mb3JtYXRpb25zIHNlcnZldXJcIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcIsOAIHByb3BvcyBldCBjb250cmlidWVyXCIsXG4gIFwiVG9nZ2xlIG5hdmlnYXRpb25cIjogXCJCYXNjdWxlciBsYSBuYXZpZ2F0aW9uXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwiQXV0cmVzXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCJTdGF0aXN0aXF1ZXMgZ2xvYmFsZXNcIixcbiAgQWJvdXQ6IFwiw4AgcHJvcG9zXCIsXG4gIERpc3BsYXlpbmc6IFwiQWZmaWNoYWdlIGRlXCIsXG4gIG9mOiBcInBhcm1pXCIsXG4gIGRvd25sb2FkczogXCJ0w6lsw6ljaGFyZ2VtZW50c1wiLFxuICBMYW5ndWFnZTogXCJMYW5ndWVcIixcbiAgLy8gZG93bmxvYWQgZmlsdGVyc1xuICBcIkRvd25sb2FkIEZpbHRlcnNcIjogXCJGaWx0cmVzIGRlIHTDqWzDqWNoYXJnZW1lbnRcIixcbiAgUnVubmluZzogXCJFbiBjb3Vyc1wiLFxuICBBY3RpdmU6IFwiQWN0aWZzXCIsXG4gIFdhaXRpbmc6IFwiRW4gYXR0ZW50ZVwiLFxuICBDb21wbGV0ZTogXCJDb21wbMOpdMOpc1wiLFxuICBFcnJvcjogXCJFcnJldXJzXCIsXG4gIFBhdXNlZDogXCJFbiBwYXVzZVwiLFxuICBSZW1vdmVkOiBcIlN1cHByaW3DqXNcIixcbiAgXCJIaWRlIGxpbmtlZCBtZXRhLWRhdGFcIjogXCJDYWNoZXIgbGVzIG3DqXRhZG9ubsOpZXMgbGnDqWVzXCIsXG4gIFRvZ2dsZTogXCJCYXNjdWxlclwiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCJSw6lpbml0aWFsaXNlciBsZXMgZmlsdHJlc1wiLFxuICAvLyBkb3dubG9hZCBzdGF0dXNcbiAgVmVyaWZpbmc6IFwiVsOpcmlmaWNhdGlvblwiLFxuICBcIlZlcmlmeSBQZW5kaW5nXCI6IFwiVsOpcmlmaWNhdGlvbiBlbiBhdHRlbnRlXCIsXG4gIC8vIHN0YXJyZWQgcHJvcGVydGllc1xuICBcIlF1aWNrIEFjY2VzcyBTZXR0aW5nc1wiOiBcIlBhcmFtw6h0cmVzIGQnYWNjw6hzIHJhcGlkZVwiLFxuICBTYXZlOiBcIlNhdXZlZ2FyZGVyXCIsXG4gIFwiU2F2ZSBzZXR0aW5nc1wiOiBcIlNhdXZlZ2FyZGVyIGxlcyBwYXJhbcOodHJlc1wiLFxuICBcIkN1cnJlbnRseSBubyBkb3dubG9hZCBpbiBsaW5lIHRvIGRpc3BsYXksIHVzZSB0aGVcIjpcbiAgICBcIkF1Y3VuIHTDqWzDqWNoYXJnZW1lbnQgZGFucyBsYSBmaWxlIGQnYXR0ZW50ZSwgdXRpbGlzZXogbGUgYm91dG9uIGRlIHTDqWzDqWNoYXJnZW1lbnRcIixcbiAgXCJkb3dubG9hZCBidXR0b24gdG8gc3RhcnQgZG93bmxvYWRpbmcgZmlsZXMhXCI6IFwicG91ciBjb21tZW5jZXIgw6AgdMOpbMOpY2hhcmdlciBkZXMgZmljaGllcnMgIVwiLFxuICBQZWVyczogXCJQYWlyc1wiLFxuICBcIk1vcmUgSW5mb1wiOiBcIlBsdXMgZCdpbmZvc1wiLFxuICBSZW1vdmU6IFwiU3VwcHJpbWVyXCIsXG4gIFwiIyBvZlwiOiBcIiMgcGFybWlcIixcbiAgTGVuZ3RoOiBcIkxvbmd1ZXVyXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIkFqb3V0ZXIgZGVzIHTDqWzDqWNoYXJnZW1lbnRzIGRlcHVpcyBkZXMgVVJJc1wiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCJWb3VzIHBvdXZleiBham91dGVyIHBsdXNpZXVycyB0w6lsw6ljaGFyZ2VtZW50cyAoZmljaGllcnMpIGVuIG3Dqm1lIHRlbXBzLCBlbiBtZXR0YW50IHVuZSBVUkkgcG91ciBjaGFxdWUgZmljaGllciBzdXIgdW5lIG5vdXZlbGxlIGxpZ25lXCIsXG4gIFwiLSBZb3UgY2FuIGFsc28gYWRkIG11bHRpcGxlIFVSSXMgKG1pcnJvcnMpIGZvciB0aGUgKnNhbWUqIGZpbGUuIFRvIGRvIHRoaXMsIHNlcGFyYXRlIHRoZSBVUklzIGJ5IGEgc3BhY2UuXCI6XG4gICAgXCJWb3VzIHBvdXZleiBhdXNzaSBham91dGVyIHBsdXNpZXVycyBVUklzIChtaXJyb2lycykgcG91ciBsZSAqbcOqbWUqIGZpY2hpZXIuIFBvdXIgY2UgZmFpcmUsIHPDqXBhcmV6IGxlcyBVUklzIHBhciB1biBlc3BhY2UuXCIsXG4gIFwiLSBBIFVSSSBjYW4gYmUgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCI6XG4gICAgXCJVbmUgVVJJIHBldXQgw6p0cmUgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCIsXG4gIFwiRG93bmxvYWQgc2V0dGluZ3NcIjogXCJQYXJhbcOodHJlcyBkZSB0w6lsw6ljaGFyZ2VtZW50XCIsXG4gIFwiQWR2YW5jZWQgc2V0dGluZ3NcIjogXCJQYXJhbcOodHJlcyBhdmFuY8Opc1wiLFxuICBDYW5jZWw6IFwiQW5udWxlclwiLFxuICBTdGFydDogXCJEw6ltYXJyZXJcIixcbiAgQ2hvb3NlOiBcIkNob2lzaXJcIixcbiAgXCJRdWljayBBY2Nlc3MgKHNob3duIG9uIHRoZSBtYWluIHBhZ2UpXCI6IFwiQWNjw6hzIHJhcGlkZSAoYWZmaWNow6kgc3VyIGxhIHBhZ2UgcHJpbmNpcGFsZVwiLFxuICAvLyBhZGQgdG9ycmVudCBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgVG9ycmVudHNcIjogXCJBam91dGVyIGRlcyB0w6lsw6ljaGFyZ2VtZW50cyDDoCBwYXJ0aXIgZGUgZmljaGllcnMgVG9ycmVudFwiLFxuICBcIi0gU2VsZWN0IHRoZSB0b3JyZW50IGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiLSBTw6lsZWN0aW9ubmV6IGxlIHRvcnJlbnQgZGVwdWlzIHZvdHJlIHN5c3TDqG1lIGRlIGZpY2hpZXIgbG9jYWwgcG91ciBjb21tZW5jZXIgbGUgdMOpbMOpY2hhcmdlbWVudC5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIlZvdXMgcG91dmV6IHPDqWxlY3Rpb25uZXIgcGx1c2lldXJzIHRvcnJlbnRzIHBvdXIgY29tbWVuY2VyIHBsdXNpZXVycyB0w6lsw6ljaGFyZ2VtZW50cy5cIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOlxuICAgIFwiUG91ciBham91dGVyIHVuZSBVUkwgQml0VG9ycmVudC1NYWduZXQsIHV0aWxpc2V6IGwnb3B0aW9uIEFqb3V0ZXIgcGFyIFVSSXMgZXQgYWpvdXRlei1sYSDDoCBjZSBuaXZlYXUuXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwiU8OpbGVjdGlvbm5lciBkZXMgVG9ycmVudHNcIixcbiAgXCJTZWxlY3QgYSBUb3JyZW50XCI6IFwiU8OpbGVjdGlvbm5lciB1biBUb3JyZW50XCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwiQWpvdXRlciBkZXMgdMOpbMOpY2hhcmdlbWVudHMgcGFyIE1ldGFsaWVuc1wiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCJTw6lsZWN0aW9ubmVyIGRlcyBNw6l0YWxpZW5zXCIsXG4gIFwiLSBTZWxlY3QgdGhlIE1ldGFsaW5rIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiU8OpbGVjdGlvbm5lciBsZSBNw6l0YWxpZW4gZGVwdWlzIHZvdHJlIHN5c3TDqG1lIGRlIGZpY2hpZXIgbG9jYWwgcG91ciBjb21tZW5jZXIgbGUgdMOpbMOpY2hhcmdlbWVudC5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCJWb3VzIHBvdXZleiBzw6lsZWN0aW9ubmVyIHBsdXNpZXVycyBNw6l0YWxpZW5zIHBvdXIgY29tbWVuY2VyIHBsdXNpZXVycyB0w6lsw6ljaGFyZ2VtZW50cy5cIixcbiAgXCJTZWxlY3QgYSBNZXRhbGlua1wiOiBcIlPDqWxlY3Rpb25uZXIgdW4gTcOpdGFsaWVuXCIsXG4gIC8vIHNlbGVjdCBmaWxlIG1vZGFsXG4gIFwiQ2hvb3NlIGZpbGVzIHRvIHN0YXJ0IGRvd25sb2FkIGZvclwiOlxuICAgIFwiU8OpbGVjdGlvbm5lciBsZXMgZmljaGllcnMgcG91ciBsZXNxdWVscyBjb21tZW5jZXIgbGUgdMOpbMOpY2hhcmdlbWVudC5cIixcbiAgXCJTZWxlY3QgdG8gZG93bmxvYWRcIjogXCJTw6lsZWN0aW9ubmVyIHBvdXIgdMOpbMOpY2hhcmdlclwiLFxuICAvLyBzZXR0aW5ncyBtb2RhbFxuICBcIkFyaWEyIFJQQyBob3N0IGFuZCBwb3J0XCI6IFwiSMO0dGUgZXQgcG9ydHMgQXJpYTIgUlBDXCIsXG4gIFwiRW50ZXIgdGhlIGhvc3RcIjogXCJFbnRyZXIgbCdow7R0ZVwiLFxuICBcIkVudGVyIHRoZSBJUCBvciBETlMgbmFtZSBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IGxvY2FsaG9zdClcIjpcbiAgICBcIkVudHJlciBsJ0lQIG91IGxlIG5vbSBETlMgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGVzdCBsYW5jw6kgbGUgUlBDIHBvdXIgQXJpYTIgKGTDqWZhdXQgOiBsb2NhbGhvc3QpXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnRcIjogXCJFbnRyZXIgbGUgcG9ydFwiLFxuICBcIkVudGVyIHRoZSBwb3J0IG9mIHRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhlIFJQQyBmb3IgQXJpYTIgaXMgcnVubmluZyAoZGVmYXVsdDogNjgwMClcIjpcbiAgICBcIkVudHJlciBsZSBwb3J0IGR1IHNlcnZldXIgc3VyIGxlcXVlbCB0b3VybmUgbGUgUlBDIHBvdXIgQXJpYTIgKGTDqWZhdXQgOiA2ODAwKVwiLFxuICBcIkVudGVyIHRoZSBSUEMgcGF0aFwiOiBcIkVudHJlciBsZSBjaGVtaW4gdmVycyBsZSBSUENcIixcbiAgXCJFbnRlciB0aGUgcGF0aCBmb3IgdGhlIEFyaWEyIFJQQyBlbmRwb2ludCAoZGVmYXVsdDogL2pzb25ycGMpXCI6XG4gICAgXCJFbnRyZXIgbGUgY2hlbWluIGZpbmFsIHBvdXIgbGUgUlBDIEFyaWEyIChkw6lmYXV0IDogL2pzb25ycGMpXCIsXG4gIFwiU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiQ2hpZmZyYWdlIFNTTC9UTFNcIixcbiAgXCJFbmFibGUgU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiQWN0aXZlciBsZSBjaGlmZnJhZ2UgU1NML1RMU1wiLFxuICBcIkVudGVyIHRoZSBzZWNyZXQgdG9rZW4gKG9wdGlvbmFsKVwiOiBcIkVudHJlciBsZSB0b2tlbiBzZWNyZXQgKG9wdGlvbm5lbClcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHNlY3JldCB0b2tlbiAobGVhdmUgZW1wdHkgaWYgYXV0aGVudGljYXRpb24gaXMgbm90IGVuYWJsZWQpXCI6XG4gICAgXCJFbnRyZXIgbGUgdG9rZW4gc2VjcmV0IHBvdXIgbGUgUlBDIEFyaWEyIChsYWlzc2VyIHZpZGUgc2kgbCdhdXRoZW50aWZpY2F0aW9uIG4nZXN0IHBhcyBhY3RpdsOpZSlcIixcbiAgXCJFbnRlciB0aGUgdXNlcm5hbWUgKG9wdGlvbmFsKVwiOiBcIkVudHJlciBsZSBub20gZCd1dGlsaXNhdGV1ciAob3B0aW9ubmVsKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgdXNlcm5hbWUgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiRW50cmVyIGxlIG5vbSBkJ3V0aWxpc2F0ZXVyIFJQQyBBcmlhMiAobGFpc3NlciB2aWRlIHNpIGwnYXV0aGVudGlmaWNhdGlvbiBuJ2VzdCBwYXMgYWN0aXbDqWUpXCIsXG4gIFwiRW50ZXIgdGhlIHBhc3N3b3JkIChvcHRpb25hbClcIjogXCJFbnRyZXIgbGUgbW90IGRlIHBhc3NlIChvcHRpb25uZWwpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBwYXNzd29yZCAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJFbnRyZXIgbGUgbW90IGRlIHBhc3NlIFJQQyBBcmlhMiAobGFpc3NlciB2aWRlIHNpIGwnYXV0aGVudGlmaWNhdGlvbiBuJ2VzdCBwYXMgYWN0aXbDqWUpXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIkVudHJleiBsJ1VSTCBkZSBiYXNlXCIsXG4gIFwiRGlyZWN0IERvd25sb2FkXCI6IFwiVMOpbMOpY2hhcmdlbWVudCBkaXJlY3RcIixcbiAgXCJJZiBzdXBwbGllZCwgbGlua3Mgd2lsbCBiZSBjcmVhdGVkIHRvIGVuYWJsZSBkaXJlY3QgZG93bmxvYWQgZnJvbSB0aGUgQXJpYTIgc2VydmVyLlwiOlxuICAgIFwiUydpbHMgc29udCBmb3VybmlzLCBsZXMgbGllbnMgc2Vyb250IGNyw6nDqXMgcG91ciBhY3RpdmVyIGxlIHTDqWzDqWNoYXJnZW1lbnQgZGlyZWN0IGRlcHVpcyBsZSBzZXJ2ZXVyIEFyaWEyXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjpcbiAgICBcIihOw6ljZXNzaXRlIHVuIHNlcnZldXIgd2ViIGFwcHJvcHJpw6kgcG91ciDDqnRyZSBjb25maWd1csOpKVwiLFxuICBcIlNhdmUgQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6IFwiU2F1dmVnYXJkZXIgbGEgY29uZmlndXJhdGlvbiBkZSBjb25uZXhpb25cIixcbiAgRmlsdGVyOiBcIkZpbHRyZVwiLFxuICAvLyBzZXJ2ZXIgaW5mbyBtb2RhbFxuICBcIkFyaWEyIHNlcnZlciBpbmZvXCI6IFwiSW5mb3Mgc2VydmV1ciBBcmlhMlwiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCJWZXJzaW9uIEFyaWEyXCIsXG4gIFwiRmVhdHVyZXMgRW5hYmxlZFwiOiBcIkZvbmN0aW9ubmFsaXTDqXMgYWN0aXbDqWVzXCIsXG4gIC8vIGFib3V0IG1vZGFsXG4gIFwiVG8gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LCBhZGQgaXNzdWVzIG9yIHRvIGNvbnRyaWJ1dGUgYmFjaywgaGVhZCBvbiB0b1wiOlxuICAgIFwiUG91ciB0w6lsw6ljaGFyZ2VyIGxhIGRlcm5pw6hyZSB2ZXJzaW9uIGR1IHByb2pldCwgc2lnbmFsZXIgZGVzIHByb2Jsw6htZXMgb3UgcG91ciBjb250cmlidWVyLCBhbGxlciDDoCBsJ2FkcmVzc2VcIixcbiAgXCJPciB5b3UgY2FuIG9wZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGluIHRoZSBicm93c2VyIHRocm91Z2hcIjpcbiAgICBcIk91IHZvdXMgcG91dmV6IG91dnJpciBsYSBkZXJuacOocmUgdmVyc2lvbiBkYW5zIGxlIG5hdmlnYXRldXIgZGVwdWlzXCIsXG4gIENsb3NlOiBcIkZlcm1lclwiLFxuICAvLyBsYWJsZXNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCJTdGF0dXQgZGUgdMOpbMOpY2hhcmdlbWVudFwiLFxuICBcIkRvd25sb2FkIFNwZWVkXCI6IFwiVml0ZXNzZSBkZSB0w6lsw6ljaGFyZ2VtZW50XCIsXG4gIFwiVXBsb2FkIFNwZWVkXCI6IFwiVml0ZXNzZSBkJ2Vudm9pXCIsXG4gIFwiRXN0aW1hdGVkIHRpbWVcIjogXCJUZW1wcyBlc3RpbcOpXCIsXG4gIFwiRG93bmxvYWQgU2l6ZVwiOiBcIlRhaWxsZSBkdSB0w6lsw6ljaGFyZ2VtZW50XCIsXG4gIERvd25sb2FkZWQ6IFwiVMOpbMOpY2hhcmfDqVwiLFxuICBQcm9ncmVzczogXCJBdmFuY2VtZW50XCIsXG4gIFwiRG93bmxvYWQgUGF0aFwiOiBcIkNoZW1pbiBkZSB0w6lsw6ljaGFyZ2VtZW50XCIsXG4gIFVwbG9hZGVkOiBcIkVudm95w6lcIixcbiAgXCJEb3dubG9hZCBHSURcIjogXCJHSUQgZHUgdMOpbMOpY2hhcmdlbWVudFwiLFxuICBcIk51bWJlciBvZiBQaWVjZXNcIjogXCJOb21icmUgZGUgcGnDqGNlc1wiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcIlRhaWxsZSBkZSBsYSBwacOoY2VcIixcbiAgXCJTaHV0ZG93biBTZXJ2ZXJcIjogXCJBcnLDqnRlciBsZSBzZXJ2ZXVyXCIsXG5cbiAgXCJUaGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIHVuc3VjY2Vzc2Z1bC4gVHJ5aW5nIGFub3RoZXIgY29uZmlndXJhdGlvblwiOlxuICAgIFwiTGEgZGVybmnDqHJlIHRlbnRhdGl2ZSBkZSBjb25uZXhpb24gYSDDqWNob3XDqS4gRXNzYWkgZCd1bmUgYXV0cmUgY29uZmlndXJhdGlvblwiLFxuICBcIk9oIFNuYXAhXCI6IFwiT2ggbm9uICFcIixcbiAgXCJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgYXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIkltcG9zc2libGUgZGUgc2UgY29ubmVjdGVyIGF1IHNlcnZldXIgUlBDIGQnYXJpYTIuIE5vdXZlbCBlc3NhaSBkYW5zIDEwIHNlY29uZGVzLiBWb3VzIHZvdWRyZXogcGV1dC3DqnRyZSB2w6lyaWZpZXIgbGVzIHBhcmFtw6h0cmVzIGRlIGNvbm5leGlvbiBlbiBhbGxhbnQgZGFucyBQYXJhbcOodHJlcyA+IFBhcmFtw6h0cmVzIGRlIGNvbm5leGlvblwiLFxuICBcIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aGlsZSBjb25uZWN0aW5nIHRvIEFyaWEyIFJQQyBzZXJ2ZXIuIFdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4gWW91IG1pZ2h0IHdhbnQgdG8gY29uZmlybSB5b3VyIGF1dGhlbnRpY2F0aW9uIGRldGFpbHMgYnkgZ29pbmcgdG8gU2V0dGluZ3MgPiBDb25uZWN0aW9uIFNldHRpbmdzXCI6XG4gICAgXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uIGxvcnMgZGUgbGEgY29ubmV4aW9uIGF1IHNlcnZldXIgUlBDIGQnYXJpYTIuIE5vdXZlbCBlc3NhaSBkYW5zIDEwIHNlY29uZGVzLiBWb3VzIHZvdWRyZXogcGV1dC3DqnRyZSBjb25maXJtZXIgbGVzIHJlbnNlaWduZW1lbnRzIGQnYXV0aGVudGlmaWNhdGlvbiBlbiBhbGxhbnQgZGFucyBQYXJhbcOodHJlcyA+IFBhcmFtw6h0cmVzIGRlIGNvbm5leGlvblwiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCBpdHMgcmVtb3RlIFJQQyDigKZcIjpcbiAgICBcIkNvbm5leGlvbiByw6l1c3NpZSDDoCBhcmlhMiB2aWEgc29uIGludGVyZmFjZSBSUEMg4oCmXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIHJlbW90ZSBSUEMsIGhvd2V2ZXIgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgaW5zZWN1cmUuIEZvciBjb21wbGV0ZSBzZWN1cml0eSB0cnkgYWRkaW5nIGFuIGF1dGhvcml6YXRpb24gc2VjcmV0IHRva2VuIHdoaWxlIHN0YXJ0aW5nIEFyaWEyICh0aHJvdWdoIHRoZSBmbGFnIC0tcnBjLXNlY3JldClcIjpcbiAgICBcIkNvbm5leGlvbiByw6l1c3NpZSDDoCBhcmlhMiB2aWEgbCdpbnRlcmZhY2UgUlBDLCBjZXBlbmRhbnQgbGEgY29ubmV4aW9uIG4nZXN0IHRvdWpvdXJzIHBhcyBzw6ljdXJpc8OpZS4gUG91ciB1bmUgc8OpY3VyaXTDqSBjb21wbMOodGUsIGVzc2F5ZXogZCdham91dGVyIHVuIHRva2VuIHNlY3JldCBkJ2F1dG9yaXNhdGlvbiBlbiBsYW7Dp2FudCBhcmlhMiAow6AgbCdhaWRlIGRlIGwnb3B0aW9uIC0tcnBjLXNlY3JldClcIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwiVGVudGF0aXZlIGRlIGNvbm5leGlvbiDDoCBhcmlhMiBhdmVjIGxhIG5vdXZlbGxlIGNvbmZpZ3VyYXRpb25cIixcbiAgXCJSZW1vdmUge3tuYW1lfX0gYW5kIGFzc29jaWF0ZWQgbWV0YS1kYXRhP1wiOiBcIlN1cHByaW1lciB7e25hbWV9fSBldCBsZXMgbcOpdGFkb25uw6llcyBhc3NvY2nDqWVzXCJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/translate/fr_FR.js\n'
);
/***/
},
/***/ "./src/js/translate/id_ID.js":
/*!***********************************!*\
!*** ./src/js/translate/id_ID.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.id_ID = {\n // replace en_US to ll_CC, examples: zh_CN, de_AT.\n // header\n Search: "Telusuri",\n // Nav menu\n Add: "Tambah",\n "By URIs": "Dari URI",\n "By Torrents": "Dari Torrent",\n "By Metalinks": "Dari Metalink",\n Manage: "Kelola",\n "Pause All": "Jeda Semua",\n "Resume Paused": "Lanjut yang Dijeda",\n "Purge Completed": "Hapus yang Terunduh",\n "Shutdown Server": "Matikan Peladen",\n Settings: "Pengaturan",\n "Connection Settings": "Pengaturan Koneksi",\n "Global Settings": "Pengaturan Global",\n "Server info": "Info peladen",\n "About and contribute": "Tentang dan kontribusi",\n "Toggle navigation": "Alihkan navigasi",\n // body\n // nav side bar\n Miscellaneous: "Lain-lain",\n "Global Statistics": "Statistik Global",\n About: "Tentang",\n Displaying: "Tampilan",\n of: "dari",\n downloads: "unduhan",\n Language: "Bahasa",\n // download filters\n "Download Filters": "Saring Unduhan",\n Running: "Berjalan",\n Active: "Aktif",\n Waiting: "Menunggu",\n Complete: "Selesai",\n Error: "Galat",\n Paused: "Dijeda",\n Removed: "Dihapus",\n "Hide linked meta-data": "Sembunyikan tautan meta-data",\n Toggle: "Tombol alihan",\n "Reset filters": "Reset penyaring",\n // download status\n Verifing: "Memverifikasi",\n "Verify Pending": "Verifikasi Ditunda",\n // starred properties\n "Quick Access Settings": "Pengaturan Akses Cepat",\n Save: "Simpan",\n "Save settings": "Simpan pengaturan",\n "Currently no download in line to display, use the":\n "Sekarang tak ada unduhan yang ditampilkan, gunakan",\n "download button to start downloading files!": "tombol unduh untuk mulai mengunduh berkas!",\n Peers: "Peer",\n "More Info": "Info Lengkap",\n Remove: "Hapus",\n "# of": "# dari",\n Length: "Ukuran",\n // modals\n "Add Downloads By URIs": "Unduh dari URI",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Anda dapat menambah banyak unduhan (berkas) sekali waktu dg menaruh URI setiap berkas dlm baris terpisah.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Anda juga dapat menambah banyak URI (cermin) untuk berkas yang *sama*. Pisahkan URI dengan spasi.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- URI dapat berbentuk HTTP(S)/FTP/BitTorrent-Magnet.",\n "Download settings": "Pengaturan unduhan",\n "Advanced settings": "Pengaturan mahir",\n Cancel: "Batal",\n Start: "Mulai",\n Choose: "Pilih",\n "Quick Access (shown on the main page)": "Akses Cepat (terlihat di laman utama)",\n // add torrent modal\n "Add Downloads By Torrents": "Unduh dari Torrent",\n "- Select the torrent from the local filesystem to start the download.":\n "- Pilih torrent dari sistem berkas lokal untuk mulai mengunduh.",\n "- You can select multiple torrents to start multiple downloads.":\n "Anda dapat memilih banyak torrent untuk memulai multi unduh.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "Untuk menambah BitTorrent-Magnet URL, pakai opsi Tambah dari URI dan tambahkan di situ.",\n "Select Torrents": "Pilih Torrent",\n "Select a Torrent": "Pilih Torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Unduh dari Metalink",\n "Select Metalinks": "Pilih Metalink",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Pilih Metalink dari sistem berkas lokal untuk mulai mengunduh.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Anda dapat memilih banyak Metalink untuk mulai multi unduh.",\n "Select a Metalink": "Pilih Metalink",\n // select file modal\n "Choose files to start download for": "Pilih berkas untuk mulai mengunduh",\n "Select to download": "Pilih untuk mengunduh",\n // settings modal\n "Aria2 RPC host and port": "Port dan host RPC Aria2",\n "Enter the host": "Masukkan host",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Masukkan IP atau nama DNS peladen tempat RPC Aria2 berjalan (asali: localhost)",\n "Enter the port": "Masukkan porta",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Masukkan porta peladen tempat RPC Aria2 berjalan (asali: 6800)",\n "Enter the RPC path": "Masukkan path RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Masukkan path untuk endpoint RPC Aria2 (asali: /jsonrpc)",\n "SSL/TLS encryption": "Enkripsi SSL/TLS",\n "Enable SSL/TLS encryption": "Aktifkan enkripsi SSL/TLS",\n "Enter the secret token (optional)": "Masukkan token rahasia (opsional)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Masukkan token rahasia RPC Aria2 (kosongkan jika otentifikasi tidak aktif)",\n "Enter the username (optional)": "Masukkan username (opsional)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Masukkan username RPC Aria2 (kosongkan jika otentifikasi tidak aktif)",\n "Enter the password (optional)": "Masukkan kata sandi (opsional)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Masukkan kata sandi RPC Aria2 (kosongkan jika otentifikasi tidak aktif)",\n "Enter base URL (optional)": "Masukkan URL dasar (opsional)",\n "Direct Download": "Unduh Langsung",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Jika tersedia, tautan akan dibuat untuk mengaktifkan unduhan langsung dari peladen Aria2.",\n "(Requires appropriate webserver to be configured.)":\n "(Mewajibkan webserver yang perlu dikonfigurasi)",\n "Save Connection configuration": "Simpan konfigurasi Koneksi",\n Filter: "Saring",\n // server info modal\n "Aria2 server info": "Info peladen Aria2",\n "Aria2 Version": "Versi Aria2",\n "Features Enabled": "Fitur yang Aktif",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Untuk mengunduh versi terkini proyek, tambahkan isu atau kontribusi balik ke",\n "Or you can open the latest version in the browser through":\n "Atau Anda dapat membuka versi terkini via peramban lewat",\n Close: "Tutup",\n // labels\n "Download status": "Status unduh",\n "Download Speed": "Kecepatan unduh",\n "Upload Speed": "Kecepatan unggah",\n "Estimated time": "Waktu estimasi",\n "Download Size": "Ukuran unduh",\n Downloaded: "Terunduh",\n Progress: "Proses",\n "Download Path": "Path unduh",\n Uploaded: "Terunggah",\n "Download GID": "GID unduh",\n "Number of Pieces": "Jumlah Bagian",\n "Piece Length": "Ukuran Bagian",\n\n //alerts\n "The last connection attempt was unsuccessful. Trying another configuration":\n "Usaha koneksi terakhir gagal. Coba konfigurasi lain",\n "Oh Snap!": "Oh Sial!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Tak dapat terkoneksi ke peladen RPC aria2. Akan diulang dalam 10 detik. Anda mungkin ingin menguji pengaturan koneksi melalui Pengaturan > Pengaturan Koneksi",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "Otentifikasi gagal saat membuka koneksi ke peladen RPC Aria2. Akan diulang dalam 10 detik. Anda mungkin ingin mengonfirmasi detail otentifikasi di Pengaturan > Pengaturan Koneksi",\n "Successfully connected to Aria2 through its remote RPC …":\n "Sukses terkoneksi ke Aria2 melalui remot RPC …",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Sukses terkoneksi ke Aria2 melalui remot RPC, bagaimanapun koneksi masih tidak aman. Untuk melengkapi keamanan coba tambahkan token rahasia otorisasi saat memulai Aria2 (lewat flag --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Mencoba koneksi ke aria2 menggunakan konfigurasi koneksi baru",\n // {{name}} refers to the download name, do not modify.\n "Remove {{name}} and associated meta-data?": "Hapus {{name}} dan meta-data yang berhubungan?"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL2lkX0lELmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9pZF9JRC5qcz9iNGMxIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5pZF9JRCA9IHtcbiAgLy8gcmVwbGFjZSBlbl9VUyB0byBsbF9DQywgZXhhbXBsZXM6IHpoX0NOLCBkZV9BVC5cbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJUZWx1c3VyaVwiLFxuICAvLyBOYXYgbWVudVxuICBBZGQ6IFwiVGFtYmFoXCIsXG4gIFwiQnkgVVJJc1wiOiBcIkRhcmkgVVJJXCIsXG4gIFwiQnkgVG9ycmVudHNcIjogXCJEYXJpIFRvcnJlbnRcIixcbiAgXCJCeSBNZXRhbGlua3NcIjogXCJEYXJpIE1ldGFsaW5rXCIsXG4gIE1hbmFnZTogXCJLZWxvbGFcIixcbiAgXCJQYXVzZSBBbGxcIjogXCJKZWRhIFNlbXVhXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIkxhbmp1dCB5YW5nIERpamVkYVwiLFxuICBcIlB1cmdlIENvbXBsZXRlZFwiOiBcIkhhcHVzIHlhbmcgVGVydW5kdWhcIixcbiAgXCJTaHV0ZG93biBTZXJ2ZXJcIjogXCJNYXRpa2FuIFBlbGFkZW5cIixcbiAgU2V0dGluZ3M6IFwiUGVuZ2F0dXJhblwiLFxuICBcIkNvbm5lY3Rpb24gU2V0dGluZ3NcIjogXCJQZW5nYXR1cmFuIEtvbmVrc2lcIixcbiAgXCJHbG9iYWwgU2V0dGluZ3NcIjogXCJQZW5nYXR1cmFuIEdsb2JhbFwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiSW5mbyBwZWxhZGVuXCIsXG4gIFwiQWJvdXQgYW5kIGNvbnRyaWJ1dGVcIjogXCJUZW50YW5nIGRhbiBrb250cmlidXNpXCIsXG4gIFwiVG9nZ2xlIG5hdmlnYXRpb25cIjogXCJBbGloa2FuIG5hdmlnYXNpXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwiTGFpbi1sYWluXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCJTdGF0aXN0aWsgR2xvYmFsXCIsXG4gIEFib3V0OiBcIlRlbnRhbmdcIixcbiAgRGlzcGxheWluZzogXCJUYW1waWxhblwiLFxuICBvZjogXCJkYXJpXCIsXG4gIGRvd25sb2FkczogXCJ1bmR1aGFuXCIsXG4gIExhbmd1YWdlOiBcIkJhaGFzYVwiLFxuICAvLyBkb3dubG9hZCBmaWx0ZXJzXG4gIFwiRG93bmxvYWQgRmlsdGVyc1wiOiBcIlNhcmluZyBVbmR1aGFuXCIsXG4gIFJ1bm5pbmc6IFwiQmVyamFsYW5cIixcbiAgQWN0aXZlOiBcIkFrdGlmXCIsXG4gIFdhaXRpbmc6IFwiTWVudW5nZ3VcIixcbiAgQ29tcGxldGU6IFwiU2VsZXNhaVwiLFxuICBFcnJvcjogXCJHYWxhdFwiLFxuICBQYXVzZWQ6IFwiRGlqZWRhXCIsXG4gIFJlbW92ZWQ6IFwiRGloYXB1c1wiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcIlNlbWJ1bnlpa2FuIHRhdXRhbiBtZXRhLWRhdGFcIixcbiAgVG9nZ2xlOiBcIlRvbWJvbCBhbGloYW5cIixcbiAgXCJSZXNldCBmaWx0ZXJzXCI6IFwiUmVzZXQgcGVueWFyaW5nXCIsXG4gIC8vIGRvd25sb2FkIHN0YXR1c1xuICBWZXJpZmluZzogXCJNZW12ZXJpZmlrYXNpXCIsXG4gIFwiVmVyaWZ5IFBlbmRpbmdcIjogXCJWZXJpZmlrYXNpIERpdHVuZGFcIixcbiAgLy8gc3RhcnJlZCBwcm9wZXJ0aWVzXG4gIFwiUXVpY2sgQWNjZXNzIFNldHRpbmdzXCI6IFwiUGVuZ2F0dXJhbiBBa3NlcyBDZXBhdFwiLFxuICBTYXZlOiBcIlNpbXBhblwiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCJTaW1wYW4gcGVuZ2F0dXJhblwiLFxuICBcIkN1cnJlbnRseSBubyBkb3dubG9hZCBpbiBsaW5lIHRvIGRpc3BsYXksIHVzZSB0aGVcIjpcbiAgICBcIlNla2FyYW5nIHRhayBhZGEgdW5kdWhhbiB5YW5nIGRpdGFtcGlsa2FuLCBndW5ha2FuXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcInRvbWJvbCB1bmR1aCB1bnR1ayBtdWxhaSBtZW5ndW5kdWggYmVya2FzIVwiLFxuICBQZWVyczogXCJQZWVyXCIsXG4gIFwiTW9yZSBJbmZvXCI6IFwiSW5mbyBMZW5na2FwXCIsXG4gIFJlbW92ZTogXCJIYXB1c1wiLFxuICBcIiMgb2ZcIjogXCIjIGRhcmlcIixcbiAgTGVuZ3RoOiBcIlVrdXJhblwiLFxuICAvLyBtb2RhbHNcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IFVSSXNcIjogXCJVbmR1aCBkYXJpIFVSSVwiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCItIEFuZGEgZGFwYXQgbWVuYW1iYWggYmFueWFrIHVuZHVoYW4gKGJlcmthcykgc2VrYWxpIHdha3R1IGRnIG1lbmFydWggVVJJIHNldGlhcCBiZXJrYXMgZGxtIGJhcmlzIHRlcnBpc2FoLlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSBBbmRhIGp1Z2EgZGFwYXQgbWVuYW1iYWggYmFueWFrIFVSSSAoY2VybWluKSB1bnR1ayBiZXJrYXMgeWFuZyAqc2FtYSouIFBpc2Foa2FuIFVSSSBkZW5nYW4gc3Bhc2kuXCIsXG4gIFwiLSBBIFVSSSBjYW4gYmUgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCI6XG4gICAgXCItIFVSSSBkYXBhdCBiZXJiZW50dWsgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCIsXG4gIFwiRG93bmxvYWQgc2V0dGluZ3NcIjogXCJQZW5nYXR1cmFuIHVuZHVoYW5cIixcbiAgXCJBZHZhbmNlZCBzZXR0aW5nc1wiOiBcIlBlbmdhdHVyYW4gbWFoaXJcIixcbiAgQ2FuY2VsOiBcIkJhdGFsXCIsXG4gIFN0YXJ0OiBcIk11bGFpXCIsXG4gIENob29zZTogXCJQaWxpaFwiLFxuICBcIlF1aWNrIEFjY2VzcyAoc2hvd24gb24gdGhlIG1haW4gcGFnZSlcIjogXCJBa3NlcyBDZXBhdCAodGVybGloYXQgZGkgbGFtYW4gdXRhbWEpXCIsXG4gIC8vIGFkZCB0b3JyZW50IG1vZGFsXG4gIFwiQWRkIERvd25sb2FkcyBCeSBUb3JyZW50c1wiOiBcIlVuZHVoIGRhcmkgVG9ycmVudFwiLFxuICBcIi0gU2VsZWN0IHRoZSB0b3JyZW50IGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiLSBQaWxpaCB0b3JyZW50IGRhcmkgc2lzdGVtIGJlcmthcyBsb2thbCB1bnR1ayBtdWxhaSBtZW5ndW5kdWguXCIsXG4gIFwiLSBZb3UgY2FuIHNlbGVjdCBtdWx0aXBsZSB0b3JyZW50cyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCJBbmRhIGRhcGF0IG1lbWlsaWggYmFueWFrIHRvcnJlbnQgdW50dWsgbWVtdWxhaSBtdWx0aSB1bmR1aC5cIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOlxuICAgIFwiVW50dWsgbWVuYW1iYWggQml0VG9ycmVudC1NYWduZXQgVVJMLCBwYWthaSBvcHNpIFRhbWJhaCBkYXJpIFVSSSBkYW4gdGFtYmFoa2FuIGRpIHNpdHUuXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwiUGlsaWggVG9ycmVudFwiLFxuICBcIlNlbGVjdCBhIFRvcnJlbnRcIjogXCJQaWxpaCBUb3JyZW50XCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwiVW5kdWggZGFyaSBNZXRhbGlua1wiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCJQaWxpaCBNZXRhbGlua1wiLFxuICBcIi0gU2VsZWN0IHRoZSBNZXRhbGluayBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIi0gUGlsaWggTWV0YWxpbmsgZGFyaSBzaXN0ZW0gYmVya2FzIGxva2FsIHVudHVrIG11bGFpIG1lbmd1bmR1aC5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItIEFuZGEgZGFwYXQgbWVtaWxpaCBiYW55YWsgTWV0YWxpbmsgdW50dWsgbXVsYWkgbXVsdGkgdW5kdWguXCIsXG4gIFwiU2VsZWN0IGEgTWV0YWxpbmtcIjogXCJQaWxpaCBNZXRhbGlua1wiLFxuICAvLyBzZWxlY3QgZmlsZSBtb2RhbFxuICBcIkNob29zZSBmaWxlcyB0byBzdGFydCBkb3dubG9hZCBmb3JcIjogXCJQaWxpaCBiZXJrYXMgdW50dWsgbXVsYWkgbWVuZ3VuZHVoXCIsXG4gIFwiU2VsZWN0IHRvIGRvd25sb2FkXCI6IFwiUGlsaWggdW50dWsgbWVuZ3VuZHVoXCIsXG4gIC8vIHNldHRpbmdzIG1vZGFsXG4gIFwiQXJpYTIgUlBDIGhvc3QgYW5kIHBvcnRcIjogXCJQb3J0IGRhbiBob3N0IFJQQyBBcmlhMlwiLFxuICBcIkVudGVyIHRoZSBob3N0XCI6IFwiTWFzdWtrYW4gaG9zdFwiLFxuICBcIkVudGVyIHRoZSBJUCBvciBETlMgbmFtZSBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IGxvY2FsaG9zdClcIjpcbiAgICBcIk1hc3Vra2FuIElQIGF0YXUgbmFtYSBETlMgcGVsYWRlbiB0ZW1wYXQgUlBDIEFyaWEyIGJlcmphbGFuIChhc2FsaTogbG9jYWxob3N0KVwiLFxuICBcIkVudGVyIHRoZSBwb3J0XCI6IFwiTWFzdWtrYW4gcG9ydGFcIixcbiAgXCJFbnRlciB0aGUgcG9ydCBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IDY4MDApXCI6XG4gICAgXCJNYXN1a2thbiBwb3J0YSBwZWxhZGVuIHRlbXBhdCBSUEMgQXJpYTIgYmVyamFsYW4gKGFzYWxpOiA2ODAwKVwiLFxuICBcIkVudGVyIHRoZSBSUEMgcGF0aFwiOiBcIk1hc3Vra2FuIHBhdGggUlBDXCIsXG4gIFwiRW50ZXIgdGhlIHBhdGggZm9yIHRoZSBBcmlhMiBSUEMgZW5kcG9pbnQgKGRlZmF1bHQ6IC9qc29ucnBjKVwiOlxuICAgIFwiTWFzdWtrYW4gcGF0aCB1bnR1ayBlbmRwb2ludCBSUEMgQXJpYTIgKGFzYWxpOiAvanNvbnJwYylcIixcbiAgXCJTU0wvVExTIGVuY3J5cHRpb25cIjogXCJFbmtyaXBzaSBTU0wvVExTXCIsXG4gIFwiRW5hYmxlIFNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIkFrdGlma2FuIGVua3JpcHNpIFNTTC9UTFNcIixcbiAgXCJFbnRlciB0aGUgc2VjcmV0IHRva2VuIChvcHRpb25hbClcIjogXCJNYXN1a2thbiB0b2tlbiByYWhhc2lhIChvcHNpb25hbClcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHNlY3JldCB0b2tlbiAobGVhdmUgZW1wdHkgaWYgYXV0aGVudGljYXRpb24gaXMgbm90IGVuYWJsZWQpXCI6XG4gICAgXCJNYXN1a2thbiB0b2tlbiByYWhhc2lhIFJQQyBBcmlhMiAoa29zb25na2FuIGppa2Egb3RlbnRpZmlrYXNpIHRpZGFrIGFrdGlmKVwiLFxuICBcIkVudGVyIHRoZSB1c2VybmFtZSAob3B0aW9uYWwpXCI6IFwiTWFzdWtrYW4gdXNlcm5hbWUgKG9wc2lvbmFsKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgdXNlcm5hbWUgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiTWFzdWtrYW4gdXNlcm5hbWUgUlBDIEFyaWEyIChrb3NvbmdrYW4gamlrYSBvdGVudGlmaWthc2kgdGlkYWsgYWt0aWYpXCIsXG4gIFwiRW50ZXIgdGhlIHBhc3N3b3JkIChvcHRpb25hbClcIjogXCJNYXN1a2thbiBrYXRhIHNhbmRpIChvcHNpb25hbClcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHBhc3N3b3JkIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIk1hc3Vra2FuIGthdGEgc2FuZGkgUlBDIEFyaWEyIChrb3NvbmdrYW4gamlrYSBvdGVudGlmaWthc2kgdGlkYWsgYWt0aWYpXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIk1hc3Vra2FuIFVSTCBkYXNhciAob3BzaW9uYWwpXCIsXG4gIFwiRGlyZWN0IERvd25sb2FkXCI6IFwiVW5kdWggTGFuZ3N1bmdcIixcbiAgXCJJZiBzdXBwbGllZCwgbGlua3Mgd2lsbCBiZSBjcmVhdGVkIHRvIGVuYWJsZSBkaXJlY3QgZG93bmxvYWQgZnJvbSB0aGUgQXJpYTIgc2VydmVyLlwiOlxuICAgIFwiSmlrYSB0ZXJzZWRpYSwgdGF1dGFuIGFrYW4gZGlidWF0IHVudHVrIG1lbmdha3RpZmthbiB1bmR1aGFuIGxhbmdzdW5nIGRhcmkgcGVsYWRlbiBBcmlhMi5cIixcbiAgXCIoUmVxdWlyZXMgYXBwcm9wcmlhdGUgd2Vic2VydmVyIHRvIGJlIGNvbmZpZ3VyZWQuKVwiOlxuICAgIFwiKE1ld2FqaWJrYW4gd2Vic2VydmVyIHlhbmcgcGVybHUgZGlrb25maWd1cmFzaSlcIixcbiAgXCJTYXZlIENvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOiBcIlNpbXBhbiBrb25maWd1cmFzaSBLb25la3NpXCIsXG4gIEZpbHRlcjogXCJTYXJpbmdcIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcIkluZm8gcGVsYWRlbiBBcmlhMlwiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCJWZXJzaSBBcmlhMlwiLFxuICBcIkZlYXR1cmVzIEVuYWJsZWRcIjogXCJGaXR1ciB5YW5nIEFrdGlmXCIsXG4gIC8vIGFib3V0IG1vZGFsXG4gIFwiVG8gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LCBhZGQgaXNzdWVzIG9yIHRvIGNvbnRyaWJ1dGUgYmFjaywgaGVhZCBvbiB0b1wiOlxuICAgIFwiVW50dWsgbWVuZ3VuZHVoIHZlcnNpIHRlcmtpbmkgcHJveWVrLCB0YW1iYWhrYW4gaXN1IGF0YXUga29udHJpYnVzaSBiYWxpayBrZVwiLFxuICBcIk9yIHlvdSBjYW4gb3BlbiB0aGUgbGF0ZXN0IHZlcnNpb24gaW4gdGhlIGJyb3dzZXIgdGhyb3VnaFwiOlxuICAgIFwiQXRhdSBBbmRhIGRhcGF0IG1lbWJ1a2EgdmVyc2kgdGVya2luaSB2aWEgcGVyYW1iYW4gbGV3YXRcIixcbiAgQ2xvc2U6IFwiVHV0dXBcIixcbiAgLy8gbGFiZWxzXG4gIFwiRG93bmxvYWQgc3RhdHVzXCI6IFwiU3RhdHVzIHVuZHVoXCIsXG4gIFwiRG93bmxvYWQgU3BlZWRcIjogXCJLZWNlcGF0YW4gdW5kdWhcIixcbiAgXCJVcGxvYWQgU3BlZWRcIjogXCJLZWNlcGF0YW4gdW5nZ2FoXCIsXG4gIFwiRXN0aW1hdGVkIHRpbWVcIjogXCJXYWt0dSBlc3RpbWFzaVwiLFxuICBcIkRvd25sb2FkIFNpemVcIjogXCJVa3VyYW4gdW5kdWhcIixcbiAgRG93bmxvYWRlZDogXCJUZXJ1bmR1aFwiLFxuICBQcm9ncmVzczogXCJQcm9zZXNcIixcbiAgXCJEb3dubG9hZCBQYXRoXCI6IFwiUGF0aCB1bmR1aFwiLFxuICBVcGxvYWRlZDogXCJUZXJ1bmdnYWhcIixcbiAgXCJEb3dubG9hZCBHSURcIjogXCJHSUQgdW5kdWhcIixcbiAgXCJOdW1iZXIgb2YgUGllY2VzXCI6IFwiSnVtbGFoIEJhZ2lhblwiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcIlVrdXJhbiBCYWdpYW5cIixcblxuICAvL2FsZXJ0c1xuICBcIlRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdCB3YXMgdW5zdWNjZXNzZnVsLiBUcnlpbmcgYW5vdGhlciBjb25maWd1cmF0aW9uXCI6XG4gICAgXCJVc2FoYSBrb25la3NpIHRlcmFraGlyIGdhZ2FsLiBDb2JhIGtvbmZpZ3VyYXNpIGxhaW5cIixcbiAgXCJPaCBTbmFwIVwiOiBcIk9oIFNpYWwhXCIsXG4gIFwiQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIGFyaWEyIFJQQyBzZXJ2ZXIuIFdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4gWW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhlIGNvbm5lY3Rpb24gc2V0dGluZ3MgYnkgZ29pbmcgdG8gU2V0dGluZ3MgPiBDb25uZWN0aW9uIFNldHRpbmdzXCI6XG4gICAgXCJUYWsgZGFwYXQgdGVya29uZWtzaSBrZSBwZWxhZGVuIFJQQyBhcmlhMi4gQWthbiBkaXVsYW5nIGRhbGFtIDEwIGRldGlrLiBBbmRhIG11bmdraW4gaW5naW4gbWVuZ3VqaSBwZW5nYXR1cmFuIGtvbmVrc2kgbWVsYWx1aSBQZW5nYXR1cmFuID4gUGVuZ2F0dXJhbiBLb25la3NpXCIsXG4gIFwiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGNvbm5lY3RpbmcgdG8gQXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjb25maXJtIHlvdXIgYXV0aGVudGljYXRpb24gZGV0YWlscyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIk90ZW50aWZpa2FzaSBnYWdhbCBzYWF0IG1lbWJ1a2Ega29uZWtzaSBrZSBwZWxhZGVuIFJQQyBBcmlhMi4gQWthbiBkaXVsYW5nIGRhbGFtIDEwIGRldGlrLiBBbmRhIG11bmdraW4gaW5naW4gbWVuZ29uZmlybWFzaSBkZXRhaWwgb3RlbnRpZmlrYXNpIGRpIFBlbmdhdHVyYW4gPiBQZW5nYXR1cmFuIEtvbmVrc2lcIixcbiAgXCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIEFyaWEyIHRocm91Z2ggaXRzIHJlbW90ZSBSUEMg4oCmXCI6XG4gICAgXCJTdWtzZXMgdGVya29uZWtzaSBrZSBBcmlhMiBtZWxhbHVpIHJlbW90IFJQQyDigKZcIixcbiAgXCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIEFyaWEyIHRocm91Z2ggcmVtb3RlIFJQQywgaG93ZXZlciB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBpbnNlY3VyZS4gRm9yIGNvbXBsZXRlIHNlY3VyaXR5IHRyeSBhZGRpbmcgYW4gYXV0aG9yaXphdGlvbiBzZWNyZXQgdG9rZW4gd2hpbGUgc3RhcnRpbmcgQXJpYTIgKHRocm91Z2ggdGhlIGZsYWcgLS1ycGMtc2VjcmV0KVwiOlxuICAgIFwiU3Vrc2VzIHRlcmtvbmVrc2kga2UgQXJpYTIgbWVsYWx1aSByZW1vdCBSUEMsIGJhZ2FpbWFuYXB1biBrb25la3NpIG1hc2loIHRpZGFrIGFtYW4uIFVudHVrIG1lbGVuZ2thcGkga2VhbWFuYW4gY29iYSB0YW1iYWhrYW4gdG9rZW4gcmFoYXNpYSBvdG9yaXNhc2kgc2FhdCBtZW11bGFpIEFyaWEyIChsZXdhdCBmbGFnIC0tcnBjLXNlY3JldClcIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwiTWVuY29iYSBrb25la3NpIGtlIGFyaWEyIG1lbmdndW5ha2FuIGtvbmZpZ3VyYXNpIGtvbmVrc2kgYmFydVwiLFxuICAvLyB7e25hbWV9fSByZWZlcnMgdG8gdGhlIGRvd25sb2FkIG5hbWUsIGRvIG5vdCBtb2RpZnkuXG4gIFwiUmVtb3ZlIHt7bmFtZX19IGFuZCBhc3NvY2lhdGVkIG1ldGEtZGF0YT9cIjogXCJIYXB1cyB7e25hbWV9fSBkYW4gbWV0YS1kYXRhIHlhbmcgYmVyaHVidW5nYW4/XCJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/js/translate/id_ID.js\n'
);
/***/
},
/***/ "./src/js/translate/it_IT.js":
/*!***********************************!*\
!*** ./src/js/translate/it_IT.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.it_IT = {\n // header\n Search: "Cerca",\n // Nav menu\n Add: "Aggiungi",\n "By URIs": "Da URIs",\n "By Torrents": "Da Torrent",\n "By Metalinks": "Da Metalink",\n Manage: "Gestione",\n "Pause All": "Ferma tutto",\n "Resume Paused": "Riprendi fermati",\n "Purge Completed": "Togli i completi",\n Settings: "Impostazioni",\n "Connection Settings": "Impostazioni di connessione",\n "Global Settings": "Impostazioni globali",\n "Server info": "Informazioni sul server",\n "About and contribute": "Crediti e informazioni",\n "Toggle navigation": "Cambia navigazione",\n // body\n // nav side bar\n Miscellaneous: "Varie",\n "Global Statistics": "Statistiche globali",\n About: "Info",\n Displaying: "Mostra",\n of: "di",\n downloads: "downloads",\n Language: "Lingua",\n // download filters\n "Download Filters": "Filtri download",\n Running: "In corso",\n Active: "Attivi",\n Waiting: "In attesa",\n Complete: "Completi",\n Error: "Errore",\n Paused: "In pausa",\n Removed: "Rimossi",\n "Hide linked meta-data": "Nascondi i meta-data collegati",\n Toggle: "Cambia",\n "Reset filters": "Reimposta filtri",\n // starred properties\n "Quick Access Settings": "Accesso rapido",\n "Save settings": "Salva impostazioni",\n "Currently no download in line to display, use the":\n "Attualmente non c\'è nessun download da mostrare, usa il pulsante ",\n "download button to start downloading files!": "dowload per cominciare a scaricare!",\n Peers: "Peers",\n "More Info": "Altre informazioni",\n Remove: "Rimuovi",\n "# of": "# di",\n Length: "Lunghezza",\n // modals\n "Add Downloads By URIs": "Aggiungi Downloads da URIs",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Puoi aggungere più download(files) allo stesso tempo mettendo un\'URI per riga.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Puoi anche aggiungere più URI di download(mirror) per uno *stesso* file separando i vari mirror da uno spazio.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- Un URI può essere un indirizzo HTTP(S)/FTP o un BitTorrent Magnet link.",\n "Download settings": "Impostazioni download",\n "Advanced settings": "Impostazioni avanzate",\n Cancel: "Cancella",\n Start: "Aggiungi",\n Choose: "Scegli",\n "Quick Access (shown on the main page)": "Accesso rapido (mostrato nella pagina principale)",\n // add torrent modal\n "Add Downloads By Torrents": "Aggiungi Torrent",\n "- Select the torrent from the local filesystem to start the download.":\n "- Seleziona il file torrent dal tuo computer per iniziare a scaricare.",\n "- You can select multiple torrents to start multiple downloads.":\n "- Puoi aggiungere anche più file contemporaneamente per iniziare più dowload insieme.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- Per aggiungere un Magnet Link BitTorrent utilizza l\'opzione Aggiungi da URI.",\n "Select Torrents": "Seleziona Torrents",\n "Select a Torrent": "Seleziona un Torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Aggiungi Torrent da Metalink",\n "Select Metalinks": "Seleziona Metalink",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Seleziona un Metalink dal tuo computer per iniziare il download.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Puoi iniziare anche più download selezionando più Metalink.",\n "Select a Metalink": "Seleziona un Metalink",\n // select file modal\n "Choose files to start download for": "Scegli i file da scaricare",\n "Select to download": "Seleziona per scaricare",\n // settings modal\n "Aria2 RPC host and port": "Host e porta del server RPC di Aria2",\n "Enter the host": "Inserisci l\'host",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Inserisci l\'IP o il nome DNS del server dov\'è in esecuzione l\'RPC per Aria2 (default: localhost)",\n "Enter the port": "Inserisci la porta",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Inserisci la porta del server dov\'è in esecuzione l\'RPC per Aria2 (default: 6800)",\n "Enter the RPC path": "Inserisci la path RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Inserisci la path per l\'endpoint RPC di Aria2 (default: /jsonrpc)",\n "SSL/TLS encryption": "Cifratura SSL/TLS",\n "Enable SSL/TLS encryption": "Abilita la cifratura SSL/TLS",\n "Enter the secret token (optional)": "Inserisci il token segreto (opzionale)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Inserisci il token segreto per Aria2 (lascia vuoto se non è abilitato)",\n "Enter the username (optional)": "Inserisci l\'username (opzionale)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Inserisci l\'username per l\'RPC di Aria2 (lascia vuoto se non è abilitato)",\n "Enter the password (optional)": "Inserisci la password (opzionale)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Inserisci la password per l\'RPC di Aria2 (vuota se l\'autenticazione non è abilitata)",\n "Enter base URL (optional)": "Inserisci l\'URL di base(opzionale)",\n "Direct Download": "Downaload diretto",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Se inserito, verrano creati dei link per scaricare direttamente i file dal server Aria2.",\n "(Requires appropriate webserver to be configured.)":\n "(Richiede un webserver correttamente configurato)",\n "Save Connection configuration": "Salva la configurazione di connessione",\n Filter: "Filtro",\n // server info modal\n "Aria2 server info": "Informazioni sul server Aria2",\n "Aria2 Version": "Versione di Aria2",\n "Features Enabled": "Funzionalità abilitate",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Per scaricare l\'ultima versione del progetto, aggiungere problemi o contribuire, visita ",\n "Or you can open the latest version in the browser through":\n "Oppure puoi aprire l\'ultima versione direttamente nel browser",\n Close: "Chiudi",\n // lables\n "Download status": "Stato download",\n "Download Speed": "Velocità download",\n "Upload Speed": "Velocità upload",\n "Estimated time": "Tempo stimato",\n "Download Size": "Dimensione del download",\n Downloaded: "Scaricato",\n Progress: "Progresso",\n "Download Path": "Percorso di download",\n Uploaded: "Caricato",\n "Download GID": "GID Download",\n "Number of Pieces": "Numero di segmenti",\n "Piece Length": "Lunghezza segmenti",\n "Shutdown Server": "Spegni Server",\n\n "The last connection attempt was unsuccessful. Trying another configuration":\n "L\'ultimo tentativo di connessione non è riuscito. Provo un\'altra connessione",\n "Oh Snap!": "Mannaggia!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Non riesco a connettermi al server RPC di Aria2. Riprovo tra 10 secondi. Forse vuoi controllare le impostazioni di connessione in Impostazioni > Impostazioni di connessione",\n "Successfully connected to Aria2 through its remote RPC …":\n "Connesso con successo a Aria2 mediante RPC remoto …",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Correttamente connesso al server Aria2 mediante RPC, ma in modo non sicuro. Per una completa sicurezza prova ad aggiungere un token di autorizzazione segreto all\'avvio di Aria2 (mediante il flag --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Provo a connettermi a Aria2 attraverso le nuove impostazioni"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL2l0X0lULmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9pdF9JVC5qcz9kZGM1Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5pdF9JVCA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJDZXJjYVwiLFxuICAvLyBOYXYgbWVudVxuICBBZGQ6IFwiQWdnaXVuZ2lcIixcbiAgXCJCeSBVUklzXCI6IFwiRGEgVVJJc1wiLFxuICBcIkJ5IFRvcnJlbnRzXCI6IFwiRGEgVG9ycmVudFwiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcIkRhIE1ldGFsaW5rXCIsXG4gIE1hbmFnZTogXCJHZXN0aW9uZVwiLFxuICBcIlBhdXNlIEFsbFwiOiBcIkZlcm1hIHR1dHRvXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIlJpcHJlbmRpIGZlcm1hdGlcIixcbiAgXCJQdXJnZSBDb21wbGV0ZWRcIjogXCJUb2dsaSBpIGNvbXBsZXRpXCIsXG4gIFNldHRpbmdzOiBcIkltcG9zdGF6aW9uaVwiLFxuICBcIkNvbm5lY3Rpb24gU2V0dGluZ3NcIjogXCJJbXBvc3RhemlvbmkgZGkgY29ubmVzc2lvbmVcIixcbiAgXCJHbG9iYWwgU2V0dGluZ3NcIjogXCJJbXBvc3RhemlvbmkgZ2xvYmFsaVwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiSW5mb3JtYXppb25pIHN1bCBzZXJ2ZXJcIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcIkNyZWRpdGkgZSBpbmZvcm1hemlvbmlcIixcbiAgXCJUb2dnbGUgbmF2aWdhdGlvblwiOiBcIkNhbWJpYSBuYXZpZ2F6aW9uZVwiLFxuICAvLyBib2R5XG4gIC8vIG5hdiBzaWRlIGJhclxuICBNaXNjZWxsYW5lb3VzOiBcIlZhcmllXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCJTdGF0aXN0aWNoZSBnbG9iYWxpXCIsXG4gIEFib3V0OiBcIkluZm9cIixcbiAgRGlzcGxheWluZzogXCJNb3N0cmFcIixcbiAgb2Y6IFwiZGlcIixcbiAgZG93bmxvYWRzOiBcImRvd25sb2Fkc1wiLFxuICBMYW5ndWFnZTogXCJMaW5ndWFcIixcbiAgLy8gZG93bmxvYWQgZmlsdGVyc1xuICBcIkRvd25sb2FkIEZpbHRlcnNcIjogXCJGaWx0cmkgZG93bmxvYWRcIixcbiAgUnVubmluZzogXCJJbiBjb3Jzb1wiLFxuICBBY3RpdmU6IFwiQXR0aXZpXCIsXG4gIFdhaXRpbmc6IFwiSW4gYXR0ZXNhXCIsXG4gIENvbXBsZXRlOiBcIkNvbXBsZXRpXCIsXG4gIEVycm9yOiBcIkVycm9yZVwiLFxuICBQYXVzZWQ6IFwiSW4gcGF1c2FcIixcbiAgUmVtb3ZlZDogXCJSaW1vc3NpXCIsXG4gIFwiSGlkZSBsaW5rZWQgbWV0YS1kYXRhXCI6IFwiTmFzY29uZGkgaSBtZXRhLWRhdGEgY29sbGVnYXRpXCIsXG4gIFRvZ2dsZTogXCJDYW1iaWFcIixcbiAgXCJSZXNldCBmaWx0ZXJzXCI6IFwiUmVpbXBvc3RhIGZpbHRyaVwiLFxuICAvLyBzdGFycmVkIHByb3BlcnRpZXNcbiAgXCJRdWljayBBY2Nlc3MgU2V0dGluZ3NcIjogXCJBY2Nlc3NvIHJhcGlkb1wiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCJTYWx2YSBpbXBvc3RhemlvbmlcIixcbiAgXCJDdXJyZW50bHkgbm8gZG93bmxvYWQgaW4gbGluZSB0byBkaXNwbGF5LCB1c2UgdGhlXCI6XG4gICAgXCJBdHR1YWxtZW50ZSBub24gYyfDqCBuZXNzdW4gZG93bmxvYWQgZGEgbW9zdHJhcmUsIHVzYSBpbCBwdWxzYW50ZSBcIixcbiAgXCJkb3dubG9hZCBidXR0b24gdG8gc3RhcnQgZG93bmxvYWRpbmcgZmlsZXMhXCI6IFwiZG93bG9hZCBwZXIgY29taW5jaWFyZSBhIHNjYXJpY2FyZSFcIixcbiAgUGVlcnM6IFwiUGVlcnNcIixcbiAgXCJNb3JlIEluZm9cIjogXCJBbHRyZSBpbmZvcm1hemlvbmlcIixcbiAgUmVtb3ZlOiBcIlJpbXVvdmlcIixcbiAgXCIjIG9mXCI6IFwiIyBkaVwiLFxuICBMZW5ndGg6IFwiTHVuZ2hlenphXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIkFnZ2l1bmdpIERvd25sb2FkcyBkYSBVUklzXCIsXG4gIFwiLSBZb3UgY2FuIGFkZCBtdWx0aXBsZSBkb3dubG9hZHMgKGZpbGVzKSBhdCB0aGUgc2FtZSB0aW1lIGJ5IHB1dHRpbmcgVVJJcyBmb3IgZWFjaCBmaWxlIG9uIGEgc2VwYXJhdGUgbGluZS5cIjpcbiAgICBcIi0gUHVvaSBhZ2d1bmdlcmUgcGnDuSBkb3dubG9hZChmaWxlcykgYWxsbyBzdGVzc28gdGVtcG8gbWV0dGVuZG8gdW4nVVJJIHBlciByaWdhLlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSBQdW9pIGFuY2hlIGFnZ2l1bmdlcmUgcGnDuSBVUkkgZGkgZG93bmxvYWQobWlycm9yKSBwZXIgdW5vICpzdGVzc28qIGZpbGUgc2VwYXJhbmRvIGkgdmFyaSBtaXJyb3IgZGEgdW5vIHNwYXppby5cIixcbiAgXCItIEEgVVJJIGNhbiBiZSBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIjpcbiAgICBcIi0gVW4gVVJJIHB1w7IgZXNzZXJlIHVuIGluZGlyaXp6byBIVFRQKFMpL0ZUUCBvIHVuIEJpdFRvcnJlbnQgTWFnbmV0IGxpbmsuXCIsXG4gIFwiRG93bmxvYWQgc2V0dGluZ3NcIjogXCJJbXBvc3RhemlvbmkgZG93bmxvYWRcIixcbiAgXCJBZHZhbmNlZCBzZXR0aW5nc1wiOiBcIkltcG9zdGF6aW9uaSBhdmFuemF0ZVwiLFxuICBDYW5jZWw6IFwiQ2FuY2VsbGFcIixcbiAgU3RhcnQ6IFwiQWdnaXVuZ2lcIixcbiAgQ2hvb3NlOiBcIlNjZWdsaVwiLFxuICBcIlF1aWNrIEFjY2VzcyAoc2hvd24gb24gdGhlIG1haW4gcGFnZSlcIjogXCJBY2Nlc3NvIHJhcGlkbyAobW9zdHJhdG8gbmVsbGEgcGFnaW5hIHByaW5jaXBhbGUpXCIsXG4gIC8vIGFkZCB0b3JyZW50IG1vZGFsXG4gIFwiQWRkIERvd25sb2FkcyBCeSBUb3JyZW50c1wiOiBcIkFnZ2l1bmdpIFRvcnJlbnRcIixcbiAgXCItIFNlbGVjdCB0aGUgdG9ycmVudCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIi0gU2VsZXppb25hIGlsIGZpbGUgdG9ycmVudCBkYWwgdHVvIGNvbXB1dGVyIHBlciBpbml6aWFyZSBhIHNjYXJpY2FyZS5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIi0gUHVvaSBhZ2dpdW5nZXJlIGFuY2hlIHBpw7kgZmlsZSBjb250ZW1wb3JhbmVhbWVudGUgcGVyIGluaXppYXJlIHBpw7kgZG93bG9hZCBpbnNpZW1lLlwiLFxuICBcIi0gVG8gYWRkIGEgQml0VG9ycmVudC1NYWduZXQgVVJMLCB1c2UgdGhlIEFkZCBCeSBVUkkgb3B0aW9uIGFuZCBhZGQgaXQgdGhlcmUuXCI6XG4gICAgXCItIFBlciBhZ2dpdW5nZXJlIHVuICBNYWduZXQgTGluayBCaXRUb3JyZW50IHV0aWxpenphIGwnb3B6aW9uZSBBZ2dpdW5naSBkYSBVUkkuXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwiU2VsZXppb25hIFRvcnJlbnRzXCIsXG4gIFwiU2VsZWN0IGEgVG9ycmVudFwiOiBcIlNlbGV6aW9uYSB1biBUb3JyZW50XCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwiQWdnaXVuZ2kgVG9ycmVudCBkYSBNZXRhbGlua1wiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCJTZWxlemlvbmEgTWV0YWxpbmtcIixcbiAgXCItIFNlbGVjdCB0aGUgTWV0YWxpbmsgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIFNlbGV6aW9uYSB1biBNZXRhbGluayBkYWwgdHVvIGNvbXB1dGVyIHBlciBpbml6aWFyZSBpbCBkb3dubG9hZC5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItIFB1b2kgaW5pemlhcmUgYW5jaGUgcGnDuSBkb3dubG9hZCBzZWxlemlvbmFuZG8gcGnDuSBNZXRhbGluay5cIixcbiAgXCJTZWxlY3QgYSBNZXRhbGlua1wiOiBcIlNlbGV6aW9uYSB1biBNZXRhbGlua1wiLFxuICAvLyBzZWxlY3QgZmlsZSBtb2RhbFxuICBcIkNob29zZSBmaWxlcyB0byBzdGFydCBkb3dubG9hZCBmb3JcIjogXCJTY2VnbGkgaSBmaWxlIGRhIHNjYXJpY2FyZVwiLFxuICBcIlNlbGVjdCB0byBkb3dubG9hZFwiOiBcIlNlbGV6aW9uYSBwZXIgc2NhcmljYXJlXCIsXG4gIC8vIHNldHRpbmdzIG1vZGFsXG4gIFwiQXJpYTIgUlBDIGhvc3QgYW5kIHBvcnRcIjogXCJIb3N0IGUgcG9ydGEgZGVsIHNlcnZlciBSUEMgZGkgQXJpYTJcIixcbiAgXCJFbnRlciB0aGUgaG9zdFwiOiBcIkluc2VyaXNjaSBsJ2hvc3RcIixcbiAgXCJFbnRlciB0aGUgSVAgb3IgRE5TIG5hbWUgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiBsb2NhbGhvc3QpXCI6XG4gICAgXCJJbnNlcmlzY2kgbCdJUCBvIGlsIG5vbWUgRE5TIGRlbCBzZXJ2ZXIgZG92J8OoIGluIGVzZWN1emlvbmUgbCdSUEMgcGVyIEFyaWEyIChkZWZhdWx0OiBsb2NhbGhvc3QpXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnRcIjogXCJJbnNlcmlzY2kgbGEgcG9ydGFcIixcbiAgXCJFbnRlciB0aGUgcG9ydCBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IDY4MDApXCI6XG4gICAgXCJJbnNlcmlzY2kgbGEgcG9ydGEgZGVsIHNlcnZlciBkb3Ynw6ggaW4gZXNlY3V6aW9uZSBsJ1JQQyBwZXIgQXJpYTIgIChkZWZhdWx0OiA2ODAwKVwiLFxuICBcIkVudGVyIHRoZSBSUEMgcGF0aFwiOiBcIkluc2VyaXNjaSBsYSBwYXRoIFJQQ1wiLFxuICBcIkVudGVyIHRoZSBwYXRoIGZvciB0aGUgQXJpYTIgUlBDIGVuZHBvaW50IChkZWZhdWx0OiAvanNvbnJwYylcIjpcbiAgICBcIkluc2VyaXNjaSBsYSBwYXRoIHBlciBsJ2VuZHBvaW50IFJQQyBkaSBBcmlhMiAoZGVmYXVsdDogL2pzb25ycGMpXCIsXG4gIFwiU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiQ2lmcmF0dXJhIFNTTC9UTFNcIixcbiAgXCJFbmFibGUgU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiQWJpbGl0YSBsYSBjaWZyYXR1cmEgU1NML1RMU1wiLFxuICBcIkVudGVyIHRoZSBzZWNyZXQgdG9rZW4gKG9wdGlvbmFsKVwiOiBcIkluc2VyaXNjaSBpbCB0b2tlbiBzZWdyZXRvIChvcHppb25hbGUpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBzZWNyZXQgdG9rZW4gKGxlYXZlIGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiSW5zZXJpc2NpIGlsIHRva2VuIHNlZ3JldG8gcGVyIEFyaWEyIChsYXNjaWEgdnVvdG8gc2Ugbm9uIMOoIGFiaWxpdGF0bylcIixcbiAgXCJFbnRlciB0aGUgdXNlcm5hbWUgKG9wdGlvbmFsKVwiOiBcIkluc2VyaXNjaSBsJ3VzZXJuYW1lIChvcHppb25hbGUpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyB1c2VybmFtZSAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJJbnNlcmlzY2kgbCd1c2VybmFtZSBwZXIgbCdSUEMgZGkgQXJpYTIgKGxhc2NpYSB2dW90byBzZSBub24gw6ggYWJpbGl0YXRvKVwiLFxuICBcIkVudGVyIHRoZSBwYXNzd29yZCAob3B0aW9uYWwpXCI6IFwiSW5zZXJpc2NpIGxhIHBhc3N3b3JkIChvcHppb25hbGUpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBwYXNzd29yZCAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJJbnNlcmlzY2kgbGEgcGFzc3dvcmQgcGVyIGwnUlBDIGRpIEFyaWEyICh2dW90YSBzZSBsJ2F1dGVudGljYXppb25lIG5vbiDDqCBhYmlsaXRhdGEpXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIkluc2VyaXNjaSBsJ1VSTCBkaSBiYXNlKG9wemlvbmFsZSlcIixcbiAgXCJEaXJlY3QgRG93bmxvYWRcIjogXCJEb3duYWxvYWQgZGlyZXR0b1wiLFxuICBcIklmIHN1cHBsaWVkLCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgdG8gZW5hYmxlIGRpcmVjdCBkb3dubG9hZCBmcm9tIHRoZSBBcmlhMiBzZXJ2ZXIuXCI6XG4gICAgXCJTZSBpbnNlcml0bywgdmVycmFubyBjcmVhdGkgZGVpIGxpbmsgcGVyIHNjYXJpY2FyZSBkaXJldHRhbWVudGUgaSBmaWxlIGRhbCBzZXJ2ZXIgQXJpYTIuXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjpcbiAgICBcIihSaWNoaWVkZSB1biB3ZWJzZXJ2ZXIgY29ycmV0dGFtZW50ZSBjb25maWd1cmF0bylcIixcbiAgXCJTYXZlIENvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOiBcIlNhbHZhIGxhIGNvbmZpZ3VyYXppb25lIGRpIGNvbm5lc3Npb25lXCIsXG4gIEZpbHRlcjogXCJGaWx0cm9cIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcIkluZm9ybWF6aW9uaSBzdWwgc2VydmVyIEFyaWEyXCIsXG4gIFwiQXJpYTIgVmVyc2lvblwiOiBcIlZlcnNpb25lIGRpIEFyaWEyXCIsXG4gIFwiRmVhdHVyZXMgRW5hYmxlZFwiOiBcIkZ1bnppb25hbGl0w6AgYWJpbGl0YXRlXCIsXG4gIC8vIGFib3V0IG1vZGFsXG4gIFwiVG8gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LCBhZGQgaXNzdWVzIG9yIHRvIGNvbnRyaWJ1dGUgYmFjaywgaGVhZCBvbiB0b1wiOlxuICAgIFwiUGVyIHNjYXJpY2FyZSBsJ3VsdGltYSB2ZXJzaW9uZSBkZWwgcHJvZ2V0dG8sIGFnZ2l1bmdlcmUgcHJvYmxlbWkgbyBjb250cmlidWlyZSwgdmlzaXRhIFwiLFxuICBcIk9yIHlvdSBjYW4gb3BlbiB0aGUgbGF0ZXN0IHZlcnNpb24gaW4gdGhlIGJyb3dzZXIgdGhyb3VnaFwiOlxuICAgIFwiT3BwdXJlIHB1b2kgYXByaXJlIGwndWx0aW1hIHZlcnNpb25lIGRpcmV0dGFtZW50ZSBuZWwgYnJvd3NlclwiLFxuICBDbG9zZTogXCJDaGl1ZGlcIixcbiAgLy8gbGFibGVzXG4gIFwiRG93bmxvYWQgc3RhdHVzXCI6IFwiU3RhdG8gZG93bmxvYWRcIixcbiAgXCJEb3dubG9hZCBTcGVlZFwiOiBcIlZlbG9jaXTDoCBkb3dubG9hZFwiLFxuICBcIlVwbG9hZCBTcGVlZFwiOiBcIlZlbG9jaXTDoCB1cGxvYWRcIixcbiAgXCJFc3RpbWF0ZWQgdGltZVwiOiBcIlRlbXBvIHN0aW1hdG9cIixcbiAgXCJEb3dubG9hZCBTaXplXCI6IFwiRGltZW5zaW9uZSBkZWwgZG93bmxvYWRcIixcbiAgRG93bmxvYWRlZDogXCJTY2FyaWNhdG9cIixcbiAgUHJvZ3Jlc3M6IFwiUHJvZ3Jlc3NvXCIsXG4gIFwiRG93bmxvYWQgUGF0aFwiOiBcIlBlcmNvcnNvIGRpIGRvd25sb2FkXCIsXG4gIFVwbG9hZGVkOiBcIkNhcmljYXRvXCIsXG4gIFwiRG93bmxvYWQgR0lEXCI6IFwiR0lEIERvd25sb2FkXCIsXG4gIFwiTnVtYmVyIG9mIFBpZWNlc1wiOiBcIk51bWVybyBkaSBzZWdtZW50aVwiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcIkx1bmdoZXp6YSBzZWdtZW50aVwiLFxuICBcIlNodXRkb3duIFNlcnZlclwiOiBcIlNwZWduaSBTZXJ2ZXJcIixcblxuICBcIlRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdCB3YXMgdW5zdWNjZXNzZnVsLiBUcnlpbmcgYW5vdGhlciBjb25maWd1cmF0aW9uXCI6XG4gICAgXCJMJ3VsdGltbyB0ZW50YXRpdm8gZGkgY29ubmVzc2lvbmUgbm9uIMOoIHJpdXNjaXRvLiBQcm92byB1bidhbHRyYSBjb25uZXNzaW9uZVwiLFxuICBcIk9oIFNuYXAhXCI6IFwiTWFubmFnZ2lhIVwiLFxuICBcIkNvdWxkIG5vdCBjb25uZWN0IHRvIHRoZSBhcmlhMiBSUEMgc2VydmVyLiBXaWxsIHJldHJ5IGluIDEwIHNlY3MuIFlvdSBtaWdodCB3YW50IHRvIGNoZWNrIHRoZSBjb25uZWN0aW9uIHNldHRpbmdzIGJ5IGdvaW5nIHRvIFNldHRpbmdzID4gQ29ubmVjdGlvbiBTZXR0aW5nc1wiOlxuICAgIFwiTm9uIHJpZXNjbyBhIGNvbm5ldHRlcm1pIGFsIHNlcnZlciBSUEMgZGkgQXJpYTIuIFJpcHJvdm8gdHJhIDEwIHNlY29uZGkuIEZvcnNlIHZ1b2kgY29udHJvbGxhcmUgbGUgaW1wb3N0YXppb25pIGRpIGNvbm5lc3Npb25lIGluIEltcG9zdGF6aW9uaSA+IEltcG9zdGF6aW9uaSBkaSBjb25uZXNzaW9uZVwiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCBpdHMgcmVtb3RlIFJQQyDigKZcIjpcbiAgICBcIkNvbm5lc3NvIGNvbiBzdWNjZXNzbyBhIEFyaWEyIG1lZGlhbnRlIFJQQyByZW1vdG8g4oCmXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIHJlbW90ZSBSUEMsIGhvd2V2ZXIgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgaW5zZWN1cmUuIEZvciBjb21wbGV0ZSBzZWN1cml0eSB0cnkgYWRkaW5nIGFuIGF1dGhvcml6YXRpb24gc2VjcmV0IHRva2VuIHdoaWxlIHN0YXJ0aW5nIEFyaWEyICh0aHJvdWdoIHRoZSBmbGFnIC0tcnBjLXNlY3JldClcIjpcbiAgICBcIkNvcnJldHRhbWVudGUgY29ubmVzc28gYWwgc2VydmVyIEFyaWEyIG1lZGlhbnRlIFJQQywgbWEgaW4gbW9kbyBub24gc2ljdXJvLiBQZXIgdW5hIGNvbXBsZXRhIHNpY3VyZXp6YSBwcm92YSBhZCBhZ2dpdW5nZXJlIHVuIHRva2VuIGRpIGF1dG9yaXp6YXppb25lIHNlZ3JldG8gYWxsJ2F2dmlvIGRpIEFyaWEyIChtZWRpYW50ZSBpbCBmbGFnIC0tcnBjLXNlY3JldClcIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwiUHJvdm8gYSBjb25uZXR0ZXJtaSBhIEFyaWEyIGF0dHJhdmVyc28gbGUgbnVvdmUgaW1wb3N0YXppb25pXCJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/translate/it_IT.js\n'
);
/***/
},
/***/ "./src/js/translate/nl_NL.js":
/*!***********************************!*\
!*** ./src/js/translate/nl_NL.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.nl_NL = {\n // header\n Search: "Zoeken",\n // Nav menu\n Add: "Toevoegen",\n "By URIs": "met URI",\n "By Torrents": "met Torrents",\n "By Metalinks": "met Metalinks",\n Manage: "Beheren",\n "Pause All": "Alles pauzeren",\n "Resume Paused": "Hervatten",\n "Purge Completed": "Verwijder de voleindigden",\n Settings: "Instellingen",\n "Connection Settings": "Verbindingsinstellingen",\n "Global Settings": "Globale instellingen",\n "Server info": "Informatie over de server",\n "About and contribute": "Over het project en bijdragen",\n "Toggle navigation": "Navigatie omschakelen",\n Language: "Taal",\n // body\n // nav side bar\n Miscellaneous: "Overig",\n "Global Statistics": "Globale statistieken",\n About: "Over het project",\n Displaying: " ", // empty because of grammar in the following 2 elements\n of: "van",\n downloads: "downloads weergegeven",\n // download filters\n "Download Filters": "Download filters",\n Running: "Bezig",\n Active: "Actief",\n Waiting: "Wachtend",\n Complete: "Voleindigd",\n Error: "Foutief",\n Paused: "Gepauzeerd",\n Removed: "Verwijderd",\n "Hide linked meta-data": "Gekoppelde metadata verbergen",\n Toggle: "Omschakelen",\n "Reset filters": "Filters terugzetten",\n // starred properties\n "Quick Access Settings": "Snelle-toegang instellingen",\n "Save settings": "Instellingen opslaan",\n "Currently no download in line to display, use the":\n "Momenteel geen downloads weer te geven, gebruik de ",\n "download button to start downloading files!": "knop om bestanden te gaan downloaden!",\n Peers: "Peers",\n "More Info": "Meer informatie",\n Remove: "Verwijderen",\n "# of": "Aantal",\n Length: "Lengte",\n // modals\n "Add Downloads By URIs": "Downloads toevoegen met URI",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Je kunt meerdere downloads (bestanden) tezelfdertijd toevoegen door de URIs voor elk bestand op een aparte regel te zetten.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Je kunt ook meerdere URIs (mirrors) voor *hetzelfde* bestand toevoegen. Scheidt hiervoor de URIs met een spatie.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- Een URI kan HTTP(S)/FTP/BitTorrent-Magnet zijn.",\n "Download settings": "Download instellingen",\n "Advanced settings": "Geavanceerde instellingen",\n Cancel: "Annuleren",\n Start: "Starten",\n Choose: "Kiezen",\n "Quick Access (shown on the main page)": "Snelle toegang (op de hoofdpagina)",\n // add torrent modal\n "Add Downloads By Torrents": "Downloads toevoegen met torrents",\n "- Select the torrent from the local filesystem to start the download.":\n "- Selecteer de torrent van het locale bestandssysteem om de download te starten.",\n "- You can select multiple torrents to start multiple downloads.":\n "- Je kunt meerdere torrents selecteren voor meerdere downloads.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- Om een BitTorrent-Magnet URL toe te voegen, gebruik de Toevoegen met URI optie, en voeg het daar toe.",\n "Select Torrents": "Selecteer torrents",\n "Select a Torrent": "Selecteer een torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Download toevoegen met Metalinks",\n "Select Metalinks": "Selecteer Metalinks",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Selecteer de Metalink van het locale bestandssysteem om de download te starten.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Selecter meerdere Metalinks om meerdere downloads te starten.",\n "Select a Metalink": "Selecteer een Metalink",\n // select file modal\n "Choose files to start download for": "Bestanden kiezen waarvoor het downloaden beginnen moet",\n "Select to download": "Selecteer om te downloaden",\n // settings modal\n "Aria2 RPC host and port": "Aria2 RPC server en poort",\n "Enter the host": "Server invoeren",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Voer de IP of DNS naam van de server waarop de RPC van Aria2 loopt (standaard: localhost)",\n "Enter the port": "Poort invoeren",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Invoeren van de serverpoort waarop de RPC van Aria2 loopt (standaard: 6800)",\n "Enter the RPC path": "Invoeren van het RPC pad",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Invoeren van het eindpunt van het Aria2 RPC pad (standaard: /jsonrpc)",\n "SSL/TLS encryption": "SSL/TLS versleuteling",\n "Enable SSL/TLS encryption": "SSL/TLS versleuteling inschakelen",\n "Enter the secret token (optional)": "Invoeren van het wachtwoord (facultatief)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)",\n "Enter the username (optional)": "Invoeren van de gebruikersnaam (facultatief)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Invoeren van de Aria2 RPC gebruikersnaam (niet invullen als authenticatie niet is ingeschakeld)",\n "Enter the password (optional)": "Invoeren van het wachtwoord (facultatief)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Invoeren van het Aria2 RPC wachtwoord (niet invullen als authenticatie niet is ingeschakeld)",\n "Enter base URL (optional)": "Invoeren van de basis URL (facultatief)",\n "Direct Download": "Direct downloaden",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Als ingevoerd dan worden links aangemaakt die het direct downloaden van de Aria2 server toestaan.",\n "(Requires appropriate webserver to be configurured.)":\n "Hiervoor moet een geschikte webserver worden ingericht.)",\n "Save Connection configuration": "Verbindingsconfiguratie opslaan",\n Filter: "Filter",\n // server info modal\n "Aria2 server info": "Aria2 server informatie",\n "Aria2 Version": "Aria2 versie",\n "Features Enabled": "Geactiveerde kenmerken",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Om de nieuwste versie van het project te downloaden, problemen te rapporteren of bij te dragen, ga naar",\n "Or you can open the latest version in the browser through":\n "Of je kunt hier de nieuwste versie in je browser openen",\n Close: "Afsluiten"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL25sX05MLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9ubF9OTC5qcz8zN2YwIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5ubF9OTCA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJab2VrZW5cIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIlRvZXZvZWdlblwiLFxuICBcIkJ5IFVSSXNcIjogXCJtZXQgVVJJXCIsXG4gIFwiQnkgVG9ycmVudHNcIjogXCJtZXQgVG9ycmVudHNcIixcbiAgXCJCeSBNZXRhbGlua3NcIjogXCJtZXQgTWV0YWxpbmtzXCIsXG4gIE1hbmFnZTogXCJCZWhlcmVuXCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwiQWxsZXMgcGF1emVyZW5cIixcbiAgXCJSZXN1bWUgUGF1c2VkXCI6IFwiSGVydmF0dGVuXCIsXG4gIFwiUHVyZ2UgQ29tcGxldGVkXCI6IFwiVmVyd2lqZGVyIGRlIHZvbGVpbmRpZ2RlblwiLFxuICBTZXR0aW5nczogXCJJbnN0ZWxsaW5nZW5cIixcbiAgXCJDb25uZWN0aW9uIFNldHRpbmdzXCI6IFwiVmVyYmluZGluZ3NpbnN0ZWxsaW5nZW5cIixcbiAgXCJHbG9iYWwgU2V0dGluZ3NcIjogXCJHbG9iYWxlIGluc3RlbGxpbmdlblwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiSW5mb3JtYXRpZSBvdmVyIGRlIHNlcnZlclwiLFxuICBcIkFib3V0IGFuZCBjb250cmlidXRlXCI6IFwiT3ZlciBoZXQgcHJvamVjdCBlbiBiaWpkcmFnZW5cIixcbiAgXCJUb2dnbGUgbmF2aWdhdGlvblwiOiBcIk5hdmlnYXRpZSBvbXNjaGFrZWxlblwiLFxuICBMYW5ndWFnZTogXCJUYWFsXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwiT3ZlcmlnXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCJHbG9iYWxlIHN0YXRpc3RpZWtlblwiLFxuICBBYm91dDogXCJPdmVyIGhldCBwcm9qZWN0XCIsXG4gIERpc3BsYXlpbmc6IFwiIFwiLCAvLyBlbXB0eSBiZWNhdXNlIG9mIGdyYW1tYXIgaW4gdGhlIGZvbGxvd2luZyAyIGVsZW1lbnRzXG4gIG9mOiBcInZhblwiLFxuICBkb3dubG9hZHM6IFwiZG93bmxvYWRzIHdlZXJnZWdldmVuXCIsXG4gIC8vIGRvd25sb2FkIGZpbHRlcnNcbiAgXCJEb3dubG9hZCBGaWx0ZXJzXCI6IFwiRG93bmxvYWQgZmlsdGVyc1wiLFxuICBSdW5uaW5nOiBcIkJlemlnXCIsXG4gIEFjdGl2ZTogXCJBY3RpZWZcIixcbiAgV2FpdGluZzogXCJXYWNodGVuZFwiLFxuICBDb21wbGV0ZTogXCJWb2xlaW5kaWdkXCIsXG4gIEVycm9yOiBcIkZvdXRpZWZcIixcbiAgUGF1c2VkOiBcIkdlcGF1emVlcmRcIixcbiAgUmVtb3ZlZDogXCJWZXJ3aWpkZXJkXCIsXG4gIFwiSGlkZSBsaW5rZWQgbWV0YS1kYXRhXCI6IFwiR2Vrb3BwZWxkZSBtZXRhZGF0YSB2ZXJiZXJnZW5cIixcbiAgVG9nZ2xlOiBcIk9tc2NoYWtlbGVuXCIsXG4gIFwiUmVzZXQgZmlsdGVyc1wiOiBcIkZpbHRlcnMgdGVydWd6ZXR0ZW5cIixcbiAgLy8gc3RhcnJlZCBwcm9wZXJ0aWVzXG4gIFwiUXVpY2sgQWNjZXNzIFNldHRpbmdzXCI6IFwiU25lbGxlLXRvZWdhbmcgaW5zdGVsbGluZ2VuXCIsXG4gIFwiU2F2ZSBzZXR0aW5nc1wiOiBcIkluc3RlbGxpbmdlbiBvcHNsYWFuXCIsXG4gIFwiQ3VycmVudGx5IG5vIGRvd25sb2FkIGluIGxpbmUgdG8gZGlzcGxheSwgdXNlIHRoZVwiOlxuICAgIFwiTW9tZW50ZWVsIGdlZW4gZG93bmxvYWRzIHdlZXIgdGUgZ2V2ZW4sIGdlYnJ1aWsgZGUgXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcImtub3Agb20gYmVzdGFuZGVuIHRlIGdhYW4gZG93bmxvYWRlbiFcIixcbiAgUGVlcnM6IFwiUGVlcnNcIixcbiAgXCJNb3JlIEluZm9cIjogXCJNZWVyIGluZm9ybWF0aWVcIixcbiAgUmVtb3ZlOiBcIlZlcndpamRlcmVuXCIsXG4gIFwiIyBvZlwiOiBcIkFhbnRhbFwiLFxuICBMZW5ndGg6IFwiTGVuZ3RlXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIkRvd25sb2FkcyB0b2V2b2VnZW4gbWV0IFVSSVwiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCItIEplIGt1bnQgbWVlcmRlcmUgZG93bmxvYWRzIChiZXN0YW5kZW4pIHRlemVsZmRlcnRpamQgdG9ldm9lZ2VuIGRvb3IgZGUgVVJJcyB2b29yIGVsayBiZXN0YW5kIG9wIGVlbiBhcGFydGUgcmVnZWwgdGUgemV0dGVuLlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSBKZSBrdW50IG9vayBtZWVyZGVyZSBVUklzIChtaXJyb3JzKSB2b29yICpoZXR6ZWxmZGUqIGJlc3RhbmQgdG9ldm9lZ2VuLiBTY2hlaWR0IGhpZXJ2b29yIGRlIFVSSXMgbWV0IGVlbiBzcGF0aWUuXCIsXG4gIFwiLSBBIFVSSSBjYW4gYmUgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCI6XG4gICAgXCItIEVlbiBVUkkga2FuIEhUVFAoUykvRlRQL0JpdFRvcnJlbnQtTWFnbmV0IHppam4uXCIsXG4gIFwiRG93bmxvYWQgc2V0dGluZ3NcIjogXCJEb3dubG9hZCBpbnN0ZWxsaW5nZW5cIixcbiAgXCJBZHZhbmNlZCBzZXR0aW5nc1wiOiBcIkdlYXZhbmNlZXJkZSBpbnN0ZWxsaW5nZW5cIixcbiAgQ2FuY2VsOiBcIkFubnVsZXJlblwiLFxuICBTdGFydDogXCJTdGFydGVuXCIsXG4gIENob29zZTogXCJLaWV6ZW5cIixcbiAgXCJRdWljayBBY2Nlc3MgKHNob3duIG9uIHRoZSBtYWluIHBhZ2UpXCI6IFwiU25lbGxlIHRvZWdhbmcgKG9wIGRlIGhvb2ZkcGFnaW5hKVwiLFxuICAvLyBhZGQgdG9ycmVudCBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgVG9ycmVudHNcIjogXCJEb3dubG9hZHMgdG9ldm9lZ2VuIG1ldCB0b3JyZW50c1wiLFxuICBcIi0gU2VsZWN0IHRoZSB0b3JyZW50IGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiLSBTZWxlY3RlZXIgZGUgdG9ycmVudCB2YW4gaGV0IGxvY2FsZSBiZXN0YW5kc3N5c3RlZW0gb20gZGUgZG93bmxvYWQgdGUgc3RhcnRlbi5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIi0gSmUga3VudCBtZWVyZGVyZSB0b3JyZW50cyBzZWxlY3RlcmVuIHZvb3IgbWVlcmRlcmUgZG93bmxvYWRzLlwiLFxuICBcIi0gVG8gYWRkIGEgQml0VG9ycmVudC1NYWduZXQgVVJMLCB1c2UgdGhlIEFkZCBCeSBVUkkgb3B0aW9uIGFuZCBhZGQgaXQgdGhlcmUuXCI6XG4gICAgXCItIE9tIGVlbiBCaXRUb3JyZW50LU1hZ25ldCBVUkwgdG9lIHRlIHZvZWdlbiwgZ2VicnVpayBkZSBUb2V2b2VnZW4gbWV0IFVSSSBvcHRpZSwgZW4gdm9lZyBoZXQgZGFhciB0b2UuXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwiU2VsZWN0ZWVyIHRvcnJlbnRzXCIsXG4gIFwiU2VsZWN0IGEgVG9ycmVudFwiOiBcIlNlbGVjdGVlciBlZW4gdG9ycmVudFwiLFxuICAvLyBhZGQgbWV0YWxpbmsgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IE1ldGFsaW5rc1wiOiBcIkRvd25sb2FkIHRvZXZvZWdlbiBtZXQgTWV0YWxpbmtzXCIsXG4gIFwiU2VsZWN0IE1ldGFsaW5rc1wiOiBcIlNlbGVjdGVlciBNZXRhbGlua3NcIixcbiAgXCItIFNlbGVjdCB0aGUgTWV0YWxpbmsgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIFNlbGVjdGVlciBkZSBNZXRhbGluayB2YW4gaGV0IGxvY2FsZSBiZXN0YW5kc3N5c3RlZW0gb20gZGUgZG93bmxvYWQgdGUgc3RhcnRlbi5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItIFNlbGVjdGVyIG1lZXJkZXJlIE1ldGFsaW5rcyBvbSBtZWVyZGVyZSBkb3dubG9hZHMgdGUgc3RhcnRlbi5cIixcbiAgXCJTZWxlY3QgYSBNZXRhbGlua1wiOiBcIlNlbGVjdGVlciBlZW4gTWV0YWxpbmtcIixcbiAgLy8gc2VsZWN0IGZpbGUgbW9kYWxcbiAgXCJDaG9vc2UgZmlsZXMgdG8gc3RhcnQgZG93bmxvYWQgZm9yXCI6IFwiQmVzdGFuZGVuIGtpZXplbiB3YWFydm9vciBoZXQgZG93bmxvYWRlbiBiZWdpbm5lbiBtb2V0XCIsXG4gIFwiU2VsZWN0IHRvIGRvd25sb2FkXCI6IFwiU2VsZWN0ZWVyIG9tIHRlIGRvd25sb2FkZW5cIixcbiAgLy8gc2V0dGluZ3MgbW9kYWxcbiAgXCJBcmlhMiBSUEMgaG9zdCBhbmQgcG9ydFwiOiBcIkFyaWEyIFJQQyBzZXJ2ZXIgZW4gcG9vcnRcIixcbiAgXCJFbnRlciB0aGUgaG9zdFwiOiBcIlNlcnZlciBpbnZvZXJlblwiLFxuICBcIkVudGVyIHRoZSBJUCBvciBETlMgbmFtZSBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IGxvY2FsaG9zdClcIjpcbiAgICBcIlZvZXIgZGUgSVAgb2YgRE5TIG5hYW0gdmFuIGRlIHNlcnZlciB3YWFyb3AgZGUgUlBDIHZhbiBBcmlhMiBsb29wdCAoc3RhbmRhYXJkOiBsb2NhbGhvc3QpXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnRcIjogXCJQb29ydCBpbnZvZXJlblwiLFxuICBcIkVudGVyIHRoZSBwb3J0IG9mIHRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhlIFJQQyBmb3IgQXJpYTIgaXMgcnVubmluZyAoZGVmYXVsdDogNjgwMClcIjpcbiAgICBcIkludm9lcmVuIHZhbiBkZSBzZXJ2ZXJwb29ydCB3YWFyb3AgZGUgUlBDIHZhbiBBcmlhMiBsb29wdCAoc3RhbmRhYXJkOiA2ODAwKVwiLFxuICBcIkVudGVyIHRoZSBSUEMgcGF0aFwiOiBcIkludm9lcmVuIHZhbiBoZXQgUlBDIHBhZFwiLFxuICBcIkVudGVyIHRoZSBwYXRoIGZvciB0aGUgQXJpYTIgUlBDIGVuZHBvaW50IChkZWZhdWx0OiAvanNvbnJwYylcIjpcbiAgICBcIkludm9lcmVuIHZhbiBoZXQgZWluZHB1bnQgdmFuIGhldCBBcmlhMiBSUEMgcGFkIChzdGFuZGFhcmQ6IC9qc29ucnBjKVwiLFxuICBcIlNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIlNTTC9UTFMgdmVyc2xldXRlbGluZ1wiLFxuICBcIkVuYWJsZSBTU0wvVExTIGVuY3J5cHRpb25cIjogXCJTU0wvVExTIHZlcnNsZXV0ZWxpbmcgaW5zY2hha2VsZW5cIixcbiAgXCJFbnRlciB0aGUgc2VjcmV0IHRva2VuIChvcHRpb25hbClcIjogXCJJbnZvZXJlbiB2YW4gaGV0IHdhY2h0d29vcmQgKGZhY3VsdGF0aWVmKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcIkludm9lcmVuIHZhbiBoZXQgQXJpYTIgUlBDIHdhY2h0d29vcmQgKG5pZXQgaW52dWxsZW4gYWxzIGF1dGhlbnRpY2F0aWUgbmlldCBpcyBpbmdlc2NoYWtlbGQpXCIsXG4gIFwiRW50ZXIgdGhlIHVzZXJuYW1lIChvcHRpb25hbClcIjogXCJJbnZvZXJlbiB2YW4gZGUgZ2VicnVpa2Vyc25hYW0gKGZhY3VsdGF0aWVmKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgdXNlcm5hbWUgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiSW52b2VyZW4gdmFuIGRlIEFyaWEyIFJQQyBnZWJydWlrZXJzbmFhbSAobmlldCBpbnZ1bGxlbiBhbHMgYXV0aGVudGljYXRpZSBuaWV0IGlzIGluZ2VzY2hha2VsZClcIixcbiAgXCJFbnRlciB0aGUgcGFzc3dvcmQgKG9wdGlvbmFsKVwiOiBcIkludm9lcmVuIHZhbiBoZXQgd2FjaHR3b29yZCAoZmFjdWx0YXRpZWYpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBwYXNzd29yZCAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJJbnZvZXJlbiB2YW4gaGV0IEFyaWEyIFJQQyB3YWNodHdvb3JkIChuaWV0IGludnVsbGVuIGFscyBhdXRoZW50aWNhdGllIG5pZXQgaXMgaW5nZXNjaGFrZWxkKVwiLFxuICBcIkVudGVyIGJhc2UgVVJMIChvcHRpb25hbClcIjogXCJJbnZvZXJlbiB2YW4gZGUgYmFzaXMgVVJMIChmYWN1bHRhdGllZilcIixcbiAgXCJEaXJlY3QgRG93bmxvYWRcIjogXCJEaXJlY3QgZG93bmxvYWRlblwiLFxuICBcIklmIHN1cHBsaWVkLCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgdG8gZW5hYmxlIGRpcmVjdCBkb3dubG9hZCBmcm9tIHRoZSBBcmlhMiBzZXJ2ZXIuXCI6XG4gICAgXCJBbHMgaW5nZXZvZXJkIGRhbiB3b3JkZW4gbGlua3MgYWFuZ2VtYWFrdCBkaWUgaGV0IGRpcmVjdCBkb3dubG9hZGVuIHZhbiBkZSBBcmlhMiBzZXJ2ZXIgdG9lc3RhYW4uXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cnVyZWQuKVwiOlxuICAgIFwiSGllcnZvb3IgbW9ldCBlZW4gZ2VzY2hpa3RlIHdlYnNlcnZlciB3b3JkZW4gaW5nZXJpY2h0LilcIixcbiAgXCJTYXZlIENvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOiBcIlZlcmJpbmRpbmdzY29uZmlndXJhdGllIG9wc2xhYW5cIixcbiAgRmlsdGVyOiBcIkZpbHRlclwiLFxuICAvLyBzZXJ2ZXIgaW5mbyBtb2RhbFxuICBcIkFyaWEyIHNlcnZlciBpbmZvXCI6IFwiQXJpYTIgc2VydmVyIGluZm9ybWF0aWVcIixcbiAgXCJBcmlhMiBWZXJzaW9uXCI6IFwiQXJpYTIgdmVyc2llXCIsXG4gIFwiRmVhdHVyZXMgRW5hYmxlZFwiOiBcIkdlYWN0aXZlZXJkZSBrZW5tZXJrZW5cIixcbiAgLy8gYWJvdXQgbW9kYWxcbiAgXCJUbyBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHByb2plY3QsIGFkZCBpc3N1ZXMgb3IgdG8gY29udHJpYnV0ZSBiYWNrLCBoZWFkIG9uIHRvXCI6XG4gICAgXCJPbSBkZSBuaWV1d3N0ZSB2ZXJzaWUgdmFuIGhldCBwcm9qZWN0IHRlIGRvd25sb2FkZW4sIHByb2JsZW1lbiB0ZSByYXBwb3J0ZXJlbiBvZiBiaWogdGUgZHJhZ2VuLCBnYSBuYWFyXCIsXG4gIFwiT3IgeW91IGNhbiBvcGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiB0aGUgYnJvd3NlciB0aHJvdWdoXCI6XG4gICAgXCJPZiBqZSBrdW50IGhpZXIgZGUgbmlldXdzdGUgdmVyc2llIGluIGplIGJyb3dzZXIgb3BlbmVuXCIsXG4gIENsb3NlOiBcIkFmc2x1aXRlblwiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/translate/nl_NL.js\n'
);
/***/
},
/***/ "./src/js/translate/pl_PL.js":
/*!***********************************!*\
!*** ./src/js/translate/pl_PL.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.pl_PL = {\n // header\n Search: "Szukaj",\n // Nav menu\n Add: "Dodaj",\n "By URIs": "Przez URL",\n "By Torrents": "Przez Torrenty",\n "By Metalinks": "Przez Metalinki",\n Manage: "Zarządzaj",\n "Pause All": "Zatrzymaj wszystkie",\n "Resume Paused": "Wznów zatrzymane",\n "Purge Completed": "Czyść zakończone",\n Settings: "Ustawienia",\n "Connection Settings": "Ustawienia połączenia",\n "Global Settings": "Ustawienia globalne",\n "Server info": "Informacje o serwerze",\n "About and contribute": "O projekcie",\n "Toggle navigation": "Przełącz nawigację",\n // body\n // nav side bar\n Miscellaneous: "Różne",\n "Global Statistics": "Statystyki globalne",\n About: "O",\n Displaying: "Wyświetlanie",\n of: "z",\n downloads: "pobranych plików",\n Language: "Język",\n // download filters\n "Download Filters": "Filtry ściągania",\n Running: "Uruchomione",\n Active: "Aktywne",\n Waiting: "Oczekujące",\n Complete: "Zakończone",\n Error: "Błąd",\n Paused: "Zatrzymane",\n Removed: "Usunięte",\n "Hide linked meta-data": "Ukryj zalinkowane meta-dane",\n Toggle: "Przełącz",\n "Reset filters": "Reset filtrów",\n // starred properties\n "Quick Access Settings": "Ustawienia szybkiego dostępu",\n "Save settings": "Zapisz ustawienia",\n "Currently no download in line to display, use the":\n "Obecnie nie można wyświetlić żadnych pobieranych plików. Użyj przycisku",\n "download button to start downloading files!": "aby rozpocząć ściąganie plików!",\n Peers: "Peerów",\n "More Info": "Więcej info",\n Remove: "Usuń",\n "# of": "# z",\n Length: "Długość",\n // modals\n "Add Downloads By URIs": "Dodaj pobieranie przez URI",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Możesz dodać wiele pobrań (plików) w tym samym czasie przez wprowadzenie URI dla każdego w oddzielnej linii.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Możesz także dodać wiele URI (luster) dla tego *samego* pliku. Zrób to, poprzez oddzielenie URI od siebie spacją.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- URI może być HTTP(S)/FTP/BitTorrent-Magnet.",\n "Download settings": "Ustawienia pobierania",\n "Advanced settings": "Zaawansowane ustawienia",\n Cancel: "Anuluj",\n Start: "Rozpocznij",\n Choose: "Wybierz",\n "Quick Access (shown on the main page)": "Szybki dostęp (pokazywane na głównej stronie)",\n // add torrent modal\n "Add Downloads By Torrents": "Dodaj pobierania przez Torrenty",\n "- Select the torrent from the local filesystem to start the download.":\n "- Wybierz torrent z lokalnego systemu plików, aby rozpocząć pobieranie.",\n "- You can select multiple torrents to start multiple downloads.":\n "- Możesz wybrać wiele torrentów do rozpoczęcia wiele pobrań.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- Aby dodać BitTorrent-URL Magnetyczny, użyj opcji dodawania przez URI i dodaj to tutaj.",\n "Select Torrents": "Wybierz Torrenty",\n "Select a Torrent": "Wybierz Torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Dodaj pobierania przez Metalinki",\n "Select Metalinks": "Wybierz Metalinki",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Wybierz Metalinki z lokalnego systemu plików, aby rozpocząć pobieranie.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Możesz wybrać wiele Metalinków, aby rozpocząć wiele pobrań.",\n "Select a Metalink": "Wybierz Metalink",\n // select file modal\n "Choose files to start download for": "Wybierz pliki, aby rozpocząć pobieranie dla",\n "Select to download": "Wybierz do pobierania",\n // settings modal\n "Aria2 RPC host and port": "Aria2 RPC host i port",\n "Enter the host": "Wprowadź host",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Wprowadź IP lub nazwę DNS serwera, na którym jest uruchomiona Aria2 z RPC (domyślnie: localhost)",\n "Enter the port": "Wprowadź port",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Wprowadź port serwera, na którym Aria2 z RPC jest uruchomiona (domyślnie 6800)",\n "Enter the RPC path": "Wprowadź ścieżkę RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Wprowadź ścieżkę dla punktu końcowego Aria2 RPC (domyślnie: /jsonrpc)",\n "SSL/TLS encryption": "szyfrowanie SSL/TLS",\n "Enable SSL/TLS encryption": "Włącz szyfrowanie SSL/TLS",\n "Enter the secret token (optional)": "Wprowadź sekretny token (opcja dodatkowa)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Wprowadź sekretny token Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",\n "Enter the username (optional)": "Wprowadź nazwę użytkownika (opcja dodatkowa)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Wprowadź nazwę użytkownika Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",\n "Enter the password (optional)": "Wprowadź hasło (opcja dodatkowa)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Wprowadź hasło Aria2 RPC (pozostaw puste, jeżeli uwierzytelnienie nie jest włączone)",\n "Enter base URL (optional)": "Wprowadź podstawowy URL (opcja dodatkowa)",\n "Direct Download": "Bezpośrednie pobieranie",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Jeżeli zaznaczone, linki mogą być utworzone do włączenia bezpośredniego pobierania z serwera Aria2",\n "(Requires appropriate webserver to be configured.)":\n "(Wymaga właściwej konfiguracji serwera WWW)",\n "Save Connection configuration": "Zapisz konfigurację połączenia",\n Filter: "Filtr",\n // server info modal\n "Aria2 server info": "Info o serwerze Aria2",\n "Aria2 Version": "Wersja Aria2",\n "Features Enabled": "Włączone funkcje",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Aby ściągnąć najnowszą wersję projektu, dodać zgłodzenia lub wspomagać projekt, udaj się do",\n "Or you can open the latest version in the browser through":\n "Lub otwórz najnowszą wersję przez przeglądarkę",\n Close: "Zamknij",\n // lables\n "Download status": "Status pobierania",\n "Download Speed": "Szybkość pobierania",\n "Upload Speed": "Szybkość wysyłania",\n "Estimated time": "Pozostały czas",\n "Download Size": "Rozmiar pobierania",\n Downloaded: "Pobrane",\n Progress: "Postęp",\n "Download Path": "Ścieżka pobierania",\n Uploaded: "Załadowany",\n "Download GID": "GID pobierania",\n "Number of Pieces": "Liczba kawałków",\n "Piece Length": "Rozmiar kawałka",\n "Shutdown Server": "Wyłącz serwer",\n "The last connection attempt was unsuccessful. Trying another configuration":\n "Ostatnia próba połączenia nie powiodła się. Spróbuj innej konfiguracji",\n "Oh Snap!": "O kurczę!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Nie można połączyć się z serwerem aria2 przez RPC. Kolejna próba za 10 sekund. Być może potrzebujesz sprawdzić ustawienie połączenia poprzez Ustawienia > Ustawienia połączenia",\n "Successfully connected to Aria2 through its remote RPC …":\n "Pomyślnie połączono się z Aria2 przez RPC ...",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Pomyślnie połączono się z Aria2 przez RPC, jednakże połączenie nie jest bezpieczne. Aby zabezpieczyć dodaj sekretny token autoryzacji podczas startu Aria2 (przez użycie flagi --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Próba połączenia się z Aria2 poprzez użycie nowej konfiguracji połączenia"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3BsX1BMLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9wbF9QTC5qcz82M2M1Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5wbF9QTCA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJTenVrYWpcIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIkRvZGFqXCIsXG4gIFwiQnkgVVJJc1wiOiBcIlByemV6IFVSTFwiLFxuICBcIkJ5IFRvcnJlbnRzXCI6IFwiUHJ6ZXogVG9ycmVudHlcIixcbiAgXCJCeSBNZXRhbGlua3NcIjogXCJQcnpleiBNZXRhbGlua2lcIixcbiAgTWFuYWdlOiBcIlphcnrEhWR6YWpcIixcbiAgXCJQYXVzZSBBbGxcIjogXCJaYXRyenltYWogd3N6eXN0a2llXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIld6bsOzdyB6YXRyenltYW5lXCIsXG4gIFwiUHVyZ2UgQ29tcGxldGVkXCI6IFwiQ3p5xZvEhyB6YWtvxYRjem9uZVwiLFxuICBTZXR0aW5nczogXCJVc3Rhd2llbmlhXCIsXG4gIFwiQ29ubmVjdGlvbiBTZXR0aW5nc1wiOiBcIlVzdGF3aWVuaWEgcG/FgsSFY3plbmlhXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwiVXN0YXdpZW5pYSBnbG9iYWxuZVwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiSW5mb3JtYWNqZSBvIHNlcndlcnplXCIsXG4gIFwiQWJvdXQgYW5kIGNvbnRyaWJ1dGVcIjogXCJPIHByb2pla2NpZVwiLFxuICBcIlRvZ2dsZSBuYXZpZ2F0aW9uXCI6IFwiUHJ6ZcWCxIVjeiBuYXdpZ2FjasSZXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwiUsOzxbxuZVwiLFxuICBcIkdsb2JhbCBTdGF0aXN0aWNzXCI6IFwiU3RhdHlzdHlraSBnbG9iYWxuZVwiLFxuICBBYm91dDogXCJPXCIsXG4gIERpc3BsYXlpbmc6IFwiV3nFm3dpZXRsYW5pZVwiLFxuICBvZjogXCJ6XCIsXG4gIGRvd25sb2FkczogXCJwb2JyYW55Y2ggcGxpa8Ozd1wiLFxuICBMYW5ndWFnZTogXCJKxJl6eWtcIixcbiAgLy8gZG93bmxvYWQgZmlsdGVyc1xuICBcIkRvd25sb2FkIEZpbHRlcnNcIjogXCJGaWx0cnkgxZtjacSFZ2FuaWFcIixcbiAgUnVubmluZzogXCJVcnVjaG9taW9uZVwiLFxuICBBY3RpdmU6IFwiQWt0eXduZVwiLFxuICBXYWl0aW5nOiBcIk9jemVrdWrEhWNlXCIsXG4gIENvbXBsZXRlOiBcIlpha2/FhGN6b25lXCIsXG4gIEVycm9yOiBcIkLFgsSFZFwiLFxuICBQYXVzZWQ6IFwiWmF0cnp5bWFuZVwiLFxuICBSZW1vdmVkOiBcIlVzdW5pxJl0ZVwiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcIlVrcnlqIHphbGlua293YW5lIG1ldGEtZGFuZVwiLFxuICBUb2dnbGU6IFwiUHJ6ZcWCxIVjelwiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCJSZXNldCBmaWx0csOzd1wiLFxuICAvLyBzdGFycmVkIHByb3BlcnRpZXNcbiAgXCJRdWljayBBY2Nlc3MgU2V0dGluZ3NcIjogXCJVc3Rhd2llbmlhIHN6eWJraWVnbyBkb3N0xJlwdVwiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCJaYXBpc3ogdXN0YXdpZW5pYVwiLFxuICBcIkN1cnJlbnRseSBubyBkb3dubG9hZCBpbiBsaW5lIHRvIGRpc3BsYXksIHVzZSB0aGVcIjpcbiAgICBcIk9iZWNuaWUgbmllIG1vxbxuYSB3ecWbd2lldGxpxIcgxbxhZG55Y2ggcG9iaWVyYW55Y2ggcGxpa8Ozdy4gVcW8eWogcHJ6eWNpc2t1XCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcImFieSByb3pwb2N6xIXEhyDFm2NpxIVnYW5pZSBwbGlrw7N3IVwiLFxuICBQZWVyczogXCJQZWVyw7N3XCIsXG4gIFwiTW9yZSBJbmZvXCI6IFwiV2nEmWNlaiBpbmZvXCIsXG4gIFJlbW92ZTogXCJVc3XFhFwiLFxuICBcIiMgb2ZcIjogXCIjIHpcIixcbiAgTGVuZ3RoOiBcIkTFgnVnb8WbxIdcIixcbiAgLy8gbW9kYWxzXG4gIFwiQWRkIERvd25sb2FkcyBCeSBVUklzXCI6IFwiRG9kYWogcG9iaWVyYW5pZSBwcnpleiBVUklcIixcbiAgXCItIFlvdSBjYW4gYWRkIG11bHRpcGxlIGRvd25sb2FkcyAoZmlsZXMpIGF0IHRoZSBzYW1lIHRpbWUgYnkgcHV0dGluZyBVUklzIGZvciBlYWNoIGZpbGUgb24gYSBzZXBhcmF0ZSBsaW5lLlwiOlxuICAgIFwiLSBNb8W8ZXN6IGRvZGHEhyB3aWVsZSBwb2JyYcWEIChwbGlrw7N3KSB3IHR5bSBzYW15bSBjemFzaWUgcHJ6ZXogd3Byb3dhZHplbmllIFVSSSBkbGEga2HFvGRlZ28gdyBvZGR6aWVsbmVqIGxpbmlpLlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSBNb8W8ZXN6IHRha8W8ZSBkb2RhxIcgd2llbGUgVVJJIChsdXN0ZXIpIGRsYSB0ZWdvICpzYW1lZ28qIHBsaWt1LiBacsOzYiB0bywgcG9wcnpleiBvZGR6aWVsZW5pZSBVUkkgb2Qgc2llYmllIHNwYWNqxIUuXCIsXG4gIFwiLSBBIFVSSSBjYW4gYmUgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCI6IFwiLSBVUkkgbW/FvGUgYnnEhyBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIixcbiAgXCJEb3dubG9hZCBzZXR0aW5nc1wiOiBcIlVzdGF3aWVuaWEgcG9iaWVyYW5pYVwiLFxuICBcIkFkdmFuY2VkIHNldHRpbmdzXCI6IFwiWmFhd2Fuc293YW5lIHVzdGF3aWVuaWFcIixcbiAgQ2FuY2VsOiBcIkFudWx1alwiLFxuICBTdGFydDogXCJSb3pwb2N6bmlqXCIsXG4gIENob29zZTogXCJXeWJpZXJ6XCIsXG4gIFwiUXVpY2sgQWNjZXNzIChzaG93biBvbiB0aGUgbWFpbiBwYWdlKVwiOiBcIlN6eWJraSBkb3N0xJlwIChwb2thenl3YW5lIG5hIGfFgsOzd25laiBzdHJvbmllKVwiLFxuICAvLyBhZGQgdG9ycmVudCBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgVG9ycmVudHNcIjogXCJEb2RhaiBwb2JpZXJhbmlhIHByemV6IFRvcnJlbnR5XCIsXG4gIFwiLSBTZWxlY3QgdGhlIHRvcnJlbnQgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIFd5YmllcnogdG9ycmVudCB6IGxva2FsbmVnbyBzeXN0ZW11IHBsaWvDs3csIGFieSByb3pwb2N6xIXEhyBwb2JpZXJhbmllLlwiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgdG9ycmVudHMgdG8gc3RhcnQgbXVsdGlwbGUgZG93bmxvYWRzLlwiOlxuICAgIFwiLSBNb8W8ZXN6IHd5YnJhxIcgd2llbGUgdG9ycmVudMOzdyBkbyByb3pwb2N6xJljaWEgd2llbGUgcG9icmHFhC5cIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOlxuICAgIFwiLSBBYnkgZG9kYcSHIEJpdFRvcnJlbnQtVVJMIE1hZ25ldHljem55LCB1xbx5aiBvcGNqaSBkb2Rhd2FuaWEgcHJ6ZXogVVJJIGkgZG9kYWogdG8gdHV0YWouXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwiV3liaWVyeiBUb3JyZW50eVwiLFxuICBcIlNlbGVjdCBhIFRvcnJlbnRcIjogXCJXeWJpZXJ6IFRvcnJlbnRcIixcbiAgLy8gYWRkIG1ldGFsaW5rIG1vZGFsXG4gIFwiQWRkIERvd25sb2FkcyBCeSBNZXRhbGlua3NcIjogXCJEb2RhaiBwb2JpZXJhbmlhIHByemV6IE1ldGFsaW5raVwiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCJXeWJpZXJ6IE1ldGFsaW5raVwiLFxuICBcIi0gU2VsZWN0IHRoZSBNZXRhbGluayBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIi0gV3liaWVyeiBNZXRhbGlua2kgeiBsb2thbG5lZ28gc3lzdGVtdSBwbGlrw7N3LCBhYnkgcm96cG9jesSFxIcgcG9iaWVyYW5pZS5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItIE1vxbxlc3ogd3licmHEhyB3aWVsZSBNZXRhbGlua8OzdywgYWJ5IHJvenBvY3rEhcSHIHdpZWxlIHBvYnJhxYQuXCIsXG4gIFwiU2VsZWN0IGEgTWV0YWxpbmtcIjogXCJXeWJpZXJ6IE1ldGFsaW5rXCIsXG4gIC8vIHNlbGVjdCBmaWxlIG1vZGFsXG4gIFwiQ2hvb3NlIGZpbGVzIHRvIHN0YXJ0IGRvd25sb2FkIGZvclwiOiBcIld5YmllcnogcGxpa2ksIGFieSByb3pwb2N6xIXEhyBwb2JpZXJhbmllIGRsYVwiLFxuICBcIlNlbGVjdCB0byBkb3dubG9hZFwiOiBcIld5YmllcnogZG8gcG9iaWVyYW5pYVwiLFxuICAvLyBzZXR0aW5ncyBtb2RhbFxuICBcIkFyaWEyIFJQQyBob3N0IGFuZCBwb3J0XCI6IFwiQXJpYTIgUlBDIGhvc3QgaSBwb3J0XCIsXG4gIFwiRW50ZXIgdGhlIGhvc3RcIjogXCJXcHJvd2FkxbogaG9zdFwiLFxuICBcIkVudGVyIHRoZSBJUCBvciBETlMgbmFtZSBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IGxvY2FsaG9zdClcIjpcbiAgICBcIldwcm93YWTFuiBJUCBsdWIgbmF6d8SZIEROUyBzZXJ3ZXJhLCBuYSBrdMOzcnltIGplc3QgdXJ1Y2hvbWlvbmEgQXJpYTIgeiBSUEMgKGRvbXnFm2xuaWU6IGxvY2FsaG9zdClcIixcbiAgXCJFbnRlciB0aGUgcG9ydFwiOiBcIldwcm93YWTFuiBwb3J0XCIsXG4gIFwiRW50ZXIgdGhlIHBvcnQgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiA2ODAwKVwiOlxuICAgIFwiV3Byb3dhZMW6IHBvcnQgc2Vyd2VyYSwgbmEga3TDs3J5bSBBcmlhMiB6IFJQQyBqZXN0IHVydWNob21pb25hIChkb215xZtsbmllIDY4MDApXCIsXG4gIFwiRW50ZXIgdGhlIFJQQyBwYXRoXCI6IFwiV3Byb3dhZMW6IMWbY2llxbxrxJkgUlBDXCIsXG4gIFwiRW50ZXIgdGhlIHBhdGggZm9yIHRoZSBBcmlhMiBSUEMgZW5kcG9pbnQgKGRlZmF1bHQ6IC9qc29ucnBjKVwiOlxuICAgIFwiV3Byb3dhZMW6IMWbY2llxbxrxJkgZGxhIHB1bmt0dSBrb8WEY293ZWdvIEFyaWEyIFJQQyAoZG9tecWbbG5pZTogL2pzb25ycGMpXCIsXG4gIFwiU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwic3p5ZnJvd2FuaWUgU1NML1RMU1wiLFxuICBcIkVuYWJsZSBTU0wvVExTIGVuY3J5cHRpb25cIjogXCJXxYLEhWN6IHN6eWZyb3dhbmllIFNTTC9UTFNcIixcbiAgXCJFbnRlciB0aGUgc2VjcmV0IHRva2VuIChvcHRpb25hbClcIjogXCJXcHJvd2Fkxbogc2VrcmV0bnkgdG9rZW4gKG9wY2phIGRvZGF0a293YSlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHNlY3JldCB0b2tlbiAobGVhdmUgZW1wdHkgaWYgYXV0aGVudGljYXRpb24gaXMgbm90IGVuYWJsZWQpXCI6XG4gICAgXCJXcHJvd2Fkxbogc2VrcmV0bnkgdG9rZW4gQXJpYTIgUlBDIChwb3pvc3RhdyBwdXN0ZSwgamXFvGVsaSB1d2llcnp5dGVsbmllbmllIG5pZSBqZXN0IHfFgsSFY3pvbmUpXCIsXG4gIFwiRW50ZXIgdGhlIHVzZXJuYW1lIChvcHRpb25hbClcIjogXCJXcHJvd2FkxbogbmF6d8SZIHXFvHl0a293bmlrYSAob3BjamEgZG9kYXRrb3dhKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgdXNlcm5hbWUgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiV3Byb3dhZMW6IG5henfEmSB1xbx5dGtvd25pa2EgQXJpYTIgUlBDIChwb3pvc3RhdyBwdXN0ZSwgamXFvGVsaSB1d2llcnp5dGVsbmllbmllIG5pZSBqZXN0IHfFgsSFY3pvbmUpXCIsXG4gIFwiRW50ZXIgdGhlIHBhc3N3b3JkIChvcHRpb25hbClcIjogXCJXcHJvd2FkxbogaGFzxYJvIChvcGNqYSBkb2RhdGtvd2EpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBwYXNzd29yZCAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJXcHJvd2FkxbogaGFzxYJvIEFyaWEyIFJQQyAocG96b3N0YXcgcHVzdGUsIGplxbxlbGkgdXdpZXJ6eXRlbG5pZW5pZSBuaWUgamVzdCB3xYLEhWN6b25lKVwiLFxuICBcIkVudGVyIGJhc2UgVVJMIChvcHRpb25hbClcIjogXCJXcHJvd2FkxbogcG9kc3Rhd293eSBVUkwgKG9wY2phIGRvZGF0a293YSlcIixcbiAgXCJEaXJlY3QgRG93bmxvYWRcIjogXCJCZXpwb8WbcmVkbmllIHBvYmllcmFuaWVcIixcbiAgXCJJZiBzdXBwbGllZCwgbGlua3Mgd2lsbCBiZSBjcmVhdGVkIHRvIGVuYWJsZSBkaXJlY3QgZG93bmxvYWQgZnJvbSB0aGUgQXJpYTIgc2VydmVyLlwiOlxuICAgIFwiSmXFvGVsaSB6YXpuYWN6b25lLCBsaW5raSBtb2fEhSBiecSHIHV0d29yem9uZSBkbyB3xYLEhWN6ZW5pYSBiZXpwb8WbcmVkbmllZ28gcG9iaWVyYW5pYSB6IHNlcndlcmEgQXJpYTJcIixcbiAgXCIoUmVxdWlyZXMgYXBwcm9wcmlhdGUgd2Vic2VydmVyIHRvIGJlIGNvbmZpZ3VyZWQuKVwiOlxuICAgIFwiKFd5bWFnYSB3xYJhxZtjaXdlaiBrb25maWd1cmFjamkgc2Vyd2VyYSBXV1cpXCIsXG4gIFwiU2F2ZSBDb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIjogXCJaYXBpc3oga29uZmlndXJhY2rEmSBwb8WCxIVjemVuaWFcIixcbiAgRmlsdGVyOiBcIkZpbHRyXCIsXG4gIC8vIHNlcnZlciBpbmZvIG1vZGFsXG4gIFwiQXJpYTIgc2VydmVyIGluZm9cIjogXCJJbmZvIG8gc2Vyd2VyemUgQXJpYTJcIixcbiAgXCJBcmlhMiBWZXJzaW9uXCI6IFwiV2Vyc2phIEFyaWEyXCIsXG4gIFwiRmVhdHVyZXMgRW5hYmxlZFwiOiBcIlfFgsSFY3pvbmUgZnVua2NqZVwiLFxuICAvLyBhYm91dCBtb2RhbFxuICBcIlRvIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCwgYWRkIGlzc3VlcyBvciB0byBjb250cmlidXRlIGJhY2ssIGhlYWQgb24gdG9cIjpcbiAgICBcIkFieSDFm2NpxIVnbsSFxIcgbmFqbm93c3rEhSB3ZXJzasSZIHByb2pla3R1LCBkb2RhxIcgemfFgm9kemVuaWEgbHViIHdzcG9tYWdhxIcgcHJvamVrdCwgdWRhaiBzacSZIGRvXCIsXG4gIFwiT3IgeW91IGNhbiBvcGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiB0aGUgYnJvd3NlciB0aHJvdWdoXCI6XG4gICAgXCJMdWIgb3R3w7NyeiBuYWpub3dzesSFIHdlcnNqxJkgcHJ6ZXogcHJ6ZWdsxIVkYXJrxJlcIixcbiAgQ2xvc2U6IFwiWmFta25palwiLFxuICAvLyBsYWJsZXNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCJTdGF0dXMgcG9iaWVyYW5pYVwiLFxuICBcIkRvd25sb2FkIFNwZWVkXCI6IFwiU3p5YmtvxZvEhyBwb2JpZXJhbmlhXCIsXG4gIFwiVXBsb2FkIFNwZWVkXCI6IFwiU3p5YmtvxZvEhyB3eXN5xYJhbmlhXCIsXG4gIFwiRXN0aW1hdGVkIHRpbWVcIjogXCJQb3pvc3RhxYJ5IGN6YXNcIixcbiAgXCJEb3dubG9hZCBTaXplXCI6IFwiUm96bWlhciBwb2JpZXJhbmlhXCIsXG4gIERvd25sb2FkZWQ6IFwiUG9icmFuZVwiLFxuICBQcm9ncmVzczogXCJQb3N0xJlwXCIsXG4gIFwiRG93bmxvYWQgUGF0aFwiOiBcIsWaY2llxbxrYSBwb2JpZXJhbmlhXCIsXG4gIFVwbG9hZGVkOiBcIlphxYJhZG93YW55XCIsXG4gIFwiRG93bmxvYWQgR0lEXCI6IFwiR0lEIHBvYmllcmFuaWFcIixcbiAgXCJOdW1iZXIgb2YgUGllY2VzXCI6IFwiTGljemJhIGthd2HFgmvDs3dcIixcbiAgXCJQaWVjZSBMZW5ndGhcIjogXCJSb3ptaWFyIGthd2HFgmthXCIsXG4gIFwiU2h1dGRvd24gU2VydmVyXCI6IFwiV3nFgsSFY3ogc2Vyd2VyXCIsXG4gIFwiVGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0IHdhcyB1bnN1Y2Nlc3NmdWwuIFRyeWluZyBhbm90aGVyIGNvbmZpZ3VyYXRpb25cIjpcbiAgICBcIk9zdGF0bmlhIHByw7NiYSBwb8WCxIVjemVuaWEgbmllIHBvd2lvZMWCYSBzacSZLiBTcHLDs2J1aiBpbm5laiBrb25maWd1cmFjamlcIixcbiAgXCJPaCBTbmFwIVwiOiBcIk8ga3VyY3rEmSFcIixcbiAgXCJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgYXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIk5pZSBtb8W8bmEgcG/FgsSFY3p5xIcgc2nEmSB6IHNlcndlcmVtIGFyaWEyIHByemV6IFJQQy4gS29sZWpuYSBwcsOzYmEgemEgMTAgc2VrdW5kLiBCecSHIG1vxbxlIHBvdHJ6ZWJ1amVzeiBzcHJhd2R6acSHIHVzdGF3aWVuaWUgcG/FgsSFY3plbmlhIHBvcHJ6ZXogVXN0YXdpZW5pYSA+IFVzdGF3aWVuaWEgcG/FgsSFY3plbmlhXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIGl0cyByZW1vdGUgUlBDIOKAplwiOlxuICAgIFwiUG9tecWbbG5pZSBwb8WCxIVjem9ubyBzacSZIHogQXJpYTIgcHJ6ZXogUlBDIC4uLlwiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCByZW1vdGUgUlBDLCBob3dldmVyIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGluc2VjdXJlLiBGb3IgY29tcGxldGUgc2VjdXJpdHkgdHJ5IGFkZGluZyBhbiBhdXRob3JpemF0aW9uIHNlY3JldCB0b2tlbiB3aGlsZSBzdGFydGluZyBBcmlhMiAodGhyb3VnaCB0aGUgZmxhZyAtLXJwYy1zZWNyZXQpXCI6XG4gICAgXCJQb215xZtsbmllIHBvxYLEhWN6b25vIHNpxJkgeiBBcmlhMiBwcnpleiBSUEMsIGplZG5ha8W8ZSBwb8WCxIVjemVuaWUgbmllIGplc3QgYmV6cGllY3puZS4gQWJ5IHphYmV6cGllY3p5xIcgZG9kYWogc2VrcmV0bnkgdG9rZW4gYXV0b3J5emFjamkgcG9kY3phcyBzdGFydHUgQXJpYTIgKHByemV6IHXFvHljaWUgZmxhZ2kgLS1ycGMtc2VjcmV0KVwiLFxuICBcIlRyeWluZyB0byBjb25uZWN0IHRvIGFyaWEyIHVzaW5nIHRoZSBuZXcgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6XG4gICAgXCJQcsOzYmEgcG/FgsSFY3plbmlhIHNpxJkgeiBBcmlhMiBwb3ByemV6IHXFvHljaWUgbm93ZWoga29uZmlndXJhY2ppIHBvxYLEhWN6ZW5pYVwiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/translate/pl_PL.js\n'
);
/***/
},
/***/ "./src/js/translate/pt_BR.js":
/*!***********************************!*\
!*** ./src/js/translate/pt_BR.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.pt_BR = {\n // replace en_US to ll_CC, examples: zh_CN, de_AT.\n // header\n Search: "Buscar",\n // Nav menu\n Add: "Adicionar",\n "By URIs": "Por URIs",\n "By Torrents": "Por Torrents",\n "By Metalinks": "Por Metalinks",\n Manage: "Gerenciar",\n "Pause All": "Pausar Todos",\n "Resume Paused": "Retomar Pausados",\n "Purge Completed": "Remover Completados",\n "Shutdown Server": "Desligar Servidor",\n Settings: "Configurações",\n "Connection Settings": "Configurações de Conexão",\n "Global Settings": "Configurações Globais",\n "Server info": "Informações do Servidor",\n "About and contribute": "Sobre e contribuições",\n "Toggle navigation": "Alternar navegação",\n // body\n // nav side bar\n Miscellaneous: "Miscelânia",\n "Global Statistics": "Estatísticas Globais",\n About: "Sobre",\n Displaying: "Mostrando",\n of: "de",\n downloads: "downloads",\n Language: "Linguagem",\n // download filters\n "Download Filters": "Filtros de Download",\n Running: "Rodando",\n Active: "Ativo",\n Waiting: "Esperando",\n Complete: "Completo",\n Error: "Erro",\n Paused: "Pausado",\n Removed: "Removido",\n "Hide linked meta-data": "Esconder metadados ligados",\n Toggle: "Alternar",\n "Reset filters": "Limpar filtros",\n // download status\n Verifing: "Verificando",\n "Verify Pending": "Verificação Pendente",\n // starred properties\n "Quick Access Settings": "Acesso Rápido às Configurações",\n Save: "Salvar",\n "Save settings": "Salvar configurações",\n "Currently no download in line to display, use the":\n "No momento não existem downloads para mostrar, utilize botão",\n "download button to start downloading files!": "pra iniciar a transferência de arquivos!",\n Peers: "Peers",\n "More Info": "Mais informações",\n Remove: "Remover",\n "# of": " de",\n Length: "Tamanho",\n // modals\n "Add Downloads By URIs": "Adicionar Downloads por URIs",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Você pode adicionar múltiplos downloads (arquivos) ao mesmo tempo inserindo a URI de cada arquivo em uma linha separada.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Você também pode adicionar múltiplas URIs (mirrors) para o *mesmo* arquivo. Para fazer isto, separe as URIs por um espaço.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- Uma URI pode ser HTTP(S)/FTP/BitTorrent-Magnet.",\n "Download settings": "Configurações de download",\n "Advanced settings": "Configurações avançadas",\n Cancel: "Cancelar",\n Start: "Iniciar",\n Choose: "Escolher",\n "Quick Access (shown on the main page)": "Acesso Rápido (exibido na página principal)",\n // add torrent modal\n "Add Downloads By Torrents": "Adicionar Downloads por Torrents",\n "- Select the torrent from the local filesystem to start the download.":\n "- Selecione o torrent de seu sistema de arquivos local para iniciar o download.",\n "- You can select multiple torrents to start multiple downloads.":\n "- Você pode selecionar múltiplos torrents para iniciar múltiplos downloads.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- Para adicionar uma URL BitTorrent-Magnet, utilize a opção Adicionar por URI.",\n "Select Torrents": "Selecione Torrents",\n "Select a Torrent": "Selecione um Torrent",\n // add metalink modal\n "Add Downloads By Metalinks": "Adicionar Downloads por Metalinks",\n "Select Metalinks": "Selecione Metalinks",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Selecione o Metalink do seu sistema de arquivos local para iniciar o download.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Você pode selecionar múltiplos Metalinks para iniciar múltiplos downloads.",\n "Select a Metalink": "Selecione um Metalink",\n // select file modal\n "Choose files to start download for": "Selecione os arquvos para serem baixados",\n "Select to download": "Selecione para baixar",\n // settings modal\n "Aria2 RPC host and port": "Host e porta do RPC Aria2",\n "Enter the host": "Informe o host",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Informe o IP ou nome DNS do servidor no qual o RPC do Aria2 está rodando (default: localhost)",\n "Enter the port": "Informe a porta",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Informe a porta do servidor no qual o RPC do Aria2 está rodando (default: 6800)",\n "Enter the RPC path": "Informe o caminho RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Informe o caminho para o endpoint RPC do Aria2 (default: /jasonrpc)",\n "SSL/TLS encryption": "Criptografia SSL/TLS",\n "Enable SSL/TLS encryption": "Habilita criptografia SSL/TLS",\n "Enter the secret token (optional)": "Informe o token secreto (opcional)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Informe o token secreto do RPC Aria2 (deixe vazio se a autenticação não estiver habilitada)",\n "Enter the username (optional)": "Informe o usuário (opcional)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Informe o usuário RPC do Aria2 (vazio se a autenticação não estiver habilitada)",\n "Enter the password (optional)": "Informe a senha (opcional)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Informe a senha RPC do Aria2 (vazio se a autenticação não estiver habilitada)",\n "Enter base URL (optional)": "Informe a URL base (opcional)",\n "Direct Download": "Download Direto",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Se fornecido, links serão criados para permitir download direto do servidor Aria2.",\n "(Requires appropriate webserver to be configured.)":\n "(Requer servidor web apropriado a ser configurado.)",\n "Save Connection configuration": "Salvar Configuração de conexão",\n Filter: "Filtrar",\n // server info modal\n "Aria2 server info": "Informações do servidor Aria2",\n "Aria2 Version": "Verão do Aria2",\n "Features Enabled": "Opções Habilitadas",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Para baixar a última versão do projeto, reportar problemas ou contribuir, acesse",\n "Or you can open the latest version in the browser through":\n "Ou você pode acessar a última versão pelo navegador através",\n Close: "Fechar",\n // labels\n "Download status": "Status do download",\n "Download Speed": "Velocidade de download",\n "Upload Speed": "Velocidade de upload",\n "Estimated time": "Tempo estimado",\n "Download Size": "Tamanho do download",\n Downloaded: "Baixado",\n Progress: "Progresso",\n "Download Path": "Caminho do download",\n Uploaded: "Enviado",\n "Download GID": "GID do download",\n "Number of Pieces": "Número de partes",\n "Piece Length": "Tamanho das partes",\n\n //alerts\n "The last connection attempt was unsuccessful. Trying another configuration":\n "A última tentativa de conexão não teve sucesso. Tentando outra configuração",\n "Oh Snap!": "Ah Droga!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Não foi possível conectar no servidor RPC aria2. Tententando em 10 seg. Você pode querer verificar as configurações da conexão em Configurações > Configurações de Conexão",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "Autenticação falhou enquanto conectando ao servidor RPC Aria2. Tentando em 10 seg. Você pode querer confirmar os detalhes de autenticação acessando Configurações > Configurações de Conexão",\n "Successfully connected to Aria2 through its remote RPC …":\n "Conectado com sucesso ao Aria2 através de seu RPC remoto …",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Conectado com sucesso ao Aria2 através de seu RPC remoto, contudo a conexão é insegura. Para uma completa segurança tente adicionar um token secreto de autorização quando iniciar o Aria2 (através da opção --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Tentando conectar-se ao aria2 utilizando a nova configuração de conexão",\n // {{name}} refers to the download name, do not modify.\n "Remove {{name}} and associated meta-data?": "Remover {{name}} e os metadados associados?"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3B0X0JSLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9wdF9CUi5qcz8zNTdkIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5wdF9CUiA9IHtcbiAgLy8gcmVwbGFjZSBlbl9VUyB0byBsbF9DQywgZXhhbXBsZXM6IHpoX0NOLCBkZV9BVC5cbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJCdXNjYXJcIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIkFkaWNpb25hclwiLFxuICBcIkJ5IFVSSXNcIjogXCJQb3IgVVJJc1wiLFxuICBcIkJ5IFRvcnJlbnRzXCI6IFwiUG9yIFRvcnJlbnRzXCIsXG4gIFwiQnkgTWV0YWxpbmtzXCI6IFwiUG9yIE1ldGFsaW5rc1wiLFxuICBNYW5hZ2U6IFwiR2VyZW5jaWFyXCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwiUGF1c2FyIFRvZG9zXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIlJldG9tYXIgUGF1c2Fkb3NcIixcbiAgXCJQdXJnZSBDb21wbGV0ZWRcIjogXCJSZW1vdmVyIENvbXBsZXRhZG9zXCIsXG4gIFwiU2h1dGRvd24gU2VydmVyXCI6IFwiRGVzbGlnYXIgU2Vydmlkb3JcIixcbiAgU2V0dGluZ3M6IFwiQ29uZmlndXJhw6fDtWVzXCIsXG4gIFwiQ29ubmVjdGlvbiBTZXR0aW5nc1wiOiBcIkNvbmZpZ3VyYcOnw7VlcyBkZSBDb25leMOjb1wiLFxuICBcIkdsb2JhbCBTZXR0aW5nc1wiOiBcIkNvbmZpZ3VyYcOnw7VlcyBHbG9iYWlzXCIsXG4gIFwiU2VydmVyIGluZm9cIjogXCJJbmZvcm1hw6fDtWVzIGRvIFNlcnZpZG9yXCIsXG4gIFwiQWJvdXQgYW5kIGNvbnRyaWJ1dGVcIjogXCJTb2JyZSBlIGNvbnRyaWJ1acOnw7Vlc1wiLFxuICBcIlRvZ2dsZSBuYXZpZ2F0aW9uXCI6IFwiQWx0ZXJuYXIgbmF2ZWdhw6fDo29cIixcbiAgLy8gYm9keVxuICAvLyBuYXYgc2lkZSBiYXJcbiAgTWlzY2VsbGFuZW91czogXCJNaXNjZWzDom5pYVwiLFxuICBcIkdsb2JhbCBTdGF0aXN0aWNzXCI6IFwiRXN0YXTDrXN0aWNhcyBHbG9iYWlzXCIsXG4gIEFib3V0OiBcIlNvYnJlXCIsXG4gIERpc3BsYXlpbmc6IFwiTW9zdHJhbmRvXCIsXG4gIG9mOiBcImRlXCIsXG4gIGRvd25sb2FkczogXCJkb3dubG9hZHNcIixcbiAgTGFuZ3VhZ2U6IFwiTGluZ3VhZ2VtXCIsXG4gIC8vIGRvd25sb2FkIGZpbHRlcnNcbiAgXCJEb3dubG9hZCBGaWx0ZXJzXCI6IFwiRmlsdHJvcyBkZSBEb3dubG9hZFwiLFxuICBSdW5uaW5nOiBcIlJvZGFuZG9cIixcbiAgQWN0aXZlOiBcIkF0aXZvXCIsXG4gIFdhaXRpbmc6IFwiRXNwZXJhbmRvXCIsXG4gIENvbXBsZXRlOiBcIkNvbXBsZXRvXCIsXG4gIEVycm9yOiBcIkVycm9cIixcbiAgUGF1c2VkOiBcIlBhdXNhZG9cIixcbiAgUmVtb3ZlZDogXCJSZW1vdmlkb1wiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcIkVzY29uZGVyIG1ldGFkYWRvcyBsaWdhZG9zXCIsXG4gIFRvZ2dsZTogXCJBbHRlcm5hclwiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCJMaW1wYXIgZmlsdHJvc1wiLFxuICAvLyBkb3dubG9hZCBzdGF0dXNcbiAgVmVyaWZpbmc6IFwiVmVyaWZpY2FuZG9cIixcbiAgXCJWZXJpZnkgUGVuZGluZ1wiOiBcIlZlcmlmaWNhw6fDo28gUGVuZGVudGVcIixcbiAgLy8gc3RhcnJlZCBwcm9wZXJ0aWVzXG4gIFwiUXVpY2sgQWNjZXNzIFNldHRpbmdzXCI6IFwiQWNlc3NvIFLDoXBpZG8gw6BzIENvbmZpZ3VyYcOnw7Vlc1wiLFxuICBTYXZlOiBcIlNhbHZhclwiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCJTYWx2YXIgY29uZmlndXJhw6fDtWVzXCIsXG4gIFwiQ3VycmVudGx5IG5vIGRvd25sb2FkIGluIGxpbmUgdG8gZGlzcGxheSwgdXNlIHRoZVwiOlxuICAgIFwiTm8gbW9tZW50byBuw6NvIGV4aXN0ZW0gZG93bmxvYWRzIHBhcmEgbW9zdHJhciwgdXRpbGl6ZSBib3TDo29cIixcbiAgXCJkb3dubG9hZCBidXR0b24gdG8gc3RhcnQgZG93bmxvYWRpbmcgZmlsZXMhXCI6IFwicHJhIGluaWNpYXIgYSB0cmFuc2ZlcsOqbmNpYSBkZSBhcnF1aXZvcyFcIixcbiAgUGVlcnM6IFwiUGVlcnNcIixcbiAgXCJNb3JlIEluZm9cIjogXCJNYWlzIGluZm9ybWHDp8O1ZXNcIixcbiAgUmVtb3ZlOiBcIlJlbW92ZXJcIixcbiAgXCIjIG9mXCI6IFwiIGRlXCIsXG4gIExlbmd0aDogXCJUYW1hbmhvXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIkFkaWNpb25hciBEb3dubG9hZHMgcG9yIFVSSXNcIixcbiAgXCItIFlvdSBjYW4gYWRkIG11bHRpcGxlIGRvd25sb2FkcyAoZmlsZXMpIGF0IHRoZSBzYW1lIHRpbWUgYnkgcHV0dGluZyBVUklzIGZvciBlYWNoIGZpbGUgb24gYSBzZXBhcmF0ZSBsaW5lLlwiOlxuICAgIFwiLSBWb2PDqiBwb2RlIGFkaWNpb25hciBtw7psdGlwbG9zIGRvd25sb2FkcyAoYXJxdWl2b3MpIGFvIG1lc21vIHRlbXBvIGluc2VyaW5kbyBhIFVSSSBkZSBjYWRhIGFycXVpdm8gZW0gdW1hIGxpbmhhIHNlcGFyYWRhLlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSBWb2PDqiB0YW1iw6ltIHBvZGUgYWRpY2lvbmFyIG3Dumx0aXBsYXMgVVJJcyAobWlycm9ycykgcGFyYSBvICptZXNtbyogYXJxdWl2by4gUGFyYSBmYXplciBpc3RvLCBzZXBhcmUgYXMgVVJJcyBwb3IgdW0gZXNwYcOnby5cIixcbiAgXCItIEEgVVJJIGNhbiBiZSBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIjpcbiAgICBcIi0gVW1hIFVSSSBwb2RlIHNlciBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIixcbiAgXCJEb3dubG9hZCBzZXR0aW5nc1wiOiBcIkNvbmZpZ3VyYcOnw7VlcyBkZSBkb3dubG9hZFwiLFxuICBcIkFkdmFuY2VkIHNldHRpbmdzXCI6IFwiQ29uZmlndXJhw6fDtWVzIGF2YW7Dp2FkYXNcIixcbiAgQ2FuY2VsOiBcIkNhbmNlbGFyXCIsXG4gIFN0YXJ0OiBcIkluaWNpYXJcIixcbiAgQ2hvb3NlOiBcIkVzY29saGVyXCIsXG4gIFwiUXVpY2sgQWNjZXNzIChzaG93biBvbiB0aGUgbWFpbiBwYWdlKVwiOiBcIkFjZXNzbyBSw6FwaWRvIChleGliaWRvIG5hIHDDoWdpbmEgcHJpbmNpcGFsKVwiLFxuICAvLyBhZGQgdG9ycmVudCBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgVG9ycmVudHNcIjogXCJBZGljaW9uYXIgRG93bmxvYWRzIHBvciBUb3JyZW50c1wiLFxuICBcIi0gU2VsZWN0IHRoZSB0b3JyZW50IGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiLSBTZWxlY2lvbmUgbyB0b3JyZW50IGRlIHNldSBzaXN0ZW1hIGRlIGFycXVpdm9zIGxvY2FsIHBhcmEgaW5pY2lhciBvIGRvd25sb2FkLlwiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgdG9ycmVudHMgdG8gc3RhcnQgbXVsdGlwbGUgZG93bmxvYWRzLlwiOlxuICAgIFwiLSBWb2PDqiBwb2RlIHNlbGVjaW9uYXIgbcO6bHRpcGxvcyB0b3JyZW50cyBwYXJhIGluaWNpYXIgbcO6bHRpcGxvcyBkb3dubG9hZHMuXCIsXG4gIFwiLSBUbyBhZGQgYSBCaXRUb3JyZW50LU1hZ25ldCBVUkwsIHVzZSB0aGUgQWRkIEJ5IFVSSSBvcHRpb24gYW5kIGFkZCBpdCB0aGVyZS5cIjpcbiAgICBcIi0gUGFyYSBhZGljaW9uYXIgdW1hIFVSTCBCaXRUb3JyZW50LU1hZ25ldCwgdXRpbGl6ZSBhIG9ww6fDo28gQWRpY2lvbmFyIHBvciBVUkkuXCIsXG4gIFwiU2VsZWN0IFRvcnJlbnRzXCI6IFwiU2VsZWNpb25lIFRvcnJlbnRzXCIsXG4gIFwiU2VsZWN0IGEgVG9ycmVudFwiOiBcIlNlbGVjaW9uZSB1bSBUb3JyZW50XCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwiQWRpY2lvbmFyIERvd25sb2FkcyBwb3IgTWV0YWxpbmtzXCIsXG4gIFwiU2VsZWN0IE1ldGFsaW5rc1wiOiBcIlNlbGVjaW9uZSBNZXRhbGlua3NcIixcbiAgXCItIFNlbGVjdCB0aGUgTWV0YWxpbmsgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIFNlbGVjaW9uZSBvIE1ldGFsaW5rIGRvIHNldSBzaXN0ZW1hIGRlIGFycXVpdm9zIGxvY2FsIHBhcmEgaW5pY2lhciBvIGRvd25sb2FkLlwiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgTWV0YWxpbmtzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIi0gVm9jw6ogcG9kZSBzZWxlY2lvbmFyIG3Dumx0aXBsb3MgTWV0YWxpbmtzIHBhcmEgaW5pY2lhciBtw7psdGlwbG9zIGRvd25sb2Fkcy5cIixcbiAgXCJTZWxlY3QgYSBNZXRhbGlua1wiOiBcIlNlbGVjaW9uZSB1bSBNZXRhbGlua1wiLFxuICAvLyBzZWxlY3QgZmlsZSBtb2RhbFxuICBcIkNob29zZSBmaWxlcyB0byBzdGFydCBkb3dubG9hZCBmb3JcIjogXCJTZWxlY2lvbmUgb3MgYXJxdXZvcyBwYXJhIHNlcmVtIGJhaXhhZG9zXCIsXG4gIFwiU2VsZWN0IHRvIGRvd25sb2FkXCI6IFwiU2VsZWNpb25lIHBhcmEgYmFpeGFyXCIsXG4gIC8vIHNldHRpbmdzIG1vZGFsXG4gIFwiQXJpYTIgUlBDIGhvc3QgYW5kIHBvcnRcIjogXCJIb3N0IGUgcG9ydGEgZG8gUlBDIEFyaWEyXCIsXG4gIFwiRW50ZXIgdGhlIGhvc3RcIjogXCJJbmZvcm1lIG8gaG9zdFwiLFxuICBcIkVudGVyIHRoZSBJUCBvciBETlMgbmFtZSBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IGxvY2FsaG9zdClcIjpcbiAgICBcIkluZm9ybWUgbyBJUCBvdSBub21lIEROUyBkbyBzZXJ2aWRvciBubyBxdWFsIG8gUlBDIGRvIEFyaWEyIGVzdMOhIHJvZGFuZG8gKGRlZmF1bHQ6IGxvY2FsaG9zdClcIixcbiAgXCJFbnRlciB0aGUgcG9ydFwiOiBcIkluZm9ybWUgYSBwb3J0YVwiLFxuICBcIkVudGVyIHRoZSBwb3J0IG9mIHRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhlIFJQQyBmb3IgQXJpYTIgaXMgcnVubmluZyAoZGVmYXVsdDogNjgwMClcIjpcbiAgICBcIkluZm9ybWUgYSBwb3J0YSBkbyBzZXJ2aWRvciBubyBxdWFsIG8gUlBDIGRvIEFyaWEyIGVzdMOhIHJvZGFuZG8gKGRlZmF1bHQ6IDY4MDApXCIsXG4gIFwiRW50ZXIgdGhlIFJQQyBwYXRoXCI6IFwiSW5mb3JtZSBvIGNhbWluaG8gUlBDXCIsXG4gIFwiRW50ZXIgdGhlIHBhdGggZm9yIHRoZSBBcmlhMiBSUEMgZW5kcG9pbnQgKGRlZmF1bHQ6IC9qc29ucnBjKVwiOlxuICAgIFwiSW5mb3JtZSBvIGNhbWluaG8gcGFyYSBvIGVuZHBvaW50IFJQQyBkbyBBcmlhMiAoZGVmYXVsdDogL2phc29ucnBjKVwiLFxuICBcIlNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIkNyaXB0b2dyYWZpYSBTU0wvVExTXCIsXG4gIFwiRW5hYmxlIFNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIkhhYmlsaXRhIGNyaXB0b2dyYWZpYSBTU0wvVExTXCIsXG4gIFwiRW50ZXIgdGhlIHNlY3JldCB0b2tlbiAob3B0aW9uYWwpXCI6IFwiSW5mb3JtZSBvIHRva2VuIHNlY3JldG8gKG9wY2lvbmFsKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcIkluZm9ybWUgbyB0b2tlbiBzZWNyZXRvIGRvIFJQQyBBcmlhMiAoZGVpeGUgdmF6aW8gc2UgYSBhdXRlbnRpY2HDp8OjbyBuw6NvIGVzdGl2ZXIgaGFiaWxpdGFkYSlcIixcbiAgXCJFbnRlciB0aGUgdXNlcm5hbWUgKG9wdGlvbmFsKVwiOiBcIkluZm9ybWUgbyB1c3XDoXJpbyAob3BjaW9uYWwpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyB1c2VybmFtZSAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJJbmZvcm1lIG8gdXN1w6FyaW8gUlBDIGRvIEFyaWEyICh2YXppbyBzZSBhIGF1dGVudGljYcOnw6NvIG7Do28gZXN0aXZlciBoYWJpbGl0YWRhKVwiLFxuICBcIkVudGVyIHRoZSBwYXNzd29yZCAob3B0aW9uYWwpXCI6IFwiSW5mb3JtZSBhIHNlbmhhIChvcGNpb25hbClcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHBhc3N3b3JkIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIkluZm9ybWUgYSBzZW5oYSBSUEMgZG8gQXJpYTIgKHZhemlvIHNlIGEgYXV0ZW50aWNhw6fDo28gbsOjbyBlc3RpdmVyIGhhYmlsaXRhZGEpXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIkluZm9ybWUgYSBVUkwgYmFzZSAob3BjaW9uYWwpXCIsXG4gIFwiRGlyZWN0IERvd25sb2FkXCI6IFwiRG93bmxvYWQgRGlyZXRvXCIsXG4gIFwiSWYgc3VwcGxpZWQsIGxpbmtzIHdpbGwgYmUgY3JlYXRlZCB0byBlbmFibGUgZGlyZWN0IGRvd25sb2FkIGZyb20gdGhlIEFyaWEyIHNlcnZlci5cIjpcbiAgICBcIlNlIGZvcm5lY2lkbywgbGlua3Mgc2Vyw6NvIGNyaWFkb3MgcGFyYSBwZXJtaXRpciBkb3dubG9hZCBkaXJldG8gZG8gc2Vydmlkb3IgQXJpYTIuXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjpcbiAgICBcIihSZXF1ZXIgc2Vydmlkb3Igd2ViIGFwcm9wcmlhZG8gYSBzZXIgY29uZmlndXJhZG8uKVwiLFxuICBcIlNhdmUgQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6IFwiU2FsdmFyIENvbmZpZ3VyYcOnw6NvIGRlIGNvbmV4w6NvXCIsXG4gIEZpbHRlcjogXCJGaWx0cmFyXCIsXG4gIC8vIHNlcnZlciBpbmZvIG1vZGFsXG4gIFwiQXJpYTIgc2VydmVyIGluZm9cIjogXCJJbmZvcm1hw6fDtWVzIGRvIHNlcnZpZG9yIEFyaWEyXCIsXG4gIFwiQXJpYTIgVmVyc2lvblwiOiBcIlZlcsOjbyBkbyBBcmlhMlwiLFxuICBcIkZlYXR1cmVzIEVuYWJsZWRcIjogXCJPcMOnw7VlcyBIYWJpbGl0YWRhc1wiLFxuICAvLyBhYm91dCBtb2RhbFxuICBcIlRvIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCwgYWRkIGlzc3VlcyBvciB0byBjb250cmlidXRlIGJhY2ssIGhlYWQgb24gdG9cIjpcbiAgICBcIlBhcmEgYmFpeGFyIGEgw7psdGltYSB2ZXJzw6NvIGRvIHByb2pldG8sIHJlcG9ydGFyIHByb2JsZW1hcyBvdSBjb250cmlidWlyLCBhY2Vzc2VcIixcbiAgXCJPciB5b3UgY2FuIG9wZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGluIHRoZSBicm93c2VyIHRocm91Z2hcIjpcbiAgICBcIk91IHZvY8OqIHBvZGUgYWNlc3NhciBhIMO6bHRpbWEgdmVyc8OjbyBwZWxvIG5hdmVnYWRvciBhdHJhdsOpc1wiLFxuICBDbG9zZTogXCJGZWNoYXJcIixcbiAgLy8gbGFiZWxzXG4gIFwiRG93bmxvYWQgc3RhdHVzXCI6IFwiU3RhdHVzIGRvIGRvd25sb2FkXCIsXG4gIFwiRG93bmxvYWQgU3BlZWRcIjogXCJWZWxvY2lkYWRlIGRlIGRvd25sb2FkXCIsXG4gIFwiVXBsb2FkIFNwZWVkXCI6IFwiVmVsb2NpZGFkZSBkZSB1cGxvYWRcIixcbiAgXCJFc3RpbWF0ZWQgdGltZVwiOiBcIlRlbXBvIGVzdGltYWRvXCIsXG4gIFwiRG93bmxvYWQgU2l6ZVwiOiBcIlRhbWFuaG8gZG8gZG93bmxvYWRcIixcbiAgRG93bmxvYWRlZDogXCJCYWl4YWRvXCIsXG4gIFByb2dyZXNzOiBcIlByb2dyZXNzb1wiLFxuICBcIkRvd25sb2FkIFBhdGhcIjogXCJDYW1pbmhvIGRvIGRvd25sb2FkXCIsXG4gIFVwbG9hZGVkOiBcIkVudmlhZG9cIixcbiAgXCJEb3dubG9hZCBHSURcIjogXCJHSUQgZG8gZG93bmxvYWRcIixcbiAgXCJOdW1iZXIgb2YgUGllY2VzXCI6IFwiTsO6bWVybyBkZSBwYXJ0ZXNcIixcbiAgXCJQaWVjZSBMZW5ndGhcIjogXCJUYW1hbmhvIGRhcyBwYXJ0ZXNcIixcblxuICAvL2FsZXJ0c1xuICBcIlRoZSBsYXN0IGNvbm5lY3Rpb24gYXR0ZW1wdCB3YXMgdW5zdWNjZXNzZnVsLiBUcnlpbmcgYW5vdGhlciBjb25maWd1cmF0aW9uXCI6XG4gICAgXCJBIMO6bHRpbWEgdGVudGF0aXZhIGRlIGNvbmV4w6NvIG7Do28gdGV2ZSBzdWNlc3NvLiBUZW50YW5kbyBvdXRyYSBjb25maWd1cmHDp8Ojb1wiLFxuICBcIk9oIFNuYXAhXCI6IFwiQWggRHJvZ2EhXCIsXG4gIFwiQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIGFyaWEyIFJQQyBzZXJ2ZXIuIFdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4gWW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhlIGNvbm5lY3Rpb24gc2V0dGluZ3MgYnkgZ29pbmcgdG8gU2V0dGluZ3MgPiBDb25uZWN0aW9uIFNldHRpbmdzXCI6XG4gICAgXCJOw6NvIGZvaSBwb3Nzw612ZWwgY29uZWN0YXIgbm8gc2Vydmlkb3IgUlBDIGFyaWEyLiBUZW50ZW50YW5kbyBlbSAxMCBzZWcuIFZvY8OqIHBvZGUgcXVlcmVyIHZlcmlmaWNhciBhcyBjb25maWd1cmHDp8O1ZXMgZGEgY29uZXjDo28gZW0gQ29uZmlndXJhw6fDtWVzID4gQ29uZmlndXJhw6fDtWVzIGRlIENvbmV4w6NvXCIsXG4gIFwiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGNvbm5lY3RpbmcgdG8gQXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjb25maXJtIHlvdXIgYXV0aGVudGljYXRpb24gZGV0YWlscyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIkF1dGVudGljYcOnw6NvIGZhbGhvdSBlbnF1YW50byBjb25lY3RhbmRvIGFvIHNlcnZpZG9yIFJQQyBBcmlhMi4gVGVudGFuZG8gZW0gMTAgc2VnLiBWb2PDqiBwb2RlIHF1ZXJlciBjb25maXJtYXIgb3MgZGV0YWxoZXMgZGUgYXV0ZW50aWNhw6fDo28gYWNlc3NhbmRvIENvbmZpZ3VyYcOnw7VlcyA+IENvbmZpZ3VyYcOnw7VlcyBkZSBDb25leMOjb1wiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCBpdHMgcmVtb3RlIFJQQyDigKZcIjpcbiAgICBcIkNvbmVjdGFkbyBjb20gc3VjZXNzbyBhbyBBcmlhMiBhdHJhdsOpcyBkZSBzZXUgUlBDIHJlbW90byDigKZcIixcbiAgXCJTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIEFyaWEyIHRocm91Z2ggcmVtb3RlIFJQQywgaG93ZXZlciB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBpbnNlY3VyZS4gRm9yIGNvbXBsZXRlIHNlY3VyaXR5IHRyeSBhZGRpbmcgYW4gYXV0aG9yaXphdGlvbiBzZWNyZXQgdG9rZW4gd2hpbGUgc3RhcnRpbmcgQXJpYTIgKHRocm91Z2ggdGhlIGZsYWcgLS1ycGMtc2VjcmV0KVwiOlxuICAgIFwiQ29uZWN0YWRvIGNvbSBzdWNlc3NvIGFvIEFyaWEyIGF0cmF2w6lzIGRlIHNldSBSUEMgcmVtb3RvLCBjb250dWRvIGEgY29uZXjDo28gw6kgaW5zZWd1cmEuIFBhcmEgdW1hIGNvbXBsZXRhIHNlZ3VyYW7Dp2EgdGVudGUgYWRpY2lvbmFyIHVtIHRva2VuIHNlY3JldG8gZGUgYXV0b3JpemHDp8OjbyBxdWFuZG8gaW5pY2lhciBvIEFyaWEyIChhdHJhdsOpcyBkYSBvcMOnw6NvIC0tcnBjLXNlY3JldClcIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwiVGVudGFuZG8gY29uZWN0YXItc2UgYW8gYXJpYTIgdXRpbGl6YW5kbyBhIG5vdmEgY29uZmlndXJhw6fDo28gZGUgY29uZXjDo29cIixcbiAgLy8ge3tuYW1lfX0gcmVmZXJzIHRvIHRoZSBkb3dubG9hZCBuYW1lLCBkbyBub3QgbW9kaWZ5LlxuICBcIlJlbW92ZSB7e25hbWV9fSBhbmQgYXNzb2NpYXRlZCBtZXRhLWRhdGE/XCI6IFwiUmVtb3ZlciB7e25hbWV9fSBlIG9zIG1ldGFkYWRvcyBhc3NvY2lhZG9zP1wiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/translate/pt_BR.js\n'
);
/***/
},
/***/ "./src/js/translate/ru_RU.js":
/*!***********************************!*\
!*** ./src/js/translate/ru_RU.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.ru_RU = {\n // header\n Search: "Поиск",\n // Nav menu\n Add: "Добавить",\n "By URIs": "URL-адреса",\n "By Torrents": "Torrent-файлы",\n "By Metalinks": "Metalink-файлы",\n Manage: "Управление",\n "Pause All": "Приостановить всё",\n "Resume Paused": "Возобновить всё",\n "Purge Completed": "Удалить завершенные",\n Settings: "Настройки",\n "Connection Settings": "Настройки соединения",\n "Global Settings": "Глобальные настройки",\n "Server info": "Информация о сервере",\n "About and contribute": "Информация и сотрудничество",\n "Toggle navigation": "Переключение навигации",\n // body\n // nav side bar\n Miscellaneous: "Разное",\n "Global Statistics": "Глобальная статистика",\n About: "Об",\n Displaying: "Показано",\n of: "из",\n downloads: "загрузок",\n Language: "Язык",\n // download filters\n "Download Filters": "Фильтр загрузок",\n Running: "Запущенные",\n Active: "Активные",\n Waiting: "Ожидающие",\n Complete: "Завершенные",\n Error: "С ошибками",\n Paused: "Приостановленные",\n Removed: "Удаленные",\n "Hide linked meta-data": "Скрыть связанные метаданные",\n Toggle: "Переключить",\n "Reset filters": "Сбросить фильтры",\n // starred properties\n "Quick Access Settings": "Настройки быстрого доступа",\n "Save settings": "Сохранить настройки",\n "Currently no download in line to display, use the":\n "На данный момент ничего не загружается, используйте кнопку",\n "download button to start downloading files!": "чтобы начать загрузку файла!",\n Peers: "Пиры",\n "More Info": "Информация",\n Remove: "Удалить",\n "# of": "# из",\n Length: "Размер",\n // modals\n "Add Downloads By URIs": "Добавить загрузки из URL-адресов",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Вы можете добавить несколько загрузок (файлов) одновременно, помещая URL-адреса для каждого файла на отдельной строке.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Можно также добавить несколько URL-адресов (зеркал) для *одного* файла. Для этого отделите URL-адреса пробелом.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- URL-адрес может быть HTTP(S)/FTP/BitTorrent-Magnet.",\n "Download settings": "Настройки загрузки",\n "Advanced settings": "Расширенные настройки",\n Cancel: "Отмена",\n Start: "Начать",\n Choose: "Выбрать",\n "Quick Access (shown on the main page)": "Простой доступ (смотреть на главной странице)",\n // add torrent modal\n "Add Downloads By Torrents": "Добавить загрузку из Torrent-файлов",\n "- Select the torrent from the local filesystem to start the download.":\n "- Выберите Torrent-файлы из локальной файловой системы для начала загрузку.",\n "- You can select multiple torrents to start multiple downloads.":\n "- Вы можете выбрать несколько Torrent-файлы для запуска нескольких загрузок.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- Для добавления BitTorrent-Magnet ссылки воспользуйтесь пунктом меню *Добавить из URL-адреса*",\n "Select Torrents": "Выберите торренты",\n "Select a Torrent": "Выберите торрент",\n // add metalink modal\n "Add Downloads By Metalinks": "Добавить загрузку из Metalink-файлов",\n "Select Metalinks": "Выбрать Metalink-файлы",\n "- Select the Metalink from the local filesystem to start the download.":\n "- Выберите Metalink-файлы из локальной файловой системы для начала загрузки",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Вы можете выбрать несколько Metalink-файлов для запуска нескольких загрузок.",\n "Select a Metalink": "Выберите Metalink",\n // select file modal\n "Choose files to start download for": "Выберите файлы чтобы начать загрузку для",\n "Select to download": "Выберите для загрузки",\n // settings modal\n "Aria2 RPC host and port": "Aria2 RPC хост и порт",\n "Enter the host": "Укажите хост",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Укажите IP или DNS-имя сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: localhost)",\n "Enter the port": "Укажите порт",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Укажите порт сервера, на котором запущена Aria2 со включенным RPC (по умолчанию: 6800)",\n "Enter the RPC path": "Укажите путь RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Укажите конечный путь для Aria2 RPC (по умолчанию: /jsonrpc)",\n "SSL/TLS encryption": "SSL/TLS шифрование",\n "Enable SSL/TLS encryption": "Разрешить SSL/TLS шифрование",\n "Enter the secret token (optional)": "Укажите секретный токен (необязательно)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Укажите секретный токен Aria2 RPC (оставьте пустым, если авторизация не включена)",\n "Enter the username (optional)": "Укажите имя пользователя (необязательно)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Укажите имя пользователя Aria2 RPC (оставьте пустым, если авторизация не включена)",\n "Enter the password (optional)": "Укажите пароль (необязательно)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Укажите пароль для Aria2 RPC (оставьте пустым, если авторизация не включена)",\n "Enter base URL (optional)": "Укажите базовый URL-адрес (необязательно)",\n "Direct Download": "Прямая загрузка",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Ссылки (при наличии) будут созданы для загрузки непосредственно с сервера Aria2.",\n "(Requires appropriate webserver to be configured.)":\n "(Требуется соответствующий веб-сервер для настройки.)",\n "Save Connection configuration": "Сохранить настройки соединения",\n Filter: "Фильтр",\n // server info modal\n "Aria2 server info": "Информация о сервере Aria2",\n "Aria2 Version": "Версия Aria2",\n "Features Enabled": "Имеющийся функционал",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Чтобы загрузить последнюю версию проекта, добавить вопросы или внести свой вклад, передите на",\n "Or you can open the latest version in the browser through":\n "Или вы можете открыть последнюю версию в браузере через",\n Close: "Закрыть",\n // lables\n "Download status": "Статус загрузки",\n "Download Speed": "Скорость загрузки",\n "Upload Speed": "Скорость отдачи",\n "Estimated time": "Оставшееся время",\n "Download Size": "Размер загрузки",\n Downloaded: "Загружено",\n Progress: "Прогресс",\n "Download Path": "Путь к загружаемым файлам",\n Uploaded: "Отдано",\n "Download GID": "Загруженый GID",\n "Number of Pieces": "Количество частей",\n "Piece Length": "Размер частей",\n "Shutdown Server": "Выключить сервер",\n\n "The last connection attempt was unsuccessful. Trying another configuration":\n "Последняя попытка подключения была неудачной. Попробуйте другую конфигурацию",\n "Oh Snap!": "Опаньки!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Не удалось подключиться к серверу Aria2 RPC. Попытка будет повторена в течение 10 секунд. Вы можете проверить параметры подключения, перейдя в меню Настройки > Настройки соединения",\n "Successfully connected to Aria2 through its remote RPC …":\n "Успешное подключение к Aria2 через удаленный RPC …",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Успешное подключение к Aria2 через удаленный RPC, однако соединение все еще небезопасно. Для обеспечения лучшей безопасности добавьте секретный токен авторизации при запуске aria2 (через флаг --rpc-secret)",\n "Trying to connect to aria2 using the new connection configuration":\n "Попытка подключиться к aria2 с использованием новой конфигурации"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3J1X1JVLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS9ydV9SVS5qcz83MTY5Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy5ydV9SVSA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCLQn9C+0LjRgdC6XCIsXG4gIC8vIE5hdiBtZW51XG4gIEFkZDogXCLQlNC+0LHQsNCy0LjRgtGMXCIsXG4gIFwiQnkgVVJJc1wiOiBcIlVSTC3QsNC00YDQtdGB0LBcIixcbiAgXCJCeSBUb3JyZW50c1wiOiBcIlRvcnJlbnQt0YTQsNC50LvRi1wiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcIk1ldGFsaW5rLdGE0LDQudC70YtcIixcbiAgTWFuYWdlOiBcItCj0L/RgNCw0LLQu9C10L3QuNC1XCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwi0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0Ywg0LLRgdGRXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcItCS0L7Qt9C+0LHQvdC+0LLQuNGC0Ywg0LLRgdGRXCIsXG4gIFwiUHVyZ2UgQ29tcGxldGVkXCI6IFwi0KPQtNCw0LvQuNGC0Ywg0LfQsNCy0LXRgNGI0LXQvdC90YvQtVwiLFxuICBTZXR0aW5nczogXCLQndCw0YHRgtGA0L7QudC60LhcIixcbiAgXCJDb25uZWN0aW9uIFNldHRpbmdzXCI6IFwi0J3QsNGB0YLRgNC+0LnQutC4INGB0L7QtdC00LjQvdC10L3QuNGPXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwi0JPQu9C+0LHQsNC70YzQvdGL0LUg0L3QsNGB0YLRgNC+0LnQutC4XCIsXG4gIFwiU2VydmVyIGluZm9cIjogXCLQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDRgdC10YDQstC10YDQtVwiLFxuICBcIkFib3V0IGFuZCBjb250cmlidXRlXCI6IFwi0JjQvdGE0L7RgNC80LDRhtC40Y8g0Lgg0YHQvtGC0YDRg9C00L3QuNGH0LXRgdGC0LLQvlwiLFxuICBcIlRvZ2dsZSBuYXZpZ2F0aW9uXCI6IFwi0J/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC90LDQstC40LPQsNGG0LjQuFwiLFxuICAvLyBib2R5XG4gIC8vIG5hdiBzaWRlIGJhclxuICBNaXNjZWxsYW5lb3VzOiBcItCg0LDQt9C90L7QtVwiLFxuICBcIkdsb2JhbCBTdGF0aXN0aWNzXCI6IFwi0JPQu9C+0LHQsNC70YzQvdCw0Y8g0YHRgtCw0YLQuNGB0YLQuNC60LBcIixcbiAgQWJvdXQ6IFwi0J7QsVwiLFxuICBEaXNwbGF5aW5nOiBcItCf0L7QutCw0LfQsNC90L5cIixcbiAgb2Y6IFwi0LjQt1wiLFxuICBkb3dubG9hZHM6IFwi0LfQsNCz0YDRg9C30L7QulwiLFxuICBMYW5ndWFnZTogXCLQr9C30YvQulwiLFxuICAvLyBkb3dubG9hZCBmaWx0ZXJzXG4gIFwiRG93bmxvYWQgRmlsdGVyc1wiOiBcItCk0LjQu9GM0YLRgCDQt9Cw0LPRgNGD0LfQvtC6XCIsXG4gIFJ1bm5pbmc6IFwi0JfQsNC/0YPRidC10L3QvdGL0LVcIixcbiAgQWN0aXZlOiBcItCQ0LrRgtC40LLQvdGL0LVcIixcbiAgV2FpdGluZzogXCLQntC20LjQtNCw0Y7RidC40LVcIixcbiAgQ29tcGxldGU6IFwi0JfQsNCy0LXRgNGI0LXQvdC90YvQtVwiLFxuICBFcnJvcjogXCLQoSDQvtGI0LjQsdC60LDQvNC4XCIsXG4gIFBhdXNlZDogXCLQn9GA0LjQvtGB0YLQsNC90L7QstC70LXQvdC90YvQtVwiLFxuICBSZW1vdmVkOiBcItCj0LTQsNC70LXQvdC90YvQtVwiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcItCh0LrRgNGL0YLRjCDRgdCy0Y/Qt9Cw0L3QvdGL0LUg0LzQtdGC0LDQtNCw0L3QvdGL0LVcIixcbiAgVG9nZ2xlOiBcItCf0LXRgNC10LrQu9GO0YfQuNGC0YxcIixcbiAgXCJSZXNldCBmaWx0ZXJzXCI6IFwi0KHQsdGA0L7RgdC40YLRjCDRhNC40LvRjNGC0YDRi1wiLFxuICAvLyBzdGFycmVkIHByb3BlcnRpZXNcbiAgXCJRdWljayBBY2Nlc3MgU2V0dGluZ3NcIjogXCLQndCw0YHRgtGA0L7QudC60Lgg0LHRi9GB0YLRgNC+0LPQviDQtNC+0YHRgtGD0L/QsFwiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCLQodC+0YXRgNCw0L3QuNGC0Ywg0L3QsNGB0YLRgNC+0LnQutC4XCIsXG4gIFwiQ3VycmVudGx5IG5vIGRvd25sb2FkIGluIGxpbmUgdG8gZGlzcGxheSwgdXNlIHRoZVwiOlxuICAgIFwi0J3QsCDQtNCw0L3QvdGL0Lkg0LzQvtC80LXQvdGCINC90LjRh9C10LPQviDQvdC1INC30LDQs9GA0YPQttCw0LXRgtGB0Y8sINC40YHQv9C+0LvRjNC30YPQudGC0LUg0LrQvdC+0L/QutGDXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcItGH0YLQvtCx0Ysg0L3QsNGH0LDRgtGMINC30LDQs9GA0YPQt9C60YMg0YTQsNC50LvQsCFcIixcbiAgUGVlcnM6IFwi0J/QuNGA0YtcIixcbiAgXCJNb3JlIEluZm9cIjogXCLQmNC90YTQvtGA0LzQsNGG0LjRj1wiLFxuICBSZW1vdmU6IFwi0KPQtNCw0LvQuNGC0YxcIixcbiAgXCIjIG9mXCI6IFwiIyDQuNC3XCIsXG4gIExlbmd0aDogXCLQoNCw0LfQvNC10YBcIixcbiAgLy8gbW9kYWxzXG4gIFwiQWRkIERvd25sb2FkcyBCeSBVUklzXCI6IFwi0JTQvtCx0LDQstC40YLRjCDQt9Cw0LPRgNGD0LfQutC4INC40LcgVVJMLdCw0LTRgNC10YHQvtCyXCIsXG4gIFwiLSBZb3UgY2FuIGFkZCBtdWx0aXBsZSBkb3dubG9hZHMgKGZpbGVzKSBhdCB0aGUgc2FtZSB0aW1lIGJ5IHB1dHRpbmcgVVJJcyBmb3IgZWFjaCBmaWxlIG9uIGEgc2VwYXJhdGUgbGluZS5cIjpcbiAgICBcIi0g0JLRiyDQvNC+0LbQtdGC0LUg0LTQvtCx0LDQstC40YLRjCDQvdC10YHQutC+0LvRjNC60L4g0LfQsNCz0YDRg9C30L7QuiAo0YTQsNC50LvQvtCyKSDQvtC00L3QvtCy0YDQtdC80LXQvdC90L4sINC/0L7QvNC10YnQsNGPIFVSTC3QsNC00YDQtdGB0LAg0LTQu9GPINC60LDQttC00L7Qs9C+INGE0LDQudC70LAg0L3QsCDQvtGC0LTQtdC70YzQvdC+0Lkg0YHRgtGA0L7QutC1LlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSDQnNC+0LbQvdC+INGC0LDQutC20LUg0LTQvtCx0LDQstC40YLRjCDQvdC10YHQutC+0LvRjNC60L4gVVJMLdCw0LTRgNC10YHQvtCyICjQt9C10YDQutCw0LspINC00LvRjyAq0L7QtNC90L7Qs9C+KiDRhNCw0LnQu9CwLiDQlNC70Y8g0Y3RgtC+0LPQviDQvtGC0LTQtdC70LjRgtC1IFVSTC3QsNC00YDQtdGB0LAg0L/RgNC+0LHQtdC70L7QvC5cIixcbiAgXCItIEEgVVJJIGNhbiBiZSBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIjpcbiAgICBcIi0gVVJMLdCw0LTRgNC10YEg0LzQvtC20LXRgiDQsdGL0YLRjCBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIixcbiAgXCJEb3dubG9hZCBzZXR0aW5nc1wiOiBcItCd0LDRgdGC0YDQvtC50LrQuCDQt9Cw0LPRgNGD0LfQutC4XCIsXG4gIFwiQWR2YW5jZWQgc2V0dGluZ3NcIjogXCLQoNCw0YHRiNC40YDQtdC90L3Ri9C1INC90LDRgdGC0YDQvtC50LrQuFwiLFxuICBDYW5jZWw6IFwi0J7RgtC80LXQvdCwXCIsXG4gIFN0YXJ0OiBcItCd0LDRh9Cw0YLRjFwiLFxuICBDaG9vc2U6IFwi0JLRi9Cx0YDQsNGC0YxcIixcbiAgXCJRdWljayBBY2Nlc3MgKHNob3duIG9uIHRoZSBtYWluIHBhZ2UpXCI6IFwi0J/RgNC+0YHRgtC+0Lkg0LTQvtGB0YLRg9C/ICjRgdC80L7RgtGA0LXRgtGMINC90LAg0LPQu9Cw0LLQvdC+0Lkg0YHRgtGA0LDQvdC40YbQtSlcIixcbiAgLy8gYWRkIHRvcnJlbnQgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IFRvcnJlbnRzXCI6IFwi0JTQvtCx0LDQstC40YLRjCDQt9Cw0LPRgNGD0LfQutGDINC40LcgVG9ycmVudC3RhNCw0LnQu9C+0LJcIixcbiAgXCItIFNlbGVjdCB0aGUgdG9ycmVudCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIi0g0JLRi9Cx0LXRgNC40YLQtSBUb3JyZW50LdGE0LDQudC70Ysg0LjQtyDQu9C+0LrQsNC70YzQvdC+0Lkg0YTQsNC50LvQvtCy0L7QuSDRgdC40YHRgtC10LzRiyDQtNC70Y8g0L3QsNGH0LDQu9CwINC30LDQs9GA0YPQt9C60YMuXCIsXG4gIFwiLSBZb3UgY2FuIHNlbGVjdCBtdWx0aXBsZSB0b3JyZW50cyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItINCS0Ysg0LzQvtC20LXRgtC1INCy0YvQsdGA0LDRgtGMINC90LXRgdC60L7Qu9GM0LrQviBUb3JyZW50LdGE0LDQudC70Ysg0LTQu9GPINC30LDQv9GD0YHQutCwINC90LXRgdC60L7Qu9GM0LrQuNGFINC30LDQs9GA0YPQt9C+0LouXCIsXG4gIFwiLSBUbyBhZGQgYSBCaXRUb3JyZW50LU1hZ25ldCBVUkwsIHVzZSB0aGUgQWRkIEJ5IFVSSSBvcHRpb24gYW5kIGFkZCBpdCB0aGVyZS5cIjpcbiAgICBcIi0g0JTQu9GPINC00L7QsdCw0LLQu9C10L3QuNGPIEJpdFRvcnJlbnQtTWFnbmV0INGB0YHRi9C70LrQuCDQstC+0YHQv9C+0LvRjNC30YPQudGC0LXRgdGMINC/0YPQvdC60YLQvtC8INC80LXQvdGOICrQlNC+0LHQsNCy0LjRgtGMINC40LcgVVJMLdCw0LTRgNC10YHQsCpcIixcbiAgXCJTZWxlY3QgVG9ycmVudHNcIjogXCLQktGL0LHQtdGA0LjRgtC1INGC0L7RgNGA0LXQvdGC0YtcIixcbiAgXCJTZWxlY3QgYSBUb3JyZW50XCI6IFwi0JLRi9Cx0LXRgNC40YLQtSDRgtC+0YDRgNC10L3RglwiLFxuICAvLyBhZGQgbWV0YWxpbmsgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IE1ldGFsaW5rc1wiOiBcItCU0L7QsdCw0LLQuNGC0Ywg0LfQsNCz0YDRg9C30LrRgyDQuNC3IE1ldGFsaW5rLdGE0LDQudC70L7QslwiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCLQktGL0LHRgNCw0YLRjCBNZXRhbGluay3RhNCw0LnQu9GLXCIsXG4gIFwiLSBTZWxlY3QgdGhlIE1ldGFsaW5rIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiLSDQktGL0LHQtdGA0LjRgtC1IE1ldGFsaW5rLdGE0LDQudC70Ysg0LjQtyDQu9C+0LrQsNC70YzQvdC+0Lkg0YTQsNC50LvQvtCy0L7QuSDRgdC40YHRgtC10LzRiyDQtNC70Y8g0L3QsNGH0LDQu9CwINC30LDQs9GA0YPQt9C60LhcIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIE1ldGFsaW5rcyB0byBzdGFydCBtdWx0aXBsZSBkb3dubG9hZHMuXCI6XG4gICAgXCItINCS0Ysg0LzQvtC20LXRgtC1INCy0YvQsdGA0LDRgtGMINC90LXRgdC60L7Qu9GM0LrQviBNZXRhbGluay3RhNCw0LnQu9C+0LIg0LTQu9GPINC30LDQv9GD0YHQutCwINC90LXRgdC60L7Qu9GM0LrQuNGFINC30LDQs9GA0YPQt9C+0LouXCIsXG4gIFwiU2VsZWN0IGEgTWV0YWxpbmtcIjogXCLQktGL0LHQtdGA0LjRgtC1IE1ldGFsaW5rXCIsXG4gIC8vIHNlbGVjdCBmaWxlIG1vZGFsXG4gIFwiQ2hvb3NlIGZpbGVzIHRvIHN0YXJ0IGRvd25sb2FkIGZvclwiOiBcItCS0YvQsdC10YDQuNGC0LUg0YTQsNC50LvRiyDRh9GC0L7QsdGLINC90LDRh9Cw0YLRjCDQt9Cw0LPRgNGD0LfQutGDINC00LvRj1wiLFxuICBcIlNlbGVjdCB0byBkb3dubG9hZFwiOiBcItCS0YvQsdC10YDQuNGC0LUg0LTQu9GPINC30LDQs9GA0YPQt9C60LhcIixcbiAgLy8gc2V0dGluZ3MgbW9kYWxcbiAgXCJBcmlhMiBSUEMgaG9zdCBhbmQgcG9ydFwiOiBcIkFyaWEyIFJQQyDRhdC+0YHRgiDQuCDQv9C+0YDRglwiLFxuICBcIkVudGVyIHRoZSBob3N0XCI6IFwi0KPQutCw0LbQuNGC0LUg0YXQvtGB0YJcIixcbiAgXCJFbnRlciB0aGUgSVAgb3IgRE5TIG5hbWUgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiBsb2NhbGhvc3QpXCI6XG4gICAgXCLQo9C60LDQttC40YLQtSBJUCDQuNC70LggRE5TLdC40LzRjyDRgdC10YDQstC10YDQsCwg0L3QsCDQutC+0YLQvtGA0L7QvCDQt9Cw0L/Rg9GJ0LXQvdCwIEFyaWEyINGB0L4g0LLQutC70Y7Rh9C10L3QvdGL0LwgUlBDICjQv9C+INGD0LzQvtC70YfQsNC90LjRjjogbG9jYWxob3N0KVwiLFxuICBcIkVudGVyIHRoZSBwb3J0XCI6IFwi0KPQutCw0LbQuNGC0LUg0L/QvtGA0YJcIixcbiAgXCJFbnRlciB0aGUgcG9ydCBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IDY4MDApXCI6XG4gICAgXCLQo9C60LDQttC40YLQtSDQv9C+0YDRgiDRgdC10YDQstC10YDQsCwg0L3QsCDQutC+0YLQvtGA0L7QvCDQt9Cw0L/Rg9GJ0LXQvdCwIEFyaWEyINGB0L4g0LLQutC70Y7Rh9C10L3QvdGL0LwgUlBDICjQv9C+INGD0LzQvtC70YfQsNC90LjRjjogNjgwMClcIixcbiAgXCJFbnRlciB0aGUgUlBDIHBhdGhcIjogXCLQo9C60LDQttC40YLQtSDQv9GD0YLRjCBSUENcIixcbiAgXCJFbnRlciB0aGUgcGF0aCBmb3IgdGhlIEFyaWEyIFJQQyBlbmRwb2ludCAoZGVmYXVsdDogL2pzb25ycGMpXCI6XG4gICAgXCLQo9C60LDQttC40YLQtSDQutC+0L3QtdGH0L3Ri9C5INC/0YPRgtGMINC00LvRjyBBcmlhMiBSUEMgKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOOiAvanNvbnJwYylcIixcbiAgXCJTU0wvVExTIGVuY3J5cHRpb25cIjogXCJTU0wvVExTINGI0LjRhNGA0L7QstCw0L3QuNC1XCIsXG4gIFwiRW5hYmxlIFNTTC9UTFMgZW5jcnlwdGlvblwiOiBcItCg0LDQt9GA0LXRiNC40YLRjCBTU0wvVExTINGI0LjRhNGA0L7QstCw0L3QuNC1XCIsXG4gIFwiRW50ZXIgdGhlIHNlY3JldCB0b2tlbiAob3B0aW9uYWwpXCI6IFwi0KPQutCw0LbQuNGC0LUg0YHQtdC60YDQtdGC0L3Ri9C5INGC0L7QutC10L0gKNC90LXQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+KVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcItCj0LrQsNC20LjRgtC1INGB0LXQutGA0LXRgtC90YvQuSDRgtC+0LrQtdC9IEFyaWEyIFJQQyAo0L7RgdGC0LDQstGM0YLQtSDQv9GD0YHRgtGL0LwsINC10YHQu9C4INCw0LLRgtC+0YDQuNC30LDRhtC40Y8g0L3QtSDQstC60LvRjtGH0LXQvdCwKVwiLFxuICBcIkVudGVyIHRoZSB1c2VybmFtZSAob3B0aW9uYWwpXCI6IFwi0KPQutCw0LbQuNGC0LUg0LjQvNGPINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyAo0L3QtdC+0LHRj9C30LDRgtC10LvRjNC90L4pXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyB1c2VybmFtZSAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCLQo9C60LDQttC40YLQtSDQuNC80Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPIEFyaWEyIFJQQyAo0L7RgdGC0LDQstGM0YLQtSDQv9GD0YHRgtGL0LwsINC10YHQu9C4INCw0LLRgtC+0YDQuNC30LDRhtC40Y8g0L3QtSDQstC60LvRjtGH0LXQvdCwKVwiLFxuICBcIkVudGVyIHRoZSBwYXNzd29yZCAob3B0aW9uYWwpXCI6IFwi0KPQutCw0LbQuNGC0LUg0L/QsNGA0L7Qu9GMICjQvdC10L7QsdGP0LfQsNGC0LXQu9GM0L3QvilcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHBhc3N3b3JkIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcItCj0LrQsNC20LjRgtC1INC/0LDRgNC+0LvRjCDQtNC70Y8gQXJpYTIgUlBDICjQvtGB0YLQsNCy0YzRgtC1INC/0YPRgdGC0YvQvCwg0LXRgdC70Lgg0LDQstGC0L7RgNC40LfQsNGG0LjRjyDQvdC1INCy0LrQu9GO0YfQtdC90LApXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcItCj0LrQsNC20LjRgtC1INCx0LDQt9C+0LLRi9C5IFVSTC3QsNC00YDQtdGBICjQvdC10L7QsdGP0LfQsNGC0LXQu9GM0L3QvilcIixcbiAgXCJEaXJlY3QgRG93bmxvYWRcIjogXCLQn9GA0Y/QvNCw0Y8g0LfQsNCz0YDRg9C30LrQsFwiLFxuICBcIklmIHN1cHBsaWVkLCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgdG8gZW5hYmxlIGRpcmVjdCBkb3dubG9hZCBmcm9tIHRoZSBBcmlhMiBzZXJ2ZXIuXCI6XG4gICAgXCLQodGB0YvQu9C60LggKNC/0YDQuCDQvdCw0LvQuNGH0LjQuCkg0LHRg9C00YPRgiDRgdC+0LfQtNCw0L3RiyDQtNC70Y8g0LfQsNCz0YDRg9C30LrQuCDQvdC10L/QvtGB0YDQtdC00YHRgtCy0LXQvdC90L4g0YEg0YHQtdGA0LLQtdGA0LAgQXJpYTIuXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjpcbiAgICBcIijQotGA0LXQsdGD0LXRgtGB0Y8g0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnQuNC5INCy0LXQsS3RgdC10YDQstC10YAg0LTQu9GPINC90LDRgdGC0YDQvtC50LrQuC4pXCIsXG4gIFwiU2F2ZSBDb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIjogXCLQodC+0YXRgNCw0L3QuNGC0Ywg0L3QsNGB0YLRgNC+0LnQutC4INGB0L7QtdC00LjQvdC10L3QuNGPXCIsXG4gIEZpbHRlcjogXCLQpNC40LvRjNGC0YBcIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcItCY0L3RhNC+0YDQvNCw0YbQuNGPINC+INGB0LXRgNCy0LXRgNC1IEFyaWEyXCIsXG4gIFwiQXJpYTIgVmVyc2lvblwiOiBcItCS0LXRgNGB0LjRjyBBcmlhMlwiLFxuICBcIkZlYXR1cmVzIEVuYWJsZWRcIjogXCLQmNC80LXRjtGJ0LjQudGB0Y8g0YTRg9C90LrRhtC40L7QvdCw0LtcIixcbiAgLy8gYWJvdXQgbW9kYWxcbiAgXCJUbyBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHByb2plY3QsIGFkZCBpc3N1ZXMgb3IgdG8gY29udHJpYnV0ZSBiYWNrLCBoZWFkIG9uIHRvXCI6XG4gICAgXCLQp9GC0L7QsdGLINC30LDQs9GA0YPQt9C40YLRjCDQv9C+0YHQu9C10LTQvdGO0Y4g0LLQtdGA0YHQuNGOINC/0YDQvtC10LrRgtCwLCDQtNC+0LHQsNCy0LjRgtGMINCy0L7Qv9GA0L7RgdGLINC40LvQuCDQstC90LXRgdGC0Lgg0YHQstC+0Lkg0LLQutC70LDQtCwg0L/QtdGA0LXQtNC40YLQtSDQvdCwXCIsXG4gIFwiT3IgeW91IGNhbiBvcGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiB0aGUgYnJvd3NlciB0aHJvdWdoXCI6XG4gICAgXCLQmNC70Lgg0LLRiyDQvNC+0LbQtdGC0LUg0L7RgtC60YDRi9GC0Ywg0L/QvtGB0LvQtdC00L3RjtGOINCy0LXRgNGB0LjRjiDQsiDQsdGA0LDRg9C30LXRgNC1INGH0LXRgNC10LdcIixcbiAgQ2xvc2U6IFwi0JfQsNC60YDRi9GC0YxcIixcbiAgLy8gbGFibGVzXG4gIFwiRG93bmxvYWQgc3RhdHVzXCI6IFwi0KHRgtCw0YLRg9GBINC30LDQs9GA0YPQt9C60LhcIixcbiAgXCJEb3dubG9hZCBTcGVlZFwiOiBcItCh0LrQvtGA0L7RgdGC0Ywg0LfQsNCz0YDRg9C30LrQuFwiLFxuICBcIlVwbG9hZCBTcGVlZFwiOiBcItCh0LrQvtGA0L7RgdGC0Ywg0L7RgtC00LDRh9C4XCIsXG4gIFwiRXN0aW1hdGVkIHRpbWVcIjogXCLQntGB0YLQsNCy0YjQtdC10YHRjyDQstGA0LXQvNGPXCIsXG4gIFwiRG93bmxvYWQgU2l6ZVwiOiBcItCg0LDQt9C80LXRgCDQt9Cw0LPRgNGD0LfQutC4XCIsXG4gIERvd25sb2FkZWQ6IFwi0JfQsNCz0YDRg9C20LXQvdC+XCIsXG4gIFByb2dyZXNzOiBcItCf0YDQvtCz0YDQtdGB0YFcIixcbiAgXCJEb3dubG9hZCBQYXRoXCI6IFwi0J/Rg9GC0Ywg0Log0LfQsNCz0YDRg9C20LDQtdC80YvQvCDRhNCw0LnQu9Cw0LxcIixcbiAgVXBsb2FkZWQ6IFwi0J7RgtC00LDQvdC+XCIsXG4gIFwiRG93bmxvYWQgR0lEXCI6IFwi0JfQsNCz0YDRg9C20LXQvdGL0LkgR0lEXCIsXG4gIFwiTnVtYmVyIG9mIFBpZWNlc1wiOiBcItCa0L7Qu9C40YfQtdGB0YLQstC+INGH0LDRgdGC0LXQuVwiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcItCg0LDQt9C80LXRgCDRh9Cw0YHRgtC10LlcIixcbiAgXCJTaHV0ZG93biBTZXJ2ZXJcIjogXCLQktGL0LrQu9GO0YfQuNGC0Ywg0YHQtdGA0LLQtdGAXCIsXG5cbiAgXCJUaGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIHVuc3VjY2Vzc2Z1bC4gVHJ5aW5nIGFub3RoZXIgY29uZmlndXJhdGlvblwiOlxuICAgIFwi0J/QvtGB0LvQtdC00L3Rj9GPINC/0L7Qv9GL0YLQutCwINC/0L7QtNC60LvRjtGH0LXQvdC40Y8g0LHRi9C70LAg0L3QtdGD0LTQsNGH0L3QvtC5LiDQn9C+0L/RgNC+0LHRg9C50YLQtSDQtNGA0YPQs9GD0Y4g0LrQvtC90YTQuNCz0YPRgNCw0YbQuNGOXCIsXG4gIFwiT2ggU25hcCFcIjogXCLQntC/0LDQvdGM0LrQuCFcIixcbiAgXCJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgYXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcItCd0LUg0YPQtNCw0LvQvtGB0Ywg0L/QvtC00LrQu9GO0YfQuNGC0YzRgdGPINC6INGB0LXRgNCy0LXRgNGDIEFyaWEyIFJQQy4g0J/QvtC/0YvRgtC60LAg0LHRg9C00LXRgiDQv9C+0LLRgtC+0YDQtdC90LAg0LIg0YLQtdGH0LXQvdC40LUgMTAg0YHQtdC60YPQvdC0LiDQktGLINC80L7QttC10YLQtSDQv9GA0L7QstC10YDQuNGC0Ywg0L/QsNGA0LDQvNC10YLRgNGLINC/0L7QtNC60LvRjtGH0LXQvdC40Y8sINC/0LXRgNC10LnQtNGPINCyINC80LXQvdGOINCd0LDRgdGC0YDQvtC50LrQuCA+INCd0LDRgdGC0YDQvtC50LrQuCDRgdC+0LXQtNC40L3QtdC90LjRj1wiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCBpdHMgcmVtb3RlIFJQQyDigKZcIjpcbiAgICBcItCj0YHQv9C10YjQvdC+0LUg0L/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiBBcmlhMiDRh9C10YDQtdC3INGD0LTQsNC70LXQvdC90YvQuSBSUEMg4oCmXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIHJlbW90ZSBSUEMsIGhvd2V2ZXIgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgaW5zZWN1cmUuIEZvciBjb21wbGV0ZSBzZWN1cml0eSB0cnkgYWRkaW5nIGFuIGF1dGhvcml6YXRpb24gc2VjcmV0IHRva2VuIHdoaWxlIHN0YXJ0aW5nIEFyaWEyICh0aHJvdWdoIHRoZSBmbGFnIC0tcnBjLXNlY3JldClcIjpcbiAgICBcItCj0YHQv9C10YjQvdC+0LUg0L/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiBBcmlhMiDRh9C10YDQtdC3INGD0LTQsNC70LXQvdC90YvQuSBSUEMsINC+0LTQvdCw0LrQviDRgdC+0LXQtNC40L3QtdC90LjQtSDQstGB0LUg0LXRidC1INC90LXQsdC10LfQvtC/0LDRgdC90L4uINCU0LvRjyDQvtCx0LXRgdC/0LXRh9C10L3QuNGPINC70YPRh9GI0LXQuSDQsdC10LfQvtC/0LDRgdC90L7RgdGC0Lgg0LTQvtCx0LDQstGM0YLQtSDRgdC10LrRgNC10YLQvdGL0Lkg0YLQvtC60LXQvSDQsNCy0YLQvtGA0LjQt9Cw0YbQuNC4INC/0YDQuCDQt9Cw0L/Rg9GB0LrQtSBhcmlhMiAo0YfQtdGA0LXQtyDRhNC70LDQsyAtLXJwYy1zZWNyZXQpXCIsXG4gIFwiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gYXJpYTIgdXNpbmcgdGhlIG5ldyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb25cIjpcbiAgICBcItCf0L7Qv9GL0YLQutCwINC/0L7QtNC60LvRjtGH0LjRgtGM0YHRjyDQuiBhcmlhMiDRgSDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtdC8INC90L7QstC+0Lkg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC4XCJcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/js/translate/ru_RU.js\n'
);
/***/
},
/***/ "./src/js/translate/th_TH.js":
/*!***********************************!*\
!*** ./src/js/translate/th_TH.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.th_TH = {\n // header\n Search: "ค้นหา",\n // Nav menu\n Add: "เพื่ม",\n "By URIs": "ด้วยยูอาร์ไอ",\n "By Torrents": "ด้วยทอร์เรนต์",\n "By Metalinks": "ด้วยเมทาลิงค์",\n Manage: "บริหาร",\n "Pause All": "หยุดชั่วคราวหมด",\n "Resume Paused": "ไปต่อหมด",\n "Purge Completed": "ลบอันเสร็จ",\n Settings: "ตั้งค่า",\n "Connection Settings": "ตั้งค่าเชื่อมต่อ",\n "Global Settings": "ตั้งค่าทั่วไป",\n "Server info": "ข้อมูลเซอร์เวอร์",\n "About and contribute": "เกี่ยวกับและช่วย",\n "Toggle navigation": "สลับนำทาง",\n Language: "ภาษา",\n // body\n // nav side bar\n Miscellaneous: "เบ็ดเตล็ด",\n "Global Statistics": "สถิติทั่วไป",\n About: "เกี่ยวกับ",\n Displaying: "แแสดงดาวน์โหลด",\n of: "อันใน",\n downloads: "อันทั้งหมด",\n // download filters\n "Download Filters": "กรองดาวน์โหลด",\n Running: "กำลังทำงาน",\n Active: "ใช้งานอยู่",\n Waiting: "กำลังรอ",\n Complete: "เสร็จ",\n Error: "ผิดพลาด",\n Paused: "หยุดอยู่",\n Removed: "ลบแล้ว",\n "Hide linked meta-data": "ซ่อนข้อมูลเมตาที่เชื่อมโยง",\n Toggle: "สลับ",\n "Reset filters": "รีเซตตัวกรอง",\n // starred properties\n "Quick Access Settings": "ตั้งค่าอย่างรวดเร็ว",\n "Save settings": "บันทึกการตั้งค่า",\n "Currently no download in line to display, use the":\n "ตอนนี้ไม่มีการดาวน์โหลดที่แสดงได้ ก็ใช้ปุ่ม",\n "download button to start downloading files!": "ให้เริ่มดาวน์โหลดไฟล์",\n Peers: "พีร์ส",\n "More Info": "ข้อมูลเพิ่ม",\n Remove: "ลบ",\n "# of": "จำนวน",\n Length: "ความยาว",\n // modals\n "Add Downloads By URIs": "เพิ่มดาวน์โหลดด้วยยูอาร์ไอ",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "",\n "Download settings": "ตั้งค่าการดาวน์โหลด",\n "Advanced settings": "ตั้งค่าขั้นสูง",\n Cancel: "ยกเลิก",\n Start: "เริ่มต้น",\n Choose: "เลือก",\n "Quick Access (shown on the main page)": "ใช้งานอย่างรวดเร็ว (แสดงที่เพจหลัก)",\n // add torrent modal\n "Add Downloads By Torrents": "เพิ่มดาวน์โหลดด้วยทอร์เรนต์",\n "- Select the torrent from the local filesystem to start the download.": "",\n "- You can select multiple torrents to start multiple downloads.": "",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.": "",\n "Select Torrents": "เลือกทอร์เรนต์",\n "Select a Torrent": "เลือกทอร์เรนต์",\n // add metalink modal\n "Add Downloads By Metalinks": "เพิ่มดาวน์โหลดด้วยเมทาลิงค์",\n "Select Metalinks": "เลือกเมทาลิงค์",\n "- Select the Metalink from the local filesystem to start the download.": "",\n "- You can select multiple Metalinks to start multiple downloads.": "",\n "Select a Metalink": "เลือกเมทาลิงค์",\n // select file modal\n "Choose files to start download for": "เลือกไฟล์ที่จะเริ่มดาวน์โหลด",\n "Select to download": "เลือกให้ดาวน์โหลด",\n // settings modal\n "Aria2 RPC host and port": "โฮสต์และพอร์ตของ Aria2 RPC",\n "Enter the host": "ป้อนโฮสต์",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "",\n "Enter the port": "ป้อนพอร์ต",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)": "",\n "Enter the RPC path": "ป้อนเส้นทาง RPC",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)": "",\n "SSL/TLS encryption": "การเข้ารหัสลับ SSL/TLS",\n "Enable SSL/TLS encryption": "เปิดใช้การเข้ารหัสลับ SSL/TLS",\n "Enter the secret token (optional)": "ป้อนสัญลักษณ์ความลับ (เป็นตัวเลือก)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)": "",\n "Enter the username (optional)": "ป้อนเชื่อ (เป็นตัวเลือก)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)": "",\n "Enter the password (optional)": "ป้อนรหัสผ่าน (เป็นตัวเลือก)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)": "",\n "Enter base URL (optional)": "ป้อน URL หลัก (เป็นตัวเลือก)",\n "Direct Download": "ดาวน์โหลดโดยตรง",\n "If supplied, links will be created to enable direct download from the Aria2 server.": "",\n "(Requires appropriate webserver to be configured.)": "",\n "Save Connection configuration": "บันทึกการตั้งค่าการเชื่อมต่อ",\n Filter: "กรอง",\n // server info modal\n "Aria2 server info": "ข้อมูลเซอร์เวอร์ Aria2",\n "Aria2 Version": "รุ่น Aria2",\n "Features Enabled": "คุณสมบัติที่เปิดใช้งาน",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "ให้ดาวน์โหลดรุ่นสุดท้ายของโครงการ เพิ่มปัญหา หรือช่วยเหลือมีส่วนร่วม ไปสู่",\n "Or you can open the latest version in the browser through":\n "หรือเปิดรุ่นสุดท้ายในเบราว์เซอร์โดยใช้",\n Close: "ปิด"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3RoX1RILmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS90aF9USC5qcz81M2UzIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy50aF9USCA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCLguITguYnguJnguKvguLJcIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIuC5gOC4nuC4t+C5iOC4oVwiLFxuICBcIkJ5IFVSSXNcIjogXCLguJTguYnguKfguKLguKLguLnguK3guLLguKPguYzguYTguK1cIixcbiAgXCJCeSBUb3JyZW50c1wiOiBcIuC4lOC5ieC4p+C4ouC4l+C4reC4o+C5jOC5gOC4o+C4meC4leC5jFwiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcIuC4lOC5ieC4p+C4ouC5gOC4oeC4l+C4suC4peC4tOC4h+C4hOC5jFwiLFxuICBNYW5hZ2U6IFwi4Lia4Lij4Li04Lir4Liy4LijXCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwi4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4Lin4Lir4Lih4LiUXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIuC5hOC4m+C4leC5iOC4reC4q+C4oeC4lFwiLFxuICBcIlB1cmdlIENvbXBsZXRlZFwiOiBcIuC4peC4muC4reC4seC4meC5gOC4quC4o+C5h+C4iFwiLFxuICBTZXR0aW5nczogXCLguJXguLHguYnguIfguITguYjguLJcIixcbiAgXCJDb25uZWN0aW9uIFNldHRpbmdzXCI6IFwi4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwi4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4LiX4Lix4LmI4Lin4LmE4LibXCIsXG4gIFwiU2VydmVyIGluZm9cIjogXCLguILguYnguK3guKHguLnguKXguYDguIvguK3guKPguYzguYDguKfguK3guKPguYxcIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcIuC5gOC4geC4teC5iOC4ouC4p+C4geC4seC4muC5geC4peC4sOC4iuC5iOC4p+C4olwiLFxuICBcIlRvZ2dsZSBuYXZpZ2F0aW9uXCI6IFwi4Liq4Lil4Lix4Lia4LiZ4Liz4LiX4Liy4LiHXCIsXG4gIExhbmd1YWdlOiBcIuC4oOC4suC4qeC4slwiLFxuICAvLyBib2R5XG4gIC8vIG5hdiBzaWRlIGJhclxuICBNaXNjZWxsYW5lb3VzOiBcIuC5gOC4muC5h+C4lOC5gOC4leC4peC5h+C4lFwiLFxuICBcIkdsb2JhbCBTdGF0aXN0aWNzXCI6IFwi4Liq4LiW4Li04LiV4Li04LiX4Lix4LmI4Lin4LmE4LibXCIsXG4gIEFib3V0OiBcIuC5gOC4geC4teC5iOC4ouC4p+C4geC4seC4mlwiLFxuICBEaXNwbGF5aW5nOiBcIuC5geC5geC4quC4lOC4h+C4lOC4suC4p+C4meC5jOC5guC4q+C4peC4lFwiLFxuICBvZjogXCLguK3guLHguJnguYPguJlcIixcbiAgZG93bmxvYWRzOiBcIuC4reC4seC4meC4l+C4seC5ieC4h+C4q+C4oeC4lFwiLFxuICAvLyBkb3dubG9hZCBmaWx0ZXJzXG4gIFwiRG93bmxvYWQgRmlsdGVyc1wiOiBcIuC4geC4o+C4reC4h+C4lOC4suC4p+C4meC5jOC5guC4q+C4peC4lFwiLFxuICBSdW5uaW5nOiBcIuC4geC4s+C4peC4seC4h+C4l+C4s+C4h+C4suC4mVwiLFxuICBBY3RpdmU6IFwi4LmD4LiK4LmJ4LiH4Liy4LiZ4Lit4Lii4Li54LmIXCIsXG4gIFdhaXRpbmc6IFwi4LiB4Liz4Lil4Lix4LiH4Lij4LitXCIsXG4gIENvbXBsZXRlOiBcIuC5gOC4quC4o+C5h+C4iFwiLFxuICBFcnJvcjogXCLguJzguLTguJTguJ7guKXguLLguJRcIixcbiAgUGF1c2VkOiBcIuC4q+C4ouC4uOC4lOC4reC4ouC4ueC5iFwiLFxuICBSZW1vdmVkOiBcIuC4peC4muC5geC4peC5ieC4p1wiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcIuC4i+C5iOC4reC4meC4guC5ieC4reC4oeC4ueC4peC5gOC4oeC4leC4suC4l+C4teC5iOC5gOC4iuC4t+C5iOC4reC4oeC5guC4ouC4h1wiLFxuICBUb2dnbGU6IFwi4Liq4Lil4Lix4LiaXCIsXG4gIFwiUmVzZXQgZmlsdGVyc1wiOiBcIuC4o+C4teC5gOC4i+C4leC4leC4seC4p+C4geC4o+C4reC4h1wiLFxuICAvLyBzdGFycmVkIHByb3BlcnRpZXNcbiAgXCJRdWljayBBY2Nlc3MgU2V0dGluZ3NcIjogXCLguJXguLHguYnguIfguITguYjguLLguK3guKLguYjguLLguIfguKPguKfguJTguYDguKPguYfguKdcIixcbiAgXCJTYXZlIHNldHRpbmdzXCI6IFwi4Lia4Lix4LiZ4LiX4Li24LiB4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4LiyXCIsXG4gIFwiQ3VycmVudGx5IG5vIGRvd25sb2FkIGluIGxpbmUgdG8gZGlzcGxheSwgdXNlIHRoZVwiOlxuICAgIFwi4LiV4Lit4LiZ4LiZ4Li14LmJ4LmE4Lih4LmI4Lih4Li14LiB4Liy4Lij4LiU4Liy4Lin4LiZ4LmM4LmC4Lir4Lil4LiU4LiX4Li14LmI4LmB4Liq4LiU4LiH4LmE4LiU4LmJIOC4geC5h+C5g+C4iuC5ieC4m+C4uOC5iOC4oVwiLFxuICBcImRvd25sb2FkIGJ1dHRvbiB0byBzdGFydCBkb3dubG9hZGluZyBmaWxlcyFcIjogXCLguYPguKvguYnguYDguKPguLTguYjguKHguJTguLLguKfguJnguYzguYLguKvguKXguJTguYTguJ/guKXguYxcIixcbiAgUGVlcnM6IFwi4Lie4Li14Lij4LmM4LiqXCIsXG4gIFwiTW9yZSBJbmZvXCI6IFwi4LiC4LmJ4Lit4Lih4Li54Lil4LmA4Lie4Li04LmI4LihXCIsXG4gIFJlbW92ZTogXCLguKXguJpcIixcbiAgXCIjIG9mXCI6IFwi4LiI4Liz4LiZ4Lin4LiZXCIsXG4gIExlbmd0aDogXCLguITguKfguLLguKHguKLguLLguKdcIixcbiAgLy8gbW9kYWxzXG4gIFwiQWRkIERvd25sb2FkcyBCeSBVUklzXCI6IFwi4LmA4Lie4Li04LmI4Lih4LiU4Liy4Lin4LiZ4LmM4LmC4Lir4Lil4LiU4LiU4LmJ4Lin4Lii4Lii4Li54Lit4Liy4Lij4LmM4LmE4LitXCIsXG4gIFwiLSBZb3UgY2FuIGFkZCBtdWx0aXBsZSBkb3dubG9hZHMgKGZpbGVzKSBhdCB0aGUgc2FtZSB0aW1lIGJ5IHB1dHRpbmcgVVJJcyBmb3IgZWFjaCBmaWxlIG9uIGEgc2VwYXJhdGUgbGluZS5cIjpcbiAgICBcIlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiXCIsXG4gIFwiLSBBIFVSSSBjYW4gYmUgSFRUUChTKS9GVFAvQml0VG9ycmVudC1NYWduZXQuXCI6IFwiXCIsXG4gIFwiRG93bmxvYWQgc2V0dGluZ3NcIjogXCLguJXguLHguYnguIfguITguYjguLLguIHguLLguKPguJTguLLguKfguJnguYzguYLguKvguKXguJRcIixcbiAgXCJBZHZhbmNlZCBzZXR0aW5nc1wiOiBcIuC4leC4seC5ieC4h+C4hOC5iOC4suC4guC4seC5ieC4meC4quC4ueC4h1wiLFxuICBDYW5jZWw6IFwi4Lii4LiB4LmA4Lil4Li04LiBXCIsXG4gIFN0YXJ0OiBcIuC5gOC4o+C4tOC5iOC4oeC4leC5ieC4mVwiLFxuICBDaG9vc2U6IFwi4LmA4Lil4Li34Lit4LiBXCIsXG4gIFwiUXVpY2sgQWNjZXNzIChzaG93biBvbiB0aGUgbWFpbiBwYWdlKVwiOiBcIuC5g+C4iuC5ieC4h+C4suC4meC4reC4ouC5iOC4suC4h+C4o+C4p+C4lOC5gOC4o+C5h+C4pyAo4LmB4Liq4LiU4LiH4LiX4Li14LmI4LmA4Lie4LiI4Lir4Lil4Lix4LiBKVwiLFxuICAvLyBhZGQgdG9ycmVudCBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgVG9ycmVudHNcIjogXCLguYDguJ7guLTguYjguKHguJTguLLguKfguJnguYzguYLguKvguKXguJTguJTguYnguKfguKLguJfguK3guKPguYzguYDguKPguJnguJXguYxcIixcbiAgXCItIFNlbGVjdCB0aGUgdG9ycmVudCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjogXCJcIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjogXCJcIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOiBcIlwiLFxuICBcIlNlbGVjdCBUb3JyZW50c1wiOiBcIuC5gOC4peC4t+C4reC4geC4l+C4reC4o+C5jOC5gOC4o+C4meC4leC5jFwiLFxuICBcIlNlbGVjdCBhIFRvcnJlbnRcIjogXCLguYDguKXguLfguK3guIHguJfguK3guKPguYzguYDguKPguJnguJXguYxcIixcbiAgLy8gYWRkIG1ldGFsaW5rIG1vZGFsXG4gIFwiQWRkIERvd25sb2FkcyBCeSBNZXRhbGlua3NcIjogXCLguYDguJ7guLTguYjguKHguJTguLLguKfguJnguYzguYLguKvguKXguJTguJTguYnguKfguKLguYDguKHguJfguLLguKXguLTguIfguITguYxcIixcbiAgXCJTZWxlY3QgTWV0YWxpbmtzXCI6IFwi4LmA4Lil4Li34Lit4LiB4LmA4Lih4LiX4Liy4Lil4Li04LiH4LiE4LmMXCIsXG4gIFwiLSBTZWxlY3QgdGhlIE1ldGFsaW5rIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOiBcIlwiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgTWV0YWxpbmtzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjogXCJcIixcbiAgXCJTZWxlY3QgYSBNZXRhbGlua1wiOiBcIuC5gOC4peC4t+C4reC4geC5gOC4oeC4l+C4suC4peC4tOC4h+C4hOC5jFwiLFxuICAvLyBzZWxlY3QgZmlsZSBtb2RhbFxuICBcIkNob29zZSBmaWxlcyB0byBzdGFydCBkb3dubG9hZCBmb3JcIjogXCLguYDguKXguLfguK3guIHguYTguJ/guKXguYzguJfguLXguYjguIjguLDguYDguKPguLTguYjguKHguJTguLLguKfguJnguYzguYLguKvguKXguJRcIixcbiAgXCJTZWxlY3QgdG8gZG93bmxvYWRcIjogXCLguYDguKXguLfguK3guIHguYPguKvguYnguJTguLLguKfguJnguYzguYLguKvguKXguJRcIixcbiAgLy8gc2V0dGluZ3MgbW9kYWxcbiAgXCJBcmlhMiBSUEMgaG9zdCBhbmQgcG9ydFwiOiBcIuC5guC4ruC4quC4leC5jOC5geC4peC4sOC4nuC4reC4o+C5jOC4leC4guC4reC4hyBBcmlhMiBSUENcIixcbiAgXCJFbnRlciB0aGUgaG9zdFwiOiBcIuC4m+C5ieC4reC4meC5guC4ruC4quC4leC5jFwiLFxuICBcIkVudGVyIHRoZSBJUCBvciBETlMgbmFtZSBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IGxvY2FsaG9zdClcIjpcbiAgICBcIlwiLFxuICBcIkVudGVyIHRoZSBwb3J0XCI6IFwi4Lib4LmJ4Lit4LiZ4Lie4Lit4Lij4LmM4LiVXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnQgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiA2ODAwKVwiOiBcIlwiLFxuICBcIkVudGVyIHRoZSBSUEMgcGF0aFwiOiBcIuC4m+C5ieC4reC4meC5gOC4quC5ieC4meC4l+C4suC4hyBSUENcIixcbiAgXCJFbnRlciB0aGUgcGF0aCBmb3IgdGhlIEFyaWEyIFJQQyBlbmRwb2ludCAoZGVmYXVsdDogL2pzb25ycGMpXCI6IFwiXCIsXG4gIFwiU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwi4LiB4Liy4Lij4LmA4LiC4LmJ4Liy4Lij4Lir4Lix4Liq4Lil4Lix4LiaIFNTTC9UTFNcIixcbiAgXCJFbmFibGUgU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwi4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiB4Liy4Lij4LmA4LiC4LmJ4Liy4Lij4Lir4Lix4Liq4Lil4Lix4LiaIFNTTC9UTFNcIixcbiAgXCJFbnRlciB0aGUgc2VjcmV0IHRva2VuIChvcHRpb25hbClcIjogXCLguJvguYnguK3guJnguKrguLHguI3guKXguLHguIHguKnguJPguYzguITguKfguLLguKHguKXguLHguJogKOC5gOC4m+C5h+C4meC4leC4seC4p+C5gOC4peC4t+C4reC4gSlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHNlY3JldCB0b2tlbiAobGVhdmUgZW1wdHkgaWYgYXV0aGVudGljYXRpb24gaXMgbm90IGVuYWJsZWQpXCI6IFwiXCIsXG4gIFwiRW50ZXIgdGhlIHVzZXJuYW1lIChvcHRpb25hbClcIjogXCLguJvguYnguK3guJnguYDguIrguLfguYjguK0gKOC5gOC4m+C5h+C4meC4leC4seC4p+C5gOC4peC4t+C4reC4gSlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHVzZXJuYW1lIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjogXCJcIixcbiAgXCJFbnRlciB0aGUgcGFzc3dvcmQgKG9wdGlvbmFsKVwiOiBcIuC4m+C5ieC4reC4meC4o+C4q+C4seC4quC4nOC5iOC4suC4mSAo4LmA4Lib4LmH4LiZ4LiV4Lix4Lin4LmA4Lil4Li34Lit4LiBKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgcGFzc3dvcmQgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOiBcIlwiLFxuICBcIkVudGVyIGJhc2UgVVJMIChvcHRpb25hbClcIjogXCLguJvguYnguK3guJkgVVJMIOC4q+C4peC4seC4gSAo4LmA4Lib4LmH4LiZ4LiV4Lix4Lin4LmA4Lil4Li34Lit4LiBKVwiLFxuICBcIkRpcmVjdCBEb3dubG9hZFwiOiBcIuC4lOC4suC4p+C4meC5jOC5guC4q+C4peC4lOC5guC4lOC4ouC4leC4o+C4h1wiLFxuICBcIklmIHN1cHBsaWVkLCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgdG8gZW5hYmxlIGRpcmVjdCBkb3dubG9hZCBmcm9tIHRoZSBBcmlhMiBzZXJ2ZXIuXCI6IFwiXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjogXCJcIixcbiAgXCJTYXZlIENvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOiBcIuC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C4leC4seC5ieC4h+C4hOC5iOC4suC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rVwiLFxuICBGaWx0ZXI6IFwi4LiB4Lij4Lit4LiHXCIsXG4gIC8vIHNlcnZlciBpbmZvIG1vZGFsXG4gIFwiQXJpYTIgc2VydmVyIGluZm9cIjogXCLguILguYnguK3guKHguLnguKXguYDguIvguK3guKPguYzguYDguKfguK3guKPguYwgQXJpYTJcIixcbiAgXCJBcmlhMiBWZXJzaW9uXCI6IFwi4Lij4Li44LmI4LiZIEFyaWEyXCIsXG4gIFwiRmVhdHVyZXMgRW5hYmxlZFwiOiBcIuC4hOC4uOC4k+C4quC4oeC4muC4seC4leC4tOC4l+C4teC5iOC5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4mVwiLFxuICAvLyBhYm91dCBtb2RhbFxuICBcIlRvIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCwgYWRkIGlzc3VlcyBvciB0byBjb250cmlidXRlIGJhY2ssIGhlYWQgb24gdG9cIjpcbiAgICBcIuC5g+C4q+C5ieC4lOC4suC4p+C4meC5jOC5guC4q+C4peC4lOC4o+C4uOC5iOC4meC4quC4uOC4lOC4l+C5ieC4suC4ouC4guC4reC4h+C5guC4hOC4o+C4h+C4geC4suC4oyDguYDguJ7guLTguYjguKHguJvguLHguI3guKvguLIg4Lir4Lij4Li34Lit4LiK4LmI4Lin4Lii4LmA4Lir4Lil4Li34Lit4Lih4Li14Liq4LmI4Lin4LiZ4Lij4LmI4Lin4LihIOC5hOC4m+C4quC4ueC5iFwiLFxuICBcIk9yIHlvdSBjYW4gb3BlbiB0aGUgbGF0ZXN0IHZlcnNpb24gaW4gdGhlIGJyb3dzZXIgdGhyb3VnaFwiOlxuICAgIFwi4Lir4Lij4Li34Lit4LmA4Lib4Li04LiU4Lij4Li44LmI4LiZ4Liq4Li44LiU4LiX4LmJ4Liy4Lii4LmD4LiZ4LmA4Lia4Lij4Liy4Lin4LmM4LmA4LiL4Lit4Lij4LmM4LmC4LiU4Lii4LmD4LiK4LmJXCIsXG4gIENsb3NlOiBcIuC4m+C4tOC4lFwiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/translate/th_TH.js\n'
);
/***/
},
/***/ "./src/js/translate/tr_TR.js":
/*!***********************************!*\
!*** ./src/js/translate/tr_TR.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.tr_TR = {\n // header\n Search: "Arama",\n // Nav menu\n Add: "Ekle",\n "By URIs": "URI ile",\n "By Torrents": "Torrent ile",\n "By Metalinks": "Metalink ile",\n Manage: "Yönet",\n "Pause All": "Hepsini Duraklat",\n "Resume Paused": "Devam Et",\n "Purge Completed": "Temizleme Tamamlandı",\n Settings: "Ayarlar",\n "Connection Settings": "Bağlantı Ayarları",\n "Global Settings": "Genel Ayarlar",\n "Server info": "Sunucu bilgisi",\n "About and contribute": "Hakkında ve katkıda bulunanlar",\n "Toggle navigation": "Gezinmeyi aç / kapat",\n // body\n // nav side bar\n Miscellaneous: "Çeşitli",\n "Global Statistics": "Genel İstatistikler",\n About: "Hakkında",\n Displaying: "Gösteriliyor",\n of: " / ",\n downloads: "Indirme",\n Language: "Dil",\n // download filters\n "Download Filters": "İndirme Filtreleri",\n Running: "Çalışıyor",\n Active: "Aktif",\n Waiting: "Bekliyor",\n Complete: "Tamamlandı",\n Error: "Hata",\n Paused: "Duraklatıldı",\n Removed: "Silindi",\n "Hide linked meta-data": "Bağlı meta verileri gizle",\n Toggle: "aç/kapat",\n "Reset filters": "Filtreleri sıfırla",\n // starred properties\n "Quick Access Settings": "Hızlı Erişim Ayarları",\n "Save settings": "Ayarları kaydet",\n "Currently no download in line to display, use the":\n "Şu anda görüntülenebilecek bir indirme yok,",\n "download button to start downloading files!": "butonu aracılığı ile dosya indirebilirsiniz!",\n Peers: "Peers",\n "More Info": "Daha fazla bilgi",\n Remove: "Kaldır",\n "# of": "# dan",\n Length: "Uzunluk",\n // modals\n "Add Downloads By URIs": "URI kullanarak indirmelere ekle",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- Ayrı bir satıra her dosya için URI koyarak aynı anda birden fazla dosya indirebilirsiniz.",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- Aynı dosyalar için birden fazla URI (ayna) da ekleyebilirsiniz. Bunu yapmak için URIları bir boşlukla ayırın.",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.":\n "- Bir URI, HTTP(S)/FTP/BitTorrent-Magnet olabilir.",\n "Download settings": "İndirme ayarları",\n "Advanced settings": "Gelişmiş Ayarlar",\n Cancel: "İptal et",\n Start: "Başlat",\n Choose: "Seçiniz",\n "Quick Access (shown on the main page)": "Hızlı Erişim (ana sayfada gösterilir)",\n // add torrent modal\n "Add Downloads By Torrents": "Torrent kullanarak indirmelere ekle",\n "- Select the torrent from the local filesystem to start the download.":\n "- İndirmeyi başlatmak için yerel dosya sisteminden torrenti seçin.",\n "- You can select multiple torrents to start multiple downloads.":\n "- Birden çok indirmeyi başlatmak için birden çok torrent seçebilirsiniz.",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- BitTorrent-Magnetli bir URL eklemek için, İstek Üzerine Ekle seçeneğini kullanın ve oraya ekleyin.",\n "Select Torrents": "Torrentleri seçin",\n "Select a Torrent": "Bir Torrent seçin",\n // add metalink modal\n "Add Downloads By Metalinks": "Metalink kullanarak indirmelere ekle",\n "Select Metalinks": "Metalinkleri seçin",\n "- Select the Metalink from the local filesystem to start the download.":\n "- İndirmeyi başlatmak için yerel dosya sisteminden Metalinki seçin.",\n "- You can select multiple Metalinks to start multiple downloads.":\n "- Birden fazla yüklemeye başlamak için birden fazla Metalink seçebilirsiniz.",\n "Select a Metalink": "Bir Metalink Seç",\n // select file modal\n "Choose files to start download for": "Için indirmeye başlamak için dosyaları seçin",\n "Select to download": "Indirmek için seçin",\n // settings modal\n "Aria2 RPC host and port": "Aria2 RPC ana bilgisayar ve bağlantı noktası",\n "Enter the host": "Ana bilgisayar(host) girin",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "Aria2 için RPC\'nin çalıştığı sunucunun IP veya DNS adını girin (varsayılan: localhost)",\n "Enter the port": "Bağlantı noktasını gir",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "Aria2 için RPC\'nin çalıştığı sunucunun bağlantı noktasını girin (varsayılan: 6800)",\n "Enter the RPC path": "RPC yolunu girin",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "Aria2 RPC bitiş noktası için yolu girin (varsayılan: / jsonrpc)",\n "SSL/TLS encryption": "SSL / TLS şifreleme",\n "Enable SSL/TLS encryption": "SSL / TLS şifrelemeyi etkinleştir",\n "Enter the secret token (optional)": "Gizli simge girin (isteğe bağlı)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "Aria2 RPC gizli simgesini girin (kimlik doğrulama etkin değilse boş bırakın)",\n "Enter the username (optional)": "Kullanıcı adını girin (isteğe bağlı)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "Aria2 RPC kullanıcı adını girin (kimlik doğrulama etkin değilse boş bırakın)",\n "Enter the password (optional)": "Parolayı girin (isteğe bağlı)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "Aria2 RPC şifresini girin (kimlik doğrulama etkin değilse boş bırakın)",\n "Enter base URL (optional)": "Temel URL\'yi girin (isteğe bağlı)",\n "Direct Download": "Direkt indirme",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "Verilen, bağlantıları aria2 sunucudan doğrudan indirmeyi etkinleştirmek için oluşturulur.",\n "(Requires appropriate webserver to be configured.)":\n "(Uygun web sunucusunun yapılandırılmasını gerektirir.)",\n "Save Connection configuration": "Bağlantı yapılandırmasını kaydedin",\n Filter: "Filtre",\n // server info modal\n "Aria2 server info": "Aria2 sunucu bilgisi",\n "Aria2 Version": "Aria2 Sürümü",\n "Features Enabled": "Aşağıdaki Özellikler Etkin",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "Projenin en son sürümünü indirmek için sorun ekleyin veya katkıda bulunun;",\n "Or you can open the latest version in the browser through":\n "Veya en son sürümü tarayıcınız aracılığıyla açabilirsiniz.",\n Close: "Kapat",\n // lables\n "Download status": "İndirme durumu",\n "Download Speed": "İndirme hızı",\n "Upload Speed": "Yükleme hızı",\n "Estimated time": "Tahmini süre",\n "Download Size": "İndirme Boyutu",\n Downloaded: "İndirildi",\n Progress: "İlerleme",\n "Download Path": "İndirme Yolu",\n Uploaded: "Yüklendi",\n "Download GID": "GID\'yi indirin",\n "Number of Pieces": "Parça sayısı",\n "Piece Length": "Parça Uzunluğu",\n "Shutdown Server": "Sunucuyu Kapat",\n\n "The last connection attempt was unsuccessful. Trying another configuration":\n "Son bağlantı girişimi başarısız oldu. Başka bir yapılandırma deneyin",\n "Oh Snap!": "HAydaaaaa!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "Aria2 RPC sunucusuna bağlanılamadı. 10 saniye içinde tekrar deneyecek. Bağlantı ayarlarını, Ayarlar> Bağlantı Ayarları bölümüne giderek kontrol etmek isteyebilirsiniz.",\n "Successfully connected to Aria2 through its remote RPC …":\n "Uzak RPC aracılığıyla Aria2\'ye başarıyla bağlandı ...",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "Uzak RPC aracılığıyla Aria2\'ye başarıyla bağlandı ancak bağlantı hala güvende değil. Tam güvenlik için, Aria2\'yi başlatırken (--rpc-secret bayrağını kullanın) ve bir yetkilendirme gizli simgesi eklemeyi deneyin.",\n "Trying to connect to aria2 using the new connection configuration":\n "Yeni bağlantı yapılandırmasını kullanarak aria2\'ye bağlanmaya çalışılıyor"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3RyX1RSLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS90cl9UUi5qcz9jMzc0Il0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy50cl9UUiA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCJBcmFtYVwiLFxuICAvLyBOYXYgbWVudVxuICBBZGQ6IFwiRWtsZVwiLFxuICBcIkJ5IFVSSXNcIjogXCJVUkkgaWxlXCIsXG4gIFwiQnkgVG9ycmVudHNcIjogXCJUb3JyZW50IGlsZVwiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcIk1ldGFsaW5rIGlsZVwiLFxuICBNYW5hZ2U6IFwiWcO2bmV0XCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwiSGVwc2luaSBEdXJha2xhdFwiLFxuICBcIlJlc3VtZSBQYXVzZWRcIjogXCJEZXZhbSBFdFwiLFxuICBcIlB1cmdlIENvbXBsZXRlZFwiOiBcIlRlbWl6bGVtZSBUYW1hbWxhbmTEsVwiLFxuICBTZXR0aW5nczogXCJBeWFybGFyXCIsXG4gIFwiQ29ubmVjdGlvbiBTZXR0aW5nc1wiOiBcIkJhxJ9sYW50xLEgQXlhcmxhcsSxXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwiR2VuZWwgQXlhcmxhclwiLFxuICBcIlNlcnZlciBpbmZvXCI6IFwiU3VudWN1IGJpbGdpc2lcIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcIkhha2vEsW5kYSB2ZSBrYXRrxLFkYSBidWx1bmFubGFyXCIsXG4gIFwiVG9nZ2xlIG5hdmlnYXRpb25cIjogXCJHZXppbm1leWkgYcOnIC8ga2FwYXRcIixcbiAgLy8gYm9keVxuICAvLyBuYXYgc2lkZSBiYXJcbiAgTWlzY2VsbGFuZW91czogXCLDh2XFn2l0bGlcIixcbiAgXCJHbG9iYWwgU3RhdGlzdGljc1wiOiBcIkdlbmVsIMSwc3RhdGlzdGlrbGVyXCIsXG4gIEFib3V0OiBcIkhha2vEsW5kYVwiLFxuICBEaXNwbGF5aW5nOiBcIkfDtnN0ZXJpbGl5b3JcIixcbiAgb2Y6IFwiIC8gXCIsXG4gIGRvd25sb2FkczogXCJJbmRpcm1lXCIsXG4gIExhbmd1YWdlOiBcIkRpbFwiLFxuICAvLyBkb3dubG9hZCBmaWx0ZXJzXG4gIFwiRG93bmxvYWQgRmlsdGVyc1wiOiBcIsSwbmRpcm1lIEZpbHRyZWxlcmlcIixcbiAgUnVubmluZzogXCLDh2FsxLHFn8SxeW9yXCIsXG4gIEFjdGl2ZTogXCJBa3RpZlwiLFxuICBXYWl0aW5nOiBcIkJla2xpeW9yXCIsXG4gIENvbXBsZXRlOiBcIlRhbWFtbGFuZMSxXCIsXG4gIEVycm9yOiBcIkhhdGFcIixcbiAgUGF1c2VkOiBcIkR1cmFrbGF0xLFsZMSxXCIsXG4gIFJlbW92ZWQ6IFwiU2lsaW5kaVwiLFxuICBcIkhpZGUgbGlua2VkIG1ldGEtZGF0YVwiOiBcIkJhxJ9sxLEgbWV0YSB2ZXJpbGVyaSBnaXpsZVwiLFxuICBUb2dnbGU6IFwiYcOnL2thcGF0XCIsXG4gIFwiUmVzZXQgZmlsdGVyc1wiOiBcIkZpbHRyZWxlcmkgc8SxZsSxcmxhXCIsXG4gIC8vIHN0YXJyZWQgcHJvcGVydGllc1xuICBcIlF1aWNrIEFjY2VzcyBTZXR0aW5nc1wiOiBcIkjEsXpsxLEgRXJpxZ9pbSBBeWFybGFyxLFcIixcbiAgXCJTYXZlIHNldHRpbmdzXCI6IFwiQXlhcmxhcsSxIGtheWRldFwiLFxuICBcIkN1cnJlbnRseSBubyBkb3dubG9hZCBpbiBsaW5lIHRvIGRpc3BsYXksIHVzZSB0aGVcIjpcbiAgICBcIsWedSBhbmRhIGfDtnLDvG50w7xsZW5lYmlsZWNlayBiaXIgaW5kaXJtZSB5b2ssXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcImJ1dG9udSBhcmFjxLFsxLHEn8SxIGlsZSBkb3N5YSBpbmRpcmViaWxpcnNpbml6IVwiLFxuICBQZWVyczogXCJQZWVyc1wiLFxuICBcIk1vcmUgSW5mb1wiOiBcIkRhaGEgZmF6bGEgYmlsZ2lcIixcbiAgUmVtb3ZlOiBcIkthbGTEsXJcIixcbiAgXCIjIG9mXCI6IFwiIyBkYW5cIixcbiAgTGVuZ3RoOiBcIlV6dW5sdWtcIixcbiAgLy8gbW9kYWxzXG4gIFwiQWRkIERvd25sb2FkcyBCeSBVUklzXCI6IFwiVVJJIGt1bGxhbmFyYWsgaW5kaXJtZWxlcmUgZWtsZVwiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCItIEF5csSxIGJpciBzYXTEsXJhIGhlciBkb3N5YSBpw6dpbiBVUkkga295YXJhayBheW7EsSBhbmRhIGJpcmRlbiBmYXpsYSBkb3N5YSBpbmRpcmViaWxpcnNpbml6LlwiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSBBeW7EsSBkb3N5YWxhciBpw6dpbiBiaXJkZW4gZmF6bGEgVVJJIChheW5hKSBkYSBla2xleWViaWxpcnNpbml6LiBCdW51IHlhcG1hayBpw6dpbiBVUklsYXLEsSBiaXIgYm/Fn2x1a2xhIGF5xLFyxLFuLlwiLFxuICBcIi0gQSBVUkkgY2FuIGJlIEhUVFAoUykvRlRQL0JpdFRvcnJlbnQtTWFnbmV0LlwiOlxuICAgIFwiLSBCaXIgVVJJLCBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldCBvbGFiaWxpci5cIixcbiAgXCJEb3dubG9hZCBzZXR0aW5nc1wiOiBcIsSwbmRpcm1lIGF5YXJsYXLEsVwiLFxuICBcIkFkdmFuY2VkIHNldHRpbmdzXCI6IFwiR2VsacWfbWnFnyBBeWFybGFyXCIsXG4gIENhbmNlbDogXCLEsHB0YWwgZXRcIixcbiAgU3RhcnQ6IFwiQmHFn2xhdFwiLFxuICBDaG9vc2U6IFwiU2XDp2luaXpcIixcbiAgXCJRdWljayBBY2Nlc3MgKHNob3duIG9uIHRoZSBtYWluIHBhZ2UpXCI6IFwiSMSxemzEsSBFcmnFn2ltIChhbmEgc2F5ZmFkYSBnw7ZzdGVyaWxpcilcIixcbiAgLy8gYWRkIHRvcnJlbnQgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IFRvcnJlbnRzXCI6IFwiVG9ycmVudCBrdWxsYW5hcmFrIGluZGlybWVsZXJlIGVrbGVcIixcbiAgXCItIFNlbGVjdCB0aGUgdG9ycmVudCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHN0YXJ0IHRoZSBkb3dubG9hZC5cIjpcbiAgICBcIi0gxLBuZGlybWV5aSBiYcWfbGF0bWFrIGnDp2luIHllcmVsIGRvc3lhIHNpc3RlbWluZGVuIHRvcnJlbnRpIHNlw6dpbi5cIixcbiAgXCItIFlvdSBjYW4gc2VsZWN0IG11bHRpcGxlIHRvcnJlbnRzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIi0gQmlyZGVuIMOnb2sgaW5kaXJtZXlpIGJhxZ9sYXRtYWsgacOnaW4gYmlyZGVuIMOnb2sgdG9ycmVudCBzZcOnZWJpbGlyc2luaXouXCIsXG4gIFwiLSBUbyBhZGQgYSBCaXRUb3JyZW50LU1hZ25ldCBVUkwsIHVzZSB0aGUgQWRkIEJ5IFVSSSBvcHRpb24gYW5kIGFkZCBpdCB0aGVyZS5cIjpcbiAgICBcIi0gQml0VG9ycmVudC1NYWduZXRsaSBiaXIgVVJMIGVrbGVtZWsgacOnaW4sIMSwc3RlayDDnHplcmluZSBFa2xlIHNlw6dlbmXEn2luaSBrdWxsYW7EsW4gdmUgb3JheWEgZWtsZXlpbi5cIixcbiAgXCJTZWxlY3QgVG9ycmVudHNcIjogXCJUb3JyZW50bGVyaSBzZcOnaW5cIixcbiAgXCJTZWxlY3QgYSBUb3JyZW50XCI6IFwiQmlyIFRvcnJlbnQgc2XDp2luXCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwiTWV0YWxpbmsga3VsbGFuYXJhayBpbmRpcm1lbGVyZSBla2xlXCIsXG4gIFwiU2VsZWN0IE1ldGFsaW5rc1wiOiBcIk1ldGFsaW5rbGVyaSBzZcOnaW5cIixcbiAgXCItIFNlbGVjdCB0aGUgTWV0YWxpbmsgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIMSwbmRpcm1leWkgYmHFn2xhdG1hayBpw6dpbiB5ZXJlbCBkb3N5YSBzaXN0ZW1pbmRlbiBNZXRhbGlua2kgc2XDp2luLlwiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgTWV0YWxpbmtzIHRvIHN0YXJ0IG11bHRpcGxlIGRvd25sb2Fkcy5cIjpcbiAgICBcIi0gQmlyZGVuIGZhemxhIHnDvGtsZW1leWUgYmHFn2xhbWFrIGnDp2luIGJpcmRlbiBmYXpsYSBNZXRhbGluayBzZcOnZWJpbGlyc2luaXouXCIsXG4gIFwiU2VsZWN0IGEgTWV0YWxpbmtcIjogXCJCaXIgTWV0YWxpbmsgU2XDp1wiLFxuICAvLyBzZWxlY3QgZmlsZSBtb2RhbFxuICBcIkNob29zZSBmaWxlcyB0byBzdGFydCBkb3dubG9hZCBmb3JcIjogXCJJw6dpbiBpbmRpcm1leWUgYmHFn2xhbWFrIGnDp2luIGRvc3lhbGFyxLEgc2XDp2luXCIsXG4gIFwiU2VsZWN0IHRvIGRvd25sb2FkXCI6IFwiSW5kaXJtZWsgacOnaW4gc2XDp2luXCIsXG4gIC8vIHNldHRpbmdzIG1vZGFsXG4gIFwiQXJpYTIgUlBDIGhvc3QgYW5kIHBvcnRcIjogXCJBcmlhMiBSUEMgYW5hIGJpbGdpc2F5YXIgdmUgYmHEn2xhbnTEsSBub2t0YXPEsVwiLFxuICBcIkVudGVyIHRoZSBob3N0XCI6IFwiQW5hIGJpbGdpc2F5YXIoaG9zdCkgZ2lyaW5cIixcbiAgXCJFbnRlciB0aGUgSVAgb3IgRE5TIG5hbWUgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiBsb2NhbGhvc3QpXCI6XG4gICAgXCJBcmlhMiBpw6dpbiBSUEMnbmluIMOnYWzEscWfdMSxxJ/EsSBzdW51Y3VudW4gSVAgdmV5YSBETlMgYWTEsW7EsSBnaXJpbiAodmFyc2F5xLFsYW46IGxvY2FsaG9zdClcIixcbiAgXCJFbnRlciB0aGUgcG9ydFwiOiBcIkJhxJ9sYW50xLEgbm9rdGFzxLFuxLEgZ2lyXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnQgb2YgdGhlIHNlcnZlciBvbiB3aGljaCB0aGUgUlBDIGZvciBBcmlhMiBpcyBydW5uaW5nIChkZWZhdWx0OiA2ODAwKVwiOlxuICAgIFwiQXJpYTIgacOnaW4gUlBDJ25pbiDDp2FsxLHFn3TEscSfxLEgc3VudWN1bnVuIGJhxJ9sYW50xLEgbm9rdGFzxLFuxLEgZ2lyaW4gKHZhcnNhecSxbGFuOiA2ODAwKVwiLFxuICBcIkVudGVyIHRoZSBSUEMgcGF0aFwiOiBcIlJQQyB5b2x1bnUgZ2lyaW5cIixcbiAgXCJFbnRlciB0aGUgcGF0aCBmb3IgdGhlIEFyaWEyIFJQQyBlbmRwb2ludCAoZGVmYXVsdDogL2pzb25ycGMpXCI6XG4gICAgXCJBcmlhMiBSUEMgYml0acWfIG5va3Rhc8SxIGnDp2luIHlvbHUgZ2lyaW4gKHZhcnNhecSxbGFuOiAvIGpzb25ycGMpXCIsXG4gIFwiU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiU1NMIC8gVExTIMWfaWZyZWxlbWVcIixcbiAgXCJFbmFibGUgU1NML1RMUyBlbmNyeXB0aW9uXCI6IFwiU1NMIC8gVExTIMWfaWZyZWxlbWV5aSBldGtpbmxlxZ90aXJcIixcbiAgXCJFbnRlciB0aGUgc2VjcmV0IHRva2VuIChvcHRpb25hbClcIjogXCJHaXpsaSBzaW1nZSBnaXJpbiAoaXN0ZcSfZSBiYcSfbMSxKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcIkFyaWEyIFJQQyBnaXpsaSBzaW1nZXNpbmkgZ2lyaW4gKGtpbWxpayBkb8SfcnVsYW1hIGV0a2luIGRlxJ9pbHNlIGJvxZ8gYsSxcmFrxLFuKVwiLFxuICBcIkVudGVyIHRoZSB1c2VybmFtZSAob3B0aW9uYWwpXCI6IFwiS3VsbGFuxLFjxLEgYWTEsW7EsSBnaXJpbiAoaXN0ZcSfZSBiYcSfbMSxKVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgdXNlcm5hbWUgKGVtcHR5IGlmIGF1dGhlbnRpY2F0aW9uIG5vdCBlbmFibGVkKVwiOlxuICAgIFwiQXJpYTIgUlBDIGt1bGxhbsSxY8SxIGFkxLFuxLEgZ2lyaW4gKGtpbWxpayBkb8SfcnVsYW1hIGV0a2luIGRlxJ9pbHNlIGJvxZ8gYsSxcmFrxLFuKVwiLFxuICBcIkVudGVyIHRoZSBwYXNzd29yZCAob3B0aW9uYWwpXCI6IFwiUGFyb2xhecSxIGdpcmluIChpc3RlxJ9lIGJhxJ9sxLEpXCIsXG4gIFwiRW50ZXIgdGhlIEFyaWEyIFJQQyBwYXNzd29yZCAoZW1wdHkgaWYgYXV0aGVudGljYXRpb24gbm90IGVuYWJsZWQpXCI6XG4gICAgXCJBcmlhMiBSUEMgxZ9pZnJlc2luaSBnaXJpbiAoa2ltbGlrIGRvxJ9ydWxhbWEgZXRraW4gZGXEn2lsc2UgYm/FnyBixLFyYWvEsW4pXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIlRlbWVsIFVSTCd5aSBnaXJpbiAoaXN0ZcSfZSBiYcSfbMSxKVwiLFxuICBcIkRpcmVjdCBEb3dubG9hZFwiOiBcIkRpcmVrdCBpbmRpcm1lXCIsXG4gIFwiSWYgc3VwcGxpZWQsIGxpbmtzIHdpbGwgYmUgY3JlYXRlZCB0byBlbmFibGUgZGlyZWN0IGRvd25sb2FkIGZyb20gdGhlIEFyaWEyIHNlcnZlci5cIjpcbiAgICBcIlZlcmlsZW4sIGJhxJ9sYW50xLFsYXLEsSBhcmlhMiBzdW51Y3VkYW4gZG/En3J1ZGFuIGluZGlybWV5aSBldGtpbmxlxZ90aXJtZWsgacOnaW4gb2x1xZ90dXJ1bHVyLlwiLFxuICBcIihSZXF1aXJlcyBhcHByb3ByaWF0ZSB3ZWJzZXJ2ZXIgdG8gYmUgY29uZmlndXJlZC4pXCI6XG4gICAgXCIoVXlndW4gd2ViIHN1bnVjdXN1bnVuIHlhcMSxbGFuZMSxcsSxbG1hc8SxbsSxIGdlcmVrdGlyaXIuKVwiLFxuICBcIlNhdmUgQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6IFwiQmHEn2xhbnTEsSB5YXDEsWxhbmTEsXJtYXPEsW7EsSBrYXlkZWRpblwiLFxuICBGaWx0ZXI6IFwiRmlsdHJlXCIsXG4gIC8vIHNlcnZlciBpbmZvIG1vZGFsXG4gIFwiQXJpYTIgc2VydmVyIGluZm9cIjogXCJBcmlhMiBzdW51Y3UgYmlsZ2lzaVwiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCJBcmlhMiBTw7xyw7xtw7xcIixcbiAgXCJGZWF0dXJlcyBFbmFibGVkXCI6IFwiQcWfYcSfxLFkYWtpIMOWemVsbGlrbGVyIEV0a2luXCIsXG4gIC8vIGFib3V0IG1vZGFsXG4gIFwiVG8gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LCBhZGQgaXNzdWVzIG9yIHRvIGNvbnRyaWJ1dGUgYmFjaywgaGVhZCBvbiB0b1wiOlxuICAgIFwiUHJvamVuaW4gZW4gc29uIHPDvHLDvG3DvG7DvCBpbmRpcm1layBpw6dpbiBzb3J1biBla2xleWluIHZleWEga2F0a8SxZGEgYnVsdW51bjtcIixcbiAgXCJPciB5b3UgY2FuIG9wZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGluIHRoZSBicm93c2VyIHRocm91Z2hcIjpcbiAgICBcIlZleWEgZW4gc29uIHPDvHLDvG3DvCB0YXJhecSxY8SxbsSxeiBhcmFjxLFsxLHEn8SxeWxhIGHDp2FiaWxpcnNpbml6LlwiLFxuICBDbG9zZTogXCJLYXBhdFwiLFxuICAvLyBsYWJsZXNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCLEsG5kaXJtZSBkdXJ1bXVcIixcbiAgXCJEb3dubG9hZCBTcGVlZFwiOiBcIsSwbmRpcm1lIGjEsXrEsVwiLFxuICBcIlVwbG9hZCBTcGVlZFwiOiBcIlnDvGtsZW1lIGjEsXrEsVwiLFxuICBcIkVzdGltYXRlZCB0aW1lXCI6IFwiVGFobWluaSBzw7xyZVwiLFxuICBcIkRvd25sb2FkIFNpemVcIjogXCLEsG5kaXJtZSBCb3l1dHVcIixcbiAgRG93bmxvYWRlZDogXCLEsG5kaXJpbGRpXCIsXG4gIFByb2dyZXNzOiBcIsSwbGVybGVtZVwiLFxuICBcIkRvd25sb2FkIFBhdGhcIjogXCLEsG5kaXJtZSBZb2x1XCIsXG4gIFVwbG9hZGVkOiBcIlnDvGtsZW5kaVwiLFxuICBcIkRvd25sb2FkIEdJRFwiOiBcIkdJRCd5aSBpbmRpcmluXCIsXG4gIFwiTnVtYmVyIG9mIFBpZWNlc1wiOiBcIlBhcsOnYSBzYXnEsXPEsVwiLFxuICBcIlBpZWNlIExlbmd0aFwiOiBcIlBhcsOnYSBVenVubHXEn3VcIixcbiAgXCJTaHV0ZG93biBTZXJ2ZXJcIjogXCJTdW51Y3V5dSBLYXBhdFwiLFxuXG4gIFwiVGhlIGxhc3QgY29ubmVjdGlvbiBhdHRlbXB0IHdhcyB1bnN1Y2Nlc3NmdWwuIFRyeWluZyBhbm90aGVyIGNvbmZpZ3VyYXRpb25cIjpcbiAgICBcIlNvbiBiYcSfbGFudMSxIGdpcmnFn2ltaSBiYcWfYXLEsXPEsXogb2xkdS4gQmHFn2thIGJpciB5YXDEsWxhbmTEsXJtYSBkZW5leWluXCIsXG4gIFwiT2ggU25hcCFcIjogXCJIQXlkYWFhYWEhXCIsXG4gIFwiQ291bGQgbm90IGNvbm5lY3QgdG8gdGhlIGFyaWEyIFJQQyBzZXJ2ZXIuIFdpbGwgcmV0cnkgaW4gMTAgc2Vjcy4gWW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhlIGNvbm5lY3Rpb24gc2V0dGluZ3MgYnkgZ29pbmcgdG8gU2V0dGluZ3MgPiBDb25uZWN0aW9uIFNldHRpbmdzXCI6XG4gICAgXCJBcmlhMiBSUEMgc3VudWN1c3VuYSBiYcSfbGFuxLFsYW1hZMSxLiAxMCBzYW5peWUgacOnaW5kZSB0ZWtyYXIgZGVuZXllY2VrLiBCYcSfbGFudMSxIGF5YXJsYXLEsW7EsSwgQXlhcmxhcj4gQmHEn2xhbnTEsSBBeWFybGFyxLEgYsO2bMO8bcO8bmUgZ2lkZXJlayBrb250cm9sIGV0bWVrIGlzdGV5ZWJpbGlyc2luaXouXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIGl0cyByZW1vdGUgUlBDIOKAplwiOlxuICAgIFwiVXphayBSUEMgYXJhY8SxbMSxxJ/EsXlsYSBBcmlhMid5ZSBiYcWfYXLEsXlsYSBiYcSfbGFuZMSxIC4uLlwiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCByZW1vdGUgUlBDLCBob3dldmVyIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGluc2VjdXJlLiBGb3IgY29tcGxldGUgc2VjdXJpdHkgdHJ5IGFkZGluZyBhbiBhdXRob3JpemF0aW9uIHNlY3JldCB0b2tlbiB3aGlsZSBzdGFydGluZyBBcmlhMiAodGhyb3VnaCB0aGUgZmxhZyAtLXJwYy1zZWNyZXQpXCI6XG4gICAgXCJVemFrIFJQQyBhcmFjxLFsxLHEn8SxeWxhIEFyaWEyJ3llIGJhxZ9hcsSxeWxhIGJhxJ9sYW5kxLEgYW5jYWsgYmHEn2xhbnTEsSBoYWxhIGfDvHZlbmRlIGRlxJ9pbC4gVGFtIGfDvHZlbmxpayBpw6dpbiwgQXJpYTIneWkgYmHFn2xhdMSxcmtlbiAoLS1ycGMtc2VjcmV0IGJheXJhxJ/EsW7EsSBrdWxsYW7EsW4pIHZlIGJpciB5ZXRraWxlbmRpcm1lIGdpemxpIHNpbWdlc2kgZWtsZW1leWkgZGVuZXlpbi5cIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwiWWVuaSBiYcSfbGFudMSxIHlhcMSxbGFuZMSxcm1hc8SxbsSxIGt1bGxhbmFyYWsgYXJpYTIneWUgYmHEn2xhbm1heWEgw6dhbMSxxZ/EsWzEsXlvclwiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/translate/tr_TR.js\n'
);
/***/
},
/***/ "./src/js/translate/zh_CN.js":
/*!***********************************!*\
!*** ./src/js/translate/zh_CN.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.zh_CN = {\n // header\n Search: "搜索",\n // Nav menu\n Add: "添加",\n "By URIs": "使用链接",\n "By Torrents": "使用种子",\n "By Metalinks": "使用 Metalink",\n Manage: "管理",\n "Pause All": "暂停所有",\n "Resume Paused": "恢复下载",\n "Purge Completed": "清除已完成",\n "Shutdown Server": "关闭服务器",\n Settings: "设置",\n "Connection Settings": "连接设置",\n "Global Settings": "全局设置",\n "Server info": "服务器信息",\n "About and contribute": "关于和捐助",\n "Toggle navigation": "切换导航",\n // body\n // nav side bar\n Miscellaneous: "杂项",\n "Global Statistics": "全局统计",\n About: "关于",\n Displaying: "正在显示",\n of: "/",\n downloads: "下载",\n Language: "语言",\n // download filters\n "Download Filters": "下载过滤器",\n Running: "运行中",\n Active: "活动的",\n Waiting: "等待中",\n Complete: "已完成",\n Error: "出错的",\n Paused: "已暂停",\n Removed: "已删除",\n "Hide linked meta-data": "隐藏连接的元数据",\n Toggle: "反向选择",\n "Reset filters": "重置过滤器",\n // download status\n Verifing: "正在验证",\n "Verify Pending": "等待验证",\n // starred properties\n "Quick Access Settings": "快速访问设置",\n Save: "保存",\n "Save settings": "保存设置",\n "Currently no download in line to display, use the": "当前没有可显示的下载项,使用",\n "download button to start downloading files!": "按钮来开始下载!",\n Peers: "Peers",\n "More Info": "更多信息",\n Remove: "删除",\n "# of": "块数",\n Length: "块大小",\n // modals\n "Add Downloads By URIs": "使用链接下载",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- 你可以同时添加多个文件下载任务,每行下载一个文件;",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- 你也可以给同一个下载任务添加多个镜像链接,写在一行并用空格分隔每条链接;",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- 链接可以是 HTTP(S)、FTP 和磁力链接。",\n "Download settings": "下载设置",\n "Advanced settings": "高级设置",\n Cancel: "取消",\n Start: "开始",\n Choose: "选择",\n "Quick Access (shown on the main page)": "快速访问(在主页上显示)",\n // add torrent modal\n "Add Downloads By Torrents": "使用种子下载",\n "- Select the torrent from the local filesystem to start the download.":\n "- 从本地文件系统选择种子文件开始下载;",\n "- You can select multiple torrents to start multiple downloads.":\n "- 你可以同时选择多个种子来启动多个下载;",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- 如果要添加磁力链接,请使用添加链接的方式。",\n "Select Torrents": "选择种子文件",\n "Select a Torrent": "选择种子文件",\n // add metalink modal\n "Add Downloads By Metalinks": "使用 Metalink 下载",\n "Select Metalinks": "选择 Metalink 文件",\n "- Select the Metalink from the local filesystem to start the download.":\n "* 从本地文件系统选择 Metalink 文件开始下载;",\n "- You can select multiple Metalinks to start multiple downloads.":\n "* 你可以同时选择多个 Metalink 文件来启动多个下载。",\n "Select a Metalink": "选择 Metalink 文件",\n // select file modal\n "Choose files to start download for": "请选择要下载的文件",\n "Select to download": "选择以下载",\n // settings modal\n "Aria2 RPC host and port": "Aria2 RPC 主机和端口",\n "Enter the host": "主机",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "输入 Aria2 RPC 所在服务器的 IP 或域名(默认:localhost)",\n "Enter the port": "端口",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "输入 Aria2 RPC 端口号(默认:6800)",\n "Enter the RPC path": "RPC 路径",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "输入 Aria2 RPC 路径(默认:/jsonrpc)",\n "SSL/TLS encryption": "SSL/TLS 加密",\n "Enable SSL/TLS encryption": "启用 SSL/TLS 加密",\n "Enter the secret token (optional)": "密码令牌(可选)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "输入 Aria2 RPC 密码令牌(如果未启用则留空)",\n "Enter the username (optional)": "用户名(可选)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "输入 Aria2 RPC 用户名(如果未启用身份验证则留空)",\n "Enter the password (optional)": "密码(可选)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "输入 Aria2 RPC 密码(如果未启用身份验证则留空)",\n "Enter base URL (optional)": "基本链接地址(可选)",\n "Direct Download": "直接下载",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "如果指定该选项,将会创建可以直接从 Aria2 服务器上下载文件的链接。",\n "(Requires appropriate webserver to be configured.)": "(需要 WEB 服务器配置正确)",\n "Save Connection configuration": "保存连接配置",\n Filter: "过滤",\n // server info modal\n "Aria2 server info": "Aria2 服务器信息",\n "Aria2 Version": "Aria2 版本",\n "Features Enabled": "已启用功能",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "下载最新版本、提交问题或捐助,请访问",\n "Or you can open the latest version in the browser through": "直接在浏览器中使用最新版本,请访问",\n Close: "关闭",\n // labels\n "Download status": "当前下载状态",\n "Download Speed": "当前下载速度",\n "Upload Speed": "当前上传速度",\n "Estimated time": "预计剩余时间",\n "Download Size": "下载总大小",\n Downloaded: "已下载大小",\n Progress: "当前下载进度",\n "Download Path": "文件下载路径",\n Uploaded: "已上传大小",\n "Download GID": "下载的 GID",\n "Number of Pieces": "文件块数量",\n "Piece Length": "每块大小",\n\n //alerts\n "The last connection attempt was unsuccessful. Trying another configuration":\n "上次连接请求未成功,正在尝试使用另一个配置",\n "Oh Snap!": "糟糕!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "无法连接到 Aria2 RPC 服务器,将在10秒后重试。您可能需要检查连接设置,请前往 设置 > 连接设置",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "连接到 Aria2 RPC 服务器时认证失败,将在10秒后重试。您可能需要确认您的身份验证信息,请前往 设置 > 连接设置",\n "Successfully connected to Aria2 through its remote RPC …": "通过 RPC 连接到 Aria2 成功!",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "通过 RPC 连接到 Aria2 成功,但是连接并不安全。要想使用安全连接,尝试在启动 Aria2 时添加一个授权密码令牌(通过 --rpc-secret 参数)",\n "Trying to connect to aria2 using the new connection configuration":\n "正在尝试使用新的连接配置来连接到 Aria2 ……",\n "Remove {{name}} and associated meta-data?": "是否删除 {{name}} 和关联的元数据?"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3poX0NOLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS96aF9DTi5qcz8yNWExIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy56aF9DTiA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCLmkJzntKJcIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIua3u+WKoFwiLFxuICBcIkJ5IFVSSXNcIjogXCLkvb/nlKjpk77mjqVcIixcbiAgXCJCeSBUb3JyZW50c1wiOiBcIuS9v+eUqOenjeWtkFwiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcIuS9v+eUqCBNZXRhbGlua1wiLFxuICBNYW5hZ2U6IFwi566h55CGXCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwi5pqC5YGc5omA5pyJXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIuaBouWkjeS4i+i9vVwiLFxuICBcIlB1cmdlIENvbXBsZXRlZFwiOiBcIua4hemZpOW3suWujOaIkFwiLFxuICBcIlNodXRkb3duIFNlcnZlclwiOiBcIuWFs+mXreacjeWKoeWZqFwiLFxuICBTZXR0aW5nczogXCLorr7nva5cIixcbiAgXCJDb25uZWN0aW9uIFNldHRpbmdzXCI6IFwi6L+e5o6l6K6+572uXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwi5YWo5bGA6K6+572uXCIsXG4gIFwiU2VydmVyIGluZm9cIjogXCLmnI3liqHlmajkv6Hmga9cIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcIuWFs+S6juWSjOaNkOWKqVwiLFxuICBcIlRvZ2dsZSBuYXZpZ2F0aW9uXCI6IFwi5YiH5o2i5a+86IiqXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwi5p2C6aG5XCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCLlhajlsYDnu5/orqFcIixcbiAgQWJvdXQ6IFwi5YWz5LqOXCIsXG4gIERpc3BsYXlpbmc6IFwi5q2j5Zyo5pi+56S6XCIsXG4gIG9mOiBcIi9cIixcbiAgZG93bmxvYWRzOiBcIuS4i+i9vVwiLFxuICBMYW5ndWFnZTogXCLor63oqIBcIixcbiAgLy8gZG93bmxvYWQgZmlsdGVyc1xuICBcIkRvd25sb2FkIEZpbHRlcnNcIjogXCLkuIvovb3ov4fmu6TlmahcIixcbiAgUnVubmluZzogXCLov5DooYzkuK1cIixcbiAgQWN0aXZlOiBcIua0u+WKqOeahFwiLFxuICBXYWl0aW5nOiBcIuetieW+heS4rVwiLFxuICBDb21wbGV0ZTogXCLlt7LlrozmiJBcIixcbiAgRXJyb3I6IFwi5Ye66ZSZ55qEXCIsXG4gIFBhdXNlZDogXCLlt7LmmoLlgZxcIixcbiAgUmVtb3ZlZDogXCLlt7LliKDpmaRcIixcbiAgXCJIaWRlIGxpbmtlZCBtZXRhLWRhdGFcIjogXCLpmpDol4/ov57mjqXnmoTlhYPmlbDmja5cIixcbiAgVG9nZ2xlOiBcIuWPjeWQkemAieaLqVwiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCLph43nva7ov4fmu6TlmahcIixcbiAgLy8gZG93bmxvYWQgc3RhdHVzXG4gIFZlcmlmaW5nOiBcIuato+WcqOmqjOivgVwiLFxuICBcIlZlcmlmeSBQZW5kaW5nXCI6IFwi562J5b6F6aqM6K+BXCIsXG4gIC8vIHN0YXJyZWQgcHJvcGVydGllc1xuICBcIlF1aWNrIEFjY2VzcyBTZXR0aW5nc1wiOiBcIuW/q+mAn+iuv+mXruiuvue9rlwiLFxuICBTYXZlOiBcIuS/neWtmFwiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCLkv53lrZjorr7nva5cIixcbiAgXCJDdXJyZW50bHkgbm8gZG93bmxvYWQgaW4gbGluZSB0byBkaXNwbGF5LCB1c2UgdGhlXCI6IFwi5b2T5YmN5rKh5pyJ5Y+v5pi+56S655qE5LiL6L296aG577yM5L2/55SoXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcIuaMiemSruadpeW8gOWni+S4i+i9ve+8gVwiLFxuICBQZWVyczogXCJQZWVyc1wiLFxuICBcIk1vcmUgSW5mb1wiOiBcIuabtOWkmuS/oeaBr1wiLFxuICBSZW1vdmU6IFwi5Yig6ZmkXCIsXG4gIFwiIyBvZlwiOiBcIuWdl+aVsFwiLFxuICBMZW5ndGg6IFwi5Z2X5aSn5bCPXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIuS9v+eUqOmTvuaOpeS4i+i9vVwiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCItIOS9oOWPr+S7peWQjOaXtua3u+WKoOWkmuS4quaWh+S7tuS4i+i9veS7u+WKoe+8jOavj+ihjOS4i+i9veS4gOS4quaWh+S7tu+8m1wiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSDkvaDkuZ/lj6/ku6Xnu5nlkIzkuIDkuKrkuIvovb3ku7vliqHmt7vliqDlpJrkuKrplZzlg4/pk77mjqXvvIzlhpnlnKjkuIDooYzlubbnlKjnqbrmoLzliIbpmpTmr4/mnaHpk77mjqXvvJtcIixcbiAgXCItIEEgVVJJIGNhbiBiZSBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIjogXCItIOmTvuaOpeWPr+S7peaYryBIVFRQKFMp44CBRlRQIOWSjOejgeWKm+mTvuaOpeOAglwiLFxuICBcIkRvd25sb2FkIHNldHRpbmdzXCI6IFwi5LiL6L296K6+572uXCIsXG4gIFwiQWR2YW5jZWQgc2V0dGluZ3NcIjogXCLpq5jnuqforr7nva5cIixcbiAgQ2FuY2VsOiBcIuWPlua2iFwiLFxuICBTdGFydDogXCLlvIDlp4tcIixcbiAgQ2hvb3NlOiBcIumAieaLqVwiLFxuICBcIlF1aWNrIEFjY2VzcyAoc2hvd24gb24gdGhlIG1haW4gcGFnZSlcIjogXCLlv6vpgJ/orr/pl67vvIjlnKjkuLvpobXkuIrmmL7npLrvvIlcIixcbiAgLy8gYWRkIHRvcnJlbnQgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IFRvcnJlbnRzXCI6IFwi5L2/55So56eN5a2Q5LiL6L29XCIsXG4gIFwiLSBTZWxlY3QgdGhlIHRvcnJlbnQgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIOS7juacrOWcsOaWh+S7tuezu+e7n+mAieaLqeenjeWtkOaWh+S7tuW8gOWni+S4i+i9ve+8m1wiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgdG9ycmVudHMgdG8gc3RhcnQgbXVsdGlwbGUgZG93bmxvYWRzLlwiOlxuICAgIFwiLSDkvaDlj6/ku6XlkIzml7bpgInmi6nlpJrkuKrnp43lrZDmnaXlkK/liqjlpJrkuKrkuIvovb3vvJtcIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOlxuICAgIFwiLSDlpoLmnpzopoHmt7vliqDno4Hlipvpk77mjqXvvIzor7fkvb/nlKjmt7vliqDpk77mjqXnmoTmlrnlvI/jgIJcIixcbiAgXCJTZWxlY3QgVG9ycmVudHNcIjogXCLpgInmi6nnp43lrZDmlofku7ZcIixcbiAgXCJTZWxlY3QgYSBUb3JyZW50XCI6IFwi6YCJ5oup56eN5a2Q5paH5Lu2XCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwi5L2/55SoIE1ldGFsaW5rIOS4i+i9vVwiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCLpgInmi6kgTWV0YWxpbmsg5paH5Lu2XCIsXG4gIFwiLSBTZWxlY3QgdGhlIE1ldGFsaW5rIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiKiDku47mnKzlnLDmlofku7bns7vnu5/pgInmi6kgTWV0YWxpbmsg5paH5Lu25byA5aeL5LiL6L2977ybXCIsXG4gIFwiLSBZb3UgY2FuIHNlbGVjdCBtdWx0aXBsZSBNZXRhbGlua3MgdG8gc3RhcnQgbXVsdGlwbGUgZG93bmxvYWRzLlwiOlxuICAgIFwiKiDkvaDlj6/ku6XlkIzml7bpgInmi6nlpJrkuKogTWV0YWxpbmsg5paH5Lu25p2l5ZCv5Yqo5aSa5Liq5LiL6L2944CCXCIsXG4gIFwiU2VsZWN0IGEgTWV0YWxpbmtcIjogXCLpgInmi6kgTWV0YWxpbmsg5paH5Lu2XCIsXG4gIC8vIHNlbGVjdCBmaWxlIG1vZGFsXG4gIFwiQ2hvb3NlIGZpbGVzIHRvIHN0YXJ0IGRvd25sb2FkIGZvclwiOiBcIuivt+mAieaLqeimgeS4i+i9veeahOaWh+S7tlwiLFxuICBcIlNlbGVjdCB0byBkb3dubG9hZFwiOiBcIumAieaLqeS7peS4i+i9vVwiLFxuICAvLyBzZXR0aW5ncyBtb2RhbFxuICBcIkFyaWEyIFJQQyBob3N0IGFuZCBwb3J0XCI6IFwiQXJpYTIgUlBDIOS4u+acuuWSjOerr+WPo1wiLFxuICBcIkVudGVyIHRoZSBob3N0XCI6IFwi5Li75py6XCIsXG4gIFwiRW50ZXIgdGhlIElQIG9yIEROUyBuYW1lIG9mIHRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhlIFJQQyBmb3IgQXJpYTIgaXMgcnVubmluZyAoZGVmYXVsdDogbG9jYWxob3N0KVwiOlxuICAgIFwi6L6T5YWlIEFyaWEyIFJQQyDmiYDlnKjmnI3liqHlmajnmoQgSVAg5oiW5Z+f5ZCN77yI6buY6K6k77yabG9jYWxob3N077yJXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnRcIjogXCLnq6/lj6NcIixcbiAgXCJFbnRlciB0aGUgcG9ydCBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IDY4MDApXCI6XG4gICAgXCLovpPlhaUgQXJpYTIgUlBDIOerr+WPo+WPt++8iOm7mOiupO+8mjY4MDDvvIlcIixcbiAgXCJFbnRlciB0aGUgUlBDIHBhdGhcIjogXCJSUEMg6Lev5b6EXCIsXG4gIFwiRW50ZXIgdGhlIHBhdGggZm9yIHRoZSBBcmlhMiBSUEMgZW5kcG9pbnQgKGRlZmF1bHQ6IC9qc29ucnBjKVwiOlxuICAgIFwi6L6T5YWlIEFyaWEyIFJQQyDot6/lvoTvvIjpu5jorqTvvJovanNvbnJwY++8iVwiLFxuICBcIlNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIlNTTC9UTFMg5Yqg5a+GXCIsXG4gIFwiRW5hYmxlIFNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIuWQr+eUqCBTU0wvVExTIOWKoOWvhlwiLFxuICBcIkVudGVyIHRoZSBzZWNyZXQgdG9rZW4gKG9wdGlvbmFsKVwiOiBcIuWvhueggeS7pOeJjO+8iOWPr+mAie+8iVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcIui+k+WFpSBBcmlhMiBSUEMg5a+G56CB5Luk54mM77yI5aaC5p6c5pyq5ZCv55So5YiZ55WZ56m677yJXCIsXG4gIFwiRW50ZXIgdGhlIHVzZXJuYW1lIChvcHRpb25hbClcIjogXCLnlKjmiLflkI3vvIjlj6/pgInvvIlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHVzZXJuYW1lIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIui+k+WFpSBBcmlhMiBSUEMg55So5oi35ZCN77yI5aaC5p6c5pyq5ZCv55So6Lqr5Lu96aqM6K+B5YiZ55WZ56m677yJXCIsXG4gIFwiRW50ZXIgdGhlIHBhc3N3b3JkIChvcHRpb25hbClcIjogXCLlr4bnoIHvvIjlj6/pgInvvIlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHBhc3N3b3JkIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIui+k+WFpSBBcmlhMiBSUEMg5a+G56CB77yI5aaC5p6c5pyq5ZCv55So6Lqr5Lu96aqM6K+B5YiZ55WZ56m677yJXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIuWfuuacrOmTvuaOpeWcsOWdgO+8iOWPr+mAie+8iVwiLFxuICBcIkRpcmVjdCBEb3dubG9hZFwiOiBcIuebtOaOpeS4i+i9vVwiLFxuICBcIklmIHN1cHBsaWVkLCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgdG8gZW5hYmxlIGRpcmVjdCBkb3dubG9hZCBmcm9tIHRoZSBBcmlhMiBzZXJ2ZXIuXCI6XG4gICAgXCLlpoLmnpzmjIflrpror6XpgInpobnvvIzlsIbkvJrliJvlu7rlj6/ku6Xnm7TmjqXku44gQXJpYTIg5pyN5Yqh5Zmo5LiK5LiL6L295paH5Lu255qE6ZO+5o6l44CCXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjogXCLvvIjpnIDopoEgV0VCIOacjeWKoeWZqOmFjee9ruato+ehru+8iVwiLFxuICBcIlNhdmUgQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6IFwi5L+d5a2Y6L+e5o6l6YWN572uXCIsXG4gIEZpbHRlcjogXCLov4fmu6RcIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcIkFyaWEyIOacjeWKoeWZqOS/oeaBr1wiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCJBcmlhMiDniYjmnKxcIixcbiAgXCJGZWF0dXJlcyBFbmFibGVkXCI6IFwi5bey5ZCv55So5Yqf6IO9XCIsXG4gIC8vIGFib3V0IG1vZGFsXG4gIFwiVG8gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LCBhZGQgaXNzdWVzIG9yIHRvIGNvbnRyaWJ1dGUgYmFjaywgaGVhZCBvbiB0b1wiOlxuICAgIFwi5LiL6L295pyA5paw54mI5pys44CB5o+Q5Lqk6Zeu6aKY5oiW5o2Q5Yqp77yM6K+36K6/6ZeuXCIsXG4gIFwiT3IgeW91IGNhbiBvcGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiB0aGUgYnJvd3NlciB0aHJvdWdoXCI6IFwi55u05o6l5Zyo5rWP6KeI5Zmo5Lit5L2/55So5pyA5paw54mI5pys77yM6K+36K6/6ZeuXCIsXG4gIENsb3NlOiBcIuWFs+mXrVwiLFxuICAvLyBsYWJlbHNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCLlvZPliY3kuIvovb3nirbmgIFcIixcbiAgXCJEb3dubG9hZCBTcGVlZFwiOiBcIuW9k+WJjeS4i+i9vemAn+W6plwiLFxuICBcIlVwbG9hZCBTcGVlZFwiOiBcIuW9k+WJjeS4iuS8oOmAn+W6plwiLFxuICBcIkVzdGltYXRlZCB0aW1lXCI6IFwi6aKE6K6h5Ymp5L2Z5pe26Ze0XCIsXG4gIFwiRG93bmxvYWQgU2l6ZVwiOiBcIuS4i+i9veaAu+Wkp+Wwj1wiLFxuICBEb3dubG9hZGVkOiBcIuW3suS4i+i9veWkp+Wwj1wiLFxuICBQcm9ncmVzczogXCLlvZPliY3kuIvovb3ov5vluqZcIixcbiAgXCJEb3dubG9hZCBQYXRoXCI6IFwi5paH5Lu25LiL6L296Lev5b6EXCIsXG4gIFVwbG9hZGVkOiBcIuW3suS4iuS8oOWkp+Wwj1wiLFxuICBcIkRvd25sb2FkIEdJRFwiOiBcIuS4i+i9veeahCBHSURcIixcbiAgXCJOdW1iZXIgb2YgUGllY2VzXCI6IFwi5paH5Lu25Z2X5pWw6YePXCIsXG4gIFwiUGllY2UgTGVuZ3RoXCI6IFwi5q+P5Z2X5aSn5bCPXCIsXG5cbiAgLy9hbGVydHNcbiAgXCJUaGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIHVuc3VjY2Vzc2Z1bC4gVHJ5aW5nIGFub3RoZXIgY29uZmlndXJhdGlvblwiOlxuICAgIFwi5LiK5qyh6L+e5o6l6K+35rGC5pyq5oiQ5Yqf77yM5q2j5Zyo5bCd6K+V5L2/55So5Y+m5LiA5Liq6YWN572uXCIsXG4gIFwiT2ggU25hcCFcIjogXCLns5/ns5XvvIFcIixcbiAgXCJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgYXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIuaXoOazlei/nuaOpeWIsCBBcmlhMiBSUEMg5pyN5Yqh5Zmo77yM5bCG5ZyoMTDnp5LlkI7ph43or5XjgILmgqjlj6/og73pnIDopoHmo4Dmn6Xov57mjqXorr7nva7vvIzor7fliY3lvoAg6K6+572uID4g6L+e5o6l6K6+572uXCIsXG4gIFwiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGNvbm5lY3RpbmcgdG8gQXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjb25maXJtIHlvdXIgYXV0aGVudGljYXRpb24gZGV0YWlscyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIui/nuaOpeWIsCBBcmlhMiBSUEMg5pyN5Yqh5Zmo5pe26K6k6K+B5aSx6LSl77yM5bCG5ZyoMTDnp5LlkI7ph43or5XjgILmgqjlj6/og73pnIDopoHnoa7orqTmgqjnmoTouqvku73pqozor4Hkv6Hmga/vvIzor7fliY3lvoAg6K6+572uID4g6L+e5o6l6K6+572uXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIGl0cyByZW1vdGUgUlBDIOKAplwiOiBcIumAmui/hyBSUEMg6L+e5o6l5YiwIEFyaWEyIOaIkOWKn++8gVwiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCByZW1vdGUgUlBDLCBob3dldmVyIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGluc2VjdXJlLiBGb3IgY29tcGxldGUgc2VjdXJpdHkgdHJ5IGFkZGluZyBhbiBhdXRob3JpemF0aW9uIHNlY3JldCB0b2tlbiB3aGlsZSBzdGFydGluZyBBcmlhMiAodGhyb3VnaCB0aGUgZmxhZyAtLXJwYy1zZWNyZXQpXCI6XG4gICAgXCLpgJrov4cgUlBDIOi/nuaOpeWIsCBBcmlhMiDmiJDlip/vvIzkvYbmmK/ov57mjqXlubbkuI3lronlhajjgILopoHmg7Pkvb/nlKjlronlhajov57mjqXvvIzlsJ3or5XlnKjlkK/liqggQXJpYTIg5pe25re75Yqg5LiA5Liq5o6I5p2D5a+G56CB5Luk54mM77yI6YCa6L+HIC0tcnBjLXNlY3JldCDlj4LmlbDvvIlcIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwi5q2j5Zyo5bCd6K+V5L2/55So5paw55qE6L+e5o6l6YWN572u5p2l6L+e5o6l5YiwIEFyaWEyIOKApuKAplwiLFxuICBcIlJlbW92ZSB7e25hbWV9fSBhbmQgYXNzb2NpYXRlZCBtZXRhLWRhdGE/XCI6IFwi5piv5ZCm5Yig6ZmkIHt7bmFtZX19IOWSjOWFs+iBlOeahOWFg+aVsOaNru+8n1wiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/translate/zh_CN.js\n'
);
/***/
},
/***/ "./src/js/translate/zh_TW.js":
/*!***********************************!*\
!*** ./src/js/translate/zh_TW.js ***!
\***********************************/
/*! no static exports found */
/***/ function(module, exports) {
eval(
'if (typeof translations == "undefined") {\n translations = {};\n}\n\ntranslations.zh_TW = {\n // header\n Search: "搜尋",\n // Nav menu\n Add: "新增",\n "By URIs": "使用連結",\n "By Torrents": "使用種子",\n "By Metalinks": "使用 Metalink",\n Manage: "管理",\n "Pause All": "暫停所有",\n "Resume Paused": "恢復下載",\n "Purge Completed": "清除已完成",\n "Shutdown Server": "關閉伺服器",\n Settings: "設定",\n "Connection Settings": "連線設定",\n "Global Settings": "全域性設定",\n "Server info": "伺服器資訊",\n "About and contribute": "關於和捐助",\n "Toggle navigation": "切換導航",\n // body\n // nav side bar\n Miscellaneous: "雜項",\n "Global Statistics": "全域性統計",\n About: "關於",\n Displaying: "正在顯示",\n of: "/",\n downloads: "下載",\n Language: "語言",\n // download filters\n "Download Filters": "下載過濾器",\n Running: "執行中",\n Active: "活動的",\n Waiting: "等待中",\n Complete: "已完成",\n Error: "出錯的",\n Paused: "已暫停",\n Removed: "已刪除",\n "Hide linked meta-data": "隱藏連線的元資料",\n Toggle: "反向選擇",\n "Reset filters": "重置過濾器",\n // download status\n Verifing: "正在驗證",\n "Verify Pending": "等待驗證",\n // starred properties\n "Quick Access Settings": "快速訪問設定",\n Save: "儲存",\n "Save settings": "儲存設定",\n "Currently no download in line to display, use the": "當前沒有可顯示的下載項,使用",\n "download button to start downloading files!": "按鈕來開始下載!",\n Peers: "Peers",\n "More Info": "更多資訊",\n Remove: "刪除",\n "# of": "塊數",\n Length: "塊大小",\n // modals\n "Add Downloads By URIs": "使用連結下載",\n "- You can add multiple downloads (files) at the same time by putting URIs for each file on a separate line.":\n "- 你可以同時新增多個檔案下載任務,每行下載一個檔案;",\n "- You can also add multiple URIs (mirrors) for the *same* file. To do this, separate the URIs by a space.":\n "- 你也可以給同一個下載任務新增多個映象連結,寫在一行並用空格分隔每條連結;",\n "- A URI can be HTTP(S)/FTP/BitTorrent-Magnet.": "- 連結可以是 HTTP(S)、FTP 和磁力連結。",\n "Download settings": "下載設定",\n "Advanced settings": "高階設定",\n Cancel: "取消",\n Start: "開始",\n Choose: "選擇",\n "Quick Access (shown on the main page)": "快速訪問(在主頁上顯示)",\n // add torrent modal\n "Add Downloads By Torrents": "使用種子下載",\n "- Select the torrent from the local filesystem to start the download.":\n "- 從本地檔案系統選擇種子檔案開始下載;",\n "- You can select multiple torrents to start multiple downloads.":\n "- 你可以同時選擇多個種子來啟動多個下載;",\n "- To add a BitTorrent-Magnet URL, use the Add By URI option and add it there.":\n "- 如果要新增磁力連結,請使用新增連結的方式。",\n "Select Torrents": "選擇種子檔案",\n "Select a Torrent": "選擇種子檔案",\n // add metalink modal\n "Add Downloads By Metalinks": "使用 Metalink 下載",\n "Select Metalinks": "選擇 Metalink 檔案",\n "- Select the Metalink from the local filesystem to start the download.":\n "* 從本地檔案系統選擇 Metalink 檔案開始下載;",\n "- You can select multiple Metalinks to start multiple downloads.":\n "* 你可以同時選擇多個 Metalink 檔案來啟動多個下載。",\n "Select a Metalink": "選擇 Metalink 檔案",\n // select file modal\n "Choose files to start download for": "請選擇要下載的檔案",\n "Select to download": "選擇以下載",\n // settings modal\n "Aria2 RPC host and port": "Aria2 RPC 主機和埠",\n "Enter the host": "主機",\n "Enter the IP or DNS name of the server on which the RPC for Aria2 is running (default: localhost)":\n "輸入 Aria2 RPC 所在伺服器的 IP 或域名(預設:localhost)",\n "Enter the port": "埠號",\n "Enter the port of the server on which the RPC for Aria2 is running (default: 6800)":\n "輸入 Aria2 RPC 埠號(預設:6800)",\n "Enter the RPC path": "RPC 路徑",\n "Enter the path for the Aria2 RPC endpoint (default: /jsonrpc)":\n "輸入 Aria2 RPC 路徑(預設:/jsonrpc)",\n "SSL/TLS encryption": "SSL/TLS 加密",\n "Enable SSL/TLS encryption": "啟用 SSL/TLS 加密",\n "Enter the secret token (optional)": "密碼令牌(可選)",\n "Enter the Aria2 RPC secret token (leave empty if authentication is not enabled)":\n "輸入 Aria2 RPC 密碼令牌(如果未啟用則留空)",\n "Enter the username (optional)": "使用者名稱(可選)",\n "Enter the Aria2 RPC username (empty if authentication not enabled)":\n "輸入 Aria2 RPC 使用者名稱(如果未啟用身份驗證則留空)",\n "Enter the password (optional)": "密碼(可選)",\n "Enter the Aria2 RPC password (empty if authentication not enabled)":\n "輸入 Aria2 RPC 密碼(如果未啟用身份驗證則留空)",\n "Enter base URL (optional)": "基本連結地址(可選)",\n "Direct Download": "直接下載",\n "If supplied, links will be created to enable direct download from the Aria2 server.":\n "如果指定該選項,將會建立可以直接從 Aria2 伺服器上下載檔案的連結。",\n "(Requires appropriate webserver to be configured.)": "(需要 WEB 伺服器配置正確)",\n "Save Connection configuration": "儲存連線配置",\n Filter: "過濾",\n // server info modal\n "Aria2 server info": "Aria2 伺服器資訊",\n "Aria2 Version": "Aria2 版本",\n "Features Enabled": "已啟用功能",\n // about modal\n "To download the latest version of the project, add issues or to contribute back, head on to":\n "下載最新版本、提交問題或捐助,請訪問",\n "Or you can open the latest version in the browser through": "直接在瀏覽器中使用最新版本,請訪問",\n Close: "關閉",\n // labels\n "Download status": "當前下載狀態",\n "Download Speed": "當前下載速度",\n "Upload Speed": "當前上傳速度",\n "Estimated time": "預計剩餘時間",\n "Download Size": "下載總大小",\n Downloaded: "已下載大小",\n Progress: "當前下載進度",\n "Download Path": "檔案下載路徑",\n Uploaded: "已上傳大小",\n "Download GID": "下載的 GID",\n "Number of Pieces": "檔案塊數量",\n "Piece Length": "每塊大小",\n\n //alerts\n "The last connection attempt was unsuccessful. Trying another configuration":\n "上次連線請求未成功,正在嘗試使用另一個配置",\n "Oh Snap!": "糟糕!",\n "Could not connect to the aria2 RPC server. Will retry in 10 secs. You might want to check the connection settings by going to Settings > Connection Settings":\n "無法連線到 Aria2 RPC 伺服器,將在10秒後重試。您可能需要檢查連線設定,請前往 設定 > 連線設定",\n "Authentication failed while connecting to Aria2 RPC server. Will retry in 10 secs. You might want to confirm your authentication details by going to Settings > Connection Settings":\n "連線到 Aria2 RPC 伺服器時認證失敗,將在10秒後重試。您可能需要確認您的身份驗證資訊,請前往 設定 > 連線設定",\n "Successfully connected to Aria2 through its remote RPC …": "通過 RPC 連線到 Aria2 成功!",\n "Successfully connected to Aria2 through remote RPC, however the connection is still insecure. For complete security try adding an authorization secret token while starting Aria2 (through the flag --rpc-secret)":\n "通過 RPC 連線到 Aria2 成功,但是連線並不安全。要想使用安全連線,嘗試在啟動 Aria2 時新增一個授權密碼令牌(通過 --rpc-secret 引數)",\n "Trying to connect to aria2 using the new connection configuration":\n "正在嘗試使用新的連線配置來連線到 Aria2 ……",\n "Remove {{name}} and associated meta-data?": "是否刪除 {{name}} 和關聯的元資料?"\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvanMvdHJhbnNsYXRlL3poX1RXLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2pzL3RyYW5zbGF0ZS96aF9UVy5qcz81YWNkIl0sInNvdXJjZXNDb250ZW50IjpbImlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09IFwidW5kZWZpbmVkXCIpIHtcbiAgdHJhbnNsYXRpb25zID0ge307XG59XG5cbnRyYW5zbGF0aW9ucy56aF9UVyA9IHtcbiAgLy8gaGVhZGVyXG4gIFNlYXJjaDogXCLmkJzlsItcIixcbiAgLy8gTmF2IG1lbnVcbiAgQWRkOiBcIuaWsOWinlwiLFxuICBcIkJ5IFVSSXNcIjogXCLkvb/nlKjpgKPntZBcIixcbiAgXCJCeSBUb3JyZW50c1wiOiBcIuS9v+eUqOeoruWtkFwiLFxuICBcIkJ5IE1ldGFsaW5rc1wiOiBcIuS9v+eUqCBNZXRhbGlua1wiLFxuICBNYW5hZ2U6IFwi566h55CGXCIsXG4gIFwiUGF1c2UgQWxsXCI6IFwi5pqr5YGc5omA5pyJXCIsXG4gIFwiUmVzdW1lIFBhdXNlZFwiOiBcIuaBouW+qeS4i+i8iVwiLFxuICBcIlB1cmdlIENvbXBsZXRlZFwiOiBcIua4hemZpOW3suWujOaIkFwiLFxuICBcIlNodXRkb3duIFNlcnZlclwiOiBcIumXnOmWieS8uuacjeWZqFwiLFxuICBTZXR0aW5nczogXCLoqK3lrppcIixcbiAgXCJDb25uZWN0aW9uIFNldHRpbmdzXCI6IFwi6YCj57ea6Kit5a6aXCIsXG4gIFwiR2xvYmFsIFNldHRpbmdzXCI6IFwi5YWo5Z+f5oCn6Kit5a6aXCIsXG4gIFwiU2VydmVyIGluZm9cIjogXCLkvLrmnI3lmajos4foqIpcIixcbiAgXCJBYm91dCBhbmQgY29udHJpYnV0ZVwiOiBcIumXnOaWvOWSjOaNkOWKqVwiLFxuICBcIlRvZ2dsZSBuYXZpZ2F0aW9uXCI6IFwi5YiH5o+b5bCO6IiqXCIsXG4gIC8vIGJvZHlcbiAgLy8gbmF2IHNpZGUgYmFyXG4gIE1pc2NlbGxhbmVvdXM6IFwi6Zuc6aCFXCIsXG4gIFwiR2xvYmFsIFN0YXRpc3RpY3NcIjogXCLlhajln5/mgKfntbHoqIhcIixcbiAgQWJvdXQ6IFwi6Zec5pa8XCIsXG4gIERpc3BsYXlpbmc6IFwi5q2j5Zyo6aGv56S6XCIsXG4gIG9mOiBcIi9cIixcbiAgZG93bmxvYWRzOiBcIuS4i+i8iVwiLFxuICBMYW5ndWFnZTogXCLoqp7oqIBcIixcbiAgLy8gZG93bmxvYWQgZmlsdGVyc1xuICBcIkRvd25sb2FkIEZpbHRlcnNcIjogXCLkuIvovInpgY7mv77lmahcIixcbiAgUnVubmluZzogXCLln7fooYzkuK1cIixcbiAgQWN0aXZlOiBcIua0u+WLleeahFwiLFxuICBXYWl0aW5nOiBcIuetieW+heS4rVwiLFxuICBDb21wbGV0ZTogXCLlt7LlrozmiJBcIixcbiAgRXJyb3I6IFwi5Ye66Yyv55qEXCIsXG4gIFBhdXNlZDogXCLlt7LmmqvlgZxcIixcbiAgUmVtb3ZlZDogXCLlt7LliKrpmaRcIixcbiAgXCJIaWRlIGxpbmtlZCBtZXRhLWRhdGFcIjogXCLpmrHol4/pgKPnt5rnmoTlhYPos4fmlplcIixcbiAgVG9nZ2xlOiBcIuWPjeWQkemBuOaTh1wiLFxuICBcIlJlc2V0IGZpbHRlcnNcIjogXCLph43nva7pgY7mv77lmahcIixcbiAgLy8gZG93bmxvYWQgc3RhdHVzXG4gIFZlcmlmaW5nOiBcIuato+WcqOmpl+itiVwiLFxuICBcIlZlcmlmeSBQZW5kaW5nXCI6IFwi562J5b6F6amX6K2JXCIsXG4gIC8vIHN0YXJyZWQgcHJvcGVydGllc1xuICBcIlF1aWNrIEFjY2VzcyBTZXR0aW5nc1wiOiBcIuW/q+mAn+ioquWVj+ioreWumlwiLFxuICBTYXZlOiBcIuWEsuWtmFwiLFxuICBcIlNhdmUgc2V0dGluZ3NcIjogXCLlhLLlrZjoqK3lrppcIixcbiAgXCJDdXJyZW50bHkgbm8gZG93bmxvYWQgaW4gbGluZSB0byBkaXNwbGF5LCB1c2UgdGhlXCI6IFwi55W25YmN5rKS5pyJ5Y+v6aGv56S655qE5LiL6LyJ6aCF77yM5L2/55SoXCIsXG4gIFwiZG93bmxvYWQgYnV0dG9uIHRvIHN0YXJ0IGRvd25sb2FkaW5nIGZpbGVzIVwiOiBcIuaMiemIleS+humWi+Wni+S4i+i8ie+8gVwiLFxuICBQZWVyczogXCJQZWVyc1wiLFxuICBcIk1vcmUgSW5mb1wiOiBcIuabtOWkmuizh+ioilwiLFxuICBSZW1vdmU6IFwi5Yiq6ZmkXCIsXG4gIFwiIyBvZlwiOiBcIuWhiuaVuFwiLFxuICBMZW5ndGg6IFwi5aGK5aSn5bCPXCIsXG4gIC8vIG1vZGFsc1xuICBcIkFkZCBEb3dubG9hZHMgQnkgVVJJc1wiOiBcIuS9v+eUqOmAo+e1kOS4i+i8iVwiLFxuICBcIi0gWW91IGNhbiBhZGQgbXVsdGlwbGUgZG93bmxvYWRzIChmaWxlcykgYXQgdGhlIHNhbWUgdGltZSBieSBwdXR0aW5nIFVSSXMgZm9yIGVhY2ggZmlsZSBvbiBhIHNlcGFyYXRlIGxpbmUuXCI6XG4gICAgXCItIOS9oOWPr+S7peWQjOaZguaWsOWinuWkmuWAi+aqlOahiOS4i+i8ieS7u+WLme+8jOavj+ihjOS4i+i8ieS4gOWAi+aqlOahiO+8m1wiLFxuICBcIi0gWW91IGNhbiBhbHNvIGFkZCBtdWx0aXBsZSBVUklzIChtaXJyb3JzKSBmb3IgdGhlICpzYW1lKiBmaWxlLiBUbyBkbyB0aGlzLCBzZXBhcmF0ZSB0aGUgVVJJcyBieSBhIHNwYWNlLlwiOlxuICAgIFwiLSDkvaDkuZ/lj6/ku6XntablkIzkuIDlgIvkuIvovInku7vli5nmlrDlop7lpJrlgIvmmKDosaHpgKPntZDvvIzlr6vlnKjkuIDooYzkuKbnlKjnqbrmoLzliIbpmpTmr4/mop3pgKPntZDvvJtcIixcbiAgXCItIEEgVVJJIGNhbiBiZSBIVFRQKFMpL0ZUUC9CaXRUb3JyZW50LU1hZ25ldC5cIjogXCItIOmAo+e1kOWPr+S7peaYryBIVFRQKFMp44CBRlRQIOWSjOejgeWKm+mAo+e1kOOAglwiLFxuICBcIkRvd25sb2FkIHNldHRpbmdzXCI6IFwi5LiL6LyJ6Kit5a6aXCIsXG4gIFwiQWR2YW5jZWQgc2V0dGluZ3NcIjogXCLpq5jpmo7oqK3lrppcIixcbiAgQ2FuY2VsOiBcIuWPlua2iFwiLFxuICBTdGFydDogXCLplovlp4tcIixcbiAgQ2hvb3NlOiBcIumBuOaTh1wiLFxuICBcIlF1aWNrIEFjY2VzcyAoc2hvd24gb24gdGhlIG1haW4gcGFnZSlcIjogXCLlv6vpgJ/oqKrllY/vvIjlnKjkuLvpoIHkuIrpoa/npLrvvIlcIixcbiAgLy8gYWRkIHRvcnJlbnQgbW9kYWxcbiAgXCJBZGQgRG93bmxvYWRzIEJ5IFRvcnJlbnRzXCI6IFwi5L2/55So56iu5a2Q5LiL6LyJXCIsXG4gIFwiLSBTZWxlY3QgdGhlIHRvcnJlbnQgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byBzdGFydCB0aGUgZG93bmxvYWQuXCI6XG4gICAgXCItIOW+nuacrOWcsOaqlOahiOezu+e1semBuOaTh+eoruWtkOaqlOahiOmWi+Wni+S4i+i8ie+8m1wiLFxuICBcIi0gWW91IGNhbiBzZWxlY3QgbXVsdGlwbGUgdG9ycmVudHMgdG8gc3RhcnQgbXVsdGlwbGUgZG93bmxvYWRzLlwiOlxuICAgIFwiLSDkvaDlj6/ku6XlkIzmmYLpgbjmk4flpJrlgIvnqK7lrZDkvobllZ/li5XlpJrlgIvkuIvovInvvJtcIixcbiAgXCItIFRvIGFkZCBhIEJpdFRvcnJlbnQtTWFnbmV0IFVSTCwgdXNlIHRoZSBBZGQgQnkgVVJJIG9wdGlvbiBhbmQgYWRkIGl0IHRoZXJlLlwiOlxuICAgIFwiLSDlpoLmnpzopoHmlrDlop7no4HlipvpgKPntZDvvIzoq4vkvb/nlKjmlrDlop7pgKPntZDnmoTmlrnlvI/jgIJcIixcbiAgXCJTZWxlY3QgVG9ycmVudHNcIjogXCLpgbjmk4fnqK7lrZDmqpTmoYhcIixcbiAgXCJTZWxlY3QgYSBUb3JyZW50XCI6IFwi6YG45pOH56iu5a2Q5qqU5qGIXCIsXG4gIC8vIGFkZCBtZXRhbGluayBtb2RhbFxuICBcIkFkZCBEb3dubG9hZHMgQnkgTWV0YWxpbmtzXCI6IFwi5L2/55SoIE1ldGFsaW5rIOS4i+i8iVwiLFxuICBcIlNlbGVjdCBNZXRhbGlua3NcIjogXCLpgbjmk4cgTWV0YWxpbmsg5qqU5qGIXCIsXG4gIFwiLSBTZWxlY3QgdGhlIE1ldGFsaW5rIGZyb20gdGhlIGxvY2FsIGZpbGVzeXN0ZW0gdG8gc3RhcnQgdGhlIGRvd25sb2FkLlwiOlxuICAgIFwiKiDlvp7mnKzlnLDmqpTmoYjns7vntbHpgbjmk4cgTWV0YWxpbmsg5qqU5qGI6ZaL5aeL5LiL6LyJ77ybXCIsXG4gIFwiLSBZb3UgY2FuIHNlbGVjdCBtdWx0aXBsZSBNZXRhbGlua3MgdG8gc3RhcnQgbXVsdGlwbGUgZG93bmxvYWRzLlwiOlxuICAgIFwiKiDkvaDlj6/ku6XlkIzmmYLpgbjmk4flpJrlgIsgTWV0YWxpbmsg5qqU5qGI5L6G5ZWf5YuV5aSa5YCL5LiL6LyJ44CCXCIsXG4gIFwiU2VsZWN0IGEgTWV0YWxpbmtcIjogXCLpgbjmk4cgTWV0YWxpbmsg5qqU5qGIXCIsXG4gIC8vIHNlbGVjdCBmaWxlIG1vZGFsXG4gIFwiQ2hvb3NlIGZpbGVzIHRvIHN0YXJ0IGRvd25sb2FkIGZvclwiOiBcIuiri+mBuOaTh+imgeS4i+i8ieeahOaqlOahiFwiLFxuICBcIlNlbGVjdCB0byBkb3dubG9hZFwiOiBcIumBuOaTh+S7peS4i+i8iVwiLFxuICAvLyBzZXR0aW5ncyBtb2RhbFxuICBcIkFyaWEyIFJQQyBob3N0IGFuZCBwb3J0XCI6IFwiQXJpYTIgUlBDIOS4u+apn+WSjOWfoFwiLFxuICBcIkVudGVyIHRoZSBob3N0XCI6IFwi5Li75qmfXCIsXG4gIFwiRW50ZXIgdGhlIElQIG9yIEROUyBuYW1lIG9mIHRoZSBzZXJ2ZXIgb24gd2hpY2ggdGhlIFJQQyBmb3IgQXJpYTIgaXMgcnVubmluZyAoZGVmYXVsdDogbG9jYWxob3N0KVwiOlxuICAgIFwi6Ly45YWlIEFyaWEyIFJQQyDmiYDlnKjkvLrmnI3lmajnmoQgSVAg5oiW5Z+f5ZCN77yI6aCQ6Kit77yabG9jYWxob3N077yJXCIsXG4gIFwiRW50ZXIgdGhlIHBvcnRcIjogXCLln6DomZ9cIixcbiAgXCJFbnRlciB0aGUgcG9ydCBvZiB0aGUgc2VydmVyIG9uIHdoaWNoIHRoZSBSUEMgZm9yIEFyaWEyIGlzIHJ1bm5pbmcgKGRlZmF1bHQ6IDY4MDApXCI6XG4gICAgXCLovLjlhaUgQXJpYTIgUlBDIOWfoOiZn++8iOmgkOiore+8mjY4MDDvvIlcIixcbiAgXCJFbnRlciB0aGUgUlBDIHBhdGhcIjogXCJSUEMg6Lev5b6RXCIsXG4gIFwiRW50ZXIgdGhlIHBhdGggZm9yIHRoZSBBcmlhMiBSUEMgZW5kcG9pbnQgKGRlZmF1bHQ6IC9qc29ucnBjKVwiOlxuICAgIFwi6Ly45YWlIEFyaWEyIFJQQyDot6/lvpHvvIjpoJDoqK3vvJovanNvbnJwY++8iVwiLFxuICBcIlNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIlNTTC9UTFMg5Yqg5a+GXCIsXG4gIFwiRW5hYmxlIFNTTC9UTFMgZW5jcnlwdGlvblwiOiBcIuWVn+eUqCBTU0wvVExTIOWKoOWvhlwiLFxuICBcIkVudGVyIHRoZSBzZWNyZXQgdG9rZW4gKG9wdGlvbmFsKVwiOiBcIuWvhueivOS7pOeJjO+8iOWPr+mBuO+8iVwiLFxuICBcIkVudGVyIHRoZSBBcmlhMiBSUEMgc2VjcmV0IHRva2VuIChsZWF2ZSBlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBpcyBub3QgZW5hYmxlZClcIjpcbiAgICBcIui8uOWFpSBBcmlhMiBSUEMg5a+G56K85Luk54mM77yI5aaC5p6c5pyq5ZWf55So5YmH55WZ56m677yJXCIsXG4gIFwiRW50ZXIgdGhlIHVzZXJuYW1lIChvcHRpb25hbClcIjogXCLkvb/nlKjogIXlkI3nqLHvvIjlj6/pgbjvvIlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHVzZXJuYW1lIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIui8uOWFpSBBcmlhMiBSUEMg5L2/55So6ICF5ZCN56ix77yI5aaC5p6c5pyq5ZWf55So6Lqr5Lu96amX6K2J5YmH55WZ56m677yJXCIsXG4gIFwiRW50ZXIgdGhlIHBhc3N3b3JkIChvcHRpb25hbClcIjogXCLlr4bnorzvvIjlj6/pgbjvvIlcIixcbiAgXCJFbnRlciB0aGUgQXJpYTIgUlBDIHBhc3N3b3JkIChlbXB0eSBpZiBhdXRoZW50aWNhdGlvbiBub3QgZW5hYmxlZClcIjpcbiAgICBcIui8uOWFpSBBcmlhMiBSUEMg5a+G56K877yI5aaC5p6c5pyq5ZWf55So6Lqr5Lu96amX6K2J5YmH55WZ56m677yJXCIsXG4gIFwiRW50ZXIgYmFzZSBVUkwgKG9wdGlvbmFsKVwiOiBcIuWfuuacrOmAo+e1kOWcsOWdgO+8iOWPr+mBuO+8iVwiLFxuICBcIkRpcmVjdCBEb3dubG9hZFwiOiBcIuebtOaOpeS4i+i8iVwiLFxuICBcIklmIHN1cHBsaWVkLCBsaW5rcyB3aWxsIGJlIGNyZWF0ZWQgdG8gZW5hYmxlIGRpcmVjdCBkb3dubG9hZCBmcm9tIHRoZSBBcmlhMiBzZXJ2ZXIuXCI6XG4gICAgXCLlpoLmnpzmjIflrproqbLpgbjpoIXvvIzlsIfmnIPlu7rnq4vlj6/ku6Xnm7TmjqXlvp4gQXJpYTIg5Ly65pyN5Zmo5LiK5LiL6LyJ5qqU5qGI55qE6YCj57WQ44CCXCIsXG4gIFwiKFJlcXVpcmVzIGFwcHJvcHJpYXRlIHdlYnNlcnZlciB0byBiZSBjb25maWd1cmVkLilcIjogXCLvvIjpnIDopoEgV0VCIOS8uuacjeWZqOmFjee9ruato+eiuu+8iVwiLFxuICBcIlNhdmUgQ29ubmVjdGlvbiBjb25maWd1cmF0aW9uXCI6IFwi5YSy5a2Y6YCj57ea6YWN572uXCIsXG4gIEZpbHRlcjogXCLpgY7mv75cIixcbiAgLy8gc2VydmVyIGluZm8gbW9kYWxcbiAgXCJBcmlhMiBzZXJ2ZXIgaW5mb1wiOiBcIkFyaWEyIOS8uuacjeWZqOizh+ioilwiLFxuICBcIkFyaWEyIFZlcnNpb25cIjogXCJBcmlhMiDniYjmnKxcIixcbiAgXCJGZWF0dXJlcyBFbmFibGVkXCI6IFwi5bey5ZWf55So5Yqf6IO9XCIsXG4gIC8vIGFib3V0IG1vZGFsXG4gIFwiVG8gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LCBhZGQgaXNzdWVzIG9yIHRvIGNvbnRyaWJ1dGUgYmFjaywgaGVhZCBvbiB0b1wiOlxuICAgIFwi5LiL6LyJ5pyA5paw54mI5pys44CB5o+Q5Lqk5ZWP6aGM5oiW5o2Q5Yqp77yM6KuL6Kiq5ZWPXCIsXG4gIFwiT3IgeW91IGNhbiBvcGVuIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiB0aGUgYnJvd3NlciB0aHJvdWdoXCI6IFwi55u05o6l5Zyo54CP6Ka95Zmo5Lit5L2/55So5pyA5paw54mI5pys77yM6KuL6Kiq5ZWPXCIsXG4gIENsb3NlOiBcIumXnOmWiVwiLFxuICAvLyBsYWJlbHNcbiAgXCJEb3dubG9hZCBzdGF0dXNcIjogXCLnlbbliY3kuIvovInni4DmhYtcIixcbiAgXCJEb3dubG9hZCBTcGVlZFwiOiBcIueVtuWJjeS4i+i8iemAn+W6plwiLFxuICBcIlVwbG9hZCBTcGVlZFwiOiBcIueVtuWJjeS4iuWCs+mAn+W6plwiLFxuICBcIkVzdGltYXRlZCB0aW1lXCI6IFwi6aCQ6KiI5Ymp6aSY5pmC6ZaTXCIsXG4gIFwiRG93bmxvYWQgU2l6ZVwiOiBcIuS4i+i8iee4veWkp+Wwj1wiLFxuICBEb3dubG9hZGVkOiBcIuW3suS4i+i8ieWkp+Wwj1wiLFxuICBQcm9ncmVzczogXCLnlbbliY3kuIvovInpgLLluqZcIixcbiAgXCJEb3dubG9hZCBQYXRoXCI6IFwi5qqU5qGI5LiL6LyJ6Lev5b6RXCIsXG4gIFVwbG9hZGVkOiBcIuW3suS4iuWCs+Wkp+Wwj1wiLFxuICBcIkRvd25sb2FkIEdJRFwiOiBcIuS4i+i8ieeahCBHSURcIixcbiAgXCJOdW1iZXIgb2YgUGllY2VzXCI6IFwi5qqU5qGI5aGK5pW46YePXCIsXG4gIFwiUGllY2UgTGVuZ3RoXCI6IFwi5q+P5aGK5aSn5bCPXCIsXG5cbiAgLy9hbGVydHNcbiAgXCJUaGUgbGFzdCBjb25uZWN0aW9uIGF0dGVtcHQgd2FzIHVuc3VjY2Vzc2Z1bC4gVHJ5aW5nIGFub3RoZXIgY29uZmlndXJhdGlvblwiOlxuICAgIFwi5LiK5qyh6YCj57ea6KuL5rGC5pyq5oiQ5Yqf77yM5q2j5Zyo5ZiX6Kmm5L2/55So5Y+m5LiA5YCL6YWN572uXCIsXG4gIFwiT2ggU25hcCFcIjogXCLns5/ns5XvvIFcIixcbiAgXCJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgYXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjaGVjayB0aGUgY29ubmVjdGlvbiBzZXR0aW5ncyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIueEoeazlemAo+e3muWIsCBBcmlhMiBSUEMg5Ly65pyN5Zmo77yM5bCH5ZyoMTDnp5Llvozph43oqabjgILmgqjlj6/og73pnIDopoHmqqLmn6XpgKPnt5roqK3lrprvvIzoq4vliY3lvoAg6Kit5a6aID4g6YCj57ea6Kit5a6aXCIsXG4gIFwiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIGNvbm5lY3RpbmcgdG8gQXJpYTIgUlBDIHNlcnZlci4gV2lsbCByZXRyeSBpbiAxMCBzZWNzLiBZb3UgbWlnaHQgd2FudCB0byBjb25maXJtIHlvdXIgYXV0aGVudGljYXRpb24gZGV0YWlscyBieSBnb2luZyB0byBTZXR0aW5ncyA+IENvbm5lY3Rpb24gU2V0dGluZ3NcIjpcbiAgICBcIumAo+e3muWIsCBBcmlhMiBSUEMg5Ly65pyN5Zmo5pmC6KqN6K2J5aSx5pWX77yM5bCH5ZyoMTDnp5Llvozph43oqabjgILmgqjlj6/og73pnIDopoHnorroqo3mgqjnmoTouqvku73pqZforYnos4foqIrvvIzoq4vliY3lvoAg6Kit5a6aID4g6YCj57ea6Kit5a6aXCIsXG4gIFwiU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBBcmlhMiB0aHJvdWdoIGl0cyByZW1vdGUgUlBDIOKAplwiOiBcIumAmumBjiBSUEMg6YCj57ea5YiwIEFyaWEyIOaIkOWKn++8gVwiLFxuICBcIlN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gQXJpYTIgdGhyb3VnaCByZW1vdGUgUlBDLCBob3dldmVyIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGluc2VjdXJlLiBGb3IgY29tcGxldGUgc2VjdXJpdHkgdHJ5IGFkZGluZyBhbiBhdXRob3JpemF0aW9uIHNlY3JldCB0b2tlbiB3aGlsZSBzdGFydGluZyBBcmlhMiAodGhyb3VnaCB0aGUgZmxhZyAtLXJwYy1zZWNyZXQpXCI6XG4gICAgXCLpgJrpgY4gUlBDIOmAo+e3muWIsCBBcmlhMiDmiJDlip/vvIzkvYbmmK/pgKPnt5rkuKbkuI3lronlhajjgILopoHmg7Pkvb/nlKjlronlhajpgKPnt5rvvIzlmJfoqablnKjllZ/li5UgQXJpYTIg5pmC5paw5aKe5LiA5YCL5o6I5qyK5a+G56K85Luk54mM77yI6YCa6YGOIC0tcnBjLXNlY3JldCDlvJXmlbjvvIlcIixcbiAgXCJUcnlpbmcgdG8gY29ubmVjdCB0byBhcmlhMiB1c2luZyB0aGUgbmV3IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiOlxuICAgIFwi5q2j5Zyo5ZiX6Kmm5L2/55So5paw55qE6YCj57ea6YWN572u5L6G6YCj57ea5YiwIEFyaWEyIOKApuKAplwiLFxuICBcIlJlbW92ZSB7e25hbWV9fSBhbmQgYXNzb2NpYXRlZCBtZXRhLWRhdGE/XCI6IFwi5piv5ZCm5Yiq6ZmkIHt7bmFtZX19IOWSjOmXnOiBr+eahOWFg+izh+aWme+8n1wiXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/js/translate/zh_TW.js\n'
);
/***/
}
/******/
}
);