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>
244 lines (221 loc) • 29.6 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); }
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 _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 { mount } from "enzyme";
import TestRenderer from "react-test-renderer";
import DatePicker from "..";
import { convertDateToString } from "../core";
import { act } from "react-dom/test-utils";
var DatePickerMounter = function (_Component) {
_inherits(DatePickerMounter, _Component);
var _super = _createSuper(DatePickerMounter);
function DatePickerMounter() {
var _this;
_classCallCheck(this, DatePickerMounter);
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 = {
component: null,
value: new Date(),
visible: true
};
return _this;
}
_createClass(DatePickerMounter, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$state = this.state,
value = _this$state.value,
visible = _this$state.visible;
return React.createElement(DatePicker, _extends({
shortcuts: [{
label: "祖国生日",
value: new Date("2020-10-01")
}],
ref: function ref(component) {
if (!_this2.state.component) {
_this2.setState({
component: component
});
}
},
closeOnSelect: true,
value: value,
visible: visible,
onChange: function onChange(val) {
return _this2.setState({
value: val
});
},
onVisibleChange: function onVisibleChange(bool) {
return _this2.setState({
visible: bool
});
}
}, this.props));
}
}]);
return DatePickerMounter;
}(Component);
describe("DatePicker", function () {
beforeAll(function () {
jest.useFakeTimers();
});
afterAll(function () {
jest.useRealTimers();
});
it("是否正确渲染", function () {
var wrapper = TestRenderer.create(React.createElement(DatePicker, null));
expect(wrapper).toMatchSnapshot();
});
it("内部驱动", function () {
var val = new Date();
var wrapper = mount(React.createElement(DatePicker, {
defaultValue: val,
defaultVisible: false,
closeOnSelect: true
}));
expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val));
wrapper.find("input").simulate("focus");
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
wrapper.find("input").simulate("change", {
target: {
value: ""
}
});
expect(wrapper.find("input").props().value).toBe("");
wrapper.find("input").simulate("change", {
target: {
value: "2020-02-22"
}
});
expect(wrapper.find("input").props().value).toBe("2020-02-22");
act(function () {
wrapper.find("input").simulate("keydown", {
key: "enter",
keyCode: 13
});
jest.runAllTimers();
wrapper.update();
expect(wrapper.find("Popover").at(0).props().visible).toBe(false);
});
act(function () {
wrapper.find(".adui-date-day").at(14).simulate("click");
var expectedVal = convertDateToString(new Date(wrapper.find(".adui-date-day").at(14).props()["aria-label"]));
jest.advanceTimersByTime(350);
wrapper.update();
expect(wrapper.find("input").at(0).props().value).toBe(expectedVal);
expect(wrapper.find("Popover").at(0).props().visible).toBe(false);
});
});
it("外部控制", function () {
var val = new Date();
var wrapper = mount(React.createElement(DatePicker, {
value: new Date(),
visible: true,
closeOnSelect: true
}));
expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val));
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
act(function () {
wrapper.find(".adui-date-day").at(14).simulate("click");
jest.advanceTimersByTime(350);
wrapper.update();
expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val));
});
act(function () {
wrapper.find(".adui-date-day").at(15).simulate("click");
jest.advanceTimersByTime(350);
wrapper.update();
expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val));
expect(wrapper.find("Popover").at(0).props().visible).toBe(true);
});
var mounter = mount(React.createElement(DatePickerMounter, null));
var today = convertDateToString(new Date());
mounter.find("input").simulate("change", {
target: {
value: "2020-02-22"
}
});
expect(convertDateToString(mounter.state().value)).toBe("2020-02-22");
mounter.find("input").simulate("change", {
target: {
value: "2020-02-31"
}
});
expect(convertDateToString(mounter.state().value)).toBe("2020-02-22");
mounter.find("input").simulate("change", {
target: {
value: ""
}
});
expect(convertDateToString(mounter.state().value)).toBe("");
expect(mounter.find("Popover").at(0).props().visible).toBe(true);
act(function () {
mounter.find(".adui-date-day").at(15).simulate("click");
jest.runAllTimers();
mounter.update();
expect(mounter.find("Popover").at(0).props().visible).toBe(false);
});
});
it("DayPicker 操作", function () {
var today = new Date();
var wrapper = mount(React.createElement(DatePickerMounter, null));
wrapper.find("button").at(0).simulate("click");
act(function () {
wrapper.find(".adui-date-day").at(15).simulate("click");
jest.runAllTimers();
wrapper.update();
if (today.getFullYear() > wrapper.state().value.getFullYear()) {
expect(today.getMonth() - wrapper.state().value.getMonth()).toBe(-11);
} else {
expect(today.getMonth() - wrapper.state().value.getMonth()).toBe(1);
}
});
act(function () {
wrapper.find(".adui-date-shortcut").at(0).simulate("click");
jest.runAllTimers();
wrapper.update();
expect(convertDateToString(wrapper.state().value)).toBe("2020-10-01");
});
var wrapperForCoverage0 = mount(React.createElement(DatePickerMounter, {
disabled: true
}));
wrapperForCoverage0.state().component.handleVisibleChange(false);
jest.runAllTimers();
});
it("DayPicker 年月切换", function () {
var wrapper = mount(React.createElement(DatePickerMounter, null));
act(function () {
wrapper.find("select").at(0).simulate("change", {
target: {
value: "2018"
}
});
wrapper.find("select").at(1).simulate("change", {
target: {
value: "1"
}
});
jest.runAllTimers();
wrapper.update();
wrapper.find(".adui-date-day").at(14).simulate("click");
jest.runAllTimers();
wrapper.update();
});
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbXBvbmVudCIsIm1vdW50IiwiVGVzdFJlbmRlcmVyIiwiRGF0ZVBpY2tlciIsImNvbnZlcnREYXRlVG9TdHJpbmciLCJhY3QiLCJEYXRlUGlja2VyTW91bnRlciIsInN0YXRlIiwiY29tcG9uZW50IiwidmFsdWUiLCJEYXRlIiwidmlzaWJsZSIsImxhYmVsIiwic2V0U3RhdGUiLCJ2YWwiLCJib29sIiwicHJvcHMiLCJkZXNjcmliZSIsImJlZm9yZUFsbCIsImplc3QiLCJ1c2VGYWtlVGltZXJzIiwiYWZ0ZXJBbGwiLCJ1c2VSZWFsVGltZXJzIiwiaXQiLCJ3cmFwcGVyIiwiY3JlYXRlIiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwiZmluZCIsImF0IiwidG9CZSIsInNpbXVsYXRlIiwidGFyZ2V0Iiwia2V5Iiwia2V5Q29kZSIsInJ1bkFsbFRpbWVycyIsInVwZGF0ZSIsImV4cGVjdGVkVmFsIiwiYWR2YW5jZVRpbWVyc0J5VGltZSIsIm1vdW50ZXIiLCJ0b2RheSIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJ3cmFwcGVyRm9yQ292ZXJhZ2UwIiwiaGFuZGxlVmlzaWJsZUNoYW5nZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvX190ZXN0c19fL0RhdGVQaWNrZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IG1vdW50IH0gZnJvbSBcImVuenltZVwiXG5pbXBvcnQgVGVzdFJlbmRlcmVyIGZyb20gXCJyZWFjdC10ZXN0LXJlbmRlcmVyXCJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gXCIuLlwiXG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVRvU3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIlxuaW1wb3J0IHsgYWN0IH0gZnJvbSBcInJlYWN0LWRvbS90ZXN0LXV0aWxzXCJcblxuY2xhc3MgRGF0ZVBpY2tlck1vdW50ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0ZSA9IHtcbiAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgdmFsdWU6IG5ldyBEYXRlKCksXG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHZhbHVlLCB2aXNpYmxlIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgIHNob3J0Y3V0cz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBcIuelluWbveeUn+aXpVwiLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKFwiMjAyMC0xMC0wMVwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICByZWY9eyhjb21wb25lbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhdGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29tcG9uZW50IH0pXG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWwpID0+IHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdmFsIH0pfVxuICAgICAgICBvblZpc2libGVDaGFuZ2U9eyhib29sKSA9PiB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogYm9vbCB9KX1cbiAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAvPlxuICAgIClcbiAgfVxufVxuXG5kZXNjcmliZShcIkRhdGVQaWNrZXJcIiwgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGplc3QudXNlRmFrZVRpbWVycygpXG4gIH0pXG5cbiAgYWZ0ZXJBbGwoKCkgPT4ge1xuICAgIGplc3QudXNlUmVhbFRpbWVycygpXG4gIH0pXG5cbiAgaXQoXCLmmK/lkKbmraPnoa7muLLmn5NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBUZXN0UmVuZGVyZXIuY3JlYXRlKDxEYXRlUGlja2VyIC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuXG4gIGl0KFwi5YaF6YOo6amx5YqoXCIsICgpID0+IHtcbiAgICBjb25zdCB2YWwgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgPERhdGVQaWNrZXIgZGVmYXVsdFZhbHVlPXt2YWx9IGRlZmF1bHRWaXNpYmxlPXtmYWxzZX0gY2xvc2VPblNlbGVjdCAvPlxuICAgIClcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgIGNvbnZlcnREYXRlVG9TdHJpbmcodmFsKVxuICAgIClcblxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiZm9jdXNcIilcblxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiXCIgfSB9KVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5wcm9wcygpLnZhbHVlKS50b0JlKFwiXCIpXG5cbiAgICB3cmFwcGVyXG4gICAgICAuZmluZChcImlucHV0XCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAyMC0wMi0yMlwiIH0gfSlcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikucHJvcHMoKS52YWx1ZSkudG9CZShcIjIwMjAtMDItMjJcIilcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImtleWRvd25cIiwgeyBrZXk6IFwiZW50ZXJcIiwga2V5Q29kZTogMTMgfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBjb25zdCBleHBlY3RlZFZhbCA9IGNvbnZlcnREYXRlVG9TdHJpbmcoXG4gICAgICAgIG5ldyBEYXRlKHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5wcm9wcygpW1wiYXJpYS1sYWJlbFwiXSlcbiAgICAgIClcbiAgICAgIC8vIOetieW+hSAzNTBtc1xuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDM1MClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKGV4cGVjdGVkVmFsKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCLlpJbpg6jmjqfliLZcIiwgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIOS7peS4i+mDveaYr+mqjOivgeWklumDqOaOp+WItuaXtuWGhemDqOeahOWkseaViFxuICAgICAqL1xuICAgIGNvbnN0IHZhbCA9IG5ldyBEYXRlKClcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8RGF0ZVBpY2tlciB2YWx1ZT17bmV3IERhdGUoKX0gdmlzaWJsZSBjbG9zZU9uU2VsZWN0IC8+XG4gICAgKVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgY29udmVydERhdGVUb1N0cmluZyh2YWwpXG4gICAgKVxuXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIC8vIOetieW+hSAzNTBtc1xuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDM1MClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgICBjb252ZXJ0RGF0ZVRvU3RyaW5nKHZhbClcbiAgICAgIClcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICAvLyDnrYnlvoUgMzUwbXNcbiAgICAgIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzNTApXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgICAgY29udmVydERhdGVUb1N0cmluZyh2YWwpXG4gICAgICApXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgLyoqXG4gICAgICog5Lul5LiL5piv6aqM6K+B5aSW6YOo5o6n5Yi25pe2IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyDnmoTmnInmlYhcbiAgICAgKi9cbiAgICBjb25zdCBtb3VudGVyID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIC8+KVxuICAgIGNvbnN0IHRvZGF5ID0gY29udmVydERhdGVUb1N0cmluZyhuZXcgRGF0ZSgpKVxuICAgIG1vdW50ZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTIyXCIgfSB9KVxuICAgIGV4cGVjdChjb252ZXJ0RGF0ZVRvU3RyaW5nKG1vdW50ZXIuc3RhdGUoKS52YWx1ZSkpLnRvQmUoXCIyMDIwLTAyLTIyXCIpXG4gICAgbW91bnRlclxuICAgICAgLmZpbmQoXCJpbnB1dFwiKVxuICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMjAtMDItMzFcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcIjIwMjAtMDItMjJcIilcbiAgICBtb3VudGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcIlwiKVxuICAgIGV4cGVjdChtb3VudGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICBtb3VudGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgbW91bnRlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KG1vdW50ZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJEYXlQaWNrZXIg5pON5L2cXCIsICgpID0+IHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKClcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIC8+KVxuICAgIHdyYXBwZXIuZmluZChcImJ1dHRvblwiKS5hdCgwKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBpZiAodG9kYXkuZ2V0RnVsbFllYXIoKSA+IHdyYXBwZXIuc3RhdGUoKS52YWx1ZS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICAgIGV4cGVjdCh0b2RheS5nZXRNb250aCgpIC0gd3JhcHBlci5zdGF0ZSgpLnZhbHVlLmdldE1vbnRoKCkpLnRvQmUoLTExKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhwZWN0KHRvZGF5LmdldE1vbnRoKCkgLSB3cmFwcGVyLnN0YXRlKCkudmFsdWUuZ2V0TW9udGgoKSkudG9CZSgxKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1zaG9ydGN1dFwiKS5hdCgwKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3QoY29udmVydERhdGVUb1N0cmluZyh3cmFwcGVyLnN0YXRlKCkudmFsdWUpKS50b0JlKFwiMjAyMC0xMC0wMVwiKVxuICAgIH0pXG5cbiAgICBjb25zdCB3cmFwcGVyRm9yQ292ZXJhZ2UwID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIGRpc2FibGVkIC8+KVxuICAgIHdyYXBwZXJGb3JDb3ZlcmFnZTAuc3RhdGUoKS5jb21wb25lbnQuaGFuZGxlVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gIH0pXG5cbiAgaXQoXCJEYXlQaWNrZXIg5bm05pyI5YiH5o2iXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIC8+KVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwic2VsZWN0XCIpXG4gICAgICAgIC5hdCgwKVxuICAgICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAxOFwiIH0gfSlcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCJzZWxlY3RcIilcbiAgICAgICAgLmF0KDEpXG4gICAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIxXCIgfSB9KVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICB9KVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsS0FBUCxJQUFnQkMsU0FBaEIsUUFBaUMsT0FBakM7QUFDQSxTQUFTQyxLQUFULFFBQXNCLFFBQXRCO0FBQ0EsT0FBT0MsWUFBUCxNQUF5QixxQkFBekI7QUFDQSxPQUFPQyxVQUFQLE1BQXVCLElBQXZCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsU0FBcEM7QUFDQSxTQUFTQyxHQUFULFFBQW9CLHNCQUFwQjs7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