pxt-core 8.4.1 → 8.4.3

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.
Files changed (82) hide show
  1. package/built/backendutils.js +1 -0
  2. package/built/cli.js +83 -75
  3. package/built/pxt.js +1274 -179
  4. package/built/pxtblockly.js +323 -40
  5. package/built/pxtblocks.d.ts +30 -7
  6. package/built/pxtblocks.js +324 -41
  7. package/built/pxteditor.d.ts +2 -0
  8. package/built/pxtlib.d.ts +91 -5
  9. package/built/pxtlib.js +1183 -101
  10. package/built/pxtsim.js +8 -3
  11. package/built/server.js +4 -0
  12. package/built/target.js +1 -1
  13. package/built/web/main.js +1 -1
  14. package/built/web/multiplayer/css/main.2dd69ed8.css +4 -0
  15. package/built/web/multiplayer/js/main.f3b8f930.js +2 -0
  16. package/built/web/pxtapp.js +1 -1
  17. package/built/web/pxtasseteditor.js +1 -1
  18. package/built/web/pxtblockly.js +1 -1
  19. package/built/web/pxtblocks.js +1 -1
  20. package/built/web/pxtembed.js +2 -2
  21. package/built/web/pxtlib.js +1 -1
  22. package/built/web/pxtsim.js +1 -1
  23. package/built/web/pxtworker.js +2 -2
  24. package/built/web/react-common-authcode.css +4 -6993
  25. package/built/web/react-common-multiplayer.css +13 -0
  26. package/built/web/react-common-skillmap.css +1 -1
  27. package/built/web/rtlreact-common-authcode.css +13 -0
  28. package/built/web/rtlreact-common-multiplayer.css +13 -0
  29. package/built/web/rtlreact-common-skillmap.css +1 -1
  30. package/built/web/rtlsemantic.css +1 -1
  31. package/built/web/semantic.css +1 -1
  32. package/built/web/skillmap/js/main.a6cf40e1.chunk.js +1 -0
  33. package/common-docs/identity/sign-in.md +17 -3
  34. package/common-docs/static/music-editor/apple.png +0 -0
  35. package/common-docs/static/music-editor/burger.png +0 -0
  36. package/common-docs/static/music-editor/cake.png +0 -0
  37. package/common-docs/static/music-editor/car.png +0 -0
  38. package/common-docs/static/music-editor/cat.png +0 -0
  39. package/common-docs/static/music-editor/cherry.png +0 -0
  40. package/common-docs/static/music-editor/clam.png +0 -0
  41. package/common-docs/static/music-editor/computer.png +0 -0
  42. package/common-docs/static/music-editor/crab.png +0 -0
  43. package/common-docs/static/music-editor/dog.png +0 -0
  44. package/common-docs/static/music-editor/duck.png +0 -0
  45. package/common-docs/static/music-editor/egg.png +0 -0
  46. package/common-docs/static/music-editor/explosion.png +0 -0
  47. package/common-docs/static/music-editor/fish.png +0 -0
  48. package/common-docs/static/music-editor/ice-cream.png +0 -0
  49. package/common-docs/static/music-editor/lemon.png +0 -0
  50. package/common-docs/static/music-editor/metronomeWorker.js +35 -0
  51. package/common-docs/static/music-editor/snake.png +0 -0
  52. package/common-docs/static/music-editor/star.png +0 -0
  53. package/common-docs/static/music-editor/strawberry.png +0 -0
  54. package/common-docs/static/music-editor/taco.png +0 -0
  55. package/common-docs/static/music-editor/treble-clef.svg +1 -0
  56. package/localtypings/projectheader.d.ts +1 -0
  57. package/package.json +4 -2
  58. package/react-common/components/controls/Input.tsx +7 -3
  59. package/react-common/components/share/Share.tsx +6 -2
  60. package/react-common/components/share/ShareInfo.tsx +12 -3
  61. package/react-common/styles/controls/Button.less +9 -0
  62. package/react-common/styles/react-common-authcode-core.less +1 -1
  63. package/react-common/styles/react-common-authcode.less +1 -1
  64. package/react-common/styles/react-common-multiplayer-core.less +10 -0
  65. package/react-common/styles/react-common-multiplayer.less +12 -0
  66. package/theme/highcontrast.less +14 -0
  67. package/theme/music-editor/EditControls.less +22 -0
  68. package/theme/music-editor/MusicEditor.less +25 -0
  69. package/theme/music-editor/Note.less +16 -0
  70. package/theme/music-editor/NoteGroup.less +7 -0
  71. package/theme/music-editor/PlaybackControls.less +55 -0
  72. package/theme/music-editor/ScrollableWorkspace.less +3 -0
  73. package/theme/music-editor/Staff.less +31 -0
  74. package/theme/music-editor/Track.less +0 -0
  75. package/theme/music-editor/TrackSelector.less +48 -0
  76. package/theme/music-editor/Workspace.less +3 -0
  77. package/theme/pxt.less +1 -0
  78. package/theme/tutorial-sidebar.less +19 -3
  79. package/theme/tutorial.less +2 -2
  80. package/webapp/public/multiplayer.html +1 -1
  81. package/webapp/public/skillmap.html +1 -1
  82. package/built/web/skillmap/js/main.6fa0eaff.chunk.js +0 -1
