cubing 0.65.1 → 0.65.2

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 (77) hide show
  1. package/dist/bin/chunks/{chunk-PDPPBQ4O.js → chunk-Z5QOJAME.js} +2 -2
  2. package/dist/bin/order.js +1 -1
  3. package/dist/bin/puzzle-geometry-bin.js +1 -1
  4. package/dist/bin/scramble.js +1 -1
  5. package/dist/bin/svg.js +1 -1
  6. package/dist/lib/cubing/alg/index.d.ts +2 -2
  7. package/dist/lib/cubing/alg/index.js +1 -1
  8. package/dist/lib/cubing/bluetooth/index.d.ts +12 -13
  9. package/dist/lib/cubing/bluetooth/index.js +5 -5
  10. package/dist/lib/cubing/chunks/{big-puzzle-orientation-G75BXW2W.js → big-puzzle-orientation-7WHPJCCO.js} +2 -2
  11. package/dist/lib/cubing/chunks/{chunk-4ADGSRLK.js → chunk-2BVL5OQE.js} +5 -5
  12. package/dist/lib/cubing/chunks/{chunk-KHUP3BPA.js → chunk-2IA2R7XV.js} +4 -4
  13. package/dist/lib/cubing/chunks/{chunk-5LBACZOM.js → chunk-5FXQPBXH.js} +4 -4
  14. package/dist/lib/cubing/chunks/{chunk-GO2SL6SC.js → chunk-6K433TB5.js} +3 -3
  15. package/dist/lib/cubing/chunks/{chunk-THRYJMRP.js → chunk-BQPY6252.js} +2 -2
  16. package/dist/lib/cubing/chunks/{chunk-O2QJENHE.js → chunk-IRY6MBI2.js} +3 -3
  17. package/dist/lib/cubing/chunks/{chunk-DT3GVMDI.js → chunk-MFKLAFPQ.js} +3 -3
  18. package/dist/lib/cubing/chunks/{chunk-UWJ575HH.js → chunk-MIHF623Z.js} +3 -3
  19. package/dist/lib/cubing/chunks/{chunk-YFNXHRNE.js → chunk-UP5VP7GL.js} +60 -7
  20. package/dist/lib/cubing/chunks/chunk-UP5VP7GL.js.map +7 -0
  21. package/dist/lib/cubing/chunks/{chunk-ALR6ZQFC.js → chunk-YSAQ6DRT.js} +2 -2
  22. package/dist/lib/cubing/chunks/{inside-IHWUJJ56.js → inside-N5WSMI7I.js} +14 -14
  23. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-YSB3MWLK.js → search-dynamic-sgs-side-events-5EIXNDVI.js} +6 -6
  24. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-OLK64DE6.js → search-dynamic-sgs-unofficial-Y7SIOVIX.js} +6 -6
  25. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-Y7SIOVIX.js.map +7 -0
  26. package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-2A2XBBWI.js → search-dynamic-solve-4x4x4-FRAX3IPQ.js} +7 -7
  27. package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-FRAX3IPQ.js.map +7 -0
  28. package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-ZZKLTONP.js → search-dynamic-solve-fto-TI4TFL6X.js} +2 -2
  29. package/dist/lib/cubing/chunks/search-dynamic-solve-fto-TI4TFL6X.js.map +7 -0
  30. package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-PUF4PRHS.js → search-dynamic-solve-kilominx-UKFT6I42.js} +2 -2
  31. package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-UKFT6I42.js.map +7 -0
  32. package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
  33. package/dist/lib/cubing/chunks/{twips-LHO3IYJC.js → twips-UCWWA2WI.js} +2 -2
  34. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-A2G22YLA.js → twisty-dynamic-3d-O5TGOSAO.js} +105 -90
  35. package/dist/lib/cubing/chunks/twisty-dynamic-3d-O5TGOSAO.js.map +7 -0
  36. package/dist/lib/cubing/{index-DVoQwgPC.d.ts → index-BQdS3h4z.d.ts} +42 -38
  37. package/dist/lib/cubing/{index-DO__MgsX.d.ts → index-COSxNAgV.d.ts} +1 -2
  38. package/dist/lib/cubing/kpuzzle/index.d.ts +2 -2
  39. package/dist/lib/cubing/kpuzzle/index.js +2 -2
  40. package/dist/lib/cubing/notation/index.d.ts +1 -2
  41. package/dist/lib/cubing/notation/index.js +4 -4
  42. package/dist/lib/cubing/{outside-D6O0WicV.d.ts → outside-BRtF0DA2.d.ts} +2 -1
  43. package/dist/lib/cubing/protocol/index.d.ts +1 -2
  44. package/dist/lib/cubing/protocol/index.js +4 -4
  45. package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -2
  46. package/dist/lib/cubing/puzzle-geometry/index.js +1 -1
  47. package/dist/lib/cubing/puzzles/index.d.ts +2 -2
  48. package/dist/lib/cubing/puzzles/index.js +4 -4
  49. package/dist/lib/cubing/scramble/index.d.ts +1 -1
  50. package/dist/lib/cubing/scramble/index.js +6 -6
  51. package/dist/lib/cubing/search/index.d.ts +3 -4
  52. package/dist/lib/cubing/search/index.js +6 -6
  53. package/dist/lib/cubing/stream/index.d.ts +2 -2
  54. package/dist/lib/cubing/stream/index.js +1 -1
  55. package/dist/lib/cubing/twisty/index.d.ts +2 -2
  56. package/dist/lib/cubing/twisty/index.js +6 -6
  57. package/package.json +10 -9
  58. package/dist/lib/cubing/chunks/chunk-YFNXHRNE.js.map +0 -7
  59. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-OLK64DE6.js.map +0 -7
  60. package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-2A2XBBWI.js.map +0 -7
  61. package/dist/lib/cubing/chunks/search-dynamic-solve-fto-ZZKLTONP.js.map +0 -7
  62. package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-PUF4PRHS.js.map +0 -7
  63. package/dist/lib/cubing/chunks/twisty-dynamic-3d-A2G22YLA.js.map +0 -7
  64. /package/dist/bin/chunks/{chunk-PDPPBQ4O.js.map → chunk-Z5QOJAME.js.map} +0 -0
  65. /package/dist/lib/cubing/chunks/{big-puzzle-orientation-G75BXW2W.js.map → big-puzzle-orientation-7WHPJCCO.js.map} +0 -0
  66. /package/dist/lib/cubing/chunks/{chunk-4ADGSRLK.js.map → chunk-2BVL5OQE.js.map} +0 -0
  67. /package/dist/lib/cubing/chunks/{chunk-KHUP3BPA.js.map → chunk-2IA2R7XV.js.map} +0 -0
  68. /package/dist/lib/cubing/chunks/{chunk-5LBACZOM.js.map → chunk-5FXQPBXH.js.map} +0 -0
  69. /package/dist/lib/cubing/chunks/{chunk-GO2SL6SC.js.map → chunk-6K433TB5.js.map} +0 -0
  70. /package/dist/lib/cubing/chunks/{chunk-THRYJMRP.js.map → chunk-BQPY6252.js.map} +0 -0
  71. /package/dist/lib/cubing/chunks/{chunk-O2QJENHE.js.map → chunk-IRY6MBI2.js.map} +0 -0
  72. /package/dist/lib/cubing/chunks/{chunk-DT3GVMDI.js.map → chunk-MFKLAFPQ.js.map} +0 -0
  73. /package/dist/lib/cubing/chunks/{chunk-UWJ575HH.js.map → chunk-MIHF623Z.js.map} +0 -0
  74. /package/dist/lib/cubing/chunks/{chunk-ALR6ZQFC.js.map → chunk-YSAQ6DRT.js.map} +0 -0
  75. /package/dist/lib/cubing/chunks/{inside-IHWUJJ56.js.map → inside-N5WSMI7I.js.map} +0 -0
  76. /package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-YSB3MWLK.js.map → search-dynamic-sgs-side-events-5EIXNDVI.js.map} +0 -0
  77. /package/dist/lib/cubing/chunks/{twips-LHO3IYJC.js.map → twips-UCWWA2WI.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cubing/vendor/mit/cs0x7f/fto/scramble_fto_standalone.js"],
4
+ "sourcesContent": ["// @ts-nocheck\n\n// From https://gist.github.com/cs0x7f/1579492aa43c794d529057386c489702\n\n\"use strict\";\n\nimport { randomUIntBelow } from \"random-uint-below\";\nimport { Alg } from \"../../../../../cubing/alg/index.ts\";\n\n/*\nMIT Licence\n\nCopyright (c) 2024 Chen Shuang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n/*\n\n*/\nvar DEBUG = false;\n\nvar mathlib = (function() {\n\tvar fact = [1];\n\tfor (var i = 0; i < 32; ++i) {\n\t\tfact[i + 1] = fact[i] * (i + 1);\n\t}\n\n\tfunction circle(arr) {\n\t\tvar length = arguments.length - 1,\n\t\t\ttemp = arr[arguments[length]];\n\t\tfor (var i = length; i > 1; i--) {\n\t\t\tarr[arguments[i]] = arr[arguments[i - 1]];\n\t\t}\n\t\tarr[arguments[1]] = temp;\n\t\treturn circle;\n\t}\n\n\tfunction getPruning(table, index) {\n\t\treturn table[index >> 3] >> ((index & 7) << 2) & 15;\n\t}\n\n\tfunction setNPerm(arr, idx, n, even) {\n\t\tvar prt = 0;\n\t\tif (even < 0) {\n\t\t\tidx <<= 1;\n\t\t}\n\t\tif (n >= 16) {\n\t\t\tarr[n - 1] = 0;\n\t\t\tfor (var i = n - 2; i >= 0; i--) {\n\t\t\t\tarr[i] = idx % (n - i);\n\t\t\t\tprt ^= arr[i];\n\t\t\t\tidx = ~~(idx / (n - i));\n\t\t\t\tfor (var j = i + 1; j < n; j--) {\n\t\t\t\t\tarr[j] >= arr[i] && arr[j]++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (even < 0 && (prt & 1) != 0) {\n\t\t\t\tvar tmp = arr[n - 1];\n\t\t\t\tarr[n - 1] = arr[n - 2];\n\t\t\t\tarr[n - 2] = tmp;\n\t\t\t}\n\t\t\treturn arr;\n\t\t}\n\t\tvar vall = 0x76543210;\n\t\tvar valh = 0xfedcba98;\n\t\tfor (var i = 0; i < n - 1; i++) {\n\t\t\tvar p = fact[n - 1 - i];\n\t\t\tvar v = idx / p;\n\t\t\tidx = idx % p;\n\t\t\tprt ^= v;\n\t\t\tv <<= 2;\n\t\t\tif (v >= 32) {\n\t\t\t\tv = v - 32;\n\t\t\t\tarr[i] = valh >> v & 0xf;\n\t\t\t\tvar m = (1 << v) - 1;\n\t\t\t\tvalh = (valh & m) + ((valh >> 4) & ~m);\n\t\t\t} else {\n\t\t\t\tarr[i] = vall >> v & 0xf;\n\t\t\t\tvar m = (1 << v) - 1;\n\t\t\t\tvall = (vall & m) + ((vall >>> 4) & ~m) + (valh << 28);\n\t\t\t\tvalh = valh >> 4;\n\t\t\t}\n\t\t}\n\t\tif (even < 0 && (prt & 1) != 0) {\n\t\t\tarr[n - 1] = arr[n - 2];\n\t\t\tarr[n - 2] = vall & 0xf;\n\t\t} else {\n\t\t\tarr[n - 1] = vall & 0xf;\n\t\t}\n\t\treturn arr;\n\t}\n\n\tfunction getNPerm(arr, n, even) {\n\t\tn = n || arr.length;\n\t\tvar idx = 0;\n\t\tif (n >= 16) {\n\t\t\tfor (var i = 0; i < n - 1; i++) {\n\t\t\t\tidx *= n - i;\n\t\t\t\tfor (var j = i + 1; j < n; j++) {\n\t\t\t\t\tarr[j] < arr[i] && idx++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn even < 0 ? (idx >> 1) : idx;\n\t\t}\n\t\tvar vall = 0x76543210;\n\t\tvar valh = 0xfedcba98;\n\t\tfor (var i = 0; i < n - 1; i++) {\n\t\t\tvar v = arr[i] << 2;\n\t\t\tidx *= n - i;\n\t\t\tif (v >= 32) {\n\t\t\t\tidx += (valh >> (v - 32)) & 0xf;\n\t\t\t\tvalh -= 0x11111110 << (v - 32);\n\t\t\t} else {\n\t\t\t\tidx += (vall >> v) & 0xf;\n\t\t\t\tvalh -= 0x11111111;\n\t\t\t\tvall -= 0x11111110 << v;\n\t\t\t}\n\t\t}\n\t\treturn even < 0 ? (idx >> 1) : idx;\n\t}\n\n\tfunction getNParity(idx, n) {\n\t\tvar i, p;\n\t\tp = 0;\n\t\tfor (i = n - 2; i >= 0; --i) {\n\t\t\tp ^= idx % (n - i);\n\t\t\tidx = ~~(idx / (n - i));\n\t\t}\n\t\treturn p & 1;\n\t}\n\n\tfunction getNOri(arr, n, evenbase) {\n\t\tvar base = Math.abs(evenbase);\n\t\tvar idx = evenbase < 0 ? 0 : arr[0] % base;\n\t\tfor (var i = n - 1; i > 0; i--) {\n\t\t\tidx = idx * base + arr[i] % base;\n\t\t}\n\t\treturn idx;\n\t}\n\n\tfunction setNOri(arr, idx, n, evenbase) {\n\t\tvar base = Math.abs(evenbase);\n\t\tvar parity = base * n;\n\t\tfor (var i = 1; i < n; i++) {\n\t\t\tarr[i] = idx % base;\n\t\t\tparity -= arr[i];\n\t\t\tidx = ~~(idx / base);\n\t\t}\n\t\tarr[0] = (evenbase < 0 ? parity : idx) % base;\n\t\treturn arr;\n\t}\n\n\tfunction bitCount(x) {\n\t\tx -= (x >> 1) & 0x55555555;\n\t\tx = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n\t\treturn ((x + (x >> 4) & 0xf0f0f0f) * 0x1010101) >> 24;\n\t}\n\n\tfunction getMPerm(arr, n, cnts, cums) {\n\t\tvar seen = ~0;\n\t\tvar idx = 0;\n\t\tvar x = 1;\n\t\tfor (var i = 0; i < n; i++) {\n\t\t\tvar pi = arr[i];\n\t\t\tidx = idx * (n - i) + bitCount(seen & ((1 << cums[pi]) - 1)) * x;\n\t\t\tx = x * cnts[pi]--;\n\t\t\tseen &= ~(1 << (cums[pi] + cnts[pi]));\n\t\t}\n\t\treturn Math.round(idx / x);\n\t}\n\n\tfunction setMPerm(arr, idx, n, cnts, x) {\n\t\tfor (var i = 0; i < n; i++) {\n\t\t\tfor (var j = 0; j < cnts.length; j++) {\n\t\t\t\tif (cnts[j] == 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar x2 = ~~(x * cnts[j] / (n - i));\n\t\t\t\tif (idx < x2) {\n\t\t\t\t\tcnts[j]--;\n\t\t\t\t\tarr[i] = j;\n\t\t\t\t\tx = x2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tidx -= x2;\n\t\t\t}\n\t\t}\n\t\treturn arr;\n\t}\n\n\t// type: 'p' (permutation), 'o' (orientation), 'c' (combination)\n\t// evenbase: base for ori, sign for even parity, cnts for combination\n\tfunction Coord(type, length, evenbase) {\n\t\tthis.length = length;\n\t\tthis.evenbase = evenbase;\n\t\tif (type == 'p') {\n\t\t\tthis.get = function(arr) {\n\t\t\t\treturn getNPerm(arr, this.length, this.evenbase);\n\t\t\t};\n\t\t\tthis.set = function(arr, idx) {\n\t\t\t\treturn setNPerm(arr, idx, this.length, this.evenbase);\n\t\t\t};\n\t\t} else if (type == 'o') {\n\t\t\tthis.get = function(arr) {\n\t\t\t\treturn getNOri(arr, this.length, this.evenbase);\n\t\t\t};\n\t\t\tthis.set = function(arr, idx) {\n\t\t\t\treturn setNOri(arr, idx, this.length, this.evenbase);\n\t\t\t};\n\t\t} else if (type == 'c') {\n\t\t\tvar cnts = evenbase;\n\t\t\tthis.cnts = cnts.slice();\n\t\t\tthis.cntn = this.cnts.length;\n\t\t\tthis.cums = [0];\n\t\t\tfor (var i = 1; i <= this.cntn; i++) {\n\t\t\t\tthis.cums[i] = this.cums[i - 1] + cnts[i - 1];\n\t\t\t}\n\t\t\tthis.n = this.cums[this.cntn];\n\t\t\tvar n = this.n;\n\t\t\tvar x = 1;\n\t\t\tfor (var i = 0; i < this.cntn; i++) {\n\t\t\t\tfor (var j = 1; j <= cnts[i]; j++, n--) {\n\t\t\t\t\tx *= n / j;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.x = Math.round(x);\n\t\t\tthis.get = function(arr) {\n\t\t\t\treturn getMPerm(arr, this.n, this.cnts.slice(), this.cums);\n\t\t\t};\n\t\t\tthis.set = function(arr, idx) {\n\t\t\t\treturn setMPerm(arr, idx, this.n, this.cnts.slice(), this.x);\n\t\t\t};\n\t\t} else { // invalid type\n\t\t\tdebugger;\n\t\t}\n\t}\n\n\tfunction fillFacelet(facelets, f, perm, ori, divcol) {\n\t\tfor (var i = 0; i < facelets.length; i++) {\n\t\t\tvar cubie = facelets[i];\n\t\t\tvar p = perm[i] === undefined ? i : perm[i];\n\t\t\tif (typeof(cubie) == 'number') {\n\t\t\t\tf[cubie] = ~~(facelets[p] / divcol);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar o = ori[i] || 0;\n\t\t\tfor (var j = 0; j < cubie.length; j++) {\n\t\t\t\tf[cubie[(j + o) % cubie.length]] = ~~(facelets[p][j] / divcol);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction detectFacelet(facelets, f, perm, ori, divcol) {\n\t\tfor (var i = 0; i < facelets.length; i++) {\n\t\t\tvar n_ori = facelets[i].length;\n\t\t\touter_loop: for (var j = 0; j < facelets.length + 1; j++) {\n\t\t\t\tif (j == facelets.length) { // not matched\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (facelets[j].length != n_ori) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfor (var o = 0; o < n_ori; o++) {\n\t\t\t\t\tvar isMatch = true;\n\t\t\t\t\tfor (var t = 0; t < n_ori; t++) {\n\t\t\t\t\t\tif (~~(facelets[j][t] / divcol) != f[facelets[i][(t + o) % n_ori]]) {\n\t\t\t\t\t\t\tisMatch = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (isMatch) {\n\t\t\t\t\t\tperm[i] = j;\n\t\t\t\t\t\tori[i] = o;\n\t\t\t\t\t\tbreak outer_loop;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\n\tfunction createMoveHash(initState, validMoves, hashFunc, moveFunc) {\n\t\tvar states = [initState];\n\t\tvar hash2idx = {};\n\t\tvar depthEnds = [];\n\t\thash2idx[hashFunc(initState)] = 0;\n\t\tdepthEnds[0] = 1;\n\t\tvar moveTable = [];\n\t\tfor (var m = 0; m < validMoves.length; m++) {\n\t\t\tmoveTable[m] = [];\n\t\t}\n\t\tvar tt = +new Date;\n\t\tfor (var i = 0; i < states.length; i++) {\n\t\t\tif (i == depthEnds[depthEnds.length - 1]) {\n\t\t\t\tdepthEnds.push(states.length);\n\t\t\t}\n\t\t\tif (i % 10000 == 9999) {\n\t\t\t\tDEBUG && console.log(i, 'states scanned, tt=', +new Date - tt);\n\t\t\t}\n\t\t\tvar curState = states[i];\n\t\t\tfor (var m = 0; m < validMoves.length; m++) {\n\t\t\t\tvar newState = moveFunc(curState, validMoves[m]);\n\t\t\t\tif (!newState) {\n\t\t\t\t\tmoveTable[m][i] = -1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar newHash = hashFunc(newState);\n\t\t\t\tif (!(newHash in hash2idx)) {\n\t\t\t\t\thash2idx[newHash] = states.length;\n\t\t\t\t\tstates.push(newState);\n\t\t\t\t}\n\t\t\t\tmoveTable[m][i] = hash2idx[newHash];\n\t\t\t}\n\t\t}\n\t\tDEBUG && console.log('[move hash] ' + states.length + ' states generated, tt=', +new Date - tt, JSON.stringify(depthEnds));\n\t\treturn [moveTable, hash2idx];\n\t}\n\n\tfunction createPrun(prun, init, size, maxd, doMove, N_MOVES, N_POWER, N_INV) {\n\t\tvar isMoveTable = Array.isArray(doMove);\n\t\tN_MOVES = N_MOVES || 6;\n\t\tN_POWER = N_POWER || 3;\n\t\tN_INV = N_INV || 256;\n\t\tmaxd = maxd || 256;\n\t\tfor (var i = 0, len = (size + 7) >>> 3; i < len; i++) {\n\t\t\tprun[i] = -1;\n\t\t}\n\t\tif (!Array.isArray(init)) {\n\t\t\tinit = [init];\n\t\t}\n\t\tfor (var i = 0; i < init.length; i++) {\n\t\t\tprun[init[i] >> 3] ^= 15 << ((init[i] & 7) << 2);\n\t\t}\n\t\tvar val = 0;\n\t\t// var t = +new Date;\n\t\tfor (var l = 0; l <= maxd; l++) {\n\t\t\tvar done = 0;\n\t\t\tvar inv = l >= N_INV;\n\t\t\tvar fill = (l + 1) ^ 15;\n\t\t\tvar find = inv ? 0xf : l;\n\t\t\tvar check = inv ? l : 0xf;\n\n\t\t\touter_loop: for (var p = 0; p < size; p++, val >>= 4) {\n\t\t\t\tif ((p & 7) == 0) {\n\t\t\t\t\tval = prun[p >> 3];\n\t\t\t\t\tif (!inv && val == -1) {\n\t\t\t\t\t\tp += 7;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ((val & 0xf) != find) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfor (var m = 0; m < N_MOVES; m++) {\n\t\t\t\t\tvar q = p;\n\t\t\t\t\tfor (var c = 0; c < N_POWER; c++) {\n\t\t\t\t\t\tq = isMoveTable ? doMove[m][q] : doMove(q, m);\n\t\t\t\t\t\tif (q < 0) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (getPruning(prun, q) != check) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t++done;\n\t\t\t\t\t\tif (inv) {\n\t\t\t\t\t\t\tprun[p >> 3] ^= fill << ((p & 7) << 2);\n\t\t\t\t\t\t\tcontinue outer_loop;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprun[q >> 3] ^= fill << ((q & 7) << 2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (done == 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDEBUG && console.log('[prun]', done);\n\t\t}\n\t}\n\n\t// ida search algorithm\n\t// isSolved(state) -> boolean, in case isSolved = null, getPrun(idx) == 0 is used\n\t// getPrun(state) -> int\n\t// doMove(state) -> newState\n\t// if ckmv[last_move] >> cur_move & 1, cur_move is skipped\n\tfunction Searcher(isSolved, getPrun, doMove, N_AXIS, N_POWER, ckmv) {\n\t\tthis.isSolved = isSolved || function() { return true; };\n\t\tthis.getPrun = getPrun;\n\t\tthis.doMove = doMove;\n\t\tthis.N_AXIS = N_AXIS;\n\t\tthis.N_POWER = N_POWER;\n\t\tthis.ckmv = ckmv || valuedArray(N_AXIS, function(i) { return 1 << i; } );\n\t}\n\n\tvar _ = Searcher.prototype;\n\n\t_.solve = function(idx, minl, MAXL, callback) {\n\t\tvar sols = this.solveMulti([idx], minl, MAXL, callback);\n\t\treturn sols == null ? null : sols[0];\n\t};\n\n\t_.solveMulti = function(idxs, minl, MAXL, callback) {\n\t\tthis.callback = callback || function() { return true; };\n\t\tvar sol = [];\n\t\touter_loop: for (var l = minl; l <= MAXL; l++) {\n\t\t\tfor (var s = 0; s < idxs.length; s++) {\n\t\t\t\tthis.sidx = s;\n\t\t\t\tif (this.idaSearch(idxs[s], l, -1, sol) == 0) {\n\t\t\t\t\tbreak outer_loop;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.sidx = -1;\n\t\t}\n\t\treturn this.sidx == -1 ? null : [sol, this.sidx];\n\t};\n\n\t_.idaSearch = function(idx, maxl, lm, sol) {\n\t\tvar prun = this.getPrun(idx);\n\t\tif (prun > maxl) {\n\t\t\treturn prun > maxl + 1 ? 2 : 1;\n\t\t}\n\t\tif (maxl == 0) {\n\t\t\treturn this.isSolved(idx) && this.callback(sol, this.sidx) ? 0 : 1;\n\t\t}\n\t\tif (prun == 0 && this.isSolved(idx) && maxl == 1) {\n\t\t\treturn 1;\n\t\t}\n\t\tfor (var axis = 0; axis < this.N_AXIS; axis++) {\n\t\t\tif (this.ckmv[lm] >> axis & 1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar idx1 = Array.isArray(idx) ? idx.slice() : idx;\n\t\t\tfor (var pow = 0; pow < this.N_POWER; pow++) {\n\t\t\t\tidx1 = this.doMove(idx1, axis);\n\t\t\t\tif (idx1 == null) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tsol.push([axis, pow]);\n\t\t\t\tvar ret = this.idaSearch(idx1, maxl - 1, axis, sol);\n\t\t\t\tif (ret == 0) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\tsol.pop();\n\t\t\t\tif (ret == 2) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn 1;\n\t};\n\n\tfunction rn(n) {\n\t\treturn randomUIntBelow(n)\n\t}\n\n\tfunction rndPerm(n, isEven) {\n\t\tvar p = 0;\n\t\tvar arr = [];\n\t\tfor (var i = 0; i < n; i++) {\n\t\t\tarr[i] = i;\n\t\t}\n\t\tfor (var i = 0; i < n - 1; i++) {\n\t\t\tvar k = rn(n - i);\n\t\t\tcircle(arr, i, i + k);\n\t\t\tp ^= k != 0;\n\t\t}\n\t\tif (isEven && p) {\n\t\t\tcircle(arr, 0, 1);\n\t\t}\n\t\treturn arr;\n\t}\n\n\tfunction valuedArray(len, val) {\n\t\tvar ret = [];\n\t\tvar isFun = typeof val == 'function';\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tret[i] = isFun ? val(i) : val;\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction permOriMult(p1, p2, prod, o1, o2, ori, oriMod) {\n\t\tfor (var i = 0; i < p2.length; i++) {\n\t\t\tif (oriMod) {\n\t\t\t\tori[i] = (o1[p2[i]] + o2[i]) % oriMod;\n\t\t\t}\n\t\t\tprod[i] = p1[p2[i]];\n\t\t}\n\t}\n\n\treturn {\n\t\tbitCount: bitCount,\n\t\tgetPruning: getPruning,\n\t\tsetNOri: setNOri,\n\t\tgetNOri: getNOri,\n\t\tgetNPerm: getNPerm,\n\t\tgetNParity: getNParity,\n\t\tCoord: Coord,\n\t\tcreateMoveHash: createMoveHash,\n\t\tcreatePrun: createPrun,\n\t\tfillFacelet: fillFacelet,\n\t\tdetectFacelet: detectFacelet,\n\t\trn: rn,\n\t\tvaluedArray: valuedArray,\n\t\tSearcher: Searcher,\n\t\trndPerm: rndPerm,\n\t\tpermOriMult: permOriMult,\n\t};\n})();\n\nvar ftosolver = (function() {\n\t//face-turning octahedron cube w/o identical pieces\n\tfunction FtoCubie(cp, co, ep, uf, rl) {\n\t\tthis.cp = (cp && cp.slice()) || [0, 1, 2, 3, 4, 5];\n\t\tthis.co = (co && co.slice()) || [0, 0, 0, 0, 0, 0];\n\t\tthis.ep = (ep && ep.slice()) || [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\n\t\tthis.uf = (uf && uf.slice()) || [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\n\t\tthis.rl = (rl && rl.slice()) || [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];\n\t}\n\n\tvar U = 0, F = 9, r = 18, l = 27, D = 36, B = 45, R = 54, L = 63;\n\n\tvar cornFacelets = [\n\t\t[U + 0, R + 0, F + 0, L + 0],\n\t\t[U + 4, B + 8, r + 4, R + 8],\n\t\t[U + 8, L + 4, l + 8, B + 4],\n\t\t[l + 0, D + 0, r + 0, B + 0],\n\t\t[F + 4, D + 8, l + 4, L + 8],\n\t\t[r + 8, D + 4, F + 8, R + 4]\n\t];\n\n\tvar edgeFacelets = [\n\t\t[U + 1, R + 3], [U + 3, L + 1], [U + 6, B + 6],\n\t\t[l + 1, D + 3], [r + 3, D + 1], [F + 6, D + 6],\n\t\t[F + 3, R + 1], [F + 1, L + 3], [l + 6, L + 6],\n\t\t[l + 3, B + 1], [r + 1, B + 3], [r + 6, R + 6]\n\t];\n\n\tvar ctufFacelets = [\n\t\tU + 2, U + 5, U + 7,\n\t\tF + 2, F + 5, F + 7,\n\t\tr + 2, r + 5, r + 7,\n\t\tl + 2, l + 5, l + 7\n\t];\n\n\tvar ctrlFacelets = [\n\t\tD + 2, D + 5, D + 7,\n\t\tB + 2, B + 5, B + 7,\n\t\tL + 2, L + 5, L + 7,\n\t\tR + 2, R + 5, R + 7\n\t];\n\n\tFtoCubie.prototype.isEqual = function(fc) {\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tif (this.ep[i] != fc.ep[i] || this.uf[i] != fc.uf[i] || this.rl[i] != fc.rl[i]\n\t\t\t\t\t|| i < 6 && (this.cp[i] != fc.cp[i] || this.co[i] != fc.co[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tFtoCubie.prototype.toFaceCube = function(todiv) {\n\t\tvar f = [];\n\t\ttodiv = todiv || 9;\n\t\tvar co = [];\n\t\tfor (var i = 0; i < 6; i++) {\n\t\t\tco[i] = this.co[i] * 2;\n\t\t}\n\t\tmathlib.fillFacelet(cornFacelets, f, this.cp, co, todiv);\n\t\tmathlib.fillFacelet(edgeFacelets, f, this.ep, [], todiv);\n\t\tmathlib.fillFacelet(ctufFacelets, f, this.uf, null, todiv);\n\t\tmathlib.fillFacelet(ctrlFacelets, f, this.rl, null, todiv);\n\t\treturn f;\n\t}\n\n\tFtoCubie.prototype.fromFacelet = function(facelet) {\n\t\tvar count = 0;\n\t\tvar f = [];\n\t\tfor (var i = 0; i < 72; ++i) {\n\t\t\tf[i] = facelet[i];\n\t\t\tcount += Math.pow(16, f[i]);\n\t\t}\n\t\tif (count != 0x99999999) {\n\t\t\treturn -1;\n\t\t}\n\t\tvar co = [];\n\t\tif (mathlib.detectFacelet(cornFacelets, f, this.cp, co, 9) == -1\n\t\t\t\t|| mathlib.detectFacelet(edgeFacelets, f, this.ep, [], 9) == -1) {\n\t\t\treturn -1;\n\t\t}\n\t\tvar parity = 0;\n\t\tfor (var i = 0; i < 6; i++) {\n\t\t\tthis.co[i] = co[i] >> 1;\n\t\t\tparity ^= this.co[i];\n\t\t}\n\t\tif (parity != 0\n\t\t\t\t|| mathlib.getNParity(mathlib.getNPerm(this.cp, 6), 6) != 0\n\t\t\t\t|| mathlib.getNParity(mathlib.getNPerm(this.ep, 12), 12) != 0) {\n\t\t\treturn -1;\n\t\t}\n\t\tvar remainCnts = [3, 3, 3, 3];\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tvar col = f[ctufFacelets[i]];\n\t\t\tif (!(remainCnts[col] > 0)) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tthis.uf[i] = col * 3 + 3 - remainCnts[col];\n\t\t\tremainCnts[col]--;\n\t\t}\n\t\tremainCnts = [3, 3, 3, 3];\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tvar col = [0, 1, 3, 2][f[ctrlFacelets[i]] - 4];\n\t\t\tif (!(remainCnts[col] > 0)) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tthis.rl[i] = col * 3 + 3 - remainCnts[col];\n\t\t\tremainCnts[col]--;\n\t\t}\n\t\tif (mathlib.getNParity(mathlib.getNPerm(this.uf, 12), 12) != 0) {\n\t\t\tfor (var i = 0; i < 12; i++) { // swap 0 and 1 to fix parity\n\t\t\t\tthis.uf[i] ^= this.uf[i] < 2 ? 1 : 0;\n\t\t\t}\n\t\t}\n\t\tif (mathlib.getNParity(mathlib.getNPerm(this.rl, 12), 12) != 0) {\n\t\t\tfor (var i = 0; i < 12; i++) { // swap 0 and 1 to fix parity\n\t\t\t\tthis.rl[i] ^= this.rl[i] < 2 ? 1 : 0;\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tFtoCubie.prototype.toString = function(todiv) {\n\t\tvar f = this.toFaceCube(todiv);\n\t\tvar ret = '' +\n\t\t\t' U8 U7 U6 U5 U4 B8 B7 B6 B5 B4\\n' +\n\t\t\t'L4 U3 U2 U1 R8 r4 B3 B2 B1 l8\\n' +\n\t\t\t'L5 L1 U0 R3 R7 r5 r1 B0 l3 l7\\n' +\n\t\t\t'L6 L2 L0 R0 R2 R6 r6 r2 r0 l0 l2 l6\\n' +\n\t\t\t'L7 L3 F0 R1 R5 r7 r3 D0 l1 l5\\n' +\n\t\t\t'L8 F1 F2 F3 R4 r8 D1 D2 D3 l4\\n' +\n\t\t\t' F4 F5 F6 F7 F8 D4 D5 D6 D7 D8';\n\t\tret = ret.replace(/([UFrlDBRL])([0-8])/g, function(m, p1, p2) {\n\t\t\tvar i = 'UFrlDBRL'.indexOf(p1) * 9 + (~~p2);\n\t\t\treturn 'UFrlDBRL' [~~(f[i] / 9)] + (f[i] % 9);\n\t\t});\n\t\treturn ret;\n\t}\n\n\tFtoCubie.FtoMult = function() {\n\t\tvar prod = arguments[arguments.length - 1] || new FtoCubie();\n\t\tfor (var k = 0; k < arguments.length; k++) {\n\t\t\tvar a = arguments[arguments.length - 1 - k];\n\t\t\tfor (var i = 0; i < 6; i++) {\n\t\t\t\tprod.co[i] = k == 0 ? 0 : (a.co[prod.cp[i]] ^ prod.co[i]);\n\t\t\t\tprod.cp[i] = k == 0 ? i : a.cp[prod.cp[i]];\n\t\t\t}\n\t\t\tfor (var i = 0; i < 12; i++) {\n\t\t\t\tprod.ep[i] = k == 0 ? i : a.ep[prod.ep[i]];\n\t\t\t\tprod.uf[i] = k == 0 ? i : a.uf[prod.uf[i]];\n\t\t\t\tprod.rl[i] = k == 0 ? i : a.rl[prod.rl[i]];\n\t\t\t}\n\t\t}\n\t\treturn prod;\n\t}\n\n\tfunction initMoveCube() {\n\t\tvar rotU = new FtoCubie( //move[U]\n\t\t\t[1, 2, 0, 4, 5, 3], [0, 0, 0, 0, 0, 0], [2, 0, 1, 5, 3, 4, 10, 11, 6, 7, 8, 9],\n\t\t\t[1, 2, 0, 7, 8, 6, 10, 11, 9, 4, 5, 3], [2, 0, 1, 8, 6, 7, 11, 9, 10, 5, 3, 4]);\n\t\tvar rotR = new FtoCubie( //move[R]\n\t\t\t[5, 0, 4, 2, 3, 1], [1, 1, 0, 1, 1, 0], [6, 5, 7, 9, 2, 10, 11, 4, 3, 8, 1, 0],\n\t\t\t[5, 3, 4, 8, 6, 7, 2, 0, 1, 11, 9, 10], [4, 5, 3, 7, 8, 6, 1, 2, 0, 10, 11, 9]);\n\n\t\tvar rotUi = FtoCubie.FtoMult(rotU, rotU, null);\n\t\tvar rotRi = FtoCubie.FtoMult(rotR, rotR, null);\n\t\tvar rotL = FtoCubie.FtoMult(rotUi, rotR, rotU, null);\n\t\tvar rotF = FtoCubie.FtoMult(rotR, rotU, rotRi, null);\n\n\t\tvar moveCube = [];\n\t\tmoveCube[0] = new FtoCubie( //moveU\n\t\t\t[1, 2, 0, 3, 4, 5], [0, 0, 0, 0, 0, 0], [2, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11],\n\t\t\t[1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11], [0, 1, 2, 3, 6, 7, 11, 9, 8, 5, 10, 4]);\n\t\tmoveCube[2] = new FtoCubie( //moveF\n\t\t\t[4, 1, 2, 3, 5, 0], [1, 0, 0, 0, 1, 0], [0, 1, 2, 3, 4, 6, 7, 5, 8, 9, 10, 11],\n\t\t\t[0, 1, 2, 4, 5, 3, 6, 7, 8, 9, 10, 11], [0, 9, 10, 3, 4, 5, 2, 7, 1, 8, 6, 11]);\n\t\tmoveCube[4] = new FtoCubie( //mover\n\t\t\t[0, 5, 2, 1, 4, 3], [0, 1, 0, 0, 0, 1], [0, 1, 2, 3, 10, 5, 6, 7, 8, 9, 11, 4],\n\t\t\t[0, 1, 2, 3, 4, 5, 7, 8, 6, 9, 10, 11], [5, 3, 2, 11, 4, 10, 6, 7, 8, 9, 0, 1]);\n\t\tmoveCube[6] = new FtoCubie( //movel\n\t\t\t[0, 1, 3, 4, 2, 5], [0, 0, 1, 1, 0, 0], [0, 1, 2, 8, 4, 5, 6, 7, 9, 3, 10, 11],\n\t\t\t[0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 9], [8, 1, 7, 2, 0, 5, 6, 3, 4, 9, 10, 11]);\n\t\tmoveCube[8] = new FtoCubie( //moveD\n\t\t\t[0, 1, 2, 5, 3, 4], [0, 0, 0, 0, 0, 0], [0, 1, 2, 4, 5, 3, 6, 7, 8, 9, 10, 11],\n\t\t\t[0, 1, 2, 3, 9, 10, 5, 7, 4, 8, 6, 11], [1, 2, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11]);\n\t\tmoveCube[10] = new FtoCubie( //moveB\n\t\t\t[0, 3, 1, 2, 4, 5], [0, 1, 1, 0, 0, 0], [0, 1, 10, 3, 4, 5, 6, 7, 8, 2, 9, 11],\n\t\t\t[0, 6, 7, 3, 4, 5, 11, 9, 8, 2, 10, 1], [0, 1, 2, 4, 5, 3, 6, 7, 8, 9, 10, 11]);\n\t\tmoveCube[12] = new FtoCubie( //moveR\n\t\t\t[5, 0, 2, 3, 4, 1], [1, 1, 0, 0, 0, 0], [6, 1, 2, 3, 4, 5, 11, 7, 8, 9, 10, 0],\n\t\t\t[5, 3, 2, 8, 4, 7, 6, 0, 1, 9, 10, 11], [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 9]);\n\t\tmoveCube[14] = new FtoCubie( //moveL\n\t\t\t[2, 1, 4, 3, 0, 5], [1, 0, 1, 0, 0, 0], [0, 8, 2, 3, 4, 5, 6, 1, 7, 9, 10, 11],\n\t\t\t[11, 1, 10, 2, 0, 5, 6, 7, 8, 9, 3, 4], [0, 1, 2, 3, 4, 5, 7, 8, 6, 9, 10, 11]);\n\t\tmoveCube[16] = FtoCubie.FtoMult(rotU, moveCube[8], null); // moveUw = [U] * D\n\t\tmoveCube[18] = FtoCubie.FtoMult(rotF, moveCube[10], null); // moveFw = [F] * B\n\t\tmoveCube[20] = FtoCubie.FtoMult(rotR, moveCube[6], null); // moveRw = [R] * l\n\t\tmoveCube[22] = FtoCubie.FtoMult(rotL, moveCube[4], null); // moveLw = [L] * r\n\n\t\tfor (var i = 1; i < 24; i += 2) {\n\t\t\tmoveCube[i] = new FtoCubie();\n\t\t\tFtoCubie.FtoMult(moveCube[i - 1], moveCube[i - 1], moveCube[i]);\n\t\t}\n\n\t\tvar moveHash = [];\n\t\tfor (var i = 0; i < 24; i ++) {\n\t\t\tmoveHash[i] = moveCube[i].ep.join(',');\n\t\t}\n\t\t//init sym\n\t\tvar symCube = [];\n\t\tvar symMult = [];\n\t\tvar symMulI = [];\n\t\tvar symMulM = [];\n\t\tvar symHash = [];\n\t\tvar fc = new FtoCubie();\n\t\tvar fc2 = new FtoCubie();\n\t\tvar tmp;\n\t\tfor (var s = 0; s < 12; s++) {\n\t\t\tsymCube[s] = new FtoCubie(fc.cp, fc.co, fc.ep, fc.uf, fc.rl);\n\t\t\tsymHash[s] = symCube[s].ep.join(',');\n\t\t\tsymMult[s] = [];\n\t\t\tsymMulI[s] = [];\n\t\t\tfc = FtoCubie.FtoMult(fc, rotU, null);\n\t\t\tif (s % 3 == 2) { // [F] or [R]\n\t\t\t\tfc = FtoCubie.FtoMult(fc, rotR, rotU, null);\n\t\t\t}\n\t\t\tif (s % 6 == 5) {\n\t\t\t\tfc = FtoCubie.FtoMult(fc, rotU, rotR, null);\n\t\t\t}\n\t\t}\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tfor (var j = 0; j < 12; j++) {\n\t\t\t\tFtoCubie.FtoMult(symCube[i], symCube[j], fc);\n\t\t\t\tvar k = symHash.indexOf(fc.ep.join(','));\n\t\t\t\tsymMult[i][j] = k;\n\t\t\t\tsymMulI[k][j] = i;\n\t\t\t}\n\t\t}\n\t\tfor (var s = 0; s < 12; s++) {\n\t\t\tsymMulM[s] = [];\n\t\t\tfor (var j = 0; j < 8; j++) {\n\t\t\t\tFtoCubie.FtoMult(symCube[symMulI[0][s]], moveCube[j * 2], symCube[s], fc);\n\t\t\t\tvar k = moveHash.indexOf(fc.ep.join(','));\n\t\t\t\tsymMulM[s][j] = k >> 1;\n\t\t\t}\n\t\t}\n\t\tFtoCubie.moveCube = moveCube;\n\t\tFtoCubie.symCube = symCube;\n\t\tFtoCubie.symMult = symMult;\n\t\tFtoCubie.symMulI = symMulI;\n\t\tFtoCubie.symMulM = symMulM;\n\t};\n\n\tinitMoveCube();\n\n\tfunction ftoPermMove(key, perm, move) {\n\t\tvar ret = [];\n\t\tvar movePerm = FtoCubie.moveCube[move][key];\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tret[i] = perm[movePerm[i]];\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction ftoFullMove(fc, move) {\n\t\treturn FtoCubie.FtoMult(fc, FtoCubie.moveCube[move], null);\n\t}\n\n\tfunction phase1EdgeHash(ep) {\n\t\tvar ret = 0;\n\t\tvar e3fst = -1;\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tif ((0x38 >> ep[i] & 1) == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (e3fst == -1) {\n\t\t\t\te3fst = ep[i];\n\t\t\t}\n\t\t\tret += ((ep[i] - e3fst + 3) % 3 + 1) << i * 2;\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction phase1CtrlHash(rl) {\n\t\tvar ret = 0;\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tif (rl[i] < 3) {\n\t\t\t\tret |= 1 << i;\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction phase2EdgeHash(ep) {\n\t\tvar edge2group = [0, 1, 2, 3, 3, 3, 0, 1, 1, 2, 2, 0];\n\t\tvar groups = [[0, 6, 11], [1, 7, 8], [2, 9, 10], [3, 4, 5]];\n\t\tvar ret = 0;\n\t\tvar egoff = [-1, -1, -1, -1];\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tvar g = edge2group[ep[i]];\n\t\t\tvar gidx = groups[g].indexOf(ep[i]);\n\t\t\tif (egoff[g] == -1) {\n\t\t\t\tegoff[g] = gidx;\n\t\t\t}\n\t\t\tret += (g * 4 + (gidx - egoff[g] + 3) % 3) * Math.pow(16, i);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction phase2CtHash(ct) {\n\t\tvar ret = 0;\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tret |= ~~(ct[i] / 3) << (i * 2);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tfunction phase3EdgeHash(ep) {\n\t\treturn String.fromCharCode.apply(null, ep);\n\t}\n\n\tfunction phase3CcufHash(fc) {\n\t\treturn String.fromCharCode.apply(null, [].concat(fc.cp, fc.co));\n\t}\n\n\tfunction randomMoves(validMoves, len) {\n\t\tvar scramble = [];\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tscramble.push(validMoves[~~(Math.random() * validMoves.length)]);\n\t\t}\n\t\tvar fc = new FtoCubie();\n\t\tfor (var i = 0; i < scramble.length; i++) {\n\t\t\tfc = FtoCubie.FtoMult(fc, FtoCubie.moveCube[scramble[i]], null);\n\t\t}\n\t\treturn [fc, scramble];\n\t}\n\n\tfunction genCkmv(moves) {\n\t\tvar ckmv = [];\n\t\tvar tmp1 = new FtoCubie();\n\t\tvar tmp2 = new FtoCubie();\n\t\tfor (var m1 = 0; m1 < moves.length; m1++) {\n\t\t\tckmv[m1] = 1 << m1;\n\t\t\tfor (var m2 = 0; m2 < m1; m2++) {\n\t\t\t\tFtoCubie.FtoMult(FtoCubie.moveCube[moves[m1]], FtoCubie.moveCube[moves[m2]], tmp1);\n\t\t\t\tFtoCubie.FtoMult(FtoCubie.moveCube[moves[m2]], FtoCubie.moveCube[moves[m1]], tmp2);\n\t\t\t\tif (tmp1.isEqual(tmp2)) {\n\t\t\t\t\tckmv[m1] |= 1 << m2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ckmv;\n\t}\n\n\tvar phase1Moves = [0, 2, 22, 6, 16, 10, 12, 14]; // keep the (D, DR) edge\n\tvar p1epMoves = null;\n\tvar p1rlMoves = null;\n\tvar ckmv1 = null;\n\tvar solv1 = null;\n\n\tvar pyraSymCube = [];\n\tfor (var i = 0; i < 12; i++) {\n\t\tpyraSymCube.push(new FtoCubie(\n\t\t\tFtoCubie.symCube[i].cp,\n\t\t\tFtoCubie.symCube[i].co,\n\t\t\tnull,\n\t\t\tFtoCubie.symCube[i].uf,\n\t\t\tnull\n\t\t));\n\t}\n\n\tfunction phase1Init() {\n\t\tvar fc = new FtoCubie();\n\t\tp1epMoves = mathlib.createMoveHash(fc.ep.slice(), phase1Moves, phase1EdgeHash, ftoPermMove.bind(null, 'ep'));\n\t\tp1rlMoves = mathlib.createMoveHash(fc.rl.slice(), phase1Moves, phase1CtrlHash, ftoPermMove.bind(null, 'rl'));\n\t\tvar N_P1EP = p1epMoves[0][0].length;\n\t\tvar N_P1RL = p1rlMoves[0][0].length;\n\t\tDEBUG && console.log('p1ep len=' + N_P1EP + ' p1rl len=' + N_P1RL);\n\n\t\tckmv1 = genCkmv(phase1Moves);\n\t\tvar p1eprlPrun = [];\n\t\tmathlib.createPrun(p1eprlPrun, 0, N_P1EP * N_P1RL, 14, function(idx, move) {\n\t\t\tvar rl = ~~(idx / N_P1EP);\n\t\t\tvar ep = idx % N_P1EP;\n\t\t\treturn p1rlMoves[0][move][rl] * N_P1EP + p1epMoves[0][move][ep];\n\t\t}, phase1Moves.length, 2);\n\n\t\tsolv1 = new mathlib.Searcher(null, function(idx) {\n\t\t\treturn mathlib.getPruning(p1eprlPrun, idx[1] * N_P1EP + idx[0]);\n\t\t}, function(idx, move) {\n\t\t\treturn [\n\t\t\t\tp1epMoves[0][move][idx[0]],\n\t\t\t\tp1rlMoves[0][move][idx[1]]\n\t\t\t];\n\t\t}, 8, 2, ckmv1);\n\t}\n\n\tfunction phase1GenIdxs(fc) {\n\t\tvar idxs = [];\n\t\tvar syms = [];\n\t\tvar fc2 = new FtoCubie();\n\t\tvar fc3 = new FtoCubie();\n\n\t\tfor (var sidx = 0; sidx < 12; sidx += 3) {\n\t\t\tFtoCubie.FtoMult(FtoCubie.symCube[sidx % 12], fc, fc2);\n\t\t\tvar rot;\n\t\t\tfor (rot = 0; rot < 12; rot++) {\n\t\t\t\tFtoCubie.FtoMult(fc2, FtoCubie.symCube[rot], fc3);\n\t\t\t\tif (fc3.ep[4] == 4) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar epidxs = [];\n\t\t\tvar rlidxs = [];\n\t\t\tidxs.push([\n\t\t\t\tp1epMoves[1][phase1EdgeHash(fc3.ep)],\n\t\t\t\tp1rlMoves[1][phase1CtrlHash(fc3.rl)]\n\t\t\t]);\n\t\t\tsyms.push([sidx, rot]);\n\t\t}\n\t\treturn [idxs, syms];\n\t}\n\n\tfunction phase1ProcSol(sol, solsym, fc) {\n\t\tfor (var i = 0; i < sol.length; i++) {\n\t\t\tsol[i] = phase1Moves[sol[i][0]] + sol[i][1];\n\t\t}\n\t\tvar std = move2std(sol);\n\t\tfor (var i = 0; i < std[0].length; i++) {\n\t\t\tvar move = std[0][i];\n\t\t\tsol[i] = FtoCubie.symMulM[FtoCubie.symMulI[0][solsym[1]]][move >> 1] * 2 + (move & 1);\n\t\t\tfc = FtoCubie.FtoMult(fc, FtoCubie.moveCube[sol[i]], null);\n\t\t}\n\t\tsolsym[1] = FtoCubie.symMulI[solsym[1]][std[1]];\n\t\tfc = FtoCubie.FtoMult(\n\t\t\tpyraSymCube[~~(solsym[0] / 12)], FtoCubie.symCube[solsym[0] % 12],\n\t\t\tfc, FtoCubie.symCube[solsym[1]], null\n\t\t);\n\t\treturn [fc, sol, solsym[0], solsym[1]];\n\t}\n\n\tvar N_PHASE1_SOLS = 1000;\n\n\tfunction solvePhase1(fc) {\n\t\tif (!solv1) {\n\t\t\tphase1Init();\n\t\t}\n\n\t\tvar tt = performance.now();\n\t\tvar idxs = phase1GenIdxs(fc);\n\t\tvar syms = idxs[1];\n\t\tidxs = idxs[0];\n\n\t\tvar p1sols = [];\n\n\t\tvar sol1s = solv1.solveMulti(idxs, 0, 12, function(sol, sidx) {\n\t\t\tvar param = phase1ProcSol(sol.slice(), syms[sidx].slice(), fc);\n\t\t\tp1sols.push(param);\n\t\t\treturn p1sols.length >= N_PHASE1_SOLS;\n\t\t});\n\n\t\ttt = performance.now() - tt;\n\t\tfor (var i = 0; i < p1sols.length; i++) {\n\t\t\tp1sols[i].push(tt);\n\t\t}\n\t\treturn p1sols;\n\t}\n\n\tvar phase2Moves = [0, 12, 14, 8, 10];\n\tvar p2epMoves = null;\n\tvar p2rlMoves = null;\n\tvar p2ccMoves = null;\n\tvar p2cc2ufBit = {};\n\tvar ckmv2 = null;\n\tvar solv2 = null;\n\tvar P2EPRL_MAXL = 11;\n\tvar p2symMap = [];\n\tvar ufStd2Raw = [];\n\tvar ufRaw2Std = [];\n\tvar p2ufCoord = new mathlib.Coord('c', 12, [3, 3, 3, 3]);\n\n\tvar cornExFacelets = [\n\t\t[U + 2, R + 2, F + 2, L + 2],\n\t\t[U + 5, B + 7, r + 5, R + 7],\n\t\t[U + 7, L + 5, l + 7, B + 5],\n\t\t[l + 2, D + 2, r + 2, B + 2],\n\t\t[F + 5, D + 7, l + 5, L + 7],\n\t\t[r + 7, D + 5, F + 7, R + 5]\n\t];\n\n\tfunction phase2CpcoHash(fc) {\n\t\tvar ret = String.fromCharCode.apply(null, [].concat(fc.cp, fc.co));\n\t\tif (!(ret in p2cc2ufBit)) {\n\t\t\tvar co = [];\n\t\t\tfor (var i = 0; i < 6; i++) {\n\t\t\t\tco[i] = fc.co[i] * 2;\n\t\t\t}\n\t\t\tvar facelet = fc.toFaceCube();\n\t\t\tmathlib.fillFacelet(cornExFacelets, facelet, fc.cp, co, 9);\n\t\t\tvar fc2 = new FtoCubie().fromFacelet(facelet);\n\t\t\tp2cc2ufBit[ret] = phase2CtHash(fc2.uf);\n\t\t}\n\t\treturn ret;\n\t}\n\n\t// re-color the cube s.t. uf is minimized in lexicographical order\n\tfunction phase2ufStd(uf, symMap) {\n\t\tvar col1 = uf[0], col2 = -1;\n\t\tfor (var i = 1; i < 12; i++) {\n\t\t\tif (uf[i] != col1) {\n\t\t\t\tcol2 = uf[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar sym = symMap[col1 * 4 + col2];\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tuf[i] = ~~(FtoCubie.symCube[sym].uf[uf[i] * 3] / 3);\n\t\t}\n\t\treturn sym;\n\t}\n\n\tfunction getPhase2ufIdx(uf) {\n\t\tvar ufstd = [];\n\t\tfor (var i = 0; i < 12; i++) {\n\t\t\tufstd[i] = ~~(uf[i] / 3);\n\t\t}\n\t\tvar sym = phase2ufStd(ufstd, p2symMap);\n\t\treturn ufRaw2Std[p2ufCoord.get(ufstd)] << 4 | sym;\n\t}\n\n\tfunction phase2Init() {\n\t\tvar fc = new FtoCubie();\n\t\tp2epMoves = mathlib.createMoveHash(fc.ep.slice(), phase2Moves, phase2EdgeHash, ftoPermMove.bind(null, 'ep'));\n\t\tp2rlMoves = mathlib.createMoveHash(fc.rl.slice(), phase2Moves, phase2CtHash, ftoPermMove.bind(null, 'rl'));\n\t\tp2ccMoves = mathlib.createMoveHash(fc, phase2Moves, phase2CpcoHash, ftoFullMove);\n\n\t\tvar arr = [];\n\t\tvar arr2 = [];\n\t\tvar p2ufMoveStd = [[], [], [], [], []];\n\t\tvar ufStd2Bit = [];\n\t\tvar p2ccRecol = [];\n\t\tfor (var s = 0; s < 12; s++) {\n\t\t\tvar uf = FtoCubie.symCube[s].uf;\n\t\t\tvar col1 = ~~(uf.indexOf(0) / 3);\n\t\t\tvar col2 = ~~(uf.indexOf(3) / 3);\n\t\t\tp2symMap[col1 * 4 + col2] = s;\n\t\t\tp2ccRecol[s] = [];\n\t\t}\n\t\tout: for (var i = 0; i < 42000; i++) {\n\t\t\tp2ufCoord.set(arr, i);\n\t\t\tfor (var j = 1; j < 12; j++) {\n\t\t\t\tif (arr[j] > 1) {\n\t\t\t\t\tcontinue out;\n\t\t\t\t} else if (arr[j] == 1) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tufRaw2Std[i] = ufStd2Raw.length;\n\t\t\tufStd2Raw.push(i);\n\t\t}\n\t\tfor (var i = 0; i < ufStd2Raw.length; i++) {\n\t\t\tp2ufCoord.set(arr, ufStd2Raw[i]);\n\t\t\tvar hash = 0;\n\t\t\tfor (var j = 0; j < 12; j++) {\n\t\t\t\thash |= arr[j] << (j * 2);\n\t\t\t}\n\t\t\tufStd2Bit[i] = hash;\n\t\t\tfor (var m = 0; m < phase2Moves.length; m++) {\n\t\t\t\tmathlib.permOriMult(arr, FtoCubie.moveCube[phase2Moves[m]].uf, arr2);\n\t\t\t\tvar sym = phase2ufStd(arr2, p2symMap);\n\t\t\t\tp2ufMoveStd[m][i] = ufRaw2Std[p2ufCoord.get(arr2)] << 4 | sym;\n\t\t\t}\n\t\t}\n\t\tvar cc2Bit = [];\n\t\tfor (var key in p2ccMoves[1]) {\n\t\t\tvar idx = p2ccMoves[1][key];\n\t\t\tcc2Bit[idx] = p2cc2ufBit[key];\n\t\t\tvar cpco = [];\n\t\t\tfor (var s = 0; s < 12; s++) {\n\t\t\t\tvar sc = FtoCubie.symCube[s];\n\t\t\t\tfor (var i = 0; i < 6; i++) {\n\t\t\t\t\tvar scpi = key.charCodeAt(i);\n\t\t\t\t\tcpco[i] = sc.cp[scpi];\n\t\t\t\t\tcpco[i + 6] = sc.co[scpi] ^ key.charCodeAt(i + 6);\n\t\t\t\t}\n\t\t\t\tvar hash = String.fromCharCode.apply(null, cpco);\n\t\t\t\tp2ccRecol[s][idx] = p2ccMoves[1][hash];\n\t\t\t}\n\t\t}\n\t\tvar p2necPrun = [ // idx = a * 7 + b, a: #mismatch 3 U corners, b: other corners\n\t\t\t0, 0, 3, 4, 5, 6, 8,\n\t\t\t0, 2, 3, 4, 5, 6, 8,\n\t\t\t1, 2, 4, 4, 5, 6, 8,\n\t\t\t1, 3, 4, 5, 6, 7, 8,\n\t\t\t3, 3, 4, 5, 6, 7, 9,\n\t\t\t4, 4, 5, 6, 7, 8, 9,\n\t\t\t5, 5, 6, 7, 8, 9, 10\n\t\t];\n\n\t\tvar N_P2EP = p2epMoves[0][0].length;\n\t\tvar N_P2RL = p2rlMoves[0][0].length;\n\t\tvar p2eprlPrun = [];\n\t\tmathlib.createPrun(p2eprlPrun, 0, N_P2EP * N_P2RL, P2EPRL_MAXL - 2, function(idx, move) {\n\t\t\tvar rl = ~~(idx / N_P2EP);\n\t\t\tvar ep = idx % N_P2EP;\n\t\t\treturn p2rlMoves[0][move][rl] * N_P2EP + p2epMoves[0][move][ep];\n\t\t}, phase2Moves.length, 2);\n\t\tckmv2 = genCkmv(phase2Moves);\n\n\t\tsolv2 = new mathlib.Searcher(function(idx) {\n\t\t\treturn ufStd2Bit[idx[3] >> 4] == cc2Bit[p2ccRecol[idx[3] & 0xf][idx[2]]];\n\t\t}, function(idx) {\n\t\t\tvar xors = ufStd2Bit[idx[3] >> 4] ^ cc2Bit[p2ccRecol[idx[3] & 0xf][idx[2]]];\n\t\t\txors = (xors | xors >> 1) & 0x555555;\n\t\t\tvar necIdx = mathlib.bitCount(xors & 0xc0c0ff) * 7 + mathlib.bitCount(xors & 0x3f3f00);\n\t\t\treturn Math.max(\n\t\t\t\tMath.min(P2EPRL_MAXL, mathlib.getPruning(p2eprlPrun, idx[1] * N_P2EP + idx[0])),\n\t\t\t\tp2necPrun[necIdx]\n\t\t\t);\n\t\t}, function(idx, move) {\n\t\t\tvar ufidx1 = p2ufMoveStd[move][idx[3] >> 4];\n\t\t\tvar ufcol = FtoCubie.symMult[ufidx1 & 0xf][idx[3] & 0xf];\n\t\t\treturn [\n\t\t\t\tp2epMoves[0][move][idx[0]],\n\t\t\t\tp2rlMoves[0][move][idx[1]],\n\t\t\t\tp2ccMoves[0][move][idx[2]],\n\t\t\t\tufidx1 & ~0xf | ufcol,\n\t\t\t];\n\t\t}, phase2Moves.length, 2, ckmv2);\n\t}\n\n\tfunction solvePhase2(solvInfos) {\n\t\tif (!solv2) {\n\t\t\tphase2Init();\n\t\t}\n\t\tvar tt = performance.now();\n\t\tvar idxs = [];\n\t\tfor (var i = 0; i < solvInfos.length; i++) {\n\t\t\tidxs.push([\n\t\t\t\tp2epMoves[1][phase2EdgeHash(solvInfos[i][0].ep)],\n\t\t\t\tp2rlMoves[1][phase2CtHash(solvInfos[i][0].rl)],\n\t\t\t\tp2ccMoves[1][phase2CpcoHash(solvInfos[i][0])],\n\t\t\t\tgetPhase2ufIdx(solvInfos[i][0].uf)\n\t\t\t]);\n\t\t}\n\t\tvar sol2s = solv2.solveMulti(idxs, 0, 25);\n\t\tvar sol = sol2s[0];\n\t\tvar src = sol2s[1];\n\t\tvar solvInfo = solvInfos[src];\n\t\tvar fc = solvInfo[0];\n\t\tfor (var i = 0; i < sol.length; i++) {\n\t\t\tvar move = phase2Moves[sol[i][0]] + sol[i][1];\n\t\t\tsol[i] = FtoCubie.symMulM[FtoCubie.symMulI[0][solvInfo[3]]][move >> 1] * 2 + (move & 1);\n\t\t\tfc = FtoCubie.FtoMult(fc, FtoCubie.moveCube[move], null);\n\t\t}\n\t\treturn [fc, sol, solvInfo[2], solvInfo[3], src, performance.now() - tt];\n\t}\n\n\tvar phase3Moves = [8, 10, 12, 14];\n\tvar p3epMoves = null;\n\tvar p3ufMoves = null;\n\tvar p3epPrun = null;\n\tvar p3ufPrun = null;\n\tvar ckmv3 = null;\n\tvar solv3 = null;\n\n\tfunction phase3Init() {\n\t\tvar fc = new FtoCubie();\n\t\tp3epMoves = mathlib.createMoveHash(fc.ep.slice(), phase3Moves, phase3EdgeHash, ftoPermMove.bind(null, 'ep'));\n\t\tp3ufMoves = mathlib.createMoveHash(new FtoCubie(), phase3Moves, phase3CcufHash, ftoFullMove);\n\t\tp3epPrun = [];\n\t\tp3ufPrun = [];\n\t\tmathlib.createPrun(p3epPrun, 0, 81, 14, p3epMoves[0], 4, 2);\n\t\tmathlib.createPrun(p3ufPrun, 0, 11520, 14, p3ufMoves[0], 4, 2);\n\t\tckmv3 = genCkmv(phase3Moves);\n\n\t\tsolv3 = new mathlib.Searcher(null, function(idx) {\n\t\t\treturn Math.max(\n\t\t\t\tmathlib.getPruning(p3epPrun, idx[0]),\n\t\t\t\tmathlib.getPruning(p3ufPrun, idx[1])\n\t\t\t);\n\t\t}, function(idx, move) {\n\t\t\treturn [p3epMoves[0][move][idx[0]], p3ufMoves[0][move][idx[1]]];\n\t\t}, 4, 2, ckmv3);\n\t}\n\n\tfunction solvePhase3(solvInfo) {\n\t\tvar fc = solvInfo[0];\n\t\tif (!p3epPrun) {\n\t\t\tphase3Init();\n\t\t}\n\n\t\tvar tt = performance.now();\n\t\tvar p3epidx = p3epMoves[1][phase3EdgeHash(fc.ep)];\n\t\tvar p3ufidx = p3ufMoves[1][phase3CcufHash(fc)];\n\n\t\tvar sol = solv3.solve([p3epidx, p3ufidx], 0, 25);\n\n\t\tfor (var i = 0; i < sol.length; i++) {\n\t\t\tvar move = phase3Moves[sol[i][0]] + sol[i][1];\n\t\t\tsol[i] = FtoCubie.symMulM[FtoCubie.symMulI[0][solvInfo[3]]][move >> 1] * 2 + (move & 1);\n\n\t\t\tfc = FtoCubie.FtoMult(fc, FtoCubie.moveCube[move], null);\n\t\t}\n\t\treturn [fc, sol, solvInfo[2], solvInfo[3], performance.now() - tt];\n\t}\n\n\t// convert wide moves to face moves\n\tfunction move2std(moves) {\n\t\tvar sym = 0;\n\t\tvar ret = [];\n\t\t// Uw = [U] * D, Fw = [F] * B, Rw = [R] * l, Lw = [L] * r\n\t\tvar w2axis = [4, 5, 3, 2];\n\t\tvar w2rot = [1, 10, 5, 11];\n\t\tfor (var i = 0; i < moves.length; i++) {\n\t\t\tvar rot = 0;\n\t\t\tvar axis = moves[i] >> 1;\n\t\t\tvar pow = moves[i] & 1;\n\t\t\tif (axis >= 8) {\n\t\t\t\trot = w2rot[axis - 8];\n\t\t\t\taxis = w2axis[axis - 8];\n\t\t\t}\n\t\t\tif (!pow) {\n\t\t\t\trot = FtoCubie.symMult[rot][rot];\n\t\t\t}\n\t\t\tret.push(FtoCubie.symMulM[sym][axis] * 2 + pow);\n\t\t\tsym = FtoCubie.symMult[rot][sym];\n\t\t}\n\t\treturn [ret, sym];\n\t}\n\n\tfunction applyMoves(fc, moves) {\n\t\tfor (var i = 0; i < moves.length; i++) {\n\t\t\tfc = FtoCubie.FtoMult(fc, FtoCubie.moveCube[moves[i]], null);\n\t\t}\n\t\treturn fc;\n\t}\n\n\tvar move2str = [\"U\", \"U'\", \"F\", \"F'\", \"r\", \"r'\", \"l\", \"l'\", \"D\", \"D'\", \"B\", \"B'\", \"R\", \"R'\", \"L\", \"L'\"]\n\n\tfunction prettyMoves(moves) {\n\t\tvar buf = [];\n\t\tfor (var i = 0; i < moves.length; i++) {\n\t\t\tbuf[i] = move2str[moves[i]];\n\t\t}\n\t\treturn buf.join(' ').replace(/l/g, 'BL').replace(/r/g, 'BR');\n\t}\n\n\tfunction FtoSolver() {}\n\n\tFtoSolver.prototype.solveFto = function(fc, invSol) {\n\t\tif (!solv1) {\n\t\t\tvar tt = performance.now();\n\t\t\tphase1Init();\n\t\t\tphase2Init();\n\t\t\tphase3Init();\n\t\t\tDEBUG && console.log('[ftosolver] init time:', performance.now() - tt);\n\t\t}\n\t\tvar solvInfos = solvePhase1(fc);\n\n\t\tvar solvInfo2 = solvePhase2(solvInfos);\n\n\t\tvar solvInfo1 = solvInfos[solvInfo2[4]];\n\t\tthis.sol1 = solvInfo1[1].slice();\n\t\tthis.tt1 = solvInfo1[4];\n\t\tvar sym1Idx = solvInfo1[2];\n\n\t\tthis.sol2 = solvInfo2[1].slice();\n\t\tthis.tt2 = solvInfo2[5];\n\t\tsolvInfo2[0] = FtoCubie.FtoMult(pyraSymCube[FtoCubie.symMulI[0][~~(sym1Idx / 12)]], solvInfo2[0], null);\n\n\t\tvar solvInfo3 = solvePhase3(solvInfo2);\n\t\tthis.sol3 = solvInfo3[1].slice();\n\t\tthis.tt3 = solvInfo3[4];\n\n\t\tvar sol = [].concat(this.sol1, this.sol2, this.sol3);\n\t\tif (invSol) {\n\t\t\tfor (var i = 0; i < sol.length; i++) {\n\t\t\t\tsol[i] ^= 1;\n\t\t\t}\n\t\t\tsol.reverse();\n\t\t}\n\t\treturn prettyMoves(sol);\n\t}\n\n\tvar solver = new FtoSolver();\n\n\tfunction solveTest(n_moves) {\n\t\tvar solvInfo = randomMoves([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], n_moves);\n\n\t\tvar scramble = prettyMoves(solvInfo[1].slice());\n\t\tvar solution = solver.solveFto(solvInfo[0]);\n\n\t\tvar fc = solvInfo[0];\n\t\tDEBUG && console.log('scrambled state\\n', fc.toString(1));\n\t\tfc = applyMoves(fc, solver.sol1);\n\t\tDEBUG && console.log('after phase 1 (' + prettyMoves(solver.sol1) + '):\\n', fc.toString(1));\n\t\tfc = applyMoves(fc, solver.sol2);\n\t\tDEBUG && console.log('after phase 2 (' + prettyMoves(solver.sol2) + '):\\n', fc.toString(1));\n\t\tfc = applyMoves(fc, solver.sol3);\n\t\tDEBUG && console.log('after phase 3 (' + prettyMoves(solver.sol3) + '):\\n', fc.toString(1));\n\n\t\tvar facelets = fc.toFaceCube();\n\t\tvar isSolved = true;\n\t\touter_loop: for (var i = 0; i < 8; i++) {\n\t\t\tfor (var j = 1; j < 9; j++) {\n\t\t\t\tif (facelets[i * 9 + j] != facelets[i * 9]) {\n\t\t\t\t\tisSolved = false;\n\t\t\t\t\tbreak outer_loop;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!isSolved) {\n\t\t\tconsole.log('error, FTO not solved!!!');\n\t\t}\n\n\t\tDEBUG && console.log(scramble, solution);\n\t\treturn [\n\t\t\tsolver.sol1.length + solver.sol2.length + solver.sol3.length,\n\t\t\tsolver.sol1.length,\n\t\t\tsolver.sol2.length,\n\t\t\tsolver.sol3.length,\n\t\t\tsolver.tt1,\n\t\t\tsolver.tt2,\n\t\t\tsolver.tt3\n\t\t];\n\t}\n\n\tfunction testbench(ntest) {\n\t\tntest = ntest || 100;\n\t\tvar cumlen = [];\n\t\tfor (var nsolv = 0; nsolv < ntest; nsolv++) {\n\t\t\tvar lengths = solveTest(200);\n\t\t\tfor (var i = 0; i < lengths.length; i++) {\n\t\t\t\tcumlen[i] = (cumlen[i] || 0) + lengths[i];\n\t\t\t}\n\t\t\tconsole.log('AvgL: ', cumlen[0] / (nsolv + 1));\n\t\t}\n\t\tconsole.log('AvgL1:', cumlen[1] / ntest);\n\t\tconsole.log('AvgL2:', cumlen[2] / ntest);\n\t\tconsole.log('AvgL3:', cumlen[3] / ntest);\n\t\tconsole.log('AvgT1:', cumlen[4] / ntest);\n\t\tconsole.log('AvgT2:', cumlen[5] / ntest);\n\t\tconsole.log('AvgT3:', cumlen[6] / ntest);\n\t}\n\n\tfunction solveFacelet(facelet, invSol) {\n\t\tvar fc = new FtoCubie();\n\t\tif (fc.fromFacelet(facelet) == -1) {\n\t\t\treturn \"FTO Solver ERROR!\";\n\t\t}\n\t\treturn solver.solveFto(fc, invSol);\n\t}\n\n\treturn {\n\t\tsolveFacelet: solveFacelet,\n\t\tFtoCubie: FtoCubie,\n\t\ttestbench: testbench\n\t};\n})();\n\nvar fto_scrambler = (function() {\n\n\tfunction getRandomScramble(solvedEdge, solvedCenter, solvedCorner) {\n\t\tvar fc = new ftosolver.FtoCubie();\n\t\tif (!solvedEdge) {\n\t\t\tfc.ep = mathlib.rndPerm(12, true);\n\t\t}\n\t\tif (!solvedCenter) {\n\t\t\tfc.uf = mathlib.rndPerm(12, true);\n\t\t\tfc.rl = mathlib.rndPerm(12, true);\n\t\t}\n\t\tif (!solvedCorner) {\n\t\t\tfc.cp = mathlib.rndPerm(6, true);\n\t\t\tmathlib.setNOri(fc.co, mathlib.rn(32), 6, -2);\n\t\t}\n\t\treturn new Alg(ftosolver.solveFacelet(fc.toFaceCube(), true));\n\t}\n\n\tfunction getLNTScramble(ufs) {\n\t\tvar solved = false;\n\t\tvar nCorn = ufs.length >> 1;\n\t\tvar fc = new ftosolver.FtoCubie();\n\t\tvar cp, co, uf;\n\t\tdo {\n\t\t\tcp = mathlib.rndPerm(nCorn, true);\n\t\t\tco = mathlib.setNOri([], mathlib.rn(1 << nCorn >> 1), nCorn, -2);\n\t\t\tuf = mathlib.rndPerm(ufs.length, true);\n\t\t\tsolved = true;\n\t\t\tfor (var i = 0; i < ufs.length; i++) {\n\t\t\t\tsolved = solved && (~~(ufs[uf[i]] / 3) == ~~(ufs[i] / 3));\n\t\t\t}\n\t\t\tfor (var i = 0; i < nCorn; i++) {\n\t\t\t\tsolved = solved && cp[i] == i && co[i] == 0;\n\t\t\t}\n\t\t} while (solved);\n\t\tfor (var i = 0; i < nCorn; i++) {\n\t\t\tfc.cp[i] = cp[i];\n\t\t\tfc.co[i] = co[i];\n\t\t}\n\t\tfor (var i = 0; i < ufs.length; i++) {\n\t\t\tfc.uf[ufs[i]] = ufs[uf[i]];\n\t\t}\n\t\treturn ftosolver.solveFacelet(fc.toFaceCube(), true);\n\t}\n\n\treturn {\n\t\tgetRandomScramble: getRandomScramble.bind(null, false, false, false)\n\t};\n})();\n\n// TODO: solve an externally generated random state\nexport function getRandomFTOScramble() {\n\treturn fto_scrambler.getRandomScramble();\n};\n\n// export function setRandomGen(gen) {\n// \tmathlib.setRandomGen(gen);\n// };\n\n// export function fto_testbench() {\n// \tftosolver.testbench();\n// };\n"],
5
+ "mappings": "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",
6
+ "names": ["i", "idx"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Alg
3
- } from "./chunk-YFNXHRNE.js";
3
+ } from "./chunk-UP5VP7GL.js";
4
4
 
