UNPKG

react-native-phone-input

Version:
197 lines 31.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importDefault(require("react")); // eslint-disable-line import/no-extraneous-dependencies, no-use-before-define const react_native_1 = require("react-native"); const country_1 = __importDefault(require("./country")); const flags_1 = __importDefault(require("./resources/flags")); const PhoneNumber_1 = __importDefault(require("./PhoneNumber")); const styles_1 = __importDefault(require("./styles")); const CountryPicker_1 = __importDefault(require("./CountryPicker")); class PhoneInput extends react_1.default.Component { static setCustomCountriesData(json) { country_1.default.setCustomCountriesData(json); } constructor(props) { super(props); this.onChangePhoneNumber = (number) => { const actionAfterSetState = this.props.onChangePhoneNumber ? (displayValue, iso2) => { var _a, _b; (_b = (_a = this.props).onChangePhoneNumber) === null || _b === void 0 ? void 0 : _b.call(_a, displayValue, iso2); } : null; this.updateValue(number, actionAfterSetState); }; this.onPressFlag = () => { if (this.props.onPressFlag) { this.props.onPressFlag(); } else { if (this.state.iso2) this.picker.selectCountry(this.state.iso2); this.picker.show(); } }; // eslint-disable-next-line class-methods-use-this this.getFlag = (iso2) => flags_1.default.get(iso2); this.getISOCode = () => this.state.iso2; this.selectCountry = (iso2) => { if (this.state.iso2 !== iso2) { const countryData = PhoneNumber_1.default.getCountryDataByCode(iso2); if (countryData) { this.setState({ iso2, displayValue: this.format(`+${countryData.dialCode}`), value: `+${countryData.dialCode}` }, () => { if (this.props.onSelectCountry) this.props.onSelectCountry(iso2); }); } } }; this.setValue = (number) => { if (this.state.value !== number) { this.updateValue(number); } }; let { initialCountry, initialValue } = this.props; const { countriesList, disabled } = this.props; if (countriesList) { country_1.default.setCustomCountriesData(countriesList); } let displayValue = ''; if (initialValue) { if (initialValue[0] !== '+') { initialValue = `+${initialValue}`; } initialCountry = PhoneNumber_1.default.getCountryCodeOfNumber(initialValue); displayValue = this.format(initialValue, initialCountry); } else { const countryData = PhoneNumber_1.default.getCountryDataByCode(initialCountry); initialValue = countryData ? `+${countryData.dialCode}` : ''; displayValue = initialValue; } this.state = { disabled, iso2: initialCountry, displayValue, value: initialValue, }; } componentDidUpdate() { const { disabled } = this.props; if (disabled !== this.state.disabled) { this.setState({ disabled }); // eslint-disable-line react/no-did-update-set-state } } // eslint-disable-next-line class-methods-use-this getPickerData() { return PhoneNumber_1.default.getAllCountries().map((country, index) => ({ key: index, image: flags_1.default.get(country.iso2), label: country.name, dialCode: `+${country.dialCode}`, iso2: country.iso2 })); } getCountryCode() { const countryData = PhoneNumber_1.default.getCountryDataByCode(this.state.iso2); return countryData ? countryData.dialCode : null; } // eslint-disable-next-line class-methods-use-this getAllCountries() { return PhoneNumber_1.default.getAllCountries(); } getDialCode() { return PhoneNumber_1.default.getDialCode(this.state.value); } getValue(text) { return text ? text.replace(/[^0-9]/g, '') : this.state.value; } getNumberType() { return PhoneNumber_1.default.getNumberType(this.state.value, this.state.iso2); } isValidNumber() { if (this.state.value.length < 4) return false; return PhoneNumber_1.default.isValidNumber(this.state.value, this.state.iso2); } format(text, iso2) { return this.props.autoFormat ? PhoneNumber_1.default.format(text, iso2 || this.state.iso2) : text; } updateValue(number, actionAfterSetState = null) { let modifiedNumber = this.getValue(number); const { allowZeroAfterCountryCode } = this.props; if (modifiedNumber[0] !== '+' && number.length) { modifiedNumber = `+${modifiedNumber}`; } modifiedNumber = allowZeroAfterCountryCode ? modifiedNumber : this.possiblyEliminateZeroAfterCountryCode(modifiedNumber); const iso2 = PhoneNumber_1.default.getCountryCodeOfNumber(modifiedNumber); let countryDialCode; if (iso2) { const countryData = PhoneNumber_1.default.getCountryDataByCode(iso2); countryDialCode = countryData.dialCode; } let displayValue; if (modifiedNumber === `+${countryDialCode}`) { displayValue = modifiedNumber; } else { displayValue = this.format(modifiedNumber); } this.setState({ iso2, displayValue, value: modifiedNumber, }, () => { if (actionAfterSetState) { actionAfterSetState(displayValue, iso2); } }); } // eslint-disable-next-line class-methods-use-this possiblyEliminateZeroAfterCountryCode(number) { const dialCode = PhoneNumber_1.default.getDialCode(number); return number.startsWith(`${dialCode}0`) ? dialCode + number.substr(dialCode.length + 1) : number; } getAccessibilityLabel() { return this.props.accessibilityLabel || 'Telephone input'; } focus() { this.inputPhone.focus(); } blur() { this.inputPhone.blur(); } render() { const { iso2, displayValue, disabled } = this.state; const country = this.getAllCountries().find((c) => c.iso2 === iso2); const TextComponent = this.props.textComponent || react_native_1.TextInput; return (react_1.default.createElement(react_native_1.View, { style: [styles_1.default.container, this.props.style] }, react_1.default.createElement(react_native_1.TouchableOpacity, { onPress: this.onPressFlag, disabled: disabled, accessibilityRole: "imagebutton", accessibilityLabel: country ? country.name : iso2 }, this.props.renderFlag ? (react_1.default.createElement(react_1.default.Fragment, null, this.props.renderFlag({ imageSource: flags_1.default.get(iso2), }))) : (react_1.default.createElement(react_native_1.Image, { accessibilityIgnoresInvertColors: true, source: flags_1.default.get(iso2), style: [styles_1.default.flag, this.props.flagStyle] }))), react_1.default.createElement(react_native_1.View, { style: { flex: 1, marginLeft: this.props.offset || 10 } }, react_1.default.createElement(TextComponent, Object.assign({ ref: (ref) => { this.inputPhone = ref; }, accessibilityLabel: this.getAccessibilityLabel(), editable: !disabled, autoCorrect: false, style: [styles_1.default.text, this.props.textStyle], onChangeText: (text) => { this.onChangePhoneNumber(text); }, keyboardType: "phone-pad", underlineColorAndroid: "rgba(0,0,0,0)", value: displayValue }, this.props.textProps))), react_1.default.createElement(CountryPicker_1.default, { ref: (ref) => { this.picker = ref; }, selectedCountry: iso2, onSubmit: this.selectCountry, buttonColor: this.props.pickerButtonColor, cancelText: this.props.cancelText, cancelTextStyle: this.props.cancelTextStyle, confirmText: this.props.confirmText, confirmTextStyle: this.props.confirmTextStyle, pickerBackgroundColor: this.props.pickerBackgroundColor, itemStyle: this.props.pickerItemStyle, onPressCancel: this.props.onPressCancel, onPressConfirm: this.props.onPressConfirm }))); } } exports.default = PhoneInput; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhvbmVJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QaG9uZUlucHV0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUEwQixDQUFDLDhFQUE4RTtBQUN6RywrQ0FFc0I7QUFDdEIsd0RBQWdDO0FBQ2hDLDhEQUFzQztBQUN0QyxnRUFBd0M7QUFDeEMsc0RBQThCO0FBQzlCLG9FQUE0QztBQUc1QyxNQUFxQixVQUNqQixTQUFRLGVBQUssQ0FBQyxTQUE2RDtJQUMzRSxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSTtRQUM5QixpQkFBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFNRCxZQUFZLEtBQUs7UUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUE0Q2pCLHdCQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtnQkFDdEQsQ0FBQyxDQUFDLENBQUMsWUFBb0IsRUFBRSxJQUFZLEVBQUUsRUFBRTs7b0JBQ3JDLE1BQUEsTUFBQSxJQUFJLENBQUMsS0FBSyxFQUFDLG1CQUFtQixtREFBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pELENBQUM7Z0JBQ0QsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO1FBRUQsZ0JBQVcsR0FBRyxHQUFHLEVBQUU7WUFDZixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO2dCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFD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RSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFDckMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUN2QyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQzNDLENBQ0MsQ0FDVixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBaFJELDZCQWdSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuaW1wb3J0IHtcbiAgICBJbWFnZSwgVGV4dElucHV0LCBUb3VjaGFibGVPcGFjaXR5LCBWaWV3XG59IGZyb20gJ3JlYWN0LW5hdGl2ZSc7XG5pbXBvcnQgQ291bnRyeSBmcm9tICcuL2NvdW50cnknO1xuaW1wb3J0IEZsYWdzIGZyb20gJy4vcmVzb3VyY2VzL2ZsYWdzJztcbmltcG9ydCBQaG9uZU51bWJlciBmcm9tICcuL1Bob25lTnVtYmVyJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IENvdW50cnlQaWNrZXIgZnJvbSAnLi9Db3VudHJ5UGlja2VyJztcbmltcG9ydCB7IFJlYWN0TmF0aXZlUGhvbmVJbnB1dFByb3BzIH0gZnJvbSAnLi90eXBpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGhvbmVJbnB1dDxUZXh0Q29tcG9uZW50VHlwZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFR5cGUgPSB0eXBlb2YgVGV4dElucHV0PlxuICAgIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFJlYWN0TmF0aXZlUGhvbmVJbnB1dFByb3BzPFRleHRDb21wb25lbnRUeXBlPiwgYW55PiB7XG4gICAgc3RhdGljIHNldEN1c3RvbUNvdW50cmllc0RhdGEoanNvbikge1xuICAgICAgICBDb3VudHJ5LnNldEN1c3RvbUNvdW50cmllc0RhdGEoanNvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwaWNrZXI6IGFueTtcblxuICAgIHByaXZhdGUgaW5wdXRQaG9uZTogYW55O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbml0aWFsQ291bnRyeSwgaW5pdGlhbFZhbHVlXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvdW50cmllc0xpc3QsIGRpc2FibGVkXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGlmIChjb3VudHJpZXNMaXN0KSB7XG4gICAgICAgICAgICBDb3VudHJ5LnNldEN1c3RvbUNvdW50cmllc0RhdGEoY291bnRyaWVzTGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGlzcGxheVZhbHVlID0gJyc7XG5cbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZVswXSAhPT0gJysnKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gYCske2luaXRpYWxWYWx1ZX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbml0aWFsQ291bnRyeSA9IFBob25lTnVtYmVyLmdldENvdW50cnlDb2RlT2ZOdW1iZXIoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0KGluaXRpYWxWYWx1ZSwgaW5pdGlhbENvdW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY291bnRyeURhdGEgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5RGF0YUJ5Q29kZShpbml0aWFsQ291bnRyeSk7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBjb3VudHJ5RGF0YSA/IGArJHtjb3VudHJ5RGF0YS5kaWFsQ29kZX1gIDogJyc7XG4gICAgICAgICAgICBkaXNwbGF5VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICBpc28yOiBpbml0aWFsQ291bnRyeSxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBpbml0aWFsVmFsdWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICBjb25zdCB7IGRpc2FibGVkIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAoZGlzYWJsZWQgIT09IHRoaXMuc3RhdGUuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkaXNhYmxlZCB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2VQaG9uZU51bWJlciA9IChudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9uQWZ0ZXJTZXRTdGF0ZSA9IHRoaXMucHJvcHMub25DaGFuZ2VQaG9uZU51bWJlclxuICAgICAgICAgICAgPyAoZGlzcGxheVZhbHVlOiBzdHJpbmcsIGlzbzI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2VQaG9uZU51bWJlcj8uKGRpc3BsYXlWYWx1ZSwgaXNvMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUobnVtYmVyLCBhY3Rpb25BZnRlclNldFN0YXRlKTtcbiAgICB9XG5cbiAgICBvblByZXNzRmxhZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25QcmVzc0ZsYWcpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25QcmVzc0ZsYWcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmlzbzIpIHRoaXMucGlja2VyLnNlbGVjdENvdW50cnkodGhpcy5zdGF0ZS5pc28yKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgZ2V0UGlja2VyRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyLmdldEFsbENvdW50cmllcygpLm1hcCgoY291bnRyeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICAgICAgaW1hZ2U6IEZsYWdzLmdldChjb3VudHJ5LmlzbzIpLFxuICAgICAgICAgICAgbGFiZWw6IGNvdW50cnkubmFtZSxcbiAgICAgICAgICAgIGRpYWxDb2RlOiBgKyR7Y291bnRyeS5kaWFsQ29kZX1gLFxuICAgICAgICAgICAgaXNvMjogY291bnRyeS5pc28yXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBnZXRDb3VudHJ5Q29kZSgpIHtcbiAgICAgICAgY29uc3QgY291bnRyeURhdGEgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5RGF0YUJ5Q29kZSh0aGlzLnN0YXRlLmlzbzIpO1xuICAgICAgICByZXR1cm4gY291bnRyeURhdGEgPyBjb3VudHJ5RGF0YS5kaWFsQ29kZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBnZXRBbGxDb3VudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBQaG9uZU51bWJlci5nZXRBbGxDb3VudHJpZXMoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIGdldEZsYWcgPSAoaXNvMikgPT4gRmxhZ3MuZ2V0KGlzbzIpO1xuXG4gICAgZ2V0RGlhbENvZGUoKSB7XG4gICAgICAgIHJldHVybiBQaG9uZU51bWJlci5nZXREaWFsQ29kZSh0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZSh0ZXh0Pykge1xuICAgICAgICByZXR1cm4gdGV4dCA/IHRleHQucmVwbGFjZSgvW14wLTldL2csICcnKSA6IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0TnVtYmVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyLmdldE51bWJlclR5cGUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pc28yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0SVNPQ29kZSA9ICgpID0+IHRoaXMuc3RhdGUuaXNvMjtcblxuICAgIHNlbGVjdENvdW50cnkgPSAoaXNvMikgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc28yICE9PSBpc28yKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudHJ5RGF0YSA9IFBob25lTnVtYmVyLmdldENvdW50cnlEYXRhQnlDb2RlKGlzbzIpO1xuICAgICAgICAgICAgaWYgKGNvdW50cnlEYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNvMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdGhpcy5mb3JtYXQoYCske2NvdW50cnlEYXRhLmRpYWxDb2RlfWApLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGArJHtjb3VudHJ5RGF0YS5kaWFsQ29kZX1gXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0Q291bnRyeSkgdGhpcy5wcm9wcy5vblNlbGVjdENvdW50cnkoaXNvMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VmFsdWUgPSAobnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlICE9PSBudW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzVmFsaWROdW1iZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlLmxlbmd0aCA8IDQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyLmlzVmFsaWROdW1iZXIoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pc28yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZm9ybWF0KHRleHQsIGlzbzI/KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmF1dG9Gb3JtYXRcbiAgICAgICAgICAgID8gUGhvbmVOdW1iZXIuZm9ybWF0KHRleHQsIGlzbzIgfHwgdGhpcy5zdGF0ZS5pc28yKVxuICAgICAgICAgICAgOiB0ZXh0O1xuICAgIH1cblxuICAgIHVwZGF0ZVZhbHVlKG51bWJlciwgYWN0aW9uQWZ0ZXJTZXRTdGF0ZTogYW55ID0gbnVsbCkge1xuICAgICAgICBsZXQgbW9kaWZpZWROdW1iZXIgPSB0aGlzLmdldFZhbHVlKG51bWJlcik7XG4gICAgICAgIGNvbnN0IHsgYWxsb3daZXJvQWZ0ZXJDb3VudHJ5Q29kZSB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBpZiAobW9kaWZpZWROdW1iZXJbMF0gIT09ICcrJyAmJiBudW1iZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBtb2RpZmllZE51bWJlciA9IGArJHttb2RpZmllZE51bWJlcn1gO1xuICAgICAgICB9XG4gICAgICAgIG1vZGlmaWVkTnVtYmVyID0gYWxsb3daZXJvQWZ0ZXJDb3VudHJ5Q29kZVxuICAgICAgICAgICAgPyBtb2RpZmllZE51bWJlclxuICAgICAgICAgICAgOiB0aGlzLnBvc3NpYmx5RWxpbWluYXRlWmVyb0FmdGVyQ291bnRyeUNvZGUobW9kaWZpZWROdW1iZXIpO1xuICAgICAgICBjb25zdCBpc28yOiBzdHJpbmcgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5Q29kZU9mTnVtYmVyKG1vZGlmaWVkTnVtYmVyKTtcblxuICAgICAgICBsZXQgY291bnRyeURpYWxDb2RlO1xuICAgICAgICBpZiAoaXNvMikge1xuICAgICAgICAgICAgY29uc3QgY291bnRyeURhdGEgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5RGF0YUJ5Q29kZShpc28yKTtcbiAgICAgICAgICAgIGNvdW50cnlEaWFsQ29kZSA9IGNvdW50cnlEYXRhLmRpYWxDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgaWYgKG1vZGlmaWVkTnVtYmVyID09PSBgKyR7Y291bnRyeURpYWxDb2RlfWApIHtcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IG1vZGlmaWVkTnVtYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gdGhpcy5mb3JtYXQobW9kaWZpZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc28yLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IG1vZGlmaWVkTnVtYmVyLFxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uQWZ0ZXJTZXRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbkFmdGVyU2V0U3RhdGUoZGlzcGxheVZhbHVlLCBpc28yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwb3NzaWJseUVsaW1pbmF0ZVplcm9BZnRlckNvdW50cnlDb2RlKG51bWJlcikge1xuICAgICAgICBjb25zdCBkaWFsQ29kZSA9IFBob25lTnVtYmVyLmdldERpYWxDb2RlKG51bWJlcik7XG4gICAgICAgIHJldHVybiBudW1iZXIuc3RhcnRzV2l0aChgJHtkaWFsQ29kZX0wYClcbiAgICAgICAgICAgID8gZGlhbENvZGUgKyBudW1iZXIuc3Vic3RyKGRpYWxDb2RlLmxlbmd0aCArIDEpXG4gICAgICAgICAgICA6IG51bWJlcjtcbiAgICB9XG5cbiAgICBnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmFjY2Vzc2liaWxpdHlMYWJlbCB8fCAnVGVsZXBob25lIGlucHV0JztcbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5pbnB1dFBob25lLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5pbnB1dFBob25lLmJsdXIoKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvMiwgZGlzcGxheVZhbHVlLCBkaXNhYmxlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgY291bnRyeSA9IHRoaXMuZ2V0QWxsQ291bnRyaWVzKCkuZmluZCgoYykgPT4gYy5pc28yID09PSBpc28yKTtcbiAgICAgICAgY29uc3QgVGV4dENvbXBvbmVudDogYW55ID0gdGhpcy5wcm9wcy50ZXh0Q29tcG9uZW50IHx8IFRleHRJbnB1dDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxWaWV3IHN0eWxlPXtbc3R5bGVzLmNvbnRhaW5lciwgdGhpcy5wcm9wcy5zdHlsZV19PlxuICAgICAgICAgICAgICAgIDxUb3VjaGFibGVPcGFjaXR5XG4gICAgICAgICAgICAgICAgICAgIG9uUHJlc3M9e3RoaXMub25QcmVzc0ZsYWd9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eVJvbGU9XCJpbWFnZWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlMYWJlbD17Y291bnRyeSA/IGNvdW50cnkubmFtZSA6IGlzbzJ9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5yZW5kZXJGbGFnID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5yZW5kZXJGbGFnKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTb3VyY2U6IEZsYWdzLmdldChpc28yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eUlnbm9yZXNJbnZlcnRDb2xvcnM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXtGbGFncy5nZXQoaXNvMil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1tzdHlsZXMuZmxhZywgdGhpcy5wcm9wcy5mbGFnU3R5bGVdfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1RvdWNoYWJsZU9wYWNpdHk+XG4gICAgICAgICAgICAgICAgPFZpZXcgc3R5bGU9e3sgZmxleDogMSwgbWFyZ2luTGVmdDogdGhpcy5wcm9wcy5vZmZzZXQgfHwgMTAgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0Q29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9eyhyZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0UGhvbmUgPSByZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eUxhYmVsPXt0aGlzLmdldEFjY2Vzc2liaWxpdHlMYWJlbCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU9eyFkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db3JyZWN0PXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXtbc3R5bGVzLnRleHQsIHRoaXMucHJvcHMudGV4dFN0eWxlXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlVGV4dD17KHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlUGhvbmVOdW1iZXIodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmRUeXBlPVwicGhvbmUtcGFkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZUNvbG9yQW5kcm9pZD1cInJnYmEoMCwwLDAsMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLnRleHRQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L1ZpZXc+XG5cbiAgICAgICAgICAgICAgICA8Q291bnRyeVBpY2tlclxuICAgICAgICAgICAgICAgICAgICByZWY9eyhyZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyID0gcmVmO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvdW50cnk9e2lzbzJ9XG4gICAgICAgICAgICAgICAgICAgIG9uU3VibWl0PXt0aGlzLnNlbGVjdENvdW50cnl9XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNvbG9yPXt0aGlzLnByb3BzLnBpY2tlckJ1dHRvbkNvbG9yfVxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0PXt0aGlzLnByb3BzLmNhbmNlbFRleHR9XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHRTdHlsZT17dGhpcy5wcm9wcy5jYW5jZWxUZXh0U3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0PXt0aGlzLnByb3BzLmNvbmZpcm1UZXh0fVxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dFN0eWxlPXt0aGlzLnByb3BzLmNvbmZpcm1UZXh0U3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIHBpY2tlckJhY2tncm91bmRDb2xvcj17dGhpcy5wcm9wcy5waWNrZXJCYWNrZ3JvdW5kQ29sb3J9XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZT17dGhpcy5wcm9wcy5waWNrZXJJdGVtU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIG9uUHJlc3NDYW5jZWw9e3RoaXMucHJvcHMub25QcmVzc0NhbmNlbH1cbiAgICAgICAgICAgICAgICAgICAgb25QcmVzc0NvbmZpcm09e3RoaXMucHJvcHMub25QcmVzc0NvbmZpcm19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=