From 656f413a4e2cd748a9a6acbd604e16f2b45636d3 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 20 Aug 2026 07:35:36 +0000 Subject: [PATCH 1/2] chore: bump objectui to 0fd11444a89e fix(app-shell): explicit extensions on every relative specifier, so plain Node can load the published entry (#5383) objectui@0fd11444a89e57114903afa2cc8115a3871f3e16 --- .changeset/console-0fd11444a89e.md | 145 +++++++++++++++++++++++++++++ .objectui-sha | 2 +- 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 .changeset/console-0fd11444a89e.md diff --git a/.changeset/console-0fd11444a89e.md b/.changeset/console-0fd11444a89e.md new file mode 100644 index 0000000000..a2d5e04a8a --- /dev/null +++ b/.changeset/console-0fd11444a89e.md @@ -0,0 +1,145 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `0fd11444a89e`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 108 releasing of 123 changesets added across 149 non-merge commits; omitted: 15 release-nothing changesets, 27 commits carrying no changeset (they ship no package code). + +- **minor** — Remove the published optional key `logo` from `AppShellBranding` (`@object-ui/layout`). (objectui `86f633fd9`) +- **minor** — Consume the declared nav `runAction` slot; retire the private `?runAction=` string convention (objectui `88085e3a2`) +- **minor** — fix(plugin-dashboard): `ObjectDataTable` resolves column identity before it hands columns to the table (objectui `58398ba52`) +- **minor** — **Breaking (published API):** `NavigationRenderer` no longer accepts `resolveGroupLabel` or `resolveItemLabel`. If your build just broke on one of these props, delete the prop — i… (objectui `9c60144b5`) +- **minor** — fix(plugin-grid): `ObjectGrid` reads the declared column spelling, and only it (objectui `dbbd38a09`) +- **minor** — fix(react): `bridgeListView` emits the column spelling the spec declares (objectui `dbbd38a09`) +- **minor** — Show the current organization in the console top bar for users with exactly one membership. (objectui `b8ce7dcd2`) +- **minor** — `object-view`: a top-level `conditionalFormatting` no longer reaches the kanban view. (objectui `d006ce19e`) +- **minor** — Form-field type resolution no longer falls back to `ui`-namespace SDUI node renderers. (objectui `232f61a45`) +- **minor** — **BREAKING** — `ObjectMetricWidgetProps` now speaks `@objectstack/spec`'s `I18nLabel` vocabulary on `label`, `trend.label`, `description` and `title`. (objectui `f6fc565b0`) +- **minor** — **BREAKING** — BREAKING: `dashboardComponents` is re-keyed from 11 PascalCase component class names to the 8 schema `type` keys the package actually registers (`dashboard`, `metric`, `metric-car… (objectui `4dbcae756`) +- **minor** — fix(components): call `FormSchema.onChange` — the declared callback the form renderer never invoked (objectui#4259) (objectui `56735762f`) +- **minor** — `ObjectView` and `ListView` now flatten a view's `map` block through a whitelist instead of spreading the whole (untyped) block to the top level. (objectui `0a73b51de`) +- **minor** — Align `FieldConstraintsSchema` (the zod face of `FormFieldSchema.validation`) to the public TS contract `FieldValidationRules`. Behaviour change in `objectui validate`: `validatio… (objectui `118419214`) +- **minor** — `DatasetReportRenderer` no longer reads `filter` as an alias for `runtimeFilter`. (objectui `a9452711b`) +- **minor** — **BREAKING** — Retire the structured `confirm` object on actions (objectui#4314, maintainer ruling 2026-08-17, ADR-0049 enforce-or-remove). `confirmText` is now the one confirm spelling — the on… (objectui `d2ce342fc`) +- **minor** — **BREAKING** — `FieldValidationRules.pattern.value` narrows to `RegExp`, and the form renderer reports unrecognized validation rule names loudly (objectui#5099, maintainer ruling 2026-08-18). (objectui `a2a974779`) +- **minor** — fix(fields): render the option colour an author declared as an explicit hex, instead of quantizing it to nine palette families (objectui#5141) (objectui `a09bc33ff`) +- **minor** — `ObjectMapSchema` declares what ObjectMap reads, and the `map` block outranks the flat spelling (objectui `578e02516`) +- **minor** — A form's ruled `submitBehavior.url` redirect can now be performed by the HOST, so a destination stays inside a console mounted at a sub-path (objectui#4989 defect 4). (objectui `8c0d52ece`) +- **patch** — Ship explicit extensions on every relative import specifier, so plain Node can load the published entry (objectui `0fd11444a`) +- **patch** — A `field:`-prefixed `password` no longer renders as clear text when its widget is not registered (objectui `aff10e283`) +- **patch** — DraftChangesPanel addresses `/meta` item routes in the singular (objectui `f2e11ae6f`) +- **patch** — Publish relative import specifiers with explicit `.js` extensions so these six packages load under plain Node ESM. (objectui `5458414a7`) +- **patch** — A metadata-admin option catalog now carries its own load state, so a picker cannot render a failed catalog as an empty one. (objectui `bdf8cf76e`) +- **patch** — Approvals Inbox: stop offering a record link that dead-ends for the viewer it is offered to. Approver routing goes by position while record visibility is a separate gate, so an ap… (objectui `8739c8e0b`) +- **patch** — Remove two unreachable renderer registrations, and fail the build on any new same-namespace duplicate. (objectui `2d0bd16d5`) +- **patch** — `ObjectGrid`'s inline add-record row now honours `can(object, 'create')` (objectui#5148). (objectui `3e0214c00`) +- **patch** — Fix the `GanttViewMode` JSDoc to name all five granularities (objectui#5132). (objectui `449ffe8b9`) +- **patch** — The approver membership-tier picker offers the tiers the server accepts, and a stored `delegated_admin` is no longer labelled "(invalid)". (objectui `c7a74c80d`) +- **patch** — `cloneAsOverride()` now returns `DeepMutable`, so a Tenant/User override draft type-checks as the mutable value it has always been. (objectui `8477be5d2`) +- **patch** — `ObjectView` now forwards the canonical `table.columns` on the non-grid paths, not only on the grid one. (objectui `242660843`) +- **patch** — `container`: honour a declared `maxWidth: false` as "no maximum width" (objectui `3fbbea1f3`) +- **patch** — Removed the dead `require` condition from `exports["."]` in `@object-ui/types`'s `package.json`. It pointed at `dist/index.cjs`, a file the package's `"build": "tsc"` script (bare… (objectui `3cf4de0bf`) +- **patch** — The bulk-action dialog's "this widget needs a DataSource" rule now derives from the shared reference-field family instead of a fourth private copy. (objectui `2533ec557`) +- **patch** — A public form's thank-you countdown ("Redirecting in {{seconds}} seconds…") now actually counts down, instead of rendering a number once and leaving it frozen for the whole wait. (objectui `a954b4849`) +- **patch** — A report's embedded chart now paints its category dimension's own option colours and renders ordered-sequence charts (funnel/pyramid) in the field's declared picklist order — the… (objectui `cb5a7de2e`) +- **patch** — `objectui serve` gains `--no-open`, matching the flag `objectui dev` already ships, and no longer prints a bare `Error: spawn xdg-open ENOENT` stack after its success banner in a… (objectui `82fbc09d8`) +- **patch** — `page:header`'s `maxVisible` / `mobileMaxVisible` now honour the contract's value domain instead of a laxer renderer tolerance. (objectui `b8b9af4a2`) +- **patch** — Fix two pieces of `ObjectMap` state that stopped tracking their source after mount (objectui#5003): (objectui `687bc0cd4`) +- **patch** — `ObjectView` sends a named view's `sort` to the grid slot that can hold it — the declared sort now reaches both the header indicator and `$orderby`. (objectui `e22b9d714`) +- **patch** — API Console's endpoint catalog reads the canonical `storage` service slot first, falling back to the deprecated `file-storage` slot while the framework's v17 alias lives (objectui… (objectui `38ba3ddf3`) +- **patch** — The Studio Data pillar's form preview no longer rebuilds `ObjectForm`'s `fields` array on every render (#4574). (objectui `bfd4fc70f`) +- **patch** — A node writing both `properties` and `props` now gets ONE answer per key, and it is the canonical `properties` one — on both read channels. (objectui `70a774bc4`) +- **patch** — API Console's endpoint catalog drops the `workflow` and `feed` entries — 7 endpoint declarations that could never render on any host (objectui `092e2baf3`) +- **patch** — `buildChartSeries`' pivot branch preserves key ABSENCE, so a never-projected first dimension still reaches the framework#4033 placeholder. (objectui `31676be93`) +- **patch** — Fix the metadata seed cache delivering nothing on the boot right after a first login. (objectui `92b327a67`) +- **patch** — The built-in form's `default` fallback branch now enforces a declared `max_length` ceiling. (objectui `97fba31a2`) +- **patch** — `ObjectView` forwards the canonical `table` keys — `pagination` / `selection` / `filter` / `sort` now take effect, and the deprecated spellings keep working as aliases. (objectui `20bc99f74`) +- **patch** — A view personalization overlay no longer freezes the view it was laid over. `ObjectView`'s `persistViewPatch` sends `{ ...baseViewDef, ...patch }`, so a row written by a mere colu… (objectui `d871f8e05`) +- **patch** — Fix `packages/core/README.md`'s Component Registry example, which taught `new ComponentRegistry()` against an exported singleton **instance**, not a class — the built `packages/co… (objectui `41f498bcb`) +- **patch** — `predicate.ts`'s `in [...]` membership check now names an element it cannot parse instead of silently discarding the whole set. (objectui `2eb8db848`) +- **patch** — A failed field fetch in the metadata-admin `field-selector` picker now reads as a failure, not as "this object has no fields". (objectui `bc2922a82`) +- **patch** — A KPI card's sub-caption now translates from its own convention key (objectui `bea374ee7`) +- **patch** — Correct the published "works with the `api` data provider" claim for plugin-calendar, which `ObjectCalendar` does not implement. `data.provider: 'api'` reaches `console.warn('API… (objectui `1cd46bd0d`) +- **patch** — The built-in form `input` branch now honours a declared ceiling in both authored spellings. (objectui `460c4d0df`) +- **patch** — `objectui check` reads `.json` as JSONC, so a `tsconfig.json` no longer fails the run. (objectui `e6a8960f6`) +- **patch** — Sign-out now drops the client-side caches that belonged to the session it ends, and the metadata seed cache is keyed by session identity. (objectui `61b097c13`) +- **patch** — The metadata editor's option pickers and the Audit tab distinguish a FAILED load from a completed one that found nothing. (objectui `513e614f0`) +- **patch** — The `organizations.*` picker locale family (avatar menu / console picker — `mine`, `title`, `heading`, `subtitle`, `searchPlaceholder`, `new`, `current`, `emptyTitle`, `emptyDescr… (objectui `d109a4de1`) +- **patch** — Studio 页面设计器不再为 `page:accordion` 提供 `title` 与分区 `value` 编辑框(objectui#5212) (objectui `2d1909b77`) +- **patch** — Lookup "recently used" now obeys the field's declared filters. The recents rail re-fetched its rows without merging either `lookupFilters` or the `dependsOn` cascade, so a record… (objectui `6c68b13c9`) +- **patch** — Emit explicit file extensions on relative import specifiers, so the published entries can be imported by Node's own ESM resolver. (objectui `af5e292d0`) +- **patch** — A notification with no link now opens the full inbox from the bell instead of being consumed silently. (objectui `511fbca40`) +- **patch** — The form renderer's built-in `textarea` branch now honours a declared character cap the same way the registered `field:textarea` widget does. (objectui `0ae27f7d1`) +- **patch** — Metadata the console caches for one workspace is no longer read back in another. (objectui `8a1b7613e`) +- **patch** — The console's post-publish readiness re-check now belongs to the app it ran for. (objectui `37aed9cfb`) +- **patch** — An admin override of an approval now looks like one — before the click, and in the timeline afterwards. (objectui `57e668f13`) +- **patch** — Grid group headers, compact cards and kanban card badges honour an author-declared option hex, matching the grid cell. (objectui `feb6b161d`) +- **patch** — Notification deep links now open the record instead of the app landing page. (objectui `a11dc6f4f`) +- **patch** — Fix `record_header` actions dispatching without their record id while the record page is still loading. (objectui `6ca910bdf`) +- **patch** — Fix the two remaining `object/api/value` claims that objectui#5019 (PR #5162) left behind — its dispatch was scoped to only the "API Provider" section of `content/docs/plugins/plu… (objectui `084155eab`) +- **patch** — A map node's top-level `style` is inline CSS again, not a MapLibre style URL. (objectui `072085deb`) +- **patch** — `EmbeddableForm`'s thank-you redirect stops being mount-blind: an in-app destination now goes through the host's injected navigate. (objectui `d7be3bdf3`) +- **patch** — The metadata References panel distinguishes a FAILED reference check from a completed one that found nothing. (objectui `47e3407ed`) +- **patch** — The `/data` surface's "New" button now reads the whole CRUD affordance matrix, not just the permission. (objectui `2f73fef12`) +- **patch** — The object-list page's "New" button and its phone floating "+" now consume `userActions.create` predicates. (objectui `c2dc47719`) +- **patch** — The object list's Import button now honours `userActions.import`'s CEL predicates. (objectui `9f23d2b32`) +- **patch** — docs(plugin-report): teach the dataset-bound report as the sole authoring shape (objectui `0237208f1`) +- **patch** — `dev`, `serve` and `build` accept the documented directory argument from anywhere, and refuse a non-project directory in plain language. (objectui `51e65d423`) +- **patch** — `ObjectGrid`'s `editable` schema key now honours the caller's `update` permission. (objectui `b4089beca`) +- **patch** — Related-list "+ New" now honours `userActions.create` predicates, and the grid toolbar's inline-edit affordance is gated on `update` permission (objectui#4646, objectui#4647). (objectui `dfc697554`) +- **patch** — `record:quick_actions` reads the toolbar's accessible name under the spelling the ARIA contract accepts, and stops advertising an action fallback it never had. (objectui `7dd93c00a`) +- **patch** — The plugin-form documentation-site page now teaches the `validation` shape the form renderer actually reads, so a copied example validates instead of only looking as though it doe… (objectui `958d7573a`) +- **patch** — Dev builds now shout when an unevaluated `${…}` expression reaches the DOM. (objectui `144ef9b54`) +- **patch** — `span` renders the `value` its type and its published doc both declare, with child content winning when both are present. (objectui `787c73862`) +- **patch** — `objectui check`: the known-type list is now derived from the component registry instead of being a hand-written copy, which had drifted in both directions at once. (objectui `68d9e282c`) +- **patch** — Evaluate expressions written under a node's `properties`, not just under `props` (objectui `0046d8f8c`) +- **patch** — 修复相关列表(`RelatedList`)以 spec 规范拼写 `field` 声明的对象列只出表头、单元格全空的问题(objectui#5022)。 (objectui `229b17e36`) +- **patch** — `plugin-form` README: the "Integration with Data Sources" section now teaches the adapter's real path instead of two keys no form renderer reads. (objectui `bfb64ee09`) +- **patch** — The plugin-view documentation-site page now teaches the keys `ObjectView` actually reads, so a copied example renders instead of coming up empty. (objectui `99d5659df`) +- **patch** — fix(components): FilterBuilder 的 lookup 列不再因 `options: []` 被拒掉远程搜索 (objectui#5031) (objectui `93de4f69b`) +- **patch** — `object-grid` now declares its `data` input as the object its contract actually accepts, instead of as an array (objectui#5090). (objectui `27c9cbdf7`) +- **patch** — metadata-admin: scope the detail drawer's form ids so its labels stop addressing the page form's controls (objectui `3fd9f79c9`) +- **patch** — The plugin-grid documentation-site page now spells keys the grid actually reads. (objectui `b29488f3e`) +- **patch** — The plugin-view README now documents the keys `ObjectView` actually reads, so a copied example renders instead of coming up empty. (objectui `405d54e4d`) +- **patch** — Docs only: `packages/plugin-form/README.md`'s Schema API and Examples now spell the keys the form renderers actually read (objectui#5075). Three connected drifts, judged against t… (objectui `e09f9e898`) +- **patch** — metadata-admin 表单:嵌套字段 DOM id 按路径作用域,grid/table 单元格由列头命名 (objectui `fc1511152`) +- **patch** — `packages/plugin-dashboard/README.md`: two teaching snippets did not survive being copied. Both were verified against the package's **build artifact** (`dist/index.d.ts`) — export… (objectui `671c0d320`) +- **patch** — plugin-grid's README examples now spell keys the grid actually reads. (objectui `9fbb9b52f`) +- …and 8 more releasing changesets in this range (list capped at 100; see the objectui range below). + +⚠️ 5 of these carry a breaking change: 5 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + +**In this console build, declared nowhere** — objectui merged 27 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ test(scripts): pin QUICK_REFERENCE's Current Release rows by literal equality (#4913) (#5385) (objectui `a20b81d04`) +- _(no changeset)_ fix(scripts): doc-snippet gate collects .md under content/docs, and states its scan surface (#5341) (objectui `383f8b486`) +- _(no changeset)_ docs(guide): objectstack.config.ts belongs to the server project — link it, do not re-type it (#5332) (objectui `00ddc4215`) +- _(no changeset)_ perf(console): keep the lazily-imported @objectstack/lint out of the eager chunk (#5323) (objectui `6d5368ac8`) +- _(no changeset)_ fix(ci): the cross-repo closer refuses a foreign PULL REQUEST, fails on a refusal, and gets a harness (#5295) (objectui `278b41f15`) +- _(no changeset)_ fix(ci): bound Chromium provisioning so a stalled apt mirror cannot cancel Build & E2E (#5308) (objectui `de4e29a81`) +- _(no changeset)_ feat(lint): reject an unpaired getBadgeColorClasses call (#5191) (#5292) (objectui `7260a1ed4`) +- _(no changeset)_ docs(plugin-view): re-teach the canonical table keys now that #5102 landed (#5289) (objectui `95cf24168`) +- _(no changeset)_ docs(agents): name the compliant sync route in the force-push ban clause (#5239) (#5288) (objectui `12841b617`) +- _(no changeset)_ docs(core): teach the real column-hydration shape in report-schema.mdx (#5275) (objectui `b1b0ace9b`) +- _(no changeset)_ ci(lint): run the CLI's own check command against this repository (#5273) (objectui `a369c2b76`) +- _(no changeset)_ docs(plugin-form): fix pattern.value Type column to RegExp-only (#5267) (objectui `87d9202b1`) +- _(no changeset)_ docs: stop teaching imports five published pages do not export (#5260) (objectui `ebbafa59c`) +- _(no changeset)_ fix(examples): lowercase hello-world schema node types to registered keys (#5244) (objectui `6b73232d6`) +- _(no changeset)_ docs(blocks): teach a validation shape the input node actually declares (#5229) (#5251) (objectui `a40b571e5`) +- _(no changeset)_ test(scripts): doc-version-claims 扫描面加上 skills/,四处脚手架字面量入锚 (#4981) (#5084) (objectui `27273fe86`) +- _(no changeset)_ docs(skills): skill 入口与 project-setup evals 停教/停评「加 @source 扫 ObjectUI 包」 (#4930) (objectui `7d900dee6`) +- _(no changeset)_ docs(skills): 脚手架指南的四处版本字面量改回仓内实测值 (#4981) (#5080) (objectui `2315d2139`) +- _(no changeset)_ docs(skills): 「Iteration scopes」整节改写为实测的 data-as-nodes 形态 (#5124) (objectui `675589a6e`) +- _(no changeset)_ test(scripts): side-effects 门读全 24 张 vite alias 表,70 → 196 条 (#5158) (#5167) (objectui `a8af6510b`) +- _(no changeset)_ feat(scripts): compile documentation snippets against the built types (#5138) (#5161) (objectui `7a1cc6881`) +- _(no changeset)_ chore(plugin-editor): 移除被跟踪的 Vite temp-config 冻结产物 (#5159) (objectui `cdac3cc20`) +- _(no changeset)_ fix(docs): AGENTS.md heredoc example no longer carries shell-escape residue (#5150) (#5152) (objectui `da6eda06e`) +- _(no changeset)_ docs(agents): §9 gains the shared-scratchpad rule — keep commit messages and PR bodies off shared disk (#5135) (objectui `cdfdfe7f6`) +- _(no changeset)_ docs(plugin-form): TypeScript Support 块的 import 改指真身 @object-ui/types (#5119) (objectui `8378e9954`) +- _(no changeset)_ docs(plugin-dashboard): 文档站页的手动注册段按真实 register 键面重写 (#5104) (objectui `d729ce09e`) +- _(no changeset)_ docs(plugins): 三个插件文档页按真实 register 键表重写虚构的 `*Components` 手动注册 (#5085) (objectui `a0f6f0eb5`) + + + +objectui range: `82a94170c405...0fd11444a89e` diff --git a/.objectui-sha b/.objectui-sha index 00dd8716be..aff3c7a958 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -82a94170c4058d451ce3ac179d99296d90554479 +0fd11444a89e57114903afa2cc8115a3871f3e16 From a71b20ae0110e1af10fd770efd434f2c37ef2dfa Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 20 Aug 2026 08:48:24 +0000 Subject: [PATCH 2/2] chore: bump objectui to 9a3daf8d37ad Re-run of the pin bump at objectui main 9a3daf8d37ad (objectui#5390 landed, which is what Console Pin Gate was failing on). Replaces the 0fd11444a89e changeset rather than keeping both; the derived range is still 82a94170c405.., i.e. from the pin on main. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01HDA9nN6nXQngoQUAAzRdMb --- .../{console-0fd11444a89e.md => console-9a3daf8d37ad.md} | 8 ++++---- .objectui-sha | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) rename .changeset/{console-0fd11444a89e.md => console-9a3daf8d37ad.md} (85%) diff --git a/.changeset/console-0fd11444a89e.md b/.changeset/console-9a3daf8d37ad.md similarity index 85% rename from .changeset/console-0fd11444a89e.md rename to .changeset/console-9a3daf8d37ad.md index a2d5e04a8a..1268847e3a 100644 --- a/.changeset/console-0fd11444a89e.md +++ b/.changeset/console-9a3daf8d37ad.md @@ -2,9 +2,9 @@ "@objectstack/console": minor --- -Console (objectui) refreshed to `0fd11444a89e`. Frontend changes in this range: +Console (objectui) refreshed to `9a3daf8d37ad`. Frontend changes in this range: -Derived from the changesets objectui declared over the range — 108 releasing of 123 changesets added across 149 non-merge commits; omitted: 15 release-nothing changesets, 27 commits carrying no changeset (they ship no package code). +Derived from the changesets objectui declared over the range — 108 releasing of 125 changesets added across 151 non-merge commits; omitted: 17 release-nothing changesets, 27 commits carrying no changeset (they ship no package code). - **minor** — Remove the published optional key `logo` from `AppShellBranding` (`@object-ui/layout`). (objectui `86f633fd9`) - **minor** — Consume the declared nav `runAction` slot; retire the private `?runAction=` string convention (objectui `88085e3a2`) @@ -140,6 +140,6 @@ Derived from the changesets objectui declared over the range — 108 releasing o - _(no changeset)_ docs(plugin-dashboard): 文档站页的手动注册段按真实 register 键面重写 (#5104) (objectui `d729ce09e`) - _(no changeset)_ docs(plugins): 三个插件文档页按真实 register 键表重写虚构的 `*Components` 手动注册 (#5085) (objectui `a0f6f0eb5`) - + -objectui range: `82a94170c405...0fd11444a89e` +objectui range: `82a94170c405...9a3daf8d37ad` diff --git a/.objectui-sha b/.objectui-sha index aff3c7a958..1be704ca95 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -0fd11444a89e57114903afa2cc8115a3871f3e16 +9a3daf8d37ad973a621e5edd276fe32467f90684