wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/components/ConnectionsSettingsModal.tsx");import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { effect as _$effect } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { use as _$use } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { $$component as _$$component } from "/@solid-refresh";
import { $$refresh as _$$refresh } from "/@solid-refresh";
import { $$registry as _$$registry } from "/@solid-refresh";
const _REGISTRY = _$$registry();
const _tmpl$ = /*#__PURE__*/_$template(`<form><div class="join flex"><select name=sourceIP class="select join-item select-bordered"><option></option></select><input name=tagName class="input join-item input-bordered min-w-0 flex-1"placeholder=name>`),
  _tmpl$2 = /*#__PURE__*/_$template(`<option class=badge>`),
  _tmpl$3 = /*#__PURE__*/_$template(`<div class=sortable><div class="flex cursor-grab justify-between py-2"><span class=select-none></span><input type=checkbox class=toggle>`),
  _tmpl$4 = /*#__PURE__*/_$template(`<div>`),
  _tmpl$5 = /*#__PURE__*/_$template(`<div class="flex flex-col gap-4"><div><select class="select select-bordered w-full"></select></div><div><div class="flex flex-col gap-4"><div class="flex flex-col gap-2"></div></div></div><div>`),
  _tmpl$6 = /*#__PURE__*/_$template(`<option>`),
  _tmpl$7 = /*#__PURE__*/_$template(`<div class="badge badge-primary w-full items-center justify-between gap-2 py-4"><span class=truncate> (<!>)`);
