UNPKG

cpf-utils

Version:

Utility functions to deal with CPF data (Brazilian personal ID), like generation fake ones, validating and formatting

318 lines (294 loc) 58.4 kB
/** * cpf-utils v1.4.2 * * @author Julio L. Muller. * @license MIT - 2020-2025 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.cpfUtils = factory()); })(this, (function () { 'use strict'; /** * Copyright (C) 2017-present by Andrea Giammarchi - @WebReflection * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ const { replace } = ''; const ca = /[&<>'"]/g; const esca = { '&': '&amp;', '<': '&lt;', '>': '&gt;', "'": '&#39;', '"': '&quot;' }; const pe = m => esca[m]; /** * Safely escape HTML entities such as `&`, `<`, `>`, `"`, and `'`. * @param {string} es the input to safely escape * @returns {string} the escaped input, and it **throws** an error if * the input type is unexpected, except for boolean and numbers, * converted as string. */ const escape = es => replace.call(es, ca, pe); function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var build; var hasRequiredBuild; function requireBuild () { if (hasRequiredBuild) return build; hasRequiredBuild = 1; function numOnly(target) { return String(target).replace(/\D/g, ""); } build = numOnly; return build; } var buildExports = requireBuild(); var numOnly = /*@__PURE__*/getDefaultExportFromCjs(buildExports); var cjs; var hasRequiredCjs; function requireCjs() { if (hasRequiredCjs) return cjs; hasRequiredCjs = 1; var isMergeableObject = function isMergeableObject(value) { return isNonNullObject(value) && !isSpecial(value); }; function isNonNullObject(value) { return !!value && typeof value === 'object'; } function isSpecial(value) { var stringValue = Object.prototype.toString.call(value); return stringValue === '[object RegExp]' || stringValue === '[object Date]' || isReactElement(value); } // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 var canUseSymbol = typeof Symbol === 'function' && Symbol.for; var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; function isReactElement(value) { return value.$$typeof === REACT_ELEMENT_TYPE; } function emptyTarget(val) { return Array.isArray(val) ? [] : {}; } function cloneUnlessOtherwiseSpecified(value, options) { return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value; } function defaultArrayMerge(target, source, options) { return target.concat(source).map(function (element) { return cloneUnlessOtherwiseSpecified(element, options); }); } function getMergeFunction(key, options) { if (!options.customMerge) { return deepmerge; } var customMerge = options.customMerge(key); return typeof customMerge === 'function' ? customMerge : deepmerge; } function getEnumerableOwnPropertySymbols(target) { return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(target).filter(function (symbol) { return Object.propertyIsEnumerable.call(target, symbol); }) : []; } function getKeys(target) { return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)); } function propertyIsOnObject(object, property) { try { return property in object; } catch (_) { return false; } } // Protects from prototype poisoning and unexpected merging up the prototype chain. function propertyIsUnsafe(target, key) { return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, && Object.propertyIsEnumerable.call(target, key)); // and also unsafe if they're nonenumerable. } function mergeObject(target, source, options) { var destination = {}; if (options.isMergeableObject(target)) { getKeys(target).forEach(function (key) { destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); }); } getKeys(source).forEach(function (key) { if (propertyIsUnsafe(target, key)) { return; } if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { destination[key] = getMergeFunction(key, options)(target[key], source[key], options); } else { destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); } }); return destination; } function deepmerge(target, source, options) { options = options || {}; options.arrayMerge = options.arrayMerge || defaultArrayMerge; options.isMergeableObject = options.isMergeableObject || isMergeableObject; // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() // implementations can use it. The caller may not replace it. options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified; var sourceIsArray = Array.isArray(source); var targetIsArray = Array.isArray(target); var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; if (!sourceAndTargetTypesMatch) { return cloneUnlessOtherwiseSpecified(source, options); } else if (sourceIsArray) { return options.arrayMerge(target, source, options); } else { return mergeObject(target, source, options); } } deepmerge.all = function deepmergeAll(array, options) { if (!Array.isArray(array)) { throw new Error('first argument should be an array'); } return array.reduce(function (prev, next) { return deepmerge(prev, next, options); }, {}); }; var deepmerge_1 = deepmerge; cjs = deepmerge_1; return cjs; } var cjsExports = requireCjs(); var mergeDeep = /*@__PURE__*/getDefaultExportFromCjs(cjsExports); const defaultOptions$1 = { delimiters: { dot: ".", dash: "-" }, hiddenRange: { start: 3, end: 10 }, onFail: (value) => value, hiddenKey: "*", hidden: false, escape: false }; function mergeOptions$1(customOptions = {}) { const options = mergeDeep( defaultOptions$1, customOptions ); if (options.hidden) { if (isNaN(options.hiddenRange.start) || options.hiddenRange.start < 0 || options.hiddenRange.start > 10) { throw new TypeError('Option "hiddenRange.start" must be a number between 0 and 10.'); } if (isNaN(options.hiddenRange.end) || options.hiddenRange.end < 0 || options.hiddenRange.end > 10) { throw new TypeError('Option "hiddenRange.end" must be a number between 0 and 10.'); } if (options.hiddenRange.start > options.hiddenRange.end) { const aux = options.hiddenRange.start; options.hiddenRange.start = options.hiddenRange.end; options.hiddenRange.end = aux; } } if (typeof options.onFail !== "function") { throw new TypeError('The option "onFail" must be a callback function.'); } return options; } function cpfFmt(cpfString, options) { const CPF_LENGTH = 11; const cpfArray = numOnly(cpfString).split(""); const customOptions = mergeOptions$1(options); if (cpfArray.length !== CPF_LENGTH) { const error = new Error(`Parameter "${cpfString}" does not contain ${CPF_LENGTH} digits.`); return customOptions.onFail(cpfString, error); } if (customOptions.hidden) { for (let i = customOptions.hiddenRange.start; i <= customOptions.hiddenRange.end; i++) { cpfArray[i] = customOptions.hiddenKey; } } cpfArray.splice(9, 0, customOptions.delimiters.dash); cpfArray.splice(6, 0, customOptions.delimiters.dot); cpfArray.splice(3, 0, customOptions.delimiters.dot); const cpfPretty = cpfArray.join(""); if (customOptions.escape) { return escape(cpfPretty); } return cpfPretty; } const defaultOptions = { format: false, prefix: "" }; function mergeOptions(customOptions = {}) { return mergeDeep(defaultOptions, customOptions); } function numberGenerator(length) { const numericSequence = []; while (numericSequence.length < length) { const random = Math.random() * 10; const integer = Math.floor(random); numericSequence.push(integer); } return numericSequence; } function cpfGen(options) { const userOptions = mergeOptions(options); const baseSequence = numOnly(userOptions.prefix); const prefixLength = baseSequence.length; if (prefixLength < 0 || prefixLength > 9) { throw new Error('Option "prefix" must be a string containing between 1 and 9 digits.'); } const cpfSequence = baseSequence.split("").map(Number).concat(numberGenerator(9 - prefixLength)); [9, 10].forEach((nextNumIndex) => { let factor = nextNumIndex + 1; let sum = 0; for (let n = 0; n < nextNumIndex; n++, factor--) { sum += cpfSequence[n] * factor; } const remainder = 11 - sum % 11; cpfSequence.push(remainder > 9 ? 0 : remainder); }); return userOptions.format ? cpfFmt(cpfSequence.join("")) : cpfSequence.join(""); } function cpfVal(cpfString) { const CPF_LENGTH = 11; const cpfDigits = numOnly(cpfString); if (cpfDigits.length !== CPF_LENGTH) { return false; } return cpfDigits === cpfGen({ prefix: cpfDigits.substring(0, 9) }); } var format = cpfFmt; var generate = cpfGen; var isValid = cpfVal; var module = { format: format, generate: generate, isValid: isValid }; return module; })); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BmLXV0aWxzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaHRtbC1lc2NhcGVyL2VzbS9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9udW0tb25seS9idWlsZC9pbmRleC5janMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGVlcG1lcmdlL2Rpc3QvY2pzLmpzIiwiLi4vLi4vY3BmLWZtdC9idWlsZC9pbmRleC5tanMiLCIuLi8uLi9jcGYtZ2VuL2J1aWxkL2luZGV4Lm1qcyIsIi4uLy4uL2NwZi12YWwvYnVpbGQvaW5kZXgubWpzIiwiLi4vc3JjL21vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoQykgMjAxNy1wcmVzZW50IGJ5IEFuZHJlYSBHaWFtbWFyY2hpIC0gQFdlYlJlZmxlY3Rpb25cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5cbmNvbnN0IHtyZXBsYWNlfSA9ICcnO1xuXG4vLyBlc2NhcGVcbmNvbnN0IGVzID0gLyYoPzphbXB8IzM4fGx0fCM2MHxndHwjNjJ8YXBvc3wjMzl8cXVvdHwjMzQpOy9nO1xuY29uc3QgY2EgPSAvWyY8PidcIl0vZztcblxuY29uc3QgZXNjYSA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxuICAnXCInOiAnJnF1b3Q7J1xufTtcbmNvbnN0IHBlID0gbSA9PiBlc2NhW21dO1xuXG4vKipcbiAqIFNhZmVseSBlc2NhcGUgSFRNTCBlbnRpdGllcyBzdWNoIGFzIGAmYCwgYDxgLCBgPmAsIGBcImAsIGFuZCBgJ2AuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXMgdGhlIGlucHV0IHRvIHNhZmVseSBlc2NhcGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGlucHV0LCBhbmQgaXQgKip0aHJvd3MqKiBhbiBlcnJvciBpZlxuICogIHRoZSBpbnB1dCB0eXBlIGlzIHVuZXhwZWN0ZWQsIGV4Y2VwdCBmb3IgYm9vbGVhbiBhbmQgbnVtYmVycyxcbiAqICBjb252ZXJ0ZWQgYXMgc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgZXNjYXBlID0gZXMgPT4gcmVwbGFjZS5jYWxsKGVzLCBjYSwgcGUpO1xuXG5cbi8vIHVuZXNjYXBlXG5jb25zdCB1bmVzID0ge1xuICAnJmFtcDsnOiAnJicsXG4gICcmIzM4Oyc6ICcmJyxcbiAgJyZsdDsnOiAnPCcsXG4gICcmIzYwOyc6ICc8JyxcbiAgJyZndDsnOiAnPicsXG4gICcmIzYyOyc6ICc+JyxcbiAgJyZhcG9zOyc6IFwiJ1wiLFxuICAnJiMzOTsnOiBcIidcIixcbiAgJyZxdW90Oyc6ICdcIicsXG4gICcmIzM0Oyc6ICdcIidcbn07XG5jb25zdCBjYXBlID0gbSA9PiB1bmVzW21dO1xuXG4vKipcbiAqIFNhZmVseSB1bmVzY2FwZSBwcmV2aW91c2x5IGVzY2FwZWQgZW50aXRpZXMgc3VjaCBhcyBgJmAsIGA8YCwgYD5gLCBgXCJgLFxuICogYW5kIGAnYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1biBhIHByZXZpb3VzbHkgZXNjYXBlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSB1bmVzY2FwZWQgaW5wdXQsIGFuZCBpdCAqKnRocm93cyoqIGFuIGVycm9yIGlmXG4gKiAgdGhlIGlucHV0IHR5cGUgaXMgdW5leHBlY3RlZCwgZXhjZXB0IGZvciBib29sZWFuIGFuZCBudW1iZXJzLFxuICogIGNvbnZlcnRlZCBhcyBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCB1bmVzY2FwZSA9IHVuID0+IHJlcGxhY2UuY2FsbCh1biwgZXMsIGNhcGUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBudW1Pbmx5KHRhcmdldCkge1xuICByZXR1cm4gU3RyaW5nKHRhcmdldCkucmVwbGFjZSgvXFxEL2csIFwiXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG51bU9ubHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWFXNWtaWGd1WTJweklpd2ljMjkxY21ObGN5STZXeUl1TGk5emNtTXZiblZ0TFc5dWJIa3VkSE1pWFN3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpuVnVZM1JwYjI0Z2JuVnRUMjVzZVNoMFlYSm5aWFE2SUhWdWEyNXZkMjRwT2lCemRISnBibWNnZTF4dUlDQnlaWFIxY200Z1UzUnlhVzVuS0hSaGNtZGxkQ2t1Y21Wd2JHRmpaU2d2WEZ4RUwyY3NJQ2NuS1R0Y2JuMWNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdiblZ0VDI1c2VUdGNiaUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPenRCUVVGQkxGTkJRVk1zVVVGQlVTeE5RVUY1UWl4RlFVRkJPMEZCUTNoRExFVkJRVUVzVDBGQlR5eE5RVUZQTEVOQlFVRXNUVUZCVFN4RFFVRkZMRU5CUVVFc1QwRkJRU3hEUVVGUkxFOUJRVThzUlVGQlJTeERRVUZCTzBGQlEzcERPenM3T3lKOVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNNZXJnZWFibGVPYmplY3QgPSBmdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkge1xuXHRyZXR1cm4gaXNOb25OdWxsT2JqZWN0KHZhbHVlKVxuXHRcdCYmICFpc1NwZWNpYWwodmFsdWUpXG59O1xuXG5mdW5jdGlvbiBpc05vbk51bGxPYmplY3QodmFsdWUpIHtcblx0cmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xufVxuXG5mdW5jdGlvbiBpc1NwZWNpYWwodmFsdWUpIHtcblx0dmFyIHN0cmluZ1ZhbHVlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuXHRyZXR1cm4gc3RyaW5nVmFsdWUgPT09ICdbb2JqZWN0IFJlZ0V4cF0nXG5cdFx0fHwgc3RyaW5nVmFsdWUgPT09ICdbb2JqZWN0IERhdGVdJ1xuXHRcdHx8IGlzUmVhY3RFbGVtZW50KHZhbHVlKVxufVxuXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvYjVhYzk2M2ZiNzkxZDEyOThlN2YzOTYyMzYzODNiYzk1NWY5MTZjMS9zcmMvaXNvbW9ycGhpYy9jbGFzc2ljL2VsZW1lbnQvUmVhY3RFbGVtZW50LmpzI0wyMS1MMjVcbnZhciBjYW5Vc2VTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gY2FuVXNlU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xuXG5mdW5jdGlvbiBpc1JlYWN0RWxlbWVudCh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxufVxuXG5mdW5jdGlvbiBlbXB0eVRhcmdldCh2YWwpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IFtdIDoge31cbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIHtcblx0cmV0dXJuIChvcHRpb25zLmNsb25lICE9PSBmYWxzZSAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKSlcblx0XHQ/IGRlZXBtZXJnZShlbXB0eVRhcmdldCh2YWx1ZSksIHZhbHVlLCBvcHRpb25zKVxuXHRcdDogdmFsdWVcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0cmV0dXJuIHRhcmdldC5jb25jYXQoc291cmNlKS5tYXAoZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdHJldHVybiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChlbGVtZW50LCBvcHRpb25zKVxuXHR9KVxufVxuXG5mdW5jdGlvbiBnZXRNZXJnZUZ1bmN0aW9uKGtleSwgb3B0aW9ucykge1xuXHRpZiAoIW9wdGlvbnMuY3VzdG9tTWVyZ2UpIHtcblx0XHRyZXR1cm4gZGVlcG1lcmdlXG5cdH1cblx0dmFyIGN1c3RvbU1lcmdlID0gb3B0aW9ucy5jdXN0b21NZXJnZShrZXkpO1xuXHRyZXR1cm4gdHlwZW9mIGN1c3RvbU1lcmdlID09PSAnZnVuY3Rpb24nID8gY3VzdG9tTWVyZ2UgOiBkZWVwbWVyZ2Vcbn1cblxuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZU93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpIHtcblx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHNcblx0XHQ/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KS5maWx0ZXIoZnVuY3Rpb24oc3ltYm9sKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGFyZ2V0LCBzeW1ib2wpXG5cdFx0fSlcblx0XHQ6IFtdXG59XG5cbmZ1bmN0aW9uIGdldEtleXModGFyZ2V0KSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyh0YXJnZXQpLmNvbmNhdChnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpXG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5SXNPbk9iamVjdChvYmplY3QsIHByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5IGluIG9iamVjdFxuXHR9IGNhdGNoKF8pIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG4vLyBQcm90ZWN0cyBmcm9tIHByb3RvdHlwZSBwb2lzb25pbmcgYW5kIHVuZXhwZWN0ZWQgbWVyZ2luZyB1cCB0aGUgcHJvdG90eXBlIGNoYWluLlxuZnVuY3Rpb24gcHJvcGVydHlJc1Vuc2FmZSh0YXJnZXQsIGtleSkge1xuXHRyZXR1cm4gcHJvcGVydHlJc09uT2JqZWN0KHRhcmdldCwga2V5KSAvLyBQcm9wZXJ0aWVzIGFyZSBzYWZlIHRvIG1lcmdlIGlmIHRoZXkgZG9uJ3QgZXhpc3QgaW4gdGhlIHRhcmdldCB5ZXQsXG5cdFx0JiYgIShPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkgLy8gdW5zYWZlIGlmIHRoZXkgZXhpc3QgdXAgdGhlIHByb3RvdHlwZSBjaGFpbixcblx0XHRcdCYmIE9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRhcmdldCwga2V5KSkgLy8gYW5kIGFsc28gdW5zYWZlIGlmIHRoZXkncmUgbm9uZW51bWVyYWJsZS5cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0dmFyIGRlc3RpbmF0aW9uID0ge307XG5cdGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcblx0XHRnZXRLZXlzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh0YXJnZXRba2V5XSwgb3B0aW9ucyk7XG5cdFx0fSk7XG5cdH1cblx0Z2V0S2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0aWYgKHByb3BlcnR5SXNVbnNhZmUodGFyZ2V0LCBrZXkpKSB7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRpZiAocHJvcGVydHlJc09uT2JqZWN0KHRhcmdldCwga2V5KSAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoc291cmNlW2tleV0sIG9wdGlvbnMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdG9wdGlvbnMuYXJyYXlNZXJnZSA9IG9wdGlvbnMuYXJyYXlNZXJnZSB8fCBkZWZhdWx0QXJyYXlNZXJnZTtcblx0b3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCA9IG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QgfHwgaXNNZXJnZWFibGVPYmplY3Q7XG5cdC8vIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIGlzIGFkZGVkIHRvIGBvcHRpb25zYCBzbyB0aGF0IGN1c3RvbSBhcnJheU1lcmdlKClcblx0Ly8gaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgaXQuIFRoZSBjYWxsZXIgbWF5IG5vdCByZXBsYWNlIGl0LlxuXHRvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQ7XG5cblx0dmFyIHNvdXJjZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHNvdXJjZSk7XG5cdHZhciB0YXJnZXRJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpO1xuXHR2YXIgc291cmNlQW5kVGFyZ2V0VHlwZXNNYXRjaCA9IHNvdXJjZUlzQXJyYXkgPT09IHRhcmdldElzQXJyYXk7XG5cblx0aWYgKCFzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoKSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNvdXJjZSwgb3B0aW9ucylcblx0fSBlbHNlIGlmIChzb3VyY2VJc0FycmF5KSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuYXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdH1cbn1cblxuZGVlcG1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9ucykge1xuXHRpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXknKVxuXHR9XG5cblx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KSB7XG5cdFx0cmV0dXJuIGRlZXBtZXJnZShwcmV2LCBuZXh0LCBvcHRpb25zKVxuXHR9LCB7fSlcbn07XG5cbnZhciBkZWVwbWVyZ2VfMSA9IGRlZXBtZXJnZTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWVwbWVyZ2VfMTtcbiIsImltcG9ydCB7IGVzY2FwZSB9IGZyb20gJ2h0bWwtZXNjYXBlcic7XG5pbXBvcnQgbnVtT25seSBmcm9tICdudW0tb25seSc7XG5pbXBvcnQgbWVyZ2VEZWVwIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBkZWxpbWl0ZXJzOiB7XG4gICAgZG90OiBcIi5cIixcbiAgICBkYXNoOiBcIi1cIlxuICB9LFxuICBoaWRkZW5SYW5nZToge1xuICAgIHN0YXJ0OiAzLFxuICAgIGVuZDogMTBcbiAgfSxcbiAgb25GYWlsOiAodmFsdWUpID0+IHZhbHVlLFxuICBoaWRkZW5LZXk6IFwiKlwiLFxuICBoaWRkZW46IGZhbHNlLFxuICBlc2NhcGU6IGZhbHNlXG59O1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGN1c3RvbU9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBvcHRpb25zID0gbWVyZ2VEZWVwKFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIGN1c3RvbU9wdGlvbnNcbiAgKTtcbiAgaWYgKG9wdGlvbnMuaGlkZGVuKSB7XG4gICAgaWYgKGlzTmFOKG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQpIHx8IG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPCAwIHx8IG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPiAxMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT3B0aW9uIFwiaGlkZGVuUmFuZ2Uuc3RhcnRcIiBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAuJyk7XG4gICAgfVxuICAgIGlmIChpc05hTihvcHRpb25zLmhpZGRlblJhbmdlLmVuZCkgfHwgb3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQgPCAwIHx8IG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kID4gMTApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09wdGlvbiBcImhpZGRlblJhbmdlLmVuZFwiIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMC4nKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPiBvcHRpb25zLmhpZGRlblJhbmdlLmVuZCkge1xuICAgICAgY29uc3QgYXV4ID0gb3B0aW9ucy5oaWRkZW5SYW5nZS5zdGFydDtcbiAgICAgIG9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQgPSBvcHRpb25zLmhpZGRlblJhbmdlLmVuZDtcbiAgICAgIG9wdGlvbnMuaGlkZGVuUmFuZ2UuZW5kID0gYXV4O1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25GYWlsICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgb3B0aW9uIFwib25GYWlsXCIgbXVzdCBiZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLicpO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5mdW5jdGlvbiBjcGZGbXQoY3BmU3RyaW5nLCBvcHRpb25zKSB7XG4gIGNvbnN0IENQRl9MRU5HVEggPSAxMTtcbiAgY29uc3QgY3BmQXJyYXkgPSBudW1Pbmx5KGNwZlN0cmluZykuc3BsaXQoXCJcIik7XG4gIGNvbnN0IGN1c3RvbU9wdGlvbnMgPSBtZXJnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGlmIChjcGZBcnJheS5sZW5ndGggIT09IENQRl9MRU5HVEgpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwiJHtjcGZTdHJpbmd9XCIgZG9lcyBub3QgY29udGFpbiAke0NQRl9MRU5HVEh9IGRpZ2l0cy5gKTtcbiAgICByZXR1cm4gY3VzdG9tT3B0aW9ucy5vbkZhaWwoY3BmU3RyaW5nLCBlcnJvcik7XG4gIH1cbiAgaWYgKGN1c3RvbU9wdGlvbnMuaGlkZGVuKSB7XG4gICAgZm9yIChsZXQgaSA9IGN1c3RvbU9wdGlvbnMuaGlkZGVuUmFuZ2Uuc3RhcnQ7IGkgPD0gY3VzdG9tT3B0aW9ucy5oaWRkZW5SYW5nZS5lbmQ7IGkrKykge1xuICAgICAgY3BmQXJyYXlbaV0gPSBjdXN0b21PcHRpb25zLmhpZGRlbktleTtcbiAgICB9XG4gIH1cbiAgY3BmQXJyYXkuc3BsaWNlKDksIDAsIGN1c3RvbU9wdGlvbnMuZGVsaW1pdGVycy5kYXNoKTtcbiAgY3BmQXJyYXkuc3BsaWNlKDYsIDAsIGN1c3RvbU9wdGlvbnMuZGVsaW1pdGVycy5kb3QpO1xuICBjcGZBcnJheS5zcGxpY2UoMywgMCwgY3VzdG9tT3B0aW9ucy5kZWxpbWl0ZXJzLmRvdCk7XG4gIGNvbnN0IGNwZlByZXR0eSA9IGNwZkFycmF5LmpvaW4oXCJcIik7XG4gIGlmIChjdXN0b21PcHRpb25zLmVzY2FwZSkge1xuICAgIHJldHVybiBlc2NhcGUoY3BmUHJldHR5KTtcbiAgfVxuICByZXR1cm4gY3BmUHJldHR5O1xufVxuXG5leHBvcnQgeyBjcGZGbXQgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndWJXcHpJaXdpYzI5MWNtTmxjeUk2V3lJdUxpOXpjbU12YldWeVoyVXRiM0IwYVc5dWN5NTBjeUlzSWk0dUwzTnlZeTlqY0dZdFptMTBMblJ6SWwwc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCdFpYSm5aVVJsWlhBZ1puSnZiU0FuWkdWbGNHMWxjbWRsSnp0Y2JseHVkSGx3WlNCRVpXVndVR0Z5ZEdsaGJEeFVQaUE5SUh0Y2JpQWdXMUFnYVc0Z2EyVjViMllnVkYwL09pQkVaV1Z3VUdGeWRHbGhiRHhVVzFCZFBqdGNibjA3WEc1Y2JtVjRjRzl5ZENCcGJuUmxjbVpoWTJVZ1FXTjBkV0ZzUTNCbVJtOXliV0YwZEdsdVowOXdkR2x2Ym5NOFQyNUZjbkpHWVd4c1ltRmphejRnZTF4dUlDQmtaV3hwYldsMFpYSnpPaUI3WEc0Z0lDQWdaR0Z6YURvZ2MzUnlhVzVuTzF4dUlDQWdJR1J2ZERvZ2MzUnlhVzVuTzF4dUlDQjlPMXh1SUNCbGMyTmhjR1U2SUdKdmIyeGxZVzQ3WEc0Z0lHaHBaR1JsYmpvZ1ltOXZiR1ZoYmp0Y2JpQWdhR2xrWkdWdVMyVjVPaUJ6ZEhKcGJtYzdYRzRnSUdocFpHUmxibEpoYm1kbE9pQjdYRzRnSUNBZ1pXNWtPaUJ1ZFcxaVpYSTdYRzRnSUNBZ2MzUmhjblE2SUc1MWJXSmxjanRjYmlBZ2ZUdGNiaUFnYjI1R1lXbHNPaUFvZG1Gc2RXVTZJSE4wY21sdVp5d2daWEp5YjNJNklFVnljbTl5S1NBOVBpQlBia1Z5Y2taaGJHeGlZV05yTzF4dWZWeHVYRzVsZUhCdmNuUWdkSGx3WlNCRGNHWkdiM0p0WVhSMGFXNW5UM0IwYVc5dWN6eFBia1Z5Y2taaGJHeGlZV05yUGlBOUlFUmxaWEJRWVhKMGFXRnNQRnh1SUNCQlkzUjFZV3hEY0daR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3p4UGJrVnlja1poYkd4aVlXTnJQbHh1UGp0Y2JseHVZMjl1YzNRZ1pHVm1ZWFZzZEU5d2RHbHZibk02SUVGamRIVmhiRU53WmtadmNtMWhkSFJwYm1kUGNIUnBiMjV6UEhOMGNtbHVaejRnUFNCN1hHNGdJR1JsYkdsdGFYUmxjbk02SUh0Y2JpQWdJQ0JrYjNRNklDY3VKeXhjYmlBZ0lDQmtZWE5vT2lBbkxTY3NYRzRnSUgwc1hHNGdJR2hwWkdSbGJsSmhibWRsT2lCN1hHNGdJQ0FnYzNSaGNuUTZJRE1zWEc0Z0lDQWdaVzVrT2lBeE1DeGNiaUFnZlN4Y2JpQWdiMjVHWVdsc09pQW9kbUZzZFdVcElEMCtJSFpoYkhWbExGeHVJQ0JvYVdSa1pXNUxaWGs2SUNjcUp5eGNiaUFnYUdsa1pHVnVPaUJtWVd4elpTeGNiaUFnWlhOallYQmxPaUJtWVd4elpTeGNibjA3WEc1Y2JpOHFLbHh1SUNvZ1RXVnlaMlVnWTNWemRHOXRJRzl3ZEdsdmJuTWdkRzhnZEdobElHUmxabUYxYkhRZ2IyNWxjeTVjYmlBcUwxeHVablZ1WTNScGIyNGdiV1Z5WjJWUGNIUnBiMjV6UEU5dVJYSnlSbUZzYkdKaFkycytLRnh1SUNCamRYTjBiMjFQY0hScGIyNXpPaUJEY0daR2IzSnRZWFIwYVc1blQzQjBhVzl1Y3p4UGJrVnlja1poYkd4aVlXTnJQaUE5SUh0OUxGeHVLVG9nUVdOMGRXRnNRM0JtUm05eWJXRjBkR2x1WjA5d2RHbHZibk04VDI1RmNuSkdZV3hzWW1GamF6NGdlMXh1SUNCamIyNXpkQ0J2Y0hScGIyNXpJRDBnYldWeVoyVkVaV1Z3S0Z4dUlDQWdJR1JsWm1GMWJIUlBjSFJwYjI1ekxGeHVJQ0FnSUdOMWMzUnZiVTl3ZEdsdmJuTXNYRzRnSUNrZ1lYTWdRV04wZFdGc1EzQm1SbTl5YldGMGRHbHVaMDl3ZEdsdmJuTThUMjVGY25KR1lXeHNZbUZqYXo0N1hHNWNiaUFnYVdZZ0tHOXdkR2x2Ym5NdWFHbGtaR1Z1S1NCN1hHNGdJQ0FnYVdZZ0tGeHVJQ0FnSUNBZ2FYTk9ZVTRvYjNCMGFXOXVjeTVvYVdSa1pXNVNZVzVuWlM1emRHRnlkQ2tnZkh4Y2JpQWdJQ0FnSUc5d2RHbHZibk11YUdsa1pHVnVVbUZ1WjJVdWMzUmhjblFnUENBd0lIeDhYRzRnSUNBZ0lDQnZjSFJwYjI1ekxtaHBaR1JsYmxKaGJtZGxMbk4wWVhKMElENGdNVEJjYmlBZ0lDQXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJVZVhCbFJYSnliM0lvSjA5d2RHbHZiaUJjSW1ocFpHUmxibEpoYm1kbExuTjBZWEowWENJZ2JYVnpkQ0JpWlNCaElHNTFiV0psY2lCaVpYUjNaV1Z1SURBZ1lXNWtJREV3TGljcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaGNiaUFnSUNBZ0lHbHpUbUZPS0c5d2RHbHZibk11YUdsa1pHVnVVbUZ1WjJVdVpXNWtLU0I4ZkZ4dUlDQWdJQ0FnYjNCMGFXOXVjeTVvYVdSa1pXNVNZVzVuWlM1bGJtUWdQQ0F3SUh4OFhHNGdJQ0FnSUNCdmNIUnBiMjV6TG1ocFpHUmxibEpoYm1kbExtVnVaQ0ErSURFd1hHNGdJQ0FnS1NCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtDZFBjSFJwYjI0Z1hDSm9hV1JrWlc1U1lXNW5aUzVsYm1SY0lpQnRkWE4wSUdKbElHRWdiblZ0WW1WeUlHSmxkSGRsWlc0Z01DQmhibVFnTVRBdUp5azdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVhR2xrWkdWdVVtRnVaMlV1YzNSaGNuUWdQaUJ2Y0hScGIyNXpMbWhwWkdSbGJsSmhibWRsTG1WdVpDa2dlMXh1SUNBZ0lDQWdZMjl1YzNRZ1lYVjRJRDBnYjNCMGFXOXVjeTVvYVdSa1pXNVNZVzVuWlM1emRHRnlkRHRjYmlBZ0lDQWdJRzl3ZEdsdmJuTXVhR2xrWkdWdVVtRnVaMlV1YzNSaGNuUWdQU0J2Y0hScGIyNXpMbWhwWkdSbGJsSmhibWRsTG1WdVpEdGNiaUFnSUNBZ0lHOXdkR2x2Ym5NdWFHbGtaR1Z1VW1GdVoyVXVaVzVrSUQwZ1lYVjRPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR2xtSUNoMGVYQmxiMllnYjNCMGFXOXVjeTV2YmtaaGFXd2dJVDA5SUNkbWRXNWpkR2x2YmljcElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1ZIbHdaVVZ5Y205eUtDZFVhR1VnYjNCMGFXOXVJRndpYjI1R1lXbHNYQ0lnYlhWemRDQmlaU0JoSUdOaGJHeGlZV05ySUdaMWJtTjBhVzl1TGljcE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHOXdkR2x2Ym5NN1hHNTlYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRzFsY21kbFQzQjBhVzl1Y3p0Y2JpSXNJbWx0Y0c5eWRDQjdJR1Z6WTJGd1pTQmhjeUJsYzJOaGNHVklWRTFNSUgwZ1puSnZiU0FuYUhSdGJDMWxjMk5oY0dWeUp6dGNibWx0Y0c5eWRDQnVkVzFQYm14NUlHWnliMjBnSjI1MWJTMXZibXg1Snp0Y2JseHVhVzF3YjNKMElHMWxjbWRsVDNCMGFXOXVjeUJtY205dElDY3VMMjFsY21kbExXOXdkR2x2Ym5Nbk8xeHVhVzF3YjNKMElIUjVjR1VnZXlCRGNHWkdiM0p0WVhSMGFXNW5UM0IwYVc5dWN5QjlJR1p5YjIwZ0p5NHZiV1Z5WjJVdGIzQjBhVzl1Y3ljN1hHNWNiaThxS2x4dUlDb2dSbTl5YldGMElHRWdaMmwyWlc0Z1ExQkdJR05vWVhJZ2MyVnhkV1Z1WTJVdVhHNGdLaTljYm1aMWJtTjBhVzl1SUdOd1prWnRkRHhQYmtWeWNrWmhiR3hpWVdOcklEMGdjM1J5YVc1blBpaGNiaUFnWTNCbVUzUnlhVzVuT2lCemRISnBibWNzWEc0Z0lHOXdkR2x2Ym5NL09pQkRjR1pHYjNKdFlYUjBhVzVuVDNCMGFXOXVjenhQYmtWeWNrWmhiR3hpWVdOclBpeGNiaWs2SUhOMGNtbHVaeUI3WEc0Z0lHTnZibk4wSUVOUVJsOU1SVTVIVkVnZ1BTQXhNVHRjYmlBZ1kyOXVjM1FnWTNCbVFYSnlZWGtnUFNCdWRXMVBibXg1S0dOd1psTjBjbWx1WnlrdWMzQnNhWFFvSnljcE8xeHVJQ0JqYjI1emRDQmpkWE4wYjIxUGNIUnBiMjV6SUQwZ2JXVnlaMlZQY0hScGIyNXpLRzl3ZEdsdmJuTXBPMXh1WEc0Z0lHbG1JQ2hqY0daQmNuSmhlUzVzWlc1bmRHZ2dJVDA5SUVOUVJsOU1SVTVIVkVncElIdGNiaUFnSUNCamIyNXpkQ0JsY25KdmNpQTlJRzVsZHlCRmNuSnZjaWhnVUdGeVlXMWxkR1Z5SUZ3aUpIdGpjR1pUZEhKcGJtZDlYQ0lnWkc5bGN5QnViM1FnWTI5dWRHRnBiaUFrZTBOUVJsOU1SVTVIVkVoOUlHUnBaMmwwY3k1Z0tUdGNibHh1SUNBZ0lISmxkSFZ5YmlCamRYTjBiMjFQY0hScGIyNXpMbTl1Um1GcGJDaGpjR1pUZEhKcGJtY3NJR1Z5Y205eUtTQmhjeUJ6ZEhKcGJtYzdYRzRnSUgxY2JseHVJQ0JwWmlBb1kzVnpkRzl0VDNCMGFXOXVjeTVvYVdSa1pXNHBJSHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnWTNWemRHOXRUM0IwYVc5dWN5NW9hV1JrWlc1U1lXNW5aUzV6ZEdGeWREc2dhU0E4UFNCamRYTjBiMjFQY0hScGIyNXpMbWhwWkdSbGJsSmhibWRsTG1WdVpEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCamNHWkJjbkpoZVZ0cFhTQTlJR04xYzNSdmJVOXdkR2x2Ym5NdWFHbGtaR1Z1UzJWNU8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lHTndaa0Z5Y21GNUxuTndiR2xqWlNnNUxDQXdMQ0JqZFhOMGIyMVBjSFJwYjI1ekxtUmxiR2x0YVhSbGNuTXVaR0Z6YUNrN1hHNGdJR053WmtGeWNtRjVMbk53YkdsalpTZzJMQ0F3TENCamRYTjBiMjFQY0hScGIyNXpMbVJsYkdsdGFYUmxjbk11Wkc5MEtUdGNiaUFnWTNCbVFYSnlZWGt1YzNCc2FXTmxLRE1zSURBc0lHTjFjM1J2YlU5d2RHbHZibk11WkdWc2FXMXBkR1Z5Y3k1a2IzUXBPMXh1SUNCamIyNXpkQ0JqY0daUWNtVjBkSGtnUFNCamNHWkJjbkpoZVM1cWIybHVLQ2NuS1R0Y2JseHVJQ0JwWmlBb1kzVnpkRzl0VDNCMGFXOXVjeTVsYzJOaGNHVXBJSHRjYmlBZ0lDQnlaWFIxY200Z1pYTmpZWEJsU0ZSTlRDaGpjR1pRY21WMGRIa3BPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJR053WmxCeVpYUjBlVHRjYm4xY2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kzQm1SbTEwTzF4dUlsMHNJbTVoYldWeklqcGJJbVZ6WTJGd1pVaFVUVXdpWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3UVVGNVFrRXNUVUZCVFN4alFVRnhSQ3hIUVVGQk8wRkJRVUVzUlVGRGVrUXNWVUZCV1N4RlFVRkJPMEZCUVVFc1NVRkRWaXhIUVVGTExFVkJRVUVzUjBGQlFUdEJRVUZCTEVsQlEwd3NTVUZCVFN4RlFVRkJPMEZCUVVFc1IwRkRVanRCUVVGQkxFVkJRMEVzVjBGQllTeEZRVUZCTzBGQlFVRXNTVUZEV0N4TFFVRlBMRVZCUVVFc1EwRkJRVHRCUVVGQkxFbEJRMUFzUjBGQlN5eEZRVUZCTzBGQlFVRXNSMEZEVUR0QlFVRkJMRVZCUTBFc1RVRkJRU3hGUVVGUkxFTkJRVU1zUzBGQlZTeExRVUZCTEV0QlFVRTdRVUZCUVN4RlFVTnVRaXhUUVVGWExFVkJRVUVzUjBGQlFUdEJRVUZCTEVWQlExZ3NUVUZCVVN4RlFVRkJMRXRCUVVFN1FVRkJRU3hGUVVOU0xFMUJRVkVzUlVGQlFUdEJRVU5XTEVOQlFVRTdRVUZMUVN4VFFVRlRMRmxCUVVFc1EwRkRVQ3hoUVVGeFJDeEhRVUZCTEVWQlExWXNSVUZCUVR0QlFVTXpReXhGUVVGQkxFMUJRVTBzVDBGQlZTeEhRVUZCTEZOQlFVRTdRVUZCUVN4SlFVTmtMR05CUVVFN1FVRkJRU3hKUVVOQk8wRkJRVUVzUjBGRFJqdEJRVVZCTEVWQlFVRXNTVUZCU1N4UlFVRlJMRTFCUVZFc1JVRkJRVHRCUVVOc1FpeEpRVUZCTEVsQlEwVXNTMEZCVFN4RFFVRkJMRTlCUVVFc1EwRkJVU3hYUVVGWkxFTkJRVUVzUzBGQlN5eERRVU12UWl4SlFVRkJMRTlCUVVFc1EwRkJVU3hYUVVGWkxFTkJRVUVzUzBGQlFTeEhRVUZSTEVOQlF6VkNMRWxCUVVFc1QwRkJRU3hEUVVGUkxGZEJRVmtzUTBGQlFTeExRVUZCTEVkQlFWRXNSVUZETlVJc1JVRkJRVHRCUVVOQkxFMUJRVTBzVFVGQlFTeEpRVUZKTEZWQlFWVXNLMFJCUVN0RUxFTkJRVUU3UVVGQlFUdEJRVWR5Uml4SlFVRkJMRWxCUTBVc1MwRkJUU3hEUVVGQkxFOUJRVUVzUTBGQlVTeFhRVUZaTEVOQlFVRXNSMEZCUnl4RFFVTTNRaXhKUVVGQkxFOUJRVUVzUTBGQlVTeFhRVUZaTEVOQlFVRXNSMEZCUVN4SFFVRk5MRU5CUXpGQ0xFbEJRVUVzVDBGQlFTeERRVUZSTEZkQlFWa3NRMEZCUVN4SFFVRkJMRWRCUVUwc1JVRkRNVUlzUlVGQlFUdEJRVU5CTEUxQlFVMHNUVUZCUVN4SlFVRkpMRlZCUVZVc05rUkJRVFpFTEVOQlFVRTdRVUZCUVR0QlFVZHVSaXhKUVVGQkxFbEJRVWtzVDBGQlVTeERRVUZCTEZkQlFVRXNRMEZCV1N4TFFVRlJMRWRCUVVFc1QwRkJRU3hEUVVGUkxGbEJRVmtzUjBGQlN5eEZRVUZCTzBGQlEzWkVMRTFCUVUwc1RVRkJRU3hIUVVGQkxFZEJRVTBzVVVGQlVTeFhRVUZaTEVOQlFVRXNTMEZCUVR0QlFVTm9ReXhOUVVGUkxFOUJRVUVzUTBGQlFTeFhRVUZCTEVOQlFWa3NTMEZCVVN4SFFVRkJMRTlCUVVFc1EwRkJVU3hYUVVGWkxFTkJRVUVzUjBGQlFUdEJRVU5vUkN4TlFVRkJMRTlCUVVFc1EwRkJVU3haUVVGWkxFZEJRVTBzUjBGQlFTeEhRVUZCTzBGQlFVRTdRVUZETlVJN1FVRkhSaXhGUVVGSkxFbEJRVUVzVDBGQlR5eFBRVUZSTEVOQlFVRXNUVUZCUVN4TFFVRlhMRlZCUVZrc1JVRkJRVHRCUVVONFF5eEpRVUZOTEUxQlFVRXNTVUZCU1N4VlFVRlZMR3RFUVVGclJDeERRVUZCTzBGQlFVRTdRVUZIZUVVc1JVRkJUeXhQUVVGQkxFOUJRVUU3UVVGRFZEczdRVU4yUlVFc1UwRkJVeXhOUVVGQkxFTkJRMUFzVjBGRFFTeFBRVU5STEVWQlFVRTdRVUZEVWl4RlFVRkJMRTFCUVUwc1ZVRkJZU3hIUVVGQkxFVkJRVUU3UVVGRGJrSXNSVUZCUVN4TlFVRk5MRkZCUVZjc1IwRkJRU3hQUVVGQkxFTkJRVkVzVTBGQlV5eERRVUZCTEVOQlFVVXNUVUZCVFN4RlFVRkZMRU5CUVVFN1FVRkROVU1zUlVGQlRTeE5RVUZCTEdGQlFVRXNSMEZCWjBJc1lVRkJZU3hQUVVGUExFTkJRVUU3UVVGRk1VTXNSVUZCU1N4SlFVRkJMRkZCUVVFc1EwRkJVeXhYUVVGWExGVkJRVmtzUlVGQlFUdEJRVU5zUXl4SlFVRkJMRTFCUVUwc1VVRkJVU3hKUVVGSkxFdEJRVUVzUTBGQlRTeGpRVUZqTEZOQlFWTXNRMEZCUVN4dFFrRkJRU3hGUVVGelFpeFZRVUZWTEVOQlFWVXNVVUZCUVN4RFFVRkJMRU5CUVVFN1FVRkZla1lzU1VGQlR5eFBRVUZCTEdGQlFVRXNRMEZCWXl4TlFVRlBMRU5CUVVFc1UwRkJRU3hGUVVGWExFdEJRVXNzUTBGQlFUdEJRVUZCTzBGQlJ6bERMRVZCUVVFc1NVRkJTU3hqUVVGakxFMUJRVkVzUlVGQlFUdEJRVU40UWl4SlFVRlRMRXRCUVVFc1NVRkJRU3hEUVVGQkxFZEJRVWtzWTBGQll5eFhRVUZaTEVOQlFVRXNTMEZCUVN4RlFVRlBMRXRCUVVzc1lVRkJZeXhEUVVGQkxGZEJRVUVzUTBGQldTeExRVUZMTEVOQlFVc3NSVUZCUVN4RlFVRkJPMEZCUTNKR0xFMUJRVk1zVVVGQlFTeERRVUZCTEVOQlFVTXNTVUZCU1N4aFFVRmpMRU5CUVVFc1UwRkJRVHRCUVVGQk8wRkJRemxDTzBGQlIwWXNSVUZCUVN4UlFVRkJMRU5CUVZNc1RVRkJUeXhEUVVGQkxFTkJRVUVzUlVGQlJ5eERRVUZITEVWQlFVRXNZVUZCUVN4RFFVRmpMRmRCUVZjc1NVRkJTU3hEUVVGQk8wRkJRMjVFTEVWQlFVRXNVVUZCUVN4RFFVRlRMRTFCUVU4c1EwRkJRU3hEUVVGQkxFVkJRVWNzUTBGQlJ5eEZRVUZCTEdGQlFVRXNRMEZCWXl4WFFVRlhMRWRCUVVjc1EwRkJRVHRCUVVOc1JDeEZRVUZCTEZGQlFVRXNRMEZCVXl4TlFVRlBMRU5CUVVFc1EwRkJRU3hGUVVGSExFTkJRVWNzUlVGQlFTeGhRVUZCTEVOQlFXTXNWMEZCVnl4SFFVRkhMRU5CUVVFN1FVRkRiRVFzUlVGQlRTeE5RVUZCTEZOQlFVRXNSMEZCV1N4UlFVRlRMRU5CUVVFc1NVRkJRU3hEUVVGTExFVkJRVVVzUTBGQlFUdEJRVVZzUXl4RlFVRkJMRWxCUVVrc1kwRkJZeXhOUVVGUkxFVkJRVUU3UVVGRGVFSXNTVUZCUVN4UFFVRlBRU3hQUVVGWExGTkJRVk1zUTBGQlFUdEJRVUZCTzBGQlJ6ZENMRVZCUVU4c1QwRkJRU3hUUVVGQk8wRkJRMVE3T3pzN0luMD1cbiIsImltcG9ydCBjcGZGbXQgZnJvbSAnQGxhY3Vzc29mdC9jcGYtZm10JztcbmltcG9ydCBudW1Pbmx5IGZyb20gJ251bS1vbmx5JztcbmltcG9ydCBtZXJnZURlZXAgZnJvbSAnZGVlcG1lcmdlJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGZvcm1hdDogZmFsc2UsXG4gIHByZWZpeDogXCJcIlxufTtcbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhjdXN0b21PcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIG1lcmdlRGVlcChkZWZhdWx0T3B0aW9ucywgY3VzdG9tT3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIG51bWJlckdlbmVyYXRvcihsZW5ndGgpIHtcbiAgY29uc3QgbnVtZXJpY1NlcXVlbmNlID0gW107XG4gIHdoaWxlIChudW1lcmljU2VxdWVuY2UubGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKSAqIDEwO1xuICAgIGNvbnN0IGludGVnZXIgPSBNYXRoLmZsb29yKHJhbmRvbSk7XG4gICAgbnVtZXJpY1NlcXVlbmNlLnB1c2goaW50ZWdlcik7XG4gIH1cbiAgcmV0dXJuIG51bWVyaWNTZXF1ZW5jZTtcbn1cblxuZnVuY3Rpb24gY3BmR2VuKG9wdGlvbnMpIHtcbiAgY29uc3QgdXNlck9wdGlvbnMgPSBtZXJnZU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGJhc2VTZXF1ZW5jZSA9IG51bU9ubHkodXNlck9wdGlvbnMucHJlZml4KTtcbiAgY29uc3QgcHJlZml4TGVuZ3RoID0gYmFzZVNlcXVlbmNlLmxlbmd0aDtcbiAgaWYgKHByZWZpeExlbmd0aCA8IDAgfHwgcHJlZml4TGVuZ3RoID4gOSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9uIFwicHJlZml4XCIgbXVzdCBiZSBhIHN0cmluZyBjb250YWluaW5nIGJldHdlZW4gMSBhbmQgOSBkaWdpdHMuJyk7XG4gIH1cbiAgY29uc3QgY3BmU2VxdWVuY2UgPSBiYXNlU2VxdWVuY2Uuc3BsaXQoXCJcIikubWFwKE51bWJlcikuY29uY2F0KG51bWJlckdlbmVyYXRvcig5IC0gcHJlZml4TGVuZ3RoKSk7XG4gIFs5LCAxMF0uZm9yRWFjaCgobmV4dE51bUluZGV4KSA9PiB7XG4gICAgbGV0IGZhY3RvciA9IG5leHROdW1JbmRleCArIDE7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuZXh0TnVtSW5kZXg7IG4rKywgZmFjdG9yLS0pIHtcbiAgICAgIHN1bSArPSBjcGZTZXF1ZW5jZVtuXSAqIGZhY3RvcjtcbiAgICB9XG4gICAgY29uc3QgcmVtYWluZGVyID0gMTEgLSBzdW0gJSAxMTtcbiAgICBjcGZTZXF1ZW5jZS5wdXNoKHJlbWFpbmRlciA+IDkgPyAwIDogcmVtYWluZGVyKTtcbiAgfSk7XG4gIHJldHVybiB1c2VyT3B0aW9ucy5mb3JtYXQgPyBjcGZGbXQoY3BmU2VxdWVuY2Uuam9pbihcIlwiKSkgOiBjcGZTZXF1ZW5jZS5qb2luKFwiXCIpO1xufVxuXG5leHBvcnQgeyBjcGZHZW4gYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndWJXcHpJaXdpYzI5MWNtTmxjeUk2V3lJdUxpOXpjbU12YldWeVoyVXRiM0IwYVc5dWN5NTBjeUlzSWk0dUwzTnlZeTl1ZFcxaVpYSXRaMlZ1WlhKaGRHOXlMblJ6SWl3aUxpNHZjM0pqTDJOd1ppMW5aVzR1ZEhNaVhTd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElHMWxjbWRsUkdWbGNDQm1jbTl0SUNka1pXVndiV1Z5WjJVbk8xeHVYRzVsZUhCdmNuUWdhVzUwWlhKbVlXTmxJRUZqZEhWaGJFTndaa2RsYm1WeVlYUnZjazl3ZEdsdmJuTWdlMXh1SUNCbWIzSnRZWFE2SUdKdmIyeGxZVzQ3WEc0Z0lIQnlaV1pwZURvZ2MzUnlhVzVuTzF4dWZWeHVYRzVsZUhCdmNuUWdkSGx3WlNCRGNHWkhaVzVsY21GMGIzSlBjSFJwYjI1eklEMGdVR0Z5ZEdsaGJEeEJZM1IxWVd4RGNHWkhaVzVsY21GMGIzSlBjSFJwYjI1elBqdGNibHh1WTI5dWMzUWdaR1ZtWVhWc2RFOXdkR2x2Ym5NZ1BTQjdYRzRnSUdadmNtMWhkRG9nWm1Gc2MyVXNYRzRnSUhCeVpXWnBlRG9nSnljc1hHNTlPMXh1WEc0dktpcGNiaUFxSUUxbGNtZGxJR04xYzNSdmJTQnZjSFJwYjI1eklIUnZJSFJvWlNCa1pXWmhkV3gwSUc5dVpYTXVYRzRnS2k5Y2JtWjFibU4wYVc5dUlHMWxjbWRsVDNCMGFXOXVjeWhqZFhOMGIyMVBjSFJwYjI1ek9pQkRjR1pIWlc1bGNtRjBiM0pQY0hScGIyNXpJRDBnZTMwcE9pQkJZM1IxWVd4RGNHWkhaVzVsY21GMGIzSlBjSFJwYjI1eklIdGNiaUFnY21WMGRYSnVJRzFsY21kbFJHVmxjQ2hrWldaaGRXeDBUM0IwYVc5dWN5d2dZM1Z6ZEc5dFQzQjBhVzl1Y3lrN1hHNTlYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRzFsY21kbFQzQjBhVzl1Y3p0Y2JpSXNJaThxS2x4dUlDb2dSMlZ1WlhKaGRHVWdZVzRnWVhKeVlYa2diMllnY21GdVpHOXRJRzUxYldKbGNuTWdLR0Z6SUhOMGNtbHVaeWtnWW1WMGQyVmxiaUF3SUdGdVpDQWdPUzVjYmlBcUwxeHVablZ1WTNScGIyNGdiblZ0WW1WeVIyVnVaWEpoZEc5eUtHeGxibWQwYURvZ2JuVnRZbVZ5S1RvZ2JuVnRZbVZ5VzEwZ2UxeHVJQ0JqYjI1emRDQnVkVzFsY21salUyVnhkV1Z1WTJVNklHNTFiV0psY2x0ZElEMGdXMTA3WEc1Y2JpQWdkMmhwYkdVZ0tHNTFiV1Z5YVdOVFpYRjFaVzVqWlM1c1pXNW5kR2dnUENCc1pXNW5kR2dwSUh0Y2JpQWdJQ0JqYjI1emRDQnlZVzVrYjIwZ1BTQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ01UQTdYRzRnSUNBZ1kyOXVjM1FnYVc1MFpXZGxjaUE5SUUxaGRHZ3VabXh2YjNJb2NtRnVaRzl0S1R0Y2JseHVJQ0FnSUc1MWJXVnlhV05UWlhGMVpXNWpaUzV3ZFhOb0tHbHVkR1ZuWlhJcE8xeHVJQ0I5WEc1Y2JpQWdjbVYwZFhKdUlHNTFiV1Z5YVdOVFpYRjFaVzVqWlR0Y2JuMWNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdiblZ0WW1WeVIyVnVaWEpoZEc5eU8xeHVJaXdpYVcxd2IzSjBJR053WmtadGRDQm1jbTl0SUNkQWJHRmpkWE56YjJaMEwyTndaaTFtYlhRbk8xeHVhVzF3YjNKMElHNTFiVTl1YkhrZ1puSnZiU0FuYm5WdExXOXViSGtuTzF4dVhHNXBiWEJ2Y25RZ2JXVnlaMlZQY0hScGIyNXpJR1p5YjIwZ0p5NHZiV1Z5WjJVdGIzQjBhVzl1Y3ljN1hHNXBiWEJ2Y25RZ2RIbHdaU0I3SUVOd1prZGxibVZ5WVhSdmNrOXdkR2x2Ym5NZ2ZTQm1jbTl0SUNjdUwyMWxjbWRsTFc5d2RHbHZibk1uTzF4dWFXMXdiM0owSUc1MWJXSmxja2RsYm1WeVlYUnZjaUJtY205dElDY3VMMjUxYldKbGNpMW5aVzVsY21GMGIzSW5PMXh1WEc0dktpcGNiaUFxSUVkbGJtVnlZWFJsSUdFZ2RtRnNhV1FnUTFCR0lDaENjbUY2YVd4cFlXNGdTVVFnWkc5amRXMWxiblFwSUc1MWJXVnlhV01nYzJWeGRXVnVZMlV1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR053WmtkbGJpaHZjSFJwYjI1elB6b2dRM0JtUjJWdVpYSmhkRzl5VDNCMGFXOXVjeWs2SUhOMGNtbHVaeUI3WEc0Z0lHTnZibk4wSUhWelpYSlBjSFJwYjI1eklEMGdiV1Z5WjJWUGNIUnBiMjV6S0c5d2RHbHZibk1wTzF4dUlDQmpiMjV6ZENCaVlYTmxVMlZ4ZFdWdVkyVWdQU0J1ZFcxUGJteDVLSFZ6WlhKUGNIUnBiMjV6TG5CeVpXWnBlQ2s3WEc0Z0lHTnZibk4wSUhCeVpXWnBlRXhsYm1kMGFDQTlJR0poYzJWVFpYRjFaVzVqWlM1c1pXNW5kR2c3WEc1Y2JpQWdhV1lnS0hCeVpXWnBlRXhsYm1kMGFDQThJREFnZkh3Z2NISmxabWw0VEdWdVozUm9JRDRnT1NrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduVDNCMGFXOXVJRndpY0hKbFptbDRYQ0lnYlhWemRDQmlaU0JoSUhOMGNtbHVaeUJqYjI1MFlXbHVhVzVuSUdKbGRIZGxaVzRnTVNCaGJtUWdPU0JrYVdkcGRITXVKeWs3WEc0Z0lIMWNibHh1SUNCamIyNXpkQ0JqY0daVFpYRjFaVzVqWlNBOUlHSmhjMlZUWlhGMVpXNWpaVnh1SUNBZ0lDNXpjR3hwZENnbkp5bGNiaUFnSUNBdWJXRndLRTUxYldKbGNpbGNiaUFnSUNBdVkyOXVZMkYwS0c1MWJXSmxja2RsYm1WeVlYUnZjaWc1SUMwZ2NISmxabWw0VEdWdVozUm9LU2s3WEc0Z0lGczVMQ0F4TUYwdVptOXlSV0ZqYUNnb2JtVjRkRTUxYlVsdVpHVjRLU0E5UGlCN1hHNGdJQ0FnYkdWMElHWmhZM1J2Y2lBOUlHNWxlSFJPZFcxSmJtUmxlQ0FySURFN1hHNGdJQ0FnYkdWMElITjFiU0E5SURBN1hHNWNiaUFnSUNCbWIzSWdLR3hsZENCdUlEMGdNRHNnYmlBOElHNWxlSFJPZFcxSmJtUmxlRHNnYmlzckxDQm1ZV04wYjNJdExTa2dlMXh1SUNBZ0lDQWdjM1Z0SUNzOUlHTndabE5sY1hWbGJtTmxXMjVkSUNvZ1ptRmpkRzl5TzF4dUlDQWdJSDFjYmx4dUlDQWdJR052Ym5OMElISmxiV0ZwYm1SbGNpQTlJREV4SUMwZ0tITjFiU0FsSURFeEtUdGNiaUFnSUNCamNHWlRaWEYxWlc1alpTNXdkWE5vS0hKbGJXRnBibVJsY2lBK0lEa2dQeUF3SURvZ2NtVnRZV2x1WkdWeUtUdGNiaUFnZlNrN1hHNWNiaUFnY21WMGRYSnVJSFZ6WlhKUGNIUnBiMjV6TG1admNtMWhkQ0EvSUdOd1prWnRkQ2hqY0daVFpYRjFaVzVqWlM1cWIybHVLQ2NuS1NrZ09pQmpjR1pUWlhGMVpXNWpaUzVxYjJsdUtDY25LVHRjYm4xY2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kzQm1SMlZ1TzF4dUlsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN096czdRVUZUUVN4TlFVRk5MR05CUVdsQ0xFZEJRVUU3UVVGQlFTeEZRVU55UWl4TlFVRlJMRVZCUVVFc1MwRkJRVHRCUVVGQkxFVkJRMUlzVFVGQlVTeEZRVUZCTzBGQlExWXNRMEZCUVR0QlFVdEJMRk5CUVZNc1dVRkJRU3hEUVVGaExHRkJRWEZETEVkQlFVRXNSVUZCSzBJc1JVRkJRVHRCUVVONFJpeEZRVUZQTEU5QlFVRXNVMEZCUVN4RFFVRlZMR2RDUVVGblFpeGhRVUZoTEVOQlFVRTdRVUZEYUVRN08wRkRhRUpCTEZOQlFWTXNaMEpCUVdkQ0xFMUJRVEJDTEVWQlFVRTdRVUZEYWtRc1JVRkJRU3hOUVVGTkxHdENRVUUwUWl4RlFVRkRPMEZCUlc1RExFVkJRVThzVDBGQlFTeGxRVUZCTEVOQlFXZENMRk5CUVZNc1RVRkJVU3hGUVVGQk8wRkJRM1JETEVsQlFVMHNUVUZCUVN4TlFVRkJMRWRCUVZNc1NVRkJTeXhEUVVGQkxFMUJRVUVzUlVGQlZ5eEhRVUZCTEVWQlFVRTdRVUZETDBJc1NVRkJUU3hOUVVGQkxFOUJRVUVzUjBGQlZTeEpRVUZMTEVOQlFVRXNTMEZCUVN4RFFVRk5MRTFCUVUwc1EwRkJRVHRCUVVWcVF5eEpRVUZCTEdWQlFVRXNRMEZCWjBJc1MwRkJTeXhQUVVGUExFTkJRVUU3UVVGQlFUdEJRVWM1UWl4RlFVRlBMRTlCUVVFc1pVRkJRVHRCUVVOVU96dEJRMHBCTEZOQlFWTXNUMEZCVHl4UFFVRjFReXhGUVVGQk8wRkJRM0pFTEVWQlFVMHNUVUZCUVN4WFFVRkJMRWRCUVdNc1lVRkJZU3hQUVVGUExFTkJRVUU3UVVGRGVFTXNSVUZCVFN4TlFVRkJMRmxCUVVFc1IwRkJaU3hQUVVGUkxFTkJRVUVzVjBGQlFTeERRVUZaTEUxQlFVMHNRMEZCUVR0QlFVTXZReXhGUVVGQkxFMUJRVTBzWlVGQlpTeFpRVUZoTEVOQlFVRXNUVUZCUVR0QlFVVnNReXhGUVVGSkxFbEJRVUVzV1VGQlFTeEhRVUZsTEVOQlFVc3NTVUZCUVN4WlFVRkJMRWRCUVdVc1EwRkJSeXhGUVVGQk8wRkJRM2hETEVsQlFVMHNUVUZCUVN4SlFVRkpMRTFCUVUwc2NVVkJRWEZGTEVOQlFVRTdRVUZCUVR0QlFVZDJSaXhGUVVGQkxFMUJRVTBzVjBGQll5eEhRVUZCTEZsQlFVRXNRMEZEYWtJc1MwRkJUU3hEUVVGQkxFVkJRVVVzUTBGRFVpeERRVUZCTEVkQlFVRXNRMEZCU1N4TlFVRk5MRU5CUVVFc1EwRkRWaXhOUVVGUExFTkJRVUVzWlVGQlFTeERRVUZuUWl4RFFVRkpMRWRCUVVFc1dVRkJXU3hEUVVGRExFTkJRVUU3UVVGRE0wTXNSVUZCUVN4RFFVRkRMRU5CUVVjc1JVRkJRU3hGUVVGRkxFTkJRVVVzUTBGQlFTeFBRVUZCTEVOQlFWRXNRMEZCUXl4WlFVRnBRaXhMUVVGQk8wRkJRMmhETEVsQlFVRXNTVUZCU1N4VFFVRlRMRmxCUVdVc1IwRkJRU3hEUVVGQk8wRkJRelZDTEVsQlFVRXNTVUZCU1N4SFFVRk5MRWRCUVVFc1EwRkJRVHRCUVVWV0xFbEJRVUVzUzBGQlFTeEpRVUZUTEVOQlFVa3NSMEZCUVN4RFFVRkJMRVZCUVVjc1EwRkJTU3hIUVVGQkxGbEJRVUVzUlVGQll5eExRVUZMTEUxQlFWVXNSVUZCUVN4RlFVRkJPMEZCUXk5RExFMUJRVThzUjBGQlFTeEpRVUZCTEZkQlFVRXNRMEZCV1N4RFFVRkRMRU5CUVVrc1IwRkJRU3hOUVVGQk8wRkJRVUU3UVVGSE1VSXNTVUZCVFN4TlFVRkJMRk5CUVVFc1IwRkJXU3hMUVVGTkxFZEJRVTBzUjBGQlFTeEZRVUZCTzBGQlF6bENMRWxCUVVFc1YwRkJRU3hEUVVGWkxFbEJRVXNzUTBGQlFTeFRRVUZCTEVkQlFWa3NRMEZCU1N4SFFVRkJMRU5CUVVFc1IwRkJTU3hUUVVGVExFTkJRVUU3UVVGQlFTeEhRVU12UXl4RFFVRkJPMEZCUlVRc1JVRkJUeXhQUVVGQkxGZEJRVUVzUTBGQldTeE5RVUZUTEVkQlFVRXNUVUZCUVN4RFFVRlBMRmRCUVZrc1EwRkJRU3hKUVVGQkxFTkJRVXNzUlVGQlJTeERRVUZETEVOQlFVRXNSMEZCU1N4WFFVRlpMRU5CUVVFc1NVRkJRU3hEUVVGTExFVkJRVVVzUTBGQlFUdEJRVU5vUmpzN096c2lmUT09XG4iLCJpbXBvcnQgY3BmR2VuIGZyb20gJ0BsYWN1c3NvZnQvY3BmLWdlbic7XG5pbXBvcnQgbnVtT25seSBmcm9tICdudW0tb25seSc7XG5cbmZ1bmN0aW9uIGNwZlZhbChjcGZTdHJpbmcpIHtcbiAgY29uc3QgQ1BGX0xFTkdUSCA9IDExO1xuICBjb25zdCBjcGZEaWdpdHMgPSBudW1Pbmx5KGNwZlN0cmluZyk7XG4gIGlmIChjcGZEaWdpdHMubGVuZ3RoICE9PSBDUEZfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBjcGZEaWdpdHMgPT09IGNwZkdlbih7XG4gICAgcHJlZml4OiBjcGZEaWdpdHMuc3Vic3RyaW5nKDAsIDkpXG4gIH0pO1xufVxuXG5leHBvcnQgeyBjcGZWYWwgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndWJXcHpJaXdpYzI5MWNtTmxjeUk2V3lJdUxpOXpjbU12WTNCbUxYWmhiQzUwY3lKZExDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ1kzQm1SMlZ1SUdaeWIyMGdKMEJzWVdOMWMzTnZablF2WTNCbUxXZGxiaWM3WEc1cGJYQnZjblFnYm5WdFQyNXNlU0JtY205dElDZHVkVzB0YjI1c2VTYzdYRzVjYmk4cUtseHVJQ29nVm1Gc2FXUmhkR1VnWVNCbmFYWmxiaUJEVUVZZ0tFSnlZWHBwYkdsaGJpQkpSQ0JrYjJOMWJXVnVkQ2tnWTJoaGNpQnpaWEYxWlc1alpTNWNiaUFxTDF4dVpuVnVZM1JwYjI0Z1kzQm1WbUZzS0dOd1psTjBjbWx1WnpvZ2MzUnlhVzVuS1RvZ1ltOXZiR1ZoYmlCN1hHNGdJR052Ym5OMElFTlFSbDlNUlU1SFZFZ2dQU0F4TVR0Y2JpQWdZMjl1YzNRZ1kzQm1SR2xuYVhSeklEMGdiblZ0VDI1c2VTaGpjR1pUZEhKcGJtY3BPMXh1WEc0Z0lHbG1JQ2hqY0daRWFXZHBkSE11YkdWdVozUm9JQ0U5UFNCRFVFWmZURVZPUjFSSUtTQjdYRzRnSUNBZ2NtVjBkWEp1SUdaaGJITmxPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJQ2hjYmlBZ0lDQmpjR1pFYVdkcGRITWdQVDA5WEc0Z0lDQWdZM0JtUjJWdUtIdGNiaUFnSUNBZ0lIQnlaV1pwZURvZ1kzQm1SR2xuYVhSekxuTjFZbk4wY21sdVp5Z3dMQ0E1S1N4Y2JpQWdJQ0I5S1Z4dUlDQXBPMXh1ZlZ4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamNHWldZV3c3WEc0aVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWpzN08wRkJUVUVzVTBGQlV5eFBRVUZQTEZOQlFUUkNMRVZCUVVFN1FVRkRNVU1zUlVGQlFTeE5RVUZOTEZWQlFXRXNSMEZCUVN4RlFVRkJPMEZCUTI1Q0xFVkJRVTBzVFVGQlFTeFRRVUZCTEVkQlFWa3NVVUZCVVN4VFFVRlRMRU5CUVVFN1FVRkZia01zUlVGQlNTeEpRVUZCTEZOQlFVRXNRMEZCVlN4WFFVRlhMRlZCUVZrc1JVRkJRVHRCUVVOdVF5eEpRVUZQTEU5QlFVRXNTMEZCUVR0QlFVRkJPMEZCUjFRc1JVRkJRU3hQUVVORkxHTkJRMEVzVFVGQlR5eERRVUZCTzBGQlFVRXNTVUZEVEN4TlFVRlJMRVZCUVVFc1UwRkJRU3hEUVVGVkxGTkJRVlVzUTBGQlFTeERRVUZCTEVWQlFVY3NRMEZCUXp0QlFVRkJMRWRCUTJwRExFTkJRVUU3UVVGRlREczdPenNpZlE9PVxuIiwiaW1wb3J0IGNwZkZtdCBmcm9tICdAbGFjdXNzb2Z0L2NwZi1mbXQnO1xuaW1wb3J0IGNwZkdlbiBmcm9tICdAbGFjdXNzb2Z0L2NwZi1nZW4nO1xuaW1wb3J0IGNwZlZhbCBmcm9tICdAbGFjdXNzb2Z0L2NwZi12YWwnO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0ID0gY3BmRm10O1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGUgPSBjcGZHZW47XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkID0gY3BmVmFsO1xuXG5leHBvcnQgZGVmYXVsdCB7IGZvcm1hdCwgZ2VuZXJhdGUsIGlzVmFsaWQgfTtcbiJdLCJuYW1lcyI6WyJyZXBsYWNlIiwiY2EiLCJlc2NhIiwicGUiLCJtIiwiZXNjYXBlIiwiZXMiLCJjYWxsIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ2YWx1ZSIsImlzTm9uTnVsbE9iamVjdCIsImlzU3BlY2lhbCIsInN0cmluZ1ZhbHVlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJpc1JlYWN0RWxlbWVudCIsImNhblVzZVN5bWJvbCIsIlN5bWJvbCIsImZvciIsIlJFQUNUX0VMRU1FTlRfVFlQRSIsIiQkdHlwZW9mIiwiZW1wdHlUYXJnZXQiLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsIm9wdGlvbnMiLCJjbG9uZSIsImRlZXBtZXJnZSIsImRlZmF1bHRBcnJheU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiY29uY2F0IiwibWFwIiwiZWxlbWVudCIsImdldE1lcmdlRnVuY3Rpb24iLCJrZXkiLCJjdXN0b21NZXJnZSIsImdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJzeW1ib2wiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImdldEtleXMiLCJrZXlzIiwicHJvcGVydHlJc09uT2JqZWN0Iiwib2JqZWN0IiwicHJvcGVydHkiLCJfIiwicHJvcGVydHlJc1Vuc2FmZSIsImhhc093blByb3BlcnR5IiwibWVyZ2VPYmplY3QiLCJkZXN0aW5hdGlvbiIsImZvckVhY2giLCJhcnJheU1lcmdlIiwic291cmNlSXNBcnJheSIsInRhcmdldElzQXJyYXkiLCJzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoIiwiYWxsIiwiZGVlcG1lcmdlQWxsIiwiYXJyYXkiLCJFcnJvciIsInJlZHVjZSIsInByZXYiLCJuZXh0IiwiZGVlcG1lcmdlXzEiLCJjanMiLCJkZWZhdWx0T3B0aW9ucyIsIm1lcmdlT3B0aW9ucyIsImZvcm1hdCIsImNwZkZtdCIsImdlbmVyYXRlIiwiY3BmR2VuIiwiaXNWYWxpZCIsImNwZlZhbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztFQUFBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxNQUFNO0VBQUNBLEVBQUFBO0VBQU8sQ0FBQyxHQUFHLEVBQUU7RUFJcEIsTUFBTUMsRUFBRSxHQUFHLFVBQVU7RUFFckIsTUFBTUMsSUFBSSxHQUFHO0VBQ1gsRUFBQSxHQUFHLEVBQUUsT0FBTztFQUNaLEVBQUEsR0FBRyxFQUFFLE1BQU07RUFDWCxFQUFBLEdBQUcsRUFBRSxNQUFNO0VBQ1gsRUFBQSxHQUFHLEVBQUUsT0FBTztFQUNaLEVBQUEsR0FBRyxFQUFFO0VBQ1AsQ0FBQztFQUNELE1BQU1DLEVBQUUsR0FBR0MsQ0FBQyxJQUFJRixJQUFJLENBQUNFLENBQUMsQ0FBQzs7RUFFdkI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDTyxNQUFNQyxNQUFNLEdBQUdDLEVBQUUsSUFBSU4sT0FBTyxDQUFDTyxJQUFJLENBQUNELEVBQUUsRUFBRUwsRUFBRSxFQUFFRSxFQUFFLENBQUM7Ozs7Ozs7Ozs7Ozs7R0MxQ3BELFNBQVMsT0FBTyxDQUFDLE1BQU0sRUFBRTtLQUN2QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztFQUMxQzs7RUFFQSxD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