openship 0.4.8 → 0.6.0

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 (112) hide show
  1. package/README.md +27 -1
  2. package/dist/bare-FSUAM5V5.js +23 -0
  3. package/dist/{bowser-O3AEA6AN.js → bowser-HNOTPGJO.js} +2 -2
  4. package/dist/{chunk-5MZ624VX.js → chunk-2GWYYHOR.js} +1 -1
  5. package/dist/chunk-3FYIXVX5.js +8051 -0
  6. package/dist/{chunk-ILFETZOM.js → chunk-3LDWWY7U.js} +21 -1
  7. package/dist/{chunk-W73X43R7.js → chunk-3NQQXMDR.js} +3 -3
  8. package/dist/{chunk-OWED2GRM.js → chunk-42WQABXM.js} +2 -2
  9. package/dist/{chunk-TYVME3XD.js → chunk-6FH4AXVY.js} +20 -3
  10. package/dist/{chunk-OXWDY22G.js → chunk-6ODUBKUB.js} +3 -3
  11. package/dist/{chunk-DYPH4HCI.js → chunk-AO252K7Z.js} +1 -1
  12. package/dist/{chunk-XPPZ7B2J.js → chunk-B3CE2OMR.js} +14 -12
  13. package/dist/{chunk-IXCHURVK.js → chunk-DOD2BXHQ.js} +4 -4
  14. package/dist/{chunk-VWPEKOH6.js → chunk-DRK3MEDS.js} +3 -3
  15. package/dist/{chunk-V6AN6XLZ.js → chunk-EMXI4UCU.js} +125 -47
  16. package/dist/{chunk-GKHUSZCD.js → chunk-EP2TNALB.js} +2 -2
  17. package/dist/{chunk-SLTYVHU7.js → chunk-GUQ3QCJ7.js} +942 -519
  18. package/dist/chunk-I3DPMTSF.js +29 -0
  19. package/dist/{chunk-L2VOGB2X.js → chunk-IW2UKBVF.js} +3 -3
  20. package/dist/{chunk-VDMQJHPI.js → chunk-IXM5245F.js} +228 -13
  21. package/dist/{chunk-MZ2WEHHY.js → chunk-JIMUYEKN.js} +4 -4
  22. package/dist/chunk-OGY63DGD.js +705 -0
  23. package/dist/{chunk-O6ZZF52V.js → chunk-ONKEYSMY.js} +2 -2
  24. package/dist/{chunk-6APULWSU.js → chunk-OTLSJYAC.js} +1744 -118
  25. package/dist/{chunk-EI575GHN.js → chunk-PDW4L3NV.js} +3 -3
  26. package/dist/{chunk-5NYUCONN.js → chunk-PSZSKEPA.js} +33 -51
  27. package/dist/{chunk-KI2EY3WB.js → chunk-PXKCZB2I.js} +1 -1
  28. package/dist/{chunk-FXTBHTWY.js → chunk-QEH4QUBX.js} +649 -85
  29. package/dist/{chunk-6APIPIJY.js → chunk-QWHBRY2K.js} +5 -5
  30. package/dist/{chunk-6B5YCFFV.js → chunk-RVER2EOO.js} +5 -5
  31. package/dist/{chunk-Q2CIRAOK.js → chunk-RXQBD4ZY.js} +1 -1
  32. package/dist/{chunk-TGIINPVM.js → chunk-TWJCLD4W.js} +60 -10
  33. package/dist/{chunk-4Z5QO7N6.js → chunk-VDDMADOF.js} +3 -3
  34. package/dist/{chunk-BBHX7T4R.js → chunk-VE2YOK4I.js} +991 -254
  35. package/dist/{chunk-2D3I5G6P.js → chunk-VZ2ZHPS2.js} +73 -43
  36. package/dist/{chunk-AVIB7CT7.js → chunk-WNWQBB7F.js} +2 -2
  37. package/dist/{chunk-FRNAR33O.js → chunk-XZYFZ6A5.js} +3 -3
  38. package/dist/{chunk-RPHRPFEH.js → chunk-ZCFVHA25.js} +1 -1
  39. package/dist/{chunk-FPRHYBY2.js → chunk-ZFJXPCQP.js} +1 -1
  40. package/dist/{chunk-JYGD5WSN.js → chunk-ZWLDLTJP.js} +1 -1
  41. package/dist/cloud-E5M6VMCG.js +31 -0
  42. package/dist/{cloud-7QYOGF7F.js → cloud-KRTZ2IL5.js} +3 -3
  43. package/dist/{detect-AZLOHUFX.js → detect-ALF4GXRX.js} +7 -8
  44. package/dist/{dist-IQJ6H6UZ.js → dist-BM6NPWIH.js} +3 -3
  45. package/dist/{dist-es-X3B5QYKB.js → dist-es-2YRDXMUU.js} +6 -6
  46. package/dist/{dist-es-OSNJBLXB.js → dist-es-CCVZEFRZ.js} +5 -5
  47. package/dist/{dist-es-VNKHQVIB.js → dist-es-IOH6G4GM.js} +4 -4
  48. package/dist/{dist-es-RYHIPOTN.js → dist-es-JGBPABJI.js} +14 -14
  49. package/dist/{dist-es-JSTDUS7Q.js → dist-es-KWSMDPIP.js} +6 -6
  50. package/dist/{dist-es-5DY7K32L.js → dist-es-UYDDOVZ3.js} +6 -6
  51. package/dist/{dist-es-WV4AMOII.js → dist-es-XUOR4NQN.js} +8 -8
  52. package/dist/docker-QECQJ5P4.js +32 -0
  53. package/dist/docker-edge-executor-62N64MGS.js +17 -0
  54. package/dist/edge-import-CQWHN2Q3.js +48 -0
  55. package/dist/ensure-container-edge-MJVXJQG5.js +32 -0
  56. package/dist/{event-streams-EHRAKL75.js → event-streams-TR4GAC53.js} +4 -4
  57. package/dist/{executor-XJ6RP4Q2.js → executor-JELARVKC.js} +8 -8
  58. package/dist/index.js +1209 -560
  59. package/dist/{loadSso-46FQRIZS.js → loadSso-UGF4JMRK.js} +10 -10
  60. package/dist/{local-executor-V7U5VOZW.js → local-executor-WOFZD72X.js} +4 -4
  61. package/dist/nginx-AXGNWRKZ.js +31 -0
  62. package/dist/node-entry.js +4 -0
  63. package/dist/{noop-FMMFG2EZ.js → noop-NJ72F46T.js} +3 -3
  64. package/dist/openresty-lua-IE4P5YQX.js +81 -0
  65. package/dist/server/index.js +116248 -94749
  66. package/dist/server/lua/geo_country.lua +31 -6
  67. package/dist/server/lua/maxminddb.lua +403 -0
  68. package/dist/server/lua/mgmt_api.lua +431 -68
  69. package/dist/server/lua/pipe_log.lua +10 -4
  70. package/dist/server/lua/site_logger.lua +220 -12
  71. package/dist/server/migrations/0073_project_volumes_object_storage.sql +3 -0
  72. package/dist/server/migrations/0074_project_compose_path.sql +1 -0
  73. package/dist/server/migrations/0075_service_command_argv.sql +1 -0
  74. package/dist/server/migrations/0076_rollback_retention.sql +17 -0
  75. package/dist/server/migrations/0077_domain_redirect.sql +13 -0
  76. package/dist/server/migrations/0078_grant_source_scope.sql +30 -0
  77. package/dist/server/migrations/0079_project_readiness.sql +18 -0
  78. package/dist/server/migrations/0080_deployment_error_classification.sql +26 -0
  79. package/dist/server/migrations/0081_project_readiness_repair.sql +34 -0
  80. package/dist/server/migrations/0082_edge_target_verification.sql +39 -0
  81. package/dist/server/migrations/0083_service_incident.sql +84 -0
  82. package/dist/server/migrations/0084_analytics_daily_rollup.sql +72 -0
  83. package/dist/server/migrations/0085_resource_usage.sql +68 -0
  84. package/dist/server/migrations/0086_remote_infra_updates.sql +41 -0
  85. package/dist/server/migrations/0087_server_container_version_columns.sql +17 -0
  86. package/dist/server/migrations/0088_audit_source_and_settings.sql +27 -0
  87. package/dist/server/migrations/0089_auto_scan_infra.sql +7 -0
  88. package/dist/server/migrations/0090_project_collect_paths.sql +18 -0
  89. package/dist/server/migrations/0091_project_server_id.sql +26 -0
  90. package/dist/server/migrations/0092_project_internal_alias.sql +13 -0
  91. package/dist/server/migrations/0093_service_incident_org_index.sql +13 -0
  92. package/dist/server/migrations/0094_backup_restore_meta.sql +15 -0
  93. package/dist/server/migrations/0095_backup_restore_cancel.sql +19 -0
  94. package/dist/server/migrations/0096_backup_policy_retention_defaults.sql +20 -0
  95. package/dist/server/migrations/0097_update_status_upstream_only.sql +35 -0
  96. package/dist/server/migrations/meta/_journal.json +175 -0
  97. package/dist/setup-FA4PW4NU.js +21 -0
  98. package/dist/{signin-ITOPKKUB.js → signin-3M3UPB6K.js} +10 -10
  99. package/dist/{sso-oidc-NON2PD7Y.js → sso-oidc-3VDIYOEJ.js} +10 -10
  100. package/dist/{sts-HHFFSAY2.js → sts-B3WIYLXR.js} +9 -9
  101. package/package.json +6 -3
  102. package/dist/bare-JY5Y5ELU.js +0 -23
  103. package/dist/chunk-SJIFLLX4.js +0 -2931
  104. package/dist/chunk-VFINNTUL.js +0 -362
  105. package/dist/cloud-KYWY3RP4.js +0 -30
  106. package/dist/docker-LODK5Y2S.js +0 -16
  107. package/dist/docker-edge-executor-VHW3JPJS.js +0 -13
  108. package/dist/edge-import-ABUDKKJI.js +0 -45
  109. package/dist/ensure-container-edge-SW6HENSG.js +0 -31
  110. package/dist/nginx-3L4SIBJA.js +0 -24
  111. package/dist/openresty-lua-4WLGDSER.js +0 -42
  112. package/dist/setup-NU6T2PDU.js +0 -20
