adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
315 lines (279 loc) • 31.3 kB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
var _excluded = ["countHanzi"],
_excluded2 = ["countHanzi"];
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
import React, { Component } from "react";
import sinon from "sinon";
import { mount, render } from "enzyme";
import TestRenderer from "react-test-renderer";
import Input from "..";
import Icon from "../../icon";
var stub = sinon.stub(console, "error");
var InputMounter = function (_Component) {
_inherits(InputMounter, _Component);
var _super = _createSuper(InputMounter);
function InputMounter() {
var _this;
_classCallCheck(this, InputMounter);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this.state = {
value: "中文abc",
leftElement: React.createElement(Icon, {
icon: "add"
})
};
return _this;
}
_createClass(InputMounter, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
countHanzi = _this$props.countHanzi,
others = _objectWithoutProperties(_this$props, _excluded);
var _this$state = this.state,
leftElement = _this$state.leftElement,
value = _this$state.value;
return React.createElement(Input, _extends({
countHanzi: countHanzi,
leftElement: leftElement,
limit: 10,
value: value,
onChange: function onChange(_ref) {
var val = _ref.target.value;
return _this2.setState({
value: val
});
}
}, others));
}
}]);
return InputMounter;
}(Component);
var TextareaMounter = function (_Component2) {
_inherits(TextareaMounter, _Component2);
var _super2 = _createSuper(TextareaMounter);
function TextareaMounter() {
var _this3;
_classCallCheck(this, TextareaMounter);
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this3 = _super2.call.apply(_super2, [this].concat(args));
_this3.state = {
value: "中文abc"
};
return _this3;
}
_createClass(TextareaMounter, [{
key: "render",
value: function render() {
var _this4 = this;
var _this$props2 = this.props,
countHanzi = _this$props2.countHanzi,
others = _objectWithoutProperties(_this$props2, _excluded2);
var value = this.state.value;
return React.createElement(Input.Textarea, _extends({
countHanzi: countHanzi,
limit: 10,
value: value,
onChange: function onChange(_ref2) {
var val = _ref2.target.value;
return _this4.setState({
value: val
});
}
}, others));
}
}]);
return TextareaMounter;
}(Component);
describe("Input", function () {
beforeAll(function () {
Object.defineProperty(Element.prototype, "clientWidth", {
writable: true,
configurable: true,
value: 200
});
});
it("快照验证", function () {
var wrapper = TestRenderer.create(React.createElement(Input, null));
expect(wrapper).toMatchSnapshot();
});
it("是否正确渲染文本框", function () {
var wrapper = TestRenderer.create(React.createElement(Input.Textarea, null));
expect(wrapper).toMatchSnapshot();
});
it("是否能验证 contentJustify", function () {
render(React.createElement(Input, {
contentJustify: true
}));
render(React.createElement(Input, {
contentJustify: true,
value: "111\u4E2D\u6587"
}));
expect(stub.calledOnce).toEqual(true);
stub.restore();
});
it("是否能验证 limit", function () {
render(React.createElement(Input, {
limit: 10,
rightElement: React.createElement("div", null, "string")
}));
expect(stub.calledOnce).toEqual(true);
stub.restore();
});
it("是否支持 limit 功能", function () {
var wrapper0 = mount(React.createElement(InputMounter, {
countHanzi: true
}));
var wrapper1 = mount(React.createElement(InputMounter, {
countHanzi: false
}));
wrapper0.find("input").simulate("change", {
target: {
value: "111中文"
}
});
wrapper1.find("input").simulate("change", {
target: {
value: "111中文"
}
});
expect(wrapper0.find(".adui-input-limit").text()).toEqual("4/10");
expect(wrapper1.find(".adui-input-limit").text()).toEqual("5/10");
});
it("是否显示正确的 leftElement rightElement", function () {
var wrapper = mount(React.createElement(Input, {
leftElement: React.createElement(Icon, {
icon: "search"
}),
rightElement: React.createElement(Icon, {
icon: "search"
})
}));
var left = wrapper.find(".adui-input-left");
var right = wrapper.find(".adui-input-right");
left.simulate("click");
right.simulate("click");
});
it("是否能正确处理 leftElement 宽度", function () {
var wrapper = mount(React.createElement(InputMounter, null));
wrapper.setState({
leftElement: null
});
wrapper.setProps({
rightElement: React.createElement(Icon, {
icon: "add"
})
});
wrapper.setProps({
rightElement: null
});
});
it("事件验证", function () {
var onPressEnter = jest.fn();
var onKeyDown = jest.fn();
var onBlur = jest.fn();
var onFocus = jest.fn();
var wrapper = mount(React.createElement(Input, {
onPressEnter: onPressEnter,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: onFocus
}));
wrapper.find("input").simulate("keydown", {
key: "enter",
keyCode: 13
});
wrapper.find("input").simulate("focus");
wrapper.find("input").simulate("blur");
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(onKeyDown).toHaveBeenCalledTimes(1);
expect(onBlur).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledTimes(1);
});
it("验证 Cleave.js", function () {
var wrapper = mount(React.createElement(InputMounter, {
cleaveOptions: {
uppercase: true
}
}));
wrapper.setState({
value: "abc"
});
wrapper.update();
expect(wrapper.find("input").get(0).props.value).toBe("ABC");
});
it("Textarea: 快照验证", function () {
var wrapper = TestRenderer.create(React.createElement(Input.Textarea, null));
expect(wrapper).toMatchSnapshot();
});
it("Textarea: 是否能正确验证 limit", function () {
render(React.createElement(Input.Textarea, {
limit: 10,
resize: "both"
}));
expect(stub.calledOnce).toEqual(true);
});
it("Textarea: 是否支持 limit 功能", function () {
var wrapper0 = mount(React.createElement(TextareaMounter, {
countHanzi: true
}));
var wrapper1 = mount(React.createElement(TextareaMounter, {
countHanzi: false
}));
wrapper0.find("textarea").simulate("change", {
target: {
value: "111中文"
}
});
wrapper1.find("textarea").simulate("change", {
target: {
value: "111中文"
}
});
expect(wrapper0.find(".adui-input-limit").text()).toEqual("4/10");
expect(wrapper1.find(".adui-input-limit").text()).toEqual("5/10");
});
it("Textarea: 事件验证", function () {
var onPressEnter = jest.fn();
var onKeyDown = jest.fn();
var onBlur = jest.fn();
var onFocus = jest.fn();
var wrapper = mount(React.createElement(Input.Textarea, {
onPressEnter: onPressEnter,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: onFocus
}));
wrapper.find("textarea").simulate("keydown", {
key: "enter",
keyCode: 13
});
wrapper.find("textarea").simulate("focus");
expect(wrapper.find(".adui-input-wrapper").at(0).props().className.includes("adui-input-focused")).toBe(true);
wrapper.find("textarea").simulate("blur");
expect(wrapper.find(".adui-input-wrapper").at(0).props().className.includes("adui-input-focused")).toBe(false);
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(onKeyDown).toHaveBeenCalledTimes(1);
expect(onBlur).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledTimes(1);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbXBvbmVudCIsInNpbm9uIiwibW91bnQiLCJyZW5kZXIiLCJUZXN0UmVuZGVyZXIiLCJJbnB1dCIsIkljb24iLCJzdHViIiwiY29uc29sZSIsIklucHV0TW91bnRlciIsInN0YXRlIiwidmFsdWUiLCJsZWZ0RWxlbWVudCIsInByb3BzIiwiY291bnRIYW56aSIsIm90aGVycyIsInZhbCIsInRhcmdldCIsInNldFN0YXRlIiwiVGV4dGFyZWFNb3VudGVyIiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIkVsZW1lbnQiLCJwcm90b3R5cGUiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIml0Iiwid3JhcHBlciIsImNyZWF0ZSIsImV4cGVjdCIsInRvTWF0Y2hTbmFwc2hvdCIsImNhbGxlZE9uY2UiLCJ0b0VxdWFsIiwicmVzdG9yZSIsIndyYXBwZXIwIiwid3JhcHBlcjEiLCJmaW5kIiwic2ltdWxhdGUiLCJ0ZXh0IiwibGVmdCIsInJpZ2h0Iiwic2V0UHJvcHMiLCJyaWdodEVsZW1lbnQiLCJvblByZXNzRW50ZXIiLCJqZXN0IiwiZm4iLCJvbktleURvd24iLCJvbkJsdXIiLCJvbkZvY3VzIiwia2V5Iiwia2V5Q29kZSIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInVwcGVyY2FzZSIsInVwZGF0ZSIsImdldCIsInRvQmUiLCJhdCIsImNsYXNzTmFtZSIsImluY2x1ZGVzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9pbnB1dC9fX3Rlc3RzX18vaW5kZXgudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBzaW5vbiBmcm9tIFwic2lub25cIlxuaW1wb3J0IHsgbW91bnQsIHJlbmRlciB9IGZyb20gXCJlbnp5bWVcIlxuaW1wb3J0IFRlc3RSZW5kZXJlciBmcm9tIFwicmVhY3QtdGVzdC1yZW5kZXJlclwiXG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4uXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi8uLi9pY29uXCJcblxuY29uc3Qgc3R1YiA9IHNpbm9uLnN0dWIoY29uc29sZSwgXCJlcnJvclwiKVxuXG5jbGFzcyBJbnB1dE1vdW50ZXIgZXh0ZW5kcyBDb21wb25lbnQ8YW55LCBhbnk+IHtcbiAgc3RhdGUgPSB7XG4gICAgdmFsdWU6IFwi5Lit5paHYWJjXCIsXG4gICAgbGVmdEVsZW1lbnQ6IDxJY29uIGljb249XCJhZGRcIiAvPixcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvdW50SGFuemksIC4uLm90aGVycyB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgbGVmdEVsZW1lbnQsIHZhbHVlIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxJbnB1dFxuICAgICAgICBjb3VudEhhbnppPXtjb3VudEhhbnppfVxuICAgICAgICBsZWZ0RWxlbWVudD17bGVmdEVsZW1lbnR9XG4gICAgICAgIGxpbWl0PXsxMH1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlOiB2YWwgfSB9KSA9PiB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHZhbCB9KX1cbiAgICAgICAgey4uLm90aGVyc31cbiAgICAgIC8+XG4gICAgKVxuICB9XG59XG5cbmNsYXNzIFRleHRhcmVhTW91bnRlciBleHRlbmRzIENvbXBvbmVudDxhbnksIGFueT4ge1xuICBzdGF0ZSA9IHtcbiAgICB2YWx1ZTogXCLkuK3mlodhYmNcIixcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNvdW50SGFuemksIC4uLm90aGVycyB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRoaXMuc3RhdGVcbiAgICByZXR1cm4gKFxuICAgICAgPElucHV0LlRleHRhcmVhXG4gICAgICAgIGNvdW50SGFuemk9e2NvdW50SGFueml9XG4gICAgICAgIGxpbWl0PXsxMH1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlOiB2YWwgfSB9KSA9PiB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHZhbCB9KX1cbiAgICAgICAgey4uLm90aGVyc31cbiAgICAgIC8+XG4gICAgKVxuICB9XG59XG5cbmRlc2NyaWJlKFwiSW5wdXRcIiwgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgXCJjbGllbnRXaWR0aFwiLCB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiAyMDAsXG4gICAgfSlcbiAgfSlcblxuICBpdChcIuW/q+eFp+mqjOivgVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IFRlc3RSZW5kZXJlci5jcmVhdGUoPElucHV0IC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuICBpdChcIuaYr+WQpuato+ehrua4suafk+aWh+acrOahhlwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IFRlc3RSZW5kZXJlci5jcmVhdGUoPElucHV0LlRleHRhcmVhIC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuICBpdChcIuaYr+WQpuiDvemqjOivgSBjb250ZW50SnVzdGlmeVwiLCAoKSA9PiB7XG4gICAgcmVuZGVyKDxJbnB1dCBjb250ZW50SnVzdGlmeSAvPilcbiAgICByZW5kZXIoPElucHV0IGNvbnRlbnRKdXN0aWZ5IHZhbHVlPVwiMTEx5Lit5paHXCIgLz4pXG4gICAgZXhwZWN0KHN0dWIuY2FsbGVkT25jZSkudG9FcXVhbCh0cnVlKVxuICAgIHN0dWIucmVzdG9yZSgpXG4gIH0pXG4gIGl0KFwi5piv5ZCm6IO96aqM6K+BIGxpbWl0XCIsICgpID0+IHtcbiAgICByZW5kZXIoPElucHV0IGxpbWl0PXsxMH0gcmlnaHRFbGVtZW50PXs8ZGl2PnN0cmluZzwvZGl2Pn0gLz4pXG4gICAgZXhwZWN0KHN0dWIuY2FsbGVkT25jZSkudG9FcXVhbCh0cnVlKVxuICAgIHN0dWIucmVzdG9yZSgpXG4gIH0pXG4gIGl0KFwi5piv5ZCm5pSv5oyBIGxpbWl0IOWKn+iDvVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlcjAgPSBtb3VudCg8SW5wdXRNb3VudGVyIGNvdW50SGFuemkgLz4pXG4gICAgY29uc3Qgd3JhcHBlcjEgPSBtb3VudCg8SW5wdXRNb3VudGVyIGNvdW50SGFuemk9e2ZhbHNlfSAvPilcbiAgICB3cmFwcGVyMC5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIHdyYXBwZXIxLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIxMTHkuK3mlodcIiB9IH0pXG4gICAgZXhwZWN0KHdyYXBwZXIwLmZpbmQoXCIuYWR1aS1pbnB1dC1saW1pdFwiKS50ZXh0KCkpLnRvRXF1YWwoXCI0LzEwXCIpXG4gICAgZXhwZWN0KHdyYXBwZXIxLmZpbmQoXCIuYWR1aS1pbnB1dC1saW1pdFwiKS50ZXh0KCkpLnRvRXF1YWwoXCI1LzEwXCIpXG4gIH0pXG4gIGl0KFwi5piv5ZCm5pi+56S65q2j56Gu55qEIGxlZnRFbGVtZW50IHJpZ2h0RWxlbWVudFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgPElucHV0XG4gICAgICAgIGxlZnRFbGVtZW50PXs8SWNvbiBpY29uPVwic2VhcmNoXCIgLz59XG4gICAgICAgIHJpZ2h0RWxlbWVudD17PEljb24gaWNvbj1cInNlYXJjaFwiIC8+fVxuICAgICAgLz5cbiAgICApXG4gICAgY29uc3QgbGVmdCA9IHdyYXBwZXIuZmluZChcIi5hZHVpLWlucHV0LWxlZnRcIilcbiAgICBjb25zdCByaWdodCA9IHdyYXBwZXIuZmluZChcIi5hZHVpLWlucHV0LXJpZ2h0XCIpXG4gICAgbGVmdC5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgcmlnaHQuc2ltdWxhdGUoXCJjbGlja1wiKVxuICB9KVxuICBpdChcIuaYr+WQpuiDveato+ehruWkhOeQhiBsZWZ0RWxlbWVudCDlrr3luqZcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudCg8SW5wdXRNb3VudGVyIC8+KVxuICAgIHdyYXBwZXIuc2V0U3RhdGUoeyBsZWZ0RWxlbWVudDogbnVsbCB9KVxuICAgIHdyYXBwZXIuc2V0UHJvcHMoeyByaWdodEVsZW1lbnQ6IDxJY29uIGljb249XCJhZGRcIiAvPiB9KVxuICAgIHdyYXBwZXIuc2V0UHJvcHMoeyByaWdodEVsZW1lbnQ6IG51bGwgfSlcbiAgfSlcbiAgaXQoXCLkuovku7bpqozor4FcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3NFbnRlciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uS2V5RG93biA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uQmx1ciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uRm9jdXMgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxJbnB1dFxuICAgICAgICBvblByZXNzRW50ZXI9e29uUHJlc3NFbnRlcn1cbiAgICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgLz5cbiAgICApXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJrZXlkb3duXCIsIHsga2V5OiBcImVudGVyXCIsIGtleUNvZGU6IDEzIH0pXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJmb2N1c1wiKVxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiYmx1clwiKVxuICAgIGV4cGVjdChvblByZXNzRW50ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbktleURvd24pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbkJsdXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbkZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgfSlcbiAgaXQoXCLpqozor4EgQ2xlYXZlLmpzXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPElucHV0TW91bnRlciBjbGVhdmVPcHRpb25zPXt7IHVwcGVyY2FzZTogdHJ1ZSB9fSAvPilcbiAgICB3cmFwcGVyLnNldFN0YXRlKHsgdmFsdWU6IFwiYWJjXCIgfSlcbiAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmdldCgwKS5wcm9wcy52YWx1ZSkudG9CZShcIkFCQ1wiKVxuICB9KVxuXG4gIGl0KFwiVGV4dGFyZWE6IOW/q+eFp+mqjOivgVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IFRlc3RSZW5kZXJlci5jcmVhdGUoPElucHV0LlRleHRhcmVhIC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuICBpdChcIlRleHRhcmVhOiDmmK/lkKbog73mraPnoa7pqozor4EgbGltaXRcIiwgKCkgPT4ge1xuICAgIHJlbmRlcig8SW5wdXQuVGV4dGFyZWEgbGltaXQ9ezEwfSByZXNpemU9XCJib3RoXCIgLz4pXG4gICAgZXhwZWN0KHN0dWIuY2FsbGVkT25jZSkudG9FcXVhbCh0cnVlKVxuICB9KVxuICBpdChcIlRleHRhcmVhOiDmmK/lkKbmlK/mjIEgbGltaXQg5Yqf6IO9XCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyMCA9IG1vdW50KDxUZXh0YXJlYU1vdW50ZXIgY291bnRIYW56aSAvPilcbiAgICBjb25zdCB3cmFwcGVyMSA9IG1vdW50KDxUZXh0YXJlYU1vdW50ZXIgY291bnRIYW56aT17ZmFsc2V9IC8+KVxuICAgIHdyYXBwZXIwXG4gICAgICAuZmluZChcInRleHRhcmVhXCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIHdyYXBwZXIxXG4gICAgICAuZmluZChcInRleHRhcmVhXCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIGV4cGVjdCh3cmFwcGVyMC5maW5kKFwiLmFkdWktaW5wdXQtbGltaXRcIikudGV4dCgpKS50b0VxdWFsKFwiNC8xMFwiKVxuICAgIGV4cGVjdCh3cmFwcGVyMS5maW5kKFwiLmFkdWktaW5wdXQtbGltaXRcIikudGV4dCgpKS50b0VxdWFsKFwiNS8xMFwiKVxuICB9KVxuICBpdChcIlRleHRhcmVhOiDkuovku7bpqozor4FcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG9uUHJlc3NFbnRlciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uS2V5RG93biA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uQmx1ciA9IGplc3QuZm4oKVxuICAgIGNvbnN0IG9uRm9jdXMgPSBqZXN0LmZuKClcblxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxJbnB1dC5UZXh0YXJlYVxuICAgICAgICBvblByZXNzRW50ZXI9e29uUHJlc3NFbnRlcn1cbiAgICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgICAgIG9uQmx1cj17b25CbHVyfVxuICAgICAgICBvbkZvY3VzPXtvbkZvY3VzfVxuICAgICAgLz5cbiAgICApXG4gICAgd3JhcHBlci5maW5kKFwidGV4dGFyZWFcIikuc2ltdWxhdGUoXCJrZXlkb3duXCIsIHsga2V5OiBcImVudGVyXCIsIGtleUNvZGU6IDEzIH0pXG4gICAgd3JhcHBlci5maW5kKFwidGV4dGFyZWFcIikuc2ltdWxhdGUoXCJmb2N1c1wiKVxuICAgIGV4cGVjdChcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCIuYWR1aS1pbnB1dC13cmFwcGVyXCIpXG4gICAgICAgIC5hdCgwKVxuICAgICAgICAucHJvcHMoKVxuICAgICAgICAuY2xhc3NOYW1lLmluY2x1ZGVzKFwiYWR1aS1pbnB1dC1mb2N1c2VkXCIpXG4gICAgKS50b0JlKHRydWUpXG4gICAgd3JhcHBlci5maW5kKFwidGV4dGFyZWFcIikuc2ltdWxhdGUoXCJibHVyXCIpXG4gICAgZXhwZWN0KFxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcIi5hZHVpLWlucHV0LXdyYXBwZXJcIilcbiAgICAgICAgLmF0KDApXG4gICAgICAgIC5wcm9wcygpXG4gICAgICAgIC5jbGFzc05hbWUuaW5jbHVkZXMoXCJhZHVpLWlucHV0LWZvY3VzZWRcIilcbiAgICApLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KG9uUHJlc3NFbnRlcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KG9uS2V5RG93bikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KG9uQmx1cikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgZXhwZWN0KG9uRm9jdXMpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLE9BQU9BLEtBQVAsSUFBZ0JDLFNBQWhCLFFBQWlDLE9BQWpDO0FBQ0EsT0FBT0MsS0FBUCxNQUFrQixPQUFsQjtBQUNBLFNBQVNDLEtBQVQsRUFBZ0JDLE1BQWhCLFFBQThCLFFBQTlCO0FBQ0EsT0FBT0MsWUFBUCxNQUF5QixxQkFBekI7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLElBQWxCO0FBQ0EsT0FBT0MsSUFBUCxNQUFpQixZQUFqQjtBQUVBLElBQU1DLElBQUksR0FBR04sS0FBSyxDQUFDTSxJQUFOLENBQVdDLE9BQVgsRUFBb0IsT0FBcEIsQ0FBYjs7SUFFTUMsWTs7Ozs7Ozs7Ozs7Ozs7O1VBQ0pDLEssR0FBUTtNQUNOQyxLQUFLLEVBQUUsT0FERDtNQUVOQyxXQUFXLEVBQUUsb0JBQUMsSUFBRDtRQUFNLElBQUksRUFBQztNQUFYO0lBRlAsQzs7Ozs7O1dBS1Isa0JBQVM7TUFBQTs7TUFDUCxrQkFBa0MsS0FBS0MsS0FBdkM7TUFBQSxJQUFRQyxVQUFSLGVBQVFBLFVBQVI7TUFBQSxJQUF1QkMsTUFBdkI7O01BQ0Esa0JBQStCLEtBQUtMLEtBQXBDO01BQUEsSUFBUUUsV0FBUixlQUFRQSxXQUFSO01BQUEsSUFBcUJELEtBQXJCLGVBQXFCQSxLQUFyQjtNQUNBLE9BQ0Usb0JBQUMsS0FBRDtRQUNFLFVBQVUsRUFBRUcsVUFEZDtRQUVFLFdBQVcsRUFBRUYsV0FGZjtRQUdFLEtBQUssRUFBRSxFQUhUO1FBSUUsS0FBSyxFQUFFRCxLQUpUO1FBS0UsUUFBUSxFQUFFO1VBQUEsSUFBb0JLLEdBQXBCLFFBQUdDLE1BQUgsQ0FBYU4sS0FBYjtVQUFBLE9BQWdDLE1BQUksQ0FBQ08sUUFBTCxDQUFjO1lBQUVQLEtBQUssRUFBRUs7VUFBVCxDQUFkLENBQWhDO1FBQUE7TUFMWixHQU1NRCxNQU5OLEVBREY7SUFVRDs7OztFQW5Cd0JmLFM7O0lBc0JyQm1CLGU7Ozs7Ozs7Ozs7Ozs7OztXQUNKVCxLLEdBQVE7TUFDTkMsS0FBSyxFQUFFO0lBREQsQzs7Ozs7O1dBSVIsa0JBQVM7TUFBQTs7TUFDUCxtQkFBa0MsS0FBS0UsS0FBdkM7TUFBQSxJQUFRQyxVQUFSLGdCQUFRQSxVQUFSO01BQUEsSUFBdUJDLE1BQXZCOztNQUNBLElBQVFKLEtBQVIsR0FBa0IsS0FBS0QsS0FBdkIsQ0FBUUMsS0FBUjtNQUNBLE9BQ0Usb0JBQUMsS0FBRCxDQUFPLFFBQVA7UUFDRSxVQUFVLEVBQUVHLFVBRGQ7UUFFRSxLQUFLLEVBQUUsRUFGVDtRQUdFLEtBQUssRUFBRUgsS0FIVDtRQUlFLFFBQVEsRUFBRTtVQUFBLElBQW9CSyxHQUFwQixTQUFHQyxNQUFILENBQWFOLEtBQWI7VUFBQSxPQUFnQyxNQUFJLENBQUNPLFFBQUwsQ0FBYztZQUFFUCxLQUFLLEVBQUVLO1VBQVQsQ0FBZCxDQUFoQztRQUFBO01BSlosR0FLTUQsTUFMTixFQURGO0lBU0Q7Ozs7RUFqQjJCZixTOztBQW9COUJvQixRQUFRLENBQUMsT0FBRCxFQUFVLFlBQU07RUFDdEJDLFNBQVMsQ0FBQyxZQUFNO0lBQ2RDLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBTyxDQUFDQyxTQUE5QixFQUF5QyxhQUF6QyxFQUF3RDtNQUN0REMsUUFBUSxFQUFFLElBRDRDO01BRXREQyxZQUFZLEVBQUUsSUFGd0M7TUFHdERoQixLQUFLLEVBQUU7SUFIK0MsQ0FBeEQ7RUFLRCxDQU5RLENBQVQ7RUFRQWlCLEVBQUUsQ0FBQyxNQUFELEVBQVMsWUFBTTtJQUNmLElBQU1DLE9BQU8sR0FBR3pCLFlBQVksQ0FBQzBCLE1BQWIsQ0FBb0Isb0JBQUMsS0FBRCxPQUFwQixDQUFoQjtJQUNBQyxNQUFNLENBQUNGLE9BQUQsQ0FBTixDQUFnQkcsZUFBaEI7RUFDRCxDQUhDLENBQUY7RUFJQUosRUFBRSxDQUFDLFdBQUQsRUFBYyxZQUFNO0lBQ3BCLElBQU1DLE9BQU8sR0FBR3pCLFlBQVksQ0FBQzBCLE1BQWIsQ0FBb0Isb0JBQUMsS0FBRCxDQUFPLFFBQVAsT0FBcEIsQ0FBaEI7SUFDQUMsTUFBTSxDQUFDRixPQUFELENBQU4sQ0FBZ0JHLGVBQWhCO0VBQ0QsQ0FIQyxDQUFGO0VBSUFKLEVBQUUsQ0FBQyxzQkFBRCxFQUF5QixZQUFNO0lBQy9CekIsTUFBTSxDQUFDLG9CQUFDLEtBQUQ7TUFBTyxjQUFjO0lBQXJCLEVBQUQsQ0FBTjtJQUNBQSxNQUFNLENBQUMsb0JBQUMsS0FBRDtNQUFPLGNBQWMsTUFBckI7TUFBc0IsS0FBSyxFQUFDO0lBQTVCLEVBQUQsQ0FBTjtJQUNBNEIsTUFBTSxDQUFDeEIsSUFBSSxDQUFDMEIsVUFBTixDQUFOLENBQXdCQyxPQUF4QixDQUFnQyxJQUFoQztJQUNBM0IsSUFBSSxDQUFDNEIsT0FBTDtFQUNELENBTEMsQ0FBRjtFQU1BUCxFQUFFLENBQUMsYUFBRCxFQUFnQixZQUFNO0lBQ3RCekIsTUFBTSxDQUFDLG9CQUFDLEtBQUQ7TUFBTyxLQUFLLEVBQUUsRUFBZDtNQUFrQixZQUFZLEVBQUU7SUFBaEMsRUFBRCxDQUFOO0lBQ0E0QixNQUFNLENBQUN4QixJQUFJLENBQUMwQixVQUFOLENBQU4sQ0FBd0JDLE9BQXhCLENBQWdDLElBQWhDO0lBQ0EzQixJQUFJLENBQUM0QixPQUFMO0VBQ0QsQ0FKQyxDQUFGO0VBS0FQLEVBQUUsQ0FBQyxlQUFELEVBQWtCLFlBQU07SUFDeEIsSUFBTVEsUUFBUSxHQUFHbEMsS0FBSyxDQUFDLG9CQUFDLFlBQUQ7TUFBYyxVQUFVO0lBQXhCLEVBQUQsQ0FBdEI7SUFDQSxJQUFNbUMsUUFBUSxHQUFHbkMsS0FBSyxDQUFDLG9CQUFDLFlBQUQ7TUFBYyxVQUFVLEVBQUU7SUFBMUIsRUFBRCxDQUF0QjtJQUNBa0MsUUFBUSxDQUFDRSxJQUFULENBQWMsT0FBZCxFQUF1QkMsUUFBdkIsQ0FBZ0MsUUFBaEMsRUFBMEM7TUFBRXRCLE1BQU0sRUFBRTtRQUFFTixLQUFLLEVBQUU7TUFBVDtJQUFWLENBQTFDO0lBQ0EwQixRQUFRLENBQUNDLElBQVQsQ0FBYyxPQUFkLEVBQXVCQyxRQUF2QixDQUFnQyxRQUFoQyxFQUEwQztNQUFFdEIsTUFBTSxFQUFFO1FBQUVOLEtBQUssRUFBRTtNQUFUO0lBQVYsQ0FBMUM7SUFDQW9CLE1BQU0sQ0FBQ0ssUUFBUSxDQUFDRSxJQUFULENBQWMsbUJBQWQsRUFBbUNFLElBQW5DLEVBQUQsQ0FBTixDQUFrRE4sT0FBbEQsQ0FBMEQsTUFBMUQ7SUFDQUgsTUFBTSxDQUFDTSxRQUFRLENBQUNDLElBQVQsQ0FBYyxtQkFBZCxFQUFtQ0UsSUFBbkMsRUFBRCxDQUFOLENBQWtETixPQUFsRCxDQUEwRCxNQUExRDtFQUNELENBUEMsQ0FBRjtFQVFBTixFQUFFLENBQUMsa0NBQUQsRUFBcUMsWUFBTTtJQUMzQyxJQUFNQyxPQUFPLEdBQUczQixLQUFLLENBQ25CLG9CQUFDLEtBQUQ7TUFDRSxXQUFXLEVBQUUsb0JBQUMsSUFBRDtRQUFNLElBQUksRUFBQztNQUFYLEVBRGY7TUFFRSxZQUFZLEVBQUUsb0JBQUMsSUFBRDtRQUFNLElBQUksRUFBQztNQUFYO0lBRmhCLEVBRG1CLENBQXJCO0lBTUEsSUFBTXVDLElBQUksR0FBR1osT0FBTyxDQUFDUyxJQUFSLENBQWEsa0JBQWIsQ0FBYjtJQUNBLElBQU1JLEtBQUssR0FBR2IsT0FBTyxDQUFDUyxJQUFSLENBQWEsbUJBQWIsQ0FBZDtJQUNBRyxJQUFJLENBQUNGLFFBQUwsQ0FBYyxPQUFkO0lBQ0FHLEtBQUssQ0FBQ0gsUUFBTixDQUFlLE9BQWY7RUFDRCxDQVhDLENBQUY7RUFZQVgsRUFBRSxDQUFDLHdCQUFELEVBQTJCLFlBQU07SUFDakMsSUFBTUMsT0FBTyxHQUFHM0IsS0FBSyxDQUFDLG9CQUFDLFlBQUQsT0FBRCxDQUFyQjtJQUNBMkIsT0FBTyxDQUFDWCxRQUFSLENBQWlCO01BQUVOLFdBQVcsRUFBRTtJQUFmLENBQWpCO0lBQ0FpQixPQUFPLENBQUNjLFFBQVIsQ0FBaUI7TUFBRUMsWUFBWSxFQUFFLG9CQUFDLElBQUQ7UUFBTSxJQUFJLEVBQUM7TUFBWDtJQUFoQixDQUFqQjtJQUNBZixPQUFPLENBQUNjLFFBQVIsQ0FBaUI7TUFBRUMsWUFBWSxFQUFFO0lBQWhCLENBQWpCO0VBQ0QsQ0FMQyxDQUFGO0VBTUFoQixFQUFFLENBQUMsTUFBRCxFQUFTLFlBQU07SUFDZixJQUFNaUIsWUFBWSxHQUFHQyxJQUFJLENBQUNDLEVBQUwsRUFBckI7SUFDQSxJQUFNQyxTQUFTLEdBQUdGLElBQUksQ0FBQ0MsRUFBTCxFQUFsQjtJQUNBLElBQU1FLE1BQU0sR0FBR0gsSUFBSSxDQUFDQyxFQUFMLEVBQWY7SUFDQSxJQUFNRyxPQUFPLEdBQUdKLElBQUksQ0FBQ0MsRUFBTCxFQUFoQjtJQUVBLElBQU1sQixPQUFPLEdBQUczQixLQUFLLENBQ25CLG9CQUFDLEtBQUQ7TUFDRSxZQUFZLEVBQUUyQyxZQURoQjtNQUVFLFNBQVMsRUFBRUcsU0FGYjtNQUdFLE1BQU0sRUFBRUMsTUFIVjtNQUlFLE9BQU8sRUFBRUM7SUFKWCxFQURtQixDQUFyQjtJQVFBckIsT0FBTyxDQUFDUyxJQUFSLENBQWEsT0FBYixFQUFzQkMsUUFBdEIsQ0FBK0IsU0FBL0IsRUFBMEM7TUFBRVksR0FBRyxFQUFFLE9BQVA7TUFBZ0JDLE9BQU8sRUFBRTtJQUF6QixDQUExQztJQUNBdkIsT0FBTyxDQUFDUyxJQUFSLENBQWEsT0FBYixFQUFzQkMsUUFBdEIsQ0FBK0IsT0FBL0I7SUFDQVYsT0FBTyxDQUFDUyxJQUFSLENBQWEsT0FBYixFQUFzQkMsUUFBdEIsQ0FBK0IsTUFBL0I7SUFDQVIsTUFBTSxDQUFDYyxZQUFELENBQU4sQ0FBcUJRLHFCQUFyQixDQUEyQyxDQUEzQztJQUNBdEIsTUFBTSxDQUFDaUIsU0FBRCxDQUFOLENBQWtCSyxxQkFBbEIsQ0FBd0MsQ0FBeEM7SUFDQXRCLE1BQU0sQ0FBQ2tCLE1BQUQsQ0FBTixDQUFlSSxxQkFBZixDQUFxQyxDQUFyQztJQUNBdEIsTUFBTSxDQUFDbUIsT0FBRCxDQUFOLENBQWdCRyxxQkFBaEIsQ0FBc0MsQ0FBdEM7RUFDRCxDQXJCQyxDQUFGO0VBc0JBekIsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBTTtJQUN2QixJQUFNQyxPQUFPLEdBQUczQixLQUFLLENBQUMsb0JBQUMsWUFBRDtNQUFjLGFBQWEsRUFBRTtRQUFFb0QsU0FBUyxFQUFFO01BQWI7SUFBN0IsRUFBRCxDQUFyQjtJQUNBekIsT0FBTyxDQUFDWCxRQUFSLENBQWlCO01BQUVQLEtBQUssRUFBRTtJQUFULENBQWpCO0lBQ0FrQixPQUFPLENBQUMwQixNQUFSO0lBQ0F4QixNQUFNLENBQUNGLE9BQU8sQ0FBQ1MsSUFBUixDQUFhLE9BQWIsRUFBc0JrQixHQUF0QixDQUEwQixDQUExQixFQUE2QjNDLEtBQTdCLENBQW1DRixLQUFwQyxDQUFOLENBQWlEOEMsSUFBakQsQ0FBc0QsS0FBdEQ7RUFDRCxDQUxDLENBQUY7RUFPQTdCLEVBQUUsQ0FBQyxnQkFBRCxFQUFtQixZQUFNO0lBQ3pCLElBQU1DLE9BQU8sR0FBR3pCLFlBQVksQ0FBQzBCLE1BQWIsQ0FBb0Isb0JBQUMsS0FBRCxDQUFPLFFBQVAsT0FBcEIsQ0FBaEI7SUFDQUMsTUFBTSxDQUFDRixPQUFELENBQU4sQ0FBZ0JHLGVBQWhCO0VBQ0QsQ0FIQyxDQUFGO0VBSUFKLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixZQUFNO0lBQ2xDekIsTUFBTSxDQUFDLG9CQUFDLEtBQUQsQ0FBTyxRQUFQO01BQWdCLEtBQUssRUFBRSxFQUF2QjtNQUEyQixNQUFNLEVBQUM7SUFBbEMsRUFBRCxDQUFOO0lBQ0E0QixNQUFNLENBQUN4QixJQUFJLENBQUMwQixVQUFOLENBQU4sQ0FBd0JDLE9BQXhCLENBQWdDLElBQWhDO0VBQ0QsQ0FIQyxDQUFGO0VBSUFOLEVBQUUsQ0FBQyx5QkFBRCxFQUE0QixZQUFNO0lBQ2xDLElBQU1RLFFBQVEsR0FBR2xDLEtBQUssQ0FBQyxvQkFBQyxlQUFEO01BQWlCLFVBQVU7SUFBM0IsRUFBRCxDQUF0QjtJQUNBLElBQU1tQyxRQUFRLEdBQUduQyxLQUFLLENBQUMsb0JBQUMsZUFBRDtNQUFpQixVQUFVLEVBQUU7SUFBN0IsRUFBRCxDQUF0QjtJQUNBa0MsUUFBUSxDQUNMRSxJQURILENBQ1EsVUFEUixFQUVHQyxRQUZILENBRVksUUFGWixFQUVzQjtNQUFFdEIsTUFBTSxFQUFFO1FBQUVOLEtBQUssRUFBRTtNQUFUO0lBQVYsQ0FGdEI7SUFHQTBCLFFBQVEsQ0FDTEMsSUFESCxDQUNRLFVBRFIsRUFFR0MsUUFGSCxDQUVZLFFBRlosRUFFc0I7TUFBRXRCLE1BQU0sRUFBRTtRQUFFTixLQUFLLEVBQUU7TUFBVDtJQUFWLENBRnRCO0lBR0FvQixNQUFNLENBQUNLLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjLG1CQUFkLEVBQW1DRSxJQUFuQyxFQUFELENBQU4sQ0FBa0ROLE9BQWxELENBQTBELE1BQTFEO0lBQ0FILE1BQU0sQ0FBQ00sUUFBUSxDQUFDQyxJQUFULENBQWMsbUJBQWQsRUFBbUNFLElBQW5DLEVBQUQsQ0FBTixDQUFrRE4sT0FBbEQsQ0FBMEQsTUFBMUQ7RUFDRCxDQVhDLENBQUY7RUFZQU4sRUFBRSxDQUFDLGdCQUFELEVBQW1CLFlBQU07SUFDekIsSUFBTWlCLFlBQVksR0FBR0MsSUFBSSxDQUFDQyxFQUFMLEVBQXJCO0lBQ0EsSUFBTUMsU0FBUyxHQUFHRixJQUFJLENBQUNDLEVBQUwsRUFBbEI7SUFDQSxJQUFNRSxNQUFNLEdBQUdILElBQUksQ0FBQ0MsRUFBTCxFQUFmO0lBQ0EsSUFBTUcsT0FBTyxHQUFHSixJQUFJLENBQUNDLEVBQUwsRUFBaEI7SUFFQSxJQUFNbEIsT0FBTyxHQUFHM0IsS0FBSyxDQUNuQixvQkFBQyxLQUFELENBQU8sUUFBUDtNQUNFLFlBQVksRUFBRTJDLFlBRGhCO01BRUUsU0FBUyxFQUFFRyxTQUZiO01BR0UsTUFBTSxFQUFFQyxNQUhWO01BSUUsT0FBTyxFQUFFQztJQUpYLEVBRG1CLENBQXJCO0lBUUFyQixPQUFPLENBQUNTLElBQVIsQ0FBYSxVQUFiLEVBQXlCQyxRQUF6QixDQUFrQyxTQUFsQyxFQUE2QztNQUFFWSxHQUFHLEVBQUUsT0FBUDtNQUFnQkMsT0FBTyxFQUFFO0lBQXpCLENBQTdDO0lBQ0F2QixPQUFPLENBQUNTLElBQVIsQ0FBYSxVQUFiLEVBQXlCQyxRQUF6QixDQUFrQyxPQUFsQztJQUNBUixNQUFNLENBQ0pGLE9BQU8sQ0FDSlMsSUFESCxDQUNRLHFCQURSLEVBRUdvQixFQUZILENBRU0sQ0FGTixFQUdHN0MsS0FISCxHQUlHOEMsU0FKSCxDQUlhQyxRQUpiLENBSXNCLG9CQUp0QixDQURJLENBQU4sQ0FNRUgsSUFORixDQU1PLElBTlA7SUFPQTVCLE9BQU8sQ0FBQ1MsSUFBUixDQUFhLFVBQWIsRUFBeUJDLFFBQXpCLENBQWtDLE1BQWxDO0lBQ0FSLE1BQU0sQ0FDSkYsT0FBTyxDQUNKUyxJQURILENBQ1EscUJBRFIsRUFFR29CLEVBRkgsQ0FFTSxDQUZOLEVBR0c3QyxLQUhILEdBSUc4QyxTQUpILENBSWFDLFFBSmIsQ0FJc0Isb0JBSnRCLENBREksQ0FBTixDQU1FSCxJQU5GLENBTU8sS0FOUDtJQU9BMUIsTUFBTSxDQUFDYyxZQUFELENBQU4sQ0FBcUJRLHFCQUFyQixDQUEyQyxDQUEzQztJQUNBdEIsTUFBTSxDQUFDaUIsU0FBRCxDQUFOLENBQWtCSyxxQkFBbEIsQ0FBd0MsQ0FBeEM7SUFDQXRCLE1BQU0sQ0FBQ2tCLE1BQUQsQ0FBTixDQUFlSSxxQkFBZixDQUFxQyxDQUFyQztJQUNBdEIsTUFBTSxDQUFDbUIsT0FBRCxDQUFOLENBQWdCRyxxQkFBaEIsQ0FBc0MsQ0FBdEM7RUFDRCxDQW5DQyxDQUFGO0FBb0NELENBM0lPLENBQVIifQ==