import { createForm } from "/node_modules/.vite/deps/@felte_solid.js?v=22df2c05";
import { validator } from "/node_modules/.vite/deps/@felte_validator-zod.js?v=94100efe";
import { IconNetwork, IconX } from "/node_modules/.vite/deps/@tabler_icons-solidjs.js?v=000c47cd";
import { DragDropProvider, DragDropSensors, DragOverlay, SortableProvider, closestCenter, createSortable, useDragDropContext } from "/node_modules/@thisbeyond/solid-dnd/dist/dev.jsx";
import __vite__cjsImport12_lodash from "/node_modules/.vite/deps/lodash.js?v=dbaf0206"; const uniq = __vite__cjsImport12_lodash["uniq"];
import { For, Index, Show, createSignal } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { z } from "/node_modules/.vite/deps/zod.js?v=1d32e327";
import { Button, ConfigTitle, Modal } from "/src/components/index.ts";
import { CONNECTIONS_TABLE_INITIAL_COLUMN_ORDER, CONNECTIONS_TABLE_INITIAL_COLUMN_VISIBILITY, TAILWINDCSS_SIZE } from "/src/constants/index.ts";
import { useI18n } from "/src/i18n/index.tsx";
import { allConnections, clientSourceIPTags, connectionsTableSize, setClientSourceIPTags, setConnectionsTableSize } from "/src/signals/index.ts";
const TagClientSourceIPWithNameForm = _$$component(_REGISTRY, "TagClientSourceIPWithNameForm", () => {
  const schema = z.object({
    tagName: z.string().nonempty(),
    sourceIP: z.string().nonempty()
  });
  const [t] = useI18n();
  const {
    form,
    reset
  } = createForm({
    extend: validator({
      schema
    }),
    onSubmit: ({
      tagName,
      sourceIP
    }) => {
      setClientSourceIPTags(tags => {
        if (tags.some(tag => tag.tagName === tagName || tag.sourceIP === sourceIP)) {
          return tags;
        }
        return [...tags, {
          tagName,
          sourceIP
        }];
      });
      reset();
    }
  });
  return (() => {
    const _el$ = _tmpl$(),
      _el$2 = _el$.firstChild,
      _el$3 = _el$2.firstChild,
      _el$4 = _el$3.firstChild,
      _el$5 = _el$3.nextSibling;
    _$use(form, _el$, () => form);
    _$insert(_el$3, _$createComponent(Index, {
      get each() {
        return uniq(allConnections().map(({
          metadata: {
            sourceIP
          }
        }) => sourceIP)).sort().filter(sourceIP => !clientSourceIPTags().some(({
          sourceIP: tagSourceIP
        }) => tagSourceIP === sourceIP));
      },
      children: sourceIP => (() => {
        const _el$6 = _tmpl$2();
        _$insert(_el$6, sourceIP);
        _$effect(() => _el$6.value = sourceIP());
        return _el$6;
      })()
    }), null);
    _$insert(_el$2, _$createComponent(Button, {
      type: "submit",
      "class": "join-item",
      get children() {
        return t('tag');
      }
    }), null);
    return _el$;
  })();
}, {
  location: "src\\components\\ConnectionsSettingsModal.tsx:41:49"
});
export const ConnectionsSettingsModal = _$$component(_REGISTRY, "ConnectionsSettingsModal", props => {
  const [t] = useI18n();
  const [activeKey, setActiveKey] = createSignal(null);
  const onDragStart = ({
    draggable
  }) => setActiveKey(draggable.id);
  const onDragEnd = ({
    draggable,
    droppable
  }) => {
    if (draggable && droppable) {
      const currentItems = props.order;
      const fromIndex = currentItems.indexOf(draggable.id);
      const toIndex = currentItems.indexOf(droppable.id);
      if (fromIndex !== toIndex) {
        const updatedItems = currentItems.slice();
        updatedItems.splice(toIndex, 0, ...updatedItems.splice(fromIndex, 1));
        props.onOrderChange(updatedItems);
      }
    }
  };
  const FormRow = ({
    key
  }) => {
    const sortable = createSortable(key);
    const [state] = useDragDropContext();
    return (() => {
      const _el$7 = _tmpl$3(),
        _el$8 = _el$7.firstChild,
        _el$9 = _el$8.firstChild,
        _el$10 = _el$9.nextSibling;
      _$use(sortable, _el$7, () => true);
      _$insert(_el$9, () => t(key));
      _el$10.addEventListener("change", e => {
        props.onVisibleChange({
          ...props.visible,
          [key]: e.target.checked
        });
      });
      _$effect(_p$ => {
        const _v$ = !!sortable.isActiveDraggable,
          _v$2 = !!state.active.draggable;
        _v$ !== _p$._v$ && _el$7.classList.toggle("opacity-25", _p$._v$ = _v$);
        _v$2 !== _p$._v$2 && _el$7.classList.toggle("transition-transform", _p$._v$2 = _v$2);
        return _p$;
      }, {
        _v$: undefined,
        _v$2: undefined
      });
      _$effect(() => _el$10.checked = props.visible[key]);
      return _el$7;
    })();
  };
  return _$createComponent(Modal, {
    ref: el => props.ref?.(el),
    get icon() {
      return _$createComponent(IconNetwork, {
        size: 24
      });
    },
    get title() {
      return t('connectionsSettings');
    },
    get action() {
      return _$createComponent(Button, {
        "class": "btn-neutral btn-sm",
        onClick: () => {
          props.onOrderChange(CONNECTIONS_TABLE_INITIAL_COLUMN_ORDER);
          props.onVisibleChange(CONNECTIONS_TABLE_INITIAL_COLUMN_VISIBILITY);
        },
        get children() {
          return t('reset');
        }
      });
    },
    get children() {
      const _el$11 = _tmpl$5(),
        _el$12 = _el$11.firstChild,
        _el$13 = _el$12.firstChild,
        _el$14 = _el$12.nextSibling,
        _el$15 = _el$14.firstChild,
        _el$16 = _el$15.firstChild,
        _el$17 = _el$14.nextSibling;
      _$insert(_el$12, _$createComponent(ConfigTitle, {
        withDivider: true,
        get children() {
          return t('tableSize');
        }
      }), _el$13);
      _el$13.addEventListener("change", e => setConnectionsTableSize(e.target.value));
      _$insert(_el$13, _$createComponent(For, {
        get each() {
          return Object.values(TAILWINDCSS_SIZE);
        },
        children: value => (() => {
          const _el$19 = _tmpl$6();
          _el$19.value = value;
          _$insert(_el$19, () => t(value));
          return _el$19;
        })()
      }));
      _$insert(_el$14, _$createComponent(ConfigTitle, {
        withDivider: true,
        get children() {
          return t('tagClientSourceIPWithName');
        }
      }), _el$15);
      _$insert(_el$15, _$createComponent(TagClientSourceIPWithNameForm, {}), _el$16);
      _$insert(_el$16, _$createComponent(For, {
        get each() {
          return clientSourceIPTags();
        },
        children: ({
          tagName,
          sourceIP
        }) => (() => {
          const _el$20 = _tmpl$7(),
            _el$21 = _el$20.firstChild,
            _el$22 = _el$21.firstChild,
            _el$24 = _el$22.nextSibling,
            _el$23 = _el$24.nextSibling;
          _$insert(_el$21, tagName, _el$22);
          _$insert(_el$21, sourceIP, _el$24);
          _$insert(_el$20, _$createComponent(Button, {
            "class": "btn-circle btn-ghost btn-xs",
            onClick: () => setClientSourceIPTags(tags => tags.filter(tag => tag.tagName !== tagName)),
            get icon() {
              return _$createComponent(IconX, {
                size: 12
              });
            }
          }), null);
          return _el$20;
        })()
      }));
      _$insert(_el$17, _$createComponent(ConfigTitle, {
        withDivider: true,
        get children() {
          return t('sort');
        }
      }), null);
      _$insert(_el$17, _$createComponent(DragDropProvider, {
        onDragStart: onDragStart,
        onDragEnd: onDragEnd,
        collisionDetector: closestCenter,
        get children() {
          return [_$createComponent(DragDropSensors, {}), _$createComponent(SortableProvider, {
            get ids() {
              return props.order;
            },
            get children() {
              return _$createComponent(For, {
                get each() {
                  return props.order;
                },
                children: key => _$createComponent(FormRow, {
                  key: key
                })
              });
            }
          }), _$createComponent(DragOverlay, {
            get children() {
              return _$createComponent(Show, {
                get when() {
                  return activeKey();
                },
                get children() {
                  const _el$18 = _tmpl$4();
                  _$insert(_el$18, () => t(activeKey()));
                  return _el$18;
                }
              });
            }
          })];
        }
      }), null);
      _$effect(() => _el$13.value = connectionsTableSize());
      return _el$11;
    }
  });
}, {
  location: "src\\components\\ConnectionsSettingsModal.tsx:108:40"
});
if (import.meta.hot) {
  _$$refresh("vite", import.meta.hot, _REGISTRY);
  import.meta.hot.accept();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGb3JtIiwidmFsaWRhdG9yIiwiSWNvbk5ldHdvcmsiLCJJY29uWCIsIkRyYWdEcm9wUHJvdmlkZXIiLCJEcmFnRHJvcFNlbnNvcnMiLCJEcmFnT3ZlcmxheSIsIlNvcnRhYmxlUHJvdmlkZXIiLCJjbG9zZXN0Q2VudGVyIiwiY3JlYXRlU29ydGFibGUiLCJ1c2VEcmFnRHJvcENvbnRleHQiLCJ1bmlxIiwiRm9yIiwiSW5kZXgiLCJTaG93IiwiY3JlYXRlU2lnbmFsIiwieiIsIkJ1dHRvbiIsIkNvbmZpZ1RpdGxlIiwiTW9kYWwiLCJDT05ORUNUSU9OU19UQUJMRV9JTklUSUFMX0NPTFVNTl9PUkRFUiIsIkNPTk5FQ1RJT05TX1RBQkxFX0lOSVRJQUxfQ09MVU1OX1ZJU0lCSUxJVFkiLCJUQUlMV0lORENTU19TSVpFIiwidXNlSTE4biIsImFsbENvbm5lY3Rpb25zIiwiY2xpZW50U291cmNlSVBUYWdzIiwiY29ubmVjdGlvbnNUYWJsZVNpemUiLCJzZXRDbGllbnRTb3VyY2VJUFRhZ3MiLCJzZXRDb25uZWN0aW9uc1RhYmxlU2l6ZSIsIlRhZ0NsaWVudFNvdXJjZUlQV2l0aE5hbWVGb3JtIiwiXyQkY29tcG9uZW50IiwiX1JFR0lTVFJZIiwic2NoZW1hIiwib2JqZWN0IiwidGFnTmFtZSIsInN0cmluZyIsIm5vbmVtcHR5Iiwic291cmNlSVAiLCJ0IiwiZm9ybSIsInJlc2V0IiwiZXh0ZW5kIiwib25TdWJtaXQiLCJ0YWdzIiwic29tZSIsInRhZyIsIl9lbCQiLCJfdG1wbCQiLCJfZWwkMiIsImZpcnN0Q2hpbGQiLCJfZWwkMyIsIl9lbCQ0IiwiX2VsJDUiLCJuZXh0U2libGluZyIsIl8kdXNlIiwiXyRpbnNlcnQiLCJfJGNyZWF0ZUNvbXBvbmVudCIsImVhY2giLCJtYXAiLCJtZXRhZGF0YSIsInNvcnQiLCJmaWx0ZXIiLCJ0YWdTb3VyY2VJUCIsImNoaWxkcmVuIiwiX2VsJDYiLCJfdG1wbCQyIiwiXyRlZmZlY3QiLCJ2YWx1ZSIsInR5cGUiLCJsb2NhdGlvbiIsIkNvbm5lY3Rpb25zU2V0dGluZ3NNb2RhbCIsInByb3BzIiwiYWN0aXZlS2V5Iiwic2V0QWN0aXZlS2V5Iiwib25EcmFnU3RhcnQiLCJkcmFnZ2FibGUiLCJpZCIsIm9uRHJhZ0VuZCIsImRyb3BwYWJsZSIsImN1cnJlbnRJdGVtcyIsIm9yZGVyIiwiZnJvbUluZGV4IiwiaW5kZXhPZiIsInRvSW5kZXgiLCJ1cGRhdGVkSXRlbXMiLCJzbGljZSIsInNwbGljZSIsIm9uT3JkZXJDaGFuZ2UiLCJGb3JtUm93Iiwia2V5Iiwic29ydGFibGUiLCJzdGF0ZSIsIl9lbCQ3IiwiX3RtcGwkMyIsIl9lbCQ4IiwiX2VsJDkiLCJfZWwkMTAiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsIm9uVmlzaWJsZUNoYW5nZSIsInZpc2libGUiLCJ0YXJnZXQiLCJjaGVja2VkIiwiX3AkIiwiX3YkIiwiaXNBY3RpdmVEcmFnZ2FibGUiLCJfdiQyIiwiYWN0aXZlIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwidW5kZWZpbmVkIiwicmVmIiwiZWwiLCJpY29uIiwic2l6ZSIsInRpdGxlIiwiYWN0aW9uIiwib25DbGljayIsIl9lbCQxMSIsIl90bXBsJDUiLCJfZWwkMTIiLCJfZWwkMTMiLCJfZWwkMTQiLCJfZWwkMTUiLCJfZWwkMTYiLCJfZWwkMTciLCJ3aXRoRGl2aWRlciIsIk9iamVjdCIsInZhbHVlcyIsIl9lbCQxOSIsIl90bXBsJDYiLCJfZWwkMjAiLCJfdG1wbCQ3IiwiX2VsJDIxIiwiX2VsJDIyIiwiX2VsJDI0IiwiX2VsJDIzIiwiY29sbGlzaW9uRGV0ZWN0b3IiLCJpZHMiLCJ3aGVuIiwiX2VsJDE4IiwiX3RtcGwkNCIsImltcG9ydCIsIm1ldGEiLCJob3QiLCJfJCRyZWZyZXNoIiwiYWNjZXB0Il0sInNvdXJjZXMiOlsiQ29ubmVjdGlvbnNTZXR0aW5nc01vZGFsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVGb3JtIH0gZnJvbSAnQGZlbHRlL3NvbGlkJ1xyXG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tICdAZmVsdGUvdmFsaWRhdG9yLXpvZCdcclxuaW1wb3J0IHsgSWNvbk5ldHdvcmssIEljb25YIH0gZnJvbSAnQHRhYmxlci9pY29ucy1zb2xpZGpzJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRHJhZ0V2ZW50SGFuZGxlcixcclxuICBEcmFnZ2FibGUsXHJcbiAgRHJvcHBhYmxlLFxyXG59IGZyb20gJ0B0aGlzYmV5b25kL3NvbGlkLWRuZCdcclxuaW1wb3J0IHtcclxuICBEcmFnRHJvcFByb3ZpZGVyLFxyXG4gIERyYWdEcm9wU2Vuc29ycyxcclxuICBEcmFnT3ZlcmxheSxcclxuICBTb3J0YWJsZVByb3ZpZGVyLFxyXG4gIGNsb3Nlc3RDZW50ZXIsXHJcbiAgY3JlYXRlU29ydGFibGUsXHJcbiAgdXNlRHJhZ0Ryb3BDb250ZXh0LFxyXG59IGZyb20gJ0B0aGlzYmV5b25kL3NvbGlkLWRuZCdcclxuaW1wb3J0IHsgdW5pcSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBGb3IsIEluZGV4LCBTaG93LCBjcmVhdGVTaWduYWwgfSBmcm9tICdzb2xpZC1qcydcclxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCdcclxuaW1wb3J0IHsgQnV0dG9uLCBDb25maWdUaXRsZSwgTW9kYWwgfSBmcm9tICd+L2NvbXBvbmVudHMnXHJcbmltcG9ydCB7XHJcbiAgQ09OTkVDVElPTlNfVEFCTEVfQUNDRVNTT1JfS0VZLFxyXG4gIENPTk5FQ1RJT05TX1RBQkxFX0lOSVRJQUxfQ09MVU1OX09SREVSLFxyXG4gIENPTk5FQ1RJT05TX1RBQkxFX0lOSVRJQUxfQ09MVU1OX1ZJU0lCSUxJVFksXHJcbiAgVEFJTFdJTkRDU1NfU0laRSxcclxufSBmcm9tICd+L2NvbnN0YW50cydcclxuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gJ34vaTE4bidcclxuaW1wb3J0IHtcclxuICBhbGxDb25uZWN0aW9ucyxcclxuICBjbGllbnRTb3VyY2VJUFRhZ3MsXHJcbiAgY29ubmVjdGlvbnNUYWJsZVNpemUsXHJcbiAgc2V0Q2xpZW50U291cmNlSVBUYWdzLFxyXG4gIHNldENvbm5lY3Rpb25zVGFibGVTaXplLFxyXG59IGZyb20gJ34vc2lnbmFscydcclxuaW1wb3J0IHtcclxuICBDb25uZWN0aW9uc1RhYmxlQ29sdW1uT3JkZXIsXHJcbiAgQ29ubmVjdGlvbnNUYWJsZUNvbHVtblZpc2liaWxpdHksXHJcbn0gZnJvbSAnfi90eXBlcydcclxuXHJcbmNvbnN0IFRhZ0NsaWVudFNvdXJjZUlQV2l0aE5hbWVGb3JtOiBDb21wb25lbnQgPSAoKSA9PiB7XHJcbiAgY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xyXG4gICAgdGFnTmFtZTogei5zdHJpbmcoKS5ub25lbXB0eSgpLFxyXG4gICAgc291cmNlSVA6IHouc3RyaW5nKCkubm9uZW1wdHkoKSxcclxuICB9KVxyXG5cclxuICBjb25zdCBbdF0gPSB1c2VJMThuKClcclxuXHJcbiAgY29uc3QgeyBmb3JtLCByZXNldCB9ID0gY3JlYXRlRm9ybTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+Pih7XHJcbiAgICBleHRlbmQ6IHZhbGlkYXRvcih7IHNjaGVtYSB9KSxcclxuICAgIG9uU3VibWl0OiAoeyB0YWdOYW1lLCBzb3VyY2VJUCB9KSA9PiB7XHJcbiAgICAgIHNldENsaWVudFNvdXJjZUlQVGFncygodGFncykgPT4ge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRhZ3Muc29tZShcclxuICAgICAgICAgICAgKHRhZykgPT4gdGFnLnRhZ05hbWUgPT09IHRhZ05hbWUgfHwgdGFnLnNvdXJjZUlQID09PSBzb3VyY2VJUCxcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB0YWdzXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gWy4uLnRhZ3MsIHsgdGFnTmFtZSwgc291cmNlSVAgfV1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHJlc2V0KClcclxuICAgIH0sXHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxmb3JtIHVzZTpmb3JtPXtmb3JtfT5cclxuICAgICAgPGRpdiBjbGFzcz1cImpvaW4gZmxleFwiPlxyXG4gICAgICAgIDxzZWxlY3QgbmFtZT1cInNvdXJjZUlQXCIgY2xhc3M9XCJzZWxlY3Qgam9pbi1pdGVtIHNlbGVjdC1ib3JkZXJlZFwiPlxyXG4gICAgICAgICAgPG9wdGlvbiAvPlxyXG5cclxuICAgICAgICAgIDxJbmRleFxyXG4gICAgICAgICAgICBlYWNoPXt1bmlxKFxyXG4gICAgICAgICAgICAgIGFsbENvbm5lY3Rpb25zKCkubWFwKCh7IG1ldGFkYXRhOiB7IHNvdXJjZUlQIH0gfSkgPT4gc291cmNlSVApLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAoc291cmNlSVApID0+XHJcbiAgICAgICAgICAgICAgICAgICFjbGllbnRTb3VyY2VJUFRhZ3MoKS5zb21lKFxyXG4gICAgICAgICAgICAgICAgICAgICh7IHNvdXJjZUlQOiB0YWdTb3VyY2VJUCB9KSA9PiB0YWdTb3VyY2VJUCA9PT0gc291cmNlSVAsXHJcbiAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgeyhzb3VyY2VJUCkgPT4gKFxyXG4gICAgICAgICAgICAgIDxvcHRpb24gY2xhc3M9XCJiYWRnZVwiIHZhbHVlPXtzb3VyY2VJUCgpfT5cclxuICAgICAgICAgICAgICAgIHtzb3VyY2VJUCgpfVxyXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgPC9JbmRleD5cclxuICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBuYW1lPVwidGFnTmFtZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGpvaW4taXRlbSBpbnB1dC1ib3JkZXJlZCBtaW4tdy0wIGZsZXgtMVwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIm5hbWVcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiam9pbi1pdGVtXCI+XHJcbiAgICAgICAgICB7dCgndGFnJyl9XHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENvbm5lY3Rpb25zU2V0dGluZ3NNb2RhbCA9IChwcm9wczoge1xyXG4gIHJlZj86IChlbDogSFRNTERpYWxvZ0VsZW1lbnQpID0+IHZvaWRcclxuICBvcmRlcjogQ29ubmVjdGlvbnNUYWJsZUNvbHVtbk9yZGVyXHJcbiAgdmlzaWJsZTogQ29ubmVjdGlvbnNUYWJsZUNvbHVtblZpc2liaWxpdHlcclxuICBvbk9yZGVyQ2hhbmdlOiAodmFsdWU6IENvbm5lY3Rpb25zVGFibGVDb2x1bW5PcmRlcikgPT4gdm9pZFxyXG4gIG9uVmlzaWJsZUNoYW5nZTogKHZhbHVlOiBDb25uZWN0aW9uc1RhYmxlQ29sdW1uVmlzaWJpbGl0eSkgPT4gdm9pZFxyXG59KSA9PiB7XHJcbiAgY29uc3QgW3RdID0gdXNlSTE4bigpXHJcblxyXG4gIGNvbnN0IFthY3RpdmVLZXksIHNldEFjdGl2ZUtleV0gPVxyXG4gICAgY3JlYXRlU2lnbmFsPENPTk5FQ1RJT05TX1RBQkxFX0FDQ0VTU09SX0tFWSB8IG51bGw+KG51bGwpXHJcblxyXG4gIGNvbnN0IG9uRHJhZ1N0YXJ0ID0gKHsgZHJhZ2dhYmxlIH06IHsgZHJhZ2dhYmxlOiBEcmFnZ2FibGUgfSkgPT5cclxuICAgIHNldEFjdGl2ZUtleShkcmFnZ2FibGUuaWQgYXMgQ09OTkVDVElPTlNfVEFCTEVfQUNDRVNTT1JfS0VZKVxyXG4gIGNvbnN0IG9uRHJhZ0VuZCA9ICh7XHJcbiAgICBkcmFnZ2FibGUsXHJcbiAgICBkcm9wcGFibGUsXHJcbiAgfToge1xyXG4gICAgZHJhZ2dhYmxlOiBEcmFnZ2FibGVcclxuICAgIGRyb3BwYWJsZTogRHJvcHBhYmxlXHJcbiAgfSkgPT4ge1xyXG4gICAgaWYgKGRyYWdnYWJsZSAmJiBkcm9wcGFibGUpIHtcclxuICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gcHJvcHMub3JkZXJcclxuICAgICAgY29uc3QgZnJvbUluZGV4ID0gY3VycmVudEl0ZW1zLmluZGV4T2YoXHJcbiAgICAgICAgZHJhZ2dhYmxlLmlkIGFzIENPTk5FQ1RJT05TX1RBQkxFX0FDQ0VTU09SX0tFWSxcclxuICAgICAgKVxyXG4gICAgICBjb25zdCB0b0luZGV4ID0gY3VycmVudEl0ZW1zLmluZGV4T2YoXHJcbiAgICAgICAgZHJvcHBhYmxlLmlkIGFzIENPTk5FQ1RJT05TX1RBQkxFX0FDQ0VTU09SX0tFWSxcclxuICAgICAgKVxyXG5cclxuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdG9JbmRleCkge1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtcyA9IGN1cnJlbnRJdGVtcy5zbGljZSgpXHJcblxyXG4gICAgICAgIHVwZGF0ZWRJdGVtcy5zcGxpY2UodG9JbmRleCwgMCwgLi4udXBkYXRlZEl0ZW1zLnNwbGljZShmcm9tSW5kZXgsIDEpKVxyXG4gICAgICAgIHByb3BzLm9uT3JkZXJDaGFuZ2UodXBkYXRlZEl0ZW1zKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBGb3JtUm93OiBDb21wb25lbnQ8e1xyXG4gICAga2V5OiBDT05ORUNUSU9OU19UQUJMRV9BQ0NFU1NPUl9LRVlcclxuICB9PiA9ICh7IGtleSB9KSA9PiB7XHJcbiAgICBjb25zdCBzb3J0YWJsZSA9IGNyZWF0ZVNvcnRhYmxlKGtleSlcclxuICAgIGNvbnN0IFtzdGF0ZV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKSFcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdXNlOnNvcnRhYmxlXHJcbiAgICAgICAgY2xhc3M9XCJzb3J0YWJsZVwiXHJcbiAgICAgICAgY2xhc3NMaXN0PXt7XHJcbiAgICAgICAgICAnb3BhY2l0eS0yNSc6IHNvcnRhYmxlLmlzQWN0aXZlRHJhZ2dhYmxlLFxyXG4gICAgICAgICAgJ3RyYW5zaXRpb24tdHJhbnNmb3JtJzogISFzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlLFxyXG4gICAgICAgIH19XHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBjdXJzb3ItZ3JhYiBqdXN0aWZ5LWJldHdlZW4gcHktMlwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3Qtbm9uZVwiPnt0KGtleSl9PC9zcGFuPlxyXG5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInRvZ2dsZVwiXHJcbiAgICAgICAgICAgIGNoZWNrZWQ9e3Byb3BzLnZpc2libGVba2V5XX1cclxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcHJvcHMub25WaXNpYmxlQ2hhbmdlKHtcclxuICAgICAgICAgICAgICAgIC4uLnByb3BzLnZpc2libGUsXHJcbiAgICAgICAgICAgICAgICBba2V5XTogZS50YXJnZXQuY2hlY2tlZCxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPE1vZGFsXHJcbiAgICAgIHJlZj17KGVsKSA9PiBwcm9wcy5yZWY/LihlbCl9XHJcbiAgICAgIGljb249ezxJY29uTmV0d29yayBzaXplPXsyNH0gLz59XHJcbiAgICAgIHRpdGxlPXt0KCdjb25uZWN0aW9uc1NldHRpbmdzJyl9XHJcbiAgICAgIGFjdGlvbj17XHJcbiAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJidG4tbmV1dHJhbCBidG4tc21cIlxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICBwcm9wcy5vbk9yZGVyQ2hhbmdlKENPTk5FQ1RJT05TX1RBQkxFX0lOSVRJQUxfQ09MVU1OX09SREVSKVxyXG4gICAgICAgICAgICBwcm9wcy5vblZpc2libGVDaGFuZ2UoQ09OTkVDVElPTlNfVEFCTEVfSU5JVElBTF9DT0xVTU5fVklTSUJJTElUWSlcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3QoJ3Jlc2V0Jyl9XHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgIH1cclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPENvbmZpZ1RpdGxlIHdpdGhEaXZpZGVyPnt0KCd0YWJsZVNpemUnKX08L0NvbmZpZ1RpdGxlPlxyXG5cclxuICAgICAgICAgIDxzZWxlY3RcclxuICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3Qgc2VsZWN0LWJvcmRlcmVkIHctZnVsbFwiXHJcbiAgICAgICAgICAgIHZhbHVlPXtjb25uZWN0aW9uc1RhYmxlU2l6ZSgpfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XHJcbiAgICAgICAgICAgICAgc2V0Q29ubmVjdGlvbnNUYWJsZVNpemUoZS50YXJnZXQudmFsdWUgYXMgVEFJTFdJTkRDU1NfU0laRSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8Rm9yIGVhY2g9e09iamVjdC52YWx1ZXMoVEFJTFdJTkRDU1NfU0laRSl9PlxyXG4gICAgICAgICAgICAgIHsodmFsdWUpID0+IDxvcHRpb24gdmFsdWU9e3ZhbHVlfT57dCh2YWx1ZSl9PC9vcHRpb24+fVxyXG4gICAgICAgICAgICA8L0Zvcj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPENvbmZpZ1RpdGxlIHdpdGhEaXZpZGVyPlxyXG4gICAgICAgICAgICB7dCgndGFnQ2xpZW50U291cmNlSVBXaXRoTmFtZScpfVxyXG4gICAgICAgICAgPC9Db25maWdUaXRsZT5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxyXG4gICAgICAgICAgICA8VGFnQ2xpZW50U291cmNlSVBXaXRoTmFtZUZvcm0gLz5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgPEZvciBlYWNoPXtjbGllbnRTb3VyY2VJUFRhZ3MoKX0+XHJcbiAgICAgICAgICAgICAgICB7KHsgdGFnTmFtZSwgc291cmNlSVAgfSkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFkZ2UgYmFkZ2UtcHJpbWFyeSB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMiBweS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3RhZ05hbWV9ICh7c291cmNlSVB9KVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2lyY2xlIGJ0bi1naG9zdCBidG4teHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2xpZW50U291cmNlSVBUYWdzKCh0YWdzKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MuZmlsdGVyKCh0YWcpID0+IHRhZy50YWdOYW1lICE9PSB0YWdOYW1lKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PEljb25YIHNpemU9ezEyfSAvPn1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPC9Gb3I+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8Q29uZmlnVGl0bGUgd2l0aERpdmlkZXI+e3QoJ3NvcnQnKX08L0NvbmZpZ1RpdGxlPlxyXG5cclxuICAgICAgICAgIDxEcmFnRHJvcFByb3ZpZGVyXHJcbiAgICAgICAgICAgIG9uRHJhZ1N0YXJ0PXtvbkRyYWdTdGFydH1cclxuICAgICAgICAgICAgb25EcmFnRW5kPXtvbkRyYWdFbmQgYXMgRHJhZ0V2ZW50SGFuZGxlcn1cclxuICAgICAgICAgICAgY29sbGlzaW9uRGV0ZWN0b3I9e2Nsb3Nlc3RDZW50ZXJ9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxEcmFnRHJvcFNlbnNvcnMgLz5cclxuXHJcbiAgICAgICAgICAgIDxTb3J0YWJsZVByb3ZpZGVyIGlkcz17cHJvcHMub3JkZXJ9PlxyXG4gICAgICAgICAgICAgIDxGb3IgZWFjaD17cHJvcHMub3JkZXJ9Pnsoa2V5KSA9PiA8Rm9ybVJvdyBrZXk9e2tleX0gLz59PC9Gb3I+XHJcbiAgICAgICAgICAgIDwvU29ydGFibGVQcm92aWRlcj5cclxuXHJcbiAgICAgICAgICAgIDxEcmFnT3ZlcmxheT5cclxuICAgICAgICAgICAgICA8U2hvdyB3aGVuPXthY3RpdmVLZXkoKX0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2Pnt0KGFjdGl2ZUtleSgpISl9PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9TaG93PlxyXG4gICAgICAgICAgICA8L0RyYWdPdmVybGF5PlxyXG4gICAgICAgICAgPC9EcmFnRHJvcFByb3ZpZGVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvTW9kYWw+XHJcbiAgKVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVNBLFVBQVUsUUFBUSxjQUFjO0FBQ3pDLFNBQVNDLFNBQVMsUUFBUSxzQkFBc0I7QUFDaEQsU0FBU0MsV0FBVyxFQUFFQyxLQUFLLFFBQVEsdUJBQXVCO0FBTTFELFNBQ0VDLGdCQUFnQixFQUNoQkMsZUFBZSxFQUNmQyxXQUFXLEVBQ1hDLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxjQUFjLEVBQ2RDLGtCQUFrQixRQUNiLHVCQUF1QjtBQUM5QixTQUFTQyxJQUFJLFFBQVEsUUFBUTtBQUM3QixTQUFvQkMsR0FBRyxFQUFFQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsWUFBWSxRQUFRLFVBQVU7QUFDcEUsU0FBU0MsQ0FBQyxRQUFRLEtBQUs7QUFDdkIsU0FBU0MsTUFBTSxFQUFFQyxXQUFXLEVBQUVDLEtBQUssUUFBUSxjQUFjO0FBQ3pELFNBRUVDLHNDQUFzQyxFQUN0Q0MsMkNBQTJDLEVBQzNDQyxnQkFBZ0IsUUFDWCxhQUFhO0FBQ3BCLFNBQVNDLE9BQU8sUUFBUSxRQUFRO0FBQ2hDLFNBQ0VDLGNBQWMsRUFDZEMsa0JBQWtCLEVBQ2xCQyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMsdUJBQXVCLFFBQ2xCLFdBQVc7QUFNbEIsTUFBTUMsNkJBQXdDLEdBQUFDLFlBQUEsQ0FBQUMsU0FBQSxtQ0FBRyxNQUFNO0VBQ3JELE1BQU1DLE1BQU0sR0FBR2hCLENBQUMsQ0FBQ2lCLE1BQU0sQ0FBQztJQUN0QkMsT0FBTyxFQUFFbEIsQ0FBQyxDQUFDbUIsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUM7SUFDOUJDLFFBQVEs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