5
5
  // src/cubing/vendor/mpl/xyzzy/kilosolver.js
6
6
  import { randomUIntBelow } from "random-uint-below";
@@ -768,4 +768,4 @@ function getRandomKilominxScramble() {
768
768
  export {
769
769
  getRandomKilominxScramble
770
770
  };
771
- //# sourceMappingURL=search-dynamic-solve-kilominx-PUF4PRHS.js.map
771
+ //# sourceMappingURL=search-dynamic-solve-kilominx-UKFT6I42.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cubing/vendor/mpl/xyzzy/kilosolver.js"],
4
+ "sourcesContent": ["// @ts-nocheck\n\n/* kilosolver.js - A kilominx solver\nversion 0.7 (2021-04-03)\nCopyright (c) 2016, 2020, 2021\n\nFrom https://torchlight.github.io/kiloscrambler.html\nOriginally MIT licensed, added to `cubing.js` under the GPL license by permission from the author (@torchlight/xyzzy).\n\nThis is a port of the kilominx solver originally written in Python with a few minor optimisations.\n\nHow to run this:\n(0) Save this file somewhere.\n(1) Install any JavaScript shell and run it with this file.\n(2) Type stuff into the shell.\n\n(or just use the HTML interface! it exists now!)\n\nThere is currently not much of a public interface. Useful stuff:\ncache_all_tables()\n to generate all the lookup tables\nprint_move_sequence(generate_random_state_scramble())\n to get a random-state scramble\nprint_move_sequence(generate_hybrid_scramble())\n to get a hybrid random-move scramble\n\nFor the full solver (used in the random-state scrambler), a few hundred megabytes of RAM may be used\nfor the lookup tables, which will also take roughly a minute to generate. Once generated, each solve\ntakes roughly 0.08 second.\n\nThe hybrid scrambler uses much smaller lookup tables that take less memory and are generated faster,\nbut produces somewhat longer scramble sequences and isn't fully random-state. It should nevertheless\nbe good enough for non-competition purposes.\n\nOn the to-do list:\n- optimise the heck out of the lookup table generation\n- a GUI for the solver\n- optimise the solver with colour neutrality and NISS(tm) techniques\n- throw all the global variables into a namespace\n\nCompatibility notes:\nThis code makes fairly heavy use of ES6 syntactic sugar because writing code in JavaScript's already\nan exercise in masochism and I'm not going to make my life harder by restricting myself to ES5. Some\nof the features used are:\n- let, const\n- destructuring assignment\n- for-of\n- arrow functions\n- 'use strict'\n\nAny web browser from 2016 or later should support all of these; the code has been tested only on the\nlatest versions of Firefox and Chrome, as well as a somewhat outdated SpiderMonkey shell, but should\nalso work with recent versions of Edge, Safari, etc.\n*/\n\n\"use strict\";\n\nimport { Alg } from \"../../../alg/index.ts\";\nimport { randomUIntBelow } from \"random-uint-below\";\n\nlet PHASE4_THRESHOLD = 7;\n// change this to 8 to make the individual solves faster, at the cost of slower initialisation\n\nfunction counter(A) {\n let counts = [];\n for (let a of A) {\n counts[a] = (counts[a] || 0) + 1;\n }\n return counts;\n}\n\n/* Combinatoric functions */\n\nfunction factorial(n) {\n if (n < 2) {\n return n;\n }\n let f = 1;\n for (let i = 2; i <= n; i++) {\n f *= i;\n }\n return f;\n}\n\nfunction C(n, k) {\n if (k < 0 || k > n) {\n return 0;\n }\n if (k === 0 || k === n) {\n return 1;\n }\n let c = 1;\n for (let i = 0; i < k; i++) {\n c = ((c * (n - i)) / (i + 1)) | 0;\n }\n return c;\n}\n\nfunction permutation_to_index(perm) {\n perm = perm.slice();\n let n = perm.length;\n let f = factorial(n - 1);\n let ind = 0;\n while (n > 1) {\n n--;\n // invariant: f === factorial(n)\n // also, perm stores meaningful values up to perm[n]\n let e = perm[0];\n ind += e * f;\n for (let i = 0; i < n; i++) {\n let x = perm[i + 1];\n perm[i] = x - (x > e);\n }\n f /= n;\n }\n return ind;\n}\n\nfunction index_to_permutation(ind, n) {\n let perm = [];\n let f = factorial(n - 1);\n for (let i = 0; i < n; i++) {\n perm[i] = (ind / f) | 0;\n ind %= f;\n f /= n - 1 - i;\n }\n for (let i = n - 2; i >= 0; i--) {\n for (let j = i + 1; j < n; j++) {\n perm[j] += +(perm[j] >= perm[i]);\n }\n }\n return perm;\n}\n\nfunction permutation_parity(A) {\n let n = A.length;\n let parity = 0;\n for (let i = 0; i < n - 1; i++) {\n for (let j = i; j < n; j++) {\n if (A[i] > A[j]) {\n parity ^= 1;\n }\n }\n }\n return parity;\n}\n\nfunction index_to_evenpermutation(ind, n) {\n let perm = [];\n let f = factorial(n - 1) / 2;\n let parity = 0;\n for (let i = 0; i < n - 1; i++) {\n perm[i] = (ind / f) | 0;\n ind %= f;\n f /= n - 1 - i;\n }\n perm[n - 1] = 0;\n for (let i = n - 2; i >= 0; i--) {\n for (let j = i + 1; j < n; j++) {\n if (perm[j] >= perm[i]) {\n perm[j]++;\n } else {\n parity ^= 1;\n }\n }\n }\n if (parity === 1) {\n [perm[n - 2], perm[n - 1]] = [perm[n - 1], perm[n - 2]];\n }\n return perm;\n}\n\nfunction evenpermutation_to_index(perm) {\n return permutation_to_index(perm) >> 1;\n}\n\nlet [evenpermutation10_to_index, index_to_evenpermutation10] = (() => {\n let index_in_set_bits = new Int8Array(1024 * 10);\n let look_up_set_bits = new Int8Array(1024 * 10);\n for (let i = 0; i < 1024; i++) {\n for (let j = 0, counter = 0; j < 10; j++) {\n if (((i >>> j) & 1) === 0) {\n continue;\n }\n index_in_set_bits[(j << 10) | i] = counter;\n look_up_set_bits[(counter << 10) | i] = j;\n counter++;\n }\n }\n\n function evenpermutation10_to_index(perm) {\n let unused = 0x3ff; // track which values in 0..9 haven't been used so far\n let f = 181440; // = 9!/2\n let ind = 0;\n for (let i = 0; i < 8; i++) {\n let v = perm[i];\n ind += index_in_set_bits[unused | (v << 10)] * f;\n unused &= ~(1 << v);\n f /= 9 - i;\n }\n return ind;\n }\n\n // note: this is *not* a drop-in replacement for index_to_evenpermutation!\n function index_to_evenpermutation10(ind, perm) {\n let unused = 0x3ff;\n let f = 181440; // = 9!/2\n let parity = 0;\n for (let i = 0; i < 8; i++) {\n let a = (ind / f) | 0;\n ind -= a * f;\n parity ^= a & 1;\n let v = look_up_set_bits[unused | (a << 10)];\n perm[i] = v;\n unused &= ~(1 << v);\n f /= 9 - i;\n }\n // the last two elements are uniquely determined by the other ten\n perm[8] = look_up_set_bits[unused | (parity << 10)];\n perm[9] = look_up_set_bits[unused | ((parity ^ 1) << 10)];\n return perm;\n }\n\n return [evenpermutation10_to_index, index_to_evenpermutation10];\n})();\n\nfunction comb_to_index(l) {\n let bits = l.length;\n let ones = 0;\n for (let i = 0; i < bits; i++) {\n ones += +(l[i] === 1);\n }\n let zeros = bits - ones;\n if (zeros === 0 || ones === 0 || bits === 1) {\n return 0;\n }\n let b = C(bits - 1, ones);\n let ind = 0;\n for (let i = 0; zeros > 0 && ones > 0 && bits > 1; i++) {\n bits--;\n if (l[i] === 0) {\n b = (b * --zeros) / bits;\n } else {\n // l[i] === 1\n ind += b;\n b = (b * ones--) / bits;\n }\n }\n return ind;\n}\n\nfunction index_to_comb(ind, ones, bits) {\n let zeros = bits - ones;\n let b = C(bits - 1, ones);\n let l = [];\n let n = bits - 1;\n for (let i = 0; i < n; i++) {\n bits--;\n if (ind < b) {\n l.push(0);\n b = (b * --zeros) / bits;\n } else {\n l.push(1);\n ind -= b;\n b = (b * ones--) / bits;\n }\n }\n l.push(ones);\n return l;\n}\n\nfunction compose(A, B) {\n let C = [];\n for (let i = 0; i < B.length; i++) {\n C[i] = A[B[i]];\n }\n return C;\n}\n\nfunction compose_o(A, B) {\n // note: we hardcode the modulus to 3 here, because ~optimisations~\n // (unnecessary abstraction is bad, actually)\n let p = compose(A[0], B[0]);\n let o = [];\n let n = B[0].length;\n for (let i = 0; i < n; i++) {\n o[i] = (A[1][B[0][i]] + B[1][i]) % 3;\n }\n return [p, o];\n}\n\nfunction permutation_from_cycle(cycle, n) {\n let perm = [];\n for (let i = 0; i < n; i++) {\n perm[i] = i;\n }\n for (let i = 0; i < cycle.length; i++) {\n perm[cycle[i]] = cycle[(i + 1) % cycle.length];\n }\n return perm;\n}\n\nfunction unsparsify_list(d, n) {\n let l = Array(n).fill(0);\n for (let k in d) {\n l[k] = d[k];\n }\n return l;\n}\n\n/* The basic moves */\n\nconst move_U = [\n permutation_from_cycle([0, 1, 2, 3, 4], 20),\n unsparsify_list({}, 20),\n];\nconst move_R = [\n permutation_from_cycle([4, 3, 11, 12, 13], 20),\n unsparsify_list({ 4: 2, 3: 1, 11: 1, 12: 1, 13: 1 }, 20),\n];\nconst move_F = [\n permutation_from_cycle([3, 2, 9, 10, 11], 20),\n unsparsify_list({ 3: 2, 2: 1, 9: 1, 10: 1, 11: 1 }, 20),\n];\nconst move_L = [\n permutation_from_cycle([2, 1, 7, 8, 9], 20),\n unsparsify_list({ 2: 2, 1: 1, 7: 1, 8: 1, 9: 1 }, 20),\n];\nlet move_BL = [\n permutation_from_cycle([1, 0, 5, 6, 7], 20),\n unsparsify_list({ 1: 2, 0: 1, 5: 1, 6: 1, 7: 1 }, 20),\n];\nlet move_BR = [\n permutation_from_cycle([0, 4, 13, 14, 5], 20),\n unsparsify_list({ 0: 2, 4: 1, 13: 1, 14: 1, 5: 1 }, 20),\n];\nlet move_x2 = [\n [15, 16, 17, 18, 19, 10, 9, 8, 7, 6, 5, 14, 13, 12, 11, 0, 1, 2, 3, 4],\n unsparsify_list({}, 20),\n];\nlet move_y = [\n [1, 2, 3, 4, 0, 7, 8, 9, 10, 11, 12, 13, 14, 5, 6, 19, 15, 16, 17, 18],\n unsparsify_list({}, 20),\n];\nlet move_rot = [\n [9, 10, 11, 3, 2, 8, 16, 15, 19, 12, 13, 4, 0, 1, 7, 14, 18, 17, 6, 5],\n [2, 0, 1, 2, 1, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 1, 2, 1, 2, 0],\n];\n\nconst moves = [move_U, move_R, move_F, move_L, move_BL, move_BR, move_x2];\nconst move_names = [\"U\", \"R\", \"F\", \"L\", \"BL\", \"BR\", \"x2\"];\n\nlet id = compose_o(move_x2, move_x2);\n\nlet moves_full = [];\nfor (let i = 0; i < moves.length; i++) {\n moves_full[i] = [id];\n for (let j = 1; j < 5; j++) {\n moves_full[i][j] = compose_o(moves_full[i][j - 1], moves[i]);\n }\n}\n\nfunction random_state() {\n let p = [0];\n for (let i = 1; i < 20; i++) {\n let r = randomUIntBelow(i + 1);\n p[i] = p[r];\n p[r] = i;\n }\n if (permutation_parity(p) === 1) {\n [p[0], p[1]] = [p[1], p[0]];\n }\n let o = Array(20).fill(0);\n for (let i = 0; i < 19; i++) {\n o[i] = randomUIntBelow(3);\n o[19] += 3 - o[i];\n }\n o[19] %= 3;\n return [p, o];\n}\n\n/* Human interface stuff */\n\nfunction stringify_move_sequence(move_sequence) {\n let suffixes = [\"0\", \"\", \"2\", \"2'\", \"'\"];\n let s = move_sequence.map(([m, r]) => move_names[m] + suffixes[r]);\n return s.join(\" \");\n}\n\nfunction print_move_sequence(move_sequence) {\n console.log(stringify_move_sequence(move_sequence));\n}\n\nfunction apply_move_sequence(state, move_sequence) {\n for (let [m, r] of move_sequence) {\n for (let i = 0; i < r; i++) {\n state = compose_o(state, moves[m]);\n }\n }\n return state;\n}\n\nfunction generate_random_state_scramble() {\n return solve(random_state());\n}\n\n/* a brief note on analysing random-move scrambles\n\nLet M = num flips and N = num moves between flips.\n\nTracking just corner orientation is pretty much useless to determine if a scramble is good, at least\nfor the choice of CO reference used in the solver (<U,flip,(R'FRF')3>); even M=1, N=8 is good enough\nto randomise the CO, despite leaving a bunch of obvious blocks.\n\nInstead, we can track the location of, say, the white pieces. There are C(20, 5) combinations, so we\njust try out a million random-move scrambles and do a chi-squared test. (Except I don't have a stats\npackage installed, so this is just a qualitative approximation.)\n\nM=4, N=5 (29 moves): +2.7 stddev\nM=3, N=8 (35 moves): +15.7 stddev\nM=5, N=5 (35 moves): -0.1 stddev\nM=4, N=7 (39 moves): +3.8 stddev\nM=5, N=6 (41 moves): -0.4 stddev\nM=4, N=8 (44 moves): +2.2 stddev\n\n(the 95% confidence interval for these estimated values should be taken to be +-2, as usual)\n\nObviously we get closer to a uniform distribution with more moves, but we also want the scrambles to\nbe of a reasonable length. M=5, N=6 seems to be a good tradeoff.\n\nThis is until you realise that the five grey pieces are effectively scrambled with M reduced by one,\nso we compensate for that by using M=6, N=6, which gives 48-move scrambles.\n\n(tl;dr: use the hybrid scrambler if you can stomach 0.3-second initialisation; don't use this)\n*/\n\n/* Solver logic\n\nFor scrambling purposes, we have these two options:\n(i) generate a random state, solve it, then invert the solution\n(ii) generate a random state, solve it, return the solution as is\n\nThe former has a caveat that \"solve\" really means \"solve into the scramble orientation\". If we solve\ninto an arbitrary orientation, the result is a random-modulo-orientation state, in that the scramble\nhas the same relative positions of pieces as the random state, but possibly with the wrong colours.\n\nThe latter works here because the kilominx states form a group and taking the inverse doesn't affect\nthe randomness, and we do have the freedom to solve into any orientation. Since the WCA regs specify\nthat scrambled puzzles are delivered to the competitor in an arbitrary orientation, we may take this\nto be equivalent to right-composing with a random rotation, and this would \"cancel out\" any rotation\nshowing up at the end of the solution.\n\nSolving to orientations other than white-top-green-front saves a few moves (~2.2 moves by testing 10\norientations out of 60), but it's also proportionally slower for marginal gain.\n\nPhases used:\n\nPhase 1: get the five grey corners out of the U layer (6-gen), then rotate.\n\nPhase 2: form the U layer out of the grey corners (6-gen), then rotate.\n\nPhase 3: solve five more corners at the back/left to reduce to <U,R,F> (6-gen).\n\nPhase 4: finish last three faces (3-gen).\n\nPhase 1 is a skip (all five grey corners are already not on the D layer) ~19% of the time, and takes\njust one flip ~18% of the time, so there's a ~37% chance this step is basically trivial. With colour\nneutrality, this could be something like 99.9% trivial.\n\nPhases 2 and 3 make use of the same permutation/orientation move tables. Ideally, we'd use only one,\nbut it would be kinda terrible for a web app to eat hundreds of megabytes of memory. Luckily for us,\nIDA* settles these phases quickly enough that it doesn't really matter. Unluckily for us, this makes\nthe code a bit more complicated.\n\nPhase 4 is the problematic one, with 35.7 billion states. We use three pruning tables:\n- orientation (3^9 = 19683 states)\n- permutation (10!/2 = 1814400 states)\n- list of states up to 7 moves (3565896 states)\n\nWe don't even need to store the actual distances for the almost-solved states; we just let IDA* work\nits magic with the other pruning tables. Basically, if a state is in the list, the heuristic reports\na lower bound of 0, and if it's not, it reports a lower bound of 8.\n*/\n\nfunction solve_phase1(state) {\n // we don't care about orientation.\n let p = state[0];\n // x < 15 tests if a piece is non-grey.\n if (p.slice(15, 20).every((x) => x < 15)) {\n return [];\n }\n if (p.slice(0, 5).every((x) => x < 15)) {\n return [[6, 1]];\n }\n let flags = p.map((x) => x >= 15);\n let depth = 0;\n let sol;\n while (sol === undefined) {\n depth++;\n sol = search_phase1(flags, depth, -1);\n }\n sol.push([6, 1]);\n return sol;\n}\n\nfunction search_phase1(flags, depth, last) {\n if (depth === 0) {\n if (flags.slice(0, 5).some((x) => x)) {\n return;\n }\n return [];\n }\n for (let move_index = 0; move_index < 6; move_index++) {\n if (move_index === last) {\n continue;\n }\n for (let r = 1; r < 5; r++) {\n let new_flags = compose(flags, moves_full[move_index][r][0]);\n let sol = search_phase1(new_flags, depth - 1, move_index);\n if (sol !== undefined) {\n return [[move_index, r]].concat(sol);\n }\n }\n }\n return;\n}\n\nfunction index_phase2(state) {\n let p = state[0].slice(0, 15);\n let o = state[1];\n let index_c = comb_to_index(p.map((x) => +(x >= 15)));\n let index_o = 243 * index_c;\n for (let i = 0, j = 0; i < 15; i++) {\n if (p[i] < 15) {\n continue;\n }\n index_o += o[i] * Math.pow(3, j);\n // as it so happens, my JS shell is too outdated and doesn't support **\n j++;\n }\n let index_p = 0;\n for (let i = 0; i < 5; i++) {\n index_p += p.indexOf(15 + i) * Math.pow(15, i);\n }\n return [index_o, index_p];\n}\n\nfunction solve_phase2(state) {\n let mtables = [\n generate_phase23_orientation_mtable(),\n generate_phase23_permutation_mtable(),\n ];\n let ptables = [\n generate_phase2_orientation_ptable(),\n generate_phase2_permutation_ptable(),\n ];\n return ida_solve(index_phase2(state), mtables, ptables).concat([[6, 1]]);\n}\n\nfunction index_phase3(state) {\n let pieces = [5, 6, 7, 8, 14];\n let p = state[0].slice(0, 15);\n let o = state[1];\n let index_c = comb_to_index(p.map((x) => +(pieces.indexOf(x) !== -1)));\n let index_o = 243 * index_c;\n for (let i = 0, j = 0; i < 15; i++) {\n if (pieces.indexOf(p[i]) === -1) {\n continue;\n }\n index_o += o[i] * Math.pow(3, j);\n j++;\n }\n let index_p = 0;\n for (let i = 0; i < 5; i++) {\n index_p += p.indexOf(pieces[i]) * Math.pow(15, i);\n }\n return [index_o, index_p];\n}\n\nfunction solve_phase3(state) {\n let mtables = [\n generate_phase23_orientation_mtable(),\n generate_phase23_permutation_mtable(),\n ];\n let ptables = [\n generate_phase3_orientation_ptable(),\n generate_phase3_permutation_ptable(),\n ];\n return ida_solve(index_phase3(state), mtables, ptables);\n}\n\nfunction index_phase4(state) {\n let p = state[0].slice(0, 14);\n let o = state[1];\n let index_o = 0;\n let perm = [];\n let j = 0;\n for (let i of [0, 1, 2, 3, 4, 9, 10, 11, 12, 13]) {\n if (i !== 13) {\n index_o += o[i] * Math.pow(3, j);\n }\n perm[j] = p[i] < 5 ? p[i] : p[i] - 4;\n j++;\n }\n return [index_o, evenpermutation_to_index(perm)];\n}\n\nfunction solve_phase4(state) {\n let mtables = [\n generate_phase4_orientation_mtable(),\n generate_phase4_permutation_mtable(),\n ];\n let ptables = [\n generate_phase4_orientation_ptable(),\n generate_phase4_permutation_ptable(),\n ];\n return ida_solve(index_phase4(state), mtables, ptables);\n}\n\nfunction solve_phase4_fast(state) {\n return phase4_ida_solve(index_phase4(state));\n}\n\nfunction solve(state) {\n let sol = [];\n for (let solver of [\n solve_phase1,\n solve_phase2,\n solve_phase3,\n solve_phase4_fast,\n ]) {\n //console.log(`solving with ${solver.name}`);\n let phase_sol = solver(state);\n state = apply_move_sequence(state, phase_sol);\n //console.log(`solution: ${stringify_move_sequence(phase_sol)}`);\n sol = sol.concat(phase_sol);\n }\n return sol;\n}\n\nfunction cn_solve(state) {\n // Solve with partial colour neutrality. We don't want to check all 120 cases, so we look only\n // at <y, flip>-neutrality, which has 10 cases.\n let sol_lengths = [];\n let shortest_sol;\n let shortest_sol_length = 999999;\n for (let x = 0; x < 2; x++) {\n for (let y = 0; y < 5; y++) {\n let sol = solve(state);\n sol_lengths.push(sol.length);\n if (shortest_sol_length > sol.length) {\n shortest_sol_length = sol.length;\n shortest_sol = sol;\n }\n state = compose_o(move_y, state);\n }\n state = compose_o(move_x2, state);\n }\n console.log(`solution lengths: ${sol_lengths.join(\", \")}`);\n return shortest_sol;\n}\n\nconst tables = {};\n\nfunction generate_phase23_orientation_mtable() {\n if (tables.phase23om) {\n return tables.phase23om;\n }\n const C15_5 = C(15, 5);\n const THREE = [1, 3, 9, 27, 81, 243];\n let phase23om = Array(C(15, 5) * THREE[5]);\n tables.phase23om = phase23om;\n for (let i = 0; i < C15_5; i++) {\n let comb = index_to_comb(i, 5, 15).concat(Array(5).fill(0));\n let new_comb_indices = [];\n for (let move_index = 0; move_index < 6; move_index++) {\n let new_comb = compose(comb, moves[move_index][0]).slice(0, 15);\n new_comb_indices[move_index] = comb_to_index(new_comb);\n }\n for (let j = 0; j < THREE[5]; j++) {\n phase23om[j + 243 * i] = [];\n let orient_full = [];\n for (let k = 0, l = 0; k < 20; k++) {\n if (comb[k] === 1) {\n orient_full[k] = ((j / THREE[l]) | 0) % 3;\n l++;\n } else {\n orient_full[k] = 99; // some irrelevant garbage value\n }\n }\n for (let move_index = 0; move_index < 6; move_index++) {\n let move = moves[move_index];\n let new_orient_full = [];\n for (let k = 0; k < 15; k++) {\n new_orient_full[k] = orient_full[move[0][k]] + move[1][k];\n }\n let new_orient = new_orient_full.filter((x) => x < 10); // get rid of garbage\n let J = 0;\n for (let k = 0; k < 5; k++) {\n J += (new_orient[k] % 3) * THREE[k];\n }\n phase23om[j + 243 * i][move_index] =\n J + 243 * new_comb_indices[move_index];\n }\n }\n }\n return phase23om;\n}\n\nfunction generate_phase2_orientation_ptable() {\n if (tables.phase2op) {\n return tables.phase2op;\n }\n let mtable = generate_phase23_orientation_mtable();\n return (tables.phase2op = bfs(mtable, [243 * 3002]));\n}\n\nfunction generate_phase3_orientation_ptable() {\n if (tables.phase3op) {\n return tables.phase3op;\n }\n let mtable = generate_phase23_orientation_mtable();\n return (tables.phase3op = bfs(mtable, [243 * 246]));\n}\n\nfunction generate_phase23_permutation_mtable() {\n if (tables.phase23pm) {\n return tables.phase23pm;\n }\n const FIFTEEN = [\n 1,\n 15,\n 225,\n Math.pow(15, 3),\n Math.pow(15, 4),\n Math.pow(15, 5),\n ];\n let phase23pm = Array(FIFTEEN[5]);\n let single = Array(15);\n for (let i = 0; i < 15; i++) {\n single[i] = Array(6);\n for (let move_index = 0; move_index < 6; move_index++) {\n single[i][move_index] = moves[move_index][0].indexOf(i);\n }\n }\n let locations = [0, 0, 0, 0, 0];\n for (let ind = 0; ind < FIFTEEN[5]; ind++) {\n phase23pm[ind] = Array(6);\n for (let move_index = 0; move_index < 6; move_index++) {\n let new_ind = 0;\n for (let i = 0; i < 5; i++) {\n new_ind += single[locations[i]][move_index] * FIFTEEN[i];\n }\n phase23pm[ind][move_index] = new_ind;\n }\n locations[0]++;\n for (let i = 0; i < 4; i++) {\n if (locations[i] === 15) {\n locations[i] = 0;\n locations[i + 1]++;\n }\n }\n }\n return (tables.phase23pm = phase23pm);\n}\n\nfunction generate_phase2_permutation_ptable() {\n if (tables.phase2pp) {\n return tables.phase2pp;\n }\n let mtable = generate_phase23_permutation_mtable();\n return (tables.phase2pp = bfs(mtable, [213090]));\n}\n\nfunction generate_phase3_permutation_ptable() {\n if (tables.phase3pp) {\n return tables.phase3pp;\n }\n let mtable = generate_phase23_permutation_mtable();\n return (tables.phase3pp = bfs(mtable, [737420]));\n}\n\nfunction generate_phase4_orientation_mtable() {\n if (tables.phase4om) {\n return tables.phase4om;\n }\n const THREE = [1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049];\n let mtable = Array(THREE[9]);\n for (let i = 0; i < THREE[9]; i++) {\n let o = Array(14).fill(0);\n for (let j = 0; j < 9; j++) {\n let J = j < 5 ? j : j + 4;\n o[J] = ((i / THREE[j]) | 0) % 3;\n o[13] -= o[J];\n }\n o[13] = (o[13] + 999) % 3;\n mtable[i] = [];\n for (let move_index = 0; move_index < 3; move_index++) {\n let move = moves[move_index];\n let new_o = [0, 1, 2, 3, 4, 9, 10, 11, 12, 13].map(\n (i) => o[move[0][i]] + move[1][i],\n );\n let new_i = 0;\n for (let j = 0; j < 9; j++) {\n new_i += (new_o[j] % 3) * THREE[j];\n }\n mtable[i][move_index] = new_i;\n }\n }\n return (tables.phase4om = mtable);\n}\n\nfunction generate_phase4_permutation_mtable() {\n if (tables.phase4pm) {\n return tables.phase4pm;\n }\n const HALFFACT10 = factorial(10) / 2;\n const n = 10;\n let pre = [0, 1, 2, 3, 4, -1, -1, -1, -1, 5, 6, 7, 8, 9];\n let post = [0, 1, 2, 3, 4, 9, 10, 11, 12, 13];\n let move_permutations = [\n compose(pre, compose(move_U[0], post)),\n compose(pre, compose(move_R[0], post)),\n compose(pre, compose(move_F[0], post)),\n ];\n let mtable = Array(HALFFACT10);\n let perm = Array(10);\n for (let i = 0; i < HALFFACT10; i++) {\n index_to_evenpermutation10(i, perm);\n mtable[i] = [];\n for (let move_index = 0; move_index < 3; move_index++) {\n let new_perm = compose(perm, move_permutations[move_index]);\n mtable[i][move_index] = evenpermutation10_to_index(new_perm);\n }\n }\n return (tables.phase4pm = mtable);\n}\n\nfunction generate_phase4_orientation_ptable() {\n if (tables.phase4op) {\n return tables.phase4op;\n }\n let mtable = generate_phase4_orientation_mtable();\n return (tables.phase4op = bfs(mtable, [0]));\n}\n\nfunction generate_phase4_permutation_ptable() {\n if (tables.phase4pp) {\n return tables.phase4pp;\n }\n let mtable = generate_phase4_permutation_mtable();\n return (tables.phase4pp = bfs(mtable, [0]));\n}\n\nfunction generate_phase4_near_ptable_list(threshold) {\n if (tables.phase4np_list && tables.phase4np_list.threshold === threshold) {\n return tables.phase4np_list;\n }\n let mtables = [\n generate_phase4_orientation_mtable(),\n generate_phase4_permutation_mtable(),\n ];\n let base = Math.pow(3, 9);\n let states = [0];\n populate(threshold, [0, 0], -1);\n function populate(depth, state, last) {\n states.push(state[0] + base * state[1]);\n if (depth === 0) {\n return;\n }\n let new_state = [];\n for (let move_index = 0; move_index < 3; move_index++) {\n if (move_index === last) {\n continue;\n }\n new_state[0] = state[0];\n new_state[1] = state[1];\n for (let r = 1; r < 5; r++) {\n new_state[0] = mtables[0][new_state[0]][move_index];\n new_state[1] = mtables[1][new_state[1]][move_index];\n populate(depth - 1, new_state, move_index);\n }\n }\n return;\n }\n states.sort((x, y) => x - y);\n let unique_states = [];\n let last = -1;\n for (let state of states) {\n if (state !== last) {\n unique_states.push((last = state));\n }\n }\n unique_states.threshold = threshold;\n return (tables.phase4np_list = unique_states);\n}\n\nfunction binary_search(A, x) {\n let lo = 0;\n let hi = A.length - 1;\n while (hi - lo > 1) {\n // invariants: hi - lo >= 2; x > A[lo-1]; x < A[hi+1]\n let mid = (lo + hi) >> 1; // lo < mid < hi\n if (x > A[mid]) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n return x === A[lo] || x === A[hi];\n}\n\nfunction cache_all_tables() {\n let time = +new Date();\n let splits = [time];\n console.log(\"generating phase 2/3 move tables...\");\n generate_phase23_orientation_mtable();\n generate_phase23_permutation_mtable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 2 pruning tables...\");\n generate_phase2_orientation_ptable();\n generate_phase2_permutation_ptable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 3 pruning tables...\");\n generate_phase3_orientation_ptable();\n generate_phase3_permutation_ptable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 4 move tables...\");\n generate_phase4_orientation_mtable();\n generate_phase4_permutation_mtable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 4 pruning tables...\");\n generate_phase4_orientation_ptable();\n generate_phase4_permutation_ptable();\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\"generating phase 4 bonus pruning table...\");\n generate_phase4_near_ptable_list(PHASE4_THRESHOLD);\n splits.push(+new Date());\n console.log(\n `done ${(\n (splits[splits.length - 1] - splits[splits.length - 2]) /\n 1e3\n ).toFixed(3)}`,\n );\n\n console.log(\n `total elapsed: ${((splits[splits.length - 1] - splits[0]) / 1000).toFixed(\n 3,\n )}`,\n );\n}\n\nfunction bfs(mtable, goal_states) {\n let N = mtable.length;\n let nmoves = mtable[0].length;\n let ptable = Array(N).fill(-1);\n for (let state of goal_states) {\n ptable[state] = 0;\n }\n let depth = 0;\n let done = false;\n while (!done) {\n done = true;\n for (let state = 0; state < N; state++) {\n if (ptable[state] !== depth) {\n continue;\n }\n for (let move_index = 0; move_index < nmoves; move_index++) {\n let new_state = mtable[state][move_index];\n while (new_state !== state) {\n if (ptable[new_state] === -1) {\n done = false;\n ptable[new_state] = depth + 1;\n }\n new_state = mtable[new_state][move_index];\n }\n }\n }\n depth++;\n }\n return ptable;\n}\n\nfunction ida_solve(indices, mtables, ptables) {\n let ncoords = indices.length;\n let bound = 0;\n for (let i = 0; i < ncoords; i++) {\n bound = Math.max(bound, ptables[i][indices[i]]);\n }\n while (true) {\n let path = ida_search(indices, mtables, ptables, bound, -1);\n if (path !== undefined) {\n return path;\n }\n bound++;\n }\n}\n\nfunction ida_search(indices, mtables, ptables, bound, last) {\n let ncoords = indices.length;\n let nmoves = mtables[0][0].length;\n let heuristic = 0;\n for (let i = 0; i < ncoords; i++) {\n heuristic = Math.max(heuristic, ptables[i][indices[i]]);\n }\n if (heuristic > bound) {\n return;\n }\n if (bound === 0 || heuristic === 0) {\n return [];\n }\n for (let m = 0; m < nmoves; m++) {\n if (m === last) {\n continue;\n }\n let new_indices = indices.slice();\n for (let c = 0; c < ncoords; c++) {\n new_indices[c] = mtables[c][indices[c]][m];\n }\n let r = 1;\n while (indices.some((_, i) => indices[i] !== new_indices[i])) {\n let subpath = ida_search(new_indices, mtables, ptables, bound - 1, m);\n if (subpath !== undefined) {\n return [[m, r]].concat(subpath);\n }\n for (let c = 0; c < ncoords; c++) {\n new_indices[c] = mtables[c][new_indices[c]][m];\n }\n r++;\n }\n }\n return;\n}\n\nfunction phase4_ida_solve(indices) {\n let mtable_o = generate_phase4_orientation_mtable();\n let mtable_p = generate_phase4_permutation_mtable();\n let ptable_o = generate_phase4_orientation_ptable();\n let ptable_p = generate_phase4_permutation_ptable();\n let ptable_n = generate_phase4_near_ptable_list(PHASE4_THRESHOLD);\n let bound = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n while (true) {\n let path = phase4_ida_search(\n indices,\n bound,\n -1,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n if (path !== undefined) {\n return path;\n }\n bound++;\n }\n}\n\nfunction phase4_ida_search(\n indices,\n bound,\n last,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n) {\n let heuristic = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n if (heuristic > bound) {\n return;\n }\n if (\n heuristic <= PHASE4_THRESHOLD &&\n !binary_search(ptable_n, indices[0] + 19683 * indices[1])\n ) {\n heuristic = PHASE4_THRESHOLD + 1;\n }\n if (heuristic > bound) {\n return;\n }\n if (bound === 0 || heuristic === 0) {\n return [];\n }\n for (let m = 0; m < 3; m++) {\n if (m === last) {\n continue;\n }\n let new_indices = indices.slice();\n for (let r = 1; r < 5; r++) {\n new_indices[0] = mtable_o[new_indices[0]][m];\n new_indices[1] = mtable_p[new_indices[1]][m];\n let subpath = phase4_ida_search(\n new_indices,\n bound - 1,\n m,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n if (subpath !== undefined) {\n return [[m, r]].concat(subpath);\n }\n }\n }\n return;\n}\n\nfunction* phase4_ida_solve_gen(indices) {\n let mtable_o = generate_phase4_orientation_mtable();\n let mtable_p = generate_phase4_permutation_mtable();\n let ptable_o = generate_phase4_orientation_ptable();\n let ptable_p = generate_phase4_permutation_ptable();\n let ptable_n = generate_phase4_near_ptable_list(PHASE4_THRESHOLD);\n let bound = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n while (true) {\n yield* phase4_ida_search_gen(\n indices,\n bound,\n -1,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n bound++;\n }\n}\n\nfunction* phase4_ida_search_gen(\n indices,\n bound,\n last,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n) {\n let heuristic = Math.max(ptable_o[indices[0]], ptable_p[indices[1]]);\n if (heuristic > bound) {\n return;\n }\n if (\n heuristic <= PHASE4_THRESHOLD &&\n !binary_search(ptable_n, indices[0] + 19683 * indices[1])\n ) {\n heuristic = PHASE4_THRESHOLD + 1;\n }\n if (heuristic > bound) {\n return;\n }\n if (bound === 0 || heuristic === 0) {\n yield [];\n }\n for (let m = 0; m < 3; m++) {\n if (m === last) {\n continue;\n }\n let new_indices = indices.slice();\n for (let r = 1; r < 5; r++) {\n new_indices[0] = mtable_o[new_indices[0]][m];\n new_indices[1] = mtable_p[new_indices[1]][m];\n let subpath_gen = phase4_ida_search_gen(\n new_indices,\n bound - 1,\n m,\n mtable_o,\n mtable_p,\n ptable_o,\n ptable_p,\n ptable_n,\n );\n while (true) {\n let { value: subpath, done } = subpath_gen.next();\n if (done) {\n break;\n }\n yield [[m, r]].concat(subpath);\n }\n }\n }\n}\n\n/* Additional solving logic for the hybrid scrambler\n\nRather than being a purely random-move or random-state scramble (the former isn't random enough, but\nthe latter is too slow), we fully randomise the locations of the white pieces and of the grey pieces\nthen apply a bunch of random moves afterwards.\n\nThis is in the sense that the C(20,10,5,5) = 46558512 possible combinations of where the white, grey\nand E-slice pieces are (without distinguishing between the white pieces, etc.) are equally likely.\n\nCorner orientation is effectively randomised by doing at least 8 random moves on each hemisphere, so\nfor all intents and purposes, this should be as good as a random-state scramble.\n*/\n\nfunction generate_hs_mtable() {\n if (tables.hsm) {\n return tables.hsm;\n }\n const C20_5 = C(20, 5); // = 15504\n let mtable = Array(C20_5);\n for (let i = 0; i < C20_5; i++) {\n mtable[i] = Array(7);\n let comb = index_to_comb(i, 5, 20);\n for (let m = 0; m < 7; m++) {\n let new_comb = compose(comb, moves[m][0]);\n mtable[i][m] = comb_to_index(new_comb);\n }\n }\n return (tables.hsm = mtable);\n}\n\nfunction generate_hs_u_ptable() {\n if (tables.hsup) {\n return tables.hsup;\n }\n let mtable = generate_hs_mtable();\n return (tables.hsup = bfs(mtable, [15503]));\n}\n\nfunction generate_hs_d_ptable() {\n if (tables.hsdp) {\n return tables.hsdp;\n }\n let mtable = generate_hs_mtable();\n return (tables.hsdp = bfs(mtable, [0]));\n}\n\nfunction index_hs(state) {\n let p = state[0];\n return [\n comb_to_index(p.map((x) => +(x < 5))),\n comb_to_index(p.map((x) => +(x >= 15))),\n ];\n}\n\n// this is too unpredictably slow\n// (obv we could generate a full pruning table, but that defeats the purpose of fast initialisation)\nfunction solve_hs(state) {\n let mtables = Array(2).fill(generate_hs_mtable());\n let ptables = [generate_hs_u_ptable(), generate_hs_d_ptable()];\n return ida_solve(index_hs(state), mtables, ptables);\n}\n\n// this gives sequences ~2 moves longer on average, but is way faster\nfunction solve_hs_twophase(state) {\n let mtable = generate_hs_mtable();\n let u_ptable = generate_hs_u_ptable();\n let d_ptable = generate_hs_d_ptable();\n let indices = index_hs(state);\n let sol1;\n /*\n\tif (u_ptable[indices[0]] < d_ptable[indices[1]]) sol1 = ida_solve([indices[0]], [mtable], [u_ptable]);\n\telse sol1 = ida_solve([indices[1]], [mtable], [d_ptable]);\n\t// don't do this because it'd give solutions starting with flip pretty often.\n\t*/\n sol1 = ida_solve([indices[1]], [mtable], [d_ptable]);\n let s1 = apply_move_sequence(state, sol1);\n let sol2 = ida_solve(index_hs(s1), [mtable, mtable], [u_ptable, d_ptable]);\n return sol1.concat(sol2);\n}\n\nfunction generate_hybrid_scramble() {\n let move_sequence = [];\n let sort_seq = solve_hs_twophase(random_state());\n for (let [m, r] of sort_seq) {\n let period = m === 6 ? 2 : 5;\n move_sequence.unshift([m, (period - r) % period]);\n }\n\n // TODO: remove possible move cancellations between the random-state and random-move phases\n return move_sequence.concat(generate_random_move_scramble(2, 9));\n}\n\nfunction generate_fullseparate_mtable() {\n if (tables.fsm) {\n return tables.fsm;\n }\n const C20_10 = C(20, 10); // = 184756\n const C19_9 = C(19, 9); // = 92378\n let moves12 = moves.slice(0, 6);\n moves12 = moves12.concat(\n moves12.map((move) => compose_o(compose_o(move_x2, move), move_x2)),\n );\n // get all 12 face moves by conjugating the six \"top half\" moves with a flip\n let moves15 = moves12.concat([move_x2, move_y, move_rot]);\n let mtable = Array(C20_10 * 2);\n let mtable15 = Array(C20_10 * 2);\n for (let i = 0; i < C20_10; i++) {\n mtable[i * 2] = Array(12);\n mtable[i * 2 + 1] = Array(12);\n mtable15[i * 2] = Array(15);\n mtable15[i * 2 + 1] = Array(15);\n let comb = index_to_comb(i, 10, 20);\n let perm = [];\n for (let j = 0, k = 0; j < 20; j++) {\n if (comb[j] === 0) {\n perm[j] = -1;\n } else {\n perm[j] = k++;\n }\n }\n for (let m = 0; m < 15; m++) {\n let new_perm = compose(perm, moves15[m][0]);\n let new_comb = compose(comb, moves15[m][0]);\n let parity = permutation_parity(new_perm.filter((x) => x >= 0));\n let I = comb_to_index(new_comb);\n mtable15[i * 2][m] = I * 2 + parity;\n mtable15[i * 2 + 1][m] = I * 2 + (parity ^ 1);\n if (m < 12) {\n mtable[i * 2][m] = I * 2 + parity;\n mtable[i * 2 + 1][m] = I * 2 + (parity ^ 1);\n }\n }\n }\n tables.fsm = mtable;\n tables.fsm15 = mtable15;\n return mtable;\n}\n\nfunction generate_fullseparate_ptable() {\n if (tables.fsp) {\n return tables.fsp;\n }\n let mtable = generate_fullseparate_mtable();\n /*\n\tlet separations = [\n\t\t[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n\t\t[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1],\n\t\t[0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1],\n\t\t[1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1].map(x => 1-x),\n\t\t[1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0].map(x => 1-x),\n\t\t[1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0].map(x => 1-x),\n\t\t[0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0],\n\t];\n\t*/\n let goal_states = [0];\n let l = 1;\n while (true) {\n for (let ind of goal_states) {\n for (let m = 12; m < 15; m++) {\n let new_ind = tables.fsm15[ind][m];\n if (goal_states.indexOf(new_ind) === -1) {\n goal_states.push(new_ind);\n goal_states.sort((x, y) => x - y); // slow but w/e\n }\n }\n }\n if (goal_states.length === l) {\n break;\n }\n l = goal_states.length;\n }\n print(goal_states.toSource());\n return (tables.fsp = bfs5(mtable, goal_states));\n}\n\nfunction bfs5(mtable, goal_states) {\n let N = mtable.length;\n let nmoves = mtable[0].length;\n let ptable = Array(N).fill(-1);\n let queue = goal_states.slice();\n let new_queue = [];\n let depth = 0;\n while (queue.length > 0) {\n new_queue.length = 0;\n for (let state of queue) {\n if (ptable[state] !== -1) {\n continue;\n }\n ptable[state] = depth;\n for (let move_index = 0; move_index < nmoves; move_index++) {\n let new_state = mtable[state][move_index];\n for (let r = 1; r <= 4; r++) {\n if (r === 1 || r === 4) {\n new_queue.push(new_state);\n }\n new_state = mtable[new_state][move_index];\n }\n }\n }\n [queue, new_queue] = [new_queue, queue];\n depth += 1;\n }\n return ptable;\n}\n\nexport function getRandomKilominxScramble() {\n return new Alg(stringify_move_sequence(generate_random_state_scramble()));\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["evenpermutation10_to_index", "index_to_evenpermutation10", "C", "i", "last"]
7
+ }
@@ -4,7 +4,7 @@ import {
4
4
 
5
5
  // src/cubing/search/worker-workarounds/search-worker-entry.js
6
6
  if (exposeAPI.expose) {
7
- void import("./inside-IHWUJJ56.js").then(() => {
7
+ void import("./inside-N5WSMI7I.js").then(() => {
8
8
  if (globalThis.postMessage) {
9
9
  globalThis.postMessage("comlink-exposed");
10
10
  } else {
@@ -1,7 +1,7 @@
1
1
  import "./chunk-GHFBZYSV.js";
2
2
  import {
3
3
  Alg
4
- } from "./chunk-YFNXHRNE.js";
4
+ } from "./chunk-UP5VP7GL.js";
5
5
 
6
6
  // src/cubing/vendor/mpl/twips/index.js
7
7
  var wasm;
@@ -430,4 +430,4 @@ export {
430
430
  wasmRandomScrambleForEvent2 as wasmRandomScrambleForEvent,
431
431
  wasmTwips2 as wasmTwips
432
432
  };
433
- //# sourceMappingURL=twips-LHO3IYJC.js.map
433
+ //# sourceMappingURL=twips-UCWWA2WI.js.map