@@ -21,13 +21,15 @@ export interface ShareProps {
21
21
  screenshotUri?: string;
22
22
  isLoggedIn?: boolean;
23
23
  hasProjectBeenPersistentShared?: boolean;
24
+ anonymousShareByDefault?: boolean;
25
+ setAnonymousSharePreference?: (anonymousByDefault: boolean) => void;
24
26
 
25
27
  simRecorder: SimRecorder;
26
28
  publishAsync: (name: string, screenshotUri?: string, forceAnonymous?: boolean) => Promise<ShareData>;
27
29
  }
28
30
 
29
31
  export const Share = (props: ShareProps) => {
30
- const { projectName, screenshotUri, isLoggedIn, simRecorder, publishAsync, hasProjectBeenPersistentShared } = props;
32
+ const { projectName, screenshotUri, isLoggedIn, simRecorder, publishAsync, hasProjectBeenPersistentShared, anonymousShareByDefault, setAnonymousSharePreference } = props;
31
33
 
32
34
  return <div className="project-share">
33
35
  <ShareInfo projectName={projectName}
@@ -35,6 +37,8 @@ export const Share = (props: ShareProps) => {
35
37
  screenshotUri={screenshotUri}
36
38
  simRecorder={simRecorder}
37
39
  publishAsync={publishAsync}
38
- hasProjectBeenPersistentShared={hasProjectBeenPersistentShared} />
40
+ hasProjectBeenPersistentShared={hasProjectBeenPersistentShared}
41
+ anonymousShareByDefault={anonymousShareByDefault}
42
+ setAnonymousSharePreference={setAnonymousSharePreference} />
39
43
  </div>
40
44
  }
@@ -19,10 +19,13 @@ export interface ShareInfoProps {
19
19
  hasProjectBeenPersistentShared?: boolean;
20
20
  simRecorder: SimRecorder;
21
21
  publishAsync: (name: string, screenshotUri?: string, forceAnonymous?: boolean) => Promise<ShareData>;
22
+
23
+ anonymousShareByDefault?: boolean;
24
+ setAnonymousSharePreference?: (anonymousByDefault: boolean) => void;
22
25
  }
23
26
 
24
27
  export const ShareInfo = (props: ShareInfoProps) => {
25
- const { projectName, description, screenshotUri, isLoggedIn, simRecorder, publishAsync, hasProjectBeenPersistentShared } = props;
28
+ const { projectName, description, screenshotUri, isLoggedIn, simRecorder, publishAsync, hasProjectBeenPersistentShared, anonymousShareByDefault, setAnonymousSharePreference } = props;
26
29
  const [ name, setName ] = React.useState(projectName);
27
30
  const [ thumbnailUri, setThumbnailUri ] = React.useState(screenshotUri);
28
31
  const [ shareState, setShareState ] = React.useState<"share" | "gifrecord" | "publish" | "publishing">("share");
@@ -30,7 +33,7 @@ export const ShareInfo = (props: ShareInfoProps) => {
30
33
  const [ embedState, setEmbedState ] = React.useState<"none" | "code" | "editor" | "simulator">("none");
31
34
  const [ showQRCode, setShowQRCode ] = React.useState(false);
32
35
  const [ copySuccessful, setCopySuccessful ] = React.useState(false);
33
- const [ isAnonymous, setIsAnonymous ] = React.useState(!isLoggedIn);
36
+ const [ isAnonymous, setIsAnonymous ] = React.useState(!isLoggedIn || anonymousShareByDefault);
34
37
 
35
38
  const showSimulator = !!simRecorder;
36
39
  const showDescription = shareState !== "publish";
@@ -141,6 +144,12 @@ export const ShareInfo = (props: ShareInfoProps) => {
141
144
  if (ref) inputRef = ref;
142
145
  }
143
146
 
147
+ const handleAnonymousShareClick = (newValue: boolean) => {
148
+ pxt.tickEvent("share.anonymousCheckbox")
149
+ setIsAnonymous(!newValue);
150
+ if (setAnonymousSharePreference) setAnonymousSharePreference(!newValue);
151
+ }
152
+
144
153
  const prePublish = shareState === "share" || shareState === "publishing";
145
154
 
146
155
  const inputTitle = prePublish ? lf("Project Title") : lf("Project Link")
@@ -180,7 +189,7 @@ export const ShareInfo = (props: ShareInfoProps) => {
180
189
  id="persistent-share-checkbox"
181
190
  label={lf("Update existing share link for this project")}
182
191
  isChecked={!isAnonymous}
183
- onChange={val => setIsAnonymous(!val)}
192
+ onChange={handleAnonymousShareClick}
184
193
  />}
185
194
  </>
186
195
  }
@@ -137,6 +137,15 @@
137
137
  border: @buttonBackgroundColorDisabled;
138
138
  }
139
139
 
140
+ .common-button.menu-button.disabled {
141
+ opacity: 0.8;
142
+ }
143
+
144
+ .common-button.menu-button.disabled:hover,
145
+ .common-button.menu-button.disabled:active {
146
+ background: none;
147
+ }
148
+
140
149
  /****************************************************
141
150
  * Focus *
142
151
  ****************************************************/
@@ -1,5 +1,5 @@
1
1
  /**
2
- * This file is the same as react-common-skillmap.less except it doesn't import any
2
+ * This file is the same as react-common-authcode.less except it doesn't import any
3
3
  * variables from the target. This is used for pxt-core's css build
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Used for building react-common-skillmap.css
2
+ * Used for building react-common-authcode.css
3
3
  */
4
4
 
5
5
  // Import variables from pxt-core
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This file is the same as react-common-multiplayer.less except it doesn't import any
3
+ * variables from the target. This is used for pxt-core's css build
4
+ */
5
+
6
+ // Import variables from pxt-core
7
+ @import "themes/default/globals/site.variables";
8
+ @import "themes/pxt/globals/site.variables";
9
+
10
+ @import "react-common.less";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Used for building react-common-multiplayer.css
3
+ */
4
+
5
+ // Import variables from pxt-core
6
+ @import "themes/default/globals/site.variables";
7
+ @import "themes/pxt/globals/site.variables";
8
+
9
+ // Import the variables from the target
10
+ @import "site/globals/site.variables";
11
+
12
+ @import "react-common.less";
@@ -838,6 +838,14 @@
838
838
  background-color: @HCbackground;
839
839
  color: @HCtextColor;
840
840
 
841
+ .hint-title {
842
+ margin: 0;
843
+ > span {
844
+ background-color: @HCbackground;
845
+ color: @HCtextColor;
846
+ }
847
+ }
848
+
841
849
  &:before {
842
850
  border-right-color: @HCtextColor;
843
851
  }
@@ -874,6 +882,12 @@
874
882
  }
