@browserless.io/browserless 2.12.0-beta-2 → 2.12.0-beta-4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/browserless.d.ts +1 -0
- package/build/browserless.js +6 -0
- package/build/browsers/chromium.cdp.d.ts +1 -1
- package/build/browsers/chromium.cdp.js +2 -2
- package/build/browsers/chromium.playwright.d.ts +2 -2
- package/build/browsers/chromium.playwright.js +7 -5
- package/build/browsers/firefox.playwright.d.ts +2 -2
- package/build/browsers/firefox.playwright.js +7 -5
- package/build/browsers/index.d.ts +3 -2
- package/build/browsers/index.js +40 -16
- package/build/browsers/webkit.playwright.d.ts +2 -2
- package/build/browsers/webkit.playwright.js +7 -5
- package/build/config.d.ts +11 -0
- package/build/config.js +16 -0
- package/build/routes/chrome/http/content.post.body.json +8 -8
- package/build/routes/chrome/http/pdf.post.body.json +8 -8
- package/build/routes/chrome/http/scrape.post.body.json +8 -8
- package/build/routes/chrome/http/screenshot.post.body.json +8 -8
- package/build/routes/chrome/tests/websocket.spec.js +18 -3
- package/build/routes/chromium/http/content.post.body.json +8 -8
- package/build/routes/chromium/http/pdf.post.body.json +8 -8
- package/build/routes/chromium/http/scrape.post.body.json +8 -8
- package/build/routes/chromium/http/screenshot.post.body.json +8 -8
- package/build/routes/chromium/tests/websocket.spec.js +18 -0
- package/build/routes/firefox/tests/websocket.spec.js +18 -1
- package/build/routes/webkit/tests/websocket.spec.js +18 -0
- package/build/types.d.ts +1 -1
- package/build/utils.d.ts +9 -0
- package/build/utils.js +9 -0
- package/docker/chromium/Dockerfile +2 -1
- package/docker/firefox/Dockerfile +2 -1
- package/docker/multi/Dockerfile +1 -1
- package/docker/webkit/Dockerfile +2 -1
- package/extensions/ublock/_locales/eu/messages.json +4 -4
- package/extensions/ublock/_locales/hi/messages.json +5 -5
- package/extensions/ublock/_locales/kn/messages.json +11 -11
- package/extensions/ublock/_locales/nb/messages.json +2 -2
- package/extensions/ublock/_locales/no/messages.json +2 -2
- package/extensions/ublock/_locales/ro/messages.json +1 -1
- package/extensions/ublock/_locales/sv/messages.json +1 -1
- package/extensions/ublock/_locales/zh_CN/messages.json +2 -2
- package/extensions/ublock/assets/assets.json +3 -8
- package/extensions/ublock/assets/resources/scriptlets.js +128 -31
- package/extensions/ublock/assets/thirdparties/easylist/easylist.txt +4870 -3560
- package/extensions/ublock/assets/thirdparties/easylist/easyprivacy.txt +662 -173
- package/extensions/ublock/assets/thirdparties/pgl.yoyo.org/as/serverlist +10 -42
- package/extensions/ublock/assets/thirdparties/publicsuffix.org/list/effective_tld_names.dat +241 -80
- package/extensions/ublock/assets/thirdparties/urlhaus-filter/urlhaus-filter-online.txt +2093 -1224
- package/extensions/ublock/assets/ublock/badlists.txt +2 -0
- package/extensions/ublock/assets/ublock/badware.min.txt +408 -287
- package/extensions/ublock/assets/ublock/filters.min.txt +947 -645
- package/extensions/ublock/assets/ublock/privacy.min.txt +43 -8
- package/extensions/ublock/assets/ublock/quick-fixes.min.txt +55 -93
- package/extensions/ublock/assets/ublock/unbreak.min.txt +52 -19
- package/extensions/ublock/css/1p-filters.css +2 -0
- package/extensions/ublock/css/codemirror.css +2 -2
- package/extensions/ublock/css/dashboard.css +2 -5
- package/extensions/ublock/css/epicker-ui.css +3 -3
- package/extensions/ublock/css/fa-icons.css +3 -0
- package/extensions/ublock/css/logger-ui-inspector.css +1 -0
- package/extensions/ublock/css/logger-ui.css +44 -32
- package/extensions/ublock/img/fontawesome/fontawesome-defs.svg +1 -0
- package/extensions/ublock/js/3p-filters.js +4 -5
- package/extensions/ublock/js/biditrie.js +16 -11
- package/extensions/ublock/js/cachestorage.js +37 -37
- package/extensions/ublock/js/contentscript-extra.js +0 -2
- package/extensions/ublock/js/contentscript.js +1 -6
- package/extensions/ublock/js/epicker-ui.js +28 -36
- package/extensions/ublock/js/fa-icons.js +1 -0
- package/extensions/ublock/js/hntrie.js +19 -13
- package/extensions/ublock/js/logger-ui-inspector.js +6 -13
- package/extensions/ublock/js/logger-ui.js +264 -264
- package/extensions/ublock/js/s14e-serializer.js +267 -264
- package/extensions/ublock/js/scriptlet-filtering.js +12 -18
- package/extensions/ublock/js/scriptlets/dom-inspector.js +1 -5
- package/extensions/ublock/js/scriptlets/epicker.js +53 -59
- package/extensions/ublock/js/start.js +0 -8
- package/extensions/ublock/js/storage.js +2 -9
- package/extensions/ublock/js/vapi-background.js +19 -20
- package/extensions/ublock/js/vapi-common.js +2 -7
- package/extensions/ublock/js/vapi.js +0 -4
- package/extensions/ublock/js/webext.js +23 -15
- package/extensions/ublock/logger-ui.html +24 -15
- package/extensions/ublock/manifest.json +2 -3
- package/package.json +18 -6
- package/src/browserless.ts +11 -0
- package/src/browsers/chromium.cdp.ts +2 -2
- package/src/browsers/chromium.playwright.ts +8 -4
- package/src/browsers/firefox.playwright.ts +8 -5
- package/src/browsers/index.ts +53 -18
- package/src/browsers/webkit.playwright.ts +8 -4
- package/src/config.ts +20 -0
- package/src/routes/chrome/tests/websocket.spec.ts +25 -4
- package/src/routes/chromium/tests/websocket.spec.ts +25 -0
- package/src/routes/firefox/tests/websocket.spec.ts +25 -1
- package/src/routes/webkit/tests/websocket.spec.ts +25 -0
- package/src/types.ts +1 -1
- package/src/utils.ts +9 -0
- package/static/docs/swagger.json +9 -9
- package/static/docs/swagger.min.json +9 -9
- package/static/function/client.js +95 -136
- package/static/function/index.html +95 -136
|
@@ -73,8 +73,8 @@ html#ublock0-epicker,
|
|
|
73
73
|
#ublock0-epicker section .codeMirrorContainer {
|
|
74
74
|
border: none;
|
|
75
75
|
box-sizing: border-box;
|
|
76
|
-
height:
|
|
77
|
-
max-height: min(
|
|
76
|
+
height: 10em;
|
|
77
|
+
max-height: min(10em, 10vh);
|
|
78
78
|
min-height: 1em;
|
|
79
79
|
padding: 2px;
|
|
80
80
|
width: 100%;
|
|
@@ -177,7 +177,7 @@ html#ublock0-epicker,
|
|
|
177
177
|
overflow: hidden;
|
|
178
178
|
}
|
|
179
179
|
#ublock0-epicker #candidateFilters {
|
|
180
|
-
max-height: min(
|
|
180
|
+
max-height: min(18em, 18vh);
|
|
181
181
|
overflow-y: auto;
|
|
182
182
|
}
|
|
183
183
|
#ublock0-epicker .changeFilter > li > span:nth-of-type(1) {
|
|
@@ -3,7 +3,7 @@ body {
|
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
height: 100vh;
|
|
5
5
|
height: 100svh;
|
|
6
|
-
overflow: hidden;
|
|
6
|
+
overflow-y: hidden;
|
|
7
7
|
width: 100vw;
|
|
8
8
|
}
|
|
9
9
|
textarea {
|
|
@@ -63,19 +63,28 @@ textarea {
|
|
|
63
63
|
=> https://devhints.io/css-system-font-stack
|
|
64
64
|
*/
|
|
65
65
|
#inspectors {
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-direction: column;
|
|
66
68
|
flex-grow: 1;
|
|
69
|
+
flex-wrap: nowrap;
|
|
67
70
|
font-family: "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
|
71
|
+
overflow: hidden;
|
|
68
72
|
position: relative;
|
|
69
73
|
}
|
|
70
74
|
.inspector {
|
|
71
|
-
border-top: 1px solid
|
|
75
|
+
border-top: 1px solid var(--border-4);
|
|
72
76
|
display: flex;
|
|
73
77
|
flex-direction: column;
|
|
78
|
+
height: 100%;
|
|
79
|
+
}
|
|
80
|
+
.inspector .permatoolbar {
|
|
81
|
+
border-bottom: 1px solid var(--border-1);
|
|
74
82
|
}
|
|
75
83
|
.vscrollable {
|
|
76
84
|
direction: ltr;
|
|
77
85
|
flex-grow: 1;
|
|
78
86
|
font-size: var(--font-size-smaller);
|
|
87
|
+
height: 1px; /* necessary for proper space allocation by flex boxes */
|
|
79
88
|
overflow-x: hidden;
|
|
80
89
|
overflow-y: auto;
|
|
81
90
|
}
|
|
@@ -106,7 +115,6 @@ textarea {
|
|
|
106
115
|
}
|
|
107
116
|
#netInspector #filterExprGroup {
|
|
108
117
|
display: flex;
|
|
109
|
-
margin: 0 1em;
|
|
110
118
|
position: relative;
|
|
111
119
|
}
|
|
112
120
|
#netInspector #filterButton {
|
|
@@ -295,7 +303,7 @@ body[dir="rtl"] #netInspector #filterExprPicker {
|
|
|
295
303
|
display: inline-block;
|
|
296
304
|
height: 100%;
|
|
297
305
|
overflow: hidden;
|
|
298
|
-
padding:
|
|
306
|
+
padding: 2px;
|
|
299
307
|
vertical-align: middle;
|
|
300
308
|
white-space: nowrap;
|
|
301
309
|
word-break: break-all;
|
|
@@ -391,7 +399,6 @@ body[dir="rtl"] #vwRenderer .logEntry > .fields > span:first-child {
|
|
|
391
399
|
#vwRenderer .logEntry > .fields > span:nth-of-type(8) a {
|
|
392
400
|
align-items: center;
|
|
393
401
|
background-color: dimgray;
|
|
394
|
-
bottom: 0;
|
|
395
402
|
color: white;
|
|
396
403
|
display: none;
|
|
397
404
|
height: min(100%, 1.5em);
|
|
@@ -401,6 +408,7 @@ body[dir="rtl"] #vwRenderer .logEntry > .fields > span:first-child {
|
|
|
401
408
|
position: absolute;
|
|
402
409
|
right: 0;
|
|
403
410
|
text-decoration: none;
|
|
411
|
+
top: 0;
|
|
404
412
|
width: 1.5em;
|
|
405
413
|
}
|
|
406
414
|
#netInspector.vExpanded #vwRenderer .logEntry > .fields > span:nth-of-type(8) a {
|
|
@@ -462,21 +470,13 @@ body[dir="rtl"] #vwRenderer .logEntry > .fields > span:first-child {
|
|
|
462
470
|
width: 100%;
|
|
463
471
|
}
|
|
464
472
|
|
|
465
|
-
#
|
|
473
|
+
#inspectors .entryTools {
|
|
466
474
|
background-color: var(--surface-0);
|
|
467
|
-
|
|
468
|
-
max-width: 640px;
|
|
469
|
-
min-width: min(100%, 640px);
|
|
470
|
-
position: absolute;
|
|
471
|
-
z-index: 2;
|
|
475
|
+
flex-basis: 50%;
|
|
472
476
|
}
|
|
473
|
-
#
|
|
477
|
+
#inspectors .entryTools:empty {
|
|
474
478
|
display: none;
|
|
475
479
|
}
|
|
476
|
-
#netInspector .entryTools .dialogControls {
|
|
477
|
-
display: flex;
|
|
478
|
-
justify-content: stretch;
|
|
479
|
-
}
|
|
480
480
|
|
|
481
481
|
.closeButton {
|
|
482
482
|
stroke: var(--ink-1);
|
|
@@ -497,15 +497,28 @@ body[dir="rtl"] .closeButton {
|
|
|
497
497
|
.closeButton > * {
|
|
498
498
|
pointer-events: none;
|
|
499
499
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
500
|
+
|
|
501
|
+
#inspectors #infoInspector {
|
|
502
|
+
flex-basis: 200%;
|
|
503
|
+
}
|
|
504
|
+
#inspectors:not(.console) #infoInspector {
|
|
505
|
+
display: none;
|
|
506
|
+
}
|
|
507
|
+
#inspectors #infoInspector .vscrollable {
|
|
508
|
+
font-family: monospace;
|
|
509
|
+
font-size: small;
|
|
510
|
+
}
|
|
511
|
+
#inspectors #infoInspector .vscrollable > div {
|
|
512
|
+
border-bottom: 1px dotted gray;
|
|
513
|
+
padding: 0.2em;
|
|
514
|
+
white-space: pre-wrap;
|
|
515
|
+
word-break: break-all;
|
|
516
|
+
}
|
|
517
|
+
#inspectors #infoInspector .vscrollable > div:first-of-type {
|
|
518
|
+
}
|
|
519
|
+
#inspectors #infoInspector .vscrollable > div[data-type="error"] {
|
|
520
|
+
color: var(--cm-negative);
|
|
505
521
|
}
|
|
506
|
-
.moving .moveBand {
|
|
507
|
-
cursor: grabbing;
|
|
508
|
-
}
|
|
509
522
|
|
|
510
523
|
#popupContainer {
|
|
511
524
|
background-color: var(--surface-1);
|
|
@@ -613,9 +626,10 @@ body[dir="rtl"] .closeButton {
|
|
|
613
626
|
align-items: center;
|
|
614
627
|
border-bottom: 1px solid var(--border-4);
|
|
615
628
|
display: flex;
|
|
629
|
+
justify-content: space-between;
|
|
616
630
|
line-height: 2;
|
|
617
631
|
}
|
|
618
|
-
.netFilteringDialog > .headers
|
|
632
|
+
.netFilteringDialog > .headers .header {
|
|
619
633
|
border: 1px solid var(--border-2);
|
|
620
634
|
border-bottom: 1px solid var(--border-4);
|
|
621
635
|
border-top-left-radius: 4px;
|
|
@@ -628,9 +642,9 @@ body[dir="rtl"] .closeButton {
|
|
|
628
642
|
position: relative;
|
|
629
643
|
top: 1px;
|
|
630
644
|
}
|
|
631
|
-
.netFilteringDialog[data-pane="details"] > .headers
|
|
632
|
-
.netFilteringDialog[data-pane="dynamic"] > .headers
|
|
633
|
-
.netFilteringDialog[data-pane="static"] > .headers
|
|
645
|
+
.netFilteringDialog[data-pane="details"] > .headers [data-pane="details"],
|
|
646
|
+
.netFilteringDialog[data-pane="dynamic"] > .headers [data-pane="dynamic"],
|
|
647
|
+
.netFilteringDialog[data-pane="static"] > .headers [data-pane="static"] {
|
|
634
648
|
background-color: var(--surface-0);
|
|
635
649
|
border-color: var(--border-4);
|
|
636
650
|
border-bottom: 1px solid transparent;
|
|
@@ -654,11 +668,11 @@ body[dir="rtl"] .closeButton {
|
|
|
654
668
|
color: var(--ink-1);
|
|
655
669
|
fill: var(--ink-1);
|
|
656
670
|
}
|
|
657
|
-
.netFilteringDialog.extendedRealm > .headers
|
|
671
|
+
.netFilteringDialog.extendedRealm > .headers .dynamic,
|
|
658
672
|
.netFilteringDialog.extendedRealm > .panes > .dynamic {
|
|
659
673
|
display: none;
|
|
660
674
|
}
|
|
661
|
-
.netFilteringDialog.extendedRealm > .headers
|
|
675
|
+
.netFilteringDialog.extendedRealm > .headers .static,
|
|
662
676
|
.netFilteringDialog.extendedRealm > .panes > .static {
|
|
663
677
|
display: none;
|
|
664
678
|
}
|
|
@@ -875,8 +889,6 @@ body.dirty .netFilteringDialog > div.panes > .dynamic > .toolbar #saveRules {
|
|
|
875
889
|
}
|
|
876
890
|
.netFilteringDialog > div.panes > div.static textarea {
|
|
877
891
|
height: 6em;
|
|
878
|
-
max-height: 20vh;
|
|
879
|
-
min-height: 10vh;
|
|
880
892
|
word-break: break-all;
|
|
881
893
|
}
|
|
882
894
|
.netFilteringDialog > div.panes > div.static > div:nth-of-type(2) {
|
|
@@ -68,6 +68,7 @@ License - https://github.com/FortAwesome/Font-Awesome/tree/a8386aae19e200ddb0f68
|
|
|
68
68
|
<symbol id="search" viewBox="0 0 1664 1664"><path d="M 1152,704 Q 1152,519 1020.5,387.5 889,256 704,256 519,256 387.5,387.5 256,519 256,704 256,889 387.5,1020.5 519,1152 704,1152 889,1152 1020.5,1020.5 1152,889 1152,704 Z m 512,832 q 0,52 -38,90 -38,38 -90,38 -54,0 -90,-38 L 1103,1284 Q 924,1408 704,1408 561,1408 430.5,1352.5 300,1297 205.5,1202.5 111,1108 55.5,977.5 0,847 0,704 0,561 55.5,430.5 111,300 205.5,205.5 300,111 430.5,55.5 561,0 704,0 q 143,0 273.5,55.5 130.5,55.5 225,150 94.5,94.5 150,225 55.5,130.5 55.5,273.5 0,220 -124,399 l 343,343 q 37,37 37,90 z"/></symbol>
|
|
69
69
|
<symbol id="sliders" viewBox="0 0 1536 1408"><path d="m 352,1152 0,128 -352,0 0,-128 352,0 z m 352,-128 q 26,0 45,19 19,19 19,45 l 0,256 q 0,26 -19,45 -19,19 -45,19 l -256,0 q -26,0 -45,-19 -19,-19 -19,-45 l 0,-256 q 0,-26 19,-45 19,-19 45,-19 l 256,0 z m 160,-384 0,128 -864,0 0,-128 864,0 z m -640,-512 0,128 -224,0 0,-128 224,0 z m 1312,1024 0,128 -736,0 0,-128 736,0 z M 576,0 q 26,0 45,19 19,19 19,45 l 0,256 q 0,26 -19,45 -19,19 -45,19 l -256,0 q -26,0 -45,-19 -19,-19 -19,-45 L 256,64 Q 256,38 275,19 294,0 320,0 l 256,0 z m 640,512 q 26,0 45,19 19,19 19,45 l 0,256 q 0,26 -19,45 -19,19 -45,19 l -256,0 q -26,0 -45,-19 -19,-19 -19,-45 l 0,-256 q 0,-26 19,-45 19,-19 45,-19 l 256,0 z m 320,128 0,128 -224,0 0,-128 224,0 z m 0,-512 0,128 -864,0 0,-128 864,0 z"/></symbol>
|
|
70
70
|
<symbol id="spinner" viewBox="0 0 1664 1728"><path d="m 462,1394 q 0,53 -37.5,90.5 -37.5,37.5 -90.5,37.5 -52,0 -90,-38 -38,-38 -38,-90 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 37.5,37.5 37.5,90.5 z m 498,206 q 0,53 -37.5,90.5 Q 885,1728 832,1728 779,1728 741.5,1690.5 704,1653 704,1600 q 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 Q 960,1547 960,1600 Z M 256,896 q 0,53 -37.5,90.5 Q 181,1024 128,1024 75,1024 37.5,986.5 0,949 0,896 0,843 37.5,805.5 75,768 128,768 q 53,0 90.5,37.5 Q 256,843 256,896 Z m 1202,498 q 0,52 -38,90 -38,38 -90,38 -53,0 -90.5,-37.5 -37.5,-37.5 -37.5,-90.5 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 37.5,37.5 37.5,90.5 z M 494,398 q 0,66 -47,113 -47,47 -113,47 -66,0 -113,-47 -47,-47 -47,-113 0,-66 47,-113 47,-47 113,-47 66,0 113,47 47,47 47,113 z m 1170,498 q 0,53 -37.5,90.5 -37.5,37.5 -90.5,37.5 -53,0 -90.5,-37.5 Q 1408,949 1408,896 q 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 Q 1664,843 1664,896 Z M 1024,192 q 0,80 -56,136 -56,56 -136,56 -80,0 -136,-56 -56,-56 -56,-136 0,-80 56,-136 56,-56 136,-56 80,0 136,56 56,56 56,136 z m 530,206 q 0,93 -66,158.5 -66,65.5 -158,65.5 -93,0 -158.5,-65.5 Q 1106,491 1106,398 q 0,-92 65.5,-158 65.5,-66 158.5,-66 92,0 158,66 66,66 66,158 z"/></symbol>
|
|
71
|
+
<symbol id="terminal" viewBox="0 0 1651 1075"><path d="m572 522-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23t-10 23zm1079 457v64q0 14-9 23t-23 9h-960q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h960q14 0 23 9t9 23z"/></symbol>
|
|
71
72
|
<symbol id="times" viewBox="0 0 1188 1188"><path d="m 1188,956 q 0,40 -28,68 l -136,136 q -28,28 -68,28 -40,0 -68,-28 L 594,866 300,1160 q -28,28 -68,28 -40,0 -68,-28 L 28,1024 Q 0,996 0,956 0,916 28,888 L 322,594 28,300 Q 0,272 0,232 0,192 28,164 L 164,28 Q 192,0 232,0 272,0 300,28 L 594,322 888,28 q 28,-28 68,-28 40,0 68,28 l 136,136 q 28,28 28,68 0,40 -28,68 l -294,294 294,294 q 28,28 28,68 z"/></symbol>
|
|
72
73
|
<symbol id="trash-o" viewBox="0 0 1408 1536"><path d="m 512,608 v 576 q 0,14 -9,23 -9,9 -23,9 h -64 q -14,0 -23,-9 -9,-9 -9,-23 V 608 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 256,0 v 576 q 0,14 -9,23 -9,9 -23,9 h -64 q -14,0 -23,-9 -9,-9 -9,-23 V 608 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 256,0 v 576 q 0,14 -9,23 -9,9 -23,9 h -64 q -14,0 -23,-9 -9,-9 -9,-23 V 608 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 128,724 V 384 H 256 v 948 q 0,22 7,40.5 7,18.5 14.5,27 7.5,8.5 10.5,8.5 h 832 q 3,0 10.5,-8.5 7.5,-8.5 14.5,-27 7,-18.5 7,-40.5 z M 480,256 H 928 L 880,139 q -7,-9 -17,-11 H 546 q -10,2 -17,11 z m 928,32 v 64 q 0,14 -9,23 -9,9 -23,9 h -96 v 948 q 0,83 -47,143.5 -47,60.5 -113,60.5 H 288 q -66,0 -113,-58.5 Q 128,1419 128,1336 V 384 H 32 Q 18,384 9,375 0,366 0,352 v -64 q 0,-14 9,-23 9,-9 23,-9 H 341 L 411,89 Q 426,52 465,26 504,0 544,0 h 320 q 40,0 79,26 39,26 54,63 l 70,167 h 309 q 14,0 23,9 9,9 9,23 z"/></symbol>
|
|
73
74
|
<symbol id="undo" viewBox="0 0 1536 1536"><path d="m 1536,768 q 0,156 -61,298 -61,142 -164,245 -103,103 -245,164 -142,61 -298,61 -172,0 -327,-72.5 Q 286,1391 177,1259 q -7,-10 -6.5,-22.5 0.5,-12.5 8.5,-20.5 l 137,-138 q 10,-9 25,-9 16,2 23,12 73,95 179,147 106,52 225,52 104,0 198.5,-40.5 Q 1061,1199 1130,1130 1199,1061 1239.5,966.5 1280,872 1280,768 1280,664 1239.5,569.5 1199,475 1130,406 1061,337 966.5,296.5 872,256 768,256 670,256 580,291.5 490,327 420,393 l 137,138 q 31,30 14,69 -17,40 -59,40 H 64 Q 38,640 19,621 0,602 0,576 V 128 Q 0,86 40,69 79,52 109,83 L 239,212 Q 346,111 483.5,55.5 621,0 768,0 q 156,0 298,61 142,61 245,164 103,103 164,245 61,142 61,298 z"/></symbol>
|
|
@@ -559,21 +559,20 @@ const selectFilterLists = async ( ) => {
|
|
|
559
559
|
const textarea = qs$('#lists .listEntry[data-role="import"].expanded textarea');
|
|
560
560
|
if ( textarea === null ) { return ''; }
|
|
561
561
|
const lists = listsetDetails.available;
|
|
562
|
-
const lines = textarea.value.split(/\s
|
|
562
|
+
const lines = textarea.value.split(/\s+/);
|
|
563
563
|
const after = [];
|
|
564
564
|
for ( const line of lines ) {
|
|
565
|
+
after.push(line);
|
|
565
566
|
if ( /^https?:\/\//.test(line) === false ) { continue; }
|
|
566
567
|
for ( const [ listkey, list ] of Object.entries(lists) ) {
|
|
567
568
|
if ( list.content !== 'filters' ) { continue; }
|
|
568
569
|
if ( list.contentURL === undefined ) { continue; }
|
|
569
|
-
if ( list.contentURL.includes(line) === false ) {
|
|
570
|
-
after.push(line);
|
|
571
|
-
continue;
|
|
572
|
-
}
|
|
570
|
+
if ( list.contentURL.includes(line) === false ) { continue; }
|
|
573
571
|
const groupkey = list.group2 || list.group;
|
|
574
572
|
const listEntry = qs$(`[data-key="${groupkey}"] [data-key="${listkey}"]`);
|
|
575
573
|
if ( listEntry === null ) { break; }
|
|
576
574
|
toggleFilterList(listEntry, true);
|
|
575
|
+
after.pop();
|
|
577
576
|
break;
|
|
578
577
|
}
|
|
579
578
|
}
|
|
@@ -19,10 +19,6 @@
|
|
|
19
19
|
Home: https://github.com/gorhill/uBlock
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
/* globals WebAssembly, vAPI */
|
|
23
|
-
|
|
24
|
-
'use strict';
|
|
25
|
-
|
|
26
22
|
/*******************************************************************************
|
|
27
23
|
|
|
28
24
|
A BidiTrieContainer is mostly a large buffer in which distinct but related
|
|
@@ -124,6 +120,15 @@ const BCELL_EXTRA_MAX = 0x00FFFFFF;
|
|
|
124
120
|
const toSegmentInfo = (aL, l, r) => ((r - l) << 24) | (aL + l);
|
|
125
121
|
const roundToPageSize = v => (v + PAGE_SIZE-1) & ~(PAGE_SIZE-1);
|
|
126
122
|
|
|
123
|
+
// http://www.cse.yorku.ca/~oz/hash.html#djb2
|
|
124
|
+
const i32Checksum = (buf32) => {
|
|
125
|
+
const n = buf32.length;
|
|
126
|
+
let hash = 177573 ^ n;
|
|
127
|
+
for ( let i = 0; i < n; i++ ) {
|
|
128
|
+
hash = (hash << 5) + hash ^ buf32[i];
|
|
129
|
+
}
|
|
130
|
+
return hash;
|
|
131
|
+
};
|
|
127
132
|
|
|
128
133
|
class BidiTrieContainer {
|
|
129
134
|
|
|
@@ -577,18 +582,18 @@ class BidiTrieContainer {
|
|
|
577
582
|
}
|
|
578
583
|
|
|
579
584
|
toSelfie() {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
this.buf32[CHAR1_SLOT] + 3 >>> 2
|
|
583
|
-
);
|
|
585
|
+
const buf32 = this.buf32.subarray(0, this.buf32[CHAR1_SLOT] + 3 >>> 2);
|
|
586
|
+
return { buf32, checksum: i32Checksum(buf32) };
|
|
584
587
|
}
|
|
585
588
|
|
|
586
589
|
fromSelfie(selfie) {
|
|
587
|
-
if ( selfie instanceof
|
|
588
|
-
|
|
590
|
+
if ( selfie instanceof Object === false ) { return false; }
|
|
591
|
+
if ( selfie.buf32 instanceof Uint32Array === false ) { return false; }
|
|
592
|
+
if ( selfie.checksum !== i32Checksum(selfie.buf32) ) { return false; }
|
|
593
|
+
const byteLength = selfie.buf32.length << 2;
|
|
589
594
|
if ( byteLength === 0 ) { return false; }
|
|
590
595
|
this.reallocateBuf(byteLength);
|
|
591
|
-
this.buf32.set(selfie);
|
|
596
|
+
this.buf32.set(selfie.buf32);
|
|
592
597
|
return true;
|
|
593
598
|
}
|
|
594
599
|
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
|
|
24
24
|
import * as s14e from './s14e-serializer.js';
|
|
25
25
|
|
|
26
|
-
import lz4Codec from './lz4.js';
|
|
27
26
|
import { ubolog } from './console.js';
|
|
28
27
|
import webext from './webext.js';
|
|
29
28
|
import µb from './background.js';
|
|
@@ -32,6 +31,7 @@ import µb from './background.js';
|
|
|
32
31
|
|
|
33
32
|
const STORAGE_NAME = 'uBlock0CacheStorage';
|
|
34
33
|
const extensionStorage = webext.storage.local;
|
|
34
|
+
const pendingWrite = new Map();
|
|
35
35
|
|
|
36
36
|
const keysFromGetArg = arg => {
|
|
37
37
|
if ( arg === null || arg === undefined ) { return []; }
|
|
@@ -58,8 +58,18 @@ const hasOwnProperty = (o, p) =>
|
|
|
58
58
|
|
|
59
59
|
const cacheStorage = (( ) => {
|
|
60
60
|
|
|
61
|
-
const exGet = (api, wanted, outbin) => {
|
|
62
|
-
|
|
61
|
+
const exGet = async (api, wanted, outbin) => {
|
|
62
|
+
ubolog('cacheStorage.get:', api.name || 'storage.local', wanted.join());
|
|
63
|
+
const missing = [];
|
|
64
|
+
for ( const key of wanted ) {
|
|
65
|
+
if ( pendingWrite.has(key) ) {
|
|
66
|
+
outbin[key] = pendingWrite.get(key);
|
|
67
|
+
} else {
|
|
68
|
+
missing.push(key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if ( missing.length === 0 ) { return; }
|
|
72
|
+
return api.get(missing).then(inbin => {
|
|
63
73
|
inbin = inbin || {};
|
|
64
74
|
const found = Object.keys(inbin);
|
|
65
75
|
Object.assign(outbin, inbin);
|
|
@@ -139,16 +149,27 @@ const cacheStorage = (( ) => {
|
|
|
139
149
|
async set(rawbin) {
|
|
140
150
|
const keys = Object.keys(rawbin);
|
|
141
151
|
if ( keys.length === 0 ) { return; }
|
|
142
|
-
|
|
143
|
-
const promises = [];
|
|
152
|
+
ubolog('cacheStorage.set:', keys.join());
|
|
144
153
|
for ( const key of keys ) {
|
|
145
|
-
|
|
154
|
+
pendingWrite.set(key, rawbin[key]);
|
|
146
155
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
156
|
+
try {
|
|
157
|
+
const serializedbin = {};
|
|
158
|
+
const promises = [];
|
|
159
|
+
for ( const key of keys ) {
|
|
160
|
+
promises.push(compress(serializedbin, key, rawbin[key]));
|
|
161
|
+
}
|
|
162
|
+
await Promise.all(promises);
|
|
163
|
+
await Promise.all([
|
|
164
|
+
cacheAPIs[fastCache].set(rawbin, serializedbin),
|
|
165
|
+
extensionStorage.set(serializedbin),
|
|
166
|
+
]);
|
|
167
|
+
} catch(reason) {
|
|
150
168
|
ubolog(reason);
|
|
151
|
-
}
|
|
169
|
+
}
|
|
170
|
+
for ( const key of keys ) {
|
|
171
|
+
pendingWrite.delete(key);
|
|
172
|
+
}
|
|
152
173
|
},
|
|
153
174
|
|
|
154
175
|
remove(...args) {
|
|
@@ -295,6 +316,7 @@ const cacheAPI = (( ) => {
|
|
|
295
316
|
};
|
|
296
317
|
|
|
297
318
|
return {
|
|
319
|
+
name: 'cacheAPI',
|
|
298
320
|
async get(arg) {
|
|
299
321
|
const keys = keysFromGetArg(arg);
|
|
300
322
|
if ( keys === undefined ) { return; }
|
|
@@ -393,6 +415,7 @@ const memoryStorage = (( ) => {
|
|
|
393
415
|
};
|
|
394
416
|
|
|
395
417
|
return {
|
|
418
|
+
name: 'memoryStorage',
|
|
396
419
|
get(...args) {
|
|
397
420
|
return sessionStorage.get(...args).then(bin => {
|
|
398
421
|
return bin;
|
|
@@ -491,25 +514,6 @@ const idbStorage = (( ) => {
|
|
|
491
514
|
return /^cache\/(compiled|selfie)\//.test(key);
|
|
492
515
|
};
|
|
493
516
|
|
|
494
|
-
const fromBlob = data => {
|
|
495
|
-
if ( data instanceof Blob === false ) {
|
|
496
|
-
return Promise.resolve(data);
|
|
497
|
-
}
|
|
498
|
-
return new Promise(resolve => {
|
|
499
|
-
const blobReader = new FileReader();
|
|
500
|
-
blobReader.onloadend = ev => {
|
|
501
|
-
resolve(new Uint8Array(ev.target.result));
|
|
502
|
-
};
|
|
503
|
-
blobReader.readAsArrayBuffer(data);
|
|
504
|
-
});
|
|
505
|
-
};
|
|
506
|
-
|
|
507
|
-
const decompress = (key, value) => {
|
|
508
|
-
return lz4Codec.decode(value, fromBlob).then(value => {
|
|
509
|
-
return { key, value };
|
|
510
|
-
});
|
|
511
|
-
};
|
|
512
|
-
|
|
513
517
|
const getAllEntries = async function() {
|
|
514
518
|
const db = await getDb();
|
|
515
519
|
if ( db === null ) { return []; }
|
|
@@ -527,9 +531,7 @@ const idbStorage = (( ) => {
|
|
|
527
531
|
const cursor = ev.target && ev.target.result;
|
|
528
532
|
if ( !cursor ) { return; }
|
|
529
533
|
const { key, value } = cursor.value;
|
|
530
|
-
if ( value instanceof Blob ) {
|
|
531
|
-
entries.push(decompress(key, value));
|
|
532
|
-
} else {
|
|
534
|
+
if ( value instanceof Blob === false ) {
|
|
533
535
|
entries.push({ key, value });
|
|
534
536
|
}
|
|
535
537
|
cursor.continue();
|
|
@@ -576,11 +578,8 @@ const idbStorage = (( ) => {
|
|
|
576
578
|
if ( typeof result !== 'object' ) { return; }
|
|
577
579
|
if ( result === null ) { return; }
|
|
578
580
|
const { key, value } = result;
|
|
579
|
-
if ( value instanceof Blob ) {
|
|
580
|
-
|
|
581
|
-
} else {
|
|
582
|
-
entries.push({ key, value });
|
|
583
|
-
}
|
|
581
|
+
if ( value instanceof Blob ) { return; }
|
|
582
|
+
entries.push({ key, value });
|
|
584
583
|
};
|
|
585
584
|
const transaction = db.transaction(STORAGE_NAME, 'readonly');
|
|
586
585
|
transaction.oncomplete =
|
|
@@ -656,6 +655,7 @@ const idbStorage = (( ) => {
|
|
|
656
655
|
};
|
|
657
656
|
|
|
658
657
|
return {
|
|
658
|
+
name: 'idbStorage',
|
|
659
659
|
async get(argbin) {
|
|
660
660
|
const keys = keysFromGetArg(argbin);
|
|
661
661
|
if ( keys === undefined ) { return; }
|
|
@@ -19,8 +19,6 @@
|
|
|
19
19
|
Home: https://github.com/gorhill/uBlock
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
'use strict';
|
|
23
|
-
|
|
24
22
|
/*******************************************************************************
|
|
25
23
|
|
|
26
24
|
+--> domCollapser
|
|
@@ -103,7 +101,7 @@
|
|
|
103
101
|
// https://github.com/chrisaljoudi/uBlock/issues/456
|
|
104
102
|
// https://github.com/gorhill/uBlock/issues/2029
|
|
105
103
|
|
|
106
|
-
|
|
104
|
+
// >>>>>>>> start of HUGE-IF-BLOCK
|
|
107
105
|
if ( typeof vAPI === 'object' && !vAPI.contentScript ) {
|
|
108
106
|
|
|
109
107
|
/******************************************************************************/
|
|
@@ -1050,7 +1048,6 @@ vAPI.DOMFilterer = class {
|
|
|
1050
1048
|
const hashes = [];
|
|
1051
1049
|
const nodes = pendingNodes;
|
|
1052
1050
|
const deadline = t0 + 4;
|
|
1053
|
-
let processed = 0;
|
|
1054
1051
|
let scanned = 0;
|
|
1055
1052
|
for (;;) {
|
|
1056
1053
|
const n = nextPendingNodes();
|
|
@@ -1065,10 +1062,8 @@ vAPI.DOMFilterer = class {
|
|
|
1065
1062
|
classesFromNode(node, hashes);
|
|
1066
1063
|
scanned += 1;
|
|
1067
1064
|
}
|
|
1068
|
-
processed += n;
|
|
1069
1065
|
if ( performance.now() >= deadline ) { break; }
|
|
1070
1066
|
}
|
|
1071
|
-
//console.info(`[domSurveyor][${hostname}] Surveyed ${scanned}/${processed} nodes in ${(performance.now()-t0).toFixed(2)} ms: ${hashes.length} hashes`);
|
|
1072
1067
|
scannedCount += scanned;
|
|
1073
1068
|
if ( scannedCount >= maxSurveyNodes ) {
|
|
1074
1069
|
stop();
|
|
@@ -21,14 +21,13 @@
|
|
|
21
21
|
|
|
22
22
|
/* global CodeMirror */
|
|
23
23
|
|
|
24
|
-
'use strict';
|
|
25
|
-
|
|
26
24
|
import './codemirror/ubo-static-filtering.js';
|
|
27
25
|
|
|
28
|
-
import { hostnameFromURI } from './uri-utils.js';
|
|
29
|
-
import punycode from '../lib/punycode.js';
|
|
30
26
|
import * as sfp from './static-filtering-parser.js';
|
|
27
|
+
|
|
31
28
|
import { dom } from './dom.js';
|
|
29
|
+
import { hostnameFromURI } from './uri-utils.js';
|
|
30
|
+
import punycode from '../lib/punycode.js';
|
|
32
31
|
|
|
33
32
|
/******************************************************************************/
|
|
34
33
|
/******************************************************************************/
|
|
@@ -63,13 +62,10 @@ const reCosmeticAnchor = /^#(\$|\?|\$\?)?#/;
|
|
|
63
62
|
|
|
64
63
|
const docURL = new URL(vAPI.getURL(''));
|
|
65
64
|
|
|
65
|
+
const computedSpecificityCandidates = new Map();
|
|
66
66
|
let resultsetOpt;
|
|
67
|
-
|
|
68
|
-
let netFilterCandidates = [];
|
|
69
67
|
let cosmeticFilterCandidates = [];
|
|
70
|
-
let computedCandidateSlot = 0;
|
|
71
68
|
let computedCandidate = '';
|
|
72
|
-
const computedSpecificityCandidates = new Map();
|
|
73
69
|
let needBody = false;
|
|
74
70
|
|
|
75
71
|
/******************************************************************************/
|
|
@@ -183,7 +179,6 @@ const candidateFromFilterChoice = function(filterChoice) {
|
|
|
183
179
|
elem.classList.remove('active');
|
|
184
180
|
}
|
|
185
181
|
|
|
186
|
-
computedCandidateSlot = slot;
|
|
187
182
|
computedCandidate = '';
|
|
188
183
|
|
|
189
184
|
if ( filter === undefined ) { return ''; }
|
|
@@ -726,7 +721,6 @@ const svgListening = (( ) => {
|
|
|
726
721
|
// current mode is narrow or broad.
|
|
727
722
|
|
|
728
723
|
const populateCandidates = function(candidates, selector) {
|
|
729
|
-
|
|
730
724
|
const root = dialog.querySelector(selector);
|
|
731
725
|
const ul = root.querySelector('ul');
|
|
732
726
|
while ( ul.firstChild !== null ) {
|
|
@@ -751,8 +745,6 @@ const showDialog = function(details) {
|
|
|
751
745
|
|
|
752
746
|
const { netFilters, cosmeticFilters, filter } = details;
|
|
753
747
|
|
|
754
|
-
netFilterCandidates = netFilters;
|
|
755
|
-
|
|
756
748
|
needBody =
|
|
757
749
|
cosmeticFilters.length !== 0 &&
|
|
758
750
|
cosmeticFilters[cosmeticFilters.length - 1] === '##body';
|
|
@@ -869,31 +861,31 @@ const quitPicker = function() {
|
|
|
869
861
|
|
|
870
862
|
const onPickerMessage = function(msg) {
|
|
871
863
|
switch ( msg.what ) {
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
}
|
|
886
|
-
break;
|
|
887
|
-
}
|
|
888
|
-
case 'svgPaths': {
|
|
889
|
-
let { ocean, islands } = msg;
|
|
890
|
-
ocean += islands;
|
|
891
|
-
svgOcean.setAttribute('d', ocean);
|
|
892
|
-
svgIslands.setAttribute('d', islands || NoPaths);
|
|
893
|
-
break;
|
|
864
|
+
case 'candidatesOptimized':
|
|
865
|
+
onCandidatesOptimized(msg);
|
|
866
|
+
break;
|
|
867
|
+
case 'showDialog':
|
|
868
|
+
showDialog(msg);
|
|
869
|
+
break;
|
|
870
|
+
case 'resultsetDetails': {
|
|
871
|
+
resultsetOpt = msg.opt;
|
|
872
|
+
$id('resultsetCount').textContent = msg.count;
|
|
873
|
+
if ( msg.count !== 0 ) {
|
|
874
|
+
$id('create').removeAttribute('disabled');
|
|
875
|
+
} else {
|
|
876
|
+
$id('create').setAttribute('disabled', '');
|
|
894
877
|
}
|
|
895
|
-
|
|
896
|
-
|
|
878
|
+
break;
|
|
879
|
+
}
|
|
880
|
+
case 'svgPaths': {
|
|
881
|
+
let { ocean, islands } = msg;
|
|
882
|
+
ocean += islands;
|
|
883
|
+
svgOcean.setAttribute('d', ocean);
|
|
884
|
+
svgIslands.setAttribute('d', islands || NoPaths);
|
|
885
|
+
break;
|
|
886
|
+
}
|
|
887
|
+
default:
|
|
888
|
+
break;
|
|
897
889
|
}
|
|
898
890
|
};
|
|
899
891
|
|
|
@@ -73,6 +73,7 @@ export const faIconsInit = (( ) => {
|
|
|
73
73
|
[ 'spinner', { viewBox: '0 0 1664 1728', path: 'm 462,1394 q 0,53 -37.5,90.5 -37.5,37.5 -90.5,37.5 -52,0 -90,-38 -38,-38 -38,-90 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 37.5,37.5 37.5,90.5 z m 498,206 q 0,53 -37.5,90.5 Q 885,1728 832,1728 779,1728 741.5,1690.5 704,1653 704,1600 q 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 Q 960,1547 960,1600 Z M 256,896 q 0,53 -37.5,90.5 Q 181,1024 128,1024 75,1024 37.5,986.5 0,949 0,896 0,843 37.5,805.5 75,768 128,768 q 53,0 90.5,37.5 Q 256,843 256,896 Z m 1202,498 q 0,52 -38,90 -38,38 -90,38 -53,0 -90.5,-37.5 -37.5,-37.5 -37.5,-90.5 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 37.5,37.5 37.5,90.5 z M 494,398 q 0,66 -47,113 -47,47 -113,47 -66,0 -113,-47 -47,-47 -47,-113 0,-66 47,-113 47,-47 113,-47 66,0 113,47 47,47 47,113 z m 1170,498 q 0,53 -37.5,90.5 -37.5,37.5 -90.5,37.5 -53,0 -90.5,-37.5 Q 1408,949 1408,896 q 0,-53 37.5,-90.5 37.5,-37.5 90.5,-37.5 53,0 90.5,37.5 Q 1664,843 1664,896 Z M 1024,192 q 0,80 -56,136 -56,56 -136,56 -80,0 -136,-56 -56,-56 -56,-136 0,-80 56,-136 56,-56 136,-56 80,0 136,56 56,56 56,136 z m 530,206 q 0,93 -66,158.5 -66,65.5 -158,65.5 -93,0 -158.5,-65.5 Q 1106,491 1106,398 q 0,-92 65.5,-158 65.5,-66 158.5,-66 92,0 158,66 66,66 66,158 z' } ],
|
|
74
74
|
[ 'sun', { viewBox: '0 0 1708 1792', path: 'm 1706,1172.5 c -3,10 -11,17 -20,20 l -292,96 v 306 c 0,10 -5,20 -13,26 -9,6 -19,8 -29,4 l -292,-94 -180,248 c -6,8 -16,13 -26,13 -10,0 -20,-5 -26,-13 l -180,-248 -292,94 c -10,4 -20,2 -29,-4 -8,-6 -13,-16 -13,-26 v -306 l -292,-96 c -9,-3 -17,-10 -20,-20 -3,-10 -2,-21 4,-29 l 180,-248 -180,-248 c -6,-9 -7,-19 -4,-29 3,-10 11,-17 20,-20 l 292,-96 v -306 c 0,-10 5,-20 13,-26 9,-6 19,-8 29,-4 l 292,94 180,-248 c 12,-16 40,-16 52,0 L 1060,260.5 l 292,-94 c 10,-4 20,-2 29,4 8,6 13,16 13,26 v 306 l 292,96 c 9,3 17,10 20,20 3,10 2,20 -4,29 l -180,248 180,248 c 6,8 7,19 4,29 z' } ],
|
|
75
75
|
[ 'sun-o', { viewBox: '0 0 1708 1792', path: 'm 1430,895.5 c 0,-318 -258,-576 -576,-576 -318,0 -576,258 -576,576 0,318 258,576 576,576 C 1172,1471.5 1430,1213.5 1430,895.5 Z m 276,277 c -3,10 -11,17 -20,20 l -292,96 v 306 c 0,10 -5,20 -13,26 -9,6 -19,8 -29,4 l -292,-94 -180,248 c -6,8 -16,13 -26,13 -10,0 -20,-5 -26,-13 l -180,-248 -292,94 c -10,4 -20,2 -29,-4 -8,-6 -13,-16 -13,-26 v -306 l -292,-96 c -9,-3 -17,-10 -20,-20 -3,-10 -2,-21 4,-29 l 180,-248 -180,-248 c -6,-9 -7,-19 -4,-29 3,-10 11,-17 20,-20 l 292,-96 v -306 c 0,-10 5,-20 13,-26 9,-6 19,-8 29,-4 l 292,94 180,-248 c 12,-16 40,-16 52,0 L 1060,260.5 l 292,-94 c 10,-4 20,-2 29,4 8,6 13,16 13,26 v 306 l 292,96 c 9,3 17,10 20,20 3,10 2,20 -4,29 l -180,248 180,248 c 6,8 7,19 4,29 z' } ],
|
|
76
|
+
[ 'terminal', { viewBox: '0 0 1651 1075', path: 'm572 522-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23t-10 23zm1079 457v64q0 14-9 23t-23 9h-960q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h960q14 0 23 9t9 23z' } ],
|
|
76
77
|
[ 'times', { viewBox: '0 0 1188 1188', path: 'm 1188,956 q 0,40 -28,68 l -136,136 q -28,28 -68,28 -40,0 -68,-28 L 594,866 300,1160 q -28,28 -68,28 -40,0 -68,-28 L 28,1024 Q 0,996 0,956 0,916 28,888 L 322,594 28,300 Q 0,272 0,232 0,192 28,164 L 164,28 Q 192,0 232,0 272,0 300,28 L 594,322 888,28 q 28,-28 68,-28 40,0 68,28 l 136,136 q 28,28 28,68 0,40 -28,68 l -294,294 294,294 q 28,28 28,68 z' } ],
|
|
77
78
|
[ 'trash-o', { viewBox: '0 0 1408 1536', path: 'm 512,608 v 576 q 0,14 -9,23 -9,9 -23,9 h -64 q -14,0 -23,-9 -9,-9 -9,-23 V 608 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 256,0 v 576 q 0,14 -9,23 -9,9 -23,9 h -64 q -14,0 -23,-9 -9,-9 -9,-23 V 608 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 256,0 v 576 q 0,14 -9,23 -9,9 -23,9 h -64 q -14,0 -23,-9 -9,-9 -9,-23 V 608 q 0,-14 9,-23 9,-9 23,-9 h 64 q 14,0 23,9 9,9 9,23 z m 128,724 V 384 H 256 v 948 q 0,22 7,40.5 7,18.5 14.5,27 7.5,8.5 10.5,8.5 h 832 q 3,0 10.5,-8.5 7.5,-8.5 14.5,-27 7,-18.5 7,-40.5 z M 480,256 H 928 L 880,139 q -7,-9 -17,-11 H 546 q -10,2 -17,11 z m 928,32 v 64 q 0,14 -9,23 -9,9 -23,9 h -96 v 948 q 0,83 -47,143.5 -47,60.5 -113,60.5 H 288 q -66,0 -113,-58.5 Q 128,1419 128,1336 V 384 H 32 Q 18,384 9,375 0,366 0,352 v -64 q 0,-14 9,-23 9,-9 23,-9 H 341 L 411,89 Q 426,52 465,26 504,0 544,0 h 320 q 40,0 79,26 39,26 54,63 l 70,167 h 309 q 14,0 23,9 9,9 9,23 z' } ],
|
|
78
79
|
[ 'undo', { viewBox: '0 0 1536 1536', path: 'm 1536,768 q 0,156 -61,298 -61,142 -164,245 -103,103 -245,164 -142,61 -298,61 -172,0 -327,-72.5 Q 286,1391 177,1259 q -7,-10 -6.5,-22.5 0.5,-12.5 8.5,-20.5 l 137,-138 q 10,-9 25,-9 16,2 23,12 73,95 179,147 106,52 225,52 104,0 198.5,-40.5 Q 1061,1199 1130,1130 1199,1061 1239.5,966.5 1280,872 1280,768 1280,664 1239.5,569.5 1199,475 1130,406 1061,337 966.5,296.5 872,256 768,256 670,256 580,291.5 490,327 420,393 l 137,138 q 31,30 14,69 -17,40 -59,40 H 64 Q 38,640 19,621 0,602 0,576 V 128 Q 0,86 40,69 79,52 109,83 L 239,212 Q 346,111 483.5,55.5 621,0 768,0 q 156,0 298,61 142,61 245,164 103,103 164,245 61,142 61,298 z' } ],
|