@@ -1,362 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- safeErrorMessage
7
- } from "./chunk-6APULWSU.js";
8
-
9
- // ../../packages/adapters/src/infra/openresty-lua.ts
10
- import { createHash } from "crypto";
11
- import { existsSync, readFileSync } from "fs";
12
- import { dirname, join } from "path";
13
- import { fileURLToPath } from "url";
14
-
15
- // ../../packages/adapters/src/infra/lua-embedded.ts
16
- var EMBEDDED_LUA = {
17
- "geo_country.lua": "LS0gZ2VvX2NvdW50cnkubHVhCi0tIE1heE1pbmQgR2VvTGl0ZTItQ291bnRyeSBsb29rdXAgd2l0aCBwZXItd29ya2VyIExSVSBjYWNoZS4KLS0KLS0gREIgYW5kIGNhY2hlIGFyZSBwZXItd29ya2VyIG9ubHk6IG9uZSBsb2FkIHBlciB3b3JrZXIsIHNoYXJlZCBieSBhbGwKLS0gcmVxdWVzdHMuIE5vIHJlbG9hZCBwZXIgc3RyZWFtIG9yIHBlciByZXF1ZXN0LgotLQotLSBEZXBlbmRlbmNpZXMgKGluc3RhbGxlZCBieSBkZXBsb3lMdWFTY3JpcHRzKToKLS0gICBvcG06IGFuamlhMDUzMi9sdWEtcmVzdHktbWF4bWluZGRiCi0tICAgYXB0OiBsaWJtYXhtaW5kZGIwIGxpYm1heG1pbmRkYi1kZXYgIChDIGxpYnJhcnkgZm9yIEZGSSkKLS0gICBEYXRhYmFzZTogL3Vzci9zaGFyZS9HZW9JUC9HZW9MaXRlMi1Db3VudHJ5Lm1tZGIKLS0KLS0gRmFsbHMgYmFjayBncmFjZWZ1bGx5IC0gaWYgdGhlIGxpYnJhcnkgb3IgZGF0YWJhc2UgaXMgbWlzc2luZywKLS0gZ2V0X2NvdW50cnlfY29kZSgpIHJldHVybnMgbmlsLiAgQm90aCBzaXRlX2xvZ2dlci5sdWEgYW5kIHBpcGVfbG9nLmx1YQotLSB3cmFwIHRoaXMgbW9kdWxlIGluIHBjYWxsKHJlcXVpcmUsIC4uLikgc28gYSBtaXNzaW5nIERCIG5ldmVyIGNyYXNoZXMKLS0gdGhlIHJlcXVlc3QgcGlwZWxpbmUuCgpsb2NhbCBfTSA9IHt9Cgpsb2NhbCBEQl9QQVRIID0gIi91c3Ivc2hhcmUvR2VvSVAvR2VvTGl0ZTItQ291bnRyeS5tbWRiIgoKbG9jYWwgbW1kYl9vaywgbWF4bWluZCA9IHBjYWxsKHJlcXVpcmUsICJyZXN0eS5tYXhtaW5kZGIiKQpsb2NhbCBscnVjYWNoZV9vaywgbHJ1Y2FjaGUgPSBwY2FsbChyZXF1aXJlLCAicmVzdHkubHJ1Y2FjaGUiKQoKbG9jYWwgY2FjaGUgICAgICAgICAgICAtLSBvbmUgTFJVIHBlciB3b3JrZXIKbG9jYWwgZ2VvX2luaXR0ZWQgPSBmYWxzZSAgLS0gREIgb3BlbmVkIG9uY2UgcGVyIHdvcmtlciBvbiBmaXJzdCBsb29rdXAKCi0tIEluaXQgTWF4TWluZCBvbmNlIHBlciB3b3JrZXI7IHN1YnNlcXVlbnQgbG9va3VwcyAoYW55IHN0cmVhbSkgcmV1c2UuCmxvY2FsIGZ1bmN0aW9uIGVuc3VyZV9nZW9faW5pdCgpCiAgICBpZiBnZW9faW5pdHRlZCB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAogICAgaWYgbm90IG1tZGJfb2sgb3Igbm90IG1heG1pbmQgdGhlbgogICAgICAgIHJldHVybiBmYWxzZQogICAgZW5kCiAgICBsb2NhbCBvaywgZXJyID0gbWF4bWluZC5pbml0KERCX1BBVEgpCiAgICBpZiBub3Qgb2sgdGhlbgogICAgICAgIG5neC5sb2cobmd4LldBUk4sCiAgICAgICAgICAgICJbZ2VvX2NvdW50cnldIEdlb0xpdGUyIGRhdGFiYXNlIG5vdCBmb3VuZCBhdCAiIC4uIERCX1BBVEggLi4KICAgICAgICAgICAgIiAtIGdlbyBsb29rdXBzIGRpc2FibGVkOiAiIC4uIChlcnIgb3IgInVua25vd24iKSkKICAgICAgICByZXR1cm4gZmFsc2UKICAgIGVuZAogICAgZ2VvX2luaXR0ZWQgPSB0cnVlCiAgICBuZ3gubG9nKG5neC5JTkZPLCAiW2dlb19jb3VudHJ5XSBHZW9MaXRlMi1Db3VudHJ5IGxvYWRlZCBmcm9tICIgLi4gREJfUEFUSCkKICAgIHJldHVybiB0cnVlCmVuZAoKLS0gQ3JlYXRlIExSVSBjYWNoZSBvbmNlIHBlciB3b3JrZXIgKG1heCA1MDAwMCBJUHMpLgpsb2NhbCBmdW5jdGlvbiBnZXRfY2FjaGUoKQogICAgaWYgY2FjaGUgdGhlbgogICAgICAgIHJldHVybiBjYWNoZQogICAgZW5kCiAgICBpZiBub3QgbHJ1Y2FjaGVfb2sgb3Igbm90IGxydWNhY2hlIHRoZW4KICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKICAgIGxvY2FsIGMsIGVyciA9IGxydWNhY2hlLm5ldyg1MDAwMCkKICAgIGlmIG5vdCBjIHRoZW4KICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKICAgIGNhY2hlID0gYwogICAgcmV0dXJuIGNhY2hlCmVuZAoKLS0tIEdldCBjb3VudHJ5IElTTyBjb2RlIGZvciBJUC4gVXNlcyBpbi1tZW1vcnkgTFJVIGNhY2hlIHRoZW4gTWF4TWluZCBEQi4KLS0gQHBhcmFtIGlwIHN0cmluZyAoZS5nLiAiOC44LjguOCIpCi0tIEByZXR1cm4gc3RyaW5nfG5pbCBjb3VudHJ5IGNvZGUgKGUuZy4gIlVTIikgb3IgbmlsCmZ1bmN0aW9uIF9NLmdldF9jb3VudHJ5X2NvZGUoaXApCiAgICBpZiBub3QgaXAgb3IgaXAgPT0gIiIgdGhlbgogICAgICAgIHJldHVybiBuaWwKICAgIGVuZAoKICAgIGxvY2FsIGMgPSBnZXRfY2FjaGUoKQogICAgaWYgYyB0aGVuCiAgICAgICAgbG9jYWwgY2FjaGVkID0gYzpnZXQoaXApCiAgICAgICAgaWYgY2FjaGVkIH49IG5pbCB0aGVuCiAgICAgICAgICAgIC0tIGZhbHNlIG1lYW5zICJsb29rZWQgdXAsIG5vIHJlc3VsdCIgLSBhdm9pZHMgcmVwZWF0ZWQgREIgbWlzc2VzCiAgICAgICAgICAgIHJldHVybiAoY2FjaGVkID09IGZhbHNlKSBhbmQgbmlsIG9yIGNhY2hlZAogICAgICAgIGVuZAogICAgZW5kCgogICAgaWYgbm90IGVuc3VyZV9nZW9faW5pdCgpIHRoZW4KICAgICAgICBpZiBjIHRoZW4gYzpzZXQoaXAsIGZhbHNlKSBlbmQKICAgICAgICByZXR1cm4gbmlsCiAgICBlbmQKCiAgICBsb2NhbCBvaywgcmVzLCBlcnIgPSBwY2FsbChtYXhtaW5kLmxvb2t1cCwgaXApCiAgICBsb2NhbCBjb2RlID0gbmlsCiAgICBpZiBvayBhbmQgcmVzIGFuZCByZXMuY291bnRyeSBhbmQgcmVzLmNvdW50cnkuaXNvX2NvZGUgdGhlbgogICAgICAgIGNvZGUgPSByZXMuY291bnRyeS5pc29fY29kZQogICAgZW5kCgogICAgaWYgYyB0aGVuCiAgICAgICAgYzpzZXQoaXAsIGNvZGUgb3IgZmFsc2UpCiAgICBlbmQKICAgIHJldHVybiBjb2RlCmVuZAoKZnVuY3Rpb24gX00uZW5zdXJlX2dlb19pbml0KCkKICAgIHJldHVybiBlbnN1cmVfZ2VvX2luaXQoKQplbmQKCnJldHVybiBfTQo=",
18
- "mgmt_api.lua": "LS0gbWdtdF9hcGkubHVhCi0tIFJFU1QgYW5hbHl0aWNzIGVuZHBvaW50cyBiYWNrZWQgYnkgbmd4LnNoYXJlZC5kaWN0LgotLSBJbnRlcm5hbCBtYW5hZ2VtZW50IHBvcnQgb25seSAoMTI3LjAuMC4xOjkxNDUpLgoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgYW5hbHl0aWNzICAgID0gbmd4LnNoYXJlZC5hbmFseXRpY3MKbG9jYWwgcmVxdWVzdF9kYXRhID0gbmd4LnNoYXJlZC5yZXF1ZXN0X2RhdGEKbG9jYWwgdXJpICAgICAgICAgID0gbmd4LnZhci51cmkKCmxvY2FsIGZ1bmN0aW9uIGpzb24oZGF0YSwgY29kZSkKICAgIG5neC5zdGF0dXMgPSBjb2RlIG9yIDIwMAogICAgbmd4LmhlYWRlclsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIKICAgIG5neC5zYXkoY2pzb24uZW5jb2RlKGRhdGEpKQogICAgcmV0dXJuIG5neC5leGl0KG5neC5zdGF0dXMpCmVuZAoKbG9jYWwgZnVuY3Rpb24gYmFkKG1zZykKICAgIHJldHVybiBqc29uKHsgZXJyb3IgPSBtc2cgfSwgNDAwKQplbmQKCi0tIOKUgOKUgCBHRVQgL2hlYWx0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmlmIHVyaSA9PSAiL2hlYWx0aCIgdGhlbgogICAgbmd4LnNheSgib2siKQogICAgcmV0dXJuIG5neC5leGl0KDIwMCkKZW5kCgotLSDilIDilIAgL3J1bGVzIC0gcGVyLXJvdXRlIHJ1bGVzIGNhY2hlICh3cml0dGVuIGJ5IHRoZSBBUEksIHJlYWQgYnkgcnVsZXNfZ3VhcmQpIOKUgOKUgAotLSBQT1NUIC9ydWxlcyAgYm9keTogeyAiaG9zdCI6ICIuLi4iLCAicnVsZXMiOiBbIHsgInBhdGhQcmVmaXgiOiAiLyIsICJzcGVjIjogey4uLn0gfSBdIH0KLS0gICDihpIgcmVwbGFjZXMgdGhlIHJ1bGVzZXQgZm9yIHRoYXQgaG9zdCBpbiB0aGUgYHJ1bGVzYCBzaGFyZWQgZGljdCAocmVsb2FkLWZyZWUpLgotLSAgIEFuIGVtcHR5L2Fic2VudCBgcnVsZXNgIGFycmF5IGNsZWFycyB0aGUgaG9zdC4KLS0gR0VUICAvcnVsZXM/aG9zdD0uLi4gICDihpIgdGhlIHN0b3JlZCBydWxlc2V0IChkZWJ1ZykuCi0tIERFTEVURSAvcnVsZXM/aG9zdD0uLi4g4oaSIGNsZWFyIHRoZSBob3N0J3MgcnVsZXNldC4KLS0gSGFuZGxlZCBCRUZPUkUgdGhlIGFuYWx5dGljcyBndWFyZDogcnVsZXMgdXNlIHRoZWlyIG93biBkaWN0LgppZiB1cmkgPT0gIi9ydWxlcyIgdGhlbgogICAgbG9jYWwgcnVsZXMgPSBuZ3guc2hhcmVkLnJ1bGVzCiAgICBpZiBub3QgcnVsZXMgdGhlbiByZXR1cm4ganNvbih7IGVycm9yID0gInJ1bGVzIGRpY3QgdW5hdmFpbGFibGUiIH0sIDUwMykgZW5kCiAgICBsb2NhbCBtZXRob2QgPSBuZ3gucmVxLmdldF9tZXRob2QoKQoKICAgIGlmIG1ldGhvZCA9PSAiR0VUIiB0aGVuCiAgICAgICAgbG9jYWwgaG9zdCA9IG5neC52YXIuYXJnX2hvc3QKICAgICAgICBpZiBub3QgaG9zdCBvciBob3N0ID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/aG9zdD0iKSBlbmQKICAgICAgICBob3N0ID0gaG9zdDpsb3dlcigpCiAgICAgICAgbG9jYWwgcmF3ID0gcnVsZXM6Z2V0KGhvc3QpCiAgICAgICAgcmV0dXJuIGpzb24oeyBob3N0ID0gaG9zdCwgcnVsZXMgPSByYXcgYW5kIGNqc29uLmRlY29kZShyYXcpIG9yIHt9IH0pCiAgICBlbmQKCiAgICBpZiBtZXRob2QgPT0gIkRFTEVURSIgdGhlbgogICAgICAgIGxvY2FsIGhvc3QgPSBuZ3gudmFyLmFyZ19ob3N0CiAgICAgICAgaWYgbm90IGhvc3Qgb3IgaG9zdCA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2hvc3Q9IikgZW5kCiAgICAgICAgcnVsZXM6ZGVsZXRlKGhvc3Q6bG93ZXIoKSkKICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSB9KQogICAgZW5kCgogICAgaWYgbWV0aG9kID09ICJQT1NUIiB0aGVuCiAgICAgICAgbmd4LnJlcS5yZWFkX2JvZHkoKQogICAgICAgIGxvY2FsIGJvZHkgPSBuZ3gucmVxLmdldF9ib2R5X2RhdGEoKQogICAgICAgIGlmIG5vdCBib2R5IHRoZW4gcmV0dXJuIGJhZCgiZW1wdHkgYm9keSIpIGVuZAogICAgICAgIGxvY2FsIHBheWxvYWQgPSBjanNvbi5kZWNvZGUoYm9keSkKICAgICAgICBpZiB0eXBlKHBheWxvYWQpIH49ICJ0YWJsZSIgb3Igbm90IHBheWxvYWQuaG9zdCB0aGVuCiAgICAgICAgICAgIHJldHVybiBiYWQoImV4cGVjdGVkIHsgaG9zdCwgcnVsZXM6IFsuLi5dIH0iKQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIGhvc3QgPSB0b3N0cmluZyhwYXlsb2FkLmhvc3QpOmxvd2VyKCkKICAgICAgICBsb2NhbCBsaXN0ID0gcGF5bG9hZC5ydWxlcwogICAgICAgIGlmIHR5cGUobGlzdCkgfj0gInRhYmxlIiBvciAjbGlzdCA9PSAwIHRoZW4KICAgICAgICAgICAgcnVsZXM6ZGVsZXRlKGhvc3QpICAgICAgICAgICAgICAgICAtLSBlbXB0eSBzZXQgPSBjbGVhciB0aGUgaG9zdAogICAgICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSwgaG9zdCA9IGhvc3QsIGNvdW50ID0gMCB9KQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIG9rLCBlcnIgPSBydWxlczpzZXQoaG9zdCwgY2pzb24uZW5jb2RlKGxpc3QpKQogICAgICAgIGlmIG5vdCBvayB0aGVuIHJldHVybiBqc29uKHsgZXJyb3IgPSAic2V0IGZhaWxlZDogIiAuLiAoZXJyIG9yICI/IikgfSwgNTAwKSBlbmQKICAgICAgICByZXR1cm4ganNvbih7IG9rID0gdHJ1ZSwgaG9zdCA9IGhvc3QsIGNvdW50ID0gI2xpc3QgfSkKICAgIGVuZAoKICAgIHJldHVybiBqc29uKHsgZXJyb3IgPSAibWV0aG9kIG5vdCBhbGxvd2VkIiB9LCA0MDUpCmVuZAoKaWYgbm90IGFuYWx5dGljcyB0aGVuCiAgICByZXR1cm4ganNvbih7IGVycm9yID0gImFuYWx5dGljcyBkaWN0IHVuYXZhaWxhYmxlIiB9LCA1MDMpCmVuZAoKLS0g4pSA4pSAIEdFVCAvYW5hbHl0aWNzIC0gbWludXRlLWJ1Y2tldCB0aW1lIHNlcmllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLS0gP2RvbWFpbj1leGFtcGxlLmNvbSZmcm9tPUVQT0NIX01JTiZ0bz1FUE9DSF9NSU4KCmlmIHVyaSA9PSAiL2FuYWx5dGljcyIgdGhlbgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCiAgICBpZiBub3QgZG9tYWluIG9yIGRvbWFpbiA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2RvbWFpbj0iKSBlbmQKICAgIGRvbWFpbiA9IGRvbWFpbjpsb3dlcigpCgogICAgbG9jYWwgZnJvbV9tID0gdG9udW1iZXIobmd4LnZhci5hcmdfZnJvbSkKICAgIGxvY2FsIHRvX20gICA9IHRvbnVtYmVyKG5neC52YXIuYXJnX3RvKQogICAgaWYgbm90IGZyb21fbSBvciBub3QgdG9fbSB0aGVuCiAgICAgICAgcmV0dXJuIGJhZCgibWlzc2luZyA/ZnJvbT0gYW5kID90bz0gKGVwb2NoIG1pbnV0ZXMpIikKICAgIGVuZAogICAgLS0gQ2FwIGF0IDI0aAogICAgaWYgdG9fbSAtIGZyb21fbSA+IDE0NDAgdGhlbiB0b19tID0gZnJvbV9tICsgMTQ0MCBlbmQKCiAgICBsb2NhbCBidWNrZXRzID0ge30KICAgIGZvciBtID0gZnJvbV9tLCB0b19tIGRvCiAgICAgICAgbG9jYWwgcCA9ICJzOiIgLi4gZG9tYWluIC4uICI6IiAuLiBtCiAgICAgICAgbG9jYWwgciA9IGFuYWx5dGljczpnZXQocCAuLiAiOnIiKQogICAgICAgIGlmIHIgdGhlbgogICAgICAgICAgICAtLSBSZXNwb25zZSB0aW1lIHN0b3JlZCBhcyBtaWNyb3NlY29uZHMsIGNvbnZlcnQgdG8gc2Vjb25kcyAoZmxvYXQpCiAgICAgICAgICAgIGxvY2FsIHJ0X3VzID0gYW5hbHl0aWNzOmdldChwIC4uICI6dCIpIG9yIDAKICAgICAgICAgICAgbG9jYWwgYnVja2V0ID0gewogICAgICAgICAgICAgICAgbWludXRlICAgICAgICAgICA9IG0sCiAgICAgICAgICAgICAgICByZXF1ZXN0cyAgICAgICAgID0gciwKICAgICAgICAgICAgICAgIHVuaXF1ZV9yZXF1ZXN0cyAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjp1Iikgb3IgMCwKICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9pbiAgICAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjppIikgb3IgMCwKICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9vdXQgICAgPSBhbmFseXRpY3M6Z2V0KHAgLi4gIjpvIikgb3IgMCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RpbWUgICAgPSBydF91cyAvIDEwMDAwMDAsCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC0tIENvbGxlY3QgcGVyLW1pbnV0ZSBjb3VudHJ5IGRhdGEgaWYgcHJlc2VudAogICAgICAgICAgICBsb2NhbCBjcGZ4ID0gImM6IiAuLiBkb21haW4gLi4gIjoiIC4uIG0gLi4gIjoiCiAgICAgICAgICAgIGxvY2FsIGFsbF9rZXlzID0gYW5hbHl0aWNzOmdldF9rZXlzKDEwMDAwKQogICAgICAgICAgICBsb2NhbCBjb3VudHJpZXMgPSB7fQogICAgICAgICAgICBsb2NhbCBoYXNfY291bnRyaWVzID0gZmFsc2UKICAgICAgICAgICAgZm9yIF8sIGsgaW4gaXBhaXJzKGFsbF9rZXlzKSBkbwogICAgICAgICAgICAgICAgaWYgazpzdWIoMSwgI2NwZngpID09IGNwZnggdGhlbgogICAgICAgICAgICAgICAgICAgIGNvdW50cmllc1trOnN1YigjY3BmeCArIDEpXSA9IGFuYWx5dGljczpnZXQoaykgb3IgMAogICAgICAgICAgICAgICAgICAgIGhhc19jb3VudHJpZXMgPSB0cnVlCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIGhhc19jb3VudHJpZXMgdGhlbgogICAgICAgICAgICAgICAgYnVja2V0LmNvdW50cmllcyA9IGNvdW50cmllcwogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgIGJ1Y2tldHNbI2J1Y2tldHMgKyAxXSA9IGJ1Y2tldAogICAgICAgIGVuZAogICAgZW5kCgogICAgcmV0dXJuIGpzb24oeyBkb21haW4gPSBkb21haW4sIGJ1Y2tldHMgPSBidWNrZXRzIH0pCmVuZAoKLS0g4pSA4pSAIFBPU1QgL2FuYWx5dGljcy9mbHVzaCAtIHJlYWQgKyBkZWxldGUgbWludXRlIGJ1Y2tldHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFNhbWUgYXMgR0VUIC9hbmFseXRpY3MgYnV0IGRlbGV0ZXMgdGhlIHJldHVybmVkIGJ1Y2tldHMgZnJvbSBzaGFyZWQgbWVtb3J5LgotLSBVc2VkIGJ5IHRoZSBzY3JhcGVyIHRvIGF0b21pY2FsbHkgbW92ZSBkYXRhIGZyb20gT3BlblJlc3R5IOKGkiBEQi4KLS0gP2RvbWFpbj1leGFtcGxlLmNvbSZmcm9tPUVQT0NIX01JTiZ0bz1FUE9DSF9NSU4KCmlmIHVyaSA9PSAiL2FuYWx5dGljcy9mbHVzaCIgYW5kIG5neC5yZXEuZ2V0X21ldGhvZCgpID09ICJQT1NUIiB0aGVuCiAgICBsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KICAgIGlmIG5vdCBkb21haW4gb3IgZG9tYWluID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/ZG9tYWluPSIpIGVuZAogICAgZG9tYWluID0gZG9tYWluOmxvd2VyKCkKCiAgICBsb2NhbCBmcm9tX20gPSB0b251bWJlcihuZ3gudmFyLmFyZ19mcm9tKQogICAgbG9jYWwgdG9fbSAgID0gdG9udW1iZXIobmd4LnZhci5hcmdfdG8pCiAgICBpZiBub3QgZnJvbV9tIG9yIG5vdCB0b19tIHRoZW4KICAgICAgICByZXR1cm4gYmFkKCJtaXNzaW5nID9mcm9tPSBhbmQgP3RvPSAoZXBvY2ggbWludXRlcykiKQogICAgZW5kCiAgICBpZiB0b19tIC0gZnJvbV9tID4gMTQ0MCB0aGVuIHRvX20gPSBmcm9tX20gKyAxNDQwIGVuZAoKICAgIGxvY2FsIGJ1Y2tldHMgPSB7fQogICAgbG9jYWwgZmx1c2hlZCA9IDAKICAgIGZvciBtID0gZnJvbV9tLCB0b19tIGRvCiAgICAgICAgbG9jYWwgcCA9ICJzOiIgLi4gZG9tYWluIC4uICI6IiAuLiBtCiAgICAgICAgbG9jYWwgciA9IGFuYWx5dGljczpnZXQocCAuLiAiOnIiKQogICAgICAgIGlmIHIgdGhlbgogICAgICAgICAgICBsb2NhbCBydF91cyA9IGFuYWx5dGljczpnZXQocCAuLiAiOnQiKSBvciAwCiAgICAgICAgICAgIGxvY2FsIGJ1Y2tldCA9IHsKICAgICAgICAgICAgICAgIG1pbnV0ZSAgICAgICAgICAgPSBtLAogICAgICAgICAgICAgICAgcmVxdWVzdHMgICAgICAgICA9IHIsCiAgICAgICAgICAgICAgICB1bmlxdWVfcmVxdWVzdHMgID0gYW5hbHl0aWNzOmdldChwIC4uICI6dSIpIG9yIDAsCiAgICAgICAgICAgICAgICBiYW5kd2lkdGhfaW4gICAgID0gYW5hbHl0aWNzOmdldChwIC4uICI6aSIpIG9yIDAsCiAgICAgICAgICAgICAgICBiYW5kd2lkdGhfb3V0ICAgID0gYW5hbHl0aWNzOmdldChwIC4uICI6byIpIG9yIDAsCiAgICAgICAgICAgICAgICByZXNwb25zZV90aW1lICAgID0gcnRfdXMgLyAxMDAwMDAwLAogICAgICAgICAgICB9CgogICAgICAgICAgICAtLSBDb2xsZWN0IHBlci1taW51dGUgY291bnRyeSBkYXRhCiAgICAgICAgICAgIGxvY2FsIGNwZnggPSAiYzoiIC4uIGRvbWFpbiAuLiAiOiIgLi4gbSAuLiAiOiIKICAgICAgICAgICAgbG9jYWwgYWxsX2tleXMgPSBhbmFseXRpY3M6Z2V0X2tleXMoMTAwMDApCiAgICAgICAgICAgIGxvY2FsIGNvdW50cmllcyA9IHt9CiAgICAgICAgICAgIGxvY2FsIGhhc19jb3VudHJpZXMgPSBmYWxzZQogICAgICAgICAgICBmb3IgXywgayBpbiBpcGFpcnMoYWxsX2tleXMpIGRvCiAgICAgICAgICAgICAgICBpZiBrOnN1YigxLCAjY3BmeCkgPT0gY3BmeCB0aGVuCiAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzW2s6c3ViKCNjcGZ4ICsgMSldID0gYW5hbHl0aWNzOmdldChrKSBvciAwCiAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzOmRlbGV0ZShrKQogICAgICAgICAgICAgICAgICAgIGhhc19jb3VudHJpZXMgPSB0cnVlCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIGhhc19jb3VudHJpZXMgdGhlbiBidWNrZXQuY291bnRyaWVzID0gY291bnRyaWVzIGVuZAoKICAgICAgICAgICAgYnVja2V0c1sjYnVja2V0cyArIDFdID0gYnVja2V0CgogICAgICAgICAgICAtLSBEZWxldGUgdGhlIG1pbnV0ZS1idWNrZXQgY291bnRlciBrZXlzCiAgICAgICAgICAgIGFuYWx5dGljczpkZWxldGUocCAuLiAiOnIiKQogICAgICAgICAgICBhbmFseXRpY3M6ZGVsZXRlKHAgLi4gIjppIikKICAgICAgICAgICAgYW5hbHl0aWNzOmRlbGV0ZShwIC4uICI6byIpCiAgICAgICAgICAgIGFuYWx5dGljczpkZWxldGUocCAuLiAiOnQiKQogICAgICAgICAgICBhbmFseXRpY3M6ZGVsZXRlKHAgLi4gIjp1IikKICAgICAgICAgICAgZmx1c2hlZCA9IGZsdXNoZWQgKyAxCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4ganNvbih7IGRvbWFpbiA9IGRvbWFpbiwgYnVja2V0cyA9IGJ1Y2tldHMsIGZsdXNoZWQgPSBmbHVzaGVkIH0pCmVuZAoKLS0g4pSA4pSAIEdFVCAvYW5hbHl0aWNzL3RvdGFscyAtIGxpZmV0aW1lIGNvdW50ZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSA/ZG9tYWluPWV4YW1wbGUuY29tICAgICAg4oaSIHNpbmdsZSBkb21haW4KLS0gKG5vIGRvbWFpbikgICAgICAgICAgICAgIOKGkiBhbGwga25vd24gZG9tYWlucwoKaWYgdXJpID09ICIvYW5hbHl0aWNzL3RvdGFscyIgdGhlbgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCgogICAgaWYgbm90IGRvbWFpbiBvciBkb21haW4gPT0gIiIgdGhlbgogICAgICAgIGxvY2FsIGtleXMgPSBhbmFseXRpY3M6Z2V0X2tleXMoMTAwMDApCiAgICAgICAgbG9jYWwgZG9tYWlucyA9IHt9CiAgICAgICAgZm9yIF8sIGsgaW4gaXBhaXJzKGtleXMpIGRvCiAgICAgICAgICAgIGxvY2FsIGQgPSBrOm1hdGNoKCJeZDooLispJCIpCiAgICAgICAgICAgIGlmIGQgdGhlbgogICAgICAgICAgICAgICAgZG9tYWluc1sjZG9tYWlucyArIDFdID0gewogICAgICAgICAgICAgICAgICAgIGRvbWFpbiAgICAgICAgPSBkLAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzICAgICAgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOnIiKSBvciAwLAogICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9pbiAgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOmkiKSBvciAwLAogICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aF9vdXQgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZCAuLiAiOm8iKSBvciAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgICAgICByZXR1cm4ganNvbih7IGRvbWFpbnMgPSBkb21haW5zIH0pCiAgICBlbmQKCiAgICBkb21haW4gPSBkb21haW46bG93ZXIoKQogICAgcmV0dXJuIGpzb24oewogICAgICAgIGRvbWFpbiAgICAgICAgPSBkb21haW4sCiAgICAgICAgcmVxdWVzdHMgICAgICA9IGFuYWx5dGljczpnZXQoInQ6IiAuLiBkb21haW4gLi4gIjpyIikgb3IgMCwKICAgICAgICBiYW5kd2lkdGhfaW4gID0gYW5hbHl0aWNzOmdldCgidDoiIC4uIGRvbWFpbiAuLiAiOmkiKSBvciAwLAogICAgICAgIGJhbmR3aWR0aF9vdXQgPSBhbmFseXRpY3M6Z2V0KCJ0OiIgLi4gZG9tYWluIC4uICI6byIpIG9yIDAsCiAgICB9KQplbmQKCi0tIOKUgOKUgCBHRVQgL2FuYWx5dGljcy9nZW8gLSBjb3VudHJ5IGJyZWFrZG93biBmb3IgYSBkYXkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tID9kb21haW49ZXhhbXBsZS5jb20mZGF5PVlZWVlNTURECgppZiB1cmkgPT0gIi9hbmFseXRpY3MvZ2VvIiB0aGVuCiAgICBsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KICAgIGlmIG5vdCBkb21haW4gb3IgZG9tYWluID09ICIiIHRoZW4gcmV0dXJuIGJhZCgibWlzc2luZyA/ZG9tYWluPSIpIGVuZAogICAgZG9tYWluID0gZG9tYWluOmxvd2VyKCkKCiAgICBsb2NhbCBkYXkgPSBuZ3gudmFyLmFyZ19kYXkKICAgIGlmIG5vdCBkYXkgb3IgI2RheSB+PSA4IHRoZW4KICAgICAgICBkYXkgPSBvcy5kYXRlKCIhJVklbSVkIikKICAgIGVuZAoKICAgIGxvY2FsIHByZWZpeCA9ICJnOiIgLi4gZG9tYWluIC4uICI6IiAuLiBkYXkgLi4gIjoiCiAgICBsb2NhbCBrZXlzID0gYW5hbHl0aWNzOmdldF9rZXlzKDEwMDAwKQogICAgbG9jYWwgY291bnRyaWVzID0ge30KICAgIGZvciBfLCBrIGluIGlwYWlycyhrZXlzKSBkbwogICAgICAgIGlmIGs6c3ViKDEsICNwcmVmaXgpID09IHByZWZpeCB0aGVuCiAgICAgICAgICAgIGNvdW50cmllc1trOnN1YigjcHJlZml4ICsgMSldID0gYW5hbHl0aWNzOmdldChrKSBvciAwCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4ganNvbih7IGRvbWFpbiA9IGRvbWFpbiwgZGF5ID0gZGF5LCBjb3VudHJpZXMgPSBjb3VudHJpZXMgfSkKZW5kCgotLSDilIDilIAgR0VUIC9sb2dzL3JlY2VudCAtIHJhdyByZXF1ZXN0IHJpbmcgYnVmZmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSA/ZG9tYWluPWV4YW1wbGUuY29tJmxpbWl0PTUwCgppZiB1cmkgPT0gIi9sb2dzL3JlY2VudCIgdGhlbgogICAgaWYgbm90IHJlcXVlc3RfZGF0YSB0aGVuCiAgICAgICAgcmV0dXJuIGpzb24oeyBlcnJvciA9ICJyZXF1ZXN0X2RhdGEgZGljdCB1bmF2YWlsYWJsZSIgfSwgNTAzKQogICAgZW5kCgogICAgbG9jYWwgZG9tYWluID0gbmd4LnZhci5hcmdfZG9tYWluCiAgICBpZiBub3QgZG9tYWluIG9yIGRvbWFpbiA9PSAiIiB0aGVuIHJldHVybiBiYWQoIm1pc3NpbmcgP2RvbWFpbj0iKSBlbmQKICAgIGRvbWFpbiA9IGRvbWFpbjpsb3dlcigpCgogICAgbG9jYWwgbGltaXQgPSBtYXRoLm1pbih0b251bWJlcihuZ3gudmFyLmFyZ19saW1pdCkgb3IgNTAsIDEwMDApCiAgICBsb2NhbCBzZXEgICA9IHJlcXVlc3RfZGF0YTpnZXQoInJsb2c6IiAuLiBkb21haW4gLi4gIjpzZXEiKSBvciAwCiAgICBsb2NhbCBvdXQgICA9IHt9CgogICAgZm9yIGkgPSAwLCBsaW1pdCAtIDEgZG8KICAgICAgICBsb2NhbCBzbG90ID0gKHNlcSAtIGkpICUgMTAwMAogICAgICAgIGlmIHNsb3QgPCAwIHRoZW4gc2xvdCA9IHNsb3QgKyAxMDAwIGVuZAogICAgICAgIGxvY2FsIHJhdyA9IHJlcXVlc3RfZGF0YTpnZXQoInJsb2c6IiAuLiBkb21haW4gLi4gIjoiIC4uIHNsb3QpCiAgICAgICAgaWYgcmF3IHRoZW4gb3V0WyNvdXQgKyAxXSA9IHJhdyBlbmQKICAgIGVuZAoKICAgIC0tIFJldHVybiBwcmUtZW5jb2RlZCBKU09OIGVudHJpZXMgYXMgYSBKU09OIGFycmF5CiAgICBuZ3guaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgbmd4LnByaW50KCJbIikKICAgIGZvciBpZHgsIGVudHJ5IGluIGlwYWlycyhvdXQpIGRvCiAgICAgICAgaWYgaWR4ID4gMSB0aGVuIG5neC5wcmludCgiLCIpIGVuZAogICAgICAgIG5neC5wcmludChlbnRyeSkKICAgIGVuZAogICAgbmd4LnNheSgiXSIpCiAgICByZXR1cm4gbmd4LmV4aXQoMjAwKQplbmQKCi0tIOKUgOKUgCA0MDQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnJldHVybiBqc29uKHsgZXJyb3IgPSAibm90IGZvdW5kIiB9LCA0MDQpCg==",
19
- "pipe_log.lua": "LS0gcGlwZV9sb2cubHVhCi0tIFB1c2ggcmVxdWVzdCBsb2cgaW50byBzaGFyZWQgZGljdCBxdWV1ZSBsb2dfcGlwZTpxOntob3N0fSBmb3IgL3N0cmVhbSBTU0UuCi0tIFBheWxvYWQgc2hhcGUgbWF0Y2hlcyByZXF1ZXN0TG9nZ2VyLmpzIChpZCwgaXAsIGNvdW50cnkgd2hlbiBrbm93biwKLS0gdGltZXN0YW1wLCBkYXRlLCB1cmksIG1ldGhvZCwgc3RhdHVzLCB1c2VyQWdlbnQsIHJlcXVlc3RTaXplLCByZXNwb25zZVNpemUsCi0tIHJlc3BvbnNlVGltZSkuCi0tCi0tIENhbGxlZCB2aWEgbmd4LnRpbWVyLmF0IGZyb20gc2l0ZV9sb2dnZXIgKHByZW1hdHVyZSBpcyBmaXJzdCBhcmcpLgoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgU1VCX1BSRUZJWCAgID0gImxvZ19waXBlOnN1YjoiCmxvY2FsIFFVRVVFX1BSRUZJWCA9ICJsb2dfcGlwZTpxOiIKbG9jYWwgUVVFVUVfTUFYX0xFTiA9IDIwMDAKCi0tIFNBRkUgTE9BRDogR2VvSVAgKHBlci13b3JrZXIsIGNhY2hlZCBieSByZXF1aXJlKQpsb2NhbCBnZW9fb2ssIGdlbyA9IHBjYWxsKHJlcXVpcmUsICJvcGVuc2hpcC5nZW9fY291bnRyeSIpCmlmIG5vdCBnZW9fb2sgdGhlbiBnZW8gPSBuaWwgZW5kCgotLSBSZXVzZWQgcGF5bG9hZCB0YWJsZSBwZXIgd29ya2VyIChjbGVhcmVkIGFmdGVyIGVuY29kZSB0byBhdm9pZCBHQyBwcmVzc3VyZSkKbG9jYWwgcGF5bG9hZCA9IHt9Cgpsb2NhbCBmdW5jdGlvbiBwaXBlX3JlcXVlc3RfbG9nKHByZW1hdHVyZSwgaG9zdCwgaXAsIHRzLCB1YSwgdXJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV9sZW4sIGJ5dGVzLCBydCwgbWV0aG9kLCBzdGF0dXMpCiAgICBpZiBwcmVtYXR1cmUgdGhlbiByZXR1cm4gZW5kCgogICAgbG9jYWwgc2ggPSBuZ3guc2hhcmVkLnJlcXVlc3RfZGF0YQogICAgaWYgbm90IHNoIHRoZW4gcmV0dXJuIGVuZAoKICAgIC0tIERvdWJsZS1jaGVjayBzdWJzY3JpYmVyIGlzIHN0aWxsIGFjdGl2ZSAoZ3VhcmQgYWdhaW5zdCByYWNlKQogICAgaWYgbm90IHNoOmdldChTVUJfUFJFRklYIC4uIGhvc3QpIHRoZW4gcmV0dXJuIGVuZAoKICAgIHBjYWxsKGZ1bmN0aW9uKCkKICAgICAgICBsb2NhbCBjb3VudHJ5ID0gbmlsCiAgICAgICAgaWYgZ2VvIGFuZCBnZW8uZ2V0X2NvdW50cnlfY29kZSB0aGVuCiAgICAgICAgICAgIGNvdW50cnkgPSBnZW8uZ2V0X2NvdW50cnlfY29kZShpcCkKICAgICAgICBlbmQKCiAgICAgICAgcGF5bG9hZC5pZCAgICAgICAgICAgPSBzdHJpbmcuZm9ybWF0KCIlLjNmLSVkIiwgdHMsIG1hdGgucmFuZG9tKDEwMDAwLCA5OTk5OSkpCiAgICAgICAgcGF5bG9hZC5ob3N0ICAgICAgICAgPSBob3N0CiAgICAgICAgcGF5bG9hZC5pcCAgICAgICAgICAgPSBpcAogICAgICAgIGlmIGNvdW50cnkgYW5kIHR5cGUoY291bnRyeSkgPT0gInN0cmluZyIgYW5kIGNvdW50cnkgfj0gIiIgdGhlbgogICAgICAgICAgICBwYXlsb2FkLmNvdW50cnkgPSBjb3VudHJ5CiAgICAgICAgZW5kCiAgICAgICAgcGF5bG9hZC50aW1lc3RhbXAgICAgPSB0cwogICAgICAgIHBheWxvYWQuZGF0ZSAgICAgICAgID0gb3MuZGF0ZSgiISVZLSVtLSVkICVIOiVNOiVTIiwgdHMpCiAgICAgICAgcGF5bG9hZC51cmkgICAgICAgICAgPSB1cmkKICAgICAgICBwYXlsb2FkLm1ldGhvZCAgICAgICA9IG1ldGhvZCBvciAiR0VUIgogICAgICAgIHBheWxvYWQuc3RhdHVzICAgICAgID0gdG9udW1iZXIoc3RhdHVzKSBvciAwCiAgICAgICAgcGF5bG9hZC51c2VyQWdlbnQgICAgPSB1YSBvciAiIgogICAgICAgIHBheWxvYWQucmVxdWVzdFNpemUgID0gdG9udW1iZXIocmVxX2xlbikgb3IgMAogICAgICAgIHBheWxvYWQucmVzcG9uc2VTaXplID0gdG9udW1iZXIoYnl0ZXMpIG9yIDAKICAgICAgICBwYXlsb2FkLnJlc3BvbnNlVGltZSA9IHRvbnVtYmVyKHJ0KSBvciAwCgogICAgICAgIGxvY2FsIGJvZHkgPSBjanNvbi5lbmNvZGUocGF5bG9hZCkKCiAgICAgICAgLS0gQ2xlYXIgcGF5bG9hZCB0YWJsZSBmb3IgbmV4dCByZXVzZQogICAgICAgIGZvciBrIGluIHBhaXJzKHBheWxvYWQpIGRvIHBheWxvYWRba10gPSBuaWwgZW5kCgogICAgICAgIGlmIG5vdCBib2R5IHRoZW4gcmV0dXJuIGVuZAoKICAgICAgICBsb2NhbCBxa2V5ID0gUVVFVUVfUFJFRklYIC4uIGhvc3QKICAgICAgICBzaDpscHVzaChxa2V5LCBib2R5KQogICAgICAgIGlmIHNoOmxsZW4ocWtleSkgPiBRVUVVRV9NQVhfTEVOIHRoZW4KICAgICAgICAgICAgc2g6cnBvcChxa2V5KQogICAgICAgIGVuZAogICAgZW5kKQplbmQKCnJldHVybiB7CiAgICBwaXBlX3JlcXVlc3RfbG9nID0gcGlwZV9yZXF1ZXN0X2xvZywKfQo=",
20
- "pipe_stream.lua": "LS0gcGlwZV9zdHJlYW0ubHVhCi0tIGNvbnRlbnRfYnlfbHVhOiBTU0UgZW5kcG9pbnQgZm9yIHJlYWwtdGltZSByZXF1ZXN0IGxvZyBzdHJlYW1pbmcuCi0tIEdFVCAvbG9ncy9zdHJlYW0/ZG9tYWluPWV4YW1wbGUuY29tCi0tIEludGVybmFsIG9ubHkgLSAxMjcuMC4wLjE6OTE0NQoKbG9jYWwgc2ggPSBuZ3guc2hhcmVkLnJlcXVlc3RfZGF0YQppZiBub3Qgc2ggdGhlbgogICAgbmd4LnN0YXR1cyA9IDUwMwogICAgbmd4LnNheSgic2hhcmVkIGRpY3QgdW5hdmFpbGFibGUiKQogICAgcmV0dXJuIG5neC5leGl0KDUwMykKZW5kCgpsb2NhbCBkb21haW4gPSBuZ3gudmFyLmFyZ19kb21haW4KaWYgbm90IGRvbWFpbiBvciBkb21haW4gPT0gIiIgdGhlbgogICAgbmd4LnN0YXR1cyA9IDQwMAogICAgbmd4LnNheSgibWlzc2luZyA/ZG9tYWluPSBwYXJhbWV0ZXIiKQogICAgcmV0dXJuIG5neC5leGl0KDQwMCkKZW5kCgpkb21haW4gPSBkb21haW46bG93ZXIoKQppZiBkb21haW46c3ViKDEsIDQpID09ICJ3d3cuIiB0aGVuIGRvbWFpbiA9IGRvbWFpbjpzdWIoNSkgZW5kCgpsb2NhbCBTVUJfS0VZICAgPSAibG9nX3BpcGU6c3ViOiIgLi4gZG9tYWluCmxvY2FsIFFVRVVFX0tFWSA9ICJsb2dfcGlwZTpxOiIgICAuLiBkb21haW4KCi0tIENsZWFyIHN0YWxlIHF1ZXVlIGVudHJpZXMsIG1hcmsgc3Vic2NyaWJlciBhY3RpdmUKc2g6ZGVsZXRlKFFVRVVFX0tFWSkKc2g6c2V0KFNVQl9LRVksIHRydWUsIDMwKQoKbmd4LmhlYWRlclsiQ29udGVudC1UeXBlIl0gICAgICA9ICJ0ZXh0L2V2ZW50LXN0cmVhbSIKbmd4LmhlYWRlclsiQ2FjaGUtQ29udHJvbCJdICAgICA9ICJuby1jYWNoZSwgbm8tc3RvcmUiCm5neC5oZWFkZXJbIkNvbm5lY3Rpb24iXSAgICAgICAgPSAia2VlcC1hbGl2ZSIKbmd4LmhlYWRlclsiWC1BY2NlbC1CdWZmZXJpbmciXSA9ICJubyIKCi0tIFNlbmQgaW5pdGlhbCBTU0UgY29tbWVudCBzbyB0aGUgZmlyc3QgZmx1c2ggaGFzIGRhdGEuCi0tIFdpdGhvdXQgdGhpcywgbmd4LmZsdXNoIG9uIGFuIGVtcHR5IGJ1ZmZlciBzZW5kcyBjaHVua2VkLUVPRiAoMFxyXG5cclxuKQotLSBhbmQgdGVybWluYXRlcyB0aGUgcmVzcG9uc2UgaW1tZWRpYXRlbHkuCm5neC5wcmludCgiOiBjb25uZWN0ZWRcblxuIikKaWYgbm90IG5neC5mbHVzaCh0cnVlKSB0aGVuCiAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgIHJldHVybgplbmQKCmxvY2FsIHN0YXJ0ZWQgID0gbmd4Lm5vdygpCmxvY2FsIGxhc3RfaGIgID0gc3RhcnRlZApsb2NhbCBsYXN0X3JlZiA9IHN0YXJ0ZWQKCndoaWxlIHRydWUgZG8KICAgIC0tIE1heCAxIGhvdXIgcGVyIGNvbm5lY3Rpb24KICAgIGlmIG5neC5ub3coKSAtIHN0YXJ0ZWQgPiAzNjAwIHRoZW4KICAgICAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgICAgICByZXR1cm4KICAgIGVuZAoKICAgIC0tIERyYWluIHVwIHRvIDEwMCBxdWV1ZWQgZW50cmllcyBwZXIgY3ljbGUKICAgIGxvY2FsIHNlbnQgPSAwCiAgICB3aGlsZSBzZW50IDwgMTAwIGRvCiAgICAgICAgbG9jYWwgZW50cnkgPSBzaDpycG9wKFFVRVVFX0tFWSkKICAgICAgICBpZiBub3QgZW50cnkgdGhlbiBicmVhayBlbmQKICAgICAgICBuZ3gucHJpbnQoImV2ZW50OiByZXF1ZXN0XG5kYXRhOiAiLCBlbnRyeSwgIlxuXG4iKQogICAgICAgIHNlbnQgPSBzZW50ICsgMQogICAgZW5kCgogICAgaWYgc2VudCA+IDAgdGhlbgogICAgICAgIGlmIG5vdCBuZ3guZmx1c2godHJ1ZSkgdGhlbgogICAgICAgICAgICBzaDpkZWxldGUoU1VCX0tFWSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZW5kCiAgICBlbmQKCiAgICBsb2NhbCBub3cgPSBuZ3gubm93KCkKCiAgICAtLSBIZWFydGJlYXQgZXZlcnkgMTVzCiAgICBpZiBub3cgLSBsYXN0X2hiID4gMTUgdGhlbgogICAgICAgIG5neC5wcmludCgiOiBwaW5nXG5cbiIpCiAgICAgICAgaWYgbm90IG5neC5mbHVzaCh0cnVlKSB0aGVuCiAgICAgICAgICAgIHNoOmRlbGV0ZShTVUJfS0VZKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBlbmQKICAgICAgICBsYXN0X2hiID0gbm93CiAgICBlbmQKCiAgICAtLSBSZWZyZXNoIHN1YnNjcmliZXIgVFRMIGV2ZXJ5IDEwcwogICAgaWYgbm93IC0gbGFzdF9yZWYgPiAxMCB0aGVuCiAgICAgICAgc2g6c2V0KFNVQl9LRVksIHRydWUsIDMwKQogICAgICAgIGxhc3RfcmVmID0gbm93CiAgICBlbmQKCiAgICBuZ3guc2xlZXAoMC4wNSkKZW5kCg==",
21
- "rules_guard.lua": "LS0gcnVsZXNfZ3VhcmQubHVhCi0tIGFjY2Vzc19ieV9sdWEgZHJpdmVyOiBlbmZvcmNlIHBlci1yb3V0ZSBydWxlcyAobWV0aG9kIMK3IElQL0NJRFIgYWxsb3ctZGVueSDCtwotLSBjb3VudHJ5IGFsbG93L2JhbiDCtyBiYWQgdXNlci1hZ2VudCDCtyBob3RsaW5rIMK3IHJhdGUtbGltaXQpIGZvciB0aGUgcmVxdWVzdCdzCi0tIGhvc3QuIFJ1bGVzIGFyZSBwdXNoZWQgcmVsb2FkLWZyZWUgYnkgbWdtdF9hcGkgYFBPU1QgL3J1bGVzYDsgdGhlIERCCi0tIGByb3V0ZV9ydWxlYCB0YWJsZSBpcyB0aGUgc291cmNlIG9mIHRydXRoLiBBbGwgcGFyc2luZy9jb21waWxpbmcvbWF0Y2hpbmcKLS0gbGl2ZXMgaW4gb3BlbnNoaXAucnVsZXNfbGliIChsb2FkZWQgT05DRSBwZXIgd29ya2VyKSDigJQgdGhpcyBmaWxlIGlzIHJlLXJ1bgotLSBldmVyeSByZXF1ZXN0IHNvIGl0IHN0YXlzIG1pbmltYWwuIFNlZSBydWxlc19saWIubHVhIGZvciB0aGUgY29tcGlsZWQgc2hhcGUuCi0tCi0tIEVuZm9yY2VtZW50IHVzZXMgdGhlIGNvbm5lY3RpbmcgcGVlciAobmd4LnZhci5yZW1vdGVfYWRkcik7IGZyb250IGEgcmVhbF9pcAotLSBjb25maWcgaWYgYmVoaW5kIGEgdHJ1c3RlZCBwcm94eS4gTm8gdXNlci1zdXBwbGllZCB2YWx1ZSBpcyBldmVyIHVzZWQgYXMgYQotLSBMdWEgcGF0dGVybiBvciB3cml0dGVuIGludG8gYSByZXNwb25zZSBoZWFkZXIuCgpsb2NhbCBydWxlcyA9IG5neC5zaGFyZWQucnVsZXMKaWYgbm90IHJ1bGVzIHRoZW4gcmV0dXJuIGVuZAoKLS0gUmF0ZS1saW1pdCBjb3VudGVycyBsaXZlIGluIHRoZWlyIE9XTiBkaWN0IHNvIGEgaGlnaC1jYXJkaW5hbGl0eSBmbG9vZCAoYSBuZXcKLS0gcmw6IGtleSBwZXIgc291cmNlIElQIHBlciBzZWNvbmQpIGNhbid0IExSVS1ldmljdCB0aGUgcnVsZXNldHMgYW5kIHNpbGVudGx5Ci0tIGRpc2FibGUgZW5mb3JjZW1lbnQuIEZhbGwgYmFjayB0byBgcnVsZXNgIG9uIGEgYm94IHdob3NlIGNvbmZpZyBwcmVkYXRlcyB0aGUKLS0gc2VwYXJhdGUgZGljdCAoc3RpbGwgd29ya3MsIGp1c3Qgc2hhcmVzIHRoZSB6b25lIHVudGlsIHRoZSBuZXh0IHJlbG9hZCkuCmxvY2FsIGNvdW50ZXJzID0gbmd4LnNoYXJlZC5ybF9jb3VudGVycyBvciBydWxlcwoKbG9jYWwgaG9zdCA9IG5neC52YXIuaG9zdAppZiBub3QgaG9zdCB0aGVuIHJldHVybiBlbmQKCmxvY2FsIHJhdyA9IHJ1bGVzOmdldChob3N0KQppZiBub3QgcmF3IHRoZW4gcmV0dXJuIGVuZCAgICAgICAgICAtLSBmYXN0IHBhdGg6IG5vdGhpbmcgY29uZmlndXJlZCBmb3IgdGhpcyBob3N0Cgpsb2NhbCBsaWIgPSByZXF1aXJlICJvcGVuc2hpcC5ydWxlc19saWIiCmxvY2FsIGVudHJpZXMgPSBsaWIuZ2V0KGhvc3QsIHJhdykKbG9jYWwgbiA9ICNlbnRyaWVzCmlmIG4gPT0gMCB0aGVuIHJldHVybiBlbmQKCi0tIOKUgOKUgCBMb25nZXN0IG1hdGNoaW5nIHBhdGhQcmVmaXggd2lucyDilIDilIAKbG9jYWwgdXJpID0gbmd4LnZhci51cmkgb3IgIi8iCmxvY2FsIGNob3NlbiwgY2hvc2VuX2xlbiA9IG5pbCwgLTEKZm9yIGkgPSAxLCBuIGRvCiAgICBsb2NhbCBlID0gZW50cmllc1tpXQogICAgbG9jYWwgcCA9IGUucGF0aFByZWZpeAogICAgaWYgcCA9PSBuaWwgb3IgcCA9PSAiIiBvciBwID09ICIvIiB0aGVuCiAgICAgICAgaWYgY2hvc2VuX2xlbiA8IDAgdGhlbiBjaG9zZW4sIGNob3Nlbl9sZW4gPSBlLCAwIGVuZAogICAgZWxzZWlmIHVyaSA9PSBwIG9yIHN0cmluZy5zdWIodXJpLCAxLCAjcCkgPT0gcCB0aGVuCiAgICAgICAgaWYgI3AgPiBjaG9zZW5fbGVuIHRoZW4gY2hvc2VuLCBjaG9zZW5fbGVuID0gZSwgI3AgZW5kCiAgICBlbmQKZW5kCmlmIG5vdCBjaG9zZW4gdGhlbiByZXR1cm4gZW5kCgpsb2NhbCBzcGVjID0gY2hvc2VuLnNwZWMKbG9jYWwgZGVueV9zdGF0dXMgPSBzcGVjLmJsb2NrU3RhdHVzIG9yIDQwMwoKbG9jYWwgaXBzID0gbmd4LnZhci5yZW1vdGVfYWRkciBvciAiMC4wLjAuMCIKbG9jYWwgaXBpID0gbGliLmlwdjRfdG9faW50KGlwcykKCi0tIENvdW50cnkgcmVzb2x2ZWQgYXQgbW9zdCBvbmNlIHBlciByZXF1ZXN0IChvbmx5IHdoZW4gYSBjb3VudHJ5IHJ1bGUgZXhpc3RzKS4KbG9jYWwgY291bnRyeV9jYWNoZQpsb2NhbCBmdW5jdGlvbiBjb3VudHJ5X29mKCkKICAgIGlmIGNvdW50cnlfY2FjaGUgPT0gbmlsIHRoZW4KICAgICAgICBsb2NhbCBvaywgZ2VvID0gcGNhbGwocmVxdWlyZSwgIm9wZW5zaGlwLmdlb19jb3VudHJ5IikKICAgICAgICBjb3VudHJ5X2NhY2hlID0gKG9rIGFuZCBnZW8gYW5kIGdlby5nZXRfY291bnRyeV9jb2RlKGlwcykpIG9yIGZhbHNlCiAgICBlbmQKICAgIHJldHVybiBjb3VudHJ5X2NhY2hlIG9yIG5pbAplbmQKCi0tIOKUgOKUgCAxLiBBY2Nlc3M6IG1ldGhvZCBhbGxvdy1saXN0LCBJUCBhbGxvdy9kZW55LCBjb3VudHJ5IGFsbG93LWxpc3Qg4pSA4pSACmxvY2FsIGFjY2VzcyA9IHNwZWMuYWNjZXNzCmlmIGFjY2VzcyB0aGVuCiAgICBpZiBhY2Nlc3MubWV0aG9kcyBhbmQgbm90IGFjY2Vzcy5tZXRob2RzW25neC5yZXEuZ2V0X21ldGhvZCgpXSB0aGVuCiAgICAgICAgcmV0dXJuIG5neC5leGl0KGRlbnlfc3RhdHVzKQogICAgZW5kCiAgICBpZiBsaWIubWF0Y2hfY29tcGlsZWQoYWNjZXNzLmRlbnksIGlwaSwgaXBzKSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICBpZiBhY2Nlc3MuYWxsb3cgYW5kIG5vdCBsaWIubWF0Y2hfY29tcGlsZWQoYWNjZXNzLmFsbG93LCBpcGksIGlwcykgdGhlbgogICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgIGVuZAogICAgLS0gQWxsb3ctbGlzdDogYW4gdW5yZXNvbHZlZCBjb3VudHJ5IGlzIG5vdCBvbiB0aGUgbGlzdCDihpIgYmxvY2tlZCAoZGVmYXVsdC1kZW55KS4KICAgIGlmIGFjY2Vzcy5hbGxvd0NvdW50cmllcyBhbmQgbm90IGFjY2Vzcy5hbGxvd0NvdW50cmllc1tjb3VudHJ5X29mKCkgb3IgIiJdIHRoZW4KICAgICAgICByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpCiAgICBlbmQKZW5kCgotLSDilIDilIAgMi4gQmFuOiBJUC9DSURSLCBjb3VudHJ5LCB1c2VyLWFnZW50IOKUgOKUgApsb2NhbCBiYW4gPSBzcGVjLmJhbgppZiBiYW4gdGhlbgogICAgaWYgbGliLm1hdGNoX2NvbXBpbGVkKGJhbi5pcHMsIGlwaSwgaXBzKSBvciBsaWIubWF0Y2hfY29tcGlsZWQoYmFuLmNpZHJzLCBpcGksIGlwcykgdGhlbgogICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgIGVuZAogICAgaWYgYmFuLmNvdW50cmllcyB0aGVuCiAgICAgICAgbG9jYWwgY2MgPSBjb3VudHJ5X29mKCkKICAgICAgICAtLSBGYWlsIENMT1NFRCAobWF0Y2hlcyB0aGUgYWxsb3ctbGlzdCBhYm92ZSk6IGlmIGdlbyBpcyB1bmF2YWlsYWJsZSB3ZQogICAgICAgIC0tIGNhbm5vdCBwcm92ZSB0aGUgY2xpZW50IGlzIE5PVCBmcm9tIGEgYmFubmVkIGNvdW50cnksIHNvIGJsb2NrIHJhdGhlcgogICAgICAgIC0tIHRoYW4gc2lsZW50bHkgbGV0dGluZyBiYW5uZWQgdHJhZmZpYyB0aHJvdWdoLiBBIGJsb2NrZWQgaG9zdCBpcyBhIGxvdWQKICAgICAgICAtLSBzaWduYWwgdG8gZml4IGdlbzsgZmFpbC1vcGVuIHdvdWxkIGJlIGEgc2lsZW50IHNlY3VyaXR5IGhvbGUuCiAgICAgICAgaWYgbm90IGNjIHRoZW4KICAgICAgICAgICAgbmd4LmxvZyhuZ3guV0FSTiwgInJ1bGVzX2d1YXJkOiBjb3VudHJ5IGJhbiBhY3RpdmUgYnV0IGdlbyB1bmF2YWlsYWJsZSDigJQgYmxvY2tpbmcgKGZhaWwtY2xvc2VkKSIpCiAgICAgICAgICAgIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykKICAgICAgICBlbmQKICAgICAgICBpZiBiYW4uY291bnRyaWVzW2NjXSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICBlbmQKICAgIGlmIGJhbi5lbXB0eVVBIG9yIGJhbi51YXMgdGhlbgogICAgICAgIGxvY2FsIHVhID0gbmd4LnZhci5odHRwX3VzZXJfYWdlbnQKICAgICAgICBpZiBiYW4uZW1wdHlVQSBhbmQgKHVhID09IG5pbCBvciB1YSA9PSAiIikgdGhlbiByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpIGVuZAogICAgICAgIGlmIGJhbi51YXMgYW5kIHVhIGFuZCB1YSB+PSAiIiB0aGVuCiAgICAgICAgICAgIGxvY2FsIHVhbCA9IHN0cmluZy5sb3dlcih1YSkKICAgICAgICAgICAgZm9yIGkgPSAxLCAjYmFuLnVhcyBkbwogICAgICAgICAgICAgICAgaWYgc3RyaW5nLmZpbmQodWFsLCBiYW4udWFzW2ldLCAxLCB0cnVlKSB0aGVuIHJldHVybiBuZ3guZXhpdChkZW55X3N0YXR1cykgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZW5kCmVuZAoKLS0g4pSA4pSAIDMuIEhvdGxpbms6IG9ubHkgbGlzdGVkIHJlZmVyZXIgaG9zdHMgKGVtcHR5IHJlZmVyZXIgcGVyIGFsbG93RW1wdHkpIOKUgOKUgApsb2NhbCBob3QgPSBzcGVjLmhvdGxpbmsKaWYgaG90IHRoZW4KICAgIGxvY2FsIHJlZiA9IG5neC52YXIuaHR0cF9yZWZlcmVyCiAgICBpZiByZWYgPT0gbmlsIG9yIHJlZiA9PSAiIiB0aGVuCiAgICAgICAgaWYgbm90IGhvdC5hbGxvd0VtcHR5IHRoZW4gcmV0dXJuIG5neC5leGl0KGRlbnlfc3RhdHVzKSBlbmQKICAgIGVsc2UKICAgICAgICBsb2NhbCByaG9zdCA9IHN0cmluZy5tYXRjaChyZWYsICJeJXcrOi8vKFteL10rKSIpICAgICAgICAgIC0tIGF1dGhvcml0eQogICAgICAgIGlmIHJob3N0IHRoZW4gcmhvc3QgPSBzdHJpbmcubG93ZXIoc3RyaW5nLm1hdGNoKHJob3N0LCAiXihbXjpdKykiKSBvciByaG9zdCkgZW5kIC0tIHN0cmlwIDpwb3J0CiAgICAgICAgaWYgbm90IChyaG9zdCBhbmQgaG90LnJlZmVyZXJzW3Job3N0XSkgdGhlbiByZXR1cm4gbmd4LmV4aXQoZGVueV9zdGF0dXMpIGVuZAogICAgZW5kCmVuZAoKLS0g4pSA4pSAIDQuIFJhdGUgbGltaXQg4oCUIGZpeGVkIDFzIHdpbmRvdyBwZXIgKGhvc3QsIHBhdGgsIGlwKSDilIDilIAKbG9jYWwgcmwgPSBzcGVjLnJsCmlmIHJsIHRoZW4KICAgIGxvY2FsIGtleSA9ICJybDoiIC4uIGhvc3QgLi4gIjoiIC4uIChjaG9zZW4ucGF0aFByZWZpeCBvciAiLyIpIC4uICI6IiAuLiBpcHMKICAgICAgICAuLiAiOiIgLi4gbWF0aC5mbG9vcihuZ3gubm93KCkpCiAgICBsb2NhbCBjID0gY291bnRlcnM6aW5jcihrZXksIDEsIDAsIDIpICAtLSBpbml0IDAsIDJzIFRUTCDihpIgc2VsZi1leHBpcmluZyBidWNrZXRzCiAgICBpZiBjIGFuZCBjID4gcmwubGltaXQgdGhlbgogICAgICAgIG5neC5oZWFkZXJbIlJldHJ5LUFmdGVyIl0gPSAiMSIKICAgICAgICByZXR1cm4gbmd4LmV4aXQocmwuc3RhdHVzKQogICAgZW5kCmVuZAo=",
22
- "rules_lib.lua": "LS0gcnVsZXNfbGliLmx1YQotLSBQZXItd29ya2VyIGhlbHBlcnMgKyBwYXJzZWQtcnVsZSBjYWNoZSBmb3IgcnVsZXNfZ3VhcmQubHVhIChhY2Nlc3MgcGhhc2UpLgotLSBMb2FkZWQgT05DRSBwZXIgd29ya2VyIHZpYSByZXF1aXJlKCJvcGVuc2hpcC5ydWxlc19saWIiKS4gVGhlIGFjY2VzcyBmaWxlIGlzCi0tIHJlLWV4ZWN1dGVkIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvIGFsbCBwYXJzaW5nL2NvbXBpbGluZy9tYXRjaGluZyBsaXZlcyBoZXJlIHRvCi0tIGF2b2lkIHJlLWNyZWF0aW5nIGNsb3N1cmVzIGFuZCByZS1kZWNvZGluZyBKU09OIG9uIHRoZSBob3QgcGF0aC4KLS0KLS0gU2hhcmVkLWRpY3QgdmFsdWUgYHJ1bGVzW2hvc3RdYCA9IEpTT04gYXJyYXkgb2YgeyBwYXRoUHJlZml4LCBzcGVjIH0gd2hlcmUKLS0gc3BlYyBtYXRjaGVzIEByZXBvL2NvcmUgUm91dGVSdWxlU3BlYy4gcGFyc2UoKSBkZWNvZGVzICsgcHJlY29tcGlsZXMgQ0lEUnMgdG8KLS0gaW50ZWdlcnMsIGxvd2VyY2FzZXMgVUEvcmVmZXJlciBuZWVkbGVzLCBhbmQgYnVpbGRzIE8oMSkgc2V0cyBmb3IKLS0gY291bnRyaWVzL21ldGhvZHMgT05DRTsgdGhlIGNvbXBpbGVkIHJlc3VsdCBpcyBMUlUtY2FjaGVkIHBlciBob3N0IGFuZCByZXVzZWQKLS0gdW50aWwgdGhlIHJhdyBzdHJpbmcgY2hhbmdlcyAocnVsZSBlZGl0cyBhcmUgcmFyZSwgcmVxdWVzdHMgYXJlIGhvdCkuCi0tCi0tIFNFQ1VSSVRZOiBub3RoaW5nIGhlcmUgdHVybnMgYSBydWxlIHZhbHVlIGludG8gTHVhIGNvZGUgb3IgYSBMdWEgcGF0dGVybi4KLS0gU3RyaW5ncyBhcmUgY29tcGFyZWQgd2l0aCBgPT1gL3NldC1sb29rdXBzOyB1c2VyLWFnZW50IG1hdGNoaW5nIGlzCi0tIHN0cmluZy5maW5kKGhheSwgbmVlZGxlLCAxLCB0cnVlKSDigJQgUExBSU4sIG5ldmVyIGEgcmVnZXguCgpsb2NhbCBjanNvbiA9IHJlcXVpcmUgImNqc29uLnNhZmUiCmxvY2FsIGxydWNhY2hlID0gcmVxdWlyZSAicmVzdHkubHJ1Y2FjaGUiCgpsb2NhbCBNID0ge30KCmxvY2FsIGNhY2hlID0gbHJ1Y2FjaGUubmV3KDEwMjQpIC0tIGNvbXBpbGVkIHJ1bGVzLCBwZXIgd29ya2VyLCB+MTAyNCBob3N0cwoKLS0g4pSA4pSAIElQdjQgaGVscGVycyDilIDilIAKbG9jYWwgZnVuY3Rpb24gaXB2NF90b19pbnQocykKICAgIGxvY2FsIGEsIGIsIGMsIGQgPSBzdHJpbmcubWF0Y2gocywgIl4oJWQrKSUuKCVkKyklLiglZCspJS4oJWQrKSQiKQogICAgaWYgbm90IGEgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgYSwgYiwgYywgZCA9IHRvbnVtYmVyKGEpLCB0b251bWJlcihiKSwgdG9udW1iZXIoYyksIHRvbnVtYmVyKGQpCiAgICBpZiBhID4gMjU1IG9yIGIgPiAyNTUgb3IgYyA+IDI1NSBvciBkID4gMjU1IHRoZW4gcmV0dXJuIG5pbCBlbmQKICAgIHJldHVybiBhICogMTY3NzcyMTYgKyBiICogNjU1MzYgKyBjICogMjU2ICsgZAplbmQKTS5pcHY0X3RvX2ludCA9IGlwdjRfdG9faW50CgotLSBQcmVjb21waWxlIGEgQ0lEUiAvIGJhcmUtSVAgc3RyaW5nIGludG8gYSBjaGVhcCBtYXRjaCBkZXNjcmlwdG9yLgpsb2NhbCBmdW5jdGlvbiBjb21waWxlX2NpZHIocykKICAgIGxvY2FsIGJhc2UsIGJpdHMgPSBzdHJpbmcubWF0Y2gocywgIl4oW14vXSspLyglZCspJCIpCiAgICBpZiBiYXNlIHRoZW4KICAgICAgICBiaXRzID0gdG9udW1iZXIoYml0cykKICAgICAgICBsb2NhbCBiYXNlaSA9IGlwdjRfdG9faW50KGJhc2UpCiAgICAgICAgaWYgbm90IGJhc2VpIG9yIGJpdHMgPCAwIG9yIGJpdHMgPiAzMiB0aGVuIHJldHVybiB7IGV4YWN0ID0gcyB9IGVuZAogICAgICAgIGlmIGJpdHMgPT0gMCB0aGVuIHJldHVybiB7IGFsbCA9IHRydWUgfSBlbmQKICAgICAgICBsb2NhbCBkaXYgPSAyIF4gKDMyIC0gYml0cykgLS0gY29tcGFyZSB0aGUgdG9wIGBiaXRzYCBiaXRzCiAgICAgICAgcmV0dXJuIHsgbmV0ID0gbWF0aC5mbG9vcihiYXNlaSAvIGRpdiksIGRpdiA9IGRpdiB9CiAgICBlbmQKICAgIGxvY2FsIGkgPSBpcHY0X3RvX2ludChzKQogICAgaWYgaSB0aGVuIHJldHVybiB7IGlwID0gaSB9IGVuZAogICAgcmV0dXJuIHsgZXhhY3QgPSBzIH0gLS0gSVB2NiAvIHVucGFyc2VhYmxlIOKGkiBsaXRlcmFsIHN0cmluZyBjb21wYXJlCmVuZAoKbG9jYWwgZnVuY3Rpb24gY29tcGlsZV9saXN0KGxpc3QpCiAgICBpZiB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgbG9jYWwgb3V0LCBuID0ge30sIDAKICAgIGZvciBfLCBzIGluIGlwYWlycyhsaXN0KSBkbwogICAgICAgIGlmIHR5cGUocykgPT0gInN0cmluZyIgYW5kIHMgfj0gIiIgdGhlbgogICAgICAgICAgICBuID0gbiArIDEKICAgICAgICAgICAgb3V0W25dID0gY29tcGlsZV9jaWRyKHMpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBuID4gMCBhbmQgb3V0IG9yIG5pbAplbmQKCi0tIE1hdGNoIGEgY2xpZW50IChpbnQgZm9ybSBgaXBpYCwgbWF5IGJlIG5pbCBmb3Igbm9uLUlQdjQ7IHJhdyBgaXBzYCkgYWdhaW5zdCBhCi0tIGNvbXBpbGVkIENJRFIvSVAgbGlzdC4KbG9jYWwgZnVuY3Rpb24gbWF0Y2hfY29tcGlsZWQoY29tcGlsZWQsIGlwaSwgaXBzKQogICAgaWYgbm90IGNvbXBpbGVkIHRoZW4gcmV0dXJuIGZhbHNlIGVuZAogICAgZm9yIGkgPSAxLCAjY29tcGlsZWQgZG8KICAgICAgICBsb2NhbCBjID0gY29tcGlsZWRbaV0KICAgICAgICBpZiBjLmFsbCB0aGVuCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgZWxzZWlmIGMuaXAgdGhlbgogICAgICAgICAgICBpZiBpcGkgYW5kIGlwaSA9PSBjLmlwIHRoZW4gcmV0dXJuIHRydWUgZW5kCiAgICAgICAgZWxzZWlmIGMubmV0IHRoZW4KICAgICAgICAgICAgaWYgaXBpIGFuZCBtYXRoLmZsb29yKGlwaSAvIGMuZGl2KSA9PSBjLm5ldCB0aGVuIHJldHVybiB0cnVlIGVuZAogICAgICAgIGVsc2VpZiBjLmV4YWN0ID09IGlwcyB0aGVuCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBmYWxzZQplbmQKTS5tYXRjaF9jb21waWxlZCA9IG1hdGNoX2NvbXBpbGVkCgpsb2NhbCBmdW5jdGlvbiBsb3dlcl9saXN0KGxpc3QpCiAgICBpZiB0eXBlKGxpc3QpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4gbmlsIGVuZAogICAgbG9jYWwgb3V0LCBuID0ge30sIDAKICAgIGZvciBfLCBzIGluIGlwYWlycyhsaXN0KSBkbwogICAgICAgIGlmIHR5cGUocykgPT0gInN0cmluZyIgYW5kIHMgfj0gIiIgdGhlbgogICAgICAgICAgICBuID0gbiArIDEKICAgICAgICAgICAgb3V0W25dID0gc3RyaW5nLmxvd2VyKHMpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBuID4gMCBhbmQgb3V0IG9yIG5pbAplbmQKCi0tIEJ1aWxkIGFuIE8oMSkgbG9va3VwIHNldCBmcm9tIGEgc3RyaW5nIGxpc3QgKG9wdGlvbmFsbHkgbG93ZXJjYXNlZCkuCmxvY2FsIGZ1bmN0aW9uIHRvX3NldChsaXN0LCBsb3dlcikKICAgIGlmIHR5cGUobGlzdCkgfj0gInRhYmxlIiB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCBzZXQsIGFueSA9IHt9LCBmYWxzZQogICAgZm9yIF8sIHMgaW4gaXBhaXJzKGxpc3QpIGRvCiAgICAgICAgaWYgdHlwZShzKSA9PSAic3RyaW5nIiBhbmQgcyB+PSAiIiB0aGVuCiAgICAgICAgICAgIHNldFtsb3dlciBhbmQgc3RyaW5nLmxvd2VyKHMpIG9yIHNdID0gdHJ1ZQogICAgICAgICAgICBhbnkgPSB0cnVlCiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiBhbnkgYW5kIHNldCBvciBuaWwKZW5kCgotLSBDb21waWxlIG9uZSBSb3V0ZVJ1bGVTcGVjIGludG8gYSBmYXN0LW1hdGNoIHNoYXBlLgpsb2NhbCBmdW5jdGlvbiBjb21waWxlX3NwZWMoc3BlYykKICAgIGlmIHR5cGUoc3BlYykgfj0gInRhYmxlIiB0aGVuIHJldHVybiB7IGJsb2NrU3RhdHVzID0gNDAzIH0gZW5kCiAgICBsb2NhbCBvdXQgPSB7fQoKICAgIGxvY2FsIHJsID0gc3BlYy5yYXRlTGltaXQKICAgIGxvY2FsIHJwcyA9IHJsIGFuZCB0b251bWJlcihybC5ycHMpCiAgICBpZiBycHMgYW5kIHJwcyA+IDAgdGhlbgogICAgICAgIG91dC5ybCA9IHsKICAgICAgICAgICAgbGltaXQgPSBtYXRoLmZsb29yKHJwcykgKyBtYXRoLmZsb29yKHRvbnVtYmVyKHJsLmJ1cnN0KSBvciAwKSwKICAgICAgICAgICAgc3RhdHVzID0gdG9udW1iZXIocmwuc3RhdHVzKSBvciA0MjksCiAgICAgICAgfQogICAgZW5kCgogICAgbG9jYWwgYmFuID0gc3BlYy5iYW4KICAgIGlmIHR5cGUoYmFuKSA9PSAidGFibGUiIHRoZW4KICAgICAgICBvdXQuYmFuID0gewogICAgICAgICAgICBpcHMgPSBjb21waWxlX2xpc3QoYmFuLmlwcyksCiAgICAgICAgICAgIGNpZHJzID0gY29tcGlsZV9saXN0KGJhbi5jaWRycyksCiAgICAgICAgICAgIGNvdW50cmllcyA9IHRvX3NldChiYW4uY291bnRyaWVzKSwKICAgICAgICAgICAgdWFzID0gbG93ZXJfbGlzdChiYW4udXNlckFnZW50cyksCiAgICAgICAgICAgIGVtcHR5VUEgPSBiYW4uZW1wdHlVc2VyQWdlbnQgPT0gdHJ1ZSwKICAgICAgICB9CiAgICBlbmQKCiAgICBsb2NhbCBhY2MgPSBzcGVjLmFjY2VzcwogICAgaWYgdHlwZShhY2MpID09ICJ0YWJsZSIgdGhlbgogICAgICAgIG91dC5hY2Nlc3MgPSB7CiAgICAgICAgICAgIGFsbG93ID0gY29tcGlsZV9saXN0KGFjYy5hbGxvd0NpZHJzKSwKICAgICAgICAgICAgZGVueSA9IGNvbXBpbGVfbGlzdChhY2MuZGVueUNpZHJzKSwKICAgICAgICAgICAgYWxsb3dDb3VudHJpZXMgPSB0b19zZXQoYWNjLmFsbG93Q291bnRyaWVzKSwKICAgICAgICAgICAgbWV0aG9kcyA9IHRvX3NldChhY2MubWV0aG9kcyksCiAgICAgICAgfQogICAgZW5kCgogICAgbG9jYWwgaG90ID0gc3BlYy5ob3RsaW5rCiAgICBpZiB0eXBlKGhvdCkgPT0gInRhYmxlIiB0aGVuCiAgICAgICAgbG9jYWwgcmVmcyA9IHRvX3NldChob3QuYWxsb3dSZWZlcmVycywgdHJ1ZSkKICAgICAgICBpZiByZWZzIHRoZW4KICAgICAgICAgICAgb3V0LmhvdGxpbmsgPSB7IHJlZmVyZXJzID0gcmVmcywgYWxsb3dFbXB0eSA9IGhvdC5hbGxvd0VtcHR5IH49IGZhbHNlIH0KICAgICAgICBlbmQKICAgIGVuZAoKICAgIG91dC5ibG9ja1N0YXR1cyA9ICh0eXBlKHNwZWMuYmxvY2spID09ICJ0YWJsZSIgYW5kIHRvbnVtYmVyKHNwZWMuYmxvY2suc3RhdHVzKSkgb3IgNDAzCiAgICByZXR1cm4gb3V0CmVuZAoKbG9jYWwgZnVuY3Rpb24gcGFyc2UocmF3KQogICAgbG9jYWwgZW50cmllcyA9IGNqc29uLmRlY29kZShyYXcpCiAgICBpZiB0eXBlKGVudHJpZXMpIH49ICJ0YWJsZSIgdGhlbiByZXR1cm4ge30gZW5kCiAgICBsb2NhbCBvdXQsIG4gPSB7fSwgMAogICAgZm9yIF8sIGUgaW4gaXBhaXJzKGVudHJpZXMpIGRvCiAgICAgICAgaWYgdHlwZShlKSA9PSAidGFibGUiIHRoZW4KICAgICAgICAgICAgbiA9IG4gKyAxCiAgICAgICAgICAgIG91dFtuXSA9IHsgcGF0aFByZWZpeCA9IGUucGF0aFByZWZpeCwgc3BlYyA9IGNvbXBpbGVfc3BlYyhlLnNwZWMpIH0KICAgICAgICBlbmQKICAgIGVuZAogICAgcmV0dXJuIG91dAplbmQKCi0tIExSVS1jYWNoZWQgcGFyc2U6IHJldXNlIHRoZSBjb21waWxlZCBmb3JtIHVudGlsIHRoZSByYXcgZGljdCBzdHJpbmcgY2hhbmdlcy4KZnVuY3Rpb24gTS5nZXQoaG9zdCwgcmF3KQogICAgbG9jYWwgaGl0ID0gY2FjaGU6Z2V0KGhvc3QpCiAgICBpZiBoaXQgYW5kIGhpdC5yYXcgPT0gcmF3IHRoZW4gcmV0dXJuIGhpdC5wYXJzZWQgZW5kCiAgICBsb2NhbCBwYXJzZWQgPSBwYXJzZShyYXcpCiAgICBjYWNoZTpzZXQoaG9zdCwgeyByYXcgPSByYXcsIHBhcnNlZCA9IHBhcnNlZCB9KQogICAgcmV0dXJuIHBhcnNlZAplbmQKCnJldHVybiBNCg==",
23
- "site_logger.lua": "LS0gc2l0ZV9sb2dnZXIubHVhCi0tIE9wZW5SZXN0eSBsb2dfYnlfbHVhIC0gcnVucyBBRlRFUiB0aGUgcmVzcG9uc2UgaXMgc2VudC4KLS0gUHVyZSBzaGFyZWQtZGljdCBhbmFseXRpY3MuICBObyBSZWRpcywgbm8gdGltZXJzIGZvciBjb3VudGVycywgbm8gYmF0Y2hpbmcuCi0tIEV2ZXJ5IGluY3IoKSBpcyBhdG9taWMgYWNyb3NzIHdvcmtlcnMuCi0tCi0tIFNoYXJlZCBkaWN0IGtleSBzY2hlbWEgKGFuYWx5dGljcyB6b25lKToKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnIgICAgICAgIHJlcXVlc3QgY291bnQgICAgICAgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OmkgICAgICAgIGJhbmR3aWR0aCBpbiAgYnl0ZXMgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59Om8gICAgICAgIGJhbmR3aWR0aCBvdXQgYnl0ZXMgICAgICAgICAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnQgICAgICAgIHJlc3BvbnNlIHRpbWUgc3VtIChzZWNvbmRzKSAoVFRMIDI0aCkKLS0gICBzOntkb21haW59OntlcG9jaF9taW59OnUgICAgICAgIHVuaXF1ZSAobm9uLXN0YXRpYykgcmVxcyAgICAoVFRMIDI0aCkKLS0gICBnOntkb21haW59OntZWVlZTU1ERH06e0NDfSAgICAgIGNvdW50cnkgaGl0IGNvdW50ICAgICAgICAgICAoVFRMIDQ4aCkKLS0gICBjOntkb21haW59OntlcG9jaF9taW59OntDQ30gICAgIGNvdW50cnkgcGVyIG1pbnV0ZSAgICAgICAgICAoVFRMIDI0aCkKLS0gICB0Ontkb21haW59OnIgLyA6aSAvIDpvICAgICAgICAgIGxpZmV0aW1lIHRvdGFscyAgICAgICAgICAgICAobm8gVFRMKQotLSAgIGQ6e2RvbWFpbn0gICAgICAgICAgICAgICAgICAgICAgZG9tYWluIGluZGV4IG1hcmtlciAgICAgICAgIChubyBUVEwpCi0tCi0tIFNoYXJlZCBkaWN0IGtleSBzY2hlbWEgKHJlcXVlc3RfZGF0YSB6b25lKToKLS0gICBybG9nOntkb21haW59OnNlcSAgICAgICAgICAgICAgIG1vbm90b25pYyB3cml0ZSBwb2ludGVyCi0tICAgcmxvZzp7ZG9tYWlufTp7c2xvdH0gICAgICAgICAgICBKU09OIGVudHJ5IChyaW5nIGJ1ZikgICAgICAgKFRUTCAxaCkKLS0gICBsb2dfcGlwZTpzdWI6e2RvbWFpbn0gICAgICAgICAgIGxpdmUgc3Vic2NyaWJlciBmbGFnICAgICAgICAoVFRMIDMwcykKLS0gICBsb2dfcGlwZTpxOntkb21haW59ICAgICAgICAgICAgIGxpdmUgbG9nIHF1ZXVlIGVudHJpZXMKCmxvY2FsIGNqc29uID0gcmVxdWlyZSAiY2pzb24uc2FmZSIKCi0tIFNBRkUgTE9BRDogR2VvSVAgTW9kdWxlIChwZXItd29ya2VyLCBjYWNoZWQgYnkgcmVxdWlyZSkKbG9jYWwgZ2VvX29rLCBnZW8gPSBwY2FsbChyZXF1aXJlLCAib3BlbnNoaXAuZ2VvX2NvdW50cnkiKQppZiBub3QgZ2VvX29rIHRoZW4KICAgIGdlbyA9IG5pbAogICAgbmd4LmxvZyhuZ3guV0FSTiwgIltzaXRlX2xvZ2dlcl0gZ2VvX2NvdW50cnkgbW9kdWxlIG5vdCBhdmFpbGFibGUuIEdlb0lQIGRpc2FibGVkLiIpCmVuZAoKLS0gU0FGRSBMT0FEOiBQaXBlIG1vZHVsZSAocGVyLXdvcmtlciwgY2FjaGVkIGJ5IHJlcXVpcmUpCmxvY2FsIHBpcGVfb2ssIHBpcGVfbG9nID0gcGNhbGwocmVxdWlyZSwgIm9wZW5zaGlwLnBpcGVfbG9nIikKaWYgbm90IHBpcGVfb2sgdGhlbiBwaXBlX2xvZyA9IG5pbCBlbmQKCmxvY2FsIGFuYWx5dGljcyAgICA9IG5neC5zaGFyZWQuYW5hbHl0aWNzCmxvY2FsIHJlcXVlc3RfZGF0YSA9IG5neC5zaGFyZWQucmVxdWVzdF9kYXRhCmlmIG5vdCBhbmFseXRpY3Mgb3Igbm90IHJlcXVlc3RfZGF0YSB0aGVuIHJldHVybiBlbmQKCi0tIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKbG9jYWwgZnVuY3Rpb24gbm9ybWFsaXplKGhvc3QpCiAgICBpZiBub3QgaG9zdCB0aGVuIHJldHVybiBuaWwgZW5kCiAgICBsb2NhbCBoID0gaG9zdDpsb3dlcigpCiAgICBpZiBoOnN1YigxLCA0KSA9PSAid3d3LiIgdGhlbiBoID0gaDpzdWIoNSkgZW5kCiAgICByZXR1cm4gaAplbmQKCmxvY2FsIF9kYXkgPSB7IHN0ciA9ICIiLCB0cyA9IDAgfQpsb2NhbCBmdW5jdGlvbiB0b2RheSgpCiAgICBsb2NhbCBub3cgPSBuZ3gubm93KCkKICAgIGlmIG5vdyAtIF9kYXkudHMgPiA2MCB0aGVuCiAgICAgICAgX2RheS5zdHIgPSBvcy5kYXRlKCIhJVklbSVkIiwgbm93KQogICAgICAgIF9kYXkudHMgPSBub3cKICAgIGVuZAogICAgcmV0dXJuIF9kYXkuc3RyCmVuZAoKLS0gRmFzdCBjaGVjayBpZiBVUkkgaXMgYSBzdGF0aWMgYXNzZXQgKGZvciB1bmlxdWVfcmVxdWVzdHMgY291bnRlcikKbG9jYWwgZnVuY3Rpb24gaXNfc3RhdGljX2Fzc2V0KHUpCiAgICBsb2NhbCBsb3dlciA9IHU6bG93ZXIoKQoKICAgIC0tIFN0YXRpYyBmaWxlIGV4dGVuc2lvbnMKICAgIGlmIGxvd2VyOm1hdGNoKCIlLmpzJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmNzcyQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUuanBnJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmpwZWckIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCIlLnBuZyQiKSBvciBsb3dlcjptYXRjaCgiJS5naWYkIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCIlLnN2ZyQiKSBvciBsb3dlcjptYXRjaCgiJS53ZWJwJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5pY28kIikgb3IgbG93ZXI6bWF0Y2goIiUuYm1wJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS53b2ZmMj8kIikgb3IgbG93ZXI6bWF0Y2goIiUudHRmJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5lb3QkIikgb3IgbG93ZXI6bWF0Y2goIiUub3RmJCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS5tcDQkIikgb3IgbG93ZXI6bWF0Y2goIiUud2VibSQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUubXAzJCIpIG9yIGxvd2VyOm1hdGNoKCIlLndhdiQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUucGRmJCIpIG9yIGxvd2VyOm1hdGNoKCIlLnppcCQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUudGFyJCIpIG9yIGxvd2VyOm1hdGNoKCIlLmd6JCIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiJS54bWwkIikgb3IgbG93ZXI6bWF0Y2goIiUuanNvbiQiKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIiUudHh0JCIpIG9yIGxvd2VyOm1hdGNoKCIlLm1hcCQiKSB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAoKICAgIC0tIENvbW1vbiBzdGF0aWMgcGF0aHMKICAgIGlmIGxvd2VyOm1hdGNoKCJeL19uZXh0L3N0YXRpYy8iKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIl4vc3RhdGljLyIpIG9yCiAgICAgICBsb3dlcjptYXRjaCgiXi9hc3NldHMvIikgb3IKICAgICAgIGxvd2VyOm1hdGNoKCJeL3B1YmxpYy8iKSBvcgogICAgICAgbG93ZXI6bWF0Y2goIi9mYXZpY29uJS5pY28iKSB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUKICAgIGVuZAoKICAgIHJldHVybiBmYWxzZQplbmQKCmxvY2FsIFJJTkcgICA9IDEwMDAKbG9jYWwgRDI0SCAgID0gODY0MDAKbG9jYWwgRDQ4SCAgID0gMTcyODAwCmxvY2FsIEQxSCAgICA9IDM2MDAKCi0tIOKUgOKUgCBDYXB0dXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKbG9jYWwgaG9zdCA9IG5vcm1hbGl6ZShuZ3gudmFyLmhvc3QpCmlmIG5vdCBob3N0IHRoZW4gcmV0dXJuIGVuZAoKbG9jYWwgaXAgICAgICA9IG5neC52YXIucmVtb3RlX2FkZHIgICAgb3IgIjAuMC4wLjAiCmxvY2FsIHRzICAgICAgPSBuZ3gubm93KCkKbG9jYWwgdWEgICAgICA9IG5neC52YXIuaHR0cF91c2VyX2FnZW50IG9yICIiCmxvY2FsIHVyaSAgICAgPSBuZ3gudmFyLnJlcXVlc3RfdXJpICAgIG9yICIvIgpsb2NhbCByZXFfbGVuID0gdG9udW1iZXIobmd4LnZhci5yZXF1ZXN0X2xlbmd0aCkgb3IgMApsb2NhbCBieXRlcyAgID0gdG9udW1iZXIobmd4LnZhci5ieXRlc19zZW50KSAgICAgb3IgMApsb2NhbCBydCAgICAgID0gdG9udW1iZXIobmd4LnZhci5yZXF1ZXN0X3RpbWUpICAgb3IgMCAgLS0gc2Vjb25kcyAoZmxvYXQpCmxvY2FsIG1ldGhvZCAgPSBuZ3gudmFyLnJlcXVlc3RfbWV0aG9kIG9yICJHRVQiCmxvY2FsIHN0YXR1cyAgPSBuZ3gudmFyLnN0YXR1cyAgICAgICAgIG9yICIwIgoKLS0g4pSA4pSAIDEuIE1pbnV0ZS1idWNrZXQgY291bnRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpsb2NhbCBtaW51dGUgPSBtYXRoLmZsb29yKHRzIC8gNjApCmxvY2FsIHAgPSAiczoiIC4uIGhvc3QgLi4gIjoiIC4uIG1pbnV0ZQoKYW5hbHl0aWNzOmluY3IocCAuLiAiOnIiLCAxLCAgICAgIDAsIEQyNEgpCmFuYWx5dGljczppbmNyKHAgLi4gIjppIiwgcmVxX2xlbiwgMCwgRDI0SCkKYW5hbHl0aWNzOmluY3IocCAuLiAiOm8iLCBieXRlcywgICAwLCBEMjRIKQoKLS0gUmVzcG9uc2UgdGltZSBhcyBmbG9hdCBzZWNvbmRzIChtYXRjaGVzIG9yaWdpbmFsIHByZWNpc2lvbikKaWYgcnQgPiAwIHRoZW4KICAgIC0tIHNhZmVfYWRkIGluaXRpYWxpemVzLCBpbmNyIGFkZHMgLSBlbXVsYXRlIEhJTkNSQllGTE9BVCB3aXRoIGludGVnZXIgbWljcm9zCiAgICBsb2NhbCBydF91cyA9IG1hdGguZmxvb3IocnQgKiAxMDAwMDAwKQogICAgYW5hbHl0aWNzOmluY3IocCAuLiAiOnQiLCBydF91cywgMCwgRDI0SCkKZW5kCgotLSBVbmlxdWUgKG5vbi1zdGF0aWMpIHJlcXVlc3QgY291bnRlcgppZiBub3QgaXNfc3RhdGljX2Fzc2V0KHVyaSkgdGhlbgogICAgYW5hbHl0aWNzOmluY3IocCAuLiAiOnUiLCAxLCAwLCBEMjRIKQplbmQKCi0tIOKUgOKUgCAyLiBMaWZldGltZSB0b3RhbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphbmFseXRpY3M6aW5jcigidDoiIC4uIGhvc3QgLi4gIjpyIiwgMSwgICAgICAgMCkKYW5hbHl0aWNzOmluY3IoInQ6IiAuLiBob3N0IC4uICI6aSIsIHJlcV9sZW4sIDApCmFuYWx5dGljczppbmNyKCJ0OiIgLi4gaG9zdCAuLiAiOm8iLCBieXRlcywgICAwKQoKLS0gRG9tYWluIGluZGV4IChzZXQgb25jZSwgaWdub3JlIHN1YnNlcXVlbnQgImV4aXN0cyIgZXJyb3JzKQphbmFseXRpY3M6c2FmZV9hZGQoImQ6IiAuLiBob3N0LCAxKQoKLS0g4pSA4pSAIDMuIEdlb0lQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKaWYgZ2VvIHRoZW4KICAgIGxvY2FsIGNjID0gZ2VvLmdldF9jb3VudHJ5X2NvZGUoaXApCiAgICBpZiBjYyBhbmQgY2Mgfj0gIiIgdGhlbgogICAgICAgIC0tIERhaWx5IGdlbyAoZm9yIC9hbmFseXRpY3MvZ2VvIGVuZHBvaW50KQogICAgICAgIGFuYWx5dGljczppbmNyKCJnOiIgLi4gaG9zdCAuLiAiOiIgLi4gdG9kYXkoKSAuLiAiOiIgLi4gY2MsIDEsIDAsIEQ0OEgpCiAgICAgICAgLS0gUGVyLW1pbnV0ZSBnZW8gKGZvciB0aW1lLXNlcmllcyBjb3VudHJ5IGJyZWFrZG93bikKICAgICAgICBhbmFseXRpY3M6aW5jcigiYzoiIC4uIGhvc3QgLi4gIjoiIC4uIG1pbnV0ZSAuLiAiOiIgLi4gY2MsIDEsIDAsIEQyNEgpCiAgICBlbmQKZW5kCgotLSDilIDilIAgNC4gUmF3IHJlcXVlc3QgcmluZyBidWZmZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpwY2FsbChmdW5jdGlvbigpCiAgICBsb2NhbCBva19qLCBqID0gcGNhbGwoY2pzb24uZW5jb2RlLCB7CiAgICAgICAgaXAgICAgID0gaXAsCiAgICAgICAgdHMgICAgID0gdHMsCiAgICAgICAgbWV0aG9kID0gbWV0aG9kLAogICAgICAgIHN0YXR1cyA9IHN0YXR1cywKICAgICAgICB1cmkgICAgPSB1cmksCiAgICAgICAgdWEgICAgID0gdWEsCiAgICAgICAgYndfaW4gID0gcmVxX2xlbiwKICAgICAgICBid19vdXQgPSBieXRlcywKICAgICAgICBydCAgICAgPSBydCwKICAgIH0pCiAgICBpZiBva19qIGFuZCBqIHRoZW4KICAgICAgICBsb2NhbCBzZXEgID0gcmVxdWVzdF9kYXRhOmluY3IoInJsb2c6IiAuLiBob3N0IC4uICI6c2VxIiwgMSwgMCkKICAgICAgICBsb2NhbCBzbG90ID0gc2VxICUgUklORwogICAgICAgIHJlcXVlc3RfZGF0YTpzZXQoInJsb2c6IiAuLiBob3N0IC4uICI6IiAuLiBzbG90LCBqLCBEMUgpCiAgICBlbmQKZW5kKQoKLS0g4pSA4pSAIDUuIExpdmUtbG9nIHBpcGUgKG9ubHkgd2hlbiBhIHN1YnNjcmliZXIgaXMgd2F0Y2hpbmcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAotLSBGaXJlIHZpYSB0aW1lciB0byBhdm9pZCBibG9ja2luZyB0aGUgbG9nIHBoYXNlCgppZiBwaXBlX2xvZyBhbmQgcGlwZV9sb2cucGlwZV9yZXF1ZXN0X2xvZwogICBhbmQgcmVxdWVzdF9kYXRhOmdldCgibG9nX3BpcGU6c3ViOiIgLi4gaG9zdCkgdGhlbgogICAgbmd4LnRpbWVyLmF0KDAsIHBpcGVfbG9nLnBpcGVfcmVxdWVzdF9sb2csCiAgICAgICAgICAgICAgICAgaG9zdCwgaXAsIHRzLCB1YSwgdXJpLCByZXFfbGVuLCBieXRlcywgcnQsIG1ldGhvZCwgc3RhdHVzKQplbmQK",
24
- "webhook_handler.lua": "LS0gd2ViaG9va19oYW5kbGVyLmx1YQotLSBIYW5kbGVzIGluY29taW5nIHdlYmhvb2sgZXZlbnRzIGZvcndhcmRlZCBmcm9tIHRoZSBTYWFTIGVkZ2UuCi0tIEludGVybmFsIG1hbmFnZW1lbnQgcG9ydCBvbmx5ICgxMjcuMC4wLjE6OTE0NSkuCi0tCi0tIFJvdXRlczoKLS0gICBQT1NUIC9faG9va3MvcHVzaCAgICAgICAgICAtIHJlY2VpdmUgYSBmb3J3YXJkZWQgR2l0SHViIHB1c2ggZXZlbnQKLS0gICBHRVQgIC9faG9va3MvcGVuZGluZyAgICAgICAtIGZldGNoIHN0b3JlZCBldmVudHMgKGZvciBsb2NhbCBhcHAgcG9sbGluZykKLS0gICBQT1NUIC9faG9va3MvYWNrICAgICAgICAgICAtIGFja25vd2xlZGdlIGNvbnN1bWVkIGV2ZW50cwotLQotLSBCZWhhdmlvciBvbiBQT1NUIC9faG9va3MvcHVzaDoKLS0gICAxLiBUcnkgdG8gcHJveHkgdG8gYSBsb2NhbCBPcGVuc2hpcCBBUEkgKGNvbmZpZ3VyYWJsZSB2aWEgWC1PcGVuc2hpcC1VcmwgaGVhZGVyKQotLSAgIDIuIElmIE9wZW5zaGlwIGlzIG5vdCByZWFjaGFibGUsIHN0b3JlIHRoZSBldmVudCBpbiBzaGFyZWQgZGljdCBmb3IgbGF0ZXIgcG9sbGluZwoKbG9jYWwgY2pzb24gPSByZXF1aXJlICJjanNvbi5zYWZlIgoKbG9jYWwgd2ViaG9va19ldmVudHMgPSBuZ3guc2hhcmVkLndlYmhvb2tfZXZlbnRzCmxvY2FsIHVyaSAgICAgICAgICAgID0gbmd4LnZhci51cmkKbG9jYWwgbWV0aG9kICAgICAgICAgPSBuZ3gucmVxLmdldF9tZXRob2QoKQoKbG9jYWwgZnVuY3Rpb24ganNvbl9yZXNwb25zZShkYXRhLCBjb2RlKQogICAgbmd4LnN0YXR1cyA9IGNvZGUgb3IgMjAwCiAgICBuZ3guaGVhZGVyWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgogICAgbmd4LnNheShjanNvbi5lbmNvZGUoZGF0YSkpCiAgICByZXR1cm4gbmd4LmV4aXQobmd4LnN0YXR1cykKZW5kCgotLSDilIDilIAgUE9TVCAvX2hvb2tzL3B1c2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFJlY2VpdmVzIGZvcndhcmRlZCB3ZWJob29rIHBheWxvYWQgZnJvbSBTYWFTLgotLSBIZWFkZXJzOgotLSAgIFgtT3BlbnNoaXAtVXJsOiBodHRwOi8vMTI3LjAuMC4xOjM0NTYgKGlmIE9wZW5zaGlwIHJ1bnMgb24gdGhpcyBzZXJ2ZXIpCi0tICAgWC1Ib29rLUlkOiB0aGUgc3Vic2NyaXB0aW9uIGhvb2tJZCAoZm9yIGNvcnJlbGF0aW9uKQoKaWYgdXJpID09ICIvX2hvb2tzL3B1c2giIGFuZCBtZXRob2QgPT0gIlBPU1QiIHRoZW4KICAgIG5neC5yZXEucmVhZF9ib2R5KCkKICAgIGxvY2FsIGJvZHkgPSBuZ3gucmVxLmdldF9ib2R5X2RhdGEoKQogICAgaWYgbm90IGJvZHkgdGhlbgogICAgICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgZXJyb3IgPSAiZW1wdHkgYm9keSIgfSwgNDAwKQogICAgZW5kCgogICAgbG9jYWwgb3BlbnNoaXBfdXJsID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LW9wZW5zaGlwLXVybCJdCgogICAgLS0gSWYgT3BlbnNoaXAgcnVucyBvbiB0aGlzIHNlcnZlciwgcHJveHkgZGlyZWN0bHkKICAgIGlmIG9wZW5zaGlwX3VybCBhbmQgb3BlbnNoaXBfdXJsIH49ICIiIHRoZW4KICAgICAgICBsb2NhbCBodHRwID0gcmVxdWlyZSAicmVzdHkuaHR0cCIKICAgICAgICBsb2NhbCBodHRwYyA9IGh0dHAubmV3KCkKICAgICAgICBodHRwYzpzZXRfdGltZW91dCg1MDAwKQoKICAgICAgICBsb2NhbCB0YXJnZXQgPSBvcGVuc2hpcF91cmwgLi4gIi9hcGkvd2ViaG9va3MvcHVzaCIKICAgICAgICBsb2NhbCByZXMsIGVyciA9IGh0dHBjOnJlcXVlc3RfdXJpKHRhcmdldCwgewogICAgICAgICAgICBtZXRob2QgID0gIlBPU1QiLAogICAgICAgICAgICBib2R5ICAgID0gYm9keSwKICAgICAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgIFsiQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiIsCiAgICAgICAgICAgICAgICBbIlgtSG9vay1JZCJdICAgID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LWhvb2staWQiXSBvciAiIiwKICAgICAgICAgICAgfSwKICAgICAgICB9KQoKICAgICAgICBpZiByZXMgYW5kIHJlcy5zdGF0dXMgPCA1MDAgdGhlbgogICAgICAgICAgICAtLSBPcGVuc2hpcCBoYW5kbGVkIGl0ICgyeHggb3IgNHh4KQogICAgICAgICAgICByZXR1cm4ganNvbl9yZXNwb25zZSh7IG9rID0gdHJ1ZSwgcHJveGllZCA9IHRydWUsIHN0YXR1cyA9IHJlcy5zdGF0dXMgfSkKICAgICAgICBlbmQKCiAgICAgICAgLS0gT3BlbnNoaXAgdW5yZWFjaGFibGUgb3IgZXJyb3JlZCAtIGZhbGwgdGhyb3VnaCB0byBzdG9yZQogICAgZW5kCgogICAgLS0gU3RvcmUgZm9yIGxhdGVyIHBvbGxpbmcgYnkgbG9jYWwvZGVza3RvcCBhcHAKICAgIGxvY2FsIGV2ZW50X2lkID0gbmd4Lm5vdygpIC4uICI6IiAuLiBtYXRoLnJhbmRvbSgxMDAwMDAsIDk5OTk5OSkKICAgIGxvY2FsIGV2ZW50ID0gY2pzb24uZW5jb2RlKHsKICAgICAgICBpZCAgICAgICA9IGV2ZW50X2lkLAogICAgICAgIGhvb2tfaWQgID0gbmd4LnJlcS5nZXRfaGVhZGVycygpWyJ4LWhvb2staWQiXSBvciAiIiwKICAgICAgICBwYXlsb2FkICA9IGJvZHksCiAgICAgICAgcmVjZWl2ZWQgPSBuZ3gubm93KCksCiAgICB9KQoKICAgIC0tIFVzZSBhIHNsb3QtYmFzZWQgcmluZyBidWZmZXIgKG1heCAyMDAgZXZlbnRzKQogICAgbG9jYWwgbWF4X2V2ZW50cyA9IDIwMAogICAgbG9jYWwgaWR4ID0gd2ViaG9va19ldmVudHM6aW5jcigiX2lkeCIsIDEsIDApIG9yIDAKICAgIGxvY2FsIHNsb3QgPSAoaWR4ICUgbWF4X2V2ZW50cykKICAgIHdlYmhvb2tfZXZlbnRzOnNldCgiZXZ0OiIgLi4gc2xvdCwgZXZlbnQsIDM2MDApIC0tIDFoIFRUTAogICAgd2ViaG9va19ldmVudHM6c2V0KCJfY291bnQiLCBtYXRoLm1pbihpZHgsIG1heF9ldmVudHMpKQoKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgb2sgPSB0cnVlLCBzdG9yZWQgPSB0cnVlLCBldmVudF9pZCA9IGV2ZW50X2lkIH0pCmVuZAoKLS0g4pSA4pSAIEdFVCAvX2hvb2tzL3BlbmRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIFJldHVybnMgc3RvcmVkIHdlYmhvb2sgZXZlbnRzIGZvciBsb2NhbCBhcHAgdG8gY29uc3VtZS4KCmlmIHVyaSA9PSAiL19ob29rcy9wZW5kaW5nIiBhbmQgbWV0aG9kID09ICJHRVQiIHRoZW4KICAgIGlmIG5vdCB3ZWJob29rX2V2ZW50cyB0aGVuCiAgICAgICAgcmV0dXJuIGpzb25fcmVzcG9uc2UoeyBldmVudHMgPSB7fSB9KQogICAgZW5kCgogICAgbG9jYWwgY291bnQgPSB3ZWJob29rX2V2ZW50czpnZXQoIl9jb3VudCIpIG9yIDAKICAgIGxvY2FsIGlkeCAgID0gd2ViaG9va19ldmVudHM6Z2V0KCJfaWR4Iikgb3IgMAogICAgbG9jYWwgZXZlbnRzID0ge30KCiAgICAtLSBSZWFkIGFsbCBzdG9yZWQgZXZlbnRzIChuZXdlc3QgZmlyc3QpCiAgICBsb2NhbCBtYXhfZXZlbnRzID0gMjAwCiAgICBsb2NhbCBzdGFydCA9IG1hdGgubWF4KDAsIGlkeCAtIGNvdW50KQogICAgZm9yIGkgPSBzdGFydCwgaWR4IC0gMSBkbwogICAgICAgIGxvY2FsIHNsb3QgPSBpICUgbWF4X2V2ZW50cwogICAgICAgIGxvY2FsIHJhdyA9IHdlYmhvb2tfZXZlbnRzOmdldCgiZXZ0OiIgLi4gc2xvdCkKICAgICAgICBpZiByYXcgdGhlbgogICAgICAgICAgICBsb2NhbCBwYXJzZWQgPSBjanNvbi5kZWNvZGUocmF3KQogICAgICAgICAgICBpZiBwYXJzZWQgdGhlbgogICAgICAgICAgICAgICAgZXZlbnRzWyNldmVudHMgKyAxXSA9IHBhcnNlZAogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAoKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgZXZlbnRzID0gZXZlbnRzIH0pCmVuZAoKLS0g4pSA4pSAIFBPU1QgL19ob29rcy9hY2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi0tIEFja25vd2xlZGdlIGV2ZW50cyBoYXZlIGJlZW4gY29uc3VtZWQgLSBjbGVhcnMgdGhlIHN0b3JlLgoKaWYgdXJpID09ICIvX2hvb2tzL2FjayIgYW5kIG1ldGhvZCA9PSAiUE9TVCIgdGhlbgogICAgaWYgd2ViaG9va19ldmVudHMgdGhlbgogICAgICAgIHdlYmhvb2tfZXZlbnRzOmZsdXNoX2FsbCgpCiAgICAgICAgd2ViaG9va19ldmVudHM6Zmx1c2hfZXhwaXJlZCgpCiAgICBlbmQKICAgIHJldHVybiBqc29uX3Jlc3BvbnNlKHsgb2sgPSB0cnVlIH0pCmVuZAoKLS0g4pSA4pSAIEZhbGxiYWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApyZXR1cm4ganNvbl9yZXNwb25zZSh7IGVycm9yID0gIm5vdCBmb3VuZCIgfSwgNDA0KQo="
25
- };
26
-
27
- // ../../packages/adapters/src/infra/openresty-lua.ts
28
- var OPENRESTY_LUA_DIR = "/usr/local/openresty/site/lualib/openship";
29
- var LUA_LOGGER_PATH = `${OPENRESTY_LUA_DIR}/site_logger.lua`;
30
- var RULES_GUARD_PATH = `${OPENRESTY_LUA_DIR}/rules_guard.lua`;
31
- var OPENRESTY_MGMT_PORT = 9145;
32
- var OPENRESTY_DEFAULT_PATHS = {
33
- bin: "/usr/local/openresty/bin/openresty",
34
- confPath: "/usr/local/openresty/nginx/conf/nginx.conf",
35
- confDir: "/usr/local/openresty/nginx/conf",
36
- sitesDir: "/usr/local/openresty/nginx/conf/sites-enabled",
37
- pidPath: "/usr/local/openresty/nginx/logs/nginx.pid"
38
- };
39
- var EDGE_HOST_STATE_DIR = "/var/lib/openship/edge";
40
- var EDGE_CONTAINER_MOUNTS = [
41
- { host: `${EDGE_HOST_STATE_DIR}/sites-enabled`, container: OPENRESTY_DEFAULT_PATHS.sitesDir },
42
- { host: "/etc/letsencrypt", container: "/etc/letsencrypt" },
43
- { host: `${EDGE_HOST_STATE_DIR}/acme`, container: "/var/www/acme" },
44
- { host: "/opt/openship/static", container: "/opt/openship/static" }
45
- ];
46
- var EDGE_HOST_PATHS = {
47
- bin: OPENRESTY_DEFAULT_PATHS.bin,
48
- confPath: OPENRESTY_DEFAULT_PATHS.confPath,
49
- confDir: OPENRESTY_DEFAULT_PATHS.confDir,
50
- sitesDir: `${EDGE_HOST_STATE_DIR}/sites-enabled`,
51
- pidPath: OPENRESTY_DEFAULT_PATHS.pidPath
52
- };
53
- var KNOWN_CONF_PATHS = [
54
- "/usr/local/openresty/nginx/conf/nginx.conf",
55
- "/etc/openresty/nginx.conf",
56
- "/etc/nginx/nginx.conf"
57
- ];
58
- async function detectOpenRestyPaths(executor) {
59
- const raw = await executor.exec("openresty -V 2>&1 || true");
60
- const parseFlag = (flag) => {
61
- const m = raw.match(new RegExp(`--${flag}=([^\\s]+)`));
62
- return m ? m[1] : null;
63
- };
64
- const bin = parseFlag("sbin-path") ?? OPENRESTY_DEFAULT_PATHS.bin;
65
- let confPath = parseFlag("conf-path") ?? OPENRESTY_DEFAULT_PATHS.confPath;
66
- const pidPath = parseFlag("pid-path") ?? OPENRESTY_DEFAULT_PATHS.pidPath;
67
- if (!await executor.exists(confPath)) {
68
- let found = false;
69
- for (const candidate of KNOWN_CONF_PATHS) {
70
- if (candidate !== confPath && await executor.exists(candidate)) {
71
- confPath = candidate;
72
- found = true;
73
- break;
74
- }
75
- }
76
- if (!found) {
77
- }
78
- }
79
- const confDir = confPath.replace(/\/[^/]+$/, "");
80
- return {
81
- bin,
82
- confPath,
83
- confDir,
84
- sitesDir: `${confDir}/sites-enabled`,
85
- pidPath
86
- };
87
- }
88
- function buildReloadCommand(paths) {
89
- return `${paths.bin} -t 2>&1 || exit 1
90
-
91
- if ${paths.bin} -s reload 2>/dev/null; then
92
- exit 0
93
- fi
94
-
95
- pkill -f '[o]penresty' >/dev/null 2>&1 || true
96
- pkill -f '[n]ginx' >/dev/null 2>&1 || true
97
- sleep 1
98
- rm -f ${paths.pidPath}
99
- ${paths.bin}`;
100
- }
101
- async function ensureOpenRestyConfig(executor, paths) {
102
- await executor.mkdir(paths.sitesDir);
103
- await executor.mkdir("/var/www/acme");
104
- const pidDir = paths.pidPath.replace(/\/[^/]+$/, "");
105
- await executor.mkdir(pidDir);
106
- await executor.writeFile(`${paths.sitesDir}/_management.conf`, MANAGEMENT_BLOCK);
107
- await executor.writeFile(`${paths.sitesDir}/_default.conf`, DEFAULT_BLOCK);
108
- if (!await executor.exists(paths.confPath)) {
109
- await executor.mkdir(paths.confDir);
110
- await executor.writeFile(
111
- paths.confPath,
112
- MINIMAL_NGINX_CONF(paths.confDir, paths.sitesDir)
113
- );
114
- return;
115
- }
116
- const hasCorrectInclude = await executor.exec(`grep -qF 'include ${paths.sitesDir}/' ${paths.confPath}`).then(() => true).catch(() => false);
117
- if (!hasCorrectInclude) {
118
- const hasWrongInclude = await executor.exec(`grep -q 'include.*sites-enabled' ${paths.confPath}`).then(() => true).catch(() => false);
119
- if (hasWrongInclude) {
120
- await executor.exec(
121
- `sed -i 's|include.*/sites-enabled/\\*\\.conf;|include ${paths.sitesDir}/*.conf;|' ${paths.confPath}`
122
- );
123
- } else {
124
- await executor.exec(
125
- `sed -i '/http *{/a \\ include ${paths.sitesDir}/*.conf;' ${paths.confPath}`
126
- );
127
- }
128
- }
129
- }
130
- function MINIMAL_NGINX_CONF(confDir, sitesDir) {
131
- return `# Auto-generated by Openship - safe to extend
132
- worker_processes auto;
133
- events {
134
- worker_connections 1024;
135
- }
136
- http {
137
- include ${confDir}/mime.types;
138
- default_type application/octet-stream;
139
- sendfile on;
140
- keepalive_timeout 65;
141
- include ${sitesDir}/*.conf;
142
- }
143
- `;
144
- }
145
- var GEOIP_DIR = "/usr/share/GeoIP";
146
- var GEOIP_DB_PATH = `${GEOIP_DIR}/GeoLite2-Country.mmdb`;
147
- var GEOIP_DB_URL = "https://github.com/P3TERX/GeoLite.mmdb/releases/download/2026.04.07/GeoLite2-Country.mmdb";
148
- var LUA_SRC_DIR = process.env.OPENSHIP_LUA_DIR?.trim() || join(dirname(fileURLToPath(import.meta.url)), "lua");
149
- var VHOST_REFERENCED_LUA = ["rules_guard.lua", "rules_lib.lua", "site_logger.lua"];
150
- function luaSourceAvailable() {
151
- return VHOST_REFERENCED_LUA.every(
152
- (f) => EMBEDDED_LUA[f] !== void 0 || existsSync(join(LUA_SRC_DIR, f))
153
- );
154
- }
155
- function readLua(filename) {
156
- const onDisk = join(LUA_SRC_DIR, filename);
157
- if (existsSync(onDisk)) return readFileSync(onDisk, "utf-8");
158
- const embedded = EMBEDDED_LUA[filename];
159
- if (embedded !== void 0) return Buffer.from(embedded, "base64").toString("utf-8");
160
- throw new Error(
161
- `Lua script "${filename}" not found on disk (${LUA_SRC_DIR}) or in EMBEDDED_LUA \u2014 add it to packages/adapters/src/infra/lua/ and run \`bun run embed:lua\`.`
162
- );
163
- }
164
- var MANAGEMENT_BLOCK = `# Openship internal management - analytics & live-log streaming
165
- # Auto-generated - do not edit manually
166
- server {
167
- listen 127.0.0.1:${OPENRESTY_MGMT_PORT};
168
-
169
- # Long-running Lua content handlers need generous timeouts
170
- send_timeout 3600s;
171
- keepalive_timeout 3600s;
172
- lua_check_client_abort on;
173
-
174
- # SSE live-log stream (long-lived connection)
175
- location = /logs/stream {
176
- content_by_lua_file ${OPENRESTY_LUA_DIR}/pipe_stream.lua;
177
- }
178
-
179
- # REST analytics + health (short-lived)
180
- location / {
181
- content_by_lua_file ${OPENRESTY_LUA_DIR}/mgmt_api.lua;
182
- }
183
- }
184
- `;
185
- var ACME_HTTP01_PORT = 49180;
186
- var ACME_CHALLENGE_LOCATION = ` location /.well-known/acme-challenge/ {
187
- proxy_pass http://127.0.0.1:${ACME_HTTP01_PORT};
188
- proxy_set_header Host $host;
189
- }`;
190
- var DEFAULT_BLOCK = `# Openship default catch-all - prevents the stock OpenResty welcome page AND
191
- # stops an unmatched Host/SNI from being served the first real vhost by default.
192
- # Auto-generated - do not edit manually
193
- server {
194
- listen 80 default_server;
195
- server_name _;
196
-
197
- ${ACME_CHALLENGE_LOCATION}
198
-
199
- location / {
200
- return 404;
201
- }
202
- }
203
-
204
- # HTTPS catch-all. WITHOUT a 443 default_server, nginx serves the first-loaded
205
- # 443 vhost to any request whose SNI matches no server_name - so a domain we do
206
- # NOT route (removed / never-added / just pointed at this IP) silently gets some
207
- # other app's cert + backend. That is cross-serving, a security hole. Owning the
208
- # 443 default and rejecting unknown SNI closes it: an unrouted host gets a TLS
209
- # handshake failure, never a fallthrough. ssl_reject_handshake (OpenResty/nginx
210
- # >= 1.19.4; our installer pulls the newest LTS) needs no certificate.
211
- server {
212
- listen 443 ssl default_server;
213
- ssl_reject_handshake on;
214
- }
215
- `;
216
- var LUA_SCRIPTS = [
217
- "site_logger.lua",
218
- "pipe_log.lua",
219
- "pipe_stream.lua",
220
- "mgmt_api.lua",
221
- "geo_country.lua",
222
- "rules_lib.lua",
223
- "rules_guard.lua"
224
- ];
225
- var LUA_VERSION_MARKER = `${OPENRESTY_LUA_DIR}/.openship-lua-version`;
226
- function luaBundleHash() {
227
- const h = createHash("sha256");
228
- for (const name of LUA_SCRIPTS) {
229
- h.update(name);
230
- h.update("\0");
231
- h.update(readLua(name));
232
- h.update("\0");
233
- }
234
- return h.digest("hex");
235
- }
236
- async function ensureLuaScripts(executor, paths) {
237
- try {
238
- if (!luaSourceAvailable()) {
239
- console.error(
240
- "[openresty] Lua unavailable in this build (not on disk or embedded) \u2014 edge rules/logging disabled. Run `bun run embed:lua` in packages/adapters."
241
- );
242
- return { repaired: [], available: false };
243
- }
244
- const expected = luaBundleHash();
245
- await executor.mkdir(OPENRESTY_LUA_DIR);
246
- const listing = await executor.exec(`ls -1 '${OPENRESTY_LUA_DIR}' 2>/dev/null || true`).catch(() => "");
247
- const present = new Set(listing.split("\n").map((s) => s.trim()).filter(Boolean));
248
- const missing = LUA_SCRIPTS.filter((name) => !present.has(name));
249
- const onBoxVersion = (await executor.readFile(LUA_VERSION_MARKER).catch(() => "")).trim();
250
- if (missing.length === 0 && onBoxVersion === expected) {
251
- return { repaired: [], available: true };
252
- }
253
- for (const name of LUA_SCRIPTS) {
254
- await executor.writeFile(`${OPENRESTY_LUA_DIR}/${name}`, readLua(name));
255
- }
256
- await executor.writeFile(LUA_VERSION_MARKER, expected);
257
- const reason = missing.length ? `missing: ${missing.join(", ")}` : "version changed";
258
- console.warn(`[openresty] (re)installed Lua (${reason}) \u2014 reloading edge.`);
259
- await executor.exec(buildReloadCommand(paths)).catch((err) => {
260
- console.error(`[openresty] reload after Lua (re)install failed: ${safeErrorMessage(err)}`);
261
- });
262
- return { repaired: missing.length ? missing : [...LUA_SCRIPTS], available: true };
263
- } catch (err) {
264
- console.error(`[openresty] ensureLuaScripts failed (deploy continues): ${safeErrorMessage(err)}`);
265
- return { repaired: [], available: false };
266
- }
267
- }
268
- async function installGeoDeps(executor) {
269
- try {
270
- const hasPkg = async (cmd) => {
271
- try {
272
- await executor.exec(`command -v ${cmd}`);
273
- return true;
274
- } catch {
275
- return false;
276
- }
277
- };
278
- if (await hasPkg("apt-get")) {
279
- await executor.exec(
280
- "apt-get update -qq && apt-get install -y -qq libmaxminddb0 libmaxminddb-dev"
281
- );
282
- } else if (await hasPkg("dnf")) {
283
- await executor.exec("dnf install -y libmaxminddb libmaxminddb-devel");
284
- } else if (await hasPkg("yum")) {
285
- await executor.exec("yum install -y libmaxminddb libmaxminddb-devel");
286
- }
287
- } catch {
288
- }
289
- try {
290
- await executor.exec(
291
- "opm get anjia0532/lua-resty-maxminddb"
292
- );
293
- } catch {
294
- try {
295
- await executor.exec(
296
- "/usr/local/openresty/bin/opm get anjia0532/lua-resty-maxminddb"
297
- );
298
- } catch {
299
- }
300
- }
301
- try {
302
- const exists = await executor.exists(GEOIP_DB_PATH);
303
- if (!exists) {
304
- await executor.mkdir(GEOIP_DIR);
305
- await executor.exec(
306
- `curl -fsSL -o ${GEOIP_DB_PATH} "${GEOIP_DB_URL}"`
307
- );
308
- }
309
- } catch {
310
- }
311
- }
312
- async function deployLuaScripts(executor, paths) {
313
- await installGeoDeps(executor);
314
- if (!luaSourceAvailable()) {
315
- throw new Error(
316
- `OpenResty Lua is unavailable in this build \u2014 not on disk (LUA_SRC_DIR=${LUA_SRC_DIR}) and not in EMBEDDED_LUA. The edge scripts (rules_guard.lua/site_logger.lua) can't be installed. Run \`bun run embed:lua\` in packages/adapters to regenerate lua-embedded.ts.`
317
- );
318
- }
319
- await executor.mkdir(OPENRESTY_LUA_DIR);
320
- for (const name of LUA_SCRIPTS) {
321
- await executor.writeFile(
322
- `${OPENRESTY_LUA_DIR}/${name}`,
323
- readLua(name)
324
- );
325
- }
326
- await ensureOpenRestyConfig(executor, paths);
327
- await executor.exec(
328
- `grep -q 'lua_shared_dict analytics ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict analytics 256m;' ${paths.confPath}`
329
- );
330
- await executor.exec(
331
- `grep -q 'lua_shared_dict request_data ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict request_data 128m;' ${paths.confPath}`
332
- );
333
- await executor.exec(
334
- `grep -q 'lua_shared_dict rules ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict rules 32m;' ${paths.confPath}`
335
- );
336
- await executor.exec(
337
- `grep -q 'lua_shared_dict rl_counters ' ${paths.confPath} || sed -i '/http *{/a \\ lua_shared_dict rl_counters 16m;' ${paths.confPath}`
338
- );
339
- await executor.exec(
340
- `grep -q 'lua_package_path' ${paths.confPath} || sed -i '/http *{/a \\ lua_package_path "/usr/local/openresty/site/lualib/?.lua;;";' ${paths.confPath}`
341
- );
342
- await executor.exec(buildReloadCommand(paths));
343
- }
344
-
345
- export {
346
- OPENRESTY_LUA_DIR,
347
- LUA_LOGGER_PATH,
348
- RULES_GUARD_PATH,
349
- OPENRESTY_MGMT_PORT,
350
- OPENRESTY_DEFAULT_PATHS,
351
- EDGE_HOST_STATE_DIR,
352
- EDGE_CONTAINER_MOUNTS,
353
- EDGE_HOST_PATHS,
354
- detectOpenRestyPaths,
355
- buildReloadCommand,
356
- ensureOpenRestyConfig,
357
- luaSourceAvailable,
358
- ACME_HTTP01_PORT,
359
- ACME_CHALLENGE_LOCATION,
360
- ensureLuaScripts,
361
- deployLuaScripts
362
- };
@@ -1,30 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- CloudRuntime,
7
- PAGE_CONTAINER_PREFIX,
8
- provisionCloudWorkspace
9
- } from "./chunk-5NYUCONN.js";
10
- import "./chunk-SLTYVHU7.js";
11
- import "./chunk-V6AN6XLZ.js";
12
- import "./chunk-MZ2WEHHY.js";
13
- import "./chunk-L2VOGB2X.js";
14
- import "./chunk-4Z5QO7N6.js";
15
- import "./chunk-XPPZ7B2J.js";
16
- import "./chunk-OXWDY22G.js";
17
- import "./chunk-RPHRPFEH.js";
18
- import "./chunk-TYVME3XD.js";
19
- import "./chunk-FXTBHTWY.js";
20
- import "./chunk-FPRHYBY2.js";
21
- import "./chunk-2D3I5G6P.js";
22
- import "./chunk-ILFETZOM.js";
23
- import "./chunk-VFINNTUL.js";
24
- import "./chunk-6APULWSU.js";
25
- import "./chunk-KI2EY3WB.js";
26
- export {
27
- CloudRuntime,
28
- PAGE_CONTAINER_PREFIX,
29
- provisionCloudWorkspace
30
- };
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- DockerRuntime
7
- } from "./chunk-SJIFLLX4.js";
8
- import "./chunk-V6AN6XLZ.js";
9
- import "./chunk-4Z5QO7N6.js";
10
- import "./chunk-OXWDY22G.js";
11
- import "./chunk-RPHRPFEH.js";
12
- import "./chunk-6APULWSU.js";
13
- import "./chunk-KI2EY3WB.js";
14
- export {
15
- DockerRuntime
16
- };
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- DockerEdgeExecutor
7
- } from "./chunk-TGIINPVM.js";
8
- import "./chunk-TYVME3XD.js";
9
- import "./chunk-FPRHYBY2.js";
10
- import "./chunk-KI2EY3WB.js";
11
- export {
12
- DockerEdgeExecutor
13
- };
@@ -1,45 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- importMigratedSites,
7
- waitForApiHealth
8
- } from "./chunk-BBHX7T4R.js";
9
- import "./chunk-FRNAR33O.js";
10
- import "./chunk-EI575GHN.js";
11
- import "./chunk-6APIPIJY.js";
12
- import "./chunk-IXCHURVK.js";
13
- import "./chunk-OWED2GRM.js";
14
- import "./chunk-VWPEKOH6.js";
15
- import "./chunk-W73X43R7.js";
16
- import "./chunk-TGIINPVM.js";
17
- import "./chunk-5NYUCONN.js";
18
- import "./chunk-AVIB7CT7.js";
19
- import "./chunk-5MZ624VX.js";
20
- import "./chunk-Q2CIRAOK.js";
21
- import "./chunk-GKHUSZCD.js";
22
- import "./chunk-SLTYVHU7.js";
23
- import "./chunk-O6ZZF52V.js";
24
- import "./chunk-JYGD5WSN.js";
25
- import "./chunk-SJIFLLX4.js";
26
- import "./chunk-V6AN6XLZ.js";
27
- import "./chunk-VDMQJHPI.js";
28
- import "./chunk-MZ2WEHHY.js";
29
- import "./chunk-L2VOGB2X.js";
30
- import "./chunk-4Z5QO7N6.js";
31
- import "./chunk-XPPZ7B2J.js";
32
- import "./chunk-OXWDY22G.js";
33
- import "./chunk-RPHRPFEH.js";
34
- import "./chunk-TYVME3XD.js";
35
- import "./chunk-FXTBHTWY.js";
36
- import "./chunk-FPRHYBY2.js";
37
- import "./chunk-2D3I5G6P.js";
38
- import "./chunk-ILFETZOM.js";
39
- import "./chunk-VFINNTUL.js";
40
- import "./chunk-6APULWSU.js";
41
- import "./chunk-KI2EY3WB.js";
42
- export {
43
- importMigratedSites,
44
- waitForApiHealth
45
- };
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- buildEdgeRunCommand,
7
- containerEdgeProvider,
8
- dockerAvailable,
9
- ensureContainerEdge,
10
- localContainerEdgeProvider,
11
- resolveEdgeImage,
12
- setDefaultEdgeImage
13
- } from "./chunk-SLTYVHU7.js";
14
- import "./chunk-L2VOGB2X.js";
15
- import "./chunk-RPHRPFEH.js";
16
- import "./chunk-FXTBHTWY.js";
17
- import "./chunk-FPRHYBY2.js";
18
- import "./chunk-2D3I5G6P.js";
19
- import "./chunk-ILFETZOM.js";
20
- import "./chunk-VFINNTUL.js";
21
- import "./chunk-6APULWSU.js";
22
- import "./chunk-KI2EY3WB.js";
23
- export {
24
- buildEdgeRunCommand,
25
- containerEdgeProvider,
26
- dockerAvailable,
27
- ensureContainerEdge,
28
- localContainerEdgeProvider,
29
- resolveEdgeImage,
30
- setDefaultEdgeImage
31
- };
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env sh
2
- ":" //# ; exec "$(command -v bun || command -v node)" "$0" "$@"
3
- import { createRequire as __ospCreateRequire } from "node:module";
4
- const require = __ospCreateRequire(import.meta.url);
5
- import {
6
- MANAGED_STATIC_BASE,
7
- NginxProvider,
8
- renderGeoEntries,
9
- renderProxyOptions,
10
- summarizeCertbotFailure
11
- } from "./chunk-FXTBHTWY.js";
12
- import "./chunk-FPRHYBY2.js";
13
- import "./chunk-2D3I5G6P.js";
14
- import "./chunk-ILFETZOM.js";
15
- import "./chunk-VFINNTUL.js";
16
- import "./chunk-6APULWSU.js";
17
- import "./chunk-KI2EY3WB.js";
18
- export {
19
- MANAGED_STATIC_BASE,
20
- NginxProvider,
21
- renderGeoEntries,
22
- renderProxyOptions,
23
- summarizeCertbotFailure
24
- };