875
883
  }
876
884
 
885
+ &.tabTutorial details {
886
+ background-color: @HCbackground !important;
887
+ border: 2px solid @HCtextColor !important;
888
+ color: @HCtextColor !important;
889
+ }
890
+
877
891
  .ui.label {
878
892
  background-color: @HCbackground !important;
879
893
  border: 2px solid @HCtextColor !important;
@@ -0,0 +1,22 @@
1
+ .music-editor-edit-controls {
2
+ display: flex;
3
+ flex-direction: row;
4
+ height: 2rem;
5
+ background-color: @music-editor-header-color;
6
+ justify-content: end;
7
+
8
+ .common-button.green {
9
+ padding: 0 2rem;
10
+ height: 100%;
11
+ margin: 0;
12
+ border-radius: 0;
13
+ }
14
+
15
+ button.menu-button i.fas, button.menu-button i.xicon {
16
+ font-size: 18px;
17
+ }
18
+
19
+ .common-input-group {
20
+ border-radius: 0;
21
+ }
22
+ }
@@ -0,0 +1,25 @@
1
+ @import "EditControls";
2
+ @import "Note";
3
+ @import "NoteGroup";
4
+ @import "PlaybackControls";
5
+ @import "ScrollableWorkspace";
6
+ @import "Staff";
7
+ @import "Track";
8
+ @import "TrackSelector";
9
+ @import "Workspace";
10
+
11
+ @music-editor-background-color: #fff;
12
+ @music-editor-header-color: #e30fc0;
13
+ @music-editor-header-border-color: #c10da3;
14
+
15
+ .music-editor {
16
+ background: @music-editor-background-color;
17
+ }
18
+
19
+ .music-asset-editor {
20
+ .gallery-editor-header {
21
+ background-color: @music-editor-header-color;
22
+ border: 2px solid @music-editor-header-border-color;
23
+ border-bottom: none;
24
+ }
25
+ }
@@ -0,0 +1,16 @@
1
+ .music-staff-note {
2
+ image {
3
+ image-rendering: optimizeSpeed;
4
+ image-rendering: -moz-crisp-edges;
5
+ image-rendering: -webkit-optimize-contrast;
6
+ image-rendering: optimize-contrast;
7
+ image-rendering: pixelated;
8
+ -ms-interpolation-mode: nearest-neighbor;
9
+ }
10
+
11
+ rect {
12
+ fill: #03adfc;
13
+ stroke: darken(#03adfc, 20%);
14
+ stroke-width: 3;
15
+ }
16
+ }
@@ -0,0 +1,7 @@
1
+ .music-staff-note-group.music-note-playing {
2
+ rect {
3
+ fill: #47c965;
4
+ stroke: darken(#47c965, 20%);
5
+ stroke-width: 3;
6
+ }
7
+ }
@@ -0,0 +1,55 @@
1
+ .music-playback-controls {
2
+ padding: 0.5rem;
3
+ display: flex;
4
+ flex-direction: row;
5
+ align-items: center;
6
+
7
+ .common-input-wrapper {
8
+ display: flex;
9
+ flex-direction: row;
10
+
11
+ .common-input-label {
12
+ padding-right: 0.5rem;
13
+ font-size: 18px;
14
+ font-weight: 700;
15
+ user-select: none;
16
+ }
17
+
18
+ .common-input-group {
19
+ max-width: 3rem;
20
+ }
21
+ }
22
+
23
+ & > .common-input-wrapper {
24
+ margin-right: 0.5rem;
25
+ }
26
+ }
27
+
28
+ .music-playback-buttons {
29
+ margin-right: 0.5rem;
30
+ }
31
+
32
+ .music-playback-label {
33
+ padding-right: 0.5rem;
34
+ font-size: 18px;
35
+ font-weight: 700;
36
+ user-select: none;
37
+ }
38
+
39
+ .music-playback-measures {
40
+ display: flex;
41
+ flex-direction: row;
42
+ align-items: center;
43
+ flex-grow: 1;
44
+ justify-content: end;
45
+
46
+ .common-button.menu-button {
47
+ color: black;
48
+ height: 2rem;
49
+ padding: 0.1rem;
50
+
51
+ i.fas {
52
+ margin: 0;
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,3 @@
1
+ .music-scrollable-workspace {
2
+ overflow-x: scroll;
3
+ }
@@ -0,0 +1,31 @@
1
+ .music-staff-row {
2
+ stroke-width: 3;
3
+ stroke: black;
4
+ }
5
+
6
+ .music-staff-beat {
7
+ stroke-width: 2;
8
+ stroke: #666666;
9
+ stroke-dasharray: 2;
10
+ }
11
+
12
+ .music-staff-beat.measure-start {
13
+ stroke: orange;
14
+ }
15
+
16
+ .music-staff-background {
17
+ fill: #c9e4e2;
18
+ }
19
+
20
+ .music-staff text {
21
+ user-select: none;
22
+ }
23
+
24
+ .music-playback-line {
25
+ stroke-width: 3;
26
+ stroke: white;
27
+ }
28
+
29
+ .music-playback-head {
30
+ transition: translate 0.06ms linear;
31
+ }
File without changes
@@ -0,0 +1,48 @@
1
+ .music-track-selector {
2
+ padding: 0.5rem;
3
+ display: flex;
4
+ flex-direction: row;
5
+
6
+ .common-button.common-dropdown-button {
7
+ border: 3px solid #000;
8
+ min-width: 6rem;
9
+ height: 100%;
10
+ }
11
+
12
+ .music-track-grid {
13
+ flex-grow: 1;
14
+ display: flex;
15
+ flex-direction: row;
16
+ justify-content: end;
17
+ align-items: center;
18
+ }
19
+
20
+ .music-track-grid-label {
21
+ padding-right: 0.5rem;
22
+ font-size: 18px;
23
+ font-weight: 700;
24
+ user-select: none;
25
+ }
26
+ }
27
+
28
+ .common-button.music-track-button {
29
+ border: 3px solid #000;
30
+ padding: 0.1rem;
31
+ border-radius: 0;
32
+
33
+ img {
34
+ image-rendering: optimizeSpeed;
35
+ image-rendering: -moz-crisp-edges;
36
+ image-rendering: -webkit-optimize-contrast;
37
+ image-rendering: optimize-contrast;
38
+ image-rendering: pixelated;
39
+ -ms-interpolation-mode: nearest-neighbor;
40
+
41
+ width: 2rem;
42
+ height: 2rem;
43
+ }
44
+ }
45
+
46
+ .common-button.music-track-button.selected {
47
+ border: 3px solid orange;
48
+ }
@@ -0,0 +1,3 @@
1
+ .music-workspace {
2
+ height: 20rem;
3
+ }
package/theme/pxt.less CHANGED
@@ -38,6 +38,7 @@
38
38
  @import 'webusb';
39
39
 
40
40
  @import 'image-editor/imageEditor';
41
+ @import 'music-editor/MusicEditor';
41
42
  @import "soundeffecteditor";
42
43
 
43
44
  @import "react-common";
@@ -11,6 +11,8 @@
11
11
 
12
12
  @tutorialLinkColor: #0064BF;
13
13
  @tutorialLinkHoverColor: #003C94;
14
+ @tutorialHintForegroundColor: #1A6771;
15
+ @tutorialHintBackgroundColor: #CEFFF5;
14
16
 
15
17
  @tutorialTabletButtonColor: #f3f3f3;
16
18
  @tutorialTabletSimulatorButtonColor: rgba(0, 0, 0, 0.05);
@@ -278,6 +280,18 @@
278
280
  bottom: 5rem;
279
281
  left: 3rem;
280
282
  max-width: 50%;
283
+ border-color: @tutorialHintBackgroundColor;
284
+
285
+ .hint-title {
286
+ margin-top: -.75rem;
287
+ > span {
288
+ font-weight: 700;
289
+ background-color: @tutorialHintBackgroundColor;
290
+ color: @tutorialHintForegroundColor;
291
+ padding: 0.25rem 0.75rem;
292
+ border-radius: 0.5rem;
293
+ }
294
+ }
281
295
  }
282
296
 
283
297
  .tutorial-callout:before {
@@ -522,13 +536,15 @@
522
536
  /*********************************
523
537
  Accordion Hints (details)
524
538
  *********************************/
525
-
526
539
  .tabTutorial details {
527
540
  padding: .5rem;
528
541
  margin-bottom: 1rem;
529
- color: #028b9b;
530
- background-color: #b1e3da;
542
+ color: @tutorialHintForegroundColor;
543
+ background-color: @tutorialHintBackgroundColor;
531
544
  border-radius: .5rem;
545
+ summary {
546
+ cursor: pointer;
547
+ }
532
548
  }
533
549
 
534
550
 
@@ -405,8 +405,8 @@ code.lang-filterblocks {
405
405
  transform: rotateZ(-135deg);
406
406
  }
407
407
 
408
- .tutorialhint > div,
409
- .tutorial-callout > div {
408
+ .tutorialhint > .hint-content,
409
+ .tutorial-callout > .hint-content {
410
410
  max-height: 60vh;
411
411
  overflow: auto;
412
412
  padding-right: 2rem;
@@ -1 +1 @@
1
- <!doctype html><html lang="@locale@"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>MakeCode Arcade Multiplayer</title><link rel="stylesheet" data-rtl="/blb/rtlsemantic.css" href="/blb/semantic.css"><link rel="stylesheet" href="/blb/icons.css"><link rel="stylesheet" href="/blb/react-common-multiplayer.css"><script defer="defer" src="/blb/multiplayer/js/main.eec6d6c2.js"></script><link href="/blb/multiplayer/css/main.b0b14e9a.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><script type="text/javascript" src="/blb/target.js"></script><script type="text/javascript" src="/blb/pxtlib.js"></script><div id="root"></div><script>var pxtConfig=null</script></body></html>
1
+ <!doctype html><html lang="@locale@"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>MakeCode Arcade Multiplayer</title><link rel="stylesheet" data-rtl="/blb/rtlsemantic.css" href="/blb/semantic.css"><link rel="stylesheet" href="/blb/icons.css"><link rel="stylesheet" href="/blb/react-common-multiplayer.css"><script defer="defer" src="/blb/multiplayer/js/main.f3b8f930.js"></script><link href="/blb/multiplayer/css/main.2dd69ed8.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><script type="text/javascript" src="/blb/target.js"></script><script type="text/javascript" src="/blb/pxtlib.js"></script><div id="root"></div><script>var pxtConfig=null</script></body></html>
@@ -28,5 +28,5 @@
28
28
  <!-- end usabilla live embed code -->
29
29
 
30
30
  <!-- @include thin-footer.html -->
31
- <script>!function(e){function r(r){for(var n,l,i=r[0],a=r[1],p=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var a=t[i];0!==o[a]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this.webpackJsonpskillsmap=this.webpackJsonpskillsmap||[],a=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var f=a;t()}([])</script><script src="/blb/skillmap/js/2.d9c1cec5.chunk.js"></script><script src="/blb/skillmap/js/main.6fa0eaff.chunk.js"></script></body>
31
+ <script>!function(e){function r(r){for(var n,l,i=r[0],a=r[1],p=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var a=t[i];0!==o[a]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this.webpackJsonpskillsmap=this.webpackJsonpskillsmap||[],a=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var f=a;t()}([])</script><script src="/blb/skillmap/js/2.d9c1cec5.chunk.js"></script><script src="/blb/skillmap/js/main.a6cf40e1.chunk.js"></script></body>
32
32